PK:Dm$!buildbot-v0.8.9/.buildinfo# Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. config: tags: PK:DmFwkSSbuildbot-v0.8.9/objects.inv# Sphinx inventory version 2 # Project: Buildbot # Version: 0.8.9 # The remainder of this file is compressed using zlib. xڽ][sH~W=0;/fvmƒRmDdb[@eD]m]\ n$>ɿhS_Hlu+p69/2\^$Wƃ52;=?JPݼ/L(洴cqm}և~cՊeҲF\r\4B\6ܭ);eAB)wf $Pz_R<$Q`ӌHaXX%c(s0ƢNN\"b5WȞN޺tԠS(-h<9h.<Ѐͯ"G&kaς5?CiLb7):K) ]Ha4fI R!ގk1DA&}g#紙nZ Xڑ24ʆORE]i0Fl| ;cK0>h8!t)N$2f[+B斶[5sJ{UQʤX,`@H-]F t$.ek0xYžlp-w5 G \uhkm@'][ԽUENۨᘇ iCZ ~P=uE ZnULBaƗOBM+Ao(QD |B` a138^c(M&gW%?["_ f a Nf"Qn%4iZqc{d_Kv#gwLĿ]a1|+٥y<-#T_e_pŭ* CLNNQ WmPAS /*{^zyeׂwĭ1_52ҡѼOH;=5aۧ}$,:} agDxX:gDHr(1oWc"*4HW]!PmTB@\ 6.HN;hlݟ) fK%A'$)P!!{zo46ڏIX ra7CЊh mC J }[@VsI6h ٩dLM`淺낑:d1_;Y}S.`"kefCGf(g[kكt*1;AklP}h٭cɼ'&dE+};Ps(=EH4RLr[UۃTe[tuBr*v0wV1r9/ewu;ɮ=MDޫZlka+T:*2#w9`uA{oؔoQpDždG9Qq<$wts}"'|KO>a)TxWPH ~E)λr&e)W-h؎mryGYJ 6ph: .w[ySbc7%5䑏ާiU~yY)#2)yHXf;NJv W.@|Aa7Xx;vw(Fbͻ!G%z[Ąko¡c:Pq0AfN)mn)mӆFpؔbœT_'Q` sfKw) @F*# Y(6s0:KhH\O7>/~翟Aa;ך=deMLuuP 3 17G~mJ*n`Tx^r'ɾ}!:0b<^dD:(bG5Q.ɸe $1:; ʠ Ob_+.T79rIMl紐p2Ft s(m;yF 2/ 2{pҜT7\Gs"F׿bE=ۆ@aZ,CF7{N;DO!ܩuJuu1t\-TJP"'&%wWo"fS WdxonKe:_B&(Z#pvd4j"rG :,Cg9Q"ׁ?h:3UܟC_ucT-GhK1" 嗬T{8f*^].%9H3f(=|Od kZ癿:.y]oozˁF]MAN"l?O%=j[JϤQY_͡2#ȇV7^`w -&;=EN0*7i,J g]N0.$agy4Ƅȶ% b3B{5tBմcW4wزcp2){V3ҷzAbt{tTr/>pafg-1UEIG)עy8'|2+ۨxTEF;N"su}X(uM<\ -%%BC,ӸwMO.zfyYc#;1'ײIOX7q-*oWwrD:OeWnW ]OQۺnԪ=db ;[?:p<(#kRP>}RZ\o(e1Ğ=AvEw?C $׺P4`<|+ \~bK%מIp< 5Ǘt}[:J6FHmJlT9]rgL:FW8-sq=i4E/.nU}{3ЊUV=%ِww؎Ȧ6v0qeSmيCE = MzjvX0b uU?vdDf tV麱vQs,-/Cp[JQ ޸ڏ=WuITA"-PUK/.e|(JtVWV 8El{+0GxRe?]w~v4fu۷t]y}D!Zef1,xu)@ik7!`9OCqܖM8D)t]+ב>uLG'ʎ"H7dV3I\gi%eoў=V6_sY7}{Bak#OY~*_Siu쎇Pи6oxELMt|qm76S];5vzO's_ȇvZ<4v.oh$Me$7}>v] ȜlU `mےH]<Ⱦp=e92\Bdf+k4ɵRNe{N ?E1$w{堁2E&Rf -]w6!^` 9JuvФB`;E^g)%d`F9,ꎒN^ `*>51A9(.6+@9]'1~S>2k\* -4{3CۈxhuI!N0l:pw?ڽ`Ye&w`0頟m/RuvTy'(e[ mCPp<$ ^ .~Iz^>W,Z%L݆lVC 1 ngMUV"эMbr8^!|P4Tm.s2nm4Aoz)_wѺa'vl#@c3_htap%|Sy{$ݿS_YLV=A4p2OMeQsߖCRɎ9xG>fC(ҌLC&֧L5T~lF9p6i9jk85 ,mOE*2c9xSحuA[N[?n뫑'$Kw3wWŦ2ybmӆ>eI\S@roUN?G׈PK:D}}buildbot-v0.8.9/index.html Buildbot 0.8.9 documentation

This is the BuildBot documentation for Buildbot version 0.8.9.

If you are evaluating Buildbot and would like to get started quickly, start with the Tutorial. Regular users of Buildbot should consult the Manual, and those wishing to modify Buildbot directly will want to be familiar with the Developer's Documentation.

Table Of Contents

Buildbot Tutorial

Contents:

First Run

Goal

This tutorial will take you from zero to running your first buildbot master and slave as quickly as possible, without changing the default configuration.

This tutorial is all about instant gratification and the five minute experience: in five minutes we want to convince you that this project Works, and that you should seriously consider spending some more time learning the system. In this tutorial no configuration or code changes are done.

This tutorial assumes that you are running on Unix, but might be adaptable easily to Windows.

For the fastest way through in Linux, you can use Docker, the linux container engine. Docker automates all the deployment steps for you.

For a more manual approach, you should be able to cut and paste each shell block from this tutorial directly into a terminal.

Getting the code

There are many ways to get the code on your machine. For this tutorial, we will use easy_install to install and run buildbot. While this isn't the preferred method to install buildbot, it is the simplest one to use for the purposes of this tutorial because it should work on all systems. (The preferred method would be to install buildbot via pip.)

To make this work, you will need the following installed:

Preferably, use your package installer to install these.

You will also need a working Internet connection, as virtualenv and easy_install will need to download other projects from the Internet.

Note

Buildbot does not require root access. Run the commands in this tutorial as a normal, unprivileged user.

Let's dive in by typing at the terminal:

cd
mkdir -p tmp/buildbot
cd tmp/buildbot
virtualenv --no-site-packages sandbox
source sandbox/bin/activate
easy_install sqlalchemy==0.7.10
easy_install buildbot

Note

The requirement to install SQLAlchemy-0.7.10 is due to a conflict between newer versions of SQLAlchemy and SQLAlchemy-Migrate.

Creating a master

At the terminal, type:

buildbot create-master master
mv master/master.cfg.sample master/master.cfg

Now start it:

buildbot start master
tail -f master/twistd.log

You will now see all of the log information from the master in this terminal. You should see lines like this:

2011-12-04 10:04:40-0600 [-] Starting factory <buildbot.status.web.baseweb.RotateLogSite instance at 0x2e36638>
2011-12-04 10:04:40-0600 [-] Setting up http.log rotating 10 files of 10000000 bytes each
2011-12-04 10:04:40-0600 [-] WebStatus using (/home/dustin/tmp/buildbot/master/public_html)
2011-12-04 10:04:40-0600 [-] removing 0 old schedulers, updating 0, and adding 1
2011-12-04 10:04:40-0600 [-] adding 1 new changesources, removing 0
2011-12-04 10:04:40-0600 [-] gitpoller: using workdir '/home/dustin/tmp/buildbot/master/gitpoller-workdir'
2011-12-04 10:04:40-0600 [-] gitpoller: initializing working dir from git://github.com/buildbot/pyflakes.git
2011-12-04 10:04:40-0600 [-] configuration update complete
2011-12-04 10:04:41-0600 [-] gitpoller: checking out master
2011-12-04 10:04:41-0600 [-] gitpoller: finished initializing working dir from git://github.com/buildbot/pyflakes.git at rev 1a4af6ec1dbb724b884ea14f439b272f30439e4d

Creating a slave

Open a new terminal and enter the same sandbox you created before:

cd
cd tmp/buildbot
source sandbox/bin/activate

Install the buildslave command:

easy_install buildbot-slave

Now, create the slave:

buildslave create-slave slave localhost:9989 example-slave pass

The user:host pair, username, and password should be the same as the ones in master.cfg; verify this is the case by looking at the section for c['slaves'] and c['slavePortnum']:

cat master/master.cfg

Now, start the slave:

buildslave start slave

Check the slave's log:

tail -f slave/twistd.log

You should see lines like the following at the end of the worker log:

2009-07-29 20:59:18+0200 [Broker,client] message from master: attached
2009-07-29 20:59:18+0200 [Broker,client] SlaveBuilder.remote_print(buildbot-full): message from master: attached
2009-07-29 20:59:18+0200 [Broker,client] sending application-level keepalives every 600 seconds

Meanwhile, in the other terminal, in the master log, if you tail the log you should see lines like this:

2011-03-13 18:46:58-0700 [Broker,1,127.0.0.1] slave 'example-slave' attaching from IPv4Address(TCP, '127.0.0.1', 41306)
2011-03-13 18:46:58-0700 [Broker,1,127.0.0.1] Got slaveinfo from 'example-slave'
2011-03-13 18:46:58-0700 [Broker,1,127.0.0.1] bot attached
2011-03-13 18:46:58-0700 [Broker,1,127.0.0.1] Buildslave example-slave attached to runtests

You should now be able to go to http://localhost:8010, where you will see a web page similar to:

index page

Click on the Waterfall Display link and you get this:

empty waterfall.

That's the end of the first tutorial. A bit underwhelming, you say? Well, that was the point! We just wanted to get you to dip your toes in the water. It's easy to take your first steps, but this is about as far as we can go without touching the configuration.

You've got a taste now, but you're probably curious for more. Let's step it up a little in the second tutorial by changing the configuration and doing an actual build. Continue on to A Quick Tour.

First Buildbot run with Docker

Docker is an tool that makes building and deploying custom environments a breeze. It uses lightweight linux containers (LXC) and performs quickly, making it a great instrument for the testing community. The next section includes a Docker pre-flight check. If it takes more that 3 minutes to get the 'Success' message for you, try the Buildbot pip-based first run instead.

Current Docker dependencies

  • Linux system, with at least kernel 3.8 and AUFS support. For example, Standard Ubuntu, Debian and Arch systems.
  • Packages: lxc, iptables, ca-certificates, and bzip2 packages
  • Local clock on time or slightly in the future for proper SSL communication
  • Download, launch and test docker is happy in your linux enviroment:
mkdir tmp; cd tmp
wget -O docker http://get.docker.io/builds/Linux/x86_64/docker-latest
chmod 755 docker; sudo ./docker -d &
sudo ./docker run -i busybox /bin/echo Success

Building and running Buildbot

# Download Buildbot Dockerfile.
wget https://raw.github.com/buildbot/buildbot/master/master/contrib/Dockerfile

# Build the Buildbot container (it will take a few minutes to download packages)
sudo ./docker build -t buildbot - < Dockerfile

# Run buildbot
CONTAINER_ID=$(sudo ./docker run -d buildbot)

You should now be able to go to http://localhost:8010 and see a web page similar to:

index page

Click on the Waterfall Display link and you get this:

empty waterfall.

Playing with your Buildbot container

If you've come this far, you have a Buildbot environment that you can freely experiment with. You can access your container using ssh (username: admin, password: admin):

ssh -p $(sudo ./docker port $CONTAINER_ID 22) admin@localhost

You've got a taste now, but you're probably curious for more. Let's step it up a little in the second tutorial by changing the configuration and doing an actual build. Continue on to A Quick Tour

A Quick Tour

Goal

This tutorial will expand on the First Run tutorial by taking a quick tour around some of the features of buildbot that are hinted at in the comments in the sample configuration. We will simply change parts of the default configuration and explain the activated features.

As a part of this tutorial, we will make buildbot do a few actual builds.

This section will teach you how to:
  • make simple configuration changes and activate them
  • deal with configuration errors
  • force builds
  • enable and control the IRC bot
  • enable ssh debugging
  • add a 'try' scheduler

Setting Project Name and URL

Let's start simple by looking at where you would customize the buildbot's project name and URL.

We continue where we left off in the First Run tutorial.

Open a new terminal, and first enter the same sandbox you created before (where $EDITOR is your editor of choice like vim, gedit, or emacs):

cd
cd tmp/buildbot
source sandbox/bin/activate
$EDITOR master/master.cfg

Now, look for the section marked PROJECT IDENTITY which reads:

####### PROJECT IDENTITY

# the 'title' string will appear at the top of this buildbot
# installation's html.WebStatus home page (linked to the
# 'titleURL') and is embedded in the title of the waterfall HTML page.

c['title'] = "Pyflakes"
c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"

If you want, you can change either of these links to anything you want to see what happens when you change them.

After making a change go into the terminal and type:

buildbot reconfig master

You will see a handful of lines of output from the master log, much like this:

2011-12-04 10:11:09-0600 [-] loading configuration from /home/dustin/tmp/buildbot/master/master.cfg
2011-12-04 10:11:09-0600 [-] configuration update started
2011-12-04 10:11:09-0600 [-] builder runtests is unchanged
2011-12-04 10:11:09-0600 [-] removing IStatusReceiver <WebStatus on port tcp:8010 at 0x2aee368>
2011-12-04 10:11:09-0600 [-] (TCP Port 8010 Closed)
2011-12-04 10:11:09-0600 [-] Stopping factory <buildbot.status.web.baseweb.RotateLogSite instance at 0x2e36638>
2011-12-04 10:11:09-0600 [-] adding IStatusReceiver <WebStatus on port tcp:8010 at 0x2c2d950>
2011-12-04 10:11:09-0600 [-] RotateLogSite starting on 8010
2011-12-04 10:11:09-0600 [-] Starting factory <buildbot.status.web.baseweb.RotateLogSite instance at 0x2e36e18>
2011-12-04 10:11:09-0600 [-] Setting up http.log rotating 10 files of 10000000 bytes each
2011-12-04 10:11:09-0600 [-] WebStatus using (/home/dustin/tmp/buildbot/master/public_html)
2011-12-04 10:11:09-0600 [-] removing 0 old schedulers, updating 0, and adding 0
2011-12-04 10:11:09-0600 [-] adding 1 new changesources, removing 1
2011-12-04 10:11:09-0600 [-] gitpoller: using workdir '/home/dustin/tmp/buildbot/master/gitpoller-workdir'
2011-12-04 10:11:09-0600 [-] GitPoller repository already exists
2011-12-04 10:11:09-0600 [-] configuration update complete

Reconfiguration appears to have completed successfully.

The important lines are the ones telling you that it is loading the new configuration at the top, and the one at the bottom saying that the update is complete.

Now, if you go back to the waterfall page, you will see that the project's name is whatever you may have changed it to and when you click on the URL of the project name at the bottom of the page it should take you to the link you put in the configuration.

Configuration Errors

It is very common to make a mistake when configuring buildbot, so you might as well see now what happens in that case and what you can do to fix the error.

Open up the config again and introduce a syntax error by removing the first single quote in the two lines you changed, so they read:

c['title'] = "Pyflakes"
c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"

This creates a Python SyntaxError. Now go ahead and reconfig the buildmaster:

buildbot reconfig master

This time, the output looks like:

2011-12-04 10:12:28-0600 [-] loading configuration from /home/dustin/tmp/buildbot/master/master.cfg
2011-12-04 10:12:28-0600 [-] configuration update started
2011-12-04 10:12:28-0600 [-] error while parsing config file
2011-12-04 10:12:28-0600 [-] Unhandled Error
        Traceback (most recent call last):
        File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 197, in loadTheConfigFile
            d = self.loadConfig(f)
        File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 579, in loadConfig
            d.addCallback(do_load)
        File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 298, in addCallback
            callbackKeywords=kw)
        File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 287, in addCallbacks
            self._runCallbacks()
        --- <exception caught here> ---
        File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 545, in _runCallbacks
            current.result = callback(current.result, *args, **kw)
        File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 226, in do_load
            exec f in localDict
        exceptions.SyntaxError: EOL while scanning string literal (master.cfg, line 17)

Never saw reconfiguration finish.

This time, it's clear that there was a mistake. in the configuration. Luckily, the buildbot master will ignore the wrong configuration and keep running with the previous configuration.

The message is clear enough, so open the configuration again, fix the error, and reconfig the master.

Your First Build

By now you're probably thinking: "All this time spent and still not done a single build? What was the name of this project again?"

On the waterfall. page, click on the runtests link. You'll see a builder page, and in the upper-right corner is a box where you can login. The default username and password are both "pyflakes". Once you've logged in, you will see some new options that allow you to force a build:

force a build.

Click Force Build - there's no need to fill in any of the fields in this case. Next, click on view in waterfall.

You will now see:

an successful test run happened.

Enabling the IRC Bot

Buildbot includes an IRC bot that you can tell to join a channel and control to report on the status of buildbot.

First, start an IRC client of your choice, connect to irc.freenode.org and join an empty channel. In this example we will use #buildbot-test, so go join that channel. (Note: please do not join the main buildbot channel!)

Edit the config and look for the STATUS TARGETS section. Enter these lines below the WebStatus line in master.cfg:

c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))

from buildbot.status import words
c['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest",
                             channels=["#buildbot-test"]))

Reconfigure the build master then do:

grep -i irc master/twistd.log

The log output should contain a line like this:

2009-08-01 15:35:20+0200 [-] adding IStatusReceiver <buildbot.status.words.IRC instance at 0x300d290>

You should see the bot now joining in your IRC client. In your IRC channel, type:

bbtest: commands

to get a list of the commands the bot supports.

Let's tell the bot to notify certain events, to learn which EVENTS we can notify on:

bbtest: help notify

Now let's set some event notifications:

bbtest: notify on started
bbtest: notify on finished
bbtest: notify on failure

The bot should have responded to each of the commands:

<@lsblakk> bbtest: notify on started
<bbtest> The following events are being notified: ['started']
<@lsblakk> bbtest: notify on finished
<bbtest> The following events are being notified: ['started', 'finished']
<@lsblakk> bbtest: notify on failure
<bbtest> The following events are being notified: ['started', 'failure', 'finished']

Now, go back to the web interface and force another build.

Notice how the bot tells you about the start and finish of this build:

< bbtest> build #1 of runtests started, including []
< bbtest> build #1 of runtests is complete: Success [build successful]  Build details are at http://localhost:8010/builders/runtests/builds/1

You can also use the bot to force a build:

bbtest: force build runtests test build

But to allow this, you'll need to have allowForce in the IRC configuration:

c['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest",
                             allowForce=True,
                             channels=["#buildbot-test"]))

This time, the bot is giving you more output, as it's specifically responding to your direct request to force a build, and explicitly tells you when the build finishes:

<@lsblakk> bbtest: force build runtests test build
< bbtest> build #2 of runtests started, including []
< bbtest> build forced [ETA 0 seconds]
< bbtest> I'll give a shout when the build finishes
< bbtest> build #2 of runtests is complete: Success [build successful]  Build details are at http://localhost:8010/builders/runtests/builds/2

You can also see the new builds in the web interface.

a successful test run from IRC happened.

Setting Authorized Web Users

Further down, look for the WebStatus configuration:

c['status'] = []

from buildbot.status import html
from buildbot.status.web import authz, auth

authz_cfg=authz.Authz(
    # change any of these to True to enable; see the manual for more
    # options
    auth=auth.BasicAuth([("pyflakes","pyflakes")]),
    gracefulShutdown = False,
    forceBuild = 'auth', # use this to test your slave once it is set up
    forceAllBuilds = False,
    pingBuilder = False,
    stopBuild = False,
    stopAllBuilds = False,
    cancelPendingBuild = False,
)
c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))

The auth.BasicAuth() define authorized users and their passwords. You can change these or add new ones. See WebStatus for more about the WebStatus configuration.

Debugging with Manhole

You can do some debugging by using manhole, an interactive Python shell. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.

To use this you will need to install an additional package or two to your virtualenv:

cd
cd tmp/buildbot
source sandbox/bin/activate
easy_install pycrypto
easy_install pyasn1

In your master.cfg find:

c = BuildmasterConfig = {}

Insert the following to enable debugging mode with manhole:

####### DEBUGGING
from buildbot import manhole
c['manhole'] = manhole.PasswordManhole("tcp:1234:interface=127.0.0.1","admin","passwd")

After restarting the master, you can ssh into the master and get an interactive Python shell:

ssh -p1234 admin@127.0.0.1
# enter passwd at prompt

Note

The pyasn1-0.1.1 release has a bug which results in an exception similar to this on startup:

exceptions.TypeError: argument 2 must be long, not int

If you see this, the temporary solution is to install the previous version of pyasn1:

pip install pyasn1-0.0.13b

If you wanted to check which slaves are connected and what builders those slaves are assigned to you could do:

>>> master.botmaster.slaves
{'example-slave': <BuildSlave 'example-slave', current builders: runtests>}

Objects can be explored in more depth using dir(x) or the helper function show(x).

Adding a 'try' scheduler

Buildbot includes a way for developers to submit patches for testing without committing them to the source code control system. (This is really handy for projects that support several operating systems or architectures.)

To set this up, add the following lines to master.cfg:

from buildbot.scheduler import Try_Userpass
c['schedulers'].append(Try_Userpass(
                                    name='try',
                                    builderNames=['runtests'],
                                    port=5555,
                                    userpass=[('sampleuser','samplepass')]))

Then you can submit changes using the try command.

Let's try this out by making a one-line change to pyflakes, say, to make it trace the tree by default:

git clone git://github.com/buildbot/pyflakes.git pyflakes-git
cd pyflakes-git/pyflakes
$EDITOR checker.py
# change "traceTree = False" on line 185 to "traceTree = True"

Then run buildbot's try command as follows:

source ~/tmp/buildbot/sandbox/bin/activate
buildbot try --connect=pb --master=127.0.0.1:5555 --username=sampleuser --passwd=samplepass --vc=git

This will do git diff for you and send the resulting patch to the server for build and test against the latest sources from Git.

Now go back to the waterfall page, click on the runtests link, and scroll down. You should see that another build has been started with your change (and stdout for the tests should be chock-full of parse trees as a result). The "Reason" for the job will be listed as "'try' job", and the blamelist will be empty.

To make yourself show up as the author of the change, use the --who=emailaddr option on buildbot try to pass your email address.

To make a description of the change show up, use the --properties=comment="this is a comment" option on buildbot try.

To use ssh instead of a private username/password database, see Try_Jobdir.

Further Reading

See the following user-contributed tutorials for other highlights and ideas:

Buildbot in 5 minutes - a user-contributed tutorial

(Ok, maybe 10.)

Buildbot is really an excellent piece of software, however it can be a bit confusing for a newcomer (like me when I first started looking at it). Typically, at first sight it looks like a bunch of complicated concepts that make no sense and whose relationships with each other are unclear. After some time and some reread, it all slowly starts to be more and more meaningful, until you finally say "oh!" and things start to make sense. Once you get there, you realize that the documentation is great, but only if you already know what it's about.

This is what happened to me, at least. Here I'm going to (try to) explain things in a way that would have helped me more as a newcomer. The approach I'm taking is more or less the reverse of that used by the documentation, that is, I'm going to start from the components that do the actual work (the builders) and go up the chain from there up to change sources. I hope purists will forgive this unorthodoxy. Here I'm trying to clarify the concepts only, and will not go into the details of each object or property; the documentation explains those quite well.

Installation

I won't cover the installation; both buildbot master and slave are available as packages for the major distributions, and in any case the instructions in the official documentation are fine. This document will refer to buildbot 0.8.5 which was current at the time of writing, but hopefully the concepts are not too different in other versions. All the code shown is of course python code, and has to be included in the master.cfg master configuration file.

We won't cover the basic things such as how to define the slaves, project names, or other administrative information that is contained in that file; for that, again the official documentation is fine.

Builders: the workhorses

Since buildbot is a tool whose goal is the automation of software builds, it makes sense to me to start from where we tell buildbot how to build our software: the builder (or builders, since there can be more than one).

Simply put, a builder is an element that is in charge of performing some action or sequence of actions, normally something related to building software (for example, checking out the source, or make all), but it can also run arbitrary commands.

A builder is configured with a list of slaves that it can use to carry out its task. The other fundamental piece of information that a builder needs is, of course, the list of things it has to do (which will normally run on the chosen slave). In buildbot, this list of things is represented as a BuildFactory object, which is essentially a sequence of steps, each one defining a certain operation or command.

Enough talk, let's see an example. For this example, we are going to assume that our super software project can be built using a simple make all, and there is another target make packages that creates rpm, deb and tgz packages of the binaries. In the real world things are usually more complex (for example there may be a configure step, or multiple targets), but the concepts are the same; it will just be a matter of adding more steps to a builder, or creating multiple builders, although sometimes the resulting builders can be quite complex.

So to perform a manual build of our project we would type this from the command line (assuming we are at the root of the local copy of the repository):

$ make clean    # clean remnants of previous builds
...
$ svn update
...
$ make all
...
$ make packages
...
# optional but included in the example: copy packages to some central machine
$ scp packages/*.rpm packages/*.deb packages/*.tgz someuser@somehost:/repository
...

Here we're assuming the repository is SVN, but again the concepts are the same with git, mercurial or any other VCS.

Now, to automate this, we create a builder where each step is one of the commands we typed above. A step can be a shell command object, or a dedicated object that checks out the source code (there are various types for different repositories, see the docs for more info), or yet something else:

from buildbot.process.factory import BuildFactory
from buildbot.steps.source import SVN
from buildbot.steps.shell import ShellCommand

# first, let's create the individual step objects

# step 1: make clean; this fails if the slave has no local copy, but
# is harmless and will only happen the first time
makeclean = ShellCommand(name = "make clean",
                         command = ["make", "clean"],
                         description = "make clean")

# step 2: svn update (here updates trunk, see the docs for more
# on how to update a branch, or make it more generic).
checkout = SVN(baseURL = 'svn://myrepo/projects/coolproject/trunk',
               mode = "update",
               username = "foo",
               password = "bar",
               haltOnFailure = True )

# step 3: make all
makeall = ShellCommand(name = "make all",
                       command = ["make", "all"],
                       haltOnFailure = True,
                       description = "make all")

# step 4: make packages
makepackages = ShellCommand(name = "make packages",
                            command = ["make", "packages"],
                            haltOnFailure = True,
                            description = "make packages")

# step 5: upload packages to central server. This needs passwordless ssh
# from the slave to the server (set it up in advance as part of slave setup)
uploadpackages = ShellCommand(name = "upload packages",
                              description = "upload packages",
                              command = "scp packages/*.rpm packages/*.deb packages/*.tgz someuser@somehost:/repository",
                              haltOnFailure = True)

# create the build factory and add the steps to it
f_simplebuild = BuildFactory()
f_simplebuild.addStep(makeclean)
f_simplebuild.addStep(checkout)
f_simplebuild.addStep(makeall)
f_simplebuild.addStep(makepackages)
f_simplebuild.addStep(uploadpackages)

# finally, declare the list of builders. In this case, we only have one builder
c['builders'] = [
    BuilderConfig(name = "simplebuild", slavenames = ['slave1', 'slave2', 'slave3'], factory = f_simplebuild)
]

So our builder is called simplebuild and can run on either of slave1, slave2 and slave3. If our repository has other branches besides trunk, we could create another one or more builders to build them; in the example, only the checkout step would be different, in that it would need to check out the specific branch. Depending on how exactly those branches have to be built, the shell commands may be recycled, or new ones would have to be created if they are different in the branch. You get the idea. The important thing is that all the builders be named differently and all be added to the c['builders'] value (as can be seen above, it is a list of BuilderConfig objects).

Of course the type and number of steps will vary depending on the goal; for example, to just check that a commit doesn't break the build, we could include just up to the make all step. Or we could have a builder that performs a more thorough test by also doing make test or other targets. You get the idea. Note that at each step except the very first we use haltOnFailure = True because it would not make sense to execute a step if the previous one failed (ok, it wouldn't be needed for the last step, but it's harmless and protects us if one day we add another step after it).

Schedulers

Now this is all nice and dandy, but who tells the builder (or builders) to run, and when? This is the job of the scheduler, which is a fancy name for an element that waits for some event to happen, and when it does, based on that information decides whether and when to run a builder (and which one or ones). There can be more than one scheduler. I'm being purposely vague here because the possibilities are almost endless and highly dependent on the actual setup, build purposes, source repository layout and other elements.

So a scheduler needs to be configured with two main pieces of information: on one hand, which events to react to, and on the other hand, which builder or builders to trigger when those events are detected. (It's more complex than that, but if you understand this, you can get the rest of the details from the docs).

A simple type of scheduler may be a periodic scheduler: when a configurable amount of time has passed, run a certain builder (or builders). In our example, that's how we would trigger a build every hour:

from buildbot.schedulers.timed import Periodic

# define the periodic scheduler
hourlyscheduler = Periodic(name = "hourly",
                           builderNames = ["simplebuild"],
                           periodicBuildTimer = 3600)

# define the available schedulers
c['schedulers'] = [ hourlyscheduler ]

That's it. Every hour this hourly scheduler will run the simplebuild builder. If we have more than one builder that we want to run every hour, we can just add them to the builderNames list when defining the scheduler and they will all be run. Or since multiple scheduler are allowed, other schedulers can be defined and added to c['schedulers'] in the same way.

Other types of schedulers exist; in particular, there are schedulers that can be more dynamic than the periodic one. The typical dynamic scheduler is one that learns about changes in a source repository (generally because some developer checks in some change), and triggers one or more builders in response to those changes. Let's assume for now that the scheduler "magically" learns about changes in the repository (more about this later); here's how we would define it:

from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.changes import filter

# define the dynamic scheduler
trunkchanged = SingleBranchScheduler(name = "trunkchanged",
                                     change_filter = filter.ChangeFilter(branch = None),
                                     treeStableTimer = 300,
                                     builderNames = ["simplebuild"])

# define the available schedulers
c['schedulers'] = [ trunkchanged ]

This scheduler receives changes happening to the repository, and among all of them, pays attention to those happening in "trunk" (that's what branch = None means). In other words, it filters the changes to react only to those it's interested in. When such changes are detected, and the tree has been quiet for 5 minutes (300 seconds), it runs the simplebuild builder. The treeStableTimer helps in those situations where commits tend to happen in bursts, which would otherwise result in multiple build requests queuing up.

What if we want to act on two branches (say, trunk and 7.2)? First we create two builders, one for each branch (see the builders paragraph above), then we create two dynamic schedulers:

from buildbot.schedulers.basic import SingleBranchScheduler
from buildbot.changes import filter

# define the dynamic scheduler for trunk
trunkchanged = SingleBranchScheduler(name = "trunkchanged",
                                     change_filter = filter.ChangeFilter(branch = None),
                                     treeStableTimer = 300,
                                     builderNames = ["simplebuild-trunk"])

# define the dynamic scheduler for the 7.2 branch
branch72changed = SingleBranchScheduler(name = "branch72changed",
                                        change_filter = filter.ChangeFilter(branch = 'branches/7.2'),
                                        treeStableTimer = 300,
                                        builderNames = ["simplebuild-72"])

# define the available schedulers
c['schedulers'] = [ trunkchanged, branch72changed ]

The syntax of the change filter is VCS-dependent (above is for SVN), but again once the idea is clear, the documentation has all the details. Another feature of the scheduler is that is can be told which changes, within those it's paying attention to, are important and which are not. For example, there may be a documentation directory in the branch the scheduler is watching, but changes under that directory should not trigger a build of the binary. This finer filtering is implemented by means of the fileIsImportant argument to the scheduler (full details in the docs and - alas - in the sources).

Change sources

Earlier we said that a dynamic scheduler "magically" learns about changes; the final piece of the puzzle are change sources, which are precisely the elements in buildbot whose task is to detect changes in the repository and communicate them to the schedulers. Note that periodic schedulers don't need a change source, since they only depend on elapsed time; dynamic schedulers, on the other hand, do need a change source.

A change source is generally configured with information about a source repository (which is where changes happen); a change source can watch changes at different levels in the hierarchy of the repository, so for example it is possible to watch the whole repository or a subset of it, or just a single branch. This determines the extent of the information that is passed down to the schedulers.

There are many ways a change source can learn about changes; it can periodically poll the repository for changes, or the VCS can be configured (for example through hook scripts triggered by commits) to push changes into the change source. While these two methods are probably the most common, they are not the only possibilities; it is possible for example to have a change source detect changes by parsing some email sent to a mailing list when a commit happen, and yet other methods exist. The manual again has the details.

To complete our example, here's a change source that polls a SVN repository every 2 minutes:

from buildbot.changes.svnpoller import SVNPoller, split_file_branches

svnpoller = SVNPoller(svnurl = "svn://myrepo/projects/coolproject",
                      svnuser = "foo",
                      svnpasswd = "bar",
                      pollinterval = 120,
                      split_file = split_file_branches)

c['change_source'] = svnpoller

This poller watches the whole "coolproject" section of the repository, so it will detect changes in all the branches. We could have said

svnurl = "svn://myrepo/projects/coolproject/trunk"

or

svnurl = "svn://myrepo/projects/coolproject/branches/7.2"

to watch only a specific branch.

To watch another project, you need to create another change source -- and you need to filter changes by project. For instance, when you add a change source watching project 'superproject' to the above example, you need to change:

trunkchanged = SingleBranchScheduler(name = "trunkchanged",
                                     change_filter = filter.ChangeFilter(branch = None),
                                     # ...
                                     )

to e.g.:

trunkchanged = SingleBranchScheduler(name = "trunkchanged",
                                     change_filter = filter.ChangeFilter(project = "coolproject", branch = None),
                                     # ...
                                     )

else coolproject will be built when there's a change in superproject.

Since we're watching more than one branch, we need a method to tell in which branch the change occurred when we detect one. This is what the split_file argument does, it takes a callable that buildbot will call to do the job. The split_file_branches function, which comes with buildbot, is designed for exactly this purpose so that's what the example above uses.

And of course this is all SVN-specific, but there are pollers for all the popular VCSs.

But note: if you have many projects, branches, and builders it probably pays to not hardcode all the schedulers and builders in the configuration, but generate them dynamically starting from list of all projects, branches, targets etc. and using loops to generate all possible combinations (or only the needed ones, depending on the specific setup), as explained in the documentation chapter about Customization.

Status targets

Now that the basics are in place, let's go back to the builders, which is where the real work happens. Status targets are simply the means buildbot uses to inform the world about what's happening, that is, how builders are doing. There are many status target: a web interface, a mail notifier, an IRC notifier, and others. They are described fairly well in the manual.

One thing I've found useful is the ability to pass a domain name as the lookup argument to a mailNotifier, which allows to take an unqualified username as it appears in the SVN change and create a valid email address by appending the given domain name to it:

from buildbot.status import mail

# if jsmith commits a change, mail for the build is sent to jsmith@example.org
notifier = mail.MailNotifier(fromaddr = "buildbot@example.org",
                             sendToInterestedUsers = True,
                             lookup = "example.org")
c['status'].append(notifier)

The mail notifier can be customized at will by means of the messageFormatter argument, which is a function that buildbot calls to format the body of the email, and to which it makes available lots of information about the build. Here all the details.

Conclusion

Please note that this article has just scratched the surface; given the complexity of the task of build automation, the possibilities are almost endless. So there's much, much more to say about buildbot. However, hopefully this is a preparation step before reading the official manual. Had I found an explanation as the one above when I was approaching buildbot, I'd have had to read the manual just once, rather than multiple times. Hope this can help someone else.

(Thanks to Davide Brini for permission to include this tutorial, derived from one he originally posted at http://backreference.org .)

This is the BuildBot manual for Buildbot version 0.8.9.

Buildbot Manual

Introduction

BuildBot is a system to automate the compile/test cycle required by most software projects to validate code changes. By automatically rebuilding and testing the tree each time something has changed, build problems are pinpointed quickly, before other developers are inconvenienced by the failure. The guilty developer can be identified and harassed without human intervention. By running the builds on a variety of platforms, developers who do not have the facilities to test their changes everywhere before checkin will at least know shortly afterwards whether they have broken the build or not. Warning counts, lint checks, image size, compile time, and other build parameters can be tracked over time, are more visible, and are therefore easier to improve.

The overall goal is to reduce tree breakage and provide a platform to run tests or code-quality checks that are too annoying or pedantic for any human to waste their time with. Developers get immediate (and potentially public) feedback about their changes, encouraging them to be more careful about testing before checkin.

Features:

  • run builds on a variety of slave platforms
  • arbitrary build process: handles projects using C, Python, whatever
  • minimal host requirements: Python and Twisted
  • slaves can be behind a firewall if they can still do checkout
  • status delivery through web page, email, IRC, other protocols
  • track builds in progress, provide estimated completion time
  • flexible configuration by subclassing generic build process classes
  • debug tools to force a new build, submit fake Changes, query slave status
  • released under the GPL

History and Philosophy

The Buildbot was inspired by a similar project built for a development team writing a cross-platform embedded system. The various components of the project were supposed to compile and run on several flavors of unix (linux, solaris, BSD), but individual developers had their own preferences and tended to stick to a single platform. From time to time, incompatibilities would sneak in (some unix platforms want to use string.h, some prefer strings.h), and then the tree would compile for some developers but not others. The buildbot was written to automate the human process of walking into the office, updating a tree, compiling (and discovering the breakage), finding the developer at fault, and complaining to them about the problem they had introduced. With multiple platforms it was difficult for developers to do the right thing (compile their potential change on all platforms); the buildbot offered a way to help.

Another problem was when programmers would change the behavior of a library without warning its users, or change internal aspects that other code was (unfortunately) depending upon. Adding unit tests to the codebase helps here: if an application's unit tests pass despite changes in the libraries it uses, you can have more confidence that the library changes haven't broken anything. Many developers complained that the unit tests were inconvenient or took too long to run: having the buildbot run them reduces the developer's workload to a minimum.

In general, having more visibility into the project is always good, and automation makes it easier for developers to do the right thing. When everyone can see the status of the project, developers are encouraged to keep the tree in good working order. Unit tests that aren't run on a regular basis tend to suffer from bitrot just like code does: exercising them on a regular basis helps to keep them functioning and useful.

The current version of the Buildbot is additionally targeted at distributed free-software projects, where resources and platforms are only available when provided by interested volunteers. The buildslaves are designed to require an absolute minimum of configuration, reducing the effort a potential volunteer needs to expend to be able to contribute a new test environment to the project. The goal is for anyone who wishes that a given project would run on their favorite platform should be able to offer that project a buildslave, running on that platform, where they can verify that their portability code works, and keeps working.

System Architecture

The Buildbot consists of a single buildmaster and one or more buildslaves, connected in a star topology. The buildmaster makes all decisions about what, when, and how to build. It sends commands to be run on the build slaves, which simply execute the commands and return the results. (certain steps involve more local decision making, where the overhead of sending a lot of commands back and forth would be inappropriate, but in general the buildmaster is responsible for everything).

The buildmaster is usually fed Changes by some sort of version control system (Change Sources), which may cause builds to be run. As the builds are performed, various status messages are produced, which are then sent to any registered Status Targets.

Overview Diagram

The buildmaster is configured and maintained by the buildmaster admin, who is generally the project team member responsible for build process issues. Each buildslave is maintained by a buildslave admin, who do not need to be quite as involved. Generally slaves are run by anyone who has an interest in seeing the project work well on their favorite platform.

BuildSlave Connections

The buildslaves are typically run on a variety of separate machines, at least one per platform of interest. These machines connect to the buildmaster over a TCP connection to a publically-visible port. As a result, the buildslaves can live behind a NAT box or similar firewalls, as long as they can get to buildmaster. The TCP connections are initiated by the buildslave and accepted by the buildmaster, but commands and results travel both ways within this connection. The buildmaster is always in charge, so all commands travel exclusively from the buildmaster to the buildslave.

To perform builds, the buildslaves must typically obtain source code from a CVS/SVN/etc repository. Therefore they must also be able to reach the repository. The buildmaster provides instructions for performing builds, but does not provide the source code itself.

BuildSlave Connections
Buildmaster Architecture

The buildmaster consists of several pieces:

Buildmaster Architecture
Change Sources
Which create a Change object each time something is modified in the VC repository. Most ChangeSources listen for messages from a hook script of some sort. Some sources actively poll the repository on a regular basis. All Changes are fed to the Schedulers.
Schedulers
Which decide when builds should be performed. They collect Changes into BuildRequests, which are then queued for delivery to Builders until a buildslave is available.
Builders
Which control exactly how each build is performed (with a series of BuildSteps, configured in a BuildFactory). Each Build is run on a single buildslave.
Status plugins
Which deliver information about the build results through protocols like HTTP, mail, and IRC.

Each Builder is configured with a list of BuildSlaves that it will use for its builds. These buildslaves are expected to behave identically: the only reason to use multiple BuildSlaves for a single Builder is to provide a measure of load-balancing.

Within a single BuildSlave, each Builder creates its own SlaveBuilder instance. These SlaveBuilders operate independently from each other. Each gets its own base directory to work in. It is quite common to have many Builders sharing the same buildslave. For example, there might be two buildslaves: one for i386, and a second for PowerPC. There may then be a pair of Builders that do a full compile/test run, one for each architecture, and a lone Builder that creates snapshot source tarballs if the full builders complete successfully. The full builders would each run on a single buildslave, whereas the tarball creation step might run on either buildslave (since the platform doesn't matter when creating source tarballs). In this case, the mapping would look like:

Builder(full-i386)  ->  BuildSlaves(slave-i386)
Builder(full-ppc)   ->  BuildSlaves(slave-ppc)
Builder(source-tarball) -> BuildSlaves(slave-i386, slave-ppc)

and each BuildSlave would have two SlaveBuilders inside it, one for a full builder, and a second for the source-tarball builder.

Once a SlaveBuilder is available, the Builder pulls one or more BuildRequests off its incoming queue. (It may pull more than one if it determines that it can merge the requests together; for example, there may be multiple requests to build the current HEAD revision). These requests are merged into a single Build instance, which includes the SourceStamp that describes what exact version of the source code should be used for the build. The Build is then randomly assigned to a free SlaveBuilder and the build begins.

The behaviour when BuildRequests are merged can be customized, Merging Build Requests.

Status Delivery Architecture

The buildmaster maintains a central Status object, to which various status plugins are connected. Through this Status object, a full hierarchy of build status objects can be obtained.

Status Delivery

The configuration file controls which status plugins are active. Each status plugin gets a reference to the top-level Status object. From there they can request information on each Builder, Build, Step, and LogFile. This query-on-demand interface is used by the html.Waterfall plugin to create the main status page each time a web browser hits the main URL.

The status plugins can also subscribe to hear about new Builds as they occur: this is used by the MailNotifier to create new email messages for each recently-completed Build.

The Status object records the status of old builds on disk in the buildmaster's base directory. This allows it to return information about historical builds.

There are also status objects that correspond to Schedulers and BuildSlaves. These allow status plugins to report information about upcoming builds, and the online/offline status of each buildslave.

Control Flow

A day in the life of the buildbot:

  • A developer commits some source code changes to the repository. A hook script or commit trigger of some sort sends information about this change to the buildmaster through one of its configured Change Sources. This notification might arrive via email, or over a network connection (either initiated by the buildmaster as it subscribes to changes, or by the commit trigger as it pushes Changes towards the buildmaster). The Change contains information about who made the change, what files were modified, which revision contains the change, and any checkin comments.
  • The buildmaster distributes this change to all of its configured Schedulers. Any important changes cause the tree-stable-timer to be started, and the Change is added to a list of those that will go into a new Build. When the timer expires, a Build is started on each of a set of configured Builders, all compiling/testing the same source code. Unless configured otherwise, all Builds run in parallel on the various buildslaves.
  • The Build consists of a series of Steps. Each Step causes some number of commands to be invoked on the remote buildslave associated with that Builder. The first step is almost always to perform a checkout of the appropriate revision from the same VC system that produced the Change. The rest generally perform a compile and run unit tests. As each Step runs, the buildslave reports back command output and return status to the buildmaster.
  • As the Build runs, status messages like "Build Started", "Step Started", "Build Finished", etc, are published to a collection of Status Targets. One of these targets is usually the HTML Waterfall display, which shows a chronological list of events, and summarizes the results of the most recent build at the top of each column. Developers can periodically check this page to see how their changes have fared. If they see red, they know that they've made a mistake and need to fix it. If they see green, they know that they've done their duty and don't need to worry about their change breaking anything.
  • If a MailNotifier status target is active, the completion of a build will cause email to be sent to any developers whose Changes were incorporated into this Build. The MailNotifier can be configured to only send mail upon failing builds, or for builds which have just transitioned from passing to failing. Other status targets can provide similar real-time notification via different communication channels, like IRC.

Installation

Buildbot Components

Buildbot is shipped in two components: the buildmaster (called buildbot for legacy reasons) and the buildslave. The buildslave component has far fewer requirements, and is more broadly compatible than the buildmaster. You will need to carefully pick the environment in which to run your buildmaster, but the buildslave should be able to run just about anywhere.

It is possible to install the buildmaster and buildslave on the same system, although for anything but the smallest installation this arrangement will not be very efficient.

Requirements

Common Requirements

At a bare minimum, you'll need the following for both the buildmaster and a buildslave:

Python: http://www.python.org

Buildbot requires Python-2.5 or later on the master, although Python-2.7 is recommended. The slave run on Python-2.4.

Twisted: http://twistedmatrix.com

Buildbot requires Twisted-11.0.0 or later on the master, and Twisted-8.1.0 on the slave. In upcoming versions of Buildbot, a newer Twisted will also be required on the slave. As always, the most recent version is recommended.

In some cases, Twisted is delivered as a collection of subpackages. You'll need at least "Twisted" (the core package), and you'll also want TwistedMail, TwistedWeb, and TwistedWords (for sending email, serving a web status page, and delivering build status via IRC, respectively). You might also want TwistedConch (for the encrypted Manhole debug port). Note that Twisted requires ZopeInterface to be installed as well.

Of course, your project's build process will impose additional requirements on the buildslaves. These hosts must have all the tools necessary to compile and test your project's source code.

Windows Support

Buildbot - both master and slave - runs well natively on Windows. The slave runs well on Cygwin, but because of problems with SQLite on Cygwin, the master does not.

Buildbot's windows testing is limited to the most recent Twisted and Python versions. For best results, use the most recent available versions of these libraries on Windows.

Pywin32: http://sourceforge.net/projects/pywin32/

Twisted requires PyWin32 in order to spawn processes on Windows.
Buildmaster Requirements

sqlite3: http://www.sqlite.org

Buildbot requires SQLite to store its state. Version 3.7.0 or higher is recommended, although Buildbot will run against earlier versions -- at the risk of "Database is locked" errors. The minimum version is 3.4.0, below which parallel database queries and schema introspection fail.

pysqlite: http://pypi.python.org/pypi/pysqlite

The SQLite Python package is required for Python-2.5 and earlier (it is already included in Python-2.5 and later, but the version in Python-2.5 has nasty bugs)

simplejson: http://pypi.python.org/pypi/simplejson

The simplejson package is required for Python-2.5 and earlier (it is already included as json in Python-2.6 and later)

Jinja2: http://jinja.pocoo.org/

Buildbot requires Jinja version 2.1 or higher.

Jinja2 is a general purpose templating language and is used by Buildbot to generate the HTML output.

SQLAlchemy: http://www.sqlalchemy.org/

Buildbot requires SQLAlchemy 0.6.0 or higher. SQLAlchemy allows Buildbot to build database schemas and queries for a wide variety of database systems.

SQLAlchemy-Migrate: http://code.google.com/p/sqlalchemy-migrate/

Buildbot requires one of the following SQLAlchemy-Migrate versions: 0.6.1, 0.7.0, and 0.7.1. Sadly, Migrate's inter-version compatibility is not good, so other versions - newer or older - are unlikely to work correctly. Buildbot uses SQLAlchemy-Migrate to manage schema upgrades from version to version.

Python-Dateutil: http://labix.org/python-dateutil

The Nightly scheduler requires Python-Dateutil version 1.5 (the last version to support Python-2.x). This is a small, pure-python library. Buildbot will function properly without it if the Nightlys scheduler is not used.

Installing the code

The Distribution Package

Buildbot comes in two parts: buildbot (the master) and buildbot-slave (the slave). The two can be installed individually or together.

Installation From PyPI

The preferred way to install Buildbot is using pip. For the master:

pip install buildbot

and for the slave:

pip install buildbot-slave

When using pip to install instead of distribution specific package manangers, e.g. via apt-get or ports, it is simpler to choose exactly which version one wants to use. It may however be easier to install via distribution specific package mangers but note that they may provide an earlier version than what is available via pip.

Installation From Tarballs

Buildbot and Buildslave are installed using the standard Python distutils process. For either component, after unpacking the tarball, the process is:

python setup.py build
python setup.py install

where the install step may need to be done as root. This will put the bulk of the code in somewhere like /usr/lib/pythonx.y/site-packages/buildbot. It will also install the buildbot command-line tool in /usr/bin/buildbot.

If the environment variable $NO_INSTALL_REQS is set to 1, then setup.py will not try to install Buildbot's requirements. This is usually only useful when building a Buildbot package.

To test this, shift to a different directory (like /tmp), and run:

buildbot --version
# or
buildslave --version

If it shows you the versions of Buildbot and Twisted, the install went ok. If it says "no such command" or it gets an ImportError when it tries to load the libraries, then something went wrong. pydoc buildbot is another useful diagnostic tool.

Windows users will find these files in other places. You will need to make sure that Python can find the libraries, and will probably find it convenient to have buildbot on your PATH.

Installation in a Virtualenv

If you cannot or do not wish to install the buildbot into a site-wide location like /usr or /usr/local, you can also install it into the account's home directory or any other location using a tool like virtualenv.

Running Buildbot's Tests (optional)

If you wish, you can run the buildbot unit test suite. First, ensure you have the mock Python module installed from PyPi. This module is not required for ordinary Buildbot operation - only to run the tests. Note that this is not the same as the Fedora mock package! You can check with

python -mmock

Then, run the tests:

PYTHONPATH=. trial buildbot.test
# or
PYTHONPATH=. trial buildslave.test

Nothing should fail, although a few might be skipped.

If any of the tests fail for reasons other than a missing mock, you should stop and investigate the cause before continuing the installation process, as it will probably be easier to track down the bug early. In most cases, the problem is incorrectly installed Python modules or a badly configured PYTHONPATH. This may be a good time to contact the Buildbot developers for help.

Creating a buildmaster

As you learned earlier (System Architecture), the buildmaster runs on a central host (usually one that is publicly visible, so everybody can check on the status of the project), and controls all aspects of the buildbot system

You will probably wish to create a separate user account for the buildmaster, perhaps named buildmaster. Do not run the buildmaster as root!

You need to choose a directory for the buildmaster, called the basedir. This directory will be owned by the buildmaster. It will contain configuration, the database, and status information - including logfiles. On a large buildmaster this directory will see a lot of activity, so it should be on a disk with adequate space and speed.

Once you've picked a directory, use the buildbot create-master command to create the directory and populate it with startup files:

buildbot create-master -r basedir

You will need to create a configuration file before starting the buildmaster. Most of the rest of this manual is dedicated to explaining how to do this. A sample configuration file is placed in the working directory, named master.cfg.sample, which can be copied to master.cfg and edited to suit your purposes.

(Internal details: This command creates a file named buildbot.tac that contains all the state necessary to create the buildmaster. Twisted has a tool called twistd which can use this .tac file to create and launch a buildmaster instance. twistd takes care of logging and daemonization (running the program in the background). /usr/bin/buildbot is a front end which runs twistd for you.)

Using A Database Server

If you want to use a database server (e.g., MySQL or Postgres) as the database backend for your Buildbot, add the --db option to the create-master invocation to specify the connection string for the database, and make sure that the same URL appears in the db_url of the db parameter in your configuration file.

Additional Requirements

Depending on the selected database, further Python packages will be required. Consult the SQLAlchemy dialect list for a full description. The most common choice for MySQL is

MySQL-python: http://mysql-python.sourceforge.net/

To communicate with MySQL, SQLAlchemy requires MySQL-python. Any reasonably recent version of MySQL-python should suffice.

The most common choice for Postgres is

Psycopg: http://initd.org/psycopg/

SQLAlchemy uses Psycopg to communicate with Postgres. Any reasonably recent version should suffice.
Buildmaster Options

This section lists options to the create-master command. You can also type buildbot create-master --help for an up-to-the-moment summary.

--force

With this option, @command{create-master} will re-use an existing master directory.

--no-logrotate

This disables internal buildslave log management mechanism. With this option buildslave does not override the default logfile name and its behaviour giving a possibility to control those with command-line options of twistd daemon.

--relocatable

This creates a "relocatable" buildbot.tac, which uses relative paths instead of absolute paths, so that the buildmaster directory can be moved about.

--config

The name of the configuration file to use. This configuration file need not reside in the buildmaster directory.

--log-size

This is the size in bytes when to rotate the Twisted log files. The default is 10MiB.

--log-count

This is the number of log rotations to keep around. You can either specify a number or None to keep all @file{twistd.log} files around. The default is 10.

--db

The database that the Buildmaster should use. Note that the same value must be added to the configuration file.

Upgrading an Existing Buildmaster

If you have just installed a new version of the Buildbot code, and you have buildmasters that were created using an older version, you'll need to upgrade these buildmasters before you can use them. The upgrade process adds and modifies files in the buildmaster's base directory to make it compatible with the new code.

buildbot upgrade-master basedir

This command will also scan your master.cfg file for incompatibilities (by loading it and printing any errors or deprecation warnings that occur). Each buildbot release tries to be compatible with configurations that worked cleanly (i.e. without deprecation warnings) on the previous release: any functions or classes that are to be removed will first be deprecated in a release, to give you a chance to start using the replacement.

The upgrade-master command is idempotent. It is safe to run it multiple times. After each upgrade of the buildbot code, you should use upgrade-master on all your buildmasters.

In general, Buildbot slaves and masters can be upgraded independently, although some new features will not be available, depending on the master and slave versions.

Beyond this general information, read all of the sections below that apply to versions through which you are upgrading.

Version-specific Notes
Upgrading a Buildmaster to Buildbot-0.7.6

The 0.7.6 release introduced the public_html/ directory, which contains index.html and other files served by the WebStatus and Waterfall status displays. The upgrade-master command will create these files if they do not already exist. It will not modify existing copies, but it will write a new copy in e.g. index.html.new if the new version differs from the version that already exists.

Upgrading a Buildmaster to Buildbot-0.8.0

Buildbot-0.8.0 introduces a database backend, which is SQLite by default. The upgrade-master command will automatically create and populate this database with the changes the buildmaster has seen. Note that, as of this release, build history is not contained in the database, and is thus not migrated.

The upgrade process renames the Changes pickle ($basedir/changes.pck) to changes.pck.old once the upgrade is complete. To reverse the upgrade, simply downgrade Buildbot and move this file back to its original name. You may also wish to delete the state database (state.sqlite).

Upgrading into a non-SQLite database

If you are not using sqlite, you will need to add an entry into your master.cfg to reflect the database version you are using. The upgrade process does not edit your master.cfg for you. So something like:

# for using mysql:
c['db_url'] = 'mysql://bbuser:<password>@localhost/buildbot'

Once the parameter has been added, invoke upgrade-master. This will extract the DB url from your configuration file.

buildbot upgrade-master

See Database Specification for more options to specify a database.

Change Encoding Issues

The upgrade process assumes that strings in your Changes pickle are encoded in UTF-8 (or plain ASCII). If this is not the case, and if there are non-UTF-8 characters in the pickle, the upgrade will fail with a suitable error message. If this occurs, you have two options. If the change history is not important to your purpose, you can simply delete changes.pck.

If you would like to keep the change history, then you will need to figure out which encoding is in use, and use contrib/fix_changes_pickle_encoding.py (Contrib Scripts) to rewrite the changes pickle into Unicode before upgrading the master. A typical invocation (with Mac-Roman encoding) might look like:

$ python $buildbot/contrib/fix_changes_pickle_encoding.py changes.pck macroman
decoding bytestrings in changes.pck using macroman
converted 11392 strings
backing up changes.pck to changes.pck.old

If your Changes pickle uses multiple encodings, you're on your own, but the script in contrib may provide a good starting point for the fix.

Upgrading a Buildmaster to Later Versions

Up to Buildbot version 0.8.9, no further steps beyond those described above are required.

Creating a buildslave

Typically, you will be adding a buildslave to an existing buildmaster, to provide additional architecture coverage. The buildbot administrator will give you several pieces of information necessary to connect to the buildmaster. You should also be somewhat familiar with the project being tested, so you can troubleshoot build problems locally.

The buildbot exists to make sure that the project's stated how to build it process actually works. To this end, the buildslave should run in an environment just like that of your regular developers. Typically the project build process is documented somewhere (README, INSTALL, etc), in a document that should mention all library dependencies and contain a basic set of build instructions. This document will be useful as you configure the host and account in which the buildslave runs.

Here's a good checklist for setting up a buildslave:

  1. Set up the account
It is recommended (although not mandatory) to set up a separate user account for the buildslave. This account is frequently named buildbot or buildslave. This serves to isolate your personal working environment from that of the slave's, and helps to minimize the security threat posed by letting possibly-unknown contributors run arbitrary code on your system. The account should have a minimum of fancy init scripts.
  1. Install the buildbot code
Follow the instructions given earlier (Installing the code). If you use a separate buildslave account, and you didn't install the buildbot code to a shared location, then you will need to install it with --home=~ for each account that needs it.
  1. Set up the host

Make sure the host can actually reach the buildmaster. Usually the buildmaster is running a status webserver on the same machine, so simply point your web browser at it and see if you can get there. Install whatever additional packages or libraries the project's INSTALL document advises. (or not: if your buildslave is supposed to make sure that building without optional libraries still works, then don't install those libraries).

Again, these libraries don't necessarily have to be installed to a site-wide shared location, but they must be available to your build process. Accomplishing this is usually very specific to the build process, so installing them to /usr or /usr/local is usually the best approach.

  1. Test the build process
Follow the instructions in the INSTALL document, in the buildslave's account. Perform a full CVS (or whatever) checkout, configure, make, run tests, etc. Confirm that the build works without manual fussing. If it doesn't work when you do it by hand, it will be unlikely to work when the buildbot attempts to do it in an automated fashion.
  1. Choose a base directory
This should be somewhere in the buildslave's account, typically named after the project which is being tested. The buildslave will not touch any file outside of this directory. Something like ~/Buildbot or ~/Buildslaves/fooproject is appropriate.
  1. Get the buildmaster host/port, botname, and password

When the buildbot admin configures the buildmaster to accept and use your buildslave, they will provide you with the following pieces of information:

  • your buildslave's name
  • the password assigned to your buildslave
  • the hostname and port number of the buildmaster, i.e. buildbot.example.org:8007
  1. Create the buildslave

Now run the 'buildslave' command as follows:

buildslave create-slave BASEDIR MASTERHOST:PORT SLAVENAME PASSWORD

This will create the base directory and a collection of files inside, including the buildbot.tac file that contains all the information you passed to the buildbot command.

  1. Fill in the hostinfo files

When it first connects, the buildslave will send a few files up to the buildmaster which describe the host that it is running on. These files are presented on the web status display so that developers have more information to reproduce any test failures that are witnessed by the buildbot. There are sample files in the info subdirectory of the buildbot's base directory. You should edit these to correctly describe you and your host.

BASEDIR/info/admin should contain your name and email address. This is the buildslave admin address, and will be visible from the build status page (so you may wish to munge it a bit if address-harvesting spambots are a concern).

BASEDIR/info/host should be filled with a brief description of the host: OS, version, memory size, CPU speed, versions of relevant libraries installed, and finally the version of the buildbot code which is running the buildslave.

The optional BASEDIR/info/access_uri can specify a URI which will connect a user to the machine. Many systems accept ssh://hostname URIs for this purpose.

If you run many buildslaves, you may want to create a single ~buildslave/info file and share it among all the buildslaves with symlinks.

Buildslave Options

There are a handful of options you might want to use when creating the buildslave with the buildslave create-slave <options> DIR <params> command. You can type buildslave create-slave --help for a summary. To use these, just include them on the buildslave create-slave command line, like this

buildslave create-slave --umask=022 ~/buildslave buildmaster.example.org:42012 {myslavename} {mypasswd}
--no-logrotate

This disables internal buildslave log management mechanism. With this option buildslave does not override the default logfile name and its behaviour giving a possibility to control those with command-line options of twistd daemon.

--usepty

This is a boolean flag that tells the buildslave whether to launch child processes in a PTY or with regular pipes (the default) when the master does not specify. This option is deprecated, as this particular parameter is better specified on the master.

--umask

This is a string (generally an octal representation of an integer) which will cause the buildslave process' umask value to be set shortly after initialization. The twistd daemonization utility forces the umask to 077 at startup (which means that all files created by the buildslave or its child processes will be unreadable by any user other than the buildslave account). If you want build products to be readable by other accounts, you can add --umask=022 to tell the buildslave to fix the umask after twistd clobbers it. If you want build products to be writable by other accounts too, use --umask=000, but this is likely to be a security problem.

--keepalive

This is a number that indicates how frequently keepalive messages should be sent from the buildslave to the buildmaster, expressed in seconds. The default (600) causes a message to be sent to the buildmaster at least once every 10 minutes. To set this to a lower value, use e.g. --keepalive=120.

If the buildslave is behind a NAT box or stateful firewall, these messages may help to keep the connection alive: some NAT boxes tend to forget about a connection if it has not been used in a while. When this happens, the buildmaster will think that the buildslave has disappeared, and builds will time out. Meanwhile the buildslave will not realize than anything is wrong.

--maxdelay

This is a number that indicates the maximum amount of time the buildslave will wait between connection attempts, expressed in seconds. The default (300) causes the buildslave to wait at most 5 minutes before trying to connect to the buildmaster again.

--log-size

This is the size in bytes when to rotate the Twisted log files.

--log-count

This is the number of log rotations to keep around. You can either specify a number or None to keep all twistd.log files around. The default is 10.

--allow-shutdown

Can also be passed directly to the BuildSlave constructor in buildbot.tac. If set, it allows the buildslave to initiate a graceful shutdown, meaning that it will ask the master to shut down the slave when the current build, if any, is complete.

Setting allow_shutdown to file will cause the buildslave to watch shutdown.stamp in basedir for updates to its mtime. When the mtime changes, the slave will request a graceful shutdown from the master. The file does not need to exist prior to starting the slave.

Setting allow_shutdown to signal will set up a SIGHUP handler to start a graceful shutdown. When the signal is received, the slave will request a graceful shutdown from the master.

The default value is None, in which case this feature will be disabled.

Both master and slave must be at least version 0.8.3 for this feature to work.

Other Buildslave Configuration
unicode_encoding

This represents the encoding that buildbot should use when converting unicode commandline arguments into byte strings in order to pass to the operating system when spawning new processes.

The default value is what Python's sys.getfilesystemencoding returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings.

If you need a different encoding, this can be changed in your build slave's buildbot.tac file by adding a unicode_encoding argument to the BuildSlave constructor.

s = BuildSlave(buildmaster_host, port, slavename, passwd, basedir,
               keepalive, usepty, umask=umask, maxdelay=maxdelay,
               unicode_encoding='utf-8', allow_shutdown='signal')

Upgrading an Existing Buildslave

If you have just installed a new version of Buildbot-slave, you may need to take some steps to upgrade it. If you are upgrading to version 0.8.2 or later, you can run

buildslave upgrade-slave /path/to/buildslave/dir
Version-specific Notes
Upgrading a Buildslave to Buildbot-slave-0.8.1

Before Buildbot version 0.8.1, the Buildbot master and slave were part of the same distribution. As of version 0.8.1, the buildslave is a separate distribution.

As of this release, you will need to install buildbot-slave to run a slave.

Any automatic startup scripts that had run buildbot start for previous versions should be changed to run buildslave start instead.

If you are running a version later than 0.8.1, then you can skip the remainder of this section: the `upgrade-slave command will take care of this. If you are upgrading directly to 0.8.1, read on.

The existing buildbot.tac for any buildslaves running older versions will need to be edited or replaced. If the loss of cached buildslave state (e.g., for Source steps in copy mode) is not problematic, the easiest solution is to simply delete the slave directory and re-run buildslave create-slave.

If deleting the slave directory is problematic, the change to buildbot.tac is simple. On line 3, replace

from buildbot.slave.bot import BuildSlave

with

from buildslave.bot import BuildSlave

After this change, the buildslave should start as usual.

Launching the daemons

Both the buildmaster and the buildslave run as daemon programs. To launch them, pass the working directory to the buildbot and buildslave commands, as appropriate:

# start a master
buildbot start [ BASEDIR ]
# start a slave
buildslave start [ SLAVE_BASEDIR ]

The BASEDIR is option and can be omitted if the current directory contains the buildbot configuration (the buildbot.tac file).

buildbot start

This command will start the daemon and then return, so normally it will not produce any output. To verify that the programs are indeed running, look for a pair of files named twistd.log and twistd.pid that should be created in the working directory. twistd.pid contains the process ID of the newly-spawned daemon.

When the buildslave connects to the buildmaster, new directories will start appearing in its base directory. The buildmaster tells the slave to create a directory for each Builder which will be using that slave. All build operations are performed within these directories: CVS checkouts, compiles, and tests.

Once you get everything running, you will want to arrange for the buildbot daemons to be started at boot time. One way is to use cron, by putting them in a @reboot crontab entry [1]

@reboot buildbot start [ BASEDIR ]

When you run crontab to set this up, remember to do it as the buildmaster or buildslave account! If you add this to your crontab when running as your regular account (or worse yet, root), then the daemon will run as the wrong user, quite possibly as one with more authority than you intended to provide.

It is important to remember that the environment provided to cron jobs and init scripts can be quite different that your normal runtime. There may be fewer environment variables specified, and the PATH may be shorter than usual. It is a good idea to test out this method of launching the buildslave by using a cron job with a time in the near future, with the same command, and then check twistd.log to make sure the slave actually started correctly. Common problems here are for /usr/local or ~/bin to not be on your PATH, or for PYTHONPATH to not be set correctly. Sometimes HOME is messed up too.

Some distributions may include conveniences to make starting buildbot at boot time easy. For instance, with the default buildbot package in Debian-based distributions, you may only need to modify /etc/default/buildbot (see also /etc/init.d/buildbot, which reads the configuration in /etc/default/buildbot).

Buildbot also comes with its own init scripts that provide support for controlling multi-slave and multi-master setups (mostly because they are based on the init script from the Debian package). With a little modification these scripts can be used both on Debian and RHEL-based distributions and may thus prove helpful to package maintainers who are working on buildbot (or those that haven't yet split buildbot into master and slave packages).

# install as /etc/default/buildslave
#         or /etc/sysconfig/buildslave
master/contrib/init-scripts/buildslave.default

# install as /etc/default/buildmaster
#         or /etc/sysconfig/buildmaster
master/contrib/init-scripts/buildmaster.default

# install as /etc/init.d/buildslave
slave/contrib/init-scripts/buildslave.init.sh

# install as /etc/init.d/buildmaster
slave/contrib/init-scripts/buildmaster.init.sh

# ... and tell sysvinit about them
chkconfig buildmaster reset
# ... or
update-rc.d buildmaster defaults

Logfiles

While a buildbot daemon runs, it emits text to a logfile, named twistd.log. A command like tail -f twistd.log is useful to watch the command output as it runs.

The buildmaster will announce any errors with its configuration file in the logfile, so it is a good idea to look at the log at startup time to check for any problems. Most buildmaster activities will cause lines to be added to the log.

Shutdown

To stop a buildmaster or buildslave manually, use:

buildbot stop [ BASEDIR ]
# or
buildslave stop [ SLAVE_BASEDIR ]

This simply looks for the twistd.pid file and kills whatever process is identified within.

At system shutdown, all processes are sent a SIGKILL. The buildmaster and buildslave will respond to this by shutting down normally.

The buildmaster will respond to a SIGHUP by re-reading its config file. Of course, this only works on Unix-like systems with signal support, and won't work on Windows. The following shortcut is available:

buildbot reconfig [ BASEDIR ]

When you update the Buildbot code to a new release, you will need to restart the buildmaster and/or buildslave before it can take advantage of the new code. You can do a buildbot stop BASEDIR and buildbot start BASEDIR in quick succession, or you can use the restart shortcut, which does both steps for you:

buildbot restart [ BASEDIR ]

Buildslaves can similarly be restarted with:

buildslave restart [ BASEDIR ]

There are certain configuration changes that are not handled cleanly by buildbot reconfig. If this occurs, buildbot restart is a more robust tool to fully switch over to the new configuration.

buildbot restart may also be used to start a stopped Buildbot instance. This behaviour is useful when writing scripts that stop, start and restart Buildbot.

A buildslave may also be gracefully shutdown from the WebStatus status plugin. This is useful to shutdown a buildslave without interrupting any current builds. The buildmaster will wait until the buildslave is finished all its current builds, and will then tell the buildslave to shutdown.

Maintenance

The buildmaster can be configured to send out email notifications when a slave has been offline for a while. Be sure to configure the buildmaster with a contact email address for each slave so these notifications are sent to someone who can bring it back online.

If you find you can no longer provide a buildslave to the project, please let the project admins know, so they can put out a call for a replacement.

The Buildbot records status and logs output continually, each time a build is performed. The status tends to be small, but the build logs can become quite large. Each build and log are recorded in a separate file, arranged hierarchically under the buildmaster's base directory. To prevent these files from growing without bound, you should periodically delete old build logs. A simple cron job to delete anything older than, say, two weeks should do the job. The only trick is to leave the buildbot.tac and other support files alone, for which find's -mindepth argument helps skip everything in the top directory. You can use something like the following:

@weekly cd BASEDIR && find . -mindepth 2 i-path './public_html/*' \
    -prune -o -type f -mtime +14 -exec rm {} \;
@weekly cd BASEDIR && find twistd.log* -mtime +14 -exec rm {} \;

Alternatively, you can configure a maximum number of old logs to be kept using the --log-count command line option when running buildslave create-slave or buildbot create-master.

Troubleshooting

Here are a few hints on diagnosing common problems.

Starting the buildslave

Cron jobs are typically run with a minimal shell (/bin/sh, not /bin/bash), and tilde expansion is not always performed in such commands. You may want to use explicit paths, because the PATH is usually quite short and doesn't include anything set by your shell's startup scripts (.profile, .bashrc, etc). If you've installed buildbot (or other Python libraries) to an unusual location, you may need to add a PYTHONPATH specification (note that Python will do tilde-expansion on PYTHONPATH elements by itself). Sometimes it is safer to fully-specify everything:

@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot \
    start /usr/home/buildbot/basedir

Take the time to get the @reboot job set up. Otherwise, things will work fine for a while, but the first power outage or system reboot you have will stop the buildslave with nothing but the cries of sorrowful developers to remind you that it has gone away.

Connecting to the buildmaster

If the buildslave cannot connect to the buildmaster, the reason should be described in the twistd.log logfile. Some common problems are an incorrect master hostname or port number, or a mistyped bot name or password. If the buildslave loses the connection to the master, it is supposed to attempt to reconnect with an exponentially-increasing backoff. Each attempt (and the time of the next attempt) will be logged. If you get impatient, just manually stop and re-start the buildslave.

When the buildmaster is restarted, all slaves will be disconnected, and will attempt to reconnect as usual. The reconnect time will depend upon how long the buildmaster is offline (i.e. how far up the exponential backoff curve the slaves have travelled). Again, buildslave restart BASEDIR will speed up the process.

[1]This @reboot syntax is understood by Vixie cron, which is the flavor usually provided with Linux systems. Other unices may have a cron that doesn't understand @reboot:
Contrib Scripts

While some features of Buildbot are included in the distribution, others are only available in contrib/ in the source directory. The latest versions of such scripts are available at http://github.com/buildbot/buildbot/tree/master/master/contrib.

Concepts

This chapter defines some of the basic concepts that the Buildbot uses. You'll need to understand how the Buildbot sees the world to configure it properly.

Source Stamps

Source code comes from repositories, provided by version control systems. Repositories are generally identified by URLs, e.g., git://github.com/buildbot/buildbot.git.

In these days of distributed version control systems, the same codebase may appear in multiple repositories. For example, https://github.com/mozilla/mozilla-central and http://hg.mozilla.org/mozilla-release both contain the Firefox codebase, although not exactly the same code.

Many projects are built from multiple codebases. For example, a company may build several applications based on the same core library. The "app" codebase and the "core" codebase are in separate repositories, but are compiled together and constitute a single project. Changes to either codebase should cause a rebuild of the application.

Most version control systems define some sort of revision that can be used (sometimes in combination with a branch) to uniquely specify a particular version of the source code.

To build a project, Buildbot needs to know exactly which version of each codebase it should build. It uses a source stamp to do so for each codebase; the collection of sourcestamps required for a project is called a source stamp set.

Version Control Systems

Buildbot supports a significant number of version control systems, so it treats them abstractly.

For purposes of deciding when to perform builds, Buildbot's change sources monitor repositories, and represent any updates to those repositories as changes. These change sources fall broadly into two categories: pollers which periodically check the repository for updates; and hooks, where the repository is configured to notify Buildbot whenever an update occurs.

This concept does not map perfectly to every version control system. For example, for CVS Buildbot must guess that version updates made to multiple files within a short time represent a single change; for DVCS's like Git, Buildbot records a change when a commit is pushed to the monitored repository, not when it is initially committed. We assume that the Changes arrive at the master in the same order in which they are committed to the repository.

When it comes time to actually perform a build, a scheduler prepares a source stamp set, as described above, based on its configuration. When the build begins, one or more source steps use the information in the source stamp set to actually check out the source code, using the normal VCS commands.

Tree Stability

Changes tend to arrive at a buildmaster in bursts. In many cases, these bursts of changes are meant to be taken together. For example, a developer may have pushed multiple commits to a DVCS that comprise the same new feature or bugfix. To avoid trying to build every change, Buildbot supports the notion of tree stability, by waiting for a burst of changes to finish before starting to schedule builds. This is implemented as a timer, with builds not scheduled until no changes have occurred for the duration of the timer.

How Different VC Systems Specify Sources

For CVS, the static specifications are repository and module. In addition to those, each build uses a timestamp (or omits the timestamp to mean the latest) and branch tag (which defaults to HEAD). These parameters collectively specify a set of sources from which a build may be performed.

Subversion, combines the repository, module, and branch into a single Subversion URL parameter. Within that scope, source checkouts can be specified by a numeric revision number (a repository-wide monotonically-increasing marker, such that each transaction that changes the repository is indexed by a different revision number), or a revision timestamp. When branches are used, the repository and module form a static baseURL, while each build has a revision number and a branch (which defaults to a statically-specified defaultBranch). The baseURL and branch are simply concatenated together to derive the svnurl to use for the checkout.

Perforce is similar. The server is specified through a P4PORT parameter. Module and branch are specified in a single depot path, and revisions are depot-wide. When branches are used, the p4base and defaultBranch are concatenated together to produce the depot path.

Bzr (which is a descendant of Arch/Bazaar, and is frequently referred to as "Bazaar") has the same sort of repository-vs-workspace model as Arch, but the repository data can either be stored inside the working directory or kept elsewhere (either on the same machine or on an entirely different machine). For the purposes of Buildbot (which never commits changes), the repository is specified with a URL and a revision number.

The most common way to obtain read-only access to a bzr tree is via HTTP, simply by making the repository visible through a web server like Apache. Bzr can also use FTP and SFTP servers, if the buildslave process has sufficient privileges to access them. Higher performance can be obtained by running a special Bazaar-specific server. None of these matter to the buildbot: the repository URL just has to match the kind of server being used. The repoURL argument provides the location of the repository.

Branches are expressed as subdirectories of the main central repository, which means that if branches are being used, the BZR step is given a baseURL and defaultBranch instead of getting the repoURL argument.

Darcs doesn't really have the notion of a single master repository. Nor does it really have branches. In Darcs, each working directory is also a repository, and there are operations to push and pull patches from one of these repositories to another. For the Buildbot's purposes, all you need to do is specify the URL of a repository that you want to build from. The build slave will then pull the latest patches from that repository and build them. Multiple branches are implemented by using multiple repositories (possibly living on the same server).

Builders which use Darcs therefore have a static repourl which specifies the location of the repository. If branches are being used, the source Step is instead configured with a baseURL and a defaultBranch, and the two strings are simply concatenated together to obtain the repository's URL. Each build then has a specific branch which replaces defaultBranch, or just uses the default one. Instead of a revision number, each build can have a context, which is a string that records all the patches that are present in a given tree (this is the output of darcs changes --context, and is considerably less concise than, e.g. Subversion's revision number, but the patch-reordering flexibility of Darcs makes it impossible to provide a shorter useful specification).

Mercurial is like Darcs, in that each branch is stored in a separate repository. The repourl, baseURL, and defaultBranch arguments are all handled the same way as with Darcs. The revision, however, is the hash identifier returned by hg identify.

Git also follows a decentralized model, and each repository can have several branches and tags. The source Step is configured with a static repourl which specifies the location of the repository. In addition, an optional branch parameter can be specified to check out code from a specific branch instead of the default master branch. The revision is specified as a SHA1 hash as returned by e.g. git rev-parse. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.

Monotone is another that follows a decentralized model where each repository can have several branches and tags. The source Step is configured with static repourl and branch parameters, which specifies the location of the repository and the branch to use. The revision is specified as a SHA1 hash as returned by e.g. mtn automate select w:. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.

Changes

Who

Each Change has a who attribute, which specifies which developer is responsible for the change. This is a string which comes from a namespace controlled by the VC repository. Frequently this means it is a username on the host which runs the repository, but not all VC systems require this. Each StatusNotifier will map the who attribute into something appropriate for their particular means of communication: an email address, an IRC handle, etc.

This who attribute is also parsed and stored into Buildbot's database (see User Objects). Currently, only who attributes in Changes from git repositories are translated into user objects, but in the future all incoming Changes will have their who parsed and stored.

Files

It also has a list of files, which are just the tree-relative filenames of any files that were added, deleted, or modified for this Change. These filenames are used by the fileIsImportant function (in the Scheduler) to decide whether it is worth triggering a new build or not, e.g. the function could use the following function to only run a build if a C file were checked in:

def has_C_files(change):
    for name in change.files:
        if name.endswith(".c"):
            return True
    return False

Certain BuildSteps can also use the list of changed files to run a more targeted series of tests, e.g. the python_twisted.Trial step can run just the unit tests that provide coverage for the modified .py files instead of running the full test suite.

Comments

The Change also has a comments attribute, which is a string containing any checkin comments.

Project

The project attribute of a change or source stamp describes the project to which it corresponds, as a short human-readable string. This is useful in cases where multiple independent projects are built on the same buildmaster. In such cases, it can be used to control which builds are scheduled for a given commit, and to limit status displays to only one project.

Repository

This attribute specifies the repository in which this change occurred. In the case of DVCS's, this information may be required to check out the committed source code. However, using the repository from a change has security risks: if Buildbot is configured to blindly trust this information, then it may easily be tricked into building arbitrary source code, potentially compromising the buildslaves and the integrity of subsequent builds.

Codebase

This attribute specifies the codebase to which this change was made. As described above, multiple repositories may contain the same codebase. A change's codebase is usually determined by the codebaseGenerator configuration. By default the codebase is ''; this value is used automatically for single-codebase configurations.

Revision

Each Change can have a revision attribute, which describes how to get a tree with a specific state: a tree which includes this Change (and all that came before it) but none that come after it. If this information is unavailable, the revision attribute will be None. These revisions are provided by the ChangeSource.

Revisions are always strings.

CVS
revision is the seconds since the epoch as an integer.
SVN
revision is the revision number
Darcs
revision is a large string, the output of darcs changes --context
Mercurial
revision is a short string (a hash ID), the output of hg identify
P4
revision is the transaction number
Git
revision is a short string (a SHA1 hash), the output of e.g. git rev-parse
Branches

The Change might also have a branch attribute. This indicates that all of the Change's files are in the same named branch. The Schedulers get to decide whether the branch should be built or not.

For VC systems like CVS, Git and Monotone the branch name is unrelated to the filename. (that is, the branch name and the filename inhabit unrelated namespaces). For SVN, branches are expressed as subdirectories of the repository, so the file's svnurl is a combination of some base URL, the branch name, and the filename within the branch. (In a sense, the branch name and the filename inhabit the same namespace). Darcs branches are subdirectories of a base URL just like SVN. Mercurial branches are the same as Darcs.

CVS
branch='warner-newfeature', files=['src/foo.c']
SVN
branch='branches/warner-newfeature', files=['src/foo.c']
Darcs
branch='warner-newfeature', files=['src/foo.c']
Mercurial
branch='warner-newfeature', files=['src/foo.c']
Git
branch='warner-newfeature', files=['src/foo.c']
Monotone
branch='warner-newfeature', files=['src/foo.c']
Change Properties

A Change may have one or more properties attached to it, usually specified through the Force Build form or sendchange. Properties are discussed in detail in the Build Properties section.

Scheduling Builds

Each Buildmaster has a set of Scheduler objects, each of which gets a copy of every incoming Change. The Schedulers are responsible for deciding when Builds should be run. Some Buildbot installations might have a single Scheduler, while others may have several, each for a different purpose.

For example, a quick scheduler might exist to give immediate feedback to developers, hoping to catch obvious problems in the code that can be detected quickly. These typically do not run the full test suite, nor do they run on a wide variety of platforms. They also usually do a VC update rather than performing a brand-new checkout each time.

A separate full scheduler might run more comprehensive tests, to catch more subtle problems. configured to run after the quick scheduler, to give developers time to commit fixes to bugs caught by the quick scheduler before running the comprehensive tests. This scheduler would also feed multiple Builders.

Many schedulers can be configured to wait a while after seeing a source-code change - this is the tree stable timer. The timer allows multiple commits to be "batched" together. This is particularly useful in distributed version control systems, where a developer may push a long sequence of changes all at once. To save resources, it's often desirable only to test the most recent change.

Schedulers can also filter out the changes they are interested in, based on a number of criteria. For example, a scheduler that only builds documentation might skip any changes that do not affect the documentation. Schedulers can also filter on the branch to which a commit was made.

There is some support for configuring dependencies between builds - for example, you may want to build packages only for revisions which pass all of the unit tests. This support is under active development in Buildbot, and is referred to as "build coordination".

Periodic builds (those which are run every N seconds rather than after new Changes arrive) are triggered by a special Periodic Scheduler subclass.

Each Scheduler creates and submits BuildSet objects to the BuildMaster, which is then responsible for making sure the individual BuildRequests are delivered to the target Builders.

Scheduler instances are activated by placing them in the c['schedulers'] list in the buildmaster config file. Each Scheduler has a unique name.

BuildSets

A BuildSet is the name given to a set of Builds that all compile/test the same version of the tree on multiple Builders. In general, all these component Builds will perform the same sequence of Steps, using the same source code, but on different platforms or against a different set of libraries.

The BuildSet is tracked as a single unit, which fails if any of the component Builds have failed, and therefore can succeed only if all of the component Builds have succeeded. There are two kinds of status notification messages that can be emitted for a BuildSet: the firstFailure type (which fires as soon as we know the BuildSet will fail), and the Finished type (which fires once the BuildSet has completely finished, regardless of whether the overall set passed or failed).

A BuildSet is created with set of one or more source stamp tuples of (branch, revision, changes, patch), some of which may be None, and a list of Builders on which it is to be run. They are then given to the BuildMaster, which is responsible for creating a separate BuildRequest for each Builder.

There are a couple of different likely values for the SourceStamp:

(revision=None, changes=CHANGES, patch=None)
This is a SourceStamp used when a series of Changes have triggered a build. The VC step will attempt to check out a tree that contains CHANGES (and any changes that occurred before CHANGES, but not any that occurred after them.)
(revision=None, changes=None, patch=None)
This builds the most recent code on the default branch. This is the sort of SourceStamp that would be used on a Build that was triggered by a user request, or a Periodic scheduler. It is also possible to configure the VC Source Step to always check out the latest sources rather than paying attention to the Changes in the SourceStamp, which will result in same behavior as this.
(branch=BRANCH, revision=None, changes=None, patch=None)
This builds the most recent code on the given BRANCH. Again, this is generally triggered by a user request or Periodic build.
(revision=REV, changes=None, patch=(LEVEL, DIFF, SUBDIR_ROOT))
This checks out the tree at the given revision REV, then applies a patch (using patch -pLEVEL <DIFF) from inside the relative directory SUBDIR_ROOT. Item SUBDIR_ROOT is optional and defaults to the builder working directory. The try command creates this kind of SourceStamp. If patch is None, the patching step is bypassed.

The buildmaster is responsible for turning the BuildSet into a set of BuildRequest objects and queueing them on the appropriate Builders.

BuildRequests

A BuildRequest is a request to build a specific set of source code (specified by one ore more source stamps) on a single Builder. Each Builder runs the BuildRequest as soon as it can (i.e. when an associated buildslave becomes free). BuildRequests are prioritized from oldest to newest, so when a buildslave becomes free, the Builder with the oldest BuildRequest is run.

The BuildRequest contains one SourceStamp specification per codebase. The actual process of running the build (the series of Steps that will be executed) is implemented by the Build object. In the future this might be changed, to have the Build define what gets built, and a separate BuildProcess (provided by the Builder) to define how it gets built.

The BuildRequest may be mergeable with other compatible BuildRequests. Builds that are triggered by incoming Changes will generally be mergeable. Builds that are triggered by user requests are generally not, unless they are multiple requests to build the latest sources of the same branch. A merge of buildrequests is performed per codebase, thus on changes having the same codebase.

Builders

The Buildmaster runs a collection of Builders, each of which handles a single type of build (e.g. full versus quick), on one or more build slaves. Builders serve as a kind of queue for a particular type of build. Each Builder gets a separate column in the waterfall display. In general, each Builder runs independently (although various kinds of interlocks can cause one Builder to have an effect on another).

Each builder is a long-lived object which controls a sequence of Builds. Each Builder is created when the config file is first parsed, and lives forever (or rather until it is removed from the config file). It mediates the connections to the buildslaves that do all the work, and is responsible for creating the Build objects - Builds.

Each builder gets a unique name, and the path name of a directory where it gets to do all its work (there is a buildmaster-side directory for keeping status information, as well as a buildslave-side directory where the actual checkout/compile/test commands are executed).

Build Factories

A builder also has a BuildFactory, which is responsible for creating new Build instances: because the Build instance is what actually performs each build, choosing the BuildFactory is the way to specify what happens each time a build is done (Builds).

Build Slaves

Each builder is associated with one of more BuildSlaves. A builder which is used to perform Mac OS X builds (as opposed to Linux or Solaris builds) should naturally be associated with a Mac buildslave.

If multiple buildslaves are available for any given builder, you will have some measure of redundancy: in case one slave goes offline, the others can still keep the Builder working. In addition, multiple buildslaves will allow multiple simultaneous builds for the same Builder, which might be useful if you have a lot of forced or try builds taking place.

If you use this feature, it is important to make sure that the buildslaves are all, in fact, capable of running the given build. The slave hosts should be configured similarly, otherwise you will spend a lot of time trying (unsuccessfully) to reproduce a failure that only occurs on some of the buildslaves and not the others. Different platforms, operating systems, versions of major programs or libraries, all these things mean you should use separate Builders.

Builds

A build is a single compile or test run of a particular version of the source code, and is comprised of a series of steps. It is ultimately up to you what constitutes a build, but for compiled software it is generally the checkout, configure, make, and make check sequence. For interpreted projects like Python modules, a build is generally a checkout followed by an invocation of the bundled test suite.

A BuildFactory describes the steps a build will perform. The builder which starts a build uses its configured build factory to determine the build's steps.

Users

Buildbot has a somewhat limited awareness of users. It assumes the world consists of a set of developers, each of whom can be described by a couple of simple attributes. These developers make changes to the source code, causing builds which may succeed or fail.

Users also may have different levels of authorization when issuing Buildbot commands, such as forcing a build from the web interface or from an IRC channel (see WebStatus and IRC).

Each developer is primarily known through the source control system. Each Change object that arrives is tagged with a who field that typically gives the account name (on the repository machine) of the user responsible for that change. This string is displayed on the HTML status pages and in each Build's blamelist.

To do more with the User than just refer to them, this username needs to be mapped into an address of some sort. The responsibility for this mapping is left up to the status module which needs the address. In the future, the responsibility for managing users will be transferred to User Objects.

The who fields in git Changes are used to create User Objects, which allows for more control and flexibility in how Buildbot manages users.

User Objects

User Objects allow Buildbot to better manage users throughout its various interactions with users (see Change Sources and Status Targets). The User Objects are stored in the Buildbot database and correlate the various attributes that a user might have: irc, Git, etc.

Changes

Incoming Changes all have a who attribute attached to them that specifies which developer is responsible for that Change. When a Change is first rendered, the who attribute is parsed and added to the database if it doesn't exist or checked against an existing user. The who attribute is formatted in different ways depending on the version control system that the Change came from.

git
who attributes take the form Full Name <Email>.
svn
who attributes are of the form Username.
hg
who attributes are free-form strings, but usually adhere to similar conventions as git attributes (Full Name <Email>).
cvs
who attributes are of the form Username.
darcs
who attributes contain an Email and may also include a Full Name like git attributes.
bzr
who attributes are free-form strings like hg, and can include a Username, Email, and/or Full Name.
Tools

For managing users manually, use the buildbot user command, which allows you to add, remove, update, and show various attributes of users in the Buildbot database (see Command-line Tool).

To show all of the users in the database in a more pretty manner, use the users page in the WebStatus.

Uses

Correlating the various bits and pieces that Buildbot views as users also means that one attribute of a user can be translated into another. This provides a more complete view of users throughout Buildbot.

One such use is being able to find email addresses based on a set of Builds to notify users through the MailNotifier. This process is explained more clearly in Email Addresses.

Another way to utilize User Objects is through UsersAuth for web authentication (see WebStatus). To use UsersAuth, you need to set a bb_username and bb_password via the buildbot user command line tool to check against. The password will be encrypted before storing in the database along with other user attributes.

Doing Things With Users

Each change has a single user who is responsible for it. Most builds have a set of changes: the build generally represents the first time these changes have been built and tested by the Buildbot. The build has a blamelist that is the union of the users responsible for all the build's changes. If the build was created by a Try Schedulers this list will include the submitter of the try job, if known.

The build provides a list of users who are interested in the build -- the interested users. Usually this is equal to the blamelist, but may also be expanded, e.g., to include the current build sherrif or a module's maintainer.

If desired, the buildbot can notify the interested users until the problem is resolved.

Email Addresses

The MailNotifier is a status target which can send email about the results of each build. It accepts a static list of email addresses to which each message should be delivered, but it can also be configured to send mail to the Build's Interested Users. To do this, it needs a way to convert User names into email addresses.

For many VC systems, the User Name is actually an account name on the system which hosts the repository. As such, turning the name into an email address is a simple matter of appending @repositoryhost.com. Some projects use other kinds of mappings (for example the preferred email address may be at project.org despite the repository host being named cvs.project.org), and some VC systems have full separation between the concept of a user and that of an account on the repository host (like Perforce). Some systems (like Git) put a full contact email address in every change.

To convert these names to addresses, the MailNotifier uses an EmailLookup object. This provides a getAddress method which accepts a name and (eventually) returns an address. The default MailNotifier module provides an EmailLookup which simply appends a static string, configurable when the notifier is created. To create more complex behaviors (perhaps using an LDAP lookup, or using finger on a central host to determine a preferred address for the developer), provide a different object as the lookup argument.

If an EmailLookup object isn't given to the MailNotifier, the MailNotifier will try to find emails through User Objects. This will work the same as if an EmailLookup object was used if every user in the Build's Interested Users list has an email in the database for them. If a user whose change led to a Build doesn't have an email attribute, that user will not receive an email. If extraRecipients is given, those users are still sent mail when the EmailLookup object is not specified.

In the future, when the Problem mechanism has been set up, the Buildbot will need to send mail to arbitrary Users. It will do this by locating a MailNotifier-like object among all the buildmaster's status targets, and asking it to send messages to various Users. This means the User-to-address mapping only has to be set up once, in your MailNotifier, and every email message the buildbot emits will take advantage of it.

IRC Nicknames

Like MailNotifier, the buildbot.status.words.IRC class provides a status target which can announce the results of each build. It also provides an interactive interface by responding to online queries posted in the channel or sent as private messages.

In the future, the buildbot can be configured map User names to IRC nicknames, to watch for the recent presence of these nicknames, and to deliver build status messages to the interested parties. Like MailNotifier does for email addresses, the IRC object will have an IRCLookup which is responsible for nicknames. The mapping can be set up statically, or it can be updated by online users themselves (by claiming a username with some kind of buildbot: i am user warner commands).

Once the mapping is established, the rest of the buildbot can ask the IRC object to send messages to various users. It can report on the likelihood that the user saw the given message (based upon how long the user has been inactive on the channel), which might prompt the Problem Hassler logic to send them an email message instead.

These operations and authentication of commands issued by particular nicknames will be implemented in User Objects.

Live Status Clients

The Buildbot also offers a desktop status client interface which can display real-time build status in a GUI panel on the developer's desktop.

Build Properties

Each build has a set of Build Properties, which can be used by its build steps to modify their actions. These properties, in the form of key-value pairs, provide a general framework for dynamically altering the behavior of a build based on its circumstances.

Properties form a simple kind of variable in a build. Some properties are set when the build starts, and properties can be changed as a build progresses -- properties set or changed in one step may be accessed in subsequent steps. Property values can be numbers, strings, lists, or dictionaries - basically, anything that can be represented in JSON.

Properties are very flexible, and can be used to implement all manner of functionality. Here are some examples:

Most Source steps record the revision that they checked out in the got_revision property. A later step could use this property to specify the name of a fully-built tarball, dropped in an easily-accessible directory for later testing.

Note

In builds with more than one codebase, the got_revision property is a dictionary, keyed by codebase.

Some projects want to perform nightly builds as well as building in response to committed changes. Such a project would run two schedulers, both pointing to the same set of builders, but could provide an is_nightly property so that steps can distinguish the nightly builds, perhaps to run more resource-intensive tests.

Some projects have different build processes on different systems. Rather than create a build factory for each slave, the steps can use buildslave properties to identify the unique aspects of each slave and adapt the build process dynamically.

Multiple-Codebase Builds

What if an end-product is composed of code from several codebases? Changes may arrive from different repositories within the tree-stable-timer period. Buildbot will not only use the source-trees that contain changes but also needs the remaining source-trees to build the complete product.

For this reason a Scheduler can be configured to base a build on a set of several source-trees that can (partly) be overridden by the information from incoming Changes.

As described above, the source for each codebase is identified by a source stamp, containing its repository, branch and revision. A full build set will specify a source stamp set describing the source to use for each codebase.

Configuring all of this takes a coordinated approach. A complete multiple repository configuration consists of:

  • a codebase generator

    Every relevant change arriving from a VC must contain a codebase. This is done by a codebaseGenerator that is defined in the configuration. Most generators examine the repository of a change to determine its codebase, using project-specific rules.

  • some schedulers

    Each scheduler has to be configured with a set of all required codebases to build a product. These codebases indicate the set of required source-trees. In order for the scheduler to be able to produce a complete set for each build, the configuration can give a default repository, branch, and revision for each codebase. When a scheduler must generate a source stamp for a codebase that has received no changes, it applies these default values.

  • multiple source steps - one for each codebase

    A Builders's build factory must include a source step for each codebase. Each of the source steps has a codebase attribute which is used to select an appropriate source stamp from the source stamp set for a build. This information comes from the arrived changes or from the scheduler's configured default values.

    Note

    Each source step has to have its own workdir set in order for the checkout to be done for each codebase in its own directory.

    Note

    Ensure you specify the codebase within your source step's Interpolate() calls (ex. http://.../svn/%(src:codebase:branch)s). See Interpolate for details.

Warning

Defining a codebaseGenerator that returns non-empty (not '') codebases will change the behavior of all the schedulers.

Configuration

The following sections describe the configuration of the various Buildbot components. The information available here is sufficient to create basic build and test configurations, and does not assume great familiarity with Python.

In more advanced Buildbot configurations, Buildbot acts as a framework for a continuous-integration application. The next section, Customization, describes this approach, with frequent references into the development documentation.

Configuring Buildbot

The buildbot's behavior is defined by the config file, which normally lives in the master.cfg file in the buildmaster's base directory (but this can be changed with an option to the buildbot create-master command). This file completely specifies which Builders are to be run, which slaves they should use, how Changes should be tracked, and where the status information is to be sent. The buildmaster's buildbot.tac file names the base directory; everything else comes from the config file.

A sample config file was installed for you when you created the buildmaster, but you will need to edit it before your buildbot will do anything useful.

This chapter gives an overview of the format of this file and the various sections in it. You will need to read the later chapters to understand how to fill in each section properly.

Config File Format

The config file is, fundamentally, just a piece of Python code which defines a dictionary named BuildmasterConfig, with a number of keys that are treated specially. You don't need to know Python to do basic configuration, though, you can just copy the syntax of the sample file. If you are comfortable writing Python code, however, you can use all the power of a full programming language to achieve more complicated configurations.

The BuildmasterConfig name is the only one which matters: all other names defined during the execution of the file are discarded. When parsing the config file, the Buildmaster generally compares the old configuration with the new one and performs the minimum set of actions necessary to bring the buildbot up to date: Builders which are not changed are left untouched, and Builders which are modified get to keep their old event history.

The beginning of the master.cfg file typically starts with something like:

BuildmasterConfig = c = {}

Therefore a config key like change_source will usually appear in master.cfg as c['change_source'].

See Buildmaster Configuration Index for a full list of BuildMasterConfig keys.

Basic Python Syntax

The master configuration file is interpreted as Python, allowing the full flexibility of the language. For the configurations described in this section, a detailed knowledge of Python is not required, but the basic syntax is easily described.

Python comments start with a hash character #, tuples are defined with (parenthesis, pairs), and lists (arrays) are defined with [square, brackets]. Tuples and lists are mostly interchangeable. Dictionaries (data structures which map keys to values) are defined with curly braces: {'key1': value1, 'key2': value2}. Function calls (and object instantiation) can use named parameters, like w = html.Waterfall(http_port=8010).

The config file starts with a series of import statements, which make various kinds of Steps and Status targets available for later use. The main BuildmasterConfig dictionary is created, then it is populated with a variety of keys, described section-by-section in subsequent chapters.

Predefined Config File Symbols

The following symbols are automatically available for use in the configuration file.

basedir

the base directory for the buildmaster. This string has not been expanded, so it may start with a tilde. It needs to be expanded before use. The config file is located in

os.path.expanduser(os.path.join(basedir, 'master.cfg'))
__file__
the absolute path of the config file. The config file's directory is located in os.path.dirname(__file__).
Testing the Config File

To verify that the config file is well-formed and contains no deprecated or invalid elements, use the checkconfig command, passing it either a master directory or a config file.

% buildbot checkconfig master.cfg
Config file is good!
# or
% buildbot checkconfig /tmp/masterdir
Config file is good!

If the config file has deprecated features (perhaps because you've upgraded the buildmaster and need to update the config file to match), they will be announced by checkconfig. In this case, the config file will work, but you should really remove the deprecated items and use the recommended replacements instead:

% buildbot checkconfig master.cfg
/usr/lib/python2.4/site-packages/buildbot/master.py:559: DeprecationWarning: c['sources'] is
deprecated as of 0.7.6 and will be removed by 0.8.0 . Please use c['change_source'] instead.
Config file is good!

If you have errors in your configuration file, checkconfig will let you know:

% buildbot checkconfig master.cfg
Configuration Errors:
c['slaves'] must be a list of BuildSlave instances
no slaves are configured
builder 'smoketest' uses unknown slaves 'linux-002'

If the config file is simply broken, that will be caught too:

% buildbot checkconfig master.cfg
error while parsing config file:
Traceback (most recent call last):
File "/home/buildbot/master/bin/buildbot", line 4, in <module>
    runner.run()
File "/home/buildbot/master/buildbot/scripts/runner.py", line 1358, in run
    if not doCheckConfig(so):
File "/home/buildbot/master/buildbot/scripts/runner.py", line 1079, in doCheckConfig
    return cl.load(quiet=quiet)
File "/home/buildbot/master/buildbot/scripts/checkconfig.py", line 29, in load
    self.basedir, self.configFileName)
--- <exception caught here> ---
File "/home/buildbot/master/buildbot/config.py", line 147, in loadConfig
    exec f in localDict
exceptions.SyntaxError: invalid syntax (master.cfg, line 52)
Configuration Errors:
error while parsing config file: invalid syntax (master.cfg, line 52) (traceback in logfile)
Loading the Config File

The config file is only read at specific points in time. It is first read when the buildmaster is launched.

Note

If the configuration is invalid, the master will display the errors in the console output, but will not exit.

Reloading the Config File (reconfig)

If you are on the system hosting the buildmaster, you can send a SIGHUP signal to it: the buildbot tool has a shortcut for this:

buildbot reconfig BASEDIR

This command will show you all of the lines from twistd.log that relate to the reconfiguration. If there are any problems during the config-file reload, they will be displayed in these lines.

When reloading the config file, the buildmaster will endeavor to change as little as possible about the running system. For example, although old status targets may be shut down and new ones started up, any status targets that were not changed since the last time the config file was read will be left running and untouched. Likewise any Builders which have not been changed will be left running. If a Builder is modified (say, the build process is changed) while a Build is currently running, that Build will keep running with the old process until it completes. Any previously queued Builds (or Builds which get queued after the reconfig) will use the new process.

Warning

Buildbot's reconfiguration system is fragile for a few difficult-to-fix reasons:

  • Any modules imported by the configuration file are not automatically reloaded. Python modules such as http://pypi.python.org/pypi/lazy-reload may help here, but reloading modules is fraught with subtleties and difficult-to-decipher failure cases.
  • During the reconfiguration, active internal objects are divorced from the service hierarchy, leading to tracebacks in the web interface and other components. These are ordinarily transient, but with HTTP connection caching (either by the browser or an intervening proxy) they can last for a long time.
  • If the new configuration file is invalid, it is possible for Buildbot's internal state to be corrupted, leading to undefined results. When this occurs, it is best to restart the master.
  • For more advanced configurations, it is impossible for Buildbot to tell if the configuration for a Builder or Scheduler has changed, and thus the Builder or Scheduler will always be reloaded. This occurs most commonly when a callable is passed as a configuration parameter.

The bbproto project (at https://github.com/dabrahams/bbproto) may help to construct large (multi-file) configurations which can be effectively reloaded and reconfigured.

Reconfig by Debug Client

The debug tool (buildbot debugclient --master HOST:PORT) has a Reload .cfg button which will also trigger a reload.

Global Configuration

The keys in this section affect the operations of the buildmaster globally.

Database Specification

Buildbot requires a connection to a database to maintain certain state information, such as tracking pending build requests. In the default configuration Buildbot uses a file-based SQLite database, stored in the state.sqlite file of the master's base directory. Override this configuration with the db_url parameter.

Buildbot accepts a database configuration in a dictionary named db. All keys are optional:

c['db'] = {
    'db_url' : 'sqlite:///state.sqlite',
    'db_poll_interval' : 30,
}

The db_url key indicates the database engine to use. The format of this parameter is completely documented at http://www.sqlalchemy.org/docs/dialects/, but is generally of the form:

"driver://[username:password@]host:port/database[?args]"

The optional db_poll_interval specifies the interval, in seconds, between checks for pending tasks in the database. This parameter is generally only useful in multi-master mode. See Multi-master mode.

These parameters can be specified directly in the configuration dictionary, as c['db_url'] and c['db_poll_interval'], although this method is deprecated.

The following sections give additional information for particular database backends:

SQLite

For sqlite databases, since there is no host and port, relative paths are specified with sqlite:/// and absolute paths with sqlite:////. Examples:

c['db_url'] = "sqlite:///state.sqlite"

SQLite requires no special configuration.

If Buildbot produces "database is locked" exceptions, try adding serialize_access=1 to the DB URL as a workaround:

c['db_url'] = "sqlite:///state.sqlite?serialize_access=1"

and please file a bug at http://trac.buildbot.net.

MySQL
c['db_url'] = "mysql://user:pass@somehost.com/database_name?max_idle=300"

The max_idle argument for MySQL connections is unique to Buildbot, and should be set to something less than the wait_timeout configured for your server. This controls the SQLAlchemy pool_recycle parameter, which defaults to no timeout. Setting this parameter ensures that connections are closed and re-opened after the configured amount of idle time. If you see errors such as _mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away'), this means your max_idle setting is probably too high. show global variables like 'wait_timeout'; will show what the currently configured wait_timeout is on your MySQL server.

Buildbot requires use_unique=True and charset=utf8, and will add them automatically, so they do not need to be specified in db_url.

MySQL defaults to the MyISAM storage engine, but this can be overridden with the storage_engine URL argument.

Note that, because of InnoDB's extremely short key length limitations, it cannot be used to run Buildbot. See http://bugs.mysql.com/bug.php?id=4541 for more information.

Postgres
c['db_url'] = "postgresql://username@hostname/dbname"

PosgreSQL requires no special configuration.

Multi-master mode

Normally buildbot operates using a single master process that uses the configured database to save state.

It is possible to configure buildbot to have multiple master processes that share state in the same database. This has been well tested using a MySQL database. There are several benefits of Multi-master mode:

  • You can have large numbers of build slaves handling the same queue of build requests. A single master can only handle so many slaves (the number is based on a number of factors including type of builds, number of builds, and master and slave IO and CPU capacity--there is no fixed formula). By adding another master which shares the queue of build requests, you can attach more slaves to this additional master, and increase your build throughput.
  • You can shut one master down to do maintenance, and other masters will continue to do builds.

State that is shared in the database includes:

  • List of changes
  • Scheduler names and internal state
  • Build requests, including the builder name

Because of this shared state, you are strongly encouraged to:

  • Ensure that each named scheduler runs on only one master. If the same scheduler runs on multiple masters, it will trigger duplicate builds and may produce other undesirable behaviors.
  • Ensure builder names are unique for a given build factory implementation. You can have the same builder name configured on many masters, but if the build factories differ, you will get different results depending on which master claims the build.

One suggested configuration is to have one buildbot master configured with just the scheduler and change sources; and then other masters configured with just the builders.

To enable multi-master mode in this configuration, you will need to set the multiMaster option so that buildbot doesn't warn about missing schedulers or builders. You will also need to set db_poll_interval to specify the interval (in seconds) at which masters should poll the database for tasks.

# Enable multiMaster mode; disables warnings about unknown builders and
# schedulers
c['multiMaster'] = True
# Check for new build requests every 60 seconds
c['db'] = {
    'db_url' : 'mysql://...',
    'db_poll_interval' : 30,
}
Site Definitions

Three basic settings describe the buildmaster in status reports:

c['title'] = "Buildbot"
c['titleURL'] = "http://buildbot.sourceforge.net/"
c['buildbotURL'] = "http://localhost:8010/"

title is a short string that will appear at the top of this buildbot installation's html.WebStatus home page (linked to the titleURL), and is embedded in the title of the waterfall HTML page.

titleURL is a URL string that must end with a slash (/). HTML status displays will show title as a link to titleURL. This URL is often used to provide a link from buildbot HTML pages to your project's home page.

The buildbotURL string should point to the location where the buildbot's internal web server is visible. This URL must end with a slash (/). This typically uses the port number set for the web status (WebStatus): the buildbot needs your help to figure out a suitable externally-visible host URL.

When status notices are sent to users (either by email or over IRC), buildbotURL will be used to create a URL to the specific build or problem that they are being notified about. It will also be made available to queriers (over IRC) who want to find out where to get more information about this buildbot.

Log Handling
c['logCompressionLimit'] = 16384
c['logCompressionMethod'] = 'gz'
c['logMaxSize'] = 1024*1024 # 1M
c['logMaxTailSize'] = 32768

The logCompressionLimit enables compression of build logs on disk for logs that are bigger than the given size, or disables that completely if set to False. The default value is 4096, which should be a reasonable default on most file systems. This setting has no impact on status plugins, and merely affects the required disk space on the master for build logs.

The logCompressionMethod controls what type of compression is used for build logs. The default is 'bz2', and the other valid option is 'gz'. 'bz2' offers better compression at the expense of more CPU time.

The logMaxSize parameter sets an upper limit (in bytes) to how large logs from an individual build step can be. The default value is None, meaning no upper limit to the log size. Any output exceeding logMaxSize will be truncated, and a message to this effect will be added to the log's HEADER channel.

If logMaxSize is set, and the output from a step exceeds the maximum, the logMaxTailSize parameter controls how much of the end of the build log will be kept. The effect of setting this parameter is that the log will contain the first logMaxSize bytes and the last logMaxTailSize bytes of output. Don't set this value too high, as the the tail of the log is kept in memory.

Data Lifetime
Horizons
c['changeHorizon'] = 200
c['buildHorizon'] = 100
c['eventHorizon'] = 50
c['logHorizon'] = 40
c['buildCacheSize'] = 15

Buildbot stores historical information on disk in the form of "Pickle" files and compressed logfiles. In a large installation, these can quickly consume disk space, yet in many cases developers never consult this historical information.

The changeHorizon key determines how many changes the master will keep a record of. One place these changes are displayed is on the waterfall page. This parameter defaults to 0, which means keep all changes indefinitely.

The buildHorizon specifies the minimum number of builds for each builder which should be kept on disk. The eventHorizon specifies the minimum number of events to keep--events mostly describe connections and disconnections of slaves, and are seldom helpful to developers. The logHorizon gives the minimum number of builds for which logs should be maintained; this parameter must be less than or equal to buildHorizon. Builds older than logHorizon but not older than buildHorizon will maintain their overall status and the status of each step, but the logfiles will be deleted.

Caches
c['caches'] = {
    'Changes' : 100,     # formerly c['changeCacheSize']
    'Builds' : 500,      # formerly c['buildCacheSize']
    'chdicts' : 100,
    'BuildRequests' : 10,
    'SourceStamps' : 20,
    'ssdicts' : 20,
    'objectids' : 10,
    'usdicts' : 100,
}

The caches configuration key contains the configuration for Buildbot's in-memory caches. These caches keep frequently-used objects in memory to avoid unnecessary trips to the database or to pickle files. Caches are divided by object type, and each has a configurable maximum size.

The default size for each cache is 1, except where noted below. A value of 1 allows Buildbot to make a number of optimizations without consuming much memory. Larger, busier installations will likely want to increase these values.

The available caches are:

Changes

the number of change objects to cache in memory. This should be larger than the number of changes that typically arrive in the span of a few minutes, otherwise your schedulers will be reloading changes from the database every time they run. For distributed version control systems, like Git or Hg, several thousand changes may arrive at once, so setting this parameter to something like 10000 isn't unreasonable.

This parameter is the same as the deprecated global parameter changeCacheSize. Its default value is 10.

Builds

The buildCacheSize parameter gives the number of builds for each builder which are cached in memory. This number should be larger than the number of builds required for commonly-used status displays (the waterfall or grid views), so that those displays do not miss the cache on a refresh.

This parameter is the same as the deprecated global parameter buildCacheSize. Its default value is 15.

chdicts
The number of rows from the changes table to cache in memory. This value should be similar to the value for Changes.
BuildRequests
The number of BuildRequest objects kept in memory. This number should be higher than the typical number of outstanding build requests. If the master ordinarily finds jobs for BuildRequests immediately, you may set a lower value.
SourceStamps
the number of SourceStamp objects kept in memory. This number should generally be similar to the number BuildRequesets.
ssdicts
The number of rows from the sourcestamps table to cache in memory. This value should be similar to the value for SourceStamps.
objectids
The number of object IDs - a means to correlate an object in the Buildbot configuration with an identity in the database--to cache. In this version, object IDs are not looked up often during runtime, so a relatively low value such as 10 is fine.
usdicts

The number of rows from the users table to cache in memory. Note that for a given user there will be a row for each attribute that user has.

c['buildCacheSize'] = 15

Merging Build Requests
c['mergeRequests'] = True

This is a global default value for builders' mergeRequests parameter, and controls the merging of build requests.

This parameter can be overridden on a per-builder basis. See Merging Build Requests for the allowed values for this parameter.

Prioritizing Builders
def prioritizeBuilders(buildmaster, builders):
    ...
c['prioritizeBuilders'] = prioritizeBuilders

By default, buildbot will attempt to start builds on builders in order, beginning with the builder with the oldest pending request. Customize this behavior with the prioritizeBuilders configuration key, which takes a callable. See Builder Priority Functions for details on this callable.

This parameter controls the order that the build master can start builds, and is useful in situations where there is resource contention between builders, e.g., for a test database. It does not affect the order in which a builder processes the build requests in its queue. For that purpose, see Prioritizing Builds.

Setting the PB Port for Slaves
c['protocols'] = {"pb": {"port": 10000}}

The buildmaster will listen on a TCP port of your choosing for connections from buildslaves. It can also use this port for connections from remote Change Sources, status clients, and debug tools. This port should be visible to the outside world, and you'll need to tell your buildslave admins about your choice.

It does not matter which port you pick, as long it is externally visible; however, you should probably use something larger than 1024, since most operating systems don't allow non-root processes to bind to low-numbered ports. If your buildmaster is behind a firewall or a NAT box of some sort, you may have to configure your firewall to permit inbound connections to this port.

c['protocols']['pb']['port'] is a strports specification string, defined in the twisted.application.strports module (try pydoc twisted.application.strports to get documentation on the format).

This means that you can have the buildmaster listen on a localhost-only port by doing:

c['protocols'] = {"pb": {"port": "tcp:10000:interface=127.0.0.1"}}

This might be useful if you only run buildslaves on the same machine, and they are all configured to contact the buildmaster at localhost:10000.

Note

In Buildbot versions <=0.8.8 you might see slavePortnum option. This option contains same value as c['protocols']['pb']['port'] but not recomended to use.

Defining Global Properties

The properties configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:

c['properties'] = {
    'Widget-version' : '1.2',
    'release-stage' : 'alpha'
}
Debug Options

If you set debugPassword, then you can connect to the buildmaster with the diagnostic tool launched by buildbot debugclient MASTER:PORT. From this tool, you can reload the config file, manually force builds, and inject changes, which may be useful for testing your buildmaster without actually committing changes to your repository (or before you have the Change Sources configured.)

The debug tool uses the same port number as the slaves, protocols, and you may configure its authentication credentials as follows:

c['debugPassword'] = "debugpassword"
Manhole

If you set manhole to an instance of one of the classes in buildbot.manhole, you can telnet or ssh into the buildmaster and get an interactive Python shell, which may be useful for debugging buildbot internals. It is probably only useful for buildbot developers. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.

There are three separate Manhole classes. Two of them use SSH, one uses unencrypted telnet. Two of them use a username+password combination to grant access, one of them uses an SSH-style authorized_keys file which contains a list of ssh public keys.

Note

Using any Manhole requires that pycrypto and pyasn1 be installed. These are not part of the normal Buildbot dependencies.

manhole.AuthorizedKeysManhole
You construct this with the name of a file that contains one SSH public key per line, just like ~/.ssh/authorized_keys. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory.
manhole.PasswordManhole
This one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair.
manhole.TelnetManhole
This accepts regular unencrypted telnet connections, and asks for a username/password pair before providing access. Because this username/password is transmitted in the clear, and because Manhole access to the buildmaster is equivalent to granting full shell privileges to both the buildmaster and all the buildslaves (and to all accounts which then run code produced by the buildslaves), it is highly recommended that you use one of the SSH manholes instead.
# some examples:
from buildbot import manhole
c['manhole'] = manhole.AuthorizedKeysManhole(1234, "authorized_keys")
c['manhole'] = manhole.PasswordManhole(1234, "alice", "mysecretpassword")
c['manhole'] = manhole.TelnetManhole(1234, "bob", "snoop_my_password_please")

The Manhole instance can be configured to listen on a specific port. You may wish to have this listening port bind to the loopback interface (sometimes known as lo0, localhost, or 127.0.0.1) to restrict access to clients which are running on the same host.

from buildbot.manhole import PasswordManhole
c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")

To have the Manhole listen on all interfaces, use "tcp:9999" or simply 9999. This port specification uses twisted.application.strports, so you can make it listen on SSL or even UNIX-domain sockets if you want.

Note that using any Manhole requires that the TwistedConch package be installed.

The buildmaster's SSH server will use a different host key than the normal sshd running on a typical unix host. This will cause the ssh client to complain about a host key mismatch, because it does not realize there are two separate servers running on the same host. To avoid this, use a clause like the following in your .ssh/config file:

Host remotehost-buildbot
HostName remotehost
HostKeyAlias remotehost-buildbot
Port 9999
# use 'user' if you use PasswordManhole and your name is not 'admin'.
# if you use AuthorizedKeysManhole, this probably doesn't matter.
User admin
Using Manhole

After you have connected to a manhole instance, you will find yourself at a Python prompt. You have access to two objects: master (the BuildMaster) and status (the master's Status object). Most interesting objects on the master can be reached from these two objects.

To aid in navigation, the show method is defined. It displays the non-method attributes of an object.

A manhole session might look like:

>>> show(master)
data attributes of <buildbot.master.BuildMaster instance at 0x7f7a4ab7df38>
                       basedir : '/home/dustin/code/buildbot/t/buildbot/'...
                     botmaster : <type 'instance'>
                buildCacheSize : None
                  buildHorizon : None
                   buildbotURL : http://localhost:8010/
               changeCacheSize : None
                    change_svc : <type 'instance'>
                configFileName : master.cfg
                            db : <class 'buildbot.db.connector.DBConnector'>
              db_poll_interval : None
                        db_url : sqlite:///state.sqlite
                              ...
>>> show(master.botmaster.builders['win32'])
data attributes of <Builder ''builder'' at 48963528>
                              ...
>>> win32 = _
>>> win32.category = 'w32'
Metrics Options
c['metrics'] = dict(log_interval=10, periodic_interval=10)

metrics can be a dictionary that configures various aspects of the metrics subsystem. If metrics is None, then metrics collection, logging and reporting will be disabled.

log_interval determines how often metrics should be logged to twistd.log. It defaults to 60s. If set to 0 or None, then logging of metrics will be disabled. This value can be changed via a reconfig.

periodic_interval determines how often various non-event based metrics are collected, such as memory usage, uncollectable garbage, reactor delay. This defaults to 10s. If set to 0 or None, then periodic collection of this data is disabled. This value can also be changed via a reconfig.

Read more about metrics in the Metrics section in the developer documentation.

Users Options
from buildbot.process.users import manual
c['user_managers'] = []
c['user_managers'].append(manual.CommandlineUserManager(username="user",
                                                   passwd="userpw",
                                                   port=9990))

user_managers contains a list of ways to manually manage User Objects within Buildbot (see User Objects). Currently implemented is a commandline tool buildbot user, described at length in user. In the future, a web client will also be able to manage User Objects and their attributes.

As shown above, to enable the buildbot user tool, you must initialize a CommandlineUserManager instance in your master.cfg. CommandlineUserManager instances require the following arguments:

username
This is the username that will be registered on the PB connection and need to be used when calling buildbot user.
passwd
This is the passwd that will be registered on the PB connection and need to be used when calling buildbot user.
port
The PB connection port must be different than c['protocols']['pb']['port'] and be specified when calling buildbot user
Input Validation
import re
c['validation'] = {
    'branch' : re.compile(r'^[\w.+/~-]*$'),
    'revision' : re.compile(r'^[ \w\.\-\/]*$'),
    'property_name' : re.compile(r'^[\w\.\-\/\~:]*$'),
    'property_value' : re.compile(r'^[\w\.\-\/\~:]*$'),
}

This option configures the validation applied to user inputs of various types. This validation is important since these values are often included in command-line arguments executed on slaves. Allowing arbitrary input from untrusted users may raise security concerns.

The keys describe the type of input validated; the values are compiled regular expressions against which the input will be matched. The defaults for each type of input are those given in the example, above.

Codebase Generator
all_repositories = {
    r'https://hg/hg/mailsuite/mailclient': 'mailexe',
    r'https://hg/hg/mailsuite/mapilib': 'mapilib',
    r'https://hg/hg/mailsuite/imaplib': 'imaplib',
    r'https://github.com/mailinc/mailsuite/mailclient': 'mailexe',
    r'https://github.com/mailinc/mailsuite/mapilib': 'mapilib',
    r'https://github.com/mailinc/mailsuite/imaplib': 'imaplib',
}

def codebaseGenerator(chdict):
    return all_repositories[chdict['repository']]

c['codebaseGenerator'] = codebaseGenerator

For any incoming change, the codebase is set to ''. This codebase value is sufficient if all changes come from the same repository (or clones). If changes come from different repositories, extra processing will be needed to determine the codebase for the incoming change. This codebase will then be a logical name for the combination of repository and or branch etc.

The codebaseGenerator accepts a change dictionary as produced by the buildbot.db.changes.ChangesConnectorComponent, with a changeid equal to None.

Change Sources

A Version Control System maintains a source tree, and tells the buildmaster when it changes. The first step of each Build is typically to acquire a copy of some version of this tree.

This chapter describes how the Buildbot learns about what Changes have occurred. For more information on VC systems and Changes, see Version Control Systems.

Changes can be provided by a variety of ChangeSource types, although any given project will typically have only a single ChangeSource active. This section provides a description of all available ChangeSource types and explains how to set up each of them.

Choosing a Change Source

There are a variety of ChangeSource classes available, some of which are meant to be used in conjunction with other tools to deliver Change events from the VC repository to the buildmaster.

As a quick guide, here is a list of VC systems and the ChangeSources that might be useful with them. Note that some of these modules are in Buildbot's "contrib" directory, meaning that they have been offered by other users in hopes they may be useful, and might require some additional work to make them functional.

CVS
  • CVSMaildirSource (watching mail sent by contrib/buildbot_cvs_mail.py script)
  • PBChangeSource (listening for connections from buildbot sendchange run in a loginfo script)
  • PBChangeSource (listening for connections from a long-running contrib/viewcvspoll.py polling process which examines the ViewCVS database directly)
  • Change Hooks in WebStatus
SVN
Darcs
Mercurial
  • PBChangeSource (listening for connections from contrib/hg_buildbot.py run in an 'changegroup' hook)

  • Change Hooks in WebStatus

  • PBChangeSource (listening for connections from

  • BitBucket change hook (specifically designed for BitBucket notifications,

    but requiring a publicly-accessible WebStatus)

  • HgPoller (polling a remote Mercurial repository)

  • GoogleCodeAtomPoller (polling the commit feed for a GoogleCode Git repository)

  • BitbucketPullrequestPoller (polling Bitbucket for pull requests)

Bzr (the newer Bazaar)
  • PBChangeSource (listening for connections from contrib/bzr_buildbot.py run in a post-change-branch-tip or commit hook)
  • BzrPoller (polling the Bzr repository)
  • Change Hooks in WebStatus
Git
  • PBChangeSource (listening for connections from contrib/git_buildbot.py run in the post-receive hook)
  • PBChangeSource (listening for connections from contrib/github_buildbot.py, which listens for notifications from GitHub)
  • Change Hooks in WebStatus
  • GitHub change hook (specifically designed for GitHub notifications, but requiring a publicly-accessible WebStatus)
  • BitBucket change hook (specifically designed for BitBucket notifications, but requiring a publicly-accessible WebStatus)
  • GitPoller (polling a remote Git repository)
  • GoogleCodeAtomPoller (polling the commit feed for a GoogleCode Git repository)
  • BitbucketPullrequestPoller (polling Bitbucket for pull requests)
Repo/Git
Monotone
  • PBChangeSource (listening for connections from monotone-buildbot.lua, which is available with Monotone)

All VC systems can be driven by a PBChangeSource and the buildbot sendchange tool run from some form of commit script. If you write an email parsing function, they can also all be driven by a suitable mail-parsing source. Additionally, handlers for web-based notification (i.e. from GitHub) can be used with WebStatus' change_hook module. The interface is simple, so adding your own handlers (and sharing!) should be a breeze.

See Change Source Index for a full list of change sources.

Configuring Change Sources

The change_source configuration key holds all active change sources for the configuration.

Most configurations have a single ChangeSource, watching only a single tree, e.g.,

c['change_source'] = PBChangeSource()

For more advanced configurations, the parameter can be a list of change sources:

source1 = ...
source2 = ...
c['change_source'] = [ source1, source1 ]
Repository and Project

ChangeSources will, in general, automatically provide the proper repository attribute for any changes they produce. For systems which operate on URL-like specifiers, this is a repository URL. Other ChangeSources adapt the concept as necessary.

Many ChangeSources allow you to specify a project, as well. This attribute is useful when building from several distinct codebases in the same buildmaster: the project string can serve to differentiate the different codebases. Schedulers can filter on project, so you can configure different builders to run for each project.

Mail-parsing ChangeSources

Many projects publish information about changes to their source tree by sending an email message out to a mailing list, frequently named PROJECT-commits or PROJECT-changes. Each message usually contains a description of the change (who made the change, which files were affected) and sometimes a copy of the diff. Humans can subscribe to this list to stay informed about what's happening to the source tree.

The Buildbot can also be subscribed to a -commits mailing list, and can trigger builds in response to Changes that it hears about. The buildmaster admin needs to arrange for these email messages to arrive in a place where the buildmaster can find them, and configure the buildmaster to parse the messages correctly. Once that is in place, the email parser will create Change objects and deliver them to the Schedulers (see Schedulers) just like any other ChangeSource.

There are two components to setting up an email-based ChangeSource. The first is to route the email messages to the buildmaster, which is done by dropping them into a maildir. The second is to actually parse the messages, which is highly dependent upon the tool that was used to create them. Each VC system has a collection of favorite change-emailing tools, and each has a slightly different format, so each has a different parsing function. There is a separate ChangeSource variant for each parsing function.

Once you've chosen a maildir location and a parsing function, create the change source and put it in change_source

from buildbot.changes.mail import CVSMaildirSource
c['change_source'] = CVSMaildirSource("~/maildir-buildbot",
                                        prefix="/trunk/")
Subscribing the Buildmaster

The recommended way to install the buildbot is to create a dedicated account for the buildmaster. If you do this, the account will probably have a distinct email address (perhaps buildmaster@example.org). Then just arrange for this account's email to be delivered to a suitable maildir (described in the next section).

If the buildbot does not have its own account, extension addresses can be used to distinguish between email intended for the buildmaster and email intended for the rest of the account. In most modern MTAs, the e.g. foo@example.org account has control over every email address at example.org which begins with "foo", such that email addressed to account-foo@example.org can be delivered to a different destination than account-bar@example.org. qmail does this by using separate .qmail files for the two destinations (.qmail-foo and .qmail-bar, with .qmail controlling the base address and .qmail-default controlling all other extensions). Other MTAs have similar mechanisms.

Thus you can assign an extension address like foo-buildmaster@example.org to the buildmaster, and retain foo@example.org for your own use.

Using Maildirs

A maildir is a simple directory structure originally developed for qmail that allows safe atomic update without locking. Create a base directory with three subdirectories: new, tmp, and cur. When messages arrive, they are put into a uniquely-named file (using pids, timestamps, and random numbers) in tmp. When the file is complete, it is atomically renamed into new. Eventually the buildmaster notices the file in new, reads and parses the contents, then moves it into cur. A cronjob can be used to delete files in cur at leisure.

Maildirs are frequently created with the maildirmake tool, but a simple mkdir -p ~/MAILDIR/{cur,new,tmp} is pretty much equivalent.

Many modern MTAs can deliver directly to maildirs. The usual .forward or .procmailrc syntax is to name the base directory with a trailing slash, so something like ~/MAILDIR/. qmail and postfix are maildir-capable MTAs, and procmail is a maildir-capable MDA (Mail Delivery Agent).

Here is an example procmail config, located in ~/.procmailrc:

# .procmailrc
# routes incoming mail to appropriate mailboxes
PATH=/usr/bin:/usr/local/bin
MAILDIR=$HOME/Mail
LOGFILE=.procmail_log
SHELL=/bin/sh

:0
*
new

If procmail is not setup on a system wide basis, then the following one-line .forward file will invoke it.

!/usr/bin/procmail

For MTAs which cannot put files into maildirs directly, the safecat tool can be executed from a .forward file to accomplish the same thing.

The Buildmaster uses the linux DNotify facility to receive immediate notification when the maildir's new directory has changed. When this facility is not available, it polls the directory for new messages, every 10 seconds by default.

Parsing Email Change Messages

The second component to setting up an email-based ChangeSource is to parse the actual notices. This is highly dependent upon the VC system and commit script in use.

A couple of common tools used to create these change emails, along with the buildbot tools to parse them, are:

CVS
Buildbot CVS MailNotifier
CVSMaildirSource
SVN
svnmailer
http://opensource.perlig.de/en/svnmailer/
commit-email.pl
SVNCommitEmailMaildirSource
Bzr
Launchpad
BzrLaunchpadEmailMaildirSource
Mercurial
NotifyExtension
http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtension
Git
post-receive-email
http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEAD

The following sections describe the parsers available for each of these tools.

Most of these parsers accept a prefix= argument, which is used to limit the set of files that the buildmaster pays attention to. This is most useful for systems like CVS and SVN which put multiple projects in a single repository (or use repository names to indicate branches). Each filename that appears in the email is tested against the prefix: if the filename does not start with the prefix, the file is ignored. If the filename does start with the prefix, that prefix is stripped from the filename before any further processing is done. Thus the prefix usually ends with a slash.

CVSMaildirSource
class buildbot.changes.mail.CVSMaildirSource

This parser works with the buildbot_cvs_maildir.py script in the contrib directory.

The script sends an email containing all the files submitted in one directory. It is invoked by using the CVSROOT/loginfo facility.

The Buildbot's CVSMaildirSource knows how to parse these messages and turn them into Change objects. It takes the directory name of the maildir root. For example:

from buildbot.changes.mail import CVSMaildirSource
c['change_source'] = CVSMaildirSource("/home/buildbot/Mail")
Configuration of CVS and buildbot_cvs_mail.py

CVS must be configured to invoke the buildbot_cvs_mail.py script when files are checked in. This is done via the CVS loginfo configuration file.

To update this, first do:

cvs checkout CVSROOT

cd to the CVSROOT directory and edit the file loginfo, adding a line like:

SomeModule /cvsroot/CVSROOT/buildbot_cvs_mail.py --cvsroot :ext:example.com:/cvsroot -e buildbot -P SomeModule %@{sVv@}

Note

For cvs version 1.12.x, the --path %p option is required. Version 1.11.x and 1.12.x report the directory path differently.

The above example you put the buildbot_cvs_mail.py script under /cvsroot/CVSROOT. It can be anywhere. Run the script with --help to see all the options. At the very least, the options -e (email) and -P (project) should be specified. The line must end with %{sVv} This is expanded to the files that were modified.

Additional entries can be added to support more modules.

See buildbot_cvs_mail.py --help` for more information on the available options.

SVNCommitEmailMaildirSource
class buildbot.changes.mail.SVNCommitEmailMaildirSource

SVNCommitEmailMaildirSource parses message sent out by the commit-email.pl script, which is included in the Subversion distribution.

It does not currently handle branches: all of the Change objects that it creates will be associated with the default (i.e. trunk) branch.

from buildbot.changes.mail import SVNCommitEmailMaildirSource
c['change_source'] = SVNCommitEmailMaildirSource("~/maildir-buildbot")
BzrLaunchpadEmailMaildirSource
class buildbot.changes.mail.BzrLaunchpadEmailMaildirSource

BzrLaunchpadEmailMaildirSource parses the mails that are sent to addresses that subscribe to branch revision notifications for a bzr branch hosted on Launchpad.

The branch name defaults to lp:Launchpad path. For example lp:~maria-captains/maria/5.1.

If only a single branch is used, the default branch name can be changed by setting defaultBranch.

For multiple branches, pass a dictionary as the value of the branchMap option to map specific repository paths to specific branch names (see example below). The leading lp: prefix of the path is optional.

The prefix option is not supported (it is silently ignored). Use the branchMap and defaultBranch instead to assign changes to branches (and just do not subscribe the buildbot to branches that are not of interest).

The revision number is obtained from the email text. The bzr revision id is not available in the mails sent by Launchpad. However, it is possible to set the bzr append_revisions_only option for public shared repositories to avoid new pushes of merges changing the meaning of old revision numbers.

from buildbot.changes.mail import BzrLaunchpadEmailMaildirSource
bm = { 'lp:~maria-captains/maria/5.1' : '5.1', 'lp:~maria-captains/maria/6.0' : '6.0' }
c['change_source'] = BzrLaunchpadEmailMaildirSource("~/maildir-buildbot", branchMap = bm)
PBChangeSource
class buildbot.changes.pb.PBChangeSource

PBChangeSource actually listens on a TCP port for clients to connect and push change notices into the Buildmaster. This is used by the built-in buildbot sendchange notification tool, as well as several version-control hook scripts. This change is also useful for creating new kinds of change sources that work on a push model instead of some kind of subscription scheme, for example a script which is run out of an email .forward file. This ChangeSource always runs on the same TCP port as the slaves. It shares the same protocol, and in fact shares the same space of "usernames", so you cannot configure a PBChangeSource with the same name as a slave.

If you have a publicly accessible slave port, and are using PBChangeSource, you must establish a secure username and password for the change source. If your sendchange credentials are known (e.g., the defaults), then your buildmaster is susceptible to injection of arbitrary changes, which (depending on the build factories) could lead to arbitrary code execution on buildslaves.

The PBChangeSource is created with the following arguments.

port
which port to listen on. If None (which is the default), it shares the port used for buildslave connections.
user
The user account that the client program must use to connect. Defaults to change
passwd
The password for the connection - defaults to changepw. Do not use this default on a publicly exposed port!
prefix

The prefix to be found and stripped from filenames delivered over the connection, defaulting to None. Any filenames which do not start with this prefix will be removed. If all the filenames in a given Change are removed, the that whole Change will be dropped. This string should probably end with a directory separator.

This is useful for changes coming from version control systems that represent branches as parent directories within the repository (like SVN and Perforce). Use a prefix of trunk/ or project/branches/foobranch/ to only follow one branch and to get correct tree-relative filenames. Without a prefix, the PBChangeSource will probably deliver Changes with filenames like trunk/foo.c instead of just foo.c. Of course this also depends upon the tool sending the Changes in (like buildbot sendchange) and what filenames it is delivering: that tool may be filtering and stripping prefixes at the sending end.

For example:

from buildbot.changes import pb
c['change_source'] = pb.PBChangeSource(port=9999, user='laura', passwd='fpga')

The following hooks are useful for sending changes to a PBChangeSource:

Bzr Hook

Bzr is also written in Python, and the Bzr hook depends on Twisted to send the changes.

To install, put contrib/bzr_buildbot.py in one of your plugins locations a bzr plugins directory (e.g., ~/.bazaar/plugins). Then, in one of your bazaar conf files (e.g., ~/.bazaar/locations.conf), set the location you want to connect with buildbot with these keys:

  • buildbot_on one of 'commit', 'push, or 'change'. Turns the plugin on to report changes via commit, changes via push, or any changes to the trunk. 'change' is recommended.
  • buildbot_server (required to send to a buildbot master) the URL of the buildbot master to which you will connect (as of this writing, the same server and port to which slaves connect).
  • buildbot_port (optional, defaults to 9989) the port of the buildbot master to which you will connect (as of this writing, the same server and port to which slaves connect)
  • buildbot_pqm (optional, defaults to not pqm) Normally, the user that commits the revision is the user that is responsible for the change. When run in a pqm (Patch Queue Manager, see https://launchpad.net/pqm) environment, the user that commits is the Patch Queue Manager, and the user that committed the parent revision is responsible for the change. To turn on the pqm mode, set this value to any of (case-insensitive) "Yes", "Y", "True", or "T".
  • buildbot_dry_run (optional, defaults to not a dry run) Normally, the post-commit hook will attempt to communicate with the configured buildbot server and port. If this parameter is included and any of (case-insensitive) "Yes", "Y", "True", or "T", then the hook will simply print what it would have sent, but not attempt to contact the buildbot master.
  • buildbot_send_branch_name (optional, defaults to not sending the branch name) If your buildbot's bzr source build step uses a repourl, do not turn this on. If your buildbot's bzr build step uses a baseURL, then you may set this value to any of (case-insensitive) "Yes", "Y", "True", or "T" to have the buildbot master append the branch name to the baseURL.

Note

The bzr smart server (as of version 2.2.2) doesn't know how to resolve bzr:// urls into absolute paths so any paths in locations.conf won't match, hence no change notifications will be sent to Buildbot. Setting configuration parameters globally or in-branch might still work. When buildbot no longer has a hardcoded password, it will be a configuration option here as well.

Here's a simple example that you might have in your ~/.bazaar/locations.conf.

[chroot-*:///var/local/myrepo/mybranch]
buildbot_on = change
buildbot_server = localhost
P4Source

The P4Source periodically polls a Perforce depot for changes. It accepts the following arguments:

p4port
The Perforce server to connect to (as host:port).
p4user
The Perforce user.
p4passwd
The Perforce password.
p4base
The base depot path to watch, without the trailing '/...'.
p4bin
An optional string parameter. Specify the location of the perforce command line binary (p4). You only need to do this if the perforce binary is not in the path of the buildbot user. Defaults to p4.
split_file
A function that maps a pathname, without the leading p4base, to a (branch, filename) tuple. The default just returns (None, branchfile), which effectively disables branch support. You should supply a function which understands your repository structure.
pollInterval
How often to poll, in seconds. Defaults to 600 (10 minutes).
project
Set the name of the project to be used for the P4Source. This will then be set in any changes generated by the P4Source, and can be used in a Change Filter for triggering particular builders.
pollAtLaunch
Determines when the first poll occurs. True = immediately on launch, False = wait for one pollInterval (default).
histmax
The maximum number of changes to inspect at a time. If more than this number occur since the last poll, older changes will be silently ignored.
encoding
The character encoding of p4's output. This defaults to "utf8", but if your commit messages are in another encoding, specify that here. For example, if you're using Perforce on Windows, you may need to use "cp437" as the encoding if "utf8" generates errors in your master log.
server_tz
The timezone of the Perforce server, using the usual timezone format (e.g: Europe/Stockholm) in case it's in a different timezone than the buildbot master.
Example

This configuration uses the P4PORT, P4USER, and P4PASSWD specified in the buildmaster's environment. It watches a project in which the branch name is simply the next path component, and the file is all path components after.

from buildbot.changes import p4poller
s = p4poller.P4Source(p4base='//depot/project/',
                      split_file=lambda branchfile: branchfile.split('/',1),
                     )
c['change_source'] = s
BonsaiPoller

The BonsaiPoller periodically polls a Bonsai server. This is a CGI script accessed through a web server that provides information about a CVS tree, for example the Mozilla bonsai server at http://bonsai.mozilla.org. Bonsai servers are usable by both humans and machines. In this case, the buildbot's change source forms a query which asks about any files in the specified branch which have changed since the last query.

BonsaiPoller accepts the following arguments:

bonsaiURL
The base URL of the Bonsai server, e.g., http://bonsai.mozilla.org
module
The module to look for changes in. Commonly this is all.
branch
The branch to look for changes in. This will appear in the branch field of the resulting change objects.
tree
The tree to look for changes in. Commonly this is all.
cvsroot
The CVS root of the repository. Usually this is /cvsroot.
pollInterval
The time (in seconds) between queries for changes.
pollAtLaunch
Determines when the first poll occurs. True = immediately on launch, False = wait for one pollInterval (default).
project
The project name to attach to all change objects produced by this change source.
SVNPoller
class buildbot.changes.svnpoller.SVNPoller

The SVNPoller is a ChangeSource which periodically polls a Subversion repository for new revisions, by running the svn log command in a subshell. It can watch a single branch or multiple branches.

SVNPoller accepts the following arguments:

svnurl

The base URL path to watch, like svn://svn.twistedmatrix.com/svn/Twisted/trunk, or http://divmod.org/svn/Divmo/, or even file:///home/svn/Repository/ProjectA/branches/1.5/. This must include the access scheme, the location of the repository (both the hostname for remote ones, and any additional directory names necessary to get to the repository), and the sub-path within the repository's virtual filesystem for the project and branch of interest.

The SVNPoller will only pay attention to files inside the subdirectory specified by the complete svnurl.

split_file

A function to convert pathnames into (branch, relative_pathname) tuples. Use this to explain your repository's branch-naming policy to SVNPoller. This function must accept a single string (the pathname relative to the repository) and return a two-entry tuple. Directory pathnames always end with a right slash to distinguish them from files, like trunk/src/, or src/. There are a few utility functions in buildbot.changes.svnpoller that can be used as a split_file function; see below for details.

For directories, the relative pathname returned by split_file should end with a right slash but an empty string is also accepted for the root, like ("branches/1.5.x", "") being converted from "branches/1.5.x/".

The default value always returns (None, path), which indicates that all files are on the trunk.

Subclasses of SVNPoller can override the split_file method instead of using the split_file= argument.

project
Set the name of the project to be used for the SVNPoller. This will then be set in any changes generated by the SVNPoller, and can be used in a Change Filter for triggering particular builders.
svnuser
An optional string parameter. If set, the --user argument will be added to all svn commands. Use this if you have to authenticate to the svn server before you can do svn info or svn log commands.
svnpasswd
Like svnuser, this will cause a --password argument to be passed to all svn commands.
pollInterval
How often to poll, in seconds. Defaults to 600 (checking once every 10 minutes). Lower this if you want the buildbot to notice changes faster, raise it if you want to reduce the network and CPU load on your svn server. Please be considerate of public SVN repositories by using a large interval when polling them.
pollAtLaunch
Determines when the first poll occurs. True = immediately on launch, False = wait for one pollInterval (default).
histmax
The maximum number of changes to inspect at a time. Every pollInterval seconds, the SVNPoller asks for the last histmax changes and looks through them for any revisions it does not already know about. If more than histmax revisions have been committed since the last poll, older changes will be silently ignored. Larger values of histmax will cause more time and memory to be consumed on each poll attempt. histmax defaults to 100.
svnbin
This controls the svn executable to use. If subversion is installed in a weird place on your system (outside of the buildmaster's PATH), use this to tell SVNPoller where to find it. The default value of svn will almost always be sufficient.
revlinktmpl
This parameter is deprecated in favour of specifying a global revlink option. This parameter allows a link to be provided for each revision (for example, to websvn or viewvc). These links appear anywhere changes are shown, such as on build or change pages. The proper form for this parameter is an URL with the portion that will substitute for a revision number replaced by ''%s''. For example, 'http://myserver/websvn/revision.php?rev=%s' could be used to cause revision links to be created to a websvn repository viewer.
cachepath
If specified, this is a pathname of a cache file that SVNPoller will use to store its state between restarts of the master.
extra_args
If specified, the extra arguments will be added to the svn command args.

Several split file functions are available for common SVN repository layouts. For a poller that is only monitoring trunk, the default split file function is available explicitly as split_file_alwaystrunk:

from buildbot.changes.svnpoller import SVNPoller
from buildbot.changes.svnpoller import split_file_alwaystrunk
c['change_source'] = SVNPoller(
    svnurl="svn://svn.twistedmatrix.com/svn/Twisted/trunk",
    split_file=split_file_alwaystrunk)

For repositories with the /trunk and /branches/{BRANCH} layout, split_file_branches will do the job:

from buildbot.changes.svnpoller import SVNPoller
from buildbot.changes.svnpoller import split_file_branches
c['change_source'] = SVNPoller(
    svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/amanda",
    split_file=split_file_branches)

When using this splitter the poller will set the project attribute of any changes to the project attribute of the poller.

For repositories with the {PROJECT}/trunk and {PROJECT}/branches/{BRANCH} layout, split_file_projects_branches will do the job:

from buildbot.changes.svnpoller import SVNPoller
from buildbot.changes.svnpoller import split_file_projects_branches
c['change_source'] = SVNPoller(
    svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/",
    split_file=split_file_projects_branches)

When using this splitter the poller will set the project attribute of any changes to the project determined by the splitter.

The SVNPoller is highly adaptable to various Subversion layouts. See Customizing SVNPoller for details and some common scenarios.

Bzr Poller

If you cannot insert a Bzr hook in the server, you can use the Bzr Poller. To use, put contrib/bzr_buildbot.py somewhere that your buildbot configuration can import it. Even putting it in the same directory as the master.cfg should work. Install the poller in the buildbot configuration as with any other change source. Minimally, provide a URL that you want to poll (bzr://, bzr+ssh://, or lp:), making sure the buildbot user has necessary privileges.

# bzr_buildbot.py in the same directory as master.cfg
from bzr_buildbot import BzrPoller
c['change_source'] = BzrPoller(
    url='bzr://hostname/my_project',
    poll_interval=300)

The BzrPoller parameters are:

url
The URL to poll.
poll_interval
The number of seconds to wait between polls. Defaults to 10 minutes.
branch_name
Any value to be used as the branch name. Defaults to None, or specify a string, or specify the constants from bzr_buildbot.py SHORT or FULL to get the short branch name or full branch address.
blame_merge_author
normally, the user that commits the revision is the user that is responsible for the change. When run in a pqm (Patch Queue Manager, see https://launchpad.net/pqm) environment, the user that commits is the Patch Queue Manager, and the user that committed the merged, parent revision is responsible for the change. set this value to True if this is pointed against a PQM-managed branch.
GitPoller

If you cannot take advantage of post-receive hooks as provided by contrib/git_buildbot.py for example, then you can use the GitPoller.

The GitPoller periodically fetches from a remote Git repository and processes any changes. It requires its own working directory for operation. The default should be adequate, but it can be overridden via the workdir property.

Note

There can only be a single GitPoller pointed at any given repository.

The GitPoller requires Git-1.7 and later. It accepts the following arguments:

repourl
the git-url that describes the remote repository, e.g. git@example.com:foobaz/myrepo.git (see the git fetch help for more info on git-url formats)
branches

One of the following:

  • a list of the branches to fetch.
  • True indicating that all branches should be fetched
  • a callable which takes a single argument. It should take a remote refspec (such as 'refs/heads/master', and return a boolean indicating whether that branch should be fetched.
branch
accepts a single branch name to fetch. Exists for backwards compatibility with old configurations.
pollInterval
interval in seconds between polls, default is 10 minutes
pollAtLaunch
Determines when the first poll occurs. True = immediately on launch, False = wait for one pollInterval (default).
gitbin
path to the Git binary, defaults to just 'git'
category
Set the category to be used for the changes produced by the GitPoller. This will then be set in any changes generated by the GitPoller, and can be used in a Change Filter for triggering particular builders.
project
Set the name of the project to be used for the GitPoller. This will then be set in any changes generated by the GitPoller, and can be used in a Change Filter for triggering particular builders.
usetimestamps
parse each revision's commit timestamp (default is True), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)
encoding
Set encoding will be used to parse author's name and commit message. Default encoding is 'utf-8'. This will not be applied to file names since Git will translate non-ascii file names to unreadable escape sequences.
workdir
the directory where the poller should keep its local repository. The default is gitpoller_work. If this is a relative path, it will be interpreted relative to the master's basedir. Multiple Git pollers can share the same directory.

A configuration for the Git poller might look like this:

from buildbot.changes.gitpoller import GitPoller
c['change_source'] = GitPoller(repourl='git@example.com:foobaz/myrepo.git',
                               branches=['master', 'great_new_feature'])
HgPoller

The HgPoller periodically pulls a named branch from a remote Mercurial repository and processes any changes. It requires its own working directory for operation, which must be specified via the workdir property.

The HgPoller requires a working hg executable, and at least a read-only access to the repository it polls (possibly through ssh keys or by tweaking the hgrc of the system user buildbot runs as).

The HgPoller will not transmit any change if there are several heads on the watched named branch. This is similar (although not identical) to the Mercurial executable behaviour. This exceptional condition is usually the result of a developer mistake, and usually does not last for long. It is reported in logs. If fixed by a later merge, the buildmaster administrator does not have anything to do: that merge will be transmitted, together with the intermediate ones.

The HgPoller accepts the following arguments:

repourl
the url that describes the remote repository, e.g. http://hg.example.com/projects/myrepo. Any url suitable for hg pull can be specified.
branch
the desired branch to pull, will default to 'default'
workdir

the directory where the poller should keep its local repository. It is mandatory for now, although later releases may provide a meaningful default.

It also serves to identify the poller in the buildmaster internal database. Changing it may result in re-processing all changes so far.

Several HgPoller instances may share the same workdir for mutualisation of the common history between two different branches, thus easing on local and remote system resources and bandwidth.

If relative, the workdir will be interpreted from the master directory.

pollInterval
interval in seconds between polls, default is 10 minutes
pollAtLaunch
Determines when the first poll occurs. True = immediately on launch, False = wait for one pollInterval (default).
hgbin
path to the Mercurial binary, defaults to just 'hg'
category
Set the category to be used for the changes produced by the HgPoller. This will then be set in any changes generated by the HgPoller, and can be used in a Change Filter for triggering particular builders.
project
Set the name of the project to be used for the HgPoller. This will then be set in any changes generated by the HgPoller, and can be used in a Change Filter for triggering particular builders.
usetimestamps
parse each revision's commit timestamp (default is True), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)
encoding
Set encoding will be used to parse author's name and commit message. Default encoding is 'utf-8'.

A configuration for the Mercurial poller might look like this:

from buildbot.changes.hgpoller import HgPoller
c['change_source'] = HgPoller(repourl='http://hg.example.org/projects/myrepo',
                               branch='great_new_feature',
                               workdir='hg-myrepo')
BitbucketPullrequestPoller
class buildbot.changes.bitbucket.BitbucketPullrequestPoller

This BitbucketPullrequestPoller periodically polls Bitbucket for new or updated pull requests. It uses Bitbuckets powerful Pull Request REST API to gather the information needed.

The BitbucketPullrequestPoller accepts the following arguments:

owner
The owner of the Bitbucket repository. All Bitbucket Urls are of the form https://bitbucket.org/owner/slug/.
slug
The name of the Bitbucket repository.
branch
A single branch or a list of branches which should be processed. If it is None (the default) all pull requests are used.
pollInterval
Interval in seconds between polls, default is 10 minutes.
pollAtLaunch
Determines when the first poll occurs. True = immediately on launch, False = wait for one pollInterval (default).
category
Set the category to be used for the changes produced by the BitbucketPullrequestPoller. This will then be set in any changes generated by the BitbucketPullrequestPoller, and can be used in a Change Filter for triggering particular builders.
project
Set the name of the project to be used for the BitbucketPullrequestPoller. This will then be set in any changes generated by the BitbucketPullrequestPoller, and can be used in a Change Filter for triggering particular builders.
pullrequest_filter
A callable which takes one parameter, the decoded Python object of the pull request JSON. If the it returns False the pull request is ignored. It can be used to define custom filters based on the content of the pull request. See the Bitbucket documentation for more information about the format of the response. By default the filter always returns True.
usetimestamps
parse each revision's commit timestamp (default is True), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)
encoding
Set encoding will be used to parse author's name and commit message. Default encoding is 'utf-8'.

A minimal configuration for the Bitbucket pull request poller might look like this:

from buildbot.changes.bitbucket import BitbucketPullrequestPoller
c['change_source'] = BitbucketPullrequestPoller(
    owner='myname',
    slug='myrepo',
  )

Here is a more complex configuration using a pullrequest_filter. The pull request is only processed if at least 3 people have already approved it:

def approve_filter(pr, threshold):
    approves = 0
    for participant in pr['participants']:
        if participant['approved']:
            approves = approves + 1

    if approves < threshold:
        return False
    return True

from buildbot.changes.bitbucket import BitbucketPullrequestPoller
c['change_source'] = BitbucketPullrequestPoller(
    owner='myname',
    slug='myrepo',
    branch='mybranch',
    project='myproject',
    pullrequest_filter=lambda pr : approve_filter(pr,3),
    pollInterval=600,
  )

Warning

Anyone who can create pull requests for the Bitbucket repository can initiate a change, potentially causing the buildmaster to run arbitrary code.

GerritChangeSource
class buildbot.changes.gerritchangesource.GerritChangeSource

The GerritChangeSource class connects to a Gerrit server by its SSH interface and uses its event source mechanism, gerrit stream-events.

The GerritChangeSource accepts the following arguments:

gerritserver
the dns or ip that host the gerrit ssh server
gerritport
the port of the gerrit ssh server
username
the username to use to connect to gerrit
identity_file
ssh identity file to for authentication (optional) pay attention to the ssh passphrase
handled_events
event to be handled (optional) by default processes patchset-created and ref-updated

By default this class adds a change to the buildbot system for each of the following events:

patchset-created
A change is proposed for review. Automatic checks like checkpatch.pl can be automatically triggered. Beware of what kind of automatic task you trigger. At this point, no trusted human has reviewed the code, and a patch could be specially crafted by an attacker to compromise your buildslaves.
ref-updated
A change has been merged into the repository. Typically, this kind of event can lead to a complete rebuild of the project, and upload binaries to an incremental build results server.

But you can specify how to handle Events:

  • Any event with change and patchSet will be processed by universal collector by default.
  • In case you've specified processing function for the given kind of events, all events of this kind will be processed only by this function, bypassing universal collector.

An example:

from buildbot.changes.gerritchangesource import GerritChangeSource
class MyGerritChangeSource(GerritChangeSource):
    """Custom GerritChangeSource
    """
    def eventReceived_patchset_created(self, properties, event):
        """Handler events without properties
        """
        properties = {}
        self.addChangeFromEvent(properties, event)

This class will populate the property list of the triggered build with the info received from Gerrit server in JSON format.

In case of patchset-created event, these properties will be:

event.change.branch
Branch of the Change
event.change.id
Change's ID in the Gerrit system (the ChangeId: in commit comments)
event.change.number
Change's number in Gerrit system
event.change.owner.email
Change's owner email (owner is first uploader)
event.change.owner.name
Change's owner name
event.change.project
Project of the Change
event.change.subject
Change's subject
event.change.url
URL of the Change in the Gerrit's web interface
event.patchSet.number
Patchset's version number
event.patchSet.ref
Patchset's Gerrit "virtual branch"
event.patchSet.revision
Patchset's Git commit ID
event.patchSet.uploader.email
Patchset uploader's email (owner is first uploader)
event.patchSet.uploader.name
Patchset uploader's name (owner is first uploader)
event.type
Event type (patchset-created)
event.uploader.email
Patchset uploader's email
event.uploader.name
Patchset uploader's name

In case of ref-updated event, these properties will be:

event.refUpdate.newRev
New Git commit ID (after merger)
event.refUpdate.oldRev
Previous Git commit ID (before merger)
event.refUpdate.project
Project that was updated
event.refUpdate.refName
Branch that was updated
event.submitter.email
Submitter's email (merger responsible)
event.submitter.name
Submitter's name (merger responsible)
event.type
Event type (ref-updated)
event.submitter.email
Submitter's email (merger responsible)
event.submitter.name
Submitter's name (merger responsible)

A configuration for this source might look like:

from buildbot.changes.gerritchangesource import GerritChangeSource
c['change_source'] = GerritChangeSource(
    "gerrit.example.com",
    "gerrit_user",
    handled_events=["patchset-created", "change-merged"])

see master/docs/examples/git_gerrit.cfg or master/docs/examples/repo_gerrit.cfg in the Buildbot distribution for a full example setup of Git+Gerrit or Repo+Gerrit of GerritChangeSource.

Change Hooks (HTTP Notifications)

Buildbot already provides a web frontend, and that frontend can easily be used to receive HTTP push notifications of commits from services like GitHub or GoogleCode. See Change Hooks for more information.

GoogleCodeAtomPoller

The GoogleCodeAtomPoller periodically polls a Google Code Project's commit feed for changes. Works on SVN, Git, and Mercurial repositories. Branches are not understood (yet). It accepts the following arguments:

feedurl
The commit Atom feed URL of the GoogleCode repository (MANDATORY)
pollinterval
Polling frequency for the feed (in seconds). Default is 1 hour (OPTIONAL)

As an example, to poll the Ostinato project's commit feed every 3 hours, the configuration would look like this:

from googlecode_atom import GoogleCodeAtomPoller
c['change_source'] = GoogleCodeAtomPoller(
    feedurl="http://code.google.com/feeds/p/ostinato/hgchanges/basic",
    pollinterval=10800)

(note that you will need to download googlecode_atom.py from the Buildbot source and install it somewhere on your PYTHONPATH first)

Schedulers

Schedulers are responsible for initiating builds on builders.

Some schedulers listen for changes from ChangeSources and generate build sets in response to these changes. Others generate build sets without changes, based on other events in the buildmaster.

Configuring Schedulers

The schedulers configuration parameter gives a list of Scheduler instances, each of which causes builds to be started on a particular set of Builders. The two basic Scheduler classes you are likely to start with are SingleBranchScheduler and Periodic, but you can write a customized subclass to implement more complicated build scheduling.

Scheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion:

sched = SingleBranchScheduler(name="quick", builderNames=['lin', 'win'])

There are several common arguments for schedulers, although not all are available with all schedulers.

name
Each Scheduler must have a unique name. This is used in status displays, and is also available in the build property scheduler.
builderNames
This is the set of builders which this scheduler should trigger, specified as a list of names (strings).
properties

This is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The owner property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (Doing Things With Users) for each triggered build. For example

sched = Scheduler(...,
    properties = { 'owner' : [ 'zorro@company.com', 'silver@company.com' ] })
fileIsImportant
A callable which takes one argument, a Change instance, and returns True if the change is worth building, and False if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.
change_filter
The change filter that will determine which changes are recognized by this scheduler; Change Filters. Note that this is different from fileIsImportant: if the change filter filters out a Change, then it is completely ignored by the scheduler. If a Change is allowed by the change filter, but is deemed unimportant, then it will not cause builds to start, but will be remembered and shown in status displays.
codebases

When the scheduler processes data from more than 1 repository at the same time then a corresponding codebase definition should be passed for each repository. A codebase definition is a dictionary with one or more of the following keys: repository, branch, revision. The codebase definitions have also to be passed as dictionary.

codebases = {'codebase1': {'repository':'....',
                           'branch':'default',
                           'revision': None},
             'codebase2': {'repository':'....'} }

Important

codebases behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in codebases. By default codebases is set to {'':{}} which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.

Buildsteps can have a reference to one of the codebases. The step will only get information (revision, branch etc.) that is related to that codebase. When a scheduler is triggered by new changes, these changes (having a codebase) will be incorporated by the new build. The buildsteps referencing to the codebases that have changes get information about those changes. The buildstep that references to a codebase that does not have changes in the build get the information from the codebases definition as configured in the scheduler.

onlyImportant
A boolean that, when True, only adds important changes to the buildset as specified in the fileIsImportant callable. This means that unimportant changes are ignored the same way a change_filter filters changes. This defaults to False and only applies when fileIsImportant is given.
reason
A string that will be used as the reason for the triggered build.
createAbsoluteSourceStamps
This option only has effect when using multiple codebases. When True, it uses the last seen revision for each codebase that does not have a change. When False, the default value, codebases without changes will use the revision from the codebases argument.

The remaining subsections represent a catalog of the available Scheduler types. All these Schedulers are defined in modules under buildbot.schedulers, and the docstrings there are the best source of documentation on the arguments taken by each one.

Change Filters

Several schedulers perform filtering on an incoming set of changes. The filter can most generically be specified as a ChangeFilter. Set up a ChangeFilter like this:

from buildbot.changes.filter import ChangeFilter
my_filter = ChangeFilter(
    project_re="^baseproduct/.*",
    branch="devel")

and then add it to a scheduler with the change_filter parameter:

sch = SomeSchedulerClass(...,
    change_filter=my_filter)

There are five attributes of changes on which you can filter:

project
the project string, as defined by the ChangeSource.
repository
the repository in which this change occurred.
branch
the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by None.
category
the category, again as defined by the ChangeSource.
codebase
the change's codebase.

For each attribute, the filter can look for a single, specific value:

my_filter = ChangeFilter(project = 'myproject')

or accept any of a set of values:

my_filter = ChangeFilter(project = ['myproject', 'jimsproject'])

or apply a regular expression, using the attribute name with a "_re" suffix:

my_filter = ChangeFilter(category_re = '.*deve.*')
# or, to use regular expression flags:
import re
my_filter = ChangeFilter(category_re = re.compile('.*deve.*', re.I))

For anything more complicated, define a Python function to recognize the strings you want:

def my_branch_fn(branch):
    return branch in branches_to_build and branch not in branches_to_ignore
my_filter = ChangeFilter(branch_fn = my_branch_fn)

The special argument filter_fn can be used to specify a function that is given the entire Change object, and returns a boolean.

The entire set of allowed arguments, then, is

project project_re project_fn
repository repository_re repository_fn
branch branch_re branch_fn
category category_re category_fn
codebase codebase_re codebase_fn
filter_fn

A Change passes the filter only if all arguments are satisfied. If no filter object is given to a scheduler, then all changes will be built (subject to any other restrictions the scheduler enforces).

SingleBranchScheduler

This is the original and still most popular scheduler class. It follows exactly one branch, and starts a configurable tree-stable-timer after each change on that branch. When the timer expires, it starts a build on some set of Builders. The Scheduler accepts a fileIsImportant function which can be used to ignore some Changes if they do not affect any important files.

If treeStableTimer is not set, then this scheduler starts a build for every Change that matches its change_filter and statsfies fileIsImportant. If treeStableTimer is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.

Note

The behavior of this scheduler is undefined, if treeStableTimer is set, and changes from multiple branches, repositories or codebases are accepted by the filter.

Note

The codebases argument will filter out codebases not specified there, but won't filter based on the branches specified there.

The arguments to this scheduler are:

name

builderNames

properties

fileIsImportant

change_filter

onlyImportant

reason

createAbsoluteSourceStamps
See Configuring Schedulers.
treeStableTimer

The scheduler will wait for this many seconds before starting the build. If new changes are made during this interval, the timer will be restarted, so really the build will be started after a change and then after this many seconds of inactivity.

If treeStableTimer is None, then a separate build is started immediately for each Change.

fileIsImportant
A callable which takes one argument, a Change instance, and returns True if the change is worth building, and False if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.
categories (deprecated; use change_filter)
A list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.
branch (deprecated; use change_filter)

The scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting branch equal to the special value of None means it should only pay attention to the default branch.

Note

None is a keyword, not a string, so write None and not "None".

Example:

from buildbot.schedulers.basic  import SingleBranchScheduler
from buildbot.changes import filter
quick = SingleBranchScheduler(name="quick",
                    change_filter=filter.ChangeFilter(branch='master'),
                    treeStableTimer=60,
                    builderNames=["quick-linux", "quick-netbsd"])
full = SingleBranchScheduler(name="full",
                    change_filter=filter.ChangeFilter(branch='master'),
                    treeStableTimer=5*60,
                    builderNames=["full-linux", "full-netbsd", "full-OSX"])
c['schedulers'] = [quick, full]

In this example, the two quick builders are triggered 60 seconds after the tree has been changed. The full builds do not run quite so quickly (they wait 5 minutes), so hopefully if the quick builds fail due to a missing file or really simple typo, the developer can discover and fix the problem before the full builds are started. Both Schedulers only pay attention to the default branch: any changes on other branches are ignored by these schedulers. Each scheduler triggers a different set of Builders, referenced by name.

The old names for this scheduler, buildbot.scheduler.Scheduler and buildbot.schedulers.basic.Scheduler, are deprecated in favor of the more accurate name buildbot.schedulers.basic.SingleBranchScheduler.

AnyBranchScheduler

This scheduler uses a tree-stable-timer like the default one, but uses a separate timer for each branch.

If treeStableTimer is not set, then this scheduler is indistinguishable from bb:sched:SingleBranchScheduler. If treeStableTimer is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.

The arguments to this scheduler are:

name

builderNames

properties

fileIsImportant

change_filter

onlyImportant

reason
See Configuring Schedulers.
treeStableTimer
The scheduler will wait for this many seconds before starting the build. If new changes are made on the same branch during this interval, the timer will be restarted.
branches (deprecated; use change_filter)
Changes on branches not specified on this list will be ignored.
categories (deprecated; use change_filter)
A list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.
Dependent Scheduler

It is common to wind up with one kind of build which should only be performed if the same source code was successfully handled by some other kind of build first. An example might be a packaging step: you might only want to produce .deb or RPM packages from a tree that was known to compile successfully and pass all unit tests. You could put the packaging step in the same Build as the compile and testing steps, but there might be other reasons to not do this (in particular you might have several Builders worth of compiles/tests, but only wish to do the packaging once). Another example is if you want to skip the full builds after a failing quick build of the same source code. Or, if one Build creates a product (like a compiled library) that is used by some other Builder, you'd want to make sure the consuming Build is run after the producing one.

You can use Dependencies to express this relationship to the Buildbot. There is a special kind of scheduler named scheduler.Dependent that will watch an upstream scheduler for builds to complete successfully (on all of its Builders). Each time that happens, the same source code (i.e. the same SourceStamp) will be used to start a new set of builds, on a different set of Builders. This downstream scheduler doesn't pay attention to Changes at all. It only pays attention to the upstream scheduler.

If the build fails on any of the Builders in the upstream set, the downstream builds will not fire. Note that, for SourceStamps generated by a ChangeSource, the revision is None, meaning HEAD. If any changes are committed between the time the upstream scheduler begins its build and the time the dependent scheduler begins its build, then those changes will be included in the downstream build. See the Triggerable Scheduler for a more flexible dependency mechanism that can avoid this problem.

The keyword arguments to this scheduler are:

name

builderNames

properties
See Configuring Schedulers.
upstream
The upstream scheduler to watch. Note that this is an instance, not the name of the scheduler.

Example:

from buildbot.schedulers import basic
tests = basic.SingleBranchScheduler(name="just-tests",
                        treeStableTimer=5*60,
                        builderNames=["full-linux", "full-netbsd", "full-OSX"])
package = basic.Dependent(name="build-package",
                        upstream=tests, # <- no quotes!
                        builderNames=["make-tarball", "make-deb", "make-rpm"])
c['schedulers'] = [tests, package]
Periodic Scheduler

This simple scheduler just triggers a build every N seconds.

The arguments to this scheduler are:

name

builderNames

properties

onlyImportant

reason
See Configuring Schedulers.
periodicBuildTimer
The time, in seconds, after which to start a build.

Example:

from buildbot.schedulers import timed
nightly = timed.Periodic(name="daily",
                builderNames=["full-solaris"],
                periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]

The scheduler in this example just runs the full solaris build once per day. Note that this scheduler only lets you control the time between builds, not the absolute time-of-day of each Build, so this could easily wind up an evening or every afternoon scheduler depending upon when it was first activated.

Nightly Scheduler

This is highly configurable periodic build scheduler, which triggers a build at particular times of day, week, month, or year. The configuration syntax is very similar to the well-known crontab format, in which you provide values for minute, hour, day, and month (some of which can be wildcards), and a build is triggered whenever the current time matches the given constraints. This can run a build every night, every morning, every weekend, alternate Thursdays, on your boss's birthday, etc.

Pass some subset of minute, hour, dayOfMonth, month, and dayOfWeek; each may be a single number or a list of valid values. The builds will be triggered whenever the current time matches these values. Wildcards are represented by a '*' string. All fields default to a wildcard except 'minute', so with no fields this defaults to a build every hour, on the hour. The full list of parameters is:

name

builderNames

properties

fileIsImportant

change_filter

onlyImportant

reason

codebases

createAbsoluteSourceStamps
See Configuring Schedulers. Note that fileIsImportant, change_filter and createAbsoluteSourceStamps are only relevant if onlyIfChanged is True.
onlyIfChanged
If this is true, then builds will not be scheduled at the designated time unless the specified branch has seen an important change since the previous build.
branch
(required) The branch to build when the time comes. Remember that a value of None here means the default branch, and will not match other branches!
minute
The minute of the hour on which to start the build. This defaults to 0, meaning an hourly build.
hour
The hour of the day on which to start the build, in 24-hour notation. This defaults to *, meaning every hour.
dayOfMonth
The day of the month to start a build. This defaults to *, meaning every day.
month
The month in which to start the build, with January = 1. This defaults to *, meaning every month.
dayOfWeek
The day of the week to start a build, with Monday = 0. This defaults to *, meaning every day of the week.

For example, the following master.cfg clause will cause a build to be started every night at 3:00am:

from buildbot.schedulers import timed
c['schedulers'].append(
    timed.Nightly(name='nightly',
        branch='master',
        builderNames=['builder1', 'builder2'],
        hour=3,
        minute=0))

This scheduler will perform a build each Monday morning at 6:23am and again at 8:23am, but only if someone has committed code in the interim:

c['schedulers'].append(
    timed.Nightly(name='BeforeWork',
         branch=`default`,
         builderNames=['builder1'],
         dayOfWeek=0,
         hour=[6,8],
         minute=23,
         onlyIfChanged=True))

The following runs a build every two hours, using Python's range function:

c.schedulers.append(
    timed.Nightly(name='every2hours',
        branch=None, # default branch
        builderNames=['builder1'],
        hour=range(0, 24, 2)))

Finally, this example will run only on December 24th:

c['schedulers'].append(
    timed.Nightly(name='SleighPreflightCheck',
        branch=None, # default branch
        builderNames=['flying_circuits', 'radar'],
        month=12,
        dayOfMonth=24,
        hour=12,
        minute=0))
Try Schedulers

This scheduler allows developers to use the buildbot try command to trigger builds of code they have not yet committed. See try for complete details.

Two implementations are available: Try_Jobdir and Try_Userpass. The former monitors a job directory, specified by the jobdir parameter, while the latter listens for PB connections on a specific port, and authenticates against userport.

The buildmaster must have a scheduler instance in the config file's schedulers list to receive try requests. This lets the administrator control who may initiate these trial builds, which branches are eligible for trial builds, and which Builders should be used for them.

The scheduler has various means to accept build requests. All of them enforce more security than the usual buildmaster ports do. Any source code being built can be used to compromise the buildslave accounts, but in general that code must be checked out from the VC repository first, so only people with commit privileges can get control of the buildslaves. The usual force-build control channels can waste buildslave time but do not allow arbitrary commands to be executed by people who don't have those commit privileges. However, the source code patch that is provided with the trial build does not have to go through the VC system first, so it is important to make sure these builds cannot be abused by a non-committer to acquire as much control over the buildslaves as a committer has. Ideally, only developers who have commit access to the VC repository would be able to start trial builds, but unfortunately the buildmaster does not, in general, have access to VC system's user list.

As a result, the try scheduler requires a bit more configuration. There are currently two ways to set this up:

jobdir (ssh)

This approach creates a command queue directory, called the jobdir, in the buildmaster's working directory. The buildmaster admin sets the ownership and permissions of this directory to only grant write access to the desired set of developers, all of whom must have accounts on the machine. The buildbot try command creates a special file containing the source stamp information and drops it in the jobdir, just like a standard maildir. When the buildmaster notices the new file, it unpacks the information inside and starts the builds.

The config file entries used by 'buildbot try' either specify a local queuedir (for which write and mv are used) or a remote one (using scp and ssh).

The advantage of this scheme is that it is quite secure, the disadvantage is that it requires fiddling outside the buildmaster config (to set the permissions on the jobdir correctly). If the buildmaster machine happens to also house the VC repository, then it can be fairly easy to keep the VC userlist in sync with the trial-build userlist. If they are on different machines, this will be much more of a hassle. It may also involve granting developer accounts on a machine that would not otherwise require them.

To implement this, the buildslave invokes ssh -l username host buildbot tryserver ARGS, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information.

user+password (PB)

In this approach, each developer gets a username/password pair, which are all listed in the buildmaster's configuration file. When the developer runs buildbot try, their machine connects to the buildmaster via PB and authenticates themselves using that username and password, then sends a PB command to start the trial build.

The advantage of this scheme is that the entire configuration is performed inside the buildmaster's config file. The disadvantages are that it is less secure (while the cred authentication system does not expose the password in plaintext over the wire, it does not offer most of the other security properties that SSH does). In addition, the buildmaster admin is responsible for maintaining the username/password list, adding and deleting entries as developers come and go.

For example, to set up the jobdir style of trial build, using a command queue directory of MASTERDIR/jobdir (and assuming that all your project developers were members of the developers unix group), you would first set up that directory:

mkdir -p MASTERDIR/jobdir MASTERDIR/jobdir/new MASTERDIR/jobdir/cur MASTERDIR/jobdir/tmp
chgrp developers MASTERDIR/jobdir MASTERDIR/jobdir/*
chmod g+rwx,o-rwx MASTERDIR/jobdir MASTERDIR/jobdir/*

and then use the following scheduler in the buildmaster's config file:

from buildbot.schedulers.trysched import Try_Jobdir
s = Try_Jobdir(name="try1",
               builderNames=["full-linux", "full-netbsd", "full-OSX"],
               jobdir="jobdir")
c['schedulers'] = [s]

Note that you must create the jobdir before telling the buildmaster to use this configuration, otherwise you will get an error. Also remember that the buildmaster must be able to read and write to the jobdir as well. Be sure to watch the twistd.log file (Logfiles) as you start using the jobdir, to make sure the buildmaster is happy with it.

Note

Patches in the jobdir are encoded using netstrings, which place an arbitrary upper limit on patch size of 99999 bytes. If your submitted try jobs are rejected with BadJobfile, try increasing this limit with a snippet like this in your master.cfg:

from twisted.protocols.basic import NetstringReceiver
NetstringReceiver.MAX_LENGTH = 1000000

To use the username/password form of authentication, create a Try_Userpass instance instead. It takes the same builderNames argument as the Try_Jobdir form, but accepts an additional port argument (to specify the TCP port to listen on) and a userpass list of username/password pairs to accept. Remember to use good passwords for this: the security of the buildslave accounts depends upon it:

from buildbot.schedulers.trysched import Try_Userpass
s = Try_Userpass(name="try2",
                 builderNames=["full-linux", "full-netbsd", "full-OSX"],
                 port=8031,
                 userpass=[("alice","pw1"), ("bob", "pw2")] )
c['schedulers'] = [s]

Like most places in the buildbot, the port argument takes a strports specification. See twisted.application.strports for details.

Triggerable Scheduler

The Triggerable scheduler waits to be triggered by a Trigger step (see Triggering Schedulers) in another build. That step can optionally wait for the scheduler's builds to complete. This provides two advantages over Dependent schedulers. First, the same scheduler can be triggered from multiple builds. Second, the ability to wait for a Triggerable's builds to complete provides a form of "subroutine call", where one or more builds can "call" a scheduler to perform some work for them, perhaps on other buildslaves. The Triggerable-Scheduler supports multiple codebases. The scheduler filters out all codebases from Trigger steps that are not configured in the scheduler.

The parameters are just the basics:

name

builderNames

properties

codebases
See Configuring Schedulers.

This class is only useful in conjunction with the Trigger step. Here is a fully-worked example:

from buildbot.schedulers import basic, timed, triggerable
from buildbot.process import factory
from buildbot.steps import trigger

checkin = basic.SingleBranchScheduler(name="checkin",
            branch=None,
            treeStableTimer=5*60,
            builderNames=["checkin"])
nightly = timed.Nightly(name='nightly',
            branch=None,
            builderNames=['nightly'],
            hour=3,
            minute=0)

mktarball = triggerable.Triggerable(name="mktarball",
                builderNames=["mktarball"])
build = triggerable.Triggerable(name="build-all-platforms",
                builderNames=["build-all-platforms"])
test = triggerable.Triggerable(name="distributed-test",
                builderNames=["distributed-test"])
package = triggerable.Triggerable(name="package-all-platforms",
                builderNames=["package-all-platforms"])

c['schedulers'] = [mktarball, checkin, nightly, build, test, package]

# on checkin, make a tarball, build it, and test it
checkin_factory = factory.BuildFactory()
checkin_factory.addStep(trigger.Trigger(schedulerNames=['mktarball'],
                                       waitForFinish=True))
checkin_factory.addStep(trigger.Trigger(schedulerNames=['build-all-platforms'],
                                   waitForFinish=True))
checkin_factory.addStep(trigger.Trigger(schedulerNames=['distributed-test'],
                                  waitForFinish=True))

# and every night, make a tarball, build it, and package it
nightly_factory = factory.BuildFactory()
nightly_factory.addStep(trigger.Trigger(schedulerNames=['mktarball'],
                                       waitForFinish=True))
nightly_factory.addStep(trigger.Trigger(schedulerNames=['build-all-platforms'],
                                   waitForFinish=True))
nightly_factory.addStep(trigger.Trigger(schedulerNames=['package-all-platforms'],
                                     waitForFinish=True))
NightlyTriggerable Scheduler
class buildbot.schedulers.timed.NightlyTriggerable

The NightlyTriggerable scheduler is a mix of the Nightly and Triggerable schedulers. This scheduler triggers builds at a particular time of day, week, or year, exactly as the Nightly scheduler. However, the source stamp set that is used that provided by the last Trigger step that targeted this scheduler.

The parameters are just the basics:

name

builderNames

properties

codebases
See Configuring Schedulers.

minute

hour

dayOfMonth

month

dayOfWeek
See Nightly.

This class is only useful in conjunction with the Trigger step. Note that waitForFinish is ignored by Trigger steps targeting this scheduler.

Here is a fully-worked example:

from buildbot.schedulers import basic, timed
from buildbot.process import factory
from buildbot.steps import shell, trigger

checkin = basic.SingleBranchScheduler(name="checkin",
            branch=None,
            treeStableTimer=5*60,
            builderNames=["checkin"])
nightly = timed.NightlyTriggerable(name='nightly',
            builderNames=['nightly'],
            hour=3,
            minute=0)

c['schedulers'] = [checkin, nightly]

# on checkin, run tests
checkin_factory = factory.BuildFactory()
checkin_factory.addStep(shell.Test())
checkin_factory.addStep(trigger.Trigger(schedulerNames=['nightly']))

# and every night, package the latest successful build
nightly_factory = factory.BuildFactory()
nightly_factory.addStep(shell.ShellCommand(command=['make', 'package']))
ForceScheduler Scheduler

The ForceScheduler scheduler is the way you can configure a force build form in the web UI.

In the builder/<builder-name> web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.

This allows you to customize exactly how the build form looks, which builders have a force build form (it might not make sense to force build every builder), and who is allowed to force builds on which builders.

The scheduler takes the following parameters:

name

builderNames

reason

A parameter specifying the reason for the build. The default value is a string parameter with value "force build".

reasonString

A string that will be used to create the build reason for the forced build. This string can contain the placeholders '%(owner)s' and '%(reason)s', which represents the value typed into the reason field.

username

A parameter specifying the project for the build. The default value is a username parameter,

codebases

A list of strings or CodebaseParameter specifying the codebases that should be presented. The default is a single codebase with no name.

properties

A list of parameters, one for each property. These can be arbitrary parameters, where the parameter's name is taken as the property name, or AnyPropertyParameter, which allows the web user to specify the property name.

buttonName

The name of the "submit" button on the resulting force-build form. This defaults to "Force Build".

An example may be better than long explanation. What you need in your config file is something like:

from buildbot.schedulers.forcesched import *

sch = ForceScheduler(name="force",
             builderNames=["my-builder"],

             # will generate a combo box
             branch=ChoiceStringParameter(name="branch",
                                    choices=["main","devel"], default="main"),

             # will generate a text input
             reason=StringParameter(name="reason",label="reason:<br>",
                                    required=True, size=80),

             # will generate nothing in the form, but revision, repository,
             # and project are needed by buildbot scheduling system so we
             # need to pass a value ("")
             revision=FixedParameter(name="revision", default=""),
             repository=FixedParameter(name="repository", default=""),
             project=FixedParameter(name="project", default=""),

             # in case you dont require authentication this will display
             # input for user to type his name
             username=UserNameParameter(label="your name:<br>", size=80),

             # A completely customized property list.  The name of the
             # property is the name of the parameter
             properties=[

                BooleanParameter(name="force_build_clean",
                            label="force a make clean", default=False),

                StringParameter(name="pull_url",
                    label="optionally give a public Git pull url:<br>",
                    default="", size=80)
             ]
             )
c['schedulers'].append(sch)
Authorization

The force scheduler uses the web status's authorization framework to determine which user has the right to force which build. Here is an example of code on how you can define which user has which right:

user_mapping = {
    re.compile("project1-builder"): ["project1-maintainer", "john"] ,
    re.compile("project2-builder"): ["project2-maintainer", "jack"],
    re.compile(".*"): ["root"]
}
def force_auth(user,  status):
    global user_mapping
    for r,users in user_mapping.items():
        if r.match(status.name):
            if user in users:
                    return True
    return False

# use authz_cfg in your WebStatus setup
authz_cfg=authz.Authz(
    auth=my_auth,
    forceBuild = force_auth,
)
ForceSched Parameters

Most of the arguments to ForceScheduler are "parameters". Several classes of parameters are available, each describing a different kind of input from a force-build form.

All parameter types have a few common arguments:

name (required)

The name of the parameter. For properties, this will correspond to the name of the property that your parameter will set. The name is also used internally as the identifier for in the HTML form.

label (optional; default is same as name)

The label of the parameter. This is what is displayed to the user. HTML is permitted here.

default (optional; default: "")

The default value for the parameter, that is used if there is no user input.

required (optional; default: False)

If this is true, then an error will be shown to user if there is no input in this field

The parameter types are:

FixedParameter
FixedParameter(name="branch", default="trunk"),

This parameter type will not be shown on the web form, and always generate a property with its default value.

StringParameter
StringParameter(name="pull_url",
    label="optionally give a public Git pull url:<br>",
    default="", size=80)

This parameter type will show a single-line text-entry box, and allow the user to enter an arbitrary string. It adds the following arguments:

regex (optional)

a string that will be compiled as a regex, and used to validate the input of this parameter

size (optional; default: 10)

The width of the input field (in characters)
TextParameter
StringParameter(name="comments",
    label="comments to be displayed to the user of the built binary",
    default="This is a development build", cols=60, rows=5)

This parameter type is similar to StringParameter, except that it is represented in the HTML form as a textarea, allowing multi-line input. It adds the StringParameter arguments, this type allows:

cols (optional; default: 80)

The number of columns the textarea will have

rows (optional; default: 20)

The number of rows the textarea will have

This class could be subclassed in order to have more customization e.g.

  • developer could send a list of Git branches to pull from
  • developer could send a list of gerrit changes to cherry-pick,
  • developer could send a shell script to amend the build.

beware of security issues anyway.

IntParameter
IntParameter(name="debug_level",
    label="debug level (1-10)", default=2)

This parameter type accepts an integer value using a text-entry box.

BooleanParameter
BooleanParameter(name="force_build_clean",
    label="force a make clean", default=False)

This type represents a boolean value. It will be presented as a checkbox.

UserNameParameter
UserNameParameter(label="your name:<br>", size=80)

This parameter type accepts a username. If authentication is active, it will use the authenticated user instead of displaying a text-entry box.

size (optional; default: 10)
The width of the input field (in characters)
need_email (optional; default True)
If true, require a full email address rather than arbitrary text.
ChoiceStringParameter
ChoiceStringParameter(name="branch",
    choices=["main","devel"], default="main")

This parameter type lets the user choose between several choices (e.g the list of branches you are supporting, or the test campaign to run). If multiple is false, then its result is a string - one of the choices. If multiple is true, then the result is a list of strings from the choices.

Note that for some use cases, the choices need to be generated dynamically. This can be done via subclassing and overiding the 'getChoices' member function. An example of this is provided by the source for the InheritBuildParameter class.

Its arguments, in addition to the common options, are:

choices

The list of available choices.

strict (optional; default: True)

If true, verify that the user's input is from the list. Note that this only affects the validation of the form request; even if this argument is False, there is no HTML form component available to enter an arbitrary value.

multiple

If true, then the user may select multiple choices.

Example:

ChoiceStringParameter(name="forced_tests",
    label = "smoke test campaign to run",
    default = default_tests,
    multiple = True,
    strict = True,
    choices = [ "test_builder1",
                "test_builder2",
                "test_builder3" ])

# .. and later base the schedulers to trigger off this property:

# triggers the tests depending on the property forced_test
builder1.factory.addStep(Trigger(name="Trigger tests",
                                schedulerNames=Property("forced_tests")))
CodebaseParameter
CodebaseParameter(codebase="myrepo")

This is a parameter group to specify a sourcestamp for a given codebase.

codebase

The name of the codebase.

branch (optional; default: StringParameter)

A parameter specifying the branch to build. The default value is a string parameter.

revision (optional; default: StringParameter)

A parameter specifying the revision to build. The default value is a string parameter.

repository (optional; default: StringParameter)

A parameter specifying the repository for the build. The default value is a string parameter.

project (optional; default: StringParameter)

A parameter specifying the project for the build. The default value is a string parameter.
InheritBuildParameter

This is a special parameter for inheriting force build properties from another build. The user is presented with a list of compatible builds from which to choose, and all forced-build parameters from the selected build are copied into the new build. The new parameter is:

compatible_builds

A function to find compatible builds in the build history. This function is given the master Status instance as first argument, and the current builder name as second argument, or None when forcing all builds.

Example:

def get_compatible_builds(status, builder):
    if builder == None: # this is the case for force_build_all
        return ["cannot generate build list here"]
    # find all successful builds in builder1 and builder2
    builds = []
    for builder in ["builder1","builder2"]:
        builder_status = status.getBuilder(builder)
        for num in xrange(1,40): # 40 last builds
            b = builder_status.getBuild(-num)
            if not b:
                continue
            if b.getResults() == FAILURE:
                continue
            builds.append(builder+"/"+str(b.getNumber()))
    return builds

# ...

sched = Scheduler(...,
    properties=[
        InheritBuildParameter(
            name="inherit",
            label="promote a build for merge",
            compatible_builds=get_compatible_builds,
            required = True),
            ])
BuildslaveChoiceParameter

This parameter allows a scheduler to require that a build is assigned to the chosen buildslave. The choice is assigned to the slavename property for the build. The enforceChosenSlave functor must be assigned to the canStartBuild parameter for the Builder.

Example:

from buildbot.process.builder import enforceChosenSlave

# schedulers:
ForceScheduler(
    # ...
    properties=[
        BuildslaveChoiceParameter(),
    ]
)

# builders:
BuilderConfig(
    # ...
    canStartBuild=enforceChosenSlave,
)
AnyPropertyParameter

This parameter type can only be used in properties, and allows the user to specify both the property name and value in the HTML form.

This Parameter is here to reimplement old Buildbot behavior, and should be avoided. Stricter parameter name and type should be preferred.

Buildslaves

The slaves configuration key specifies a list of known buildslaves. In the common case, each buildslave is defined by an instance of the BuildSlave class. It represents a standard, manually started machine that will try to connect to the buildbot master as a slave. Buildbot also supports "on-demand", or latent, buildslaves, which allow buildbot to dynamically start and stop buildslave instances.

Defining Buildslaves

A BuildSlave instance is created with a slavename and a slavepassword. These are the same two values that need to be provided to the buildslave administrator when they create the buildslave.

The slavename must be unique, of course. The password exists to prevent evildoers from interfering with the buildbot by inserting their own (broken) buildslaves into the system and thus displacing the real ones.

Buildslaves with an unrecognized slavename or a non-matching password will be rejected when they attempt to connect, and a message describing the problem will be written to the log file (see Logfiles).

A configuration for two slaves would look like:

from buildbot.buildslave import BuildSlave
c['slaves'] = [
    BuildSlave('bot-solaris', 'solarispasswd'),
    BuildSlave('bot-bsd', 'bsdpasswd'),
]
BuildSlave Options

BuildSlave objects can also be created with an optional properties argument, a dictionary specifying properties that will be available to any builds performed on this slave. For example:

c['slaves'] = [
    BuildSlave('bot-solaris', 'solarispasswd',
                properties={ 'os':'solaris' }),
]

The BuildSlave constructor can also take an optional max_builds parameter to limit the number of builds that it will execute simultaneously:

c['slaves'] = [
    BuildSlave("bot-linux", "linuxpassword", max_builds=2)
]
Master-Slave TCP Keepalive

By default, the buildmaster sends a simple, non-blocking message to each slave every hour. These keepalives ensure that traffic is flowing over the underlying TCP connection, allowing the system's network stack to detect any problems before a build is started.

The interval can be modified by specifying the interval in seconds using the keepalive_interval parameter of BuildSlave:

c['slaves'] = [
    BuildSlave('bot-linux', 'linuxpasswd',
                keepalive_interval=3600),
]

The interval can be set to None to disable this functionality altogether.

When Buildslaves Go Missing

Sometimes, the buildslaves go away. One very common reason for this is when the buildslave process is started once (manually) and left running, but then later the machine reboots and the process is not automatically restarted.

If you'd like to have the administrator of the buildslave (or other people) be notified by email when the buildslave has been missing for too long, just add the notify_on_missing= argument to the BuildSlave definition. This value can be a single email address, or a list of addresses:

c['slaves'] = [
    BuildSlave('bot-solaris', 'solarispasswd',
                notify_on_missing="bob@example.com"),
]

By default, this will send email when the buildslave has been disconnected for more than one hour. Only one email per connection-loss event will be sent. To change the timeout, use missing_timeout= and give it a number of seconds (the default is 3600).

You can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one:

c['slaves'] = [
    BuildSlave('bot-solaris', 'solarispasswd',
                notify_on_missing=["bob@example.com",
                                    "alice@example.org"],
                missing_timeout=300, # notify after 5 minutes
    ),
]

The email sent this way will use a MailNotifier (see MailNotifier) status target, if one is configured. This provides a way for you to control the from address of the email, as well as the relayhost (aka smarthost) to use as an SMTP server. If no MailNotifier is configured on this buildmaster, the buildslave-missing emails will be sent using a default configuration.

Note that if you want to have a MailNotifier for buildslave-missing emails but not for regular build emails, just create one with builders=[], as follows:

from buildbot.status import mail
m = mail.MailNotifier(fromaddr="buildbot@localhost", builders=[],
                      relayhost="smtp.example.org")
c['status'].append(m)

from buildbot.buildslave import BuildSlave
c['slaves'] = [
        BuildSlave('bot-solaris', 'solarispasswd',
                    notify_on_missing="bob@example.com"),
]
Latent Buildslaves

The standard buildbot model has slaves started manually. The previous section described how to configure the master for this approach.

Another approach is to let the buildbot master start slaves when builds are ready, on-demand. Thanks to services such as Amazon Web Services' Elastic Compute Cloud ("AWS EC2"), this is relatively easy to set up, and can be very useful for some situations.

The buildslaves that are started on-demand are called "latent" buildslaves. As of this writing, buildbot ships with an abstract base class for building latent buildslaves, and a concrete implementation for AWS EC2 and for libvirt.

Common Options

The following options are available for all latent buildslaves.

build_wait_timeout
This option allows you to specify how long a latent slave should wait after a build for another build before it shuts down. It defaults to 10 minutes. If this is set to 0 then the slave will be shut down immediately. If it is less than 0 it will never automatically shutdown.
Amazon Web Services Elastic Compute Cloud ("AWS EC2")

EC2 is a web service that allows you to start virtual machines in an Amazon data center. Please see their website for details, including costs. Using the AWS EC2 latent buildslaves involves getting an EC2 account with AWS and setting up payment; customizing one or more EC2 machine images ("AMIs") on your desired operating system(s) and publishing them (privately if needed); and configuring the buildbot master to know how to start your customized images for "substantiating" your latent slaves.

Get an AWS EC2 Account

To start off, to use the AWS EC2 latent buildslave, you need to get an AWS developer account and sign up for EC2. Although Amazon often changes this process, these instructions should help you get started:

  1. Go to http://aws.amazon.com/ and click to "Sign Up Now" for an AWS account.
  2. Once you are logged into your account, you need to sign up for EC2. Instructions for how to do this have changed over time because Amazon changes their website, so the best advice is to hunt for it. After signing up for EC2, it may say it wants you to upload an x.509 cert. You will need this to create images (see below) but it is not technically necessary for the buildbot master configuration.
  3. You must enter a valid credit card before you will be able to use EC2. Do that under 'Payment Method'.
  4. Make sure you're signed up for EC2 by going to 'Your Account'->'Account Activity' and verifying EC2 is listed.
Create an AMI

Now you need to create an AMI and configure the master. You may need to run through this cycle a few times to get it working, but these instructions should get you started.

Creating an AMI is out of the scope of this document. The EC2 Getting Started Guide is a good resource for this task. Here are a few additional hints.

  • When an instance of the image starts, it needs to automatically start a buildbot slave that connects to your master (to create a buildbot slave, Creating a buildslave; to make a daemon, Launching the daemons).
  • You may want to make an instance of the buildbot slave, configure it as a standard buildslave in the master (i.e., not as a latent slave), and test and debug it that way before you turn it into an AMI and convert to a latent slave in the master.
Configure the Master with an EC2LatentBuildSlave

Now let's assume you have an AMI that should work with the EC2LatentBuildSlave. It's now time to set up your buildbot master configuration.

You will need some information from your AWS account: the Access Key Id and the Secret Access Key. If you've built the AMI yourself, you probably already are familiar with these values. If you have not, and someone has given you access to an AMI, these hints may help you find the necessary values:

  • While logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers".
  • On the page, you'll see alphanumeric values for "Your Access Key Id:" and "Your Secret Access Key:". Make a note of these. Later on, we'll call the first one your identifier and the second one your secret_identifier.

When creating an EC2LatentBuildSlave in the buildbot master configuration, the first three arguments are required. The name and password are the first two arguments, and work the same as with normal buildslaves. The next argument specifies the type of the EC2 virtual machine (available options as of this writing include m1.small, m1.large, m1.xlarge, c1.medium, and c1.xlarge; see the EC2 documentation for descriptions of these machines).

Here is the simplest example of configuring an EC2 latent buildslave. It specifies all necessary remaining values explicitly in the instantiation.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large',
                                   ami='ami-12345',
                                   identifier='publickey',
                                   secret_identifier='privatekey'
                                   )]

The ami argument specifies the AMI that the master should start. The identifier argument specifies the AWS Access Key Id, and the secret_identifier specifies the AWS Secret Access Key. Both the AMI and the account information can be specified in alternate ways.

Note

Whoever has your identifier and secret_identifier values can request AWS work charged to your account, so these values need to be carefully protected. Another way to specify these access keys is to put them in a separate file. You can then make the access privileges stricter for this separate file, and potentially let more people read your main configuration file.

By default, you can make an .ec2 directory in the home folder of the user running the buildbot master. In that directory, create a file called aws_id. The first line of that file should be your access key id; the second line should be your secret access key id. Then you can instantiate the build slave as follows.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large',
                                   ami='ami-12345')]

If you want to put the key information in another file, use the aws_id_file_path initialization argument.

Previous examples used a particular AMI. If the Buildbot master will be deployed in a process-controlled environment, it may be convenient to specify the AMI more flexibly. Rather than specifying an individual AMI, specify one or two AMI filters.

In all cases, the AMI that sorts last by its location (the S3 bucket and manifest name) will be preferred.

One available filter is to specify the acceptable AMI owners, by AWS account number (the 12 digit number, usually rendered in AWS with hyphens like "1234-5678-9012", should be entered as in integer).

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
bot1 = EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large',
                           valid_ami_owners=[11111111111,
                                             22222222222],
                           identifier='publickey',
                           secret_identifier='privatekey'
                           )

The other available filter is to provide a regular expression string that will be matched against each AMI's location (the S3 bucket and manifest name).

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
bot1 = EC2LatentBuildSlave(
    'bot1', 'sekrit', 'm1.large',
    valid_ami_location_regex=r'buildbot\-.*/image.manifest.xml',
    identifier='publickey', secret_identifier='privatekey')

The regular expression can specify a group, which will be preferred for the sorting. Only the first group is used; subsequent groups are ignored.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
bot1 = EC2LatentBuildSlave(
    'bot1', 'sekrit', 'm1.large',
    valid_ami_location_regex=r'buildbot\-.*\-(.*)/image.manifest.xml',
    identifier='publickey', secret_identifier='privatekey')

If the group can be cast to an integer, it will be. This allows 10 to sort after 1, for instance.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
bot1 = EC2LatentBuildSlave(
    'bot1', 'sekrit', 'm1.large',
    valid_ami_location_regex=r'buildbot\-.*\-(\d+)/image.manifest.xml',
    identifier='publickey', secret_identifier='privatekey')

In addition to using the password as a handshake between the master and the slave, you may want to use a firewall to assert that only machines from a specific IP can connect as slaves. This is possible with AWS EC2 by using the Elastic IP feature. To configure, generate a Elastic IP in AWS, and then specify it in your configuration using the elastic_ip argument.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large',
                                   'ami-12345',
                                   identifier='publickey',
                                   secret_identifier='privatekey',
                                   elastic_ip='208.77.188.166'
                                   )]

One other way to configure a slave is by settings AWS tags. They can for example be used to have a more restrictive security IAM policy. To get Buildbot to tag the latent slave specify the tag keys and values in your configuration using the tags argument.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large',
                                   'ami-12345',
                                   identifier='publickey',
                                   secret_identifier='privatekey',
                                   tags={'SomeTag': 'foo'}
                                   )]

The EC2LatentBuildSlave supports all other configuration from the standard BuildSlave. The missing_timeout and notify_on_missing specify how long to wait for an EC2 instance to attach before considering the attempt to have failed, and email addresses to alert, respectively. missing_timeout defaults to 20 minutes.

volumes expects a list of (volume_id, mount_point) tuples to attempt attaching when your instance has been created.

keypair_name and security_name allow you to specify different names for these AWS EC2 values. They both default to latent_buildbot_slave.

Spot instances

If you would prefer to use spot instances for running your builds, you can accomplish that by passing in a True value to the spot_instance parameter to the EC2LatentBuildSlave constructor. Additionally, you may want to specify max_spot_price and price_multiplier in order to limit your builds' budget consumption.

from buildbot.buildslave.ec2 import EC2LatentBuildSlave
c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large',
                                   'ami-12345', region='us-west-2',
                                   identifier='publickey',
                                   secret_identifier='privatekey',
                                   elastic_ip='208.77.188.166',
                                   placement='b', spot_instance=True,
                                   max_spot_price=0.09,
                                   price_multiplier=1.15
                                   )]

This example would attempt to create a m1.large spot instance in the us-west-2b region costing no more than $0.09/hour. The spot prices for that region in the last 24 hours will be averaged and multiplied by the price_multiplier parameter, then a spot request will be sent to Amazon with the above details. If the spot request is rejected, an error message will be logged with the final status.

Libvirt

libvirt is a virtualization API for interacting with the virtualization capabilities of recent versions of Linux and other OSes. It is LGPL and comes with a stable C API, and Python bindings.

This means we know have an API which when tied to buildbot allows us to have slaves that run under Xen, QEMU, KVM, LXC, OpenVZ, User Mode Linux, VirtualBox and VMWare.

The libvirt code in Buildbot was developed against libvirt 0.7.5 on Ubuntu Lucid. It is used with KVM to test Python code on Karmic VM's, but obviously isn't limited to that. Each build is run on a new VM, images are temporary and thrown away after each build.

Setting up libvirt

We won't show you how to set up libvirt as it is quite different on each platform, but there are a few things you should keep in mind.

  • If you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic.
  • If you are using the system libvirt, your buildbot master user will need to be in the libvirtd group.
  • If you are using KVM, your buildbot master user will need to be in the KVM group.
  • You need to think carefully about your virtual network first. Will NAT be enough? What IP will my VM's need to connect to for connecting to the master?
Configuring your base image

You need to create a base image for your builds that has everything needed to build your software. You need to configure the base image with a buildbot slave that is configured to connect to the master on boot.

Because this image may need updating a lot, we strongly suggest scripting its creation.

If you want to have multiple slaves using the same base image it can be annoying to duplicate the image just to change the buildbot credentials. One option is to use libvirt's DHCP server to allocate an identity to the slave: DHCP sets a hostname, and the slave takes its identity from that.

Doing all this is really beyond the scope of the manual, but there is a vmbuilder script and a network.xml file to create such a DHCP server in contrib/ (Contrib Scripts) that should get you started:

sudo apt-get install ubuntu-vm-builder
sudo contrib/libvirt/vmbuilder

Should create an ubuntu/ folder with a suitable image in it.

virsh net-define contrib/libvirt/network.xml
virsh net-start buildbot-network

Should set up a KVM compatible libvirt network for your buildbot VM's to run on.

Configuring your Master

If you want to add a simple on demand VM to your setup, you only need the following. We set the username to minion1, the password to sekrit. The base image is called base_image and a copy of it will be made for the duration of the VM's life. That copy will be thrown away every time a build is complete.

from buildbot.buildslave.libvirt import LibVirtSlave, Connection
c['slaves'] = [LibVirtSlave('minion1', 'sekrit', Connection("qemu:///session"),
                            '/home/buildbot/images/minion1', '/home/buildbot/images/base_image')]

You can use virt-manager to define minion1 with the correct hardware. If you don't, buildbot won't be able to find a VM to start.

LibVirtSlave accepts the following arguments:

name
Both a buildbot username and the name of the virtual machine.
password
A password for the buildbot to login to the master with.
connection
Connection instance wrapping connection to libvirt.
hd_image
The path to a libvirt disk image, normally in qcow2 format when using KVM.
base_image
If given a base image, buildbot will clone it every time it starts a VM. This means you always have a clean environment to do your build in.
xml
If a VM isn't predefined in virt-manager, then you can instead provide XML like that used with virsh define. The VM will be created automatically when needed, and destroyed when not needed any longer.
OpenStack

OpenStack is a series of interconnected components that facilitates managing compute, storage, and network resources in a data center. It is available under the Apache License and has a REST interface along with a Python client.

Get an Account in an OpenStack cloud

Setting up OpenStack is outside the domain of this document. There are four account details necessary for the Buildbot master to interact with your OpenStack cloud: username, password, a tenant name, and the auth URL to use.

Create an Image

OpenStack supports a large number of image formats. OpenStack maintains a short list of prebuilt images; if the desired image is not listed, The OpenStack Compute Administration Manual is a good resource for creating new images. You need to configure the image with a buildbot slave to connect to the master on boot.

Configure the Master with an OpenStackLatentBuildSlave

With the configured image in hand, it is time to configure the buildbot master to create OpenStack instances of it. You will need the aforementioned account details. These are the same details set in either environment variables or passed as options to an OpenStack client.

OpenStackLatentBuildSlave accepts the following arguments:

name
The buildslave name.
password
A password for the buildslave to login to the master with.
flavor
The flavor ID to use for the instance.
image
A string containing the image UUID to use for the instance. A callable may instead be passed. It will be passed the list of available images and must return the image to use.

os_username

os_password

os_tenant_name

os_auth_url
The OpenStack authentication needed to create and delete instances. These are the same as the environment variables with uppercase names of the arguments.
meta
A dictionary of string key-value pairs to pass to the instance. These will be available under the metadata key from the metadata service.

Here is the simplest example of configuring an OpenStack latent buildslave.

from buildbot.buildslave.openstack import OpenStackLatentBuildSlave
c['slaves'] = [OpenStackLatentBuildSlave('bot2', 'sekrit',
                flavor=1, image='8ac9d4a4-5e03-48b0-acde-77a0345a9ab1',
                os_username='user', os_password='password',
                os_tenant_name='tenant',
                os_auth_url='http://127.0.0.1:35357/v2.0')]

The image argument also supports being given a callable. The callable will be passed the list of available images and must return the image to use. The invocation happens in a separate thread to prevent blocking the build master when interacting with OpenStack.

from buildbot.buildslave.openstack import OpenStackLatentBuildSlave

def find_image(images):
    # Sort oldest to newest.
    cmp_fn = lambda x,y: cmp(x.created, y.created)
    candidate_images = sorted(images, cmp=cmp_fn)
    # Return the oldest candiate image.
    return candidate_images[0]

c['slaves'] = [OpenStackLatentBuildSlave('bot2', 'sekrit',
                flavor=1, image=find_image,
                os_username='user', os_password='password',
                os_tenant_name='tenant',
                os_auth_url='http://127.0.0.1:35357/v2.0')]

OpenStackLatentBuildSlave supports all other configuration from the standard BuildSlave. The missing_timeout and notify_on_missing specify how long to wait for an OpenStack instance to attach before considering the attempt to have failed and email addresses to alert, respectively. missing_timeout defaults to 20 minutes.

Dangers with Latent Buildslaves

Any latent build slave that interacts with a for-fee service, such as the EC2LatentBuildSlave, brings significant risks. As already identified, the configuration will need access to account information that, if obtained by a criminal, can be used to charge services to your account. Also, bugs in the buildbot software may lead to unnecessary charges. In particular, if the master neglects to shut down an instance for some reason, a virtual machine may be running unnecessarily, charging against your account. Manual and/or automatic (e.g. nagios with a plugin using a library like boto) double-checking may be appropriate.

A comparatively trivial note is that currently if two instances try to attach to the same latent buildslave, it is likely that the system will become confused. This should not occur, unless, for instance, you configure a normal build slave to connect with the authentication of a latent buildbot. If this situation does occurs, stop all attached instances and restart the master.

Builder Configuration

The builders configuration key is a list of objects giving configuration for the Builders. For more information on the function of Builders in Buildbot, see the Concepts chapter. The class definition for the builder configuration is in buildbot.config. In the configuration file, its use looks like:

from buildbot.config import BuilderConfig
c['builders'] = [
    BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f_quick),
    BuilderConfig(name='thorough', slavename='bot1', factory=f_thorough),
]

BuilderConfig takes the following keyword arguments:

name
This specifies the Builder's name, which is used in status reports.

slavename

slavenames
These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the slaves configuration parameter. Each buildslave can accommodate multiple builders. The slavenames parameter can be a list of names, while slavename can specify only one slave.
factory
This is a buildbot.process.factory.BuildFactory instance which controls how the build is performed by defining the steps in the build. Full details appear in their own section, Build Factories.

Other optional keys may be set on each BuilderConfig:

builddir
Specifies the name of a subdirectory of the master's basedir in which everything related to this builder will be stored. This holds build status information. If not set, this parameter defaults to the builder name, with some characters escaped. Each builder must have a unique build directory.
slavebuilddir
Specifies the name of a subdirectory (under the slave's configured base directory) in which everything related to this builder will be placed on the buildslave. This is where checkouts, compiles, and tests are run. If not set, defaults to builddir. If a slave is connected to multiple builders that share the same slavebuilddir, make sure the slave is set to run one build at a time or ensure this is fine to run multiple builds from the same directory simultaneously.
category
If provided, this is a string that identifies a category for the builder to be a part of. Status clients can limit themselves to a subset of the available categories. A common use for this is to add new builders to your setup (for a new module, or for a new buildslave) that do not work correctly yet and allow you to integrate them with the active builders. You can put these new builders in a test category, make your main status clients ignore them, and have only private status clients pick them up. As soon as they work, you can move them over to the active category.
nextSlave
If provided, this is a function that controls which slave will be assigned future jobs. The function is passed two arguments, the Builder object which is assigning a new job, and a list of SlaveBuilder objects. The function should return one of the SlaveBuilder objects, or None if none of the available slaves should be used. As an example, for each slave in the list, slave.slave will be a BuildSlave object, and slave.slave.slavename is the slave's name. The function can optionally return a Deferred, which should fire with the same results.
nextBuild
If provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the Builder object which is assigning a new job, and a list of BuildRequest objects of pending builds. The function should return one of the BuildRequest objects, or None if none of the pending builds should be started. This function can optionally return a Deferred which should fire with the same results.
canStartBuild
If provided, this is a function that can veto whether a particular buildslave should be used for a given build request. The function is passed three arguments: the Builder, a BuildSlave, and a BuildRequest. The function should return True if the combination is acceptable, or False otherwise. This function can optionally return a Deferred which should fire with the same results.
locks
This argument specifies a list of locks that apply to this builder; see Interlocks.
env

A Builder may be given a dictionary of environment variables in this parameter. The variables are used in ShellCommand steps in builds created by this builder. The environment variables will override anything in the buildslave's environment. Variables passed directly to a ShellCommand will override variables of the same name passed to the Builder.

For example, if you have a pool of identical slaves it is often easier to manage variables like PATH from Buildbot rather than manually editing it inside of the slaves' environment.

f = factory.BuildFactory
f.addStep(ShellCommand(
              command=['bash', './configure']))
f.addStep(Compile())

c['builders'] = [
  BuilderConfig(name='test', factory=f,
        slavenames=['slave1', 'slave2', 'slave3', 'slave4'],
        env={'PATH': '/opt/local/bin:/opt/app/bin:/usr/local/bin:/usr/bin'}),
]

Unlike most builder configuration arguments, this argument can contain renderables.

mergeRequests
Specifies how build requests for this builder should be merged. See Merging Build Requests, below.
properties
A builder may be given a dictionary of Build Properties specific for this builder in this parameter. Those values can be used later on like other properties. Interpolate.
description
A builder may be given an arbitrary description, which will show up in the web status on the builder's page.
Merging Build Requests

When more than one build request is available for a builder, Buildbot can "merge" the requests into a single build. This is desirable when build requests arrive more quickly than the available slaves can satisfy them, but has the drawback that separate results for each build are not available.

Requests are only candidated for a merge if both requests have exactly the same codebases.

This behavior can be controlled globally, using the mergeRequests parameter, and on a per-Builder basis, using the mergeRequests argument to the Builder configuration. If mergeRequests is given, it completely overrides the global configuration.

For either configuration parameter, a value of True (the default) causes buildbot to merge BuildRequests that have "compatible" source stamps. Source stamps are compatible if:

  • their codebase, branch, project, and repository attributes match exactly;
  • neither source stamp has a patch (e.g., from a try scheduler); and
  • either both source stamps are associated with changes, or neither ar associated with changes but they have matching revisions.

This algorithm is implemented by the SourceStamp method canBeMergedWith.

A configuration value of False indicates that requests should never be merged.

The configuration value can also be a callable, specifying a custom merging function. See Merge Request Functions for details.

Prioritizing Builds

The BuilderConfig parameter nextBuild can be use to prioritize build requests within a builder. Note that this is orthogonal to Prioritizing Builders, which controls the order in which builders are called on to start their builds. The details of writing such a function are in Build Priority Functions.

Such a function can be provided to the BuilderConfig as follows:

def pickNextBuild(builder, requests):
    ...
c['builders'] = [
    BuilderConfig(name='test', factory=f,
        nextBuild=pickNextBuild,
        slavenames=['slave1', 'slave2', 'slave3', 'slave4']),
]

Build Factories

Each Builder is equipped with a build factory, which is defines the steps used to perform that particular type of build. This factory is created in the configuration file, and attached to a Builder through the factory element of its dictionary.

The steps used by these builds are defined in the next section, Build Steps.

Note

Build factories are used with builders, and are not added directly to the buildmaster configuration dictionary.

Defining a Build Factory

A BuildFactory defines the steps that every build will follow. Think of it as a glorified script. For example, a build factory which consists of an SVN checkout followed by a make build would be configured as follows:

from buildbot.steps import svn, shell
from buildbot.process import factory

f = factory.BuildFactory()
f.addStep(svn.SVN(svnurl="http://..", mode="incremental"))
f.addStep(shell.Compile(command=["make", "build"]))

This factory would then be attached to one builder (or several, if desired):

c['builders'].append(
    BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f))

It is also possible to pass a list of steps into the BuildFactory when it is created. Using addStep is usually simpler, but there are cases where is is more convenient to create the list of steps ahead of time, perhaps using some Python tricks to generate the steps.

from buildbot.steps import source, shell
from buildbot.process import factory

all_steps = [
    source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"),
    shell.Compile(command=["make", "build"]),
]
f = factory.BuildFactory(all_steps)

Finally, you can also add a sequence of steps all at once:

f.addSteps(all_steps)
Attributes

The following attributes can be set on a build factory after it is created, e.g.,

f = factory.BuildFactory()
f.useProgress = False
useProgress
(defaults to True): if True, the buildmaster keeps track of how long each step takes, so it can provide estimates of how long future builds will take. If builds are not expected to take a consistent amount of time (such as incremental builds in which a random set of files are recompiled or tested each time), this should be set to False to inhibit progress-tracking.
workdir

(defaults to 'build'): workdir given to every build step created by this factory as default. The workdir can be overridden in a build step definition.

If this attribute is set to a string, that string will be used for constructing the workdir (buildslave base + builder builddir + workdir). The attribute can also be a Python callable, for more complex cases, as described in Factory Workdir Functions.

Predefined Build Factories

Buildbot includes a few predefined build factories that perform common build sequences. In practice, these are rarely used, as every site has slightly different requirements, but the source for these factories may provide examples for implementation of those requirements.

GNUAutoconf
class buildbot.process.factory.GNUAutoconf

GNU Autoconf is a software portability tool, intended to make it possible to write programs in C (and other languages) which will run on a variety of UNIX-like systems. Most GNU software is built using autoconf. It is frequently used in combination with GNU automake. These tools both encourage a build process which usually looks like this:

% CONFIG_ENV=foo ./configure --with-flags
% make all
% make check
# make install

(except of course the Buildbot always skips the make install part).

The Buildbot's buildbot.process.factory.GNUAutoconf factory is designed to build projects which use GNU autoconf and/or automake. The configuration environment variables, the configure flags, and command lines used for the compile and test are all configurable, in general the default values will be suitable.

Example:

f = factory.GNUAutoconf(source=source.SVN(svnurl=URL, mode="copy"),
                        flags=["--disable-nls"])

Required Arguments:

source
This argument must be a step specification tuple that provides a BuildStep to generate the source tree.

Optional Arguments:

configure
The command used to configure the tree. Defaults to ./configure. Accepts either a string or a list of shell argv elements.
configureEnv
The environment used for the initial configuration step. This accepts a dictionary which will be merged into the buildslave's normal environment. This is commonly used to provide things like CFLAGS="-O2 -g" (to turn off debug symbols during the compile). Defaults to an empty dictionary.
configureFlags
A list of flags to be appended to the argument list of the configure command. This is commonly used to enable or disable specific features of the autoconf-controlled package, like ["--without-x"] to disable windowing support. Defaults to an empty list.
reconf
use autoreconf to generate the ./configure file, set to True to use a buildbot default autoreconf command, or define the command for the ShellCommand.
compile
this is a shell command or list of argv values which is used to actually compile the tree. It defaults to make all. If set to None, the compile step is skipped.
test
this is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to make check. If set to None, the test step is skipped.
distcheck
this is a shell command or list of argv values which is used to run the packaging test. It defaults to make distcheck. If set to None, the test step is skipped.
BasicBuildFactory
class buildbot.process.factory.BasicBuildFactory

This is a subclass of GNUAutoconf which assumes the source is in CVS, and uses mode='full' and method='clobber' to always build from a clean working copy.

BasicSVN
class buildbot.process.factory.BasicSVN

This class is similar to QuickBuildFactory, but uses SVN instead of CVS.

QuickBuildFactory
class buildbot.process.factory.QuickBuildFactory

The QuickBuildFactory class is a subclass of GNUAutoconf which assumes the source is in CVS, and uses mode='incremental' to get incremental updates.

The difference between a full build and a quick build is that quick builds are generally done incrementally, starting with the tree where the previous build was performed. That simply means that the source-checkout step should be given a mode='incremental' flag, to do the source update in-place.

In addition to that, this class sets the useProgress flag to False. Incremental builds will (or at least the ought to) compile as few files as necessary, so they will take an unpredictable amount of time to run. Therefore it would be misleading to claim to predict how long the build will take.

This class is probably not of use to new projects.

CPAN
class buildbot.process.factory.CPAN

Most Perl modules available from the CPAN archive use the MakeMaker module to provide configuration, build, and test services. The standard build routine for these modules looks like:

% perl Makefile.PL
% make
% make test
# make install

(except again Buildbot skips the install step)

Buildbot provides a CPAN factory to compile and test these projects.

Arguments:

source
(required): A step specification tuple, like that used by GNUAutoconf.
perl
A string which specifies the perl executable to use. Defaults to just perl.
Distutils
class buildbot.process.factory.Distutils

Most Python modules use the distutils package to provide configuration and build services. The standard build process looks like:

% python ./setup.py build
% python ./setup.py install

Unfortunately, although Python provides a standard unit-test framework named unittest, to the best of my knowledge distutils does not provide a standardized target to run such unit tests. (Please let me know if I'm wrong, and I will update this factory.)

The Distutils factory provides support for running the build part of this process. It accepts the same source= parameter as the other build factories.

Arguments:

source
(required): A step specification tuple, like that used by GNUAutoconf.
python
A string which specifies the python executable to use. Defaults to just python.
test
Provides a shell command which runs unit tests. This accepts either a string or a list. The default value is None, which disables the test step (since there is no common default command to run unit tests in distutils modules).
Trial
class buildbot.process.factory.Trial

Twisted provides a unit test tool named trial which provides a few improvements over Python's built-in unittest module. Many python projects which use Twisted for their networking or application services also use trial for their unit tests. These modules are usually built and tested with something like the following:

% python ./setup.py build
% PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test
% python ./setup.py install

Unfortunately, the build/lib directory into which the built/copied .py files are placed is actually architecture-dependent, and I do not yet know of a simple way to calculate its value. For many projects it is sufficient to import their libraries in place from the tree's base directory (PYTHONPATH=.).

In addition, the PROJECTNAME value where the test files are located is project-dependent: it is usually just the project's top-level library directory, as common practice suggests the unit test files are put in the test sub-module. This value cannot be guessed, the Trial class must be told where to find the test files.

The Trial class provides support for building and testing projects which use distutils and trial. If the test module name is specified, trial will be invoked. The library path used for testing can also be set.

One advantage of trial is that the Buildbot happens to know how to parse trial output, letting it identify which tests passed and which ones failed. The Buildbot can then provide fine-grained reports about how many tests have failed, when individual tests fail when they had been passing previously, etc.

Another feature of trial is that you can give it a series of source .py files, and it will search them for special test-case-name tags that indicate which test cases provide coverage for that file. Trial can then run just the appropriate tests. This is useful for quick builds, where you want to only run the test cases that cover the changed functionality.

Arguments:

testpath
Provides a directory to add to PYTHONPATH when running the unit tests, if tests are being run. Defaults to . to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be build/lib for pure-python modules.
python
which Python executable to use. This list will form the start of the argv array that will launch trial. If you use this, you should set trial to an explicit path (like /usr/bin/trial or ./bin/trial). The parameter defaults to None, which leaves it out entirely (running trial args instead of python ./bin/trial args). Likely values are ['python'], ['python2.2'], or ['python', '-Wall'].
trial
provides the name of the trial command. It is occasionally useful to use an alternate executable, such as trial2.2 which might run the tests under an older version of Python. Defaults to trial.
trialMode
a list of arguments to pass to trial, specifically to set the reporting mode. This defaults to ['--reporter=bwverbose'], which only works for Twisted-2.1.0 and later.
trialArgs
a list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to [].
tests
Provides a module name or names which contain the unit tests for this project. Accepts a string, typically PROJECTNAME.test, or a list of strings. Defaults to None, indicating that no tests should be run. You must either set this or testChanges.
testChanges
if True, ignore the tests parameter and instead ask the Build for all the files that make up the Changes going into this build. Pass these filenames to trial and ask it to look for test-case-name tags, running just the tests necessary to cover the changes.
recurse
If True, tells Trial (with the --recurse argument) to look in all subdirectories for additional test cases.
reactor
which reactor to use, like 'gtk' or 'java'. If not provided, the Twisted's usual platform-dependent default is used.
randomly
If True, tells Trial (with the --random=0 argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to False.

The step can also take any of the ShellCommand arguments, e.g., haltOnFailure.

Unless one of tests or testChanges are set, the step will generate an exception.

Properties

Build properties are a generalized way to provide configuration information to build steps; see Build Properties for the conceptual overview of properties.

Some build properties come from external sources and are set before the build begins; others are set during the build, and available for later steps. The sources for properties are:

  • global configuration -- These properties apply to all builds.
  • schedulers -- A scheduler can specify properties that become available to all builds it starts.
  • changes -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the sendchange command.
  • forced builds -- The "Force Build" form allows users to specify properties
  • buildslaves -- A buildslave can pass properties on to the builds it performs.
  • builds -- A build automatically sets a number of properties on itself.
  • builders -- A builder can set properties on all the builds it runs.
  • steps -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the got_revision property.

If the same property is supplied in multiple places, the final appearance takes precedence. For example, a property set in a builder configuration will override one supplied by a scheduler.

Properties are stored internally in JSON format, so they are limited to basic types of data: numbers, strings, lists, and dictionaries.

Common Build Properties

The following build properties are set when the build is started, and are available to all steps.

got_revision

This property is set when a Source step checks out the source tree, and provides the revision that was actually obtained from the VC system. In general this should be the same as revision, except for non-absolute sourcestamps, where got_revision indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later.

Note

For some VC systems (Darcs in particular), the revision is a large string containing newlines, and is not suitable for interpolation into a filename.

For multi-codebase builds (where codebase is not the default ''), this property is a dictionary, keyed by codebase.

buildername
This is a string that indicates which Builder the build was a part of. The combination of buildername and buildnumber uniquely identify a build.
buildnumber
Each build gets a number, scoped to the Builder (so the first build performed on any given Builder will have a build number of 0). This integer property contains the build's number.
slavename
This is a string which identifies which buildslave the build is running on.
scheduler
If the build was started from a scheduler, then this property will contain the name of that scheduler.
workdir
The absolute path of the base working directory on the slave, of the current builder.

For single codebase builds, where the codebase is '', the following Source Stamp Attributes are also available as properties: branch, revision, repository, and project .

Source Stamp Attributes

branch revision repository project codebase

For details of these attributes see Concepts.

changes

This attribute is a list of dictionaries reperesnting the changes that make up this sourcestamp.
Using Properties in Steps

For the most part, properties are used to alter the behavior of build steps during a build. This is done by annotating the step definition in master.cfg with placeholders. When the step is executed, these placeholders will be replaced using the current values of the build properties.

Note

Properties are defined while a build is in progress; their values are not available when the configuration file is parsed. This can sometimes confuse newcomers to Buildbot! In particular, the following is a common error:

if Property('release_train') == 'alpha':
    f.addStep(...)

This does not work because the value of the property is not available when the if statement is executed. However, Python will not detect this as an error - you will just never see the step added to the factory.

You can use build properties in most step parameters. Please file bugs for any parameters which do not accept properties.

Property

The simplest form of annotation is to wrap the property name with Property:

from buildbot.steps.shell import ShellCommand
from buildbot.process.properties import Property

f.addStep(ShellCommand(command=[ 'echo', 'buildername:', Property('buildername') ]))

You can specify a default value by passing a default keyword argument:

f.addStep(ShellCommand(command=[ 'echo', 'warnings:',
                                 Property('warnings', default='none') ]))

The default value is used when the property doesn't exist, or when the value is something Python regards as False. The defaultWhenFalse argument can be set to False to force buildbot to use the default argument only if the parameter is not set:

f.addStep(ShellCommand(command=[ 'echo', 'warnings:',
                 Property('warnings', default='none', defaultWhenFalse=False) ]))

The default value can reference other properties, e.g.,

command=Property('command', default=Property('default-command'))
Interpolate

Property can only be used to replace an entire argument: in the example above, it replaces an argument to echo. Often, properties need to be interpolated into strings, instead. The tool for that job is Interpolate.

The more common pattern is to use Python dictionary-style string interpolation by using the %(prop:<propname>)s syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character").

from buildbot.steps.shell import ShellCommand
from buildbot.process.properties import Interpolate
f.addStep(ShellCommand(command=[ 'make', Interpolate('REVISION=%(prop:got_revision)s'),
                                 'dist' ]))

This example will result in a make command with an argument like REVISION=12098.

The syntax of dictionary-style interpolation is a selector, followed by a colon, followed by a selector specific key, optionally followed by a colon and a string indicating how to interpret the value produced by the key.

The following selectors are supported.

prop
The key is the name of a property.
src
The key is a codebase and source stamp attribute, separated by a colon.
kw
The key refers to a keyword argument passed to Interpolate.
slave
The key to the per-buildslave "info" dictionary (e.g., the "Slave information" properties shown in the buildslave web page for each buildslave)

The following ways of interpreting the value are available.

-replacement
If the key exists, substitute its value; otherwise, substitute replacement. replacement may be empty (%(prop:propname:-)s). This is the default.
~replacement
Like -replacement, but only substitutes the value of the key if it is something Python regards as True. Python considers None, 0, empty lists, and the empty string to be false, so such values will be replaced by replacement.
+replacement
If the key exists, substitute replacement; otherwise, substitute an empty string.

?|sub_if_exists|sub_if_missing

#?|sub_if_true|sub_if_false
Ternary substitution, depending on either the key being present (with ?, similar to +) or being True (with #?, like ~). Notice that there is a pipe immediately following the question mark and between the two substitution alternatives. The character that follows the question mark is used as the delimiter between the two alternatives. In the above examples, it is a pipe, but any character other than ( can be used.

Although these are similar to shell substitutions, no other substitutions are currently supported.

Example

from buildbot.steps.shell import ShellCommand
from buildbot.process.properties import Interpolate
f.addStep(ShellCommand(command=[ 'make', Interpolate('REVISION=%(prop:got_revision:-%(src::revision:-unknown)s)s'),
                                 'dist' ]))

In addition, Interpolate supports using positional string interpolation. Here, %s is used as a placeholder, and the substitutions (which may themselves be placeholders), are given as subsequent arguments:

TODO

Note

Like Python, you can use either positional interpolation or dictionary-style interpolation, not both. Thus you cannot use a string like Interpolate("foo-%(src::revision)s-%s", "branch").

Renderer

While Interpolate can handle many simple cases, and even some common conditionals, more complex cases are best handled with Python code. The renderer decorator creates a renderable object that will be replaced with the result of the function, called when the step it's passed to begins. The function receives an IProperties object, which it can use to examine the values of any and all properties. For example:

from buildbot.process import properties
@properties.renderer
def makeCommand(props):
    command = [ 'make' ]
    cpus = props.getProperty('CPUs')
    if cpus:
        command += [ '-j', str(cpus+1) ]
    else:
        command += [ '-j', '2' ]
    command += [ 'all' ]
    return command
f.addStep(ShellCommand(command=makeCommand))

You can think of renderer as saying "call this function when the step starts".

FlattenList

If nested list should be flatten for some renderables, FlattenList could be used. For example:

f.addStep(ShellCommand(command=[ 'make' ], descriptionDone=FlattenList([ 'make ', [ 'done' ]])))

descriptionDone would be set to [ 'make', 'done' ] when the ShellCommand executes. This is useful when a list-returning property is used in renderables.

Note

ShellCommand automatically flattens nested lists in its command argument, so there is no need to use FlattenList for it.

WithProperties

Warning

This placeholder is deprecated. It is an older version of Interpolate. It exists for compatibility with older configs.

The simplest use of this class is with positional string interpolation. Here, %s is used as a placeholder, and property names are given as subsequent arguments:

from buildbot.steps.shell import ShellCommand
from buildbot.process.properties import WithProperties
f.addStep(ShellCommand(
          command=["tar", "czf",
                   WithProperties("build-%s-%s.tar.gz", "branch", "revision"),
                   "source"]))

If this BuildStep were used in a tree obtained from Git, it would create a tarball with a name like build-master-a7d3a333db708e786edb34b6af646edd8d4d3ad9.tar.gz.

The more common pattern is to use Python dictionary-style string interpolation by using the %(propname)s syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character").

from buildbot.steps.shell import ShellCommand
from buildbot.process.properties import WithProperties
f.addStep(ShellCommand(command=[ 'make', WithProperties('REVISION=%(got_revision)s'),
                                 'dist' ]))

This example will result in a make command with an argument like REVISION=12098.

The dictionary-style interpolation supports a number of more advanced syntaxes in the parentheses.

propname:-replacement
If propname exists, substitute its value; otherwise, substitute replacement. replacement may be empty (%(propname:-)s)
propname:~replacement
Like propname:-replacement, but only substitutes the value of property propname if it is something Python regards as True. Python considers None, 0, empty lists, and the empty string to be false, so such values will be replaced by replacement.
propname:+replacement
If propname exists, substitute replacement; otherwise, substitute an empty string.

Although these are similar to shell substitutions, no other substitutions are currently supported, and replacement in the above cannot contain more substitutions.

Note: like Python, you can use either positional interpolation or dictionary-style interpolation, not both. Thus you cannot use a string like WithProperties("foo-%(revision)s-%s", "branch").

Custom Renderables

If the options described above are not sufficient, more complex substitutions can be achieved by writing custom renderables.

Renderables are objects providing the IRenderable interface. That interface is simple - objects must provide a getRenderingFor method. The method should take one argument - an IProperties provider - and should return a string or a deferred firing with a string. Pass instances of the class anywhere other renderables are accepted. For example:

class DetermineFoo(object):
    implements(IRenderable)
    def getRenderingFor(self, props):
        if props.hasProperty('bar'):
            return props['bar']
        elif props.hasProperty('baz'):
            return props['baz']
        return 'qux'
ShellCommand(command=['echo', DetermineFoo()])

or, more practically,

class Now(object):
    implements(IRenderable)
    def getRenderingFor(self, props):
        return time.clock()
ShellCommand(command=['make', Interpolate('TIME=%(kw:now)s', now=Now())])

This is equivalent to:

@renderer
def now(props):
    return time.clock()
ShellCommand(command=['make', Interpolate('TIME=%(kw:now)s', now=now)])

Note that a custom renderable must be instantiated (and its constructor can take whatever arguments you'd like), whereas a function decorated with renderer can be used directly.

Build Steps

BuildSteps are usually specified in the buildmaster's configuration file, in a list that goes into the BuildFactory. The BuildStep instances in this list are used as templates to construct new independent copies for each build (so that state can be kept on the BuildStep in one build without affecting a later build). Each BuildFactory can be created with a list of steps, or the factory can be created empty and then steps added to it using the addStep method:

from buildbot.steps import source, shell
from buildbot.process import factory

f = factory.BuildFactory()
f.addStep(source.SVN(svnurl="http://svn.example.org/Trunk/"))
f.addStep(shell.ShellCommand(command=["make", "all"]))
f.addStep(shell.ShellCommand(command=["make", "test"]))

The basic behavior for a BuildStep is to:

  • run for a while, then stop
  • possibly invoke some RemoteCommands on the attached build slave
  • possibly produce a set of log files
  • finish with a status described by one of four values defined in buildbot.status.builder: SUCCESS, WARNINGS, FAILURE, SKIPPED
  • provide a list of short strings to describe the step

The rest of this section describes all the standard BuildStep objects available for use in a Build, and the parameters which can be used to control each. A full list of build steps is available in the Build Step Index.

Common Parameters

All BuildSteps accept some common parameters. Some of these control how their individual status affects the overall build. Others are used to specify which Locks (see Interlocks) should be acquired before allowing the step to run.

Arguments common to all BuildStep subclasses:

name
the name used to describe the step on the status display. It is also used to give a name to any LogFiles created by this step.
haltOnFailure
if True, a FAILURE of this build step will cause the build to halt immediately. Steps with alwaysRun=True are still run. Generally speaking, haltOnFailure implies flunkOnFailure (the default for most BuildSteps). In some cases, particularly series of tests, it makes sense to haltOnFailure if something fails early on but not flunkOnFailure. This can be achieved with haltOnFailure=True, flunkOnFailure=False.
flunkOnWarnings
when True, a WARNINGS or FAILURE of this build step will mark the overall build as FAILURE. The remaining steps will still be executed.
flunkOnFailure
when True, a FAILURE of this build step will mark the overall build as a FAILURE. The remaining steps will still be executed.
warnOnWarnings
when True, a WARNINGS or FAILURE of this build step will mark the overall build as having WARNINGS. The remaining steps will still be executed.
warnOnFailure
when True, a FAILURE of this build step will mark the overall build as having WARNINGS. The remaining steps will still be executed.
alwaysRun
if True, this build step will always be run, even if a previous buildstep with haltOnFailure=True has failed.
description
This will be used to describe the command (on the Waterfall display) while the command is still running. It should be a single imperfect-tense verb, like compiling or testing. The preferred form is a list of short strings, which allows the HTML displays to create narrower columns by emitting a <br> tag between each word. You may also provide a single string.
descriptionDone

This will be used to describe the command once it has finished. A simple noun like compile or tests should be used. Like description, this may either be a list of short strings or a single string.

If neither description nor descriptionDone are set, the actual command arguments will be used to construct the description. This may be a bit too wide to fit comfortably on the Waterfall display.

All subclasses of BuildStep will contain the description attributes. Consequently, you could add a ShellCommand step like so:

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(command=["make", "test"],
                       description=["testing"],
                       descriptionDone=["tests"]))
descriptionSuffix

This is an optional suffix appended to the end of the description (ie, after description and descriptionDone). This can be used to distinguish between build steps that would display the same descriptions in the waterfall. This parameter may be set to list of short strings, a single string, or None.

For example, a builder might use the Compile step to build two different codebases. The descriptionSuffix could be set to projectFoo and projectBar, respectively for each step, which will result in the full descriptions compiling projectFoo and compiling projectBar to be shown in the waterfall.

doStepIf
A step can be configured to only run under certain conditions. To do this, set the step's doStepIf to a boolean value, or to a function that returns a boolean value or Deferred. If the value or function result is false, then the step will return SKIPPED without doing anything. Otherwise, the step will be executed normally. If you set doStepIf to a function, that function should accept one parameter, which will be the Step object itself.
hideStepIf

A step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's hideStepIf to a boolean value, or to a function that takes two parameters -- the results and the BuildStep -- and returns a boolean value. Steps are always shown while they execute, however after the step as finished, this parameter is evaluated (if a function) and if the value is True, the step is hidden. For example, in order to hide the step if the step has been skipped,

factory.addStep(Foo(..., hideStepIf=lambda results, s: results==SKIPPED))
locks
a list of Locks (instances of buildbot.locks.SlaveLock or buildbot.locks.MasterLock) that should be acquired before starting this Step. The Locks will be released when the step is complete. Note that this is a list of actual Lock instances, not names. Also note that all Locks must have unique names. See Interlocks.
Source Checkout

At the moment, Buildbot contains two implementations of most source steps. The new implementation handles most of the logic on the master side, and has a simpler, more unified approach. The older implementation (Source Checkout (Slave-Side)) handles the logic on the slave side, and some of the classes have a bewildering array of options.

Caution

Master-side source checkout steps are recently developed and not stable yet. If you find any bugs please report them on the Buildbot Trac. The older Slave-side described source steps are Source Checkout (Slave-Side).

The old source steps are imported like this:

from buildbot.steps.source import Git

while new source steps are in separate source-packages for each version-control system:

from buildbot.steps.source.git import Git

New users should, where possible, use the new implementations. The old implementations will be deprecated in a later release. Old users should take this opportunity to switch to the new implementations while both are supported by Buildbot.

Some version control systems have not yet been implemented as master-side steps. If you are interested in continued support for such a version control system, please consider helping the Buildbot developers to create such an implementation. In particular, version-control systems with proprietary licenses will not be supported without access to the version-control system for development.

Common Parameters

All source checkout steps accept some common parameters to control how they get the sources and where they should be placed. The remaining per-VC-system parameters are mostly to specify where exactly the sources are coming from.

mode method

These two parameters specify the means by which the source is checked out. mode specifies the type of checkout and method tells about the way to implement it.

factory = BuildFactory()
from buildbot.steps.source.mercurial import Mercurial
factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh'))

The mode parameter a string describing the kind of VC operation that is desired, defaulting to incremental. The options are

incremental
Update the source to the desired revision, but do not remove any other files generated by previous builds. This allows compilers to take advantage of object files from previous builds. This mode is exactly same as the old update mode.
full
Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files.

Methods are specific to the version-control system in question, as they may take advantage of special behaviors in that version-control system that can make checkouts more efficient or reliable.

workdir
like all Steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself).
alwaysUseLatest
if True, bypass the usual behavior of checking out the revision in the source stamp, and always update to the latest revision in the repository instead.
retry
If set, this specifies a tuple of (delay, repeats) which means that when a full VC checkout fails, it should be retried up to repeats times, waiting delay seconds between attempts. If you don't provide this, it defaults to None, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.
repository

The name of this parameter might vary depending on the Source step you are running. The concept explained here is common to all steps and applies to repourl as well as for baseURL (when applicable).

A common idiom is to pass Property('repository', 'url://default/repo/path') as repository. This grabs the repository from the source stamp of the build. This can be a security issue, if you allow force builds from the web, or have the WebStatus change hooks enabled; as the buildslave will download code from an arbitrary repository.

codebase
This specifies which codebase the source step should use to select the right source stamp. The default codebase value is ''. The codebase must correspond to a codebase assigned by the codebaseGenerator. If there is no codebaseGenerator defined in the master then codebase doesn't need to be set, the default value will then match all changes.
timeout
Specifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes).
logEnviron
If this option is true (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set logEnviron=False.
env
a dictionary of environment strings which will be added to the child command's environment. The usual property interpolations can be used in environment variable names and values - see Properties.
Mercurial
class buildbot.steps.source.mercurial.Mercurial

The Mercurial build step performs a Mercurial (aka hg) checkout or update.

Branches are available in two modes: dirname, where the name of the branch is a suffix of the name of the repository, or inrepo, which uses Hg's named-branches support. Make sure this setting matches your changehook, if you have that installed.

from buildbot.steps.source.mercurial import Mercurial
factory.addStep(Mercurial(repourl='path/to/repo', mode='full',
                          method='fresh', branchType='inrepo'))

The Mercurial step takes the following arguments:

repourl
where the Mercurial source repository is available.
defaultBranch
this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to repourl to create the string that will be passed to the hg clone command.
branchType
either 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the repourl or the branch is a Mercurial named branch and can be found within the repourl.
clobberOnBranchChange
boolean, defaults to True. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.

mode method

Mercurial's incremental mode does not require a method. The full mode has three methods defined:

clobber
It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository
fresh
This remove all other files except those tracked by VCS. First it does hg purge --all then pull/update
clean
All the files which are tracked by Mercurial and listed ignore files are not deleted. Remaining all other files will be deleted before pull/update. This is equivalent to hg purge then pull/update.
Git
class buildbot.steps.source.git.Git

The Git build step clones or updates a Git repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the git init command that the buildbot uses.

from buildbot.steps.source.git import Git
factory.addStep(Git(repourl='git://path/to/repo', mode='full',
                          method='clobber', submodules=True))

The Git step takes the following arguments:

repourl
(required): the URL of the upstream Git repository.
branch
(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the Build does not provide a branch, the default branch of the remote repository will be used.
submodules
(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: False.
shallow
(optional): instructs git to attempt shallow clones (--depth 1). This option can be used only in full builds with clobber method.
reference
(optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist.
progress
(optional): passes the (--progress) flag to (git fetch). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.
retryFetch
(optional): defaults to False. If true, if the git fetch fails then buildbot retries to fetch again instead of failing the entire source checkout.
clobberOnFailure
(optional): defaults to False. If a fetch or full clone fails we can checkout source removing everything. This way new repository will be cloned. If retry fails it fails the source checkout step.

mode

(optional): defaults to 'incremental'. Specifies whether to clean the build tree or not.

incremental
The source is update, but any built files are left untouched.
full
The build tree is clean of any built files. The exact method for doing this is controlled by the method argument.

method

(optional): defaults to fresh when mode is full. Git's incremental mode does not require a method. The full mode has four methods defined:

clobber
It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository. To make faster clones enable shallow option. If shallow options is enabled and build request have unknown revision value, then this step fails.
fresh
This remove all other files except those tracked by Git. First it does git clean -d -f -f -x then fetch/checkout to a specified revision(if any). This option is equal to update mode with ignore_ignores=True in old steps.
clean
All the files which are tracked by Git and listed ignore files are not deleted. Remaining all other files will be deleted before fetch/checkout. This is equivalent to git clean -d -f -f then fetch. This is equivalent to ignore_ignores=False in old steps.
copy
This first checkout source into source directory then copy the source directory to build directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in source directory.

getDescription

(optional) After checkout, invoke a git describe on the revision and save the result in a property; the property's name is either commit-description or commit-description-foo, depending on whether the codebase argument was also provided. The argument should either be a bool or dict, and will change how git describe is called:

  • getDescription=False: disables this feature explicitly

  • getDescription=True or empty dict(): Run git describe with no args

  • getDescription={...}: a dict with keys named the same as the Git option. Each key's value can be False or None to explicitly skip that argument.

    For the following keys, a value of True appends the same-named Git argument:

    • all : --all
    • always: --always
    • contains: --contains
    • debug: --debug
    • long: --long`
    • exact-match: --exact-match
    • tags: --tags
    • dirty: --dirty

    For the following keys, an integer or string value (depending on what Git expects) will set the argument's parameter appropriately. Examples show the key-value pair:

    • match=foo: --match foo
    • abbrev=7: --abbrev=7
    • candidates=7: --candidates=7
    • dirty=foo: --dirty=foo

config

(optional) A dict of git configuration settings to pass to the remote git commands.
SVN
class buildbot.steps.source.svn.SVN

The SVN build step performs a Subversion checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.

The SVN step should be created with the repourl argument:

repourl
(required): this specifies the URL argument that will be given to the svn checkout command. It dictates both where the repository is located and which sub-tree should be extracted. One way to specify the branch is to use Interpolate. For example, if you wanted to check out the trunk repository, you could use repourl=Interpolate("http://svn.example.com/repos/%(src::branch)s") Alternatively, if you are using a remote Subversion repository which is accessible through HTTP at a URL of http://svn.example.com/repos, and you wanted to check out the trunk/calc sub-tree, you would directly use repourl="http://svn.example.com/repos/trunk/calc" as an argument to your SVN step.

If you are building from multiple branches, then you should create the SVN step with the repourl and provide branch information with Interpolate:

from buildbot.steps.source.svn import SVN
factory.addStep(SVN(mode='incremental',
               repourl=Interpolate('svn://svn.example.org/svn/%(src::branch)s/myproject')))

Alternatively, the repourl argument can be used to create the SVN step without Interpolate:

from buildbot.steps.source.svn import SVN
factory.addStep(SVN(mode='full',
               repourl='svn://svn.example.org/svn/myproject/trunk'))
username
(optional): if specified, this will be passed to the svn binary with a --username option.
password
(optional): if specified, this will be passed to the svn binary with a --password option.
extra_args
(optional): if specified, an array of strings that will be passed as extra arguments to the svn binary.
keep_on_purge
(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.
depth

(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.

If set to empty updates will not pull in any files or subdirectories not already present. If set to files, updates will pull in any files not already present, but not directories. If set to immediates, updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to infinity, updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.

preferLastChangedRev
(optional): By default, the got_revision property is set to the repository's global revision ("Revision" in the svn info output). Set this parameter to True to have it set to the "Last Changed Rev" instead.

mode method

SVN's incremental mode does not require a method. The full mode has five methods defined:

clobber
It removes the working directory for each build then makes full checkout.
fresh
This always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a svn status --no-ignore. This is equivalent to the old update mode with always_purge.
clean
This is same as fresh except that it deletes all unversioned files generated by svn status.
copy
This first checkout source into source directory then copy the source directory to build directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in source directory.
export
Similar to method='copy', except using svn export to create build directory so that there are no .svn directories in the build directory.

If you are using branches, you must also make sure your ChangeSource will report the correct branch names.

CVS
class buildbot.steps.source.cvs.CVS

The CVS build step performs a CVS checkout or update.

from buildbot.steps.source.cvs import CVS
factory.addStep(CVS(mode='incremental',
               cvsroot=':pserver:me@cvs.sourceforge.net:/cvsroot/myproj',
               cvsmodule='buildbot'))

This step takes the following arguments:

cvsroot
(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, if Buildbot was hosted in CVS then the cvsroot value you would use to get a copy of the Buildbot source code might be :pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot.
cvsmodule
(required): specify the cvs module, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is buildbot.
branch
a string which will be used in a -r argument. This is most useful for specifying a branch to work on. Defaults to HEAD.
global_options
a list of flags to be put before the argument checkout in the CVS command.
extra_options
a list of flags to be put after the checkout in the CVS command.

mode method

No method is needed for incremental mode. For full mode, method can take the values shown below. If no value is given, it defaults to fresh.

clobber
This specifies to remove the workdir and make a full checkout.
fresh
This method first runs cvsdisard in the build directory, then updates it. This requires cvsdiscard which is a part of the cvsutil package.
clean
This method is the same as method='fresh', but it runs cvsdiscard --ignore instead of cvsdiscard.
copy
This maintains a source directory for source, which it updates copies to the build directory. This allows Buildbot to start with a fresh directory, without downloading the entire repository on every build.
Bzr
class buildbot.steps.source.bzr.Bzr

bzr is a descendant of Arch/Baz, and is frequently referred to as simply Bazaar. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial.

from buildbot.steps.source.bzr import Bzr
factory.addStep(Bzr(mode='incremental',
               repourl='lp:~knielsen/maria/tmp-buildbot-test'))

The step takes the following arguments:

repourl
(required unless baseURL is provided): the URL at which the Bzr source repository is available.
baseURL
(required unless repourl is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.
defaultBranch
(allowed if and only if baseURL is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to baseURL to create the string that will be passed to the bzr checkout command.

mode method

No method is needed for incremental mode. For full mode, method can take the values shown below. If no value is given, it defaults to fresh.

clobber
This specifies to remove the workdir and make a full checkout.
fresh
This method first runs bzr clean-tree to remove all the unversioned files then update the repo. This remove all unversioned files including those in .bzrignore.
clean
This is same as fresh except that it doesn't remove the files mentioned in .bzrginore i.e, by running bzr clean-tree --ignore.
copy
A local bzr repository is maintained and the repo is copied to build directory for each build. Before each build the local bzr repo is updated then copied to build for next steps.
P4
class buildbot.steps.source.p4.P4

The P4 build step creates a Perforce client specification and performs an update.

from buildbot.steps.source.p4 import P4
factory.addStep(P4(p4port=p4port,
                   p4client=WithProperties('%(P4USER)s-%(slavename)s-%(buildername)s'),
                   p4user=p4user,
                   p4base='//depot',
                   p4viewspec=p4viewspec,
                   mode='incremental',
                   ))

You can specify the client spec in two different ways. You can use the p4base, p4branch, and (optionally) p4extra_views to build up the viewspec, or you can utilize the p4viewspec to specify the whole viewspec as a set of tuples.

Using p4viewspec will allow you to add lines such as:

//depot/branch/mybranch/...             //<p4client>/...
-//depot/branch/mybranch/notthisdir/... //<p4client>/notthisdir/...

If you specify p4viewspec and any of p4base, p4branch, and/or p4extra_views you will receive a configuration error exception.

p4base
A view into the Perforce depot without branch name or trailing "/...". Typically //depot/proj.
p4branch
(optional): A single string, which is appended to the p4base as follows
<p4base>/<p4branch>/... to form the first line in the viewspec
p4extra_views
(optional): a list of (depotpath, clientpath) tuples containing extra views to be mapped into the client specification. Both will have /... appended automatically. The client name and source directory will be prepended to the client path.
p4viewspec

This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows:

[('//depot/main/','')]

It yields a viewspec with just:

//depot/main/... //<p4client>/...
p4viewspec_suffix

(optional): The p4viewspec lets you customize the client spec for a builder but, as the previous example shows, it automatically adds ... at the end of each line. If you need to also specify file-level remappings, you can set the p4viewspec_suffix to None so that nothing is added to your viewspec:

[('//depot/main/...', '...'),
 ('-//depot/main/config.xml', 'config.xml'),
 ('//depot/main/config.vancouver.xml', 'config.xml')]

It yields a viewspec with:

//depot/main/... //<p4client>/...
-//depot/main/config.xml //<p4client/main/config.xml
//depot/main/config.vancouver.xml //<p4client>/main/config.xml

Note how, with p4viewspec_suffix set to None, you need to manually add ... where you need it.

p4client_spec_options
(optional): By default, clients are created with the allwrite rmdir options. This string lets you change that.
p4port
(optional): the host:port string describing how to get to the P4 Depot (repository), used as the -p argument for all p4 commands.
p4user
(optional): the Perforce user, used as the -u argument to all p4 commands.
p4passwd
(optional): the Perforce password, used as the -p argument to all p4 commands.
p4client
(optional): The name of the client to use. In mode='full' and mode='incremental', it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is buildbot_%(slave)s_%(build)s.
p4line_end
(optional): The type of line ending handling P4 should use. This is added directly to the client spec's LineEnd property. The default is local.
p4extra_args

(optional): Extra arguments to be added to the P4 command-line for the sync command. So for instance if you want to sync only to populate a Perforce proxy (without actually syncing files to disk), you can do:

P4(p4extra_args=['-Zproxyload'], ...)
Repo
class buildbot.steps.source.repo.Repo

The Repo build step performs a Repo init and sync.

It is a drop-in replacement for Repo (Slave-Side), which should not be used anymore for new and old projects.

The Repo step takes the following arguments:

manifestURL
(required): the URL at which the Repo's manifests source repository is available.
manifestBranch
(optional, defaults to master): the manifest repository branch on which repo will take its manifest. Corresponds to the -b argument to the repo init command.
manifestFile
(optional, defaults to default.xml): the manifest filename. Corresponds to the -m argument to the repo init command.
tarball
(optional, defaults to None): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the .repo directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves.
jobs
(optional, defaults to None): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".
syncAllBranches
(optional, defaults to False): renderable boolean to control whether repo syncs all branches. i.e. repo sync -c
depth
(optional, defaults to 0): Depth argument passed to repo init. Specifies the amount of git history to store. A depth of 1 is useful for shallow clones. This can save considerable disk space on very large projects.
updateTarballAge
(optional, defaults to "one week"): renderable to control the policy of updating of the tarball given properties Returns: max age of tarball in seconds, or None, if we want to skip tarball update The default value should be good trade off on size of the tarball, and update frequency compared to cost of tarball creation
repoDownloads

(optional, defaults to None): list of repo download commands to perform at the end of the Repo step each string in the list will be prefixed repo download, and run as is. This means you can include parameter in the string. e.g:

  • ["-c project 1234/4"] will cherry-pick patchset 4 of patch 1234 in project project
  • ["-f project 1234/4"] will enforce fast-forward on patchset 4 of patch 1234 in project project
class buildbot.steps.source.repo.RepoDownloadsFromProperties

RepoDownloadsFromProperties can be used as a renderable of the repoDownload parameter it will look in passed properties for string with following possible format:

  • repo download project change_number/patchset_number.
  • project change_number/patchset_number.
  • project/change_number/patchset_number.

All of these properties will be translated into a repo download. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.

class buildbot.steps.source.repo.RepoDownloadsFromChangeSource

RepoDownloadsFromChangeSource can be used as a renderable of the repoDownload parameter

This rendereable integrates with GerritChangeSource, and will automatically use the repo download command of repo to download the additionnal changes introduced by a pending changeset.

Note

you can use the two above Rendereable in conjuction by using the class buildbot.process.properties.FlattenList

for example:

from buildbot.steps.source.repo import Repo, RepoDownloadsFromChangeSource,
from buildbot.steps.source.repo import RepoDownloadsFromProperties
from buildbot.process.properties import FlattenList

factory.addStep(Repo(manifestURL='git://mygerrit.org/manifest.git',
                     repoDownloads=FlattenList([RepoDownloadsFromChangeSource(),
                                                RepoDownloadsFromProperties("repo_downloads")
                                                ]
                                               )
                     ))
Gerrit
class buildbot.steps.source.gerrit.Gerrit

This Source step is exactly like the Git checkout step , except that it integrates with GerritChangeSource, and will automatically checkout the additional changes.

Gerrit integration can be also triggered using forced build with property named gerrit_change with values in format change_number/patchset_number. This property will be translated into a branch name. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.

Darcs
class buildbot.steps.source.darcs.Darcs

The :bb:step`Darcs` build step performs a Darcs checkout or update.

from buildbot.steps.source.darcs import Darcs
factory.addStep(Darcs(repourl='http://path/to/repo',
                      mode='full', method='clobber', retry=(10, 1)))

Darcs step takes the following arguments:

repourl
(required): The URL at which the Darcs source repository is available.

mode

(optional): defaults to 'incremental'. Specifies whether to clean the build tree or not.

incremental
The source is update, but any built files are left untouched.
full
The build tree is clean of any built files. The exact method for doing this is controlled by the method argument.
method

(optional): defaults to copy when mode is full. Darcs' incremental mode does not require a method. The full mode has two methods defined:

clobber
It removes the working directory for each build then makes full checkout.
copy
This first checkout source into source directory then copy the source directory to build directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in source directory.
Monotone
class buildbot.steps.source.mtn.Monotone

The Monotone build step performs a Monotone checkout or update.

from buildbot.steps.source.mtn import Monotone
factory.addStep(Darcs(repourl='http://path/to/repo',
                      mode='full', method='clobber', branch='some.branch.name',
                      retry=(10, 1)))

Monotone step takes the following arguments:

repourl
the URL at which the Monotone source repository is available.
branch
this specifies the name of the branch to use when a Build does not provide one of its own.
progress
this is a boolean that has a pull from the repository use --ticker=dot instead of the default --ticker=none.

mode

(optional): defaults to 'incremental'. Specifies whether to clean the build tree or not.

incremental
The source is update, but any built files are left untouched.
full
The build tree is clean of any built files. The exact method for doing this is controlled by the method argument.

method

(optional): defaults to copy when mode is full. Monotone's incremental mode does not require a method. The full mode has four methods defined:

clobber
It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository.
clean
This remove all other files except those tracked and ignored by Monotone. It will remove all the files that appear in mtn ls unknown. Then it will pull from remote and update the working directory.
fresh
This remove all other files except those tracked by Monotone. It will remove all the files that appear in mtn ls ignored and mtn ls unknows. Then pull and update similar to clean
copy
This first checkout source into source directory then copy the source directory to build directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in source directory.
Source Checkout (Slave-Side)

This section describes the more mature slave-side source steps. Where possible, new users should use the master-side source checkout steps, as the slave-side steps will be removed in a future version. See Source Checkout.

The first step of any build is typically to acquire the source code from which the build will be performed. There are several classes to handle this, one for each of the different source control system that Buildbot knows about. For a description of how Buildbot treats source control in general, see Version Control Systems.

All source checkout steps accept some common parameters to control how they get the sources and where they should be placed. The remaining per-VC-system parameters are mostly to specify where exactly the sources are coming from.

mode

a string describing the kind of VC operation that is desired. Defaults to update.

update
specifies that the CVS checkout/update should be performed directly into the workdir. Each build is performed in the same directory, allowing for incremental builds. This minimizes disk space, bandwidth, and CPU time. However, it may encounter problems if the build process does not handle dependencies properly (sometimes you must do a clean build to make sure everything gets compiled), or if source files are deleted but generated files can influence test behavior (e.g. Python's .pyc files), or when source directories are deleted but generated files prevent CVS from removing them. Builds ought to be correct regardless of whether they are done from scratch or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style.
copy
specifies that the CVS workspace should be maintained in a separate directory (called the copydir), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (rm -rf workdir; cp -r copydir workdir). This doubles the disk space required, but keeps the bandwidth low (update instead of a full checkout). A full 'clean' build is performed each time. This avoids any generated-file build problems, but is still occasionally vulnerable to CVS problems such as a repository being manually rearranged, causing CVS errors on update which are not an issue with a full checkout.
clobber
specifies that the working directory should be deleted each time, necessitating a full checkout for each build. This insures a clean build off a complete checkout, avoiding any of the problems described above. This mode exercises the from-scratch build style.
export
this is like clobber, except that the cvs export command is used to create the working directory. This command removes all CVS metadata files (the CVS/ directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file).
workdir
As for all steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself).
alwaysUseLatest
if True, bypass the usual update to the last Change behavior, and always update to the latest changes instead.
retry
If set, this specifies a tuple of (delay, repeats) which means that when a full VC checkout fails, it should be retried up to repeats times, waiting delay seconds between attempts. If you don't provide this, it defaults to None, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.
repository

The name of this parameter might varies depending on the Source step you are running. The concept explained here is common to all steps and applies to repourl as well as for baseURL (when applicable). Buildbot, now being aware of the repository name via the change source, might in some cases not need the repository url. There are multiple way to pass it through to this step, those correspond to the type of the parameter given to this step:

None
In the case where no parameter is specified, the repository url will be taken exactly from the Change attribute. You are looking for that one if your ChangeSource step has all information about how to reach the Change.
string
The parameter might be a string, in this case, this string will be taken as the repository url, and nothing more. the value coming from the ChangeSource step will be forgotten.
format string
If the parameter is a string containing %s, then this the repository attribute from the Change will be place in place of the %s. This is useful when the change source knows where the repository resides locally, but don't know the scheme used to access it. For instance ssh://server/%s makes sense if the the repository attribute is the local path of the repository.
dict
In this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter.
callable
The callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL.

Note

this is quite similar to the mechanism used by the WebStatus for the changecommentlink, projects or repositories parameter.

timeout
Specifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes).

My habit as a developer is to do a cvs update and make each morning. Problems can occur, either because of bad code being checked in, or by incomplete dependencies causing a partial rebuild to fail where a complete from-scratch build might succeed. A quick Builder which emulates this incremental-build behavior would use the mode='update' setting.

On the other hand, other kinds of dependency problems can cause a clean build to fail where a partial build might succeed. This frequently results from a link step that depends upon an object file that was removed from a later version of the tree: in the partial tree, the object file is still around (even though the Makefiles no longer know how to create it).

official builds (traceable builds performed from a known set of source revisions) are always done as clean builds, to make sure it is not influenced by any uncontrolled factors (like leftover files from a previous build). A full Builder which behaves this way would want to use the mode='clobber' setting.

Each VC system has a corresponding source checkout class: their arguments are described on the following pages.

CVS (Slave-Side)

The CVS build step performs a CVS checkout or update. It takes the following arguments:

cvsroot
(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, the cvsroot value you would use to get a copy of the Buildbot source code is :pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot
cvsmodule
(required): specify the cvs module, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is buildbot.
branch
a string which will be used in a -r argument. This is most useful for specifying a branch to work on. Defaults to HEAD.
global_options
a list of flags to be put before the verb in the CVS command.

checkout_options

export_options

extra_options
a list of flags to be put after the verb in the CVS command. checkout_options is only used for checkout operations, export_options is only used for export operations, and extra_options is used for both.
checkoutDelay
if set, the number of seconds to put between the timestamp of the last known Change and the value used for the -D option. Defaults to half of the parent Build's treeStableTimer.
SVN (Slave-Side)

The SVN build step performs a Subversion checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.

The most versatile way to create the SVN step is with the svnurl argument:

svnurl
(required): this specifies the URL argument that will be given to the svn checkout command. It dictates both where the repository is located and which sub-tree should be extracted. In this respect, it is like a combination of the CVS cvsroot and cvsmodule arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of http://svn.example.com/repos, and you wanted to check out the trunk/calc sub-tree, you would use svnurl="http://svn.example.com/repos/trunk/calc" as an argument to your SVN step.

The svnurl argument can be considered as a universal means to create the SVN step as it ignores the branch information in the SourceStamp.

Alternatively, if you are building from multiple branches, then you should preferentially create the SVN step with the baseURL and defaultBranch arguments instead:

baseURL
(required): this specifies the base repository URL, to which a branch name will be appended. It should probably end in a slash.
defaultBranch

(optional): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to baseURL to create the string that will be passed to the svn checkout command.

It is possible to mix to have a mix of SVN steps that use either the svnurl or baseURL arguments but not both at the same time.

username
(optional): if specified, this will be passed to the svn binary with a --username option.
password
(optional): if specified, this will be passed to the svn binary with a --password option. The password itself will be suitably obfuscated in the logs.
extra_args
(optional): if specified, an array of strings that will be passed as extra arguments to the svn binary.
keep_on_purge
(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.
ignore_ignores
(optional): when purging changes, don't use rules defined in svn:ignore properties and global-ignores in subversion/config.
always_purge
(optional): if set to True, always purge local changes before updating. This deletes unversioned files and reverts everything that would appear in a svn status.
depth

(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.

If set to "empty" updates will not pull in any files or subdirectories not already present. If set to "files", updates will pull in any files not already present, but not directories. If set to "immediates", updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to "infinity", updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.

If you are using branches, you must also make sure your ChangeSource will report the correct branch names.

Darcs (Slave-Side)

The Darcs build step performs a Darcs checkout or update.

Like SVN, this step can either be configured to always check out a specific tree, or set up to pull from a particular branch that gets specified separately for each build. Also like SVN, the repository URL given to Darcs is created by concatenating a baseURL with the branch name, and if no particular branch is requested, it uses a defaultBranch. The only difference in usage is that each potential Darcs repository URL must point to a fully-fledged repository, whereas SVN URLs usually point to sub-trees of the main Subversion repository. In other words, doing an SVN checkout of baseURL is legal, but silly, since you'd probably wind up with a copy of every single branch in the whole repository. Doing a Darcs checkout of baseURL is just plain wrong, since the parent directory of a collection of Darcs repositories is not itself a valid repository.

The Darcs step takes the following arguments:

repourl
(required unless baseURL is provided): the URL at which the Darcs source repository is available.
baseURL
(required unless repourl is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.
defaultBranch
(allowed if and only if baseURL is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to baseURL to create the string that will be passed to the darcs get command.
Mercurial (Slave-Side)

The Mercurial build step performs a Mercurial (aka hg) checkout or update.

Branches are available in two modes: dirname like Darcs, or inrepo, which uses the repository internal branches. Make sure this setting matches your changehook, if you have that installed.

The Mercurial step takes the following arguments:

repourl
(required unless baseURL is provided): the URL at which the Mercurial source repository is available.
baseURL
(required unless repourl is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.
defaultBranch
(allowed if and only if baseURL is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to baseURL to create the string that will be passed to the hg clone command.
branchType
either 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the baseURL or the branch is a Mercurial named branch and can be found within the repourl.
clobberOnBranchChange
boolean, defaults to True. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.
Bzr (Slave-Side)

bzr is a descendant of Arch/Baz, and is frequently referred to as simply Bazaar. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial. It takes the following arguments:

repourl
(required unless baseURL is provided): the URL at which the Bzr source repository is available.
baseURL
(required unless repourl is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.
defaultBranch
(allowed if and only if baseURL is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to baseURL to create the string that will be passed to the bzr checkout command.
forceSharedRepo
(boolean, optional, defaults to False): If set to True, the working directory will be made into a bzr shared repository if it is not already. Shared repository greatly reduces the amount of history data that needs to be downloaded if not using update/copy mode, or if using update/copy mode with multiple branches.
P4 (Slave-Side)

The P4 (Slave-Side) build step creates a Perforce client specification and performs an update.

p4base
A view into the Perforce depot without branch name or trailing "...". Typically //depot/proj/.
defaultBranch
A branch name to append on build requests if none is specified. Typically trunk.
p4port
(optional): the host:port string describing how to get to the P4 Depot (repository), used as the -p argument for all p4 commands.
p4user
(optional): the Perforce user, used as the -u argument to all p4 commands.
p4passwd
(optional): the Perforce password, used as the -p argument to all p4 commands.
p4extra_views
(optional): a list of (depotpath, clientpath) tuples containing extra views to be mapped into the client specification. Both will have "/..." appended automatically. The client name and source directory will be prepended to the client path.
p4client
(optional): The name of the client to use. In mode='copy' and mode='update', it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is buildbot_%(slave)s_%(build)s.
p4line_end
(optional): The type of line ending handling P4 should use. This is added directly to the client spec's LineEnd property. The default is local.
Git (Slave-Side)

The Git build step clones or updates a Git repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the git init command that the buildbot uses.

The Git step takes the following arguments:

repourl
(required): the URL of the upstream Git repository.
branch
(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the Build does not provide a branch, the master branch will be used.
ignore_ignores
(optional): when purging changes, don't use .gitignore and .git/info/exclude.
submodules
(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: False.
reference
(optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist.
shallow
(optional): instructs Git to attempt shallow clones (--depth 1). If the user/scheduler asks for a specific revision, this parameter is ignored.
progress
(optional): passes the (--progress) flag to (git fetch). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.

This Source step integrates with GerritChangeSource, and will automatically use Gerrit's "virtual branch" (refs/changes/*) to download the additionnal changes introduced by a pending changeset.

Gerrit integration can be also triggered using forced build with gerrit_change property with value in format: change_number/patchset_number.

BitKeeper (Slave-Side)

The BK build step performs a BitKeeper checkout or update.

The BitKeeper step takes the following arguments:

repourl
(required unless baseURL is provided): the URL at which the BitKeeper source repository is available.
baseURL
(required unless repourl is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.
Repo (Slave-Side)
class buildbot.steps.source.Repo

The Repo (Slave-Side) build step performs a Repo init and sync.

This step is obsolete and should not be used anymore. please use: Repo instead

The Repo step takes the following arguments:

manifest_url
(required): the URL at which the Repo's manifests source repository is available.
manifest_branch
(optional, defaults to master): the manifest repository branch on which repo will take its manifest. Corresponds to the -b argument to the repo init command.
manifest_file
(optional, defaults to default.xml): the manifest filename. Corresponds to the -m argument to the repo init command.
tarball
(optional, defaults to None): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the .repo directory which contains all the Git objects. This feature helps to minimize network usage on very big projects.
jobs
(optional, defaults to None): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".

This Source step integrates with GerritChangeSource, and will automatically use the repo download command of repo to download the additionnal changes introduced by a pending changeset.

Gerrit integration can be also triggered using forced build with following properties: repo_d, repo_d[0-9], repo_download, repo_download[0-9] with values in format: project/change_number/patchset_number. All of these properties will be translated into a repo download. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.

Monotone (Slave-Side)

The Monotone build step performs a Monotone, (aka mtn) checkout or update.

The Monotone step takes the following arguments:

repourl
the URL at which the Monotone source repository is available.
branch
this specifies the name of the branch to use when a Build does not provide one of its own.
progress
this is a boolean that has a pull from the repository use --ticker=dot instead of the default --ticker=none.
ShellCommand

Most interesting steps involve executing a process of some sort on the buildslave. The ShellCommand class handles this activity.

Several subclasses of ShellCommand are provided as starting points for common build steps.

Using ShellCommands
class buildbot.steps.shell.ShellCommand

This is a useful base class for just about everything you might want to do during a build (except for the initial source checkout). It runs a single command in a child shell on the buildslave. All stdout/stderr is recorded into a LogFile. The step usually finishes with a status of FAILURE if the command's exit code is non-zero, otherwise it has a status of SUCCESS.

The preferred way to specify the command is with a list of argv strings, since this allows for spaces in filenames and avoids doing any fragile shell-escaping. You can also specify the command with a single string, in which case the string is given to /bin/sh -c COMMAND for parsing.

On Windows, commands are run via cmd.exe /c which works well. However, if you're running a batch file, the error level does not get propagated correctly unless you add 'call' before your batch file's name: cmd=['call', 'myfile.bat', ...].

The ShellCommand arguments are:

command

a list of strings (preferred) or single string (discouraged) which specifies the command to be run. A list of strings is preferred because it can be used directly as an argv array. Using a single string (with embedded spaces) requires the buildslave to pass the string to /bin/sh for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters.

If command contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed.

On the topic of shell metacharacters, note that in DOS the pipe character (|) is conditionally escaped (to ^|) when it occurs inside a more complex string in a list of strings. It remains unescaped when it occurs as part of a single string or as a lone pipe in a list of strings.

workdir

All ShellCommands are run by default in the workdir, which defaults to the build subdirectory of the slave builder's base directory. The absolute path of the workdir will thus be the slave's basedir (set as an option to buildslave create-slave, Creating a buildslave) plus the builder's basedir (set in the builder's builddir key in master.cfg) plus the workdir itself (a class-level attribute of the BuildFactory, defaults to build).

For example:

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(command=["make", "test"],
                       workdir="build/tests"))
env

a dictionary of environment strings which will be added to the child command's environment. For example, to run tests with a different i18n language setting, you might use

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(command=["make", "test"],
                       env={'LANG': 'fr_FR'}))

These variable settings will override any existing ones in the buildslave's environment or the environment specified in the Builder. The exception is PYTHONPATH, which is merged with (actually prepended to) any existing PYTHONPATH setting. The following example will prepend /home/buildbot/lib/python to any existing PYTHONPATH:

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(
              command=["make", "test"],
              env={'PYTHONPATH': "/home/buildbot/lib/python"}))

To avoid the need of concatenating path together in the master config file, if the value is a list, it will be joined together using the right platform dependant separator.

Those variables support expansion so that if you just want to prepend /home/buildbot/bin to the PATH environment variable, you can do it by putting the value ${PATH} at the end of the value like in the example below. Variables that don't exist on the slave will be replaced by "".

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(
              command=["make", "test"],
              env={'PATH': ["/home/buildbot/bin",
                            "${PATH}"]}))

Note that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as buildnumber must be substituted using Interpolate.

want_stdout
if False, stdout from the child process is discarded rather than being sent to the buildmaster for inclusion in the step's LogFile.
want_stderr
like want_stdout but for stderr. Note that commands run through a PTY do not have separate stdout/stderr streams: both are merged into stdout.
usePTY

Should this command be run in a pty? The default is to observe the configuration of the client (Buildslave Options), but specifying True or False here will override the default. This option is not available on Windows.

In general, you do not want to use a pseudo-terminal. This is is only useful for running commands that require a terminal - for example, testing a command-line application that will only accept passwords read from a terminal. Using a pseudo-terminal brings lots of compatibility problems, and prevents Buildbot from distinguishing the standard error (red) and standard output (black) streams.

In previous versions, the advantage of using a pseudo-terminal was that grandchild processes were more likely to be cleaned up if the build was interrupted or times out. This occurred because using a pseudo-terminal incidentally puts the command into its own process group.

As of Buildbot-0.8.4, all commands are placed in process groups, and thus grandchild processes will be cleaned up properly.

logfiles

Sometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's trial command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named _trial_temp/test.log. It is often useful to watch these files as the command runs, rather than using /bin/cat to dump their contents afterwards.

The logfiles= argument allows you to collect data from these secondary logfiles in near-real-time, as the step is running. It accepts a dictionary which maps from a local Log name (which is how the log data is presented in the build results) to either a remote filename (interpreted relative to the build's working directory), or a dictionary of options. Each named file will be polled on a regular basis (every couple of seconds) as the build runs, and any new text will be sent over to the buildmaster.

If you provide a dictionary of options instead of a string, you must specify the filename key. You can optionally provide a follow key which is a boolean controlling whether a logfile is followed or concatenated in its entirety. Following is appropriate for logfiles to which the build step will append, where the pre-existing contents are not interesting. The default value for follow is False, which gives the same behavior as just providing a string filename.

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(
              command=["make", "test"],
              logfiles={"triallog": "_trial_temp/test.log"}))

The above example will add a log named 'triallog' on the master, based on _trial_temp/test.log on the slave.

from buildbot.steps.shell import ShellCommand
f.addStep(ShellCommand(
              command=["make", "test"],
              logfiles={"triallog": {"filename": "_trial_temp/test.log",
                   "follow": True,}}))
lazylogfiles
If set to True, logfiles will be tracked lazily, meaning that they will only be added when and if something is written to them. This can be used to suppress the display of empty or missing log files. The default is False.
timeout
if the command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 1200 seconds. Pass None to disable.
maxTime
if the command takes longer than this many seconds, it will be killed. This is disabled by default.
logEnviron
If this option is True (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set logEnviron=False.
interruptSignal
If the command should be interrupted (either by buildmaster or timeout etc.), what signal should be sent to the process, specified by name. By default this is "KILL" (9). Specify "TERM" (15) to give the process a chance to cleanup. This functionality requires a 0.8.6 slave or newer.

sigtermTime

If set, when interrupting, try to kill the command with SIGTERM and wait for sigtermTime seconds before firing interuptSignal. If None, interruptSignal will be fired immediately on interrupt.
initialStdin
If the command expects input on stdin, that can be supplied a a string with this parameter. This value should not be excessively large, as it is handled as a single string throughout Buildbot -- for example, do not pass the contents of a tarball with this parameter.
decodeRC
This is a dictionary that decodes exit codes into results value. e.g: {0:SUCCESS,1:FAILURE,2:WARNINGS}, will treat the exit code 2 as WARNINGS. The default is to treat just 0 as successful. ({0:SUCCESS}) any exit code not present in the dictionary will be treated as FAILURE
Configure
class buildbot.steps.shell.Configure

This is intended to handle the ./configure step from autoconf-style projects, or the perl Makefile.PL step from perl MakeMaker.pm-style modules. The default command is ./configure but you can change this by providing a command= parameter. The arguments are identical to ShellCommand.

from buildbot.steps.shell import Configure
f.addStep(Configure())
Compile

This is meant to handle compiling or building a project written in C. The default command is make all. When the compile is finished, the log file is scanned for GCC warning messages, a summary log is created with any problems that were seen, and the step is marked as WARNINGS if any were discovered. Through the WarningCountingShellCommand superclass, the number of warnings is stored in a Build Property named warnings-count, which is accumulated over all Compile steps (so if two warnings are found in one step, and three are found in another step, the overall build will have a warnings-count property of 5). Each step can be optionally given a maximum number of warnings via the maxWarnCount parameter. If this limit is exceeded, the step will be marked as a failure.

The default regular expression used to detect a warning is '.*warning[: ].*' , which is fairly liberal and may cause false-positives. To use a different regexp, provide a warningPattern= argument, or use a subclass which sets the warningPattern attribute:

from buildbot.steps.shell import Compile
f.addStep(Compile(command=["make", "test"],
                  warningPattern="^Warning: "))

The warningPattern= can also be a pre-compiled Python regexp object: this makes it possible to add flags like re.I (to use case-insensitive matching).

Note that the compiled warningPattern will have its match method called, which is subtly different from a search. Your regular expression must match the from the beginning of the line. This means that to look for the word "warning" in the middle of a line, you will need to prepend '.*' to your regular expression.

The suppressionFile= argument can be specified as the (relative) path of a file inside the workdir defining warnings to be suppressed from the warning counting and log file. The file will be uploaded to the master from the slave before compiling, and any warning matched by a line in the suppression file will be ignored. This is useful to accept certain warnings (eg. in some special module of the source tree or in cases where the compiler is being particularly stupid), yet still be able to easily detect and fix the introduction of new warnings.

The file must contain one line per pattern of warnings to ignore. Empty lines and lines beginning with # are ignored. Other lines must consist of a regexp matching the file name, followed by a colon (:), followed by a regexp matching the text of the warning. Optionally this may be followed by another colon and a line number range. For example:

# Sample warning suppression file

mi_packrec.c : .*result of 32-bit shift implicitly converted to 64 bits.* : 560-600
DictTabInfo.cpp : .*invalid access to non-static.*
kernel_types.h : .*only defines private constructors and has no friends.* : 51

If no line number range is specified, the pattern matches the whole file; if only one number is given it matches only on that line.

The default warningPattern regexp only matches the warning text, so line numbers and file names are ignored. To enable line number and file name matching, provide a different regexp and provide a function (callable) as the argument of warningExtractor=. The function is called with three arguments: the BuildStep object, the line in the log file with the warning, and the SRE_Match object of the regexp search for warningPattern. It should return a tuple (filename, linenumber, warning_test). For example:

f.addStep(Compile(command=["make"],
                  warningPattern="^(.\*?):([0-9]+): [Ww]arning: (.\*)$",
                  warningExtractor=Compile.warnExtractFromRegexpGroups,
                  suppressionFile="support-files/compiler_warnings.supp"))

(Compile.warnExtractFromRegexpGroups is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).

In projects with source files in multiple directories, it is possible to get full path names for file names matched in the suppression file, as long as the build command outputs the names of directories as they are entered into and left again. For this, specify regexps for the arguments directoryEnterPattern= and directoryLeavePattern=. The directoryEnterPattern= regexp should return the name of the directory entered into in the first matched group. The defaults, which are suitable for .. GNU Make, are these:

directoryEnterPattern = "make.*: Entering directory [\"`'](.*)['`\"]"
directoryLeavePattern = "make.*: Leaving directory"

(TODO: this step needs to be extended to look for GCC error messages as well, and collect them into a separate logfile, along with the source code filenames involved).

Visual C++

These steps are meant to handle compilation using Microsoft compilers. VC++ 6-12 (aka Visual Studio 2003-2013 and VCExpress9) are supported via calling devenv. Msbuild as well as Windows Driver Kit 8 are supported via the MsBuild4 and MsBuild12 steps. These steps will take care of setting up a clean compilation environment, parsing the generated output in real time, and delivering as detailed as possible information about the compilation executed.

All of the classes are in buildbot.steps.vstudio. The available classes are:

  • VC6
  • VC7
  • VC8
  • VC9
  • VC10
  • VC11
  • VC12
  • VS2003
  • VS2005
  • VS2008
  • VS2010
  • VS2012
  • VS2013
  • VCExpress9
  • MsBuild4
  • MsBuild12

The available constructor arguments are

mode
The mode default to rebuild, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are build, where only the updated files will be recompiled, and clean, where the current build files are removed and no compilation occurs.
projectfile
This is a mandatory argument which specifies the project file to be used during the compilation.
config
This argument defaults to release an gives to the compiler the configuration to use.
installdir
This is the place where the compiler is installed. The default value is compiler specific and is the default place where the compiler is installed.
useenv
This boolean parameter, defaulting to False instruct the compiler to use its own settings or the one defined through the environment variables PATH, INCLUDE, and LIB. If any of the INCLUDE or LIB parameter is defined, this parameter automatically switches to True.
PATH
This is a list of path to be added to the PATH environment variable. The default value is the one defined in the compiler options.
INCLUDE
This is a list of path where the compiler will first look for include files. Then comes the default paths defined in the compiler options.
LIB
This is a list of path where the compiler will first look for libraries. Then comes the default path defined in the compiler options.
arch
That one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to x86 and does not apply to MsBuild4 or MsBuild12. Please see platform below.
project
This gives the specific project to build from within a workspace. It defaults to building all projects. This is useful for building cmake generate projects.
platform
This is a mandatory argument for MsBuild4 and MsBuild12 specifying the target platform such as 'Win32', 'x64' or 'Vista Debug'. The last one is an example of driver targets that appear once Windows Driver Kit 8 is installed.

Here is an example on how to drive compilation with Visual Studio 2013:

from buildbot.steps.vstudio import VS2013

f.addStep(
    VS2013(projectfile="project.sln", config="release",
        arch="x64", mode="build",
           INCLUDE=[r'C:\3rd-pary\libmagic\include'],
           LIB=[r'C:\3rd-party\libmagic\lib-x64']))

Here is a similar example using "MsBuild12":

from buildbot.steps.vstudio import MsBuild12

# Build one project in Release mode for Win32
f.addStep(
    MsBuild12(projectfile="trunk.sln", config="Release", platform="Win32",
            workdir="trunk",
            project="tools\\protoc"))

# Build the entire solution in Debug mode for x64
f.addStep(
    MsBuild12(projectfile="trunk.sln", config='Debug', platform='x64',
            workdir="trunk"))
Robocopy
class buildbot.steps.mswin.Robocopy

This step runs robocopy on Windows.

Robocopy is available in versions of Windows starting with Windows Vista and Windows Server 2008. For previous versions of Windows, it's available as part of the Windows Server 2003 Resource Kit Tools.

from buildbot.steps.mswin import Robocopy

f.addStep(Robocopy(
            name='deploy_binaries',
            description='Deploying binaries...',
            descriptionDone='Deployed binaries.',
            source=Interpolate('Build\\Bin\\%(prop:configuration)s'),
            destination=Interpolate('%(prop:deploy_dir)\\Bin\\%(prop:configuration)s'),
            mirror=True
        ))

Available constructor arguments are:

source
The path to the source directory (mandatory).
destination
The path to the destination directory (mandatory).
files
An array of file names or patterns to copy.
recursive
Copy files and directories recursively (/E parameter).
mirror
Mirror the source directory in the destination directory, including removing files that don't exist anymore (/MIR parameter).
move
Delete the source directory after the copy is complete (/MOVE parameter).
exclude_files
An array of file names or patterns to exclude from the copy (/XF parameter).
exclude_dirs
An array of directory names or patterns to exclude from the copy (/XD parameter).
custom_opts
An array of custom parameters to pass directly to the robocopy command.
verbose
Whether to output verbose information (/V /TS /TP parameters).

Note that parameters /TEE /NP will always be appended to the command to signify, respectively, to output logging to the console, use Unicode logging, and not print any percentage progress information for each file.

Test
from buildbot.steps.shell import Test
f.addStep(Test())

This is meant to handle unit tests. The default command is make test, and the warnOnFailure flag is set. The other arguments are identical to ShellCommand.

TreeSize
from buildbot.steps.shell import TreeSize
f.addStep(TreeSize())

This is a simple command that uses the du tool to measure the size of the code tree. It puts the size (as a count of 1024-byte blocks, aka 'KiB' or 'kibibytes') on the step's status text, and sets a build property named tree-size-KiB with the same value. All arguments are identical to ShellCommand.

PerlModuleTest
from buildbot.steps.shell import PerlModuleTest
f.addStep(PerlModuleTest())

This is a simple command that knows how to run tests of perl modules. It parses the output to determine the number of tests passed and failed and total number executed, saving the results for later query. The command is prove --lib lib -r t, although this can be overridden with the command argument. All other arguments are identical to those for ShellCommand.

MTR (mysql-test-run)

The MTR class is a subclass of Test. It is used to run test suites using the mysql-test-run program, as used in MySQL, Drizzle, MariaDB, and MySQL storage engine plugins.

The shell command to run the test suite is specified in the same way as for the Test class. The MTR class will parse the output of running the test suite, and use the count of tests executed so far to provide more accurate completion time estimates. Any test failures that occur during the test are summarized on the Waterfall Display.

Server error logs are added as additional log files, useful to debug test failures.

Optionally, data about the test run and any test failures can be inserted into a database for further analysis and report generation. To use this facility, create an instance of twisted.enterprise.adbapi.ConnectionPool with connections to the database. The necessary tables can be created automatically by setting autoCreateTables to True, or manually using the SQL found in the mtrlogobserver.py source file.

One problem with specifying a database is that each reload of the configuration will get a new instance of ConnectionPool (even if the connection parameters are the same). To avoid that Buildbot thinks the builder configuration has changed because of this, use the steps.mtrlogobserver.EqConnectionPool subclass of ConnectionPool, which implements an equiality operation that avoids this problem.

Example use:

from buildbot.steps.mtrlogobserver import MTR, EqConnectionPool
myPool = EqConnectionPool("MySQLdb", "host", "buildbot", "password", "db")
myFactory.addStep(MTR(workdir="mysql-test", dbpool=myPool,
                      command=["perl", "mysql-test-run.pl", "--force"]))

The MTR step's arguments are:

textLimit
Maximum number of test failures to show on the waterfall page (to not flood the page in case of a large number of test failures. Defaults to 5.
testNameLimit
Maximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16.
parallel
Value of --parallel option used for mysql-test-run.pl (number of processes used to run the test suite in parallel). Defaults to 4. This is used to determine the number of server error log files to download from the slave. Specifying a too high value does not hurt (as nonexisting error logs will be ignored), however if using --parallel value greater than the default it needs to be specified, or some server error logs will be missing.
dbpool
An instance of twisted.enterprise.adbapi.ConnectionPool, or None. Defaults to None. If specified, results are inserted into the database using the ConnectionPool.
autoCreateTables
Boolean, defaults to False. If True (and dbpool is specified), the necessary database tables will be created automatically if they do not exist already. Alternatively, the tables can be created manually from the SQL statements found in the mtrlogobserver.py source file.
test_type
Short string that will be inserted into the database in the row for the test run. Defaults to the empty string, but can be specified to identify different types of test runs.
test_info
Descriptive string that will be inserted into the database in the row for the test run. Defaults to the empty string, but can be specified as a user-readable description of this particular test run.
mtr_subdir
The subdirectory in which to look for server error log files. Defaults to mysql-test, which is usually correct. Interpolate is supported.
SubunitShellCommand
class buildbot.steps.subunit.SubunitShellCommand

This buildstep is similar to ShellCommand, except that it runs the log content through a subunit filter to extract test and failure counts.

from buildbot.steps.subunit import SubunitShellCommand
f.addStep(SubunitShellCommand(command="make test"))

This runs make test and filters it through subunit. The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run.

If failureOnNoTests is True, this step will fail if no test is run. By default failureOnNoTests is False.

Slave Filesystem Steps

Here are some buildsteps for manipulating the slave's filesystem.

FileExists

This step will assert that a given file exists, failing if it does not. The filename can be specified with a property.

from buildbot.steps.slave import FileExists
f.addStep(FileExists(file='test_data'))

This step requires slave version 0.8.4 or later.

CopyDirectory

This command copies a directory on the slave.

from buildbot.steps.slave import CopyDirectory
f.addStep(CopyDirectory(src="build/data", dest="tmp/data"))

This step requires slave version 0.8.5 or later.

The CopyDirectory step takes the following arguments:

timeout
if the copy command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 120 seconds. Pass None to disable.
maxTime
if the command takes longer than this many seconds, it will be killed. This is disabled by default.
RemoveDirectory

This command recursively deletes a directory on the slave.

from buildbot.steps.slave import RemoveDirectory
f.addStep(RemoveDirectory(dir="build/build"))

This step requires slave version 0.8.4 or later.

MakeDirectory

This command creates a directory on the slave.

from buildbot.steps.slave import MakeDirectory
f.addStep(MakeDirectory(dir="build/build"))

This step requires slave version 0.8.5 or later.

Python BuildSteps

Here are some BuildSteps that are specifically useful for projects implemented in Python.

BuildEPYDoc
class buildbot.steps.python.BuildEPYDoc

epydoc is a tool for generating API documentation for Python modules from their docstrings. It reads all the .py files from your source tree, processes the docstrings therein, and creates a large tree of .html files (or a single .pdf file).

The BuildEPYDoc step will run epydoc to produce this API documentation, and will count the errors and warnings from its output.

You must supply the command line to be used. The default is make epydocs, which assumes that your project has a Makefile with an epydocs target. You might wish to use something like epydoc -o apiref source/PKGNAME instead. You might also want to add --pdf to generate a PDF file instead of a large tree of HTML files.

The API docs are generated in-place in the build tree (under the workdir, in the subdirectory controlled by the -o argument). To make them useful, you will probably have to copy them to somewhere they can be read. A command like rsync -ad apiref/ dev.example.com:~public_html/current-apiref/ might be useful. You might instead want to bundle them into a tarball and publish it in the same place where the generated install tarball is placed.

from buildbot.steps.python import BuildEPYDoc
f.addStep(BuildEPYDoc(command=["epydoc", "-o", "apiref", "source/mypkg"]))
PyFlakes
class buildbot.steps.python.PyFlakes

PyFlakes is a tool to perform basic static analysis of Python code to look for simple errors, like missing imports and references of undefined names. It is like a fast and simple form of the C lint program. Other tools (like pychecker) provide more detailed results but take longer to run.

The PyFlakes step will run pyflakes and count the various kinds of errors and warnings it detects.

You must supply the command line to be used. The default is make pyflakes, which assumes you have a top-level Makefile with a pyflakes target. You might want to use something like pyflakes . or pyflakes src.

from buildbot.steps.python import PyFlakes
f.addStep(PyFlakes(command=["pyflakes", "src"]))
Sphinx
class buildbot.steps.python.Sphinx

Sphinx is the Python Documentation Generator. It uses RestructuredText as input format.

The Sphinx step will run sphinx-build or any other program specified in its sphinx argument and count the various warnings and error it detects.

from buildbot.steps.python import Sphinx
f.addStep(Sphinx(sphinx_builddir="_build"))

This step takes the following arguments:

sphinx_builddir
(required) Name of the directory where the documentation will be generated.
sphinx_sourcedir
(optional, defaulting to .), Name the directory where the conf.py file will be found
sphinx_builder
(optional) Indicates the builder to use.
sphinx
(optional, defaulting to sphinx-build) Indicates the executable to run.
tags
(optional) List of tags to pass to sphinx-build
defines
(optional) Dictionary of defines to overwrite values of the conf.py file.
mode
(optional) String, one of full or incremental (the default). If set to full, indicates to Sphinx to rebuild everything without re-using the previous build results.
PyLint

Similarly, the PyLint step will run pylint and analyze the results.

You must supply the command line to be used. There is no default.

from buildbot.steps.python import PyLint
f.addStep(PyLint(command=["pylint", "src"]))
Trial
class buildbot.steps.python_twisted.Trial

This step runs a unit test suite using trial, a unittest-like testing framework that is a component of Twisted Python. Trial is used to implement Twisted's own unit tests, and is the unittest-framework of choice for many projects that use Twisted internally.

Projects that use trial typically have all their test cases in a 'test' subdirectory of their top-level library directory. For example, for a package petmail, the tests might be in petmail/test/test_*.py. More complicated packages (like Twisted itself) may have multiple test directories, like twisted/test/test_*.py for the core functionality and twisted/mail/test/test_*.py for the email-specific tests.

To run trial tests manually, you run the trial executable and tell it where the test cases are located. The most common way of doing this is with a module name. For petmail, this might look like trial petmail.test, which would locate all the test_*.py files under petmail/test/, running every test case it could find in them. Unlike the unittest.py that comes with Python, it is not necessary to run the test_foo.py as a script; you always let trial do the importing and running. The step's tests` parameter controls which tests trial will run: it can be a string or a list of strings.

To find the test cases, the Python search path must allow something like import petmail.test to work. For packages that don't use a separate top-level lib directory, PYTHONPATH=. will work, and will use the test cases (and the code they are testing) in-place. PYTHONPATH=build/lib or PYTHONPATH=build/lib.somearch are also useful when you do a python setup.py build step first. The testpath attribute of this class controls what PYTHONPATH is set to before running trial.

Trial has the ability, through the --testmodule flag, to run only the set of test cases named by special test-case-name tags in source files. We can get the list of changed source files from our parent Build and provide them to trial, thus running the minimal set of test cases needed to cover the Changes. This is useful for quick builds, especially in trees with a lot of test cases. The testChanges parameter controls this feature: if set, it will override tests.

The trial executable itself is typically just trial, and is typically found in the shell search path. It can be overridden with the trial parameter. This is useful for Twisted's own unittests, which want to use the copy of bin/trial that comes with the sources.

To influence the version of Python being used for the tests, or to add flags to the command, set the python parameter. This can be a string (like python2.2) or a list (like ['python2.3', '-Wall']).

Trial creates and switches into a directory named _trial_temp/ before running the tests, and sends the twisted log (which includes all exceptions) to a file named test.log. This file will be pulled up to the master where it can be seen as part of the status output.

from buildbot.steps.python_twisted import Trial
f.addStep(Trial(tests='petmail.test'))

Trial has the ability to run tests on several workers in parallel (beginning with Twisted 12.3.0). Set jobs to the number of workers you want to run. Note that running trial in this way will create multiple log files (named test.N.log, err.N.log and out.N.log starting with N=0) rather than a single test.log.

This step takes the following arguments:

jobs
(optional) Number of slave-resident workers to use when running the tests. Defaults to 1 worker. Only works with Twisted>=12.3.0.
RemovePYCs
class buildbot.steps.python_twisted.RemovePYCs

This is a simple built-in step that will remove .pyc files from the workdir. This is useful in builds that update their source (and thus do not automatically delete .pyc files) but where some part of the build process is dynamically searching for Python modules. Notably, trial has a bad habit of finding old test modules.

from buildbot.steps.python_twisted import RemovePYCs
f.addStep(RemovePYCs())
Transferring Files
class buildbot.steps.transfer.FileUpload
class buildbot.steps.transfer.FileDownload

Most of the work involved in a build will take place on the buildslave. But occasionally it is useful to do some work on the buildmaster side. The most basic way to involve the buildmaster is simply to move a file from the slave to the master, or vice versa. There are a pair of steps named FileUpload and FileDownload to provide this functionality. FileUpload moves a file up to the master, while FileDownload moves a file down from the master.

As an example, let's assume that there is a step which produces an HTML file within the source tree that contains some sort of generated project documentation. We want to move this file to the buildmaster, into a ~/public_html directory, so it can be visible to developers. This file will wind up in the slave-side working directory under the name docs/reference.html. We want to put it into the master-side ~/public_html/ref.html, and add a link to the HTML status to the uploaded file.

from buildbot.steps.shell import ShellCommand
from buildbot.steps.transfer import FileUpload

f.addStep(ShellCommand(command=["make", "docs"]))
f.addStep(FileUpload(slavesrc="docs/reference.html",
                     masterdest="/home/bb/public_html/ref.html",
                     url="http://somesite/~buildbot/ref.html"))

The masterdest= argument will be passed to os.path.expanduser, so things like ~ will be expanded properly. Non-absolute paths will be interpreted relative to the buildmaster's base directory. Likewise, the slavesrc= argument will be expanded and interpreted relative to the builder's working directory.

Note

The copied file will have the same permissions on the master as on the slave, look at the mode= parameter to set it differently.

To move a file from the master to the slave, use the FileDownload command. For example, let's assume that some step requires a configuration file that, for whatever reason, could not be recorded in the source code repository or generated on the buildslave side:

from buildbot.steps.shell import ShellCommand
from buildbot.steps.transfer import FileDownload

f.addStep(FileDownload(mastersrc="~/todays_build_config.txt",
                       slavedest="build_config.txt"))
f.addStep(ShellCommand(command=["make", "config"]))

Like FileUpload, the mastersrc= argument is interpreted relative to the buildmaster's base directory, and the slavedest= argument is relative to the builder's working directory. If the buildslave is running in ~buildslave, and the builder's builddir is something like tests-i386, then the workdir is going to be ~buildslave/tests-i386/build, and a slavedest= of foo/bar.html will get put in ~buildslave/tests-i386/build/foo/bar.html. Both of these commands will create any missing intervening directories.

Other Parameters

The maxsize= argument lets you set a maximum size for the file to be transferred. This may help to avoid surprises: transferring a 100MB coredump when you were expecting to move a 10kB status file might take an awfully long time. The blocksize= argument controls how the file is sent over the network: larger blocksizes are slightly more efficient but also consume more memory on each end, and there is a hard-coded limit of about 640kB.

The mode= argument allows you to control the access permissions of the target file, traditionally expressed as an octal integer. The most common value is probably 0755, which sets the x executable bit on the file (useful for shell scripts and the like). The default value for mode= is None, which means the permission bits will default to whatever the umask of the writing process is. The default umask tends to be fairly restrictive, but at least on the buildslave you can make it less restrictive with a --umask command-line option at creation time (Buildslave Options).

The keepstamp= argument is a boolean that, when True, forces the modified and accessed time of the destination file to match the times of the source file. When False (the default), the modified and accessed times of the destination file are set to the current time on the buildmaster.

The url= argument allows you to specify an url that will be displayed in the HTML status. The title of the url will be the name of the item transferred (directory for DirectoryUpload or file for FileUpload). This allows the user to add a link to the uploaded item if that one is uploaded to an accessible place.

Transfering Directories
class buildbot.steps.transfer.DirectoryUpload

To transfer complete directories from the buildslave to the master, there is a BuildStep named DirectoryUpload. It works like FileUpload, just for directories. However it does not support the maxsize, blocksize and mode arguments. As an example, let's assume an generated project documentation, which consists of many files (like the output of doxygen or epydoc). We want to move the entire documentation to the buildmaster, into a ~/public_html/docs directory, and add a link to the uploaded documentation on the HTML status page. On the slave-side the directory can be found under docs:

from buildbot.steps.shell import ShellCommand
from buildbot.steps.transfer import DirectoryUpload

f.addStep(ShellCommand(command=["make", "docs"]))
f.addStep(DirectoryUpload(slavesrc="docs",
                          masterdest="~/public_html/docs",
                          url="~buildbot/docs"))

The DirectoryUpload step will create all necessary directories and transfers empty directories, too.

The maxsize and blocksize parameters are the same as for FileUpload, although note that the size of the transferred data is implementation-dependent, and probably much larger than you expect due to the encoding used (currently tar).

The optional compress argument can be given as 'gz' or 'bz2' to compress the datastream.

Note

The permissions on the copied files will be the same on the master as originally on the slave, see buildslave create-slave --umask to change the default one.

Transferring Multiple Files At Once
class buildbot.steps.transfer.MultipleFileUpload

In addition to the FileUpload and DirectoryUpload steps there is the MultipleFileUpload step for uploading a bunch of files (and directories) in a single BuildStep. The step supports all arguments that are supported by FileUpload and DirectoryUpload, but instead of a the single slavesrc parameter it takes a (plural) slavesrcs parameter. This parameter should either be a list, or something that can be rendered as a list.:

from buildbot.steps.shell import ShellCommand, Test
from buildbot.steps.transfer import MultipleFileUpload

f.addStep(ShellCommand(command=["make", "test"]))
f.addStep(ShellCommand(command=["make", "docs"]))
f.addStep(MultipleFileUpload(slavesrcs=["docs", "test-results.html"],
                             masterdest="~/public_html",
                             url="~buildbot"))

The url= parameter, can be used to specify a link to be displayed in the HTML status of the step.

The way URLs are added to the step can be customized by extending the MultipleFileUpload class. the allUploadsDone method is called after all files have been uploaded and sets the URL. The uploadDone method is called once for each uploaded file and can be used to create file-specific links.:

from buildbot.steps.transfer import MultipleFileUpload
import os.path

class CustomFileUpload(MultipleFileUpload):
    linkTypes = ('.html', '.txt')

    def linkFile(self, basename):
        name, ext = os.path.splitext(basename)
        return ext in self.linkTypes

    def uploadDone(self, result, source, masterdest):
        if self.url:
            basename = os.path.basename(source)
            if self.linkFile(basename):
                self.addURL(self.url + '/' + basename, basename)

    def allUploadsDone(self, result, sources, masterdest):
        if self.url:
            notLinked = filter(lambda src: not self.linkFile(src), sources)
            numFiles = len(notLinked)
            if numFiles:
                self.addURL(self.url, '... %d more' % numFiles)
Transfering Strings
class buildbot.steps.transfer.StringDownload
class buildbot.steps.transfer.JSONStringDownload
class buildbot.steps.transfer.JSONPropertiesDownload

Sometimes it is useful to transfer a calculated value from the master to the slave. Instead of having to create a temporary file and then use FileDownload, you can use one of the string download steps.

from buildbot.steps.transfer import StringDownload
f.addStep(StringDownload(Interpolate("%(src::branch)s-%(prop:got_revision)s\n"),
        slavedest="buildid.txt"))

StringDownload works just like FileDownload except it takes a single argument, s, representing the string to download instead of a mastersrc argument.

from buildbot.steps.transfer import JSONStringDownload
buildinfo = { branch: Property('branch'), got_revision: Property('got_revision') }
f.addStep(JSONStringDownload(buildinfo, slavedest="buildinfo.json"))

JSONStringDownload is similar, except it takes an o argument, which must be JSON serializable, and transfers that as a JSON-encoded string to the slave.

from buildbot.steps.transfer import JSONPropertiesDownload
f.addStep(JSONPropertiesDownload(slavedest="build-properties.json"))

JSONPropertiesDownload transfers a json-encoded string that represents a dictionary where properties maps to a dictionary of build property name to property value; and sourcestamp represents the build's sourcestamp.

Running Commands on the Master
class buildbot.steps.master.MasterShellCommand

Occasionally, it is useful to execute some task on the master, for example to create a directory, deploy a build result, or trigger some other centralized processing. This is possible, in a limited fashion, with the MasterShellCommand step.

This step operates similarly to a regular ShellCommand, but executes on the master, instead of the slave. To be clear, the enclosing Build object must still have a slave object, just as for any other step -- only, in this step, the slave does not do anything.

In this example, the step renames a tarball based on the day of the week.

from buildbot.steps.transfer import FileUpload
from buildbot.steps.master import MasterShellCommand

f.addStep(FileUpload(slavesrc="widgetsoft.tar.gz",
                     masterdest="/var/buildoutputs/widgetsoft-new.tar.gz"))
f.addStep(MasterShellCommand(command="""
    cd /var/buildoutputs;
    mv widgetsoft-new.tar.gz widgetsoft-`date +%a`.tar.gz"""))

Note

By default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an env={..} argument.

Environment variables constructed using the env argument support expansion so that if you just want to prepend /home/buildbot/bin to the PATH environment variable, you can do it by putting the value ${PATH} at the end of the value like in the example below. Variables that don't exist on the master will be replaced by "".

from buildbot.steps.master import MasterShellCommand
f.addStep(MasterShellCommand(
              command=["make", "www"],
              env={'PATH': ["/home/buildbot/bin",
                            "${PATH}"]}))

Note that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as buildnumber must be substituted using Interpolate.

interruptSignal
(optional) Signal to use to end the process, if the step is interrupted.
LogRenderable
class buildbot.steps.master.LogRenderable

This build step takes content which can be renderable and logs it in a pretty-printed format. It can be useful for debugging properties during a build.

Setting Properties

These steps set properties on the master based on information from the slave.

SetProperty
class buildbot.steps.master.SetProperty

SetProperty takes two arguments of property and value where the value is to be assigned to the property key. It is usually called with the value argument being specifed as a Interpolate object which allows the value to be built from other property values:

from buildbot.steps.master import SetProperty
from buildbot.process.properties import Interpolate
f.addStep(SetProperty(property="SomeProperty",
    value=Interpolate("sch=%(prop:scheduler)s, slave=%(prop:slavename)s")))
SetPropertyFromCommand
class buildbot.steps.shell.SetPropertyFromCommand

This buildstep is similar to ShellCommand, except that it captures the output of the command into a property. It is usually used like this:

from buildbot.steps import shell
f.addStep(shell.SetPropertyFromCommand(command="uname -a", property="uname"))

This runs uname -a and captures its stdout, stripped of leading and trailing whitespace, in the property uname. To avoid stripping, add strip=False.

The property argument can be specified as a Interpolate object, allowing the property name to be built from other property values.

The more advanced usage allows you to specify a function to extract properties from the command output. Here you can use regular expressions, string interpolation, or whatever you would like. In this form, extract_fn should be passed, and not Property. The extract_fn function is called with three arguments: the exit status of the command, its standard output as a string, and its standard error as a string. It should return a dictionary containing all new properties.

def glob2list(rc, stdout, stderr):
    jpgs = [ l.strip() for l in stdout.split('\n') ]
    return { 'jpgs' : jpgs }
f.addStep(SetPropertyFromCommand(command="ls -1 *.jpg", extract_fn=glob2list))

Note that any ordering relationship of the contents of stdout and stderr is lost. For example, given

f.addStep(SetPropertyFromCommand(
    command="echo output1; echo error >&2; echo output2",
    extract_fn=my_extract))

Then my_extract will see stdout="output1\noutput2\n" and stderr="error\n".

Avoid using the extract_fn form of this step with commands that produce a great deal of output, as the output is buffered in memory until complete.

class buildbot.steps.slave.SetPropertiesFromEnv
SetPropertiesFromEnv

Buildbot slaves (later than version 0.8.3) provide their environment variables to the master on connect. These can be copied into Buildbot properties with the SetPropertiesFromEnv step. Pass a variable or list of variables in the variables parameter, then simply use the values as properties in a later step.

Note that on Windows, environment variables are case-insensitive, but Buildbot property names are case sensitive. The property will have exactly the variable name you specify, even if the underlying environment variable is capitalized differently. If, for example, you use variables=['Tmp'], the result will be a property named Tmp, even though the environment variable is displayed as TMP in the Windows GUI.

from buildbot.steps.slave import SetPropertiesFromEnv
from buildbot.steps.shell import Compile

f.addStep(SetPropertiesFromEnv(variables=["SOME_JAVA_LIB_HOME", "JAVAC"]))
f.addStep(Compile(commands=[Interpolate("%(prop:JAVAC)s"), "-cp", Interpolate("%(prop:SOME_JAVA_LIB_HOME)s")]))

Note that this step requires that the Buildslave be at least version 0.8.3. For previous versions, no environment variables are available (the slave environment will appear to be empty).

Setting Buildslave Info

Each buildslave has a dictionary of properties (the "buildslave info dictionary") that is persisted into the database. This info dictionary is displayed on the "buildslave" web page and is available in Interpolate operations.

SetSlaveInfo
class buildbot.steps.master.SetSlaveInfo

SetSlaveInfo is a base class to provide a facility to set values in the buildslave info dictionary. For example:

from buildbot.steps.master import SetSlaveInfo

class SetSlaveFromPropInfo(SetSlaveInfo):
    name = "SetSlaveFromPropInfo"

    # override this to return the dictionary update
    def getSlaveInfoUpdate(self):
        # for example, copy a property into the buildslave dict
        update = {
            "foo": self.getProperty("foo")
        }
        return update
Triggering Schedulers

The counterpart to the Triggerable described in section Triggerable is the Trigger build step:

from buildbot.steps.trigger import Trigger
f.addStep(Trigger(schedulerNames=['build-prep'],
                  waitForFinish=True,
                  updateSourceStamp=True,
                  set_properties={ 'quick' : False }))

The schedulerNames= argument lists the Triggerable schedulers that should be triggered when this step is executed. Note that it is possible, but not advisable, to create a cycle where a build continually triggers itself, because the schedulers are specified by name.

If waitForFinish is True, then the step will not finish until all of the builds from the triggered schedulers have finished. Hyperlinks are added to the waterfall and the build detail web pages for each triggered build. If this argument is False (the default) or not given, then the buildstep succeeds immediately after triggering the schedulers.

The SourceStamps to use for the triggered build are controlled by the arguments updateSourceStamp, alwaysUseLatest, and sourceStamps. If updateSourceStamp is True (the default), then step updates the source stamps given to the Triggerable schedulers to include got_revision (the revision actually used in this build) as revision (the revision to use in the triggered builds). This is useful to ensure that all of the builds use exactly the same source stamps, even if other Changes have occurred while the build was running. If updateSourceStamp is False (and neither of the other arguments are specified), then the exact same SourceStamps are used. If alwaysUseLatest is True, then no SourceStamps are given, corresponding to using the latest revisions of the repositories specified in the Source steps. This is useful if the triggered builds use to a different source repository. The argument sourceStamps accepts a list of dictionaries containing the keys branch, revision, repository, project, and optionally patch_level, patch_body, patch_subdir, patch_author and patch_comment and creates the corresponding SourceStamps. If only one sourceStamp has to be specified then the argument sourceStamp can be used for a dictionary containing the keys mentioned above. The arguments updateSourceStamp, alwaysUseLatest, and sourceStamp can be specified using properties.

The set_properties parameter allows control of the properties that are passed to the triggered scheduler. The parameter takes a dictionary mapping property names to values. You may use Interpolate here to dynamically construct new property values. For the simple case of copying a property, this might look like

set_properties={"my_prop1" : Property("my_prop1")}

The copy_properties parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of set_properties.

Debian Build Steps
DebPbuilder

The DebPbuilder step builds Debian packages within a chroot built by pbuilder. It populates the changeroot with a basic system and the packages listed as build requirement. The type of chroot to build is specified with the distribution, distribution and mirror parameter. To use pbuilder your buildbot must have the right to run pbuilder as root through sudo.

from buildbot.steps.package.deb.pbuilder import DebPbuilder
f.addStep(DebPbuilder())

The step takes the following parameters

architecture
Architecture to build chroot for.
distribution
Name, or nickname, of the distribution. Defaults to 'stable'.
basetgz
Path of the basetgz to use for building.
mirror
URL of the mirror used to download the packages from.
extrapackages
List if packages to install in addition to the base system.
keyring
Path to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution.
components
Repos to activate for chroot building.
DebCowbuilder

The DebCowbuilder step is a subclass of DebPbuilder, which use cowbuilder instead of pbuilder.

DebLintian

The DebLintian step checks a build .deb for bugs and policy violations. The packages or changes file to test is specified in fileloc

from buildbot.steps.package.deb.lintian import DebLintian
f.addStep(DebLintian(fileloc=Interpolate("%(prop:deb-changes)s")))
Miscellaneous BuildSteps

A number of steps do not fall into any particular category.

HLint

The HLint step runs Twisted Lore, a lint-like checker over a set of .xhtml files. Any deviations from recommended style is flagged and put in the output log.

The step looks at the list of changes in the build to determine which files to check - it does not check all files. It specifically excludes any .xhtml files in the top-level sandbox/ directory.

The step takes a single, optional, parameter: python. This specifies the Python executable to use to run Lore.

from buildbot.steps.python_twisted import HLint
f.addStep(HLint())
MaxQ

MaxQ (http://maxq.tigris.org/) is a web testing tool that allows you to record HTTP sessions and play them back. The MaxQ step runs this framework.

from buildbot.steps.maxq import MaxQ
f.addStep(MaxQ(testdir='tests/'))

The single argument, testdir, specifies where the tests should be run. This directory will be passed to the run_maxq.py command, and the results analyzed.

HTTP Requests

Using the HTTPStep step, it is possible to perform HTTP requests in order to trigger another REST service about the progress of the build.

Note

This step requires the txrequests and requests Python libraries.

The parameters are the following:

url
(mandatory) The URL where to send the request
method
The HTTP method to use (out of POST, GET, PUT, DELETE, HEAD or OPTIONS), default to POST.
params
Dictionary of URL parameters to append to the URL.
data
The body to attach the request. If a dictionary is provided, form-encoding will take place.
headers
Dictionary of headers to send.
other params

Any other keywords supported by the requests api can be passed to this step

Note

The entire Buildbot master process shares a single Requests Session object. This has the advantage of supporting connection re-use and other HTTP/1.1 features. However, it also means that any cookies or other state changed by one step will be visible to other steps, causing unexpected results. This behavior may change in future versions.

When the method is known in advance, class with the name of the method can also be used. In this case, it is not necessary to specify the method.

Example:

from buildbot.steps.http import POST
from buildbot.process.properties import Property
f.addStep(
    POST( 'http://myRESTService.example.com/builds',
        data = {
        'builder': Property('buildername'),
    'buildnumber': Property('buildnumber'),
    'slavename': Property('slavename'),
    'revision': Property('got_revision'),
        }
        )
    )

Interlocks

Until now, we assumed that a master can run builds at any slave whenever needed or desired. Some times, you want to enforce additional constraints on builds. For reasons like limited network bandwidth, old slave machines, or a self-willed data base server, you may want to limit the number of builds (or build steps) that can access a resource.

Access Modes

The mechanism used by Buildbot is known as the read/write lock [1]. It allows either many readers or a single writer but not a combination of readers and writers. The general lock has been modified and extended for use in Buildbot. Firstly, the general lock allows an infinite number of readers. In Buildbot, we often want to put an upper limit on the number of readers, for example allowing two out of five possible builds at the same time. To do this, the lock counts the number of active readers. Secondly, the terms read mode and write mode are confusing in Buildbot context. They have been replaced by counting mode (since the lock counts them) and exclusive mode. As a result of these changes, locks in Buildbot allow a number of builds (up to some fixed number) in counting mode, or they allow one build in exclusive mode.

Note

Access modes are specified when a lock is used. That is, it is possible to have a single lock that is used by several slaves in counting mode, and several slaves in exclusive mode. In fact, this is the strength of the modes: accessing a lock in exclusive mode will prevent all counting-mode accesses.

Count

Often, not all slaves are equal. To allow for this situation, Buildbot allows to have a separate upper limit on the count for each slave. In this way, you can have at most 3 concurrent builds at a fast slave, 2 at a slightly older slave, and 1 at all other slaves.

Scope

The final thing you can specify when you introduce a new lock is its scope. Some constraints are global -- they must be enforced over all slaves. Other constraints are local to each slave. A master lock is used for the global constraints. You can ensure for example that at most one build (of all builds running at all slaves) accesses the data base server. With a slave lock you can add a limit local to each slave. With such a lock, you can for example enforce an upper limit to the number of active builds at a slave, like above.

Examples

Time for a few examples. Below a master lock is defined to protect a data base, and a slave lock is created to limit the number of builds at each slave.

from buildbot import locks

db_lock = locks.MasterLock("database")
build_lock = locks.SlaveLock("slave_builds",
                             maxCount = 1,
                             maxCountForSlave = { 'fast': 3, 'new': 2 })

After importing locks from buildbot, db_lock is defined to be a master lock. The database string is used for uniquely identifying the lock. At the next line, a slave lock called build_lock is created. It is identified by the slave_builds string. Since the requirements of the lock are a bit more complicated, two optional arguments are also specified. The maxCount parameter sets the default limit for builds in counting mode to 1. For the slave called 'fast' however, we want to have at most three builds, and for the slave called 'new' the upper limit is two builds running at the same time.

The next step is accessing the locks in builds. Buildbot allows a lock to be used during an entire build (from beginning to end), or only during a single build step. In the latter case, the lock is claimed for use just before the step starts, and released again when the step ends. To prevent deadlocks, [2] it is not possible to claim or release locks at other times.

To use locks, you add them with a locks argument to a build or a step. Each use of a lock is either in counting mode (that is, possibly shared with other builds) or in exclusive mode, and this is indicated with the syntax lock.access(mode), where mode is one of "counting" or "exclusive".

A build or build step proceeds only when it has acquired all locks. If a build or step needs a lot of locks, it may be starved [3] by other builds that need fewer locks.

To illustrate use of locks, a few examples.

from buildbot import locks
from buildbot.steps import source, shell
from buildbot.process import factory

db_lock = locks.MasterLock("database")
build_lock = locks.SlaveLock("slave_builds",
                             maxCount = 1,
                             maxCountForSlave = { 'fast': 3, 'new': 2 })

f = factory.BuildFactory()
f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk"))
f.addStep(shell.ShellCommand(command="make all"))
f.addStep(shell.ShellCommand(command="make test",
                             locks=[db_lock.access('exclusive')]))

b1 = {'name': 'full1', 'slavename': 'fast',  'builddir': 'f1', 'factory': f,
       'locks': [build_lock.access('counting')] }

b2 = {'name': 'full2', 'slavename': 'new',   'builddir': 'f2', 'factory': f,
       'locks': [build_lock.access('counting')] }

b3 = {'name': 'full3', 'slavename': 'old',   'builddir': 'f3', 'factory': f,
       'locks': [build_lock.access('counting')] }

b4 = {'name': 'full4', 'slavename': 'other', 'builddir': 'f4', 'factory': f,
       'locks': [build_lock.access('counting')] }

c['builders'] = [b1, b2, b3, b4]

Here we have four slaves b1, b2, b3, and b4. Each slave performs the same checkout, make, and test build step sequence. We want to enforce that at most one test step is executed between all slaves due to restrictions with the data base server. This is done by adding the locks= parameter with the third step. It takes a list of locks with their access mode. In this case only the db_lock is needed. The exclusive access mode is used to ensure there is at most one slave that executes the test step.

In addition to exclusive accessing the data base, we also want slaves to stay responsive even under the load of a large number of builds being triggered. For this purpose, the slave lock called build_lock is defined. Since the restraint holds for entire builds, the lock is specified in the builder with 'locks': [build_lock.access('counting')].

Note that you will occasionally see lock.access(mode) written as LockAccess(lock, mode). The two are equivalent, but the former is preferred.

[1]See http://en.wikipedia.org/wiki/Read/write_lock_pattern for more information.
[2]Deadlock is the situation where two or more slaves each hold a lock in exclusive mode, and in addition want to claim the lock held by the other slave exclusively as well. Since locks allow at most one exclusive user, both slaves will wait forever.
[3]Starving is the situation that only a few locks are available, and they are immediately grabbed by another build. As a result, it may take a long time before all locks needed by the starved build are free at the same time.

Status Targets

The Buildmaster has a variety of ways to present build status to various users. Each such delivery method is a Status Target object in the configuration's status list. To add status targets, you just append more objects to this list:

c['status'] = []

from buildbot.status import html
c['status'].append(html.Waterfall(http_port=8010))

from buildbot.status import mail
m = mail.MailNotifier(fromaddr="buildbot@localhost",
                      extraRecipients=["builds@lists.example.com"],
                      sendToInterestedUsers=False)
c['status'].append(m)

from buildbot.status import words
c['status'].append(words.IRC(host="irc.example.com", nick="bb",
                             channels=[{"channel": "#example1"},
                                       {"channel": "#example2",
                                        "password": "somesecretpassword"}]))

Most status delivery objects take a categories= argument, which can contain a list of category names: in this case, it will only show status for Builders that are in one of the named categories.

Note

Implementation Note

Each of these objects should be a service.MultiService which will be attached to the BuildMaster object when the configuration is processed. They should use self.parent.getStatus() to get access to the top-level IStatus object, either inside startService or later. They may call status.subscribe in startService to receive notifications of builder events, in which case they must define builderAdded and related methods. See the docstrings in buildbot/interfaces.py for full details.

The remainder of this section describes each built-in status target. A full list of status targets is available in the Status Target Index.

WebStatus
class buildbot.status.web.baseweb.WebStatus

The buildbot.status.html.WebStatus status target runs a small web server inside the buildmaster. You can point a browser at this web server and retrieve information about every build the buildbot knows about, as well as find out what the buildbot is currently working on.

The first page you will see is the Welcome Page, which contains links to all the other useful pages. By default, this page is served from the status/web/templates/root.html file in buildbot's library area.

One of the most complex resource provided by WebStatus is the Waterfall Display, which shows a time-based chart of events. This somewhat-busy display provides detailed information about all steps of all recent builds, and provides hyperlinks to look at individual build logs and source changes. By simply reloading this page on a regular basis, you will see a complete description of everything the buildbot is currently working on.

A similar, but more developer-oriented display is the Grid display. This arranges builds by SourceStamp (horizontal axis) and builder (vertical axis), and can provide quick information as to which revisions are passing or failing on which builders.

There are also pages with more specialized information. For example, there is a page which shows the last 20 builds performed by the buildbot, one line each. Each line is a link to detailed information about that build. By adding query arguments to the URL used to reach this page, you can narrow the display to builds that involved certain branches, or which ran on certain Builders. These pages are described in great detail below.

Configuration

The simplest possible configuration for WebStatus is:

from buildbot.status.html import WebStatus
c['status'].append(WebStatus(8080))

Buildbot uses a templating system for the web interface. The source of these templates can be found in the status/web/templates/ directory in buildbot's library area. You can override these templates by creating alternate versions in a templates/ directory within the buildmaster's base directory.

If that isn't enough you can also provide additional Jinja2 template loaders:

import jinja2
myloaders = [
    jinja2.FileSystemLoader("/tmp/mypath"),
    ]

c['status'].append(html.WebStatus(
    # ...
    jinja_loaders = myloaders,
))

The first time a buildmaster is created, the public_html/ directory is populated with some sample files, which you will probably want to customize for your own project. These files are all static: the buildbot does not modify them in any way as it serves them to HTTP clients.

Templates in templates/ take precedence over static files in public_html/.

The initial robots.txt file has Disallow lines for all of the dynamically-generated buildbot pages, to discourage web spiders and search engines from consuming a lot of CPU time as they crawl through the entire history of your buildbot. If you are running the buildbot behind a reverse proxy, you'll probably need to put the robots.txt file somewhere else (at the top level of the parent web server), and replace the URL prefixes in it with more suitable values.

If you would like to use an alternative root directory, add the public_html= option to the WebStatus creation:

c['status'].append(WebStatus(8080, public_html="/var/www/buildbot"))

In addition, if you are familiar with twisted.web Resource Trees, you can write code to add additional pages at places inside this web space. Just use webstatus.putChild to place these resources.

The following section describes the special URLs and the status views they provide.

Buildbot Web Resources

Certain URLs are magic, and the pages they serve are created by code in various classes in the buildbot.status.web package instead of being read from disk. The most common way to access these pages is for the buildmaster admin to write or modify the index.html page to contain links to them. Of course other project web pages can contain links to these buildbot pages as well.

Many pages can be modified by adding query arguments to the URL. For example, a page which shows the results of the most recent build normally does this for all builders at once. But by appending ?builder=i386 to the end of the URL, the page will show only the results for the i386 builder. When used in this way, you can add multiple builder= arguments to see multiple builders. Remembering that URL query arguments are separated from each other with ampersands, a URL that ends in ?builder=i386&builder=ppc would show builds for just those two Builders.

The branch= query argument can be used on some pages. This filters the information displayed by that page down to only the builds or changes which involved the given branch. Use branch=trunk to reference the trunk: if you aren't intentionally using branches, you're probably using trunk. Multiple branch= arguments can be used to examine multiple branches at once (so appending ?branch=foo&branch=bar to the URL will show builds involving either branch). No branch= arguments means to show builds and changes for all branches.

Some pages may include the Builder name or the build number in the main part of the URL itself. For example, a page that describes Build #7 of the i386 builder would live at /builders/i386/builds/7.

The table below lists all of the internal pages and the URLs that can be used to access them.

/waterfall

This provides a chronologically-oriented display of the activity of all builders. It is the same display used by the Waterfall display.

By adding one or more builder= query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more branch= query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more category= query arguments to the URL will limit the display to Builders that were defined with one of the given categories.

A show_events=true query argument causes the display to include non-Build events, like slaves attaching and detaching, as well as reconfiguration events. show_events=false hides these events. The default is to show them.

By adding the failures_only=true query argument, the Waterfall is restricted to only showing information about the builders that are currently failing. A builder is considered failing if the last finished build was not successful, a step in the current build(s) is failing, or if the builder is offline.

The last_time=, first_time=, and show_time= arguments will control what interval of time is displayed. The default is to show the latest events, but these can be used to look at earlier periods in history. The num_events= argument also provides a limit on the size of the displayed page.

The Waterfall has references to resources many of the other portions of the URL space: /builders for access to individual builds, /changes for access to information about source code changes, etc.

/grid

This provides a chronologically oriented display of builders, by revision. The builders are listed down the left side of the page, and the revisions are listed across the top.

By adding one or more category= arguments the grid will be restricted to revisions in those categories.

A width=N argument will limit the number of revisions shown to N, defaulting to 5.

A branch=BRANCHNAME argument will limit the grid to revisions on branch BRANCHNAME.

/tgrid

The Transposed Grid is similar to the standard grid, but, as the name implies, transposes the grid: the revisions are listed down the left side of the page, and the build hosts are listed across the top. It accepts the same query arguments. The exception being that instead of width the argument is named length.

This page also has a rev_order= query argument that lets you change in what order revisions are shown. Valid values are asc (ascending, oldest revision first) and desc (descending, newest revision first).

/console

EXPERIMENTAL: This provides a developer-oriented display of the last changes and how they affected the builders.

It allows a developer to quickly see the status of each builder for the first build including his or her change. A green box means that the change succeeded for all the steps for a given builder. A red box means that the changed introduced a new regression on a builder. An orange box means that at least one of the tests failed, but it was also failing in the previous build, so it is not possible to see if there were any regressions from this change. Finally a yellow box means that the test is in progress.

By adding one or more builder= query arguments, the Console view is restricted to only showing information about the given Builders. Adding a repository= argument will limit display to a given repository. By adding one or more branch= query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more category= query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the project= query argument, it's possible to restrict the view to changes from the given project. With the codebase= query argument, it's possible to restrict the view to changes for the given codebase.

By adding one or more name= query arguments to the URL, the console view is restricted to only showing changes made by the given users.

NOTE: To use this page, your buildbot.css file in public_html must be the one found in master/buildbot/status/web/files/default.css. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file.

The console view is still in development. At this moment by default the view sorts revisions lexically, which can lead to odd behavior with non-integer revisions (e.g., Git), or with integer revisions of different length (e.g., 999 and 1000). It also has some issues with displaying multiple branches at the same time. If you do have multiple branches, you should use the branch= query argument. The order_console_by_time option may help sorting revisions, although it depends on the date being set correctly in each commit:

w = html.WebStatus(http_port=8080, order_console_by_time=True)
/rss
This provides a rss feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.
/atom
This provides an atom feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.
/json
This view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See /json/help for detailed interactive documentation of the output formats for this view.
/buildstatus?builder=$BUILDERNAME&number=$BUILDNUM
This displays a waterfall-like chronologically-oriented view of all the steps for a given build number on a given builder.
/builders/$BUILDERNAME
This describes the given Builder and provides buttons to force a build. A numbuilds= argument will control how many build lines are displayed (5 by default). This page also accepts property filters of the form property.${PROPERTYNAME}=${PROPERTVALUE}. When used, only builds and build requests which have properties with matching string representations will be shown.
/builders/$BUILDERNAME/builds/$BUILDNUM
This describes a specific Build.
/builders/$BUILDERNAME/builds/$BUILDNUM/steps/$STEPNAME
This describes a specific BuildStep.
/builders/$BUILDERNAME/builds/$BUILDNUM/steps/$STEPNAME/logs/$LOGNAME
This provides an HTML representation of a specific logfile.
/builders/$BUILDERNAME/builds/$BUILDNUM/steps/$STEPNAME/logs/$LOGNAME/text
This returns the logfile as plain text, without any HTML coloring markup. It also removes the headers, which are the lines that describe what command was run and what the environment variable settings were like. This maybe be useful for saving to disk and feeding to tools like grep.
/changes
This provides a brief description of the ChangeSource in use (see Change Sources).
/changes/NN
This shows detailed information about the numbered Change: who was the author, what files were changed, what revision number was represented, etc.
/buildslaves

This summarizes each BuildSlave, including which Builders are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself.

A no_builders=1 URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.

/one_line_per_build

This page shows one line of text for each build, merging information from all Builders [1]. Each line specifies the name of the Builder, the number of the Build, what revision it used, and a summary of the results. Successful builds are in green, while failing builds are in red. The date and time of the build are added to the right-hand edge of the line. The lines are ordered by build finish timestamp.

One or more builder= or branch= arguments can be used to restrict the list. In addition, a numbuilds= argument will control how many lines are displayed (20 by default).

/builders

This page shows a small table, with one box for each Builder, containing the results of the most recent Build. It does not show the individual steps, or the current status. This is a simple summary of buildbot status: if this page is green, then all tests are passing.

As with /one_line_per_build, this page will also honor builder= and branch= arguments.

/png
This view produces an image in png format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view.
/png?builder=$BUILDERNAME&number=$BUILDNUM&size=large

This generate a large png image reporting the status of the given $BUILDNUM for the given builder $BUILDERNAME. The sizes are small, normal and large if no size is given the normal size is returned, if no $BUILDNUM is given the last build is returned. For example:

_images/success_normal.png
/png?builder=$BUILDERNAME&revision=$REVHASH&size=large
This generate a large png image reporting the status of the build of the given $REVHASH for the given builder $BUILDERNAME. If both number and revision are specified revision will be ignored. $REVHASH must be the full length hash not the short one.

Note

Buildbot stores old build details in pickle files so it's a good idea to enable cache if you are planning to actively search build statuses by revision.

/users
This page exists for authentication reasons when checking showUsersPage. It'll redirect to /authfail on False, /users/table on True, and give a username/password login prompt on 'auth'. Passing or failing results redirect to the same pages as False and True.
/users/table
This page shows a table containing users that are stored in the database. It has columns for their respective uid and identifier values, with the uid values being clickable for more detailed information relating to a user.
/users/table/{NN}
Shows all the attributes stored in the database relating to the user with uid {NN} in a table.
/about
This page gives a brief summary of the Buildbot itself: software version, versions of some libraries that the Buildbot depends upon, etc. It also contains a link to the buildbot.net home page.

There are also a set of web-status resources that are intended for use by other programs, rather than humans.

/change_hook
This provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See Change Hooks for more details.
WebStatus Configuration Parameters
HTTP Connection

The most common way to run a WebStatus is on a regular TCP port. To do this, just pass in the TCP port number when you create the WebStatus instance; this is called the http_port argument:

from buildbot.status.html import WebStatus
c['status'].append(WebStatus(http_port=8080))

The http_port argument is actually a strports specification for the port that the web server should listen on. This can be a simple port number, or a string like http_port="tcp:8080:interface=127.0.0.1" (to limit connections to the loopback interface, and therefore to clients running on the same host) [2].

If instead (or in addition) you provide the distrib_port argument, a twisted.web distributed server will be started either on a TCP port (if distrib_port is like "tcp:12345") or more likely on a UNIX socket (if distrib_port is like "unix:/path/to/socket").

The public_html option gives the path to a regular directory of HTML files that will be displayed alongside the various built-in URLs buildbot supplies. This is most often used to supply CSS files (/buildbot.css) and a top-level navigational file (/index.html), but can also serve any other files required - even build results!

Authorization

The buildbot web status is, by default, read-only. It displays lots of information, but users are not allowed to affect the operation of the buildmaster. However, there are a number of supported activities that can be enabled, and Buildbot can also perform rudimentary username/password authentication. The actions are:

view
view buildbot web status
forceBuild
force a particular builder to begin building, optionally with a specific revision, branch, etc.
forceAllBuilds
force all builders to start building
pingBuilder
"ping" a builder's buildslaves to check that they are alive
gracefulShutdown
gracefully shut down a slave when it is finished with its current build
pauseSlave
temporarily stop running new builds on a slave
stopBuild
stop a running build
stopAllBuilds
stop all running builds
cancelPendingBuild
cancel a build that has not yet started
cancelAllPendingBuilds
cancel all or selected subset of builds that has not yet started
stopChange
cancel builds that include a given change number
cleanShutdown
shut down the master gracefully, without interrupting builds
showUsersPage
access to page displaying users in the database, see User Objects

For each of these actions, you can configure buildbot to never allow the action, always allow the action, allow the action to any authenticated user, or check with a function of your creation to determine whether the action is OK (see below).

This is all configured with the Authz class:

from buildbot.status.html import WebStatus
from buildbot.status.web.authz import Authz
authz = Authz(
    forceBuild=True,
    stopBuild=True)
c['status'].append(WebStatus(http_port=8080, authz=authz))

Each of the actions listed above is an option to Authz. You can specify False (the default) to prohibit that action or True to enable it. Or you can specify a callable. Each such callable will take a username as its first argument. The remaining arguments vary depending on the type of authorization request. For forceBuild, the second argument is the builder status.

Authentication

If you do not wish to allow strangers to perform actions, but do want developers to have such access, you will need to add some authentication support. Pass an instance of status.web.auth.IAuth as a auth keyword argument to Authz, and specify the action as "auth".

from buildbot.status.html import WebStatus
from buildbot.status.web.authz import Authz
from buildbot.status.web.auth import BasicAuth
users = [('bob', 'secret-pass'), ('jill', 'super-pass')]
authz = Authz(auth=BasicAuth(users),
    forceBuild='auth', # only authenticated users
    pingBuilder=True, # but anyone can do this
)
c['status'].append(WebStatus(http_port=8080, authz=authz))
# or
from buildbot.status.web.auth import HTPasswdAuth
auth = (HTPasswdAuth('/path/to/htpasswd'))
# or
from buildbot.status.web.auth import UsersAuth
auth = UsersAuth()

The class BasicAuth implements a basic authentication mechanism using a list of user/password tuples provided from the configuration file. The class HTPasswdAuth implements an authentication against an .htpasswd file. The HTPasswdAprAuth a subclass of HTPasswdAuth use libaprutil for authenticating. This adds support for apr1/md5 and sha1 password hashes but requires libaprutil at runtime. The UsersAuth works with User Objects to check for valid user credentials.

If you need still-more flexibility, pass a function for the authentication action. That function will be called with an authenticated username and some action-specific arguments, and should return true if the action is authorized.

def canForceBuild(username, builder_status):
    if builder_status.getName() == 'smoketest':
        return True # any authenticated user can run smoketest
    elif username == 'releng':
        return True # releng can force whatever they want
    else:
        return False # otherwise, no way.

authz = Authz(auth=BasicAuth(users),
    forceBuild=canForceBuild)

The forceBuild and pingBuilder actions both supply a BuilderStatus object. The stopBuild action supplies a BuildStatus object. The cancelPendingBuild action supplies a BuildRequest. The remainder do not supply any extra arguments.

HTTP-based authentication by frontend server

In case if WebStatus is served through reverse proxy that supports HTTP-based authentication (like apache, lighttpd), it's possible to to tell WebStatus to trust web server and get username from request headers. This allows displaying correct usernames in build reason, interrupt messages, etc.

Just set useHttpHeader to True in Authz constructor.

authz = Authz(useHttpHeader=True) # WebStatus secured by web frontend with HTTP auth

Please note that WebStatus can decode password for HTTP Basic requests only (for Digest authentication it's just impossible). Custom status.web.auth.IAuth subclasses may just ignore password at all since it's already validated by web server.

Administrator must make sure that it's impossible to get access to WebStatus using other way than through frontend. Usually this means that WebStatus should listen for incoming connections only on localhost (or on some firewall-protected port). Frontend must require HTTP authentication to access WebStatus pages (using any source for credentials, such as htpasswd, PAM, LDAP).

If you allow unauthenticated access through frontend as well, it's possible to specify a httpLoginUrl which will be rendered on the WebStatus for unauthenticated users as a link named Login.

authz = Authz(useHttpHeader=True, httpLoginUrl='https://buildbot/login')

A configuration example with Apache HTTPD as reverse proxy could look like the following.

authz = Authz(
  useHttpHeader=True,
  httpLoginUrl='https://buildbot/login',
  auth = HTPasswdAprAuth('/var/www/htpasswd'),
  forceBuild = 'auth')

Corresponding Apache configuration.

ProxyPass / http://127.0.0.1:8010/

<Location /login>
    AuthType Basic
    AuthName "Buildbot"
    AuthUserFile /var/www/htpasswd
    Require valid-user

    RewriteEngine on
    RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/(.*)$
    RewriteRule ^.*$ https://%1/%2 [R,L]
</Location>
Logging configuration

The WebStatus uses a separate log file (http.log) to avoid clutter buildbot's default log (twistd.log) with request/response messages. This log is also, by default, rotated in the same way as the twistd.log file, but you can also customize the rotation logic with the following parameters if you need a different behaviour.

rotateLength
An integer defining the file size at which log files are rotated.
maxRotatedFiles
The maximum number of old log files to keep.
URL-decorating options

These arguments adds an URL link to various places in the WebStatus, such as revisions, repositories, projects and, optionally, ticket/bug references in change comments.

projects

A dictionary from strings to strings, mapping project names to URLs, or a callable taking a project name and returning an URL.

repositories

Same as the projects arg above, a dict or callable mapping project names to URLs.

Display-Specific Options

The order_console_by_time option affects the rendering of the console; see the description of the console above.

The numbuilds option determines the number of builds that most status displays will show. It can usually be overriden in the URL, e.g., ?numbuilds=13.

The num_events option gives the default number of events that the waterfall will display. The num_events_max gives the maximum number of events displayed, even if the web browser requests more.

Change Hooks

The /change_hook url is a magic URL which will accept HTTP requests and translate them into changes for buildbot. Implementations (such as a trivial json-based endpoint and a GitHub implementation) can be found in master/buildbot/status/web/hooks. The format of the url is /change_hook/DIALECT where DIALECT is a package within the hooks directory. Change_hook is disabled by default and each DIALECT has to be enabled separately, for security reasons

An example WebStatus configuration line which enables change_hook and two DIALECTS:

c['status'].append(html.WebStatus(http_port=8010,allowForce=True,
    change_hook_dialects={
                          'base': True,
                          'somehook': {'option1':True,
                                       'option2':False}}))

Within the WebStatus arguments, the change_hook key enables/disables the module and change_hook_dialects whitelists DIALECTs where the keys are the module names and the values are optional arguments which will be passed to the hooks.

The post_build_request.py script in master/contrib allows for the submission of an arbitrary change request. Run post_build_request.py --help for more information. The base dialect must be enabled for this to work.

GitHub hook

The GitHub hook is simple and takes no options.

c['status'].append(html.WebStatus(...,
                   change_hook_dialects={ 'github' : True }))

With this set up, add a Post-Receive URL for the project in the GitHub administrative interface, pointing to /change_hook/github relative to the root of the web status. For example, if the grid URL is http://builds.mycompany.com/bbot/grid, then point GitHub to http://builds.mycompany.com/bbot/change_hook/github. To specify a project associated to the repository, append ?project=name to the URL.

Note that there is a standalone HTTP server available for receiving GitHub notifications, as well: contrib/github_buildbot.py. This script may be useful in cases where you cannot expose the WebStatus for public consumption.

Warning

The incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from GitHub, potentially causing the buildmaster to run arbitrary code.

To protect URL against unauthorized access you should use change_hook_auth option

c['status'].append(html.WebStatus(...,
                                  change_hook_auth=["file:changehook.passwd"]))

And create a file changehook.passwd

user:password

Then, create a GitHub service hook (see https://help.github.com/articles/post-receive-hooks) with a WebHook URL like http://user:password@builds.mycompany.com/bbot/change_hook/github.

See the documentation for twisted cred for more option to pass to change_hook_auth.

Note that not using change_hook_auth can expose you to security risks.

BitBucket hook

The BitBucket hook is as simple as GitHub one and it also takes no options.

c['status'].append(html.WebStatus(...,
                   change_hook_dialects={ 'bitbucket' : True }))

When this is setup you should add a POST service pointing to /change_hook/bitbucket relative to the root of the web status. For example, it the grid URL is http://builds.mycompany.com/bbot/grid, then point BitBucket to http://builds.mycompany.com/change_hook/bitbucket. To specify a project associated to the repository, append ?project=name to the URL.

Note that there is a satandalone HTTP server available for receiving BitBucket notifications, as well: contrib/bitbucket_buildbot.py. This script may be useful in cases where you cannot expose the WebStatus for public consumption.

Warning

As in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from BitBucket, potentially causing the buildmaster to run arbitrary code.

To protect URL against unauthorized access you should use change_hook_auth option.

c['status'].append(html.WebStatus(...,
                                  change_hook_auth=["file:changehook.passwd"]))

Then, create a BitBucket service hook (see https://confluence.atlassian.com/display/BITBUCKET/POST+Service+Management) with a WebHook URL like http://user:password@builds.mycompany.com/bbot/change_hook/bitbucket.

Note that as before, not using change_hook_auth can expose you to security risks.

Google Code hook

The Google Code hook is quite similar to the GitHub Hook. It has one option for the "Post-Commit Authentication Key" used to check if the request is legitimate:

c['status'].append(html.WebStatus(
    # ...
    change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX'}}
))

This will add a "Post-Commit URL" for the project in the Google Code administrative interface, pointing to /change_hook/googlecode relative to the root of the web status.

Alternatively, you can use the GoogleCodeAtomPoller ChangeSource that periodically poll the Google Code commit feed for changes.

Note

Google Code doesn't send the branch on which the changes were made. So, the hook always returns 'default' as the branch, you can override it with the 'branch' option:

change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX', 'branch': 'master'}}
Poller hook

The poller hook allows you to use GET or POST requests to trigger polling. One advantage of this is your buildbot instance can poll at launch (using the pollAtLaunch flag) to get changes that happened while it was down, but then you can still use a commit hook to get fast notification of new changes.

Suppose you have a poller configured like this:

c['change_source'] = SVNPoller(
    svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/amanda",
    split_file=split_file_branches,
    pollInterval=24*60*60,
    pollAtLaunch=True)

And you configure your WebStatus to enable this hook:

c['status'].append(html.WebStatus(
    # ...
    change_hook_dialects={'poller': True}
))

Then you will be able to trigger a poll of the SVN repository by poking the /change_hook/poller URL from a commit hook like this:

curl -s -F poller=https://amanda.svn.sourceforge.net/svnroot/amanda/amanda \
    http://yourbuildbot/change_hook/poller

If no poller argument is provided then the hook will trigger polling of all polling change sources.

You can restrict which pollers the webhook has access to using the allowed option:

c['status'].append(html.WebStatus(
    # ...
    change_hook_dialects={'poller': {'allowed': ['https://amanda.svn.sourceforge.net/svnroot/amanda/amanda']}}
))
GitLab hook

The GitLab hook is as simple as GitHub one and it also takes no options.

c['status'].append(html.WebStatus(
    # ...
    change_hook_dialects={ 'gitlab' : True }
))

When this is setup you should add a POST service pointing to /change_hook/gitlab relative to the root of the web status. For example, it the grid URL is http://builds.mycompany.com/bbot/grid, then point GitLab to http://builds.mycompany.com/change_hook/gitlab. The project and/or codebase can also be passed in the URL by appending ?project=name or ?codebase=foo to the URL. These parameters will be passed along to the scheduler.

Warning

As in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from your GitLab server, potentially causing the buildmaster to run arbitrary code.

To protect URL against unauthorized access you should use change_hook_auth option.

c['status'].append(html.WebStatus(
    # ...
    change_hook_auth=["file:changehook.passwd"]
))

Then, create a GitLab service hook (see https://your.gitlab.server/help/web_hooks) with a WebHook URL like http://user:password@builds.mycompany.com/bbot/change_hook/gitlab.

Note that as before, not using change_hook_auth can expose you to security risks.

Gitorious Hook

The Gitorious hook is as simple as GitHub one and it also takes no options.

c['status'].append(html.WebStatus(
    # ...
    change_hook_dialects={'gitorious': True}
))

When this is setup you should add a POST service pointing to /change_hook/gitorious relative to the root of the web status. For example, it the grid URL is http://builds.mycompany.com/bbot/grid, then point Gitorious to http://builds.mycompany.com/change_hook/gitorious.

Warning

As in the previous case, the incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from your Gitorious server, potentially causing the buildmaster to run arbitrary code.

To protect URL against unauthorized access you should use change_hook_auth option.

c['status'].append(html.WebStatus(
    # ...
    change_hook_auth=["file:changehook.passwd"]
))

Then, create a Gitorious web hook (see http://gitorious.org/gitorious/pages/WebHooks) with a WebHook URL like http://user:password@builds.mycompany.com/bbot/change_hook/gitorious.

Note that as before, not using change_hook_auth can expose you to security risks.

Note

Web hooks are only available for local Gitorious installations, since this feature is not offered as part of Gitorious.org yet.

MailNotifier
class buildbot.status.mail.MailNotifier

The buildbot can also send email when builds finish. The most common use of this is to tell developers when their change has caused the build to fail. It is also quite common to send a message to a mailing list (usually named builds or similar) about every build.

The MailNotifier status target is used to accomplish this. You configure it by specifying who mail should be sent to, under what circumstances mail should be sent, and how to deliver the mail. It can be configured to only send out mail for certain builders, and only send messages when the build fails, or when the builder transitions from success to failure. It can also be configured to include various build logs in each message.

If a proper lookup function is configured, the message will be sent to the "interested users" list (Doing Things With Users), which includes all developers who made changes in the build. By default, however, Buildbot does not know how to construct an email addressed based on the information from the version control system. See the lookup argument, below, for more information.

You can add additional, statically-configured, recipients with the extraRecipients argument. You can also add interested users by setting the owners build property to a list of users in the scheduler constructor (Configuring Schedulers).

Each MailNotifier sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple MailNotifiers.

The following simple example will send an email upon the completion of each build, to just those developers whose Changes were included in the build. The email contains a description of the Build, its results, and URLs where more information can be obtained.

from buildbot.status.mail import MailNotifier
mn = MailNotifier(fromaddr="buildbot@example.org", lookup="example.org")
c['status'].append(mn)

To get a simple one-message-per-build (say, for a mailing list), use the following form instead. This form does not send mail to individual developers (and thus does not need the lookup= argument, explained below), instead it only ever sends mail to the extra recipients named in the arguments:

mn = MailNotifier(fromaddr="buildbot@example.org",
                  sendToInterestedUsers=False,
                  extraRecipients=['listaddr@example.org'])

If your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying smtpUser and smptPassword:

mn = MailNotifier(fromaddr="myuser@gmail.com",
                  sendToInterestedUsers=False,
                  extraRecipients=["listaddr@example.org"],
                  relayhost="smtp.gmail.com", smtpPort=587,
                  smtpUser="myuser@gmail.com", smtpPassword="mypassword")

If you want to require Transport Layer Security (TLS), then you can also set useTls:

mn = MailNotifier(fromaddr="myuser@gmail.com",
                  sendToInterestedUsers=False,
                  extraRecipients=["listaddr@example.org"],
                  useTls=True, relayhost="smtp.gmail.com", smtpPort=587,
                  smtpUser="myuser@gmail.com", smtpPassword="mypassword")

Note

If you see twisted.mail.smtp.TLSRequiredError exceptions in the log while using TLS, this can be due either to the server not supporting TLS or to a missing PyOpenSSL package on the buildmaster system.

In some cases it is desirable to have different information then what is provided in a standard MailNotifier message. For this purpose MailNotifier provides the argument messageFormatter (a function) which allows for the creation of messages with unique content.

For example, if only short emails are desired (e.g., for delivery to phones)

from buildbot.status.builder import Results
def messageFormatter(mode, name, build, results, master_status):
    result = Results[results]

    text = list()
    text.append("STATUS: %s" % result.title())
    return {
        'body' : "\n".join(text),
        'type' : 'plain'
    }

mn = MailNotifier(fromaddr="buildbot@example.org",
                  sendToInterestedUsers=False,
                  mode=('problem',),
                  extraRecipients=['listaddr@example.org'],
                  messageFormatter=messageFormatter)

Another example of a function delivering a customized html email containing the last 80 log lines of logs of the last build step is given below:

from buildbot.status.builder import Results

import cgi, datetime

def html_message_formatter(mode, name, build, results, master_status):
    """Provide a customized message to Buildbot's MailNotifier.

    The last 80 lines of the log are provided as well as the changes
    relevant to the build.  Message content is formatted as html.
    """
    result = Results[results]

    limit_lines = 80
    text = list()
    text.append(u'<h4>Build status: %s</h4>' % result.upper())
    text.append(u'<table cellspacing="10"><tr>')
    text.append(u"<td>Buildslave for this Build:</td><td><b>%s</b></td></tr>" % build.getSlavename())
    if master_status.getURLForThing(build):
        text.append(u'<tr><td>Complete logs for all build steps:</td><td><a href="%s">%s</a></td></tr>'
                    % (master_status.getURLForThing(build),
                       master_status.getURLForThing(build))
                    )
        text.append(u'<tr><td>Build Reason:</td><td>%s</td></tr>' % build.getReason())
        source = u""
        for ss in build.getSourceStamps():
            if ss.codebase:
                source += u'%s: ' % ss.codebase
            if ss.branch:
                source += u"[branch %s] " % ss.branch
            if ss.revision:
                source +=  ss.revision
            else:
                source += u"HEAD"
            if ss.patch:
                source += u" (plus patch)"
            if ss.patch_info: # add patch comment
                source += u" (%s)" % ss.patch_info[1]
        text.append(u"<tr><td>Build Source Stamp:</td><td><b>%s</b></td></tr>" % source)
        text.append(u"<tr><td>Blamelist:</td><td>%s</td></tr>" % ",".join(build.getResponsibleUsers()))
        text.append(u'</table>')
        if ss.changes:
            text.append(u'<h4>Recent Changes:</h4>')
            for c in ss.changes:
                cd = c.asDict()
                when = datetime.datetime.fromtimestamp(cd['when'] ).ctime()
                text.append(u'<table cellspacing="10">')
                text.append(u'<tr><td>Repository:</td><td>%s</td></tr>' % cd['repository'] )
                text.append(u'<tr><td>Project:</td><td>%s</td></tr>' % cd['project'] )
                text.append(u'<tr><td>Time:</td><td>%s</td></tr>' % when)
                text.append(u'<tr><td>Changed by:</td><td>%s</td></tr>' % cd['who'] )
                text.append(u'<tr><td>Comments:</td><td>%s</td></tr>' % cd['comments'] )
                text.append(u'</table>')
                files = cd['files']
                if files:
                    text.append(u'<table cellspacing="10"><tr><th align="left">Files</th></tr>')
                    for file in files:
                        text.append(u'<tr><td>%s:</td></tr>' % file['name'] )
                    text.append(u'</table>')
        text.append(u'<br>')
        # get log for last step
        logs = build.getLogs()
        # logs within a step are in reverse order. Search back until we find stdio
        for log in reversed(logs):
            if log.getName() == 'stdio':
                break
        name = "%s.%s" % (log.getStep().getName(), log.getName())
        status, dummy = log.getStep().getResults()
        content = log.getText().splitlines() # Note: can be VERY LARGE
        url = u'%s/steps/%s/logs/%s' % (master_status.getURLForThing(build),
                                       log.getStep().getName(),
                                       log.getName())

        text.append(u'<i>Detailed log of last build step:</i> <a href="%s">%s</a>'
                    % (url, url))
        text.append(u'<br>')
        text.append(u'<h4>Last %d lines of "%s"</h4>' % (limit_lines, name))
        unilist = list()
        for line in content[len(content)-limit_lines:]:
            unilist.append(cgi.escape(unicode(line,'utf-8')))
        text.append(u'<pre>')
        text.extend(unilist)
        text.append(u'</pre>')
        text.append(u'<br><br>')
        text.append(u'<b>-The Buildbot</b>')
        return {
            'body': u"\n".join(text),
            'type': 'html'
            }

mn = MailNotifier(fromaddr="buildbot@example.org",
                  sendToInterestedUsers=False,
                  mode=('failing',),
                  extraRecipients=['listaddr@example.org'],
                  messageFormatter=html_message_formatter)
MailNotifier arguments
fromaddr
The email address to be used in the 'From' header.
sendToInterestedUsers
(boolean). If True (the default), send mail to all of the Interested Users. If False, only send mail to the extraRecipients list.
extraRecipients
(list of strings). A list of email addresses to which messages should be sent (in addition to the InterestedUsers list, which includes any developers who made Changes that went into this build). It is a good idea to create a small mailing list and deliver to that, then let subscribers come and go as they please.
subject
(string). A string to be used as the subject line of the message. %(builder)s will be replaced with the name of the builder which provoked the message.
mode

Mode is a list of strings; however there are two strings which can be used as shortcuts instead of the full lists. The possible shortcuts are:

all
Always send mail about builds. Equivalent to (change, failing, passing, problem, warnings, exception).
warnings
Equivalent to (warnings, failing).

(list of strings). A combination of:

change
Send mail about builds which change status.
failing
Send mail about builds which fail.
passing
Send mail about builds which succeed.
problem
Send mail about a build which failed when the previous build has passed.
warnings
Send mail about builds which generate warnings.
exception
Send mail about builds which generate exceptions.

Defaults to (failing, passing, warnings).

builders
(list of strings). A list of builder names for which mail should be sent. Defaults to None (send mail for all builds). Use either builders or categories, but not both.
categories
(list of strings). A list of category names to serve status information for. Defaults to None (all categories). Use either builders or categories, but not both.
addLogs
(boolean). If True, include all build logs as attachments to the messages. These can be quite large. This can also be set to a list of log names, to send a subset of the logs. Defaults to False.
addPatch
(boolean). If True, include the patch content if a patch was present. Patches are usually used on a Try server. Defaults to True.
buildSetSummary
(boolean). If True, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to False.
relayhost
(string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost'
smtpPort
(int). The port that will be used on outbound SMTP connections. Defaults to 25.
useTls
(boolean). When this argument is True (default is False) MailNotifier sends emails using TLS and authenticates with the relayhost. When using TLS the arguments smtpUser and smtpPassword must also be specified.
smtpUser
(string). The user name to use when authenticating with the relayhost.
smtpPassword
(string). The password that will be used when authenticating with the relayhost.
lookup

(implementor of IEmailLookup). Object which provides IEmailLookup, which is responsible for mapping User names (which come from the VC system) into valid email addresses.

If the argument is not provided, the MailNotifier will attempt to build the sendToInterestedUsers from the authors of the Changes that led to the Build via User Objects. If the author of one of the Build's Changes has an email address stored, it will added to the recipients list. With this method, owners are still added to the recipients. Note that, in the current implementation of user objects, email addresses are not stored; as a result, unless you have specifically added email addresses to the user database, this functionality is unlikely to actually send any emails.

Most of the time you can use a simple Domain instance. As a shortcut, you can pass as string: this will be treated as if you had provided Domain(str). For example, lookup='twistedmatrix.com' will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See buildbot/status/mail.py for more details.

Regardless of the setting of lookup, MailNotifier will also send mail to addresses in the extraRecipients list.

messageFormatter
This is a optional function that can be used to generate a custom mail message. A messageFormatter function takes the mail mode (mode), builder name (name), the build status (build), the result code (results), and the BuildMaster status (master_status). It returns a dictionary. The body key gives a string that is the complete text of the message. The type key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The subject key is optional, but gives the subject for the email.
extraHeaders
(dictionary) A dictionary containing key/value pairs of extra headers to add to sent e-mails. Both the keys and the values may be a Interpolate instance.
previousBuildGetter
An optional function to calculate the previous build to the one at hand. A previousBuildGetter takes a BuildStatus and returns a BuildStatus. This function is useful when builders don't process their requests in order of arrival (chronologically) and therefore the order of completion of builds does not reflect the order in which changes (and their respective requests) arrived into the system. In such scenarios, status transitions in the chronological sequence of builds within a builder might not reflect the actual status transition in the topological sequence of changes in the tree. What's more, the latest build (the build at hand) might not always be for the most recent request so it might not make sense to send a "change" or "problem" email about it. Returning None from this function will prevent such emails from going out.

As a help to those writing messageFormatter functions, the following table describes how to get some useful pieces of information from the various status objects:

Name of the builder that generated this event
name
Title of the buildmaster
master_status.getTitle
MailNotifier mode
mode (a combination of change, failing, passing, problem, warnings,
exception, all)

Builder result as a string

from buildbot.status.builder import Results
result_str = Results[results]
# one of 'success', 'warnings', 'failure', 'skipped', or 'exception'
URL to build page
master_status.getURLForThing(build)
URL to buildbot main page.
master_status.getBuildbotURL()
Build text
build.getText()
Mapping of property names to values
build.getProperties() (a Properties instance)
Slave name
build.getSlavename()
Build reason (from a forced build)
build.getReason()
List of responsible users
build.getResponsibleUsers()

Source information (only valid if ss is not None)

A build has a set of sourcestamps:

for ss in build.getSourceStamp():
    branch = ss.branch
    revision = ss.revision
    patch = ss.patch
    changes = ss.changes # list

A change object has the following useful information:

who
(str) who made this change
revision
(str) what VC revision is this change
branch
(str) on what branch did this change occur
when
(str) when did this change occur
files
(list of str) what files were affected in this change
comments
(str) comments reguarding the change.

The Change methods asText and asDict can be used to format the information above. asText returns a list of strings and asDict returns a dictionary suitable for html/mail rendering.

Log information

logs = list()
for log in build.getLogs():
    log_name = "%s.%s" % (log.getStep().getName(), log.getName())
    log_status, dummy = log.getStep().getResults()
    log_body = log.getText().splitlines() # Note: can be VERY LARGE
    log_url = '%s/steps/%s/logs/%s' % (master_status.getURLForThing(build),
                                       log.getStep().getName(),
                                       log.getName())
    logs.append((log_name, log_url, log_body, log_status))
IRC Bot
class buildbot.status.words.IRC

The buildbot.status.words.IRC status target creates an IRC bot which will attach to certain channels and be available for status queries. It can also be asked to announce builds as they occur, or be told to shut up.

from buildbot.status import words
irc = words.IRC("irc.example.org", "botnickname",
                useColors=False,
                channels=[{"channel": "#example1"},
                          {"channel": "#example2",
                           "password": "somesecretpassword"}],
                password="mysecretnickservpassword",
                notify_events={
                  'exception': 1,
                  'successToFailure': 1,
                  'failureToSuccess': 1,
                })
c['status'].append(irc)

Take a look at the docstring for words.IRC for more details on configuring this service. Note that the useSSL option requires PyOpenSSL. The password argument, if provided, will be sent to Nickserv to claim the nickname: some IRC servers will not allow clients to send private messages until they have logged in with a password. We can also specify a different port number. Default value is 6667.

To use the service, you address messages at the buildbot, either normally (botnickname: status) or with private messages (/msg botnickname status). The buildbot will respond in kind.

The bot will add color to some of its messages. This is enabled by default, you might turn it off with useColors=False argument to words.IRC().

If you issue a command that is currently not available, the buildbot will respond with an error message. If the noticeOnChannel=True option was used, error messages will be sent as channel notices instead of messaging. The default value is noticeOnChannel=False.

Some of the commands currently available:

list builders
Emit a list of all configured builders
status BUILDER
Announce the status of a specific Builder: what it is doing right now.
status all
Announce the status of all Builders
watch BUILDER
If the given Builder is currently running, wait until the Build is finished and then announce the results.
last BUILDER
Return the results of the last build to run on the given Builder.
join CHANNEL
Join the given IRC channel
leave CHANNEL
Leave the given IRC channel
notify on|off|list EVENT

Report events relating to builds. If the command is issued as a private message, then the report will be sent back as a private message to the user who issued the command. Otherwise, the report will be sent to the channel. Available events to be notified are:

started
A build has started
finished
A build has finished
success
A build finished successfully
failure
A build failed
exception
A build generated and exception
xToY
The previous build was x, but this one is Y, where x and Y are each one of success, warnings, failure, exception (except Y is capitalized). For example: successToFailure will notify if the previous build was successful, but this one failed
help COMMAND
Describe a command. Use help commands to get a list of known commands.
shutdown ARG

Control the shutdown process of the buildbot master. Available arguments are:

check
Check if the buildbot master is running or shutting down
start
Start clean shutdown
stop
Stop clean shutdown
now
Shutdown immediately without waiting for the builders to finish
source
Announce the URL of the Buildbot's home page.
version
Announce the version of this Buildbot.

Additionally, the config file may specify default notification options as shown in the example earlier.

If the allowForce=True option was used, some additional commands will be available:

force build [--branch=BRANCH] [--revision=REVISION] [--props=PROP1=VAL1,PROP2=VAL2...] BUILDER REASON
Tell the given Builder to start a build of the latest code. The user requesting the build and REASON are recorded in the Build status. The buildbot will announce the build's status when it finishes.The user can specify a branch and/or revision with the optional parameters --branch=BRANCH and --revision=REVISION. The user can also give a list of properties with --props=PROP1=VAL1,PROP2=VAL2...
stop build BUILDER REASON
Terminate any running build in the given Builder. REASON will be added to the build status to explain why it was stopped. You might use this if you committed a bug, corrected it right away, and don't want to wait for the first build (which is destined to fail) to complete before starting the second (hopefully fixed) build.

If the categories is set to a category of builders (see the categories option in Builder Configuration) changes related to only that category of builders will be sent to the channel.

If the useRevisions option is set to True, the IRC bot will send status messages that replace the build number with a list of revisions that are contained in that build. So instead of seeing build #253 of ..., you would see something like build containing revisions [a87b2c4]. Revisions that are stored as hashes are shortened to 7 characters in length, as multiple revisions can be contained in one build and may exceed the IRC message length limit.

Two additional arguments can be set to control how fast the IRC bot tries to reconnect when it encounters connection issues. lostDelay is the number of of seconds the bot will wait to reconnect when the connection is lost, where as failedDelay is the number of seconds until the bot tries to reconnect when the connection failed. lostDelay defaults to a random number between 1 and 5, while failedDelay defaults to a random one between 45 and 60. Setting random defaults like this means multiple IRC bots are less likely to deny each other by flooding the server.

PBListener
class buildbot.status.client.PBListener
import buildbot.status.client
pbl = buildbot.status.client.PBListener(port=int, user=str,
                                        passwd=str)
c['status'].append(pbl)

This sets up a PB listener on the given TCP port, to which a PB-based status client can connect and retrieve status information. buildbot statusgui (statusgui) is an example of such a status client. The port argument can also be a strports specification string.

StatusPush
class buildbot.status.status_push.StatusPush
def Process(self):
  print str(self.queue.popChunk())
  self.queueNextServerPush()

import buildbot.status.status_push
sp = buildbot.status.status_push.StatusPush(serverPushCb=Process,
                                            bufferDelay=0.5,
                                            retryDelay=5)
c['status'].append(sp)

StatusPush batches events normally processed and sends it to the serverPushCb callback every bufferDelay seconds. The callback should pop items from the queue and then queue the next callback. If no items were popped from self.queue, retryDelay seconds will be waited instead.

HttpStatusPush
import buildbot.status.status_push
sp = buildbot.status.status_push.HttpStatusPush(
        serverUrl="http://example.com/submit")
c['status'].append(sp)

HttpStatusPush builds on StatusPush and sends HTTP requests to serverUrl, with all the items json-encoded. It is useful to create a status front end outside of buildbot for better scalability.

GerritStatusPush
class buildbot.status.status_gerrit.GerritStatusPush
from buildbot.status.status_gerrit import GerritStatusPush
from buildbot.status.builder import Results, SUCCESS, RETRY

def gerritReviewCB(builderName, build, result, status, arg):
    if result == RETRY:
        return None, 0, 0

    message =  "Buildbot finished compiling your patchset\n"
    message += "on configuration: %s\n" % builderName
    message += "The result is: %s\n" % Results[result].upper()

    if arg:
        message += "\nFor more details visit:\n"
        message += status.getURLForThing(build) + "\n"

    # message, verified, reviewed
    return message, (result == SUCCESS or -1), 0

def gerritStartCB(builderName, build, arg):
    message = "Buildbot started compiling your patchset\n"
    message += "on configuration: %s\n" % builderName

    return message

def gerritSummaryCB(buildInfoList, results, status, arg):
    success = False
    failure = False

    msgs = []

    for buildInfo in buildInfoList:
        msg = "Builder %(name)s %(resultText)s (%(text)s)" % buildInfo
        link = buildInfo.get('url', None)
        if link:
            msg += " - " + link
        else:
            msg += "."
        msgs.append(msg)

        if buildInfo['result'] == SUCCESS:
            success = True
        else:
            failure = True

    msg = '\n\n'.join(msgs)

    if success and not failure:
        verified = 1
    else:
        verified = -1

    reviewed = 0
    return (msg, verified, reviewed)

c['buildbotURL'] = 'http://buildbot.example.com/'
c['status'].append(GerritStatusPush('127.0.0.1', 'buildbot',
                                    reviewCB=gerritReviewCB,
                                    reviewArg=c['buildbotURL'],
                                    startCB=gerritStartCB,
                                    startArg=c['buildbotURL'],
                                    summaryCB=gerritSummaryCB,
                                    summaryArg=c['buildbotURL']))

GerritStatusPush sends review of the Change back to the Gerrit server, optionally also sending a message when a build is started. GerritStatusPush can send a separate review for each build that completes, or a single review summarizing the results for all of the builds. By default, a single summary review is sent; that is, a default summaryCB is provided, but no reviewCB or startCB.

reviewCB, if specified, determines the message and score to give when sending a review for each separate build. It should return a tuple of (message, verified, reviewed).

If startCB is specified, it should return a message. This message will be sent to the Gerrit server when each build is started.

summaryCB, if specified, determines the message and score to give when sending a single review summarizing all of the builds. It should return a tuple of (message, verified, reviewed).

GitHubStatus
class buildbot.status.github.GitHubStatus
from buildbot.status.github import GitHubStatus

repoOwner = Interpolate("%(prop:github_repo_owner)s")
repoName = Interpolate("%(prop:github_repo_name)s")
sha = Interpolate("%(src::revision)s")
gs = GitHubStatus(token='githubAPIToken',
                  repoOwner=repoOwner,
                  repoName=repoName,
                  sha=sha,
                  startDescription='Build started.',
                  endDescription='Build done.',
                  )
buildbot_bbtools = BuilderConfig(
    name='builder-name',
    slavenames=['slave1'],
    factory=BuilderFactory(),
    properties={
        "github_repo_owner": "buildbot",
        "github_repo_name": "bbtools",
        },
    )
c['builders'].append(buildbot_bbtools)
c['status'].append(gs)

GitHubStatus publishes a build status using GitHub Status API.

It requires txgithub <https://pypi.python.org/pypi/txgithub> package to allow interaction with GitHub API.

It is configured with at least a GitHub API token, repoOwner and repoName arguments.

You can create a token from you own GitHub - Profile - Applications - Register new application or use an external tool to generate one.

repoOwner, repoName are used to inform the plugin where to send status for build. This allow using a single GitHubStatus for multiple projects. repoOwner, repoName can be passes as a static string (for single project) or Interpolate for dynamic substitution in multiple project.

sha argument is use to define the commit SHA for which to send the status. By default sha is defined as: %(src::revision)s.

In case any of repoOwner, repoName or sha returns None, False or empty string, the plugin will skip sending the status.

You can define custom start and end build messages using the startDescription and endDescription optional interpolation arguments.

[1]Apparently this is the same way http://buildd.debian.org displays build status
[2]It may even be possible to provide SSL access by using a specification like "ssl:12345:privateKey=mykey.pen:certKey=cert.pem", but this is completely untested

Customization

For advanced users, Buildbot acts as a framework supporting a customized build application. For the most part, such configurations consist of subclasses set up for use in a regular Buildbot configuration file.

This chapter describes some of the more common idioms in advanced Buildbot configurations.

At the moment, this chapter is an unordered set of suggestions; if you'd like to clean it up, fork the project on GitHub and get started!

Programmatic Configuration Generation

Bearing in mind that master.cfg is a Python file, large configurations can be shortened considerably by judicious use of Python loops. For example, the following will generate a builder for each of a range of supported versions of Python:

pythons = [ 'python2.4', 'python2.5', 'python2.6', 'python2.7',
            'python3.2', 'python3.3' ]
pytest_slaves = [ "slave%s" % n for n in range(10) ]
for python in pythons:
    f = BuildFactory()
    f.addStep(SVN(...))
    f.addStep(ShellCommand(command=[ python, 'test.py' ]))
    c['builders'].append(BuilderConfig(
            name="test-%s" % python,
            factory=f,
            slavenames=pytest_slaves))

Merge Request Functions

The logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of True or False described in Merging Build Requests.

The callable will be invoked with three positional arguments: a Builder object and two BuildRequest objects. It should return true if the requests can be merged, and False otherwise. For example:

def mergeRequests(builder, req1, req2):
    "any requests with the same branch can be merged"
    return req1.source.branch == req2.source.branch
c['mergeRequests'] = mergeRequests

In many cases, the details of the SourceStamps and BuildRequests are important. In this example, only BuildRequests with the same "reason" are merged; thus developers forcing builds for different reasons will see distinct builds. Note the use of the canBeMergedWith method to access the source stamp compatibility algorithm.

def mergeRequests(builder, req1, req2):
    if req1.source.canBeMergedWith(req2.source) and  req1.reason == req2.reason:
       return True
    return False
c['mergeRequests'] = mergeRequests

If it's necessary to perform some extended operation to determine whether two requests can be merged, then the mergeRequests callable may return its result via Deferred. Note, however, that the number of invocations of the callable is proportional to the square of the request queue length, so a long-running callable may cause undesirable delays when the queue length grows. For example:

def mergeRequests(builder, req1, req2):
    d = defer.gatherResults([
        getMergeInfo(req1.source.revision),
        getMergeInfo(req2.source.revision),
    ])
    def process(info1, info2):
        return info1 == info2
    d.addCallback(process)
    return d
c['mergeRequests'] = mergeRequests

Builder Priority Functions

The prioritizeBuilders configuration key specifies a function which is called with two arguments: a BuildMaster and a list of Builder objects. It should return a list of the same Builder objects, in the desired order. It may also remove items from the list if builds should not be started on those builders. If necessary, this function can return its results via a Deferred (it is called with maybeDeferred).

A simple prioritizeBuilders implementation might look like this:

def prioritizeBuilders(buildmaster, builders):
    """Prioritize builders.  'finalRelease' builds have the highest
    priority, so they should be built before running tests, or
    creating builds."""
    builderPriorities = {
        "finalRelease": 0,
        "test": 1,
        "build": 2,
    }
    builders.sort(key=lambda b: builderPriorities.get(b.name, 0))
    return builders

c['prioritizeBuilders'] = prioritizeBuilders

Build Priority Functions

When a builder has multiple pending build requests, it uses a nextBuild function to decide which build it should start first. This function is given two parameters: the Builder, and a list of BuildRequest objects representing pending build requests.

A simple function to prioritize release builds over other builds might look like this:

def nextBuild(bldr, requests):
    for r in requests:
        if r.source.branch == 'release':
            return r
    return requests[0]

If some non-immediate result must be calculated, the nextBuild function can also return a Deferred:

def nextBuild(bldr, requests):
    d = get_request_priorities(requests)
    def pick(priorities):
        if requests:
            return sorted(zip(priorities, requests))[0][1]
    d.addCallback(pick)
    return d

The nextBuild function is passed as parameter to BuilderConfig.

Customizing SVNPoller

Each source file that is tracked by a Subversion repository has a fully-qualified SVN URL in the following form: ({REPOURL})({PROJECT-plus-BRANCH})({FILEPATH}). When you create the SVNPoller, you give it a svnurl value that includes all of the {REPOURL} and possibly some portion of the {PROJECT-plus-BRANCH} string. The SVNPoller is responsible for producing Changes that contain a branch name and a {FILEPATH} (which is relative to the top of a checked-out tree). The details of how these strings are split up depend upon how your repository names its branches.

PROJECT/BRANCHNAME/FILEPATH repositories

One common layout is to have all the various projects that share a repository get a single top-level directory each, with branches, tags, and trunk subdirectories:

amanda/trunk
      /branches/3_2
               /3_3
      /tags/3_2_1
           /3_2_2
           /3_3_0

To set up a SVNPoller that watches the Amanda trunk (and nothing else), we would use the following, using the default split_file:

from buildbot.changes.svnpoller import SVNPoller
c['change_source'] = SVNPoller(
   svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/amanda/trunk")

In this case, every Change that our SVNPoller produces will have its branch attribute set to None, to indicate that the Change is on the trunk. No other sub-projects or branches will be tracked.

If we want our ChangeSource to follow multiple branches, we have to do two things. First we have to change our svnurl= argument to watch more than just amanda/trunk. We will set it to amanda so that we'll see both the trunk and all the branches. Second, we have to tell SVNPoller how to split the ({PROJECT-plus-BRANCH})({FILEPATH}) strings it gets from the repository out into ({BRANCH}) and ({FILEPATH})`.

We do the latter by providing a split_file function. This function is responsible for splitting something like branches/3_3/common-src/amanda.h into branch='branches/3_3' and filepath='common-src/amanda.h'. The function is always given a string that names a file relative to the subdirectory pointed to by the SVNPoller's svnurl= argument. It is expected to return a dictionary with at least the path key. The splitter may optionally set branch, project and repository. For backwards compatibility it may return a tuple of (branchname, path). It may also return None to indicate that the file is of no interest.

Note

the function should return branches/3_3 rather than just 3_3 because the SVN checkout step, will append the branch name to the baseURL, which requires that we keep the branches component in there. Other VC schemes use a different approach towards branches and may not require this artifact.

If your repository uses this same {PROJECT}/{BRANCH}/{FILEPATH} naming scheme, the following function will work:

def split_file_branches(path):
    pieces = path.split('/')
    if len(pieces) > 1 and pieces[0] == 'trunk':
        return (None, '/'.join(pieces[1:]))
    elif len(pieces) > 2 and pieces[0] == 'branches':
        return ('/'.join(pieces[0:2]),
                '/'.join(pieces[2:]))
    else:
        return None

In fact, this is the definition of the provided split_file_branches function. So to have our Twisted-watching SVNPoller follow multiple branches, we would use this:

from buildbot.changes.svnpoller import SVNPoller, split_file_branches
c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted",
                               split_file=split_file_branches)

Changes for all sorts of branches (with names like "branches/1.5.x", and None to indicate the trunk) will be delivered to the Schedulers. Each Scheduler is then free to use or ignore each branch as it sees fit.

If you have multiple projects in the same repository your split function can attach a project name to the Change to help the Scheduler filter out unwanted changes:

from buildbot.changes.svnpoller import split_file_branches
def split_file_projects_branches(path):
    if not "/" in path:
        return None
    project, path = path.split("/", 1)
    f = split_file_branches(path)
    if f:
        info = dict(project=project, path=f[1])
        if f[0]:
            info['branch'] = f[0]
        return info
    return f

Again, this is provided by default. To use it you would do this:

from buildbot.changes.svnpoller import SVNPoller, split_file_projects_branches
c['change_source'] = SVNPoller(
   svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/",
   split_file=split_file_projects_branches)

Note here that we are monitoring at the root of the repository, and that within that repository is a amanda subdirectory which in turn has trunk and branches. It is that amanda subdirectory whose name becomes the project field of the Change.

BRANCHNAME/PROJECT/FILEPATH repositories

Another common way to organize a Subversion repository is to put the branch name at the top, and the projects underneath. This is especially frequent when there are a number of related sub-projects that all get released in a group.

For example, Divmod.org hosts a project named Nevow as well as one named Quotient. In a checked-out Nevow tree there is a directory named formless that contains a Python source file named webform.py. This repository is accessible via webdav (and thus uses an http: scheme) through the divmod.org hostname. There are many branches in this repository, and they use a ({BRANCHNAME})/({PROJECT}) naming policy.

The fully-qualified SVN URL for the trunk version of webform.py is http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py. The 1.5.x branch version of this file would have a URL of http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py. The whole Nevow trunk would be checked out with http://divmod.org/svn/Divmod/trunk/Nevow, while the Quotient trunk would be checked out using http://divmod.org/svn/Divmod/trunk/Quotient.

Now suppose we want to have an SVNPoller that only cares about the Nevow trunk. This case looks just like the {PROJECT}/{BRANCH} layout described earlier:

from buildbot.changes.svnpoller import SVNPoller
c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")

But what happens when we want to track multiple Nevow branches? We have to point our svnurl= high enough to see all those branches, but we also don't want to include Quotient changes (since we're only building Nevow). To accomplish this, we must rely upon the split_file function to help us tell the difference between files that belong to Nevow and those that belong to Quotient, as well as figuring out which branch each one is on.

from buildbot.changes.svnpoller import SVNPoller
c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod",
                               split_file=my_file_splitter)

The my_file_splitter function will be called with repository-relative pathnames like:

trunk/Nevow/formless/webform.py
This is a Nevow file, on the trunk. We want the Change that includes this to see a filename of formless/webform.py, and a branch of None
branches/1.5.x/Nevow/formless/webform.py
This is a Nevow file, on a branch. We want to get branch='branches/1.5.x' and filename='formless/webform.py'.
trunk/Quotient/setup.py
This is a Quotient file, so we want to ignore it by having my_file_splitter return None.
branches/1.5.x/Quotient/setup.py
This is also a Quotient file, which should be ignored.

The following definition for my_file_splitter will do the job:

def my_file_splitter(path):
    pieces = path.split('/')
    if pieces[0] == 'trunk':
        branch = None
        pieces.pop(0) # remove 'trunk'
    elif pieces[0] == 'branches':
        pieces.pop(0) # remove 'branches'
        # grab branch name
        branch = 'branches/' + pieces.pop(0)
    else:
        return None # something weird
    projectname = pieces.pop(0)
    if projectname != 'Nevow':
        return None # wrong project
    return dict(branch=branch, path='/'.join(pieces))

If you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply:

return dict(project=projectname, branch=branch, path='/'.join(pieces))

Writing Change Sources

For some version-control systems, making Buildbot aware of new changes can be a challenge. If the pre-supplied classes in Change Sources are not sufficient, then you will need to write your own.

There are three approaches, one of which is not even a change source. The first option is to write a change source that exposes some service to which the version control system can "push" changes. This can be more complicated, since it requires implementing a new service, but delivers changes to Buildbot immediately on commit.

The second option is often preferable to the first: implement a notification service in an external process (perhaps one that is started directly by the version control system, or by an email server) and delivers changes to Buildbot via PBChangeSource. This section does not describe this particular approach, since it requires no customization within the buildmaster process.

The third option is to write a change source which polls for changes - repeatedly connecting to an external service to check for new changes. This works well in many cases, but can produce a high load on the version control system if polling is too frequent, and can take too long to notice changes if the polling is not frequent enough.

Writing a Notification-based Change Source
class buildbot.changes.base.ChangeSource

A custom change source must implement buildbot.interfaces.IChangeSource.

The easiest way to do this is to subclass buildbot.changes.base.ChangeSource, implementing the describe method to describe the instance. ChangeSource is a Twisted service, so you will need to implement the startService and stopService methods to control the means by which your change source receives notifications.

When the class does receive a change, it should call self.master.addChange(..) to submit it to the buildmaster. This method shares the same parameters as master.db.changes.addChange, so consult the API documentation for that function for details on the available arguments.

You will probably also want to set compare_attrs to the list of object attributes which Buildbot will use to compare one change source to another when reconfiguring. During reconfiguration, if the new change source is different from the old, then the old will be stopped and the new started.

Writing a Change Poller
class buildbot.changes.base.PollingChangeSource

Polling is a very common means of seeking changes, so Buildbot supplies a utility parent class to make it easier. A poller should subclass buildbot.changes.base.PollingChangeSource, which is a subclass of ChangeSource. This subclass implements the Service methods, and causes the poll method to be called every self.pollInterval seconds. This method should return a Deferred to signal its completion.

Aside from the service methods, the other concerns in the previous section apply here, too.

Writing a New Latent Buildslave Implementation

Writing a new latent buildslave should only require subclassing buildbot.buildslave.AbstractLatentBuildSlave and implementing start_instance and stop_instance.

def start_instance(self):
    # responsible for starting instance that will try to connect with this
    # master. Should return deferred. Problems should use an errback. The
    # callback value can be None, or can be an iterable of short strings to
    # include in the "substantiate success" status message, such as
    # identifying the instance that started.
    raise NotImplementedError

def stop_instance(self, fast=False):
    # responsible for shutting down instance. Return a deferred. If `fast`,
    # we're trying to shut the master down, so callback as soon as is safe.
    # Callback value is ignored.
    raise NotImplementedError

See buildbot.ec2buildslave.EC2LatentBuildSlave for an example, or see the test example buildbot.test_slaves.FakeLatentBuildSlave.

Custom Build Classes

The standard BuildFactory object creates Build objects by default. These Builds will each execute a collection of BuildSteps in a fixed sequence. Each step can affect the results of the build, but in general there is little intelligence to tie the different steps together.

By setting the factory's buildClass attribute to a different class, you can instantiate a different build class. This might be useful, for example, to create a build class that dynamically determines which steps to run. The skeleton of such a project would look like:

class DynamicBuild(Build):
    # override some methods
    ...

f = factory.BuildFactory()
f.buildClass = DynamicBuild
f.addStep(...)

Factory Workdir Functions

It is sometimes helpful to have a build's workdir determined at runtime based on the parameters of the build. To accomplish this, set the workdir attribute of the build factory to a callable. That callable will be invoked with the SourceStamp for the build, and should return the appropriate workdir. Note that the value must be returned immediately - Deferreds are not supported.

This can be useful, for example, in scenarios with multiple repositories submitting changes to BuildBot. In this case you likely will want to have a dedicated workdir per repository, since otherwise a sourcing step with mode = "update" will fail as a workdir with a working copy of repository A can't be "updated" for changes from a repository B. Here is an example how you can achieve workdir-per-repo:

def workdir(source_stamp):
    return hashlib.md5 (source_stamp.repository).hexdigest()[:8]

build_factory = factory.BuildFactory()
build_factory.workdir = workdir

build_factory.addStep(Git(mode="update"))
# ...
builders.append ({'name': 'mybuilder',
                  'slavename': 'myslave',
                  'builddir': 'mybuilder',
                  'factory': build_factory})

The end result is a set of workdirs like

Repo1 => <buildslave-base>/mybuilder/a78890ba
Repo2 => <buildslave-base>/mybuilder/0823ba88

You could make the workdir function compute other paths, based on parts of the repo URL in the sourcestamp, or lookup in a lookup table based on repo URL. As long as there is a permanent 1:1 mapping between repos and workdir, this will work.

Writing New BuildSteps

Warning

Buildbot is transitioning to a new, simpler style for writing custom steps. See New-Style Build Steps for details. This section documents new-style steps exclusively, although old-style steps are still supported.

While it is a good idea to keep your build process self-contained in the source code tree, sometimes it is convenient to put more intelligence into your Buildbot configuration. One way to do this is to write a custom BuildStep. Once written, this Step can be used in the master.cfg file.

The best reason for writing a custom BuildStep is to better parse the results of the command being run. For example, a BuildStep that knows about JUnit could look at the logfiles to determine which tests had been run, how many passed and how many failed, and then report more detailed information than a simple rc==0 -based good/bad decision.

Buildbot has acquired a large fleet of build steps, and sports a number of knobs and hooks to make steps easier to write. This section may seem a bit overwhelming, but most custom steps will only need to apply one or two of the techniques outlined here.

For complete documentation of the build step interfaces, see BuildSteps.

Writing BuildStep Constructors

Build steps act as their own factories, so their constructors are a bit more complex than necessary. The configuration file instantiates a BuildStep object, but the step configuration must be re-used for multiple builds, so Buildbot needs some way to create more steps.

Consider the use of a BuildStep in master.cfg:

f.addStep(MyStep(someopt="stuff", anotheropt=1))

This creates a single instance of class MyStep. However, Buildbot needs a new object each time the step is executed. An instance of BuildStep remembers how it was constructed, and can create copies of itself. When writing a new step class, then, keep in mind are that you cannot do anything "interesting" in the constructor -- limit yourself to checking and storing arguments.

It is customary to call the parent class's constructor with all otherwise-unspecified keyword arguments. Keep a **kwargs argument on the end of your options, and pass that up to the parent class's constructor.

The whole thing looks like this:

class Frobnify(LoggingBuildStep):
    def __init__(self,
            frob_what="frobee",
            frob_how_many=None,
            frob_how=None,
            **kwargs):

        # check
        if frob_how_many is None:
            raise TypeError("Frobnify argument how_many is required")

        # override a parent option
        kwargs['parentOpt'] = 'xyz'

        # call parent
        LoggingBuildStep.__init__(self, **kwargs)

        # set Frobnify attributes
        self.frob_what = frob_what
        self.frob_how_many = how_many
        self.frob_how = frob_how

class FastFrobnify(Frobnify):
    def __init__(self,
            speed=5,
            **kwargs):
        Frobnify.__init__(self, **kwargs)
        self.speed = speed
Step Execution Process

A step's execution occurs in its run method. When this method returns (more accurately, when the Deferred it returns fires), the step is complete. The method's result must be an integer, giving the result of the step. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the run method.

The ShellCommand class implements this run method, and in most cases steps subclassing ShellCommand simply implement some of the subsidiary methods that its run method calls.

Running Commands

To spawn a command in the buildslave, create a RemoteCommand instance in your step's run method and run it with runCommand:

cmd = RemoteCommand(args)
d = self.runCommand(cmd)

The CommandMixin class offers a simple interface to several common slave-side commands.

For the much more common task of running a shell command on the buildslave, use ShellMixin. This class provides a method to handle the myriad constructor arguments related to shell commands, as well as a method to create new RemoteCommand instances. This mixin is the recommended method of implementing custom shell-based steps. The older pattern of subclassing ShellCommand is no longer recommended.

A simple example of a step using the shell mixin is:

class RunCleanup(buildstep.ShellMixin, buildstep.BuildStep):
    def __init__(self, cleanupScript='./cleanup.sh', **kwargs):
        self.cleanupScript = cleanupScript
        kwargs = self.setupShellMixin(kwargs, prohibitArgs=['command'])
        buildstep.BuildStep.__init__(self, **kwargs)

    @defer.inlineCallbacks
    def run(self):
        cmd = yield self.makeRemoteShellCommand(
                command=[self.cleanupScript])
        yield self.runCommand(cmd)
        if cmd.didFail():
            cmd = yield self.makeRemoteShellCommand(
                    command=[self.cleanupScript, '--force'],
                    logEnviron=False)
            yield self.runCommand(cmd)
        defer.returnValue(cmd.results())

@defer.inlineCallbacks
def run(self):
    cmd = RemoteCommand(args)
    log = yield self.addLog('output')
    cmd.useLog(log, closeWhenFinished=True)
    yield self.runCommand(cmd)
Updating Status Strings

Each step can summarize its current status in a very short string. For example, a compile step might display the file being compiled. This information can be helpful users eager to see their build finish.

Similarly, a build has a set of short strings collected from its steps summarizing the overall state of the build. Useful information here might include the number of tests run, but probably not the results of a make clean step.

As a step runs, Buildbot calls its getCurrentSummary method as necessary to get the step's current status. "As necessary" is determined by calls to buildbot.process.buildstep.BuildStep.updateSummary. Your step should call this method every time the status summary may have changed. Buildbot will take care of rate-limiting summary updates.

When the step is complete, Buildbot calls its getResultSummary method to get a final summary of the step along with a summary for the build.

About Logfiles

Each BuildStep has a collection of log files. Each one has a short name, like stdio or warnings. Each log file contains an arbitrary amount of text, usually the contents of some output file generated during a build or test step, or a record of everything that was printed to stdout/stderr during the execution of some command.

Each can contain multiple channels, generally limited to three basic ones: stdout, stderr, and headers. For example, when a shell command runs, it writes a few lines to the headers channel to indicate the exact argv strings being run, which directory the command is being executed in, and the contents of the current environment variables. Then, as the command runs, it adds a lot of stdout and stderr messages. When the command finishes, a final header line is added with the exit code of the process.

Status display plugins can format these different channels in different ways. For example, the web page shows log files as text/html, with header lines in blue text, stdout in black, and stderr in red. A different URL is available which provides a text/plain format, in which stdout and stderr are collapsed together, and header lines are stripped completely. This latter option makes it easy to save the results to a file and run grep or whatever against the output.

Writing Log Files

Most commonly, logfiles come from commands run on the build slave. Internally, these are configured by supplying the RemoteCommand instance with log files via the useLog method:

@defer.inlineCallbacks
def run(self):
    ...
    log = yield self.addLog('stdio')
    cmd.useLog(log, closeWhenFinished=True, 'stdio')
    yield self.runCommand(cmd)

The name passed to useLog must match that configured in the command. In this case, stdio is the default.

If the log file was already added by another part of the step, it can be retrieved with getLog:

stdioLog = self.getLog('stdio')

Less frequently, some master-side processing produces a log file. If this log file is short and easily stored in memory, this is as simple as a call to addCompleteLog:

@defer.inlineCallbacks
def run(self):
    ...
    summary = u'\n'.join('%s: %s' % (k, count)
                         for (k, count) in self.lint_results.iteritems())
    yield self.addCompleteLog('summary', summary)

Note that the log contents must be a unicode string.

Longer logfiles can be constructed line-by-line using the add methods of the log file:

@defer.inlineCallbacks
def run(self):
    ...
    updates = yield self.addLog('updates')
    while True:
        ...
        yield updates.addStdout(some_update)

Again, note that the log input must be a unicode string.

Finally, addHTMLLog is similar to addCompleteLog, but the resulting log will be tagged as containing HTML. The web UI will display the contents of the log using the browser.

The logfiles= argument to ShellCommand and its subclasses creates new log files and fills them in realtime by asking the buildslave to watch a actual file on disk. The buildslave will look for additions in the target file and report them back to the BuildStep. These additions will be added to the log file by calling addStdout.

All log files can be used as the source of a LogObserver just like the normal stdio LogFile. In fact, it's possible for one LogObserver to observe a logfile created by another.

Reading Logfiles

For the most part, Buildbot tries to avoid loading the contents of a log file into memory as a single string. For large log files on a busy master, this behavior can quickly consume a great deal of memory.

Instead, steps should implement a LogObserver to examine log files one chunk or line at a time.

For commands which only produce a small quantity of output, RemoteCommand will collect the command's stdout into its stdout attribute if given the collectStdout=True constructor argument.

Adding LogObservers

Most shell commands emit messages to stdout or stderr as they operate, especially if you ask them nicely with a --verbose flag of some sort. They may also write text to a log file while they run. Your BuildStep can watch this output as it arrives, to keep track of how much progress the command has made or to process log output for later summarization.

To accomplish this, you will need to attach a LogObserver to the log. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally.

There are a number of pre-built LogObserver classes that you can choose from (defined in buildbot.process.buildstep, and of course you can subclass them to add further customization. The LogLineObserver class handles the grunt work of buffering and scanning for end-of-line delimiters, allowing your parser to operate on complete stdout/stderr lines. (Lines longer than a set maximum length are dropped; the maximum defaults to 16384 bytes, but you can change it by calling setMaxLineLength on your LogLineObserver instance. Use sys.maxint for effective infinity.)

For example, let's take a look at the TrialTestCaseCounter, which is used by the Trial step to count test cases as they are run. As Trial executes, it emits lines like the following:

buildbot.test.test_config.ConfigTest.testDebugPassword ... [OK]
buildbot.test.test_config.ConfigTest.testEmpty ... [OK]
buildbot.test.test_config.ConfigTest.testIRC ... [FAIL]
buildbot.test.test_config.ConfigTest.testLocks ... [OK]

When the tests are finished, trial emits a long line of ====== and then some lines which summarize the tests that failed. We want to avoid parsing these trailing lines, because their format is less well-defined than the [OK] lines.

A simple version of the parser for this output looks like this. The full version is in master/buildbot/steps/python_twisted.py.

from buildbot.process.logobserver import LogLineObserver

class TrialTestCaseCounter(LogLineObserver):
    _line_re = re.compile(r'^([\w\.]+) \.\.\. \[([^\]]+)\]$')
    numTests = 0
    finished = False

    def outLineReceived(self, line):
        if self.finished:
            return
        if line.startswith("=" * 40):
            self.finished = True
            return

        m = self._line_re.search(line.strip())
        if m:
            testname, result = m.groups()
            self.numTests += 1
            self.step.setProgress('tests', self.numTests)

This parser only pays attention to stdout, since that's where trial writes the progress lines. It has a mode flag named finished to ignore everything after the ==== marker, and a scary-looking regular expression to match each line while hopefully ignoring other messages that might get displayed as the test runs.

Each time it identifies a test has been completed, it increments its counter and delivers the new progress value to the step with self.step.setProgress. This helps Buildbot to determine the ETA for the step.

To connect this parser into the Trial build step, Trial.__init__ ends with the following clause:

# this counter will feed Progress along the 'test cases' metric
counter = TrialTestCaseCounter()
self.addLogObserver('stdio', counter)
self.progressMetrics += ('tests',)

This creates a TrialTestCaseCounter and tells the step that the counter wants to watch the stdio log. The observer is automatically given a reference to the step in its step attribute.

Using Properties

In custom BuildSteps, you can get and set the build properties with the getProperty and setProperty methods. Each takes a string for the name of the property, and returns or accepts an arbitrary JSON-able (lists, dicts, strings, and numbers) object. For example:

class MakeTarball(ShellCommand):
    def start(self):
        if self.getProperty("os") == "win":
            self.setCommand([ ... ]) # windows-only command
        else:
            self.setCommand([ ... ]) # equivalent for other systems
        ShellCommand.start(self)

Remember that properties set in a step may not be available until the next step begins. In particular, any Property or Interpolate instances for the current step are interpolated before the step starts, so they cannot use the value of any properties determined in that step.

Using Statistics

Statistics can be generated for each step, and then summarized across all steps in a build. For example, a test step might set its warnings statistic to the number of warnings observed. The build could then sum the warnings on all steps to get a total number of warnings.

Statistics are set and retrieved with the setStatistic and:py:meth:~buildbot.process.buildstep.BuildStep.getStatistic methods. The hasStatistic method determines whether a statistic exists.

The Build method getSummaryStatistic can be used to aggregate over all steps in a Build.

BuildStep URLs

Each BuildStep has a collection of links. Each has a name and a target URL. The web display displays clickable links for each link, making them a useful way to point to extra information about a step. For example, a step that uploads a build result to an external service might include a link to the uploaded flie.

To set one of these links, the BuildStep should call the addURL method with the name of the link and the target URL. Multiple URLs can be set. For example:

@defer.inlineCallbacks
def run(self):
    ... # create and upload report to coverage server
    url = 'http://coverage.corp.com/reports/%s' % reportname
    yield self.addURL('coverage', url)
Discovering files

When implementing a BuildStep it may be necessary to know about files that are created during the build. There are a few slave commands that can be used to find files on the slave and test for the existence (and type) of files and directories.

The slave provides the following file-discovery related commands:

  • stat calls os.stat for a file in the slave's build directory. This can be used to check if a known file exists and whether it is a regular file, directory or symbolic link.
  • listdir calls os.listdir for a directory on the slave. It can be used to obtain a list of files that are present in a directory on the slave.
  • glob calls glob.glob on the slave, with a given shell-style pattern containing wildcards.

For example, we could use stat to check if a given path exists and contains *.pyc files. If the path does not exist (or anything fails) we mark the step as failed; if the path exists but is not a directory, we mark the step as having "warnings".

from buildbot.process import buildstep
from buildbot.interfaces import BuildSlaveToOldError
from buildbot.status.results import SUCCESS, WARNINGS, FAILURE
import stat

class MyBuildStep(buildstep.BuildStep):

    def __init__(self, dirname, **kwargs):
        buildstep.BuildStep.__init__(self, **kwargs)
        self.dirname = dirname

    def start(self):
        # make sure the slave knows about stat
        slavever = (self.slaveVersion('stat'),
                    self.slaveVersion('glob'))
        if not all(slavever):
            raise BuildSlaveToOldError('need stat and glob')

        cmd = buildstep.RemoteCommand('stat', {'file': self.dirname})

        d = self.runCommand(cmd)
        d.addCallback(lambda res: self.evaluateStat(cmd))
        d.addErrback(self.failed)
        return d

    def evaluateStat(self, cmd):
        if cmd.didFail():
            self.step_status.setText(["File not found."])
            self.finished(FAILURE)
            return
        s = cmd.updates["stat"][-1]
        if not stat.S_ISDIR(s[stat.ST_MODE]):
            self.step_status.setText(["'tis not a directory"])
            self.finished(WARNINGS)
            return

        cmd = buildstep.RemoteCommand('glob', {'glob': self.dirname + '/*.pyc'})

        d = self.runCommand(cmd)
        d.addCallback(lambda res: self.evaluateGlob(cmd))
        d.addErrback(self.failed)
        return d

    def evaluateGlob(self, cmd):
        if cmd.didFail():
            self.step_status.setText(["Glob failed."])
            self.finished(FAILURE)
            return
        files = cmd.updates["files"][-1]
        if len(files):
            self.step_status.setText(["Found pycs"]+files)
        else:
            self.step_status.setText(["No pycs found"])
        self.finished(SUCCESS)

For more information on the available commands, see Master-Slave API.

A Somewhat Whimsical Example

Let's say that we've got some snazzy new unit-test framework called Framboozle. It's the hottest thing since sliced bread. It slices, it dices, it runs unit tests like there's no tomorrow. Plus if your unit tests fail, you can use its name for a Web 2.1 startup company, make millions of dollars, and hire engineers to fix the bugs for you, while you spend your afternoons lazily hang-gliding along a scenic pacific beach, blissfully unconcerned about the state of your tests. [1]

To run a Framboozle-enabled test suite, you just run the 'framboozler' command from the top of your source code tree. The 'framboozler' command emits a bunch of stuff to stdout, but the most interesting bit is that it emits the line "FNURRRGH!" every time it finishes running a test case You'd like to have a test-case counting LogObserver that watches for these lines and counts them, because counting them will help the buildbot more accurately calculate how long the build will take, and this will let you know exactly how long you can sneak out of the office for your hang-gliding lessons without anyone noticing that you're gone.

This will involve writing a new BuildStep (probably named "Framboozle") which inherits from ShellCommand. The BuildStep class definition itself will look something like this:

from buildbot.steps.shell import ShellCommand
from buildbot.process.logobserver import LogLineObserver

class FNURRRGHCounter(LogLineObserver):
    numTests = 0
    def outLineReceived(self, line):
        if "FNURRRGH!" in line:
            self.numTests += 1
            self.step.setProgress('tests', self.numTests)

class Framboozle(ShellCommand):
    command = ["framboozler"]

    def __init__(self, **kwargs):
        ShellCommand.__init__(self, **kwargs)   # always upcall!
        counter = FNURRRGHCounter()
        self.addLogObserver('stdio', counter)
        self.progressMetrics += ('tests',)

So that's the code that we want to wind up using. How do we actually deploy it?

You have a couple of different options.

Inclusion in the master.cfg file

The simplest technique is to simply put the step class definitions in your master.cfg file, somewhere before the BuildFactory definition where you actually use it in a clause like:

f = BuildFactory()
f.addStep(SVN(svnurl="stuff"))
f.addStep(Framboozle())

Remember that master.cfg is secretly just a Python program with one job: populating the BuildmasterConfig dictionary. And Python programs are allowed to define as many classes as they like. So you can define classes and use them in the same file, just as long as the class is defined before some other code tries to use it.

This is easy, and it keeps the point of definition very close to the point of use, and whoever replaces you after that unfortunate hang-gliding accident will appreciate being able to easily figure out what the heck this stupid "Framboozle" step is doing anyways. The downside is that every time you reload the config file, the Framboozle class will get redefined, which means that the buildmaster will think that you've reconfigured all the Builders that use it, even though nothing changed. Bleh.

python file somewhere on the system

Instead, we can put this code in a separate file, and import it into the master.cfg file just like we would the normal buildsteps like ShellCommand and SVN.

Create a directory named ~/lib/python, put the step class definitions in ~/lib/python/framboozle.py, and run your buildmaster using:

PYTHONPATH=~/lib/python buildbot start MASTERDIR

or use the Makefile.buildbot to control the way buildbot start works. Or add something like this to something like your ~/.bashrc or ~/.bash_profile or ~/.cshrc:

export PYTHONPATH=~/lib/python

Once we've done this, our master.cfg can look like:

from framboozle import Framboozle
f = BuildFactory()
f.addStep(SVN(svnurl="stuff"))
f.addStep(Framboozle())

or:

import framboozle
f = BuildFactory()
f.addStep(SVN(svnurl="stuff"))
f.addStep(framboozle.Framboozle())

(check out the Python docs for details about how import and from A import B work).

What we've done here is to tell Python that every time it handles an "import" statement for some named module, it should look in our ~/lib/python/ for that module before it looks anywhere else. After our directories, it will try in a bunch of standard directories too (including the one where buildbot is installed). By setting the PYTHONPATH environment variable, you can add directories to the front of this search list.

Python knows that once it "import"s a file, it doesn't need to re-import it again. This means that reconfiguring the buildmaster (with buildbot reconfig, for example) won't make it think the Framboozle class has changed every time, so the Builders that use it will not be spuriously restarted. On the other hand, you either have to start your buildmaster in a slightly weird way, or you have to modify your environment to set the PYTHONPATH variable.

Install this code into a standard Python library directory

Find out what your Python's standard include path is by asking it:

80:warner@luther% python
Python 2.4.4c0 (#2, Oct  2 2006, 00:57:46)
[GCC 4.1.2 20060928 (prerelease) (Debian 4.1.1-15)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> import pprint
>>> pprint.pprint(sys.path)
['',
 '/usr/lib/python24.zip',
 '/usr/lib/python2.4',
 '/usr/lib/python2.4/plat-linux2',
 '/usr/lib/python2.4/lib-tk',
 '/usr/lib/python2.4/lib-dynload',
 '/usr/local/lib/python2.4/site-packages',
 '/usr/lib/python2.4/site-packages',
 '/usr/lib/python2.4/site-packages/Numeric',
 '/var/lib/python-support/python2.4',
 '/usr/lib/site-python']

In this case, putting the code into /usr/local/lib/python2.4/site-packages/framboozle.py would work just fine. We can use the same master.cfg import framboozle statement as in Option 2. By putting it in a standard include directory (instead of the decidedly non-standard ~/lib/python), we don't even have to set PYTHONPATH to anything special. The downside is that you probably have to be root to write to one of those standard include directories.

Submit the code for inclusion in the Buildbot distribution

Make a fork of buildbot on http://github.com/buildbot/buildbot or post a patch in a bug at http://buildbot.net. In either case, post a note about your patch to the mailing list, so others can provide feedback and, eventually, commit it.

from buildbot.steps import framboozle
f = BuildFactory()
f.addStep(SVN(svnurl="stuff"))
f.addStep(framboozle.Framboozle())

And then you don't even have to install framboozle.py anywhere on your system, since it will ship with Buildbot. You don't have to be root, you don't have to set PYTHONPATH. But you do have to make a good case for Framboozle being worth going into the main distribution, you'll probably have to provide docs and some unit test cases, you'll need to figure out what kind of beer the author likes (IPA's and Stouts for Dustin), and then you'll have to wait until the next release. But in some environments, all this is easier than getting root on your buildmaster box, so the tradeoffs may actually be worth it.

Putting the code in master.cfg (1) makes it available to that buildmaster instance. Putting it in a file in a personal library directory (2) makes it available for any buildmasters you might be running. Putting it in a file in a system-wide shared library directory (3) makes it available for any buildmasters that anyone on that system might be running. Getting it into the buildbot's upstream repository (4) makes it available for any buildmasters that anyone in the world might be running. It's all a matter of how widely you want to deploy that new class.

Writing New Status Plugins

Each status plugin is an object which provides the twisted.application.service.IService interface, which creates a tree of Services with the buildmaster at the top [not strictly true]. The status plugins are all children of an object which implements buildbot.interfaces.IStatus, the main status object. From this object, the plugin can retrieve anything it wants about current and past builds. It can also subscribe to hear about new and upcoming builds.

Status plugins which only react to human queries (like the Waterfall display) never need to subscribe to anything: they are idle until someone asks a question, then wake up and extract the information they need to answer it, then they go back to sleep. Plugins which need to act spontaneously when builds complete (like the MailNotifier plugin) need to subscribe to hear about new builds.

If the status plugin needs to run network services (like the HTTP server used by the Waterfall plugin), they can be attached as Service children of the plugin itself, using the IServiceCollection interface.

[1]framboozle.com is still available. Remember, I get 10% :).

New-Style Build Steps

In Buildbot-0.9.0, many operations performed by BuildStep subclasses return a Deferred. As a result, custom build steps which call these methods will need to be rewritten.

Buildbot-0.8.9 supports old-style steps natively, while new-style steps are emulated. Buildbot-0.9.0 supports new-style steps natively, while old-style steps are emulated. Later versions of Buildbot wil not support old-style steps at all. All custom steps should be rewritten in the new style as soon as possible.

Buildbot distinguishes new-style from old-style steps by the presence of a run method. If this method is present, then the step is a new-style step.

Summary of Changes

  • New-style steps have a run method that is simpler to implement than the old start method.
  • Many methods are now asynchronous (return Deferreds), as they perform operations on the database.
  • Logs are now implemented by a completely different class. This class supports the same log-writing methods (addStderr and so on), although they are now asynchronous. However, it does not support log-reading methods such as getText. It was never advisable to handle logs as enormous strings. New-style steps should, instead, use a LogObserver or (in Buildbot-0.9.0) fetch log lines bit by bit using the data API.
  • buildbot.process.buildstep.LoggingBuildStep is deprecated and cannot be uesd in new-style steps. Mix in buildbot.process.buildstep.ShellMixin instead.

Rewriting start

If your custom buildstep implements the start method, then rename that method to run and set it up to return a Deferred, either explicitly or via inlineCallbacks. The value of the Deferred should be the result of the step (one of the codes in buildbot.status.results), or a Twisted failure instance to complete the step as EXCEPTION. The new run method should not call self.finished or self.failed, instead signalling the same via Deferred.

For example, the following old-style start method

def start(self):  ## old style
    cmd = remotecommand.RemoteCommand('stat', {'file': self.file })
    d = self.runCommand(cmd)
    d.addCallback(lambda res: self.convertResult(cmd))
    d.addErrback(self.failed)

Becomes

@defer.inlineCallbacks
def run(self):  ## new style
    cmd = remotecommand.RemoteCommand('stat', {'file': self.file })
    yield self.runCommand(cmd)
    yield self.convertResult(cmd)

Newly Asynchronous Methods

The following methods now return a Deferred:

Any custom code in a new-style step that calls these methods must handle the resulting Deferred. In some cases, that means that the calling method's signature will change. For example

def summarize(self):  ## old-style
    for m in self.MESSAGES:
        if counts[m]:
            self.addCompleteLog(m, "".join(summaries[m]))
        self.setProperty("count-%s" % m, counts[m], "counter")

Is a synchronous function, not returning a Deferred. However, when converted to a new-style test, it must handle Deferreds from the methods it calls, so it must be asynchronous. Syntactically, inlineCallbacks makes the change fairly simple:

@defer.inlineCallbacks
def summarize(self):  ## new-style
    for m in self.MESSAGES:
        if counts[m]:
            yield self.addCompleteLog(m, "".join(summaries[m]))
        self.setProperty("count-%s" % m, counts[m], "counter")

However, this method's callers must now handle the Deferred that it returns. All methods that can be overridden in custom steps can return a Deferred.

Properties

Good news! The API for properties is the same synchronous API as was available in old-style steps. Properties are handled synchronously during the build, and persisted to the database at completion of each step.

Log Objects

Old steps had two ways of interacting with logfiles, both of which have changed.

The first is writing to logs while a step is executing. When using addCompleteLog or addHTMLLog, this is straightforward, except that in new-style steps these methods return a Deferred.

The second method is via buildbot.process.buildstep.BuildStep.addLog. In new-style steps, the returned object (via Deferred) has the following methods to add log content:

  • addStdout
  • addStderr
  • addHeader
  • finish

All of these methods now return Deferreds. None of the old log-reading methods are available on this object:

  • hasContents
  • getText
  • readLines
  • getTextWithHeaders
  • getChunks

If your step uses such methods, consider using a LogObserver instead, or using the Data API to get the required data.

The undocumented and unused subscribeConsumer method of logfiles has also been removed.

The subscribe method now takes a callable, rather than an instance, and does not support catchup. This method was primarily used by LogObserver, the implementation of which has been modified accordingly. Any other uses of the subscribe method should be refactored to use a LogObserver.

Status Strings

The self.step_status.setText and setText2 methods have been removed. Similarly, the _describe and describe methods are not used in new-style steps. In fact, steps no longer set their status directly.

Instead, steps call buildbot.process.buildstep.BuildStep.updateSummary whenever the status may have changed. This method calls getCurrentSummary or getResultSummary as appropriate and update displays of the step's status. Steps override the latter two methods to provide appropriate summaries.

Statistics

Support for statistics has been moved to the BuildStep and Build objects. Calls to self.step_status.setStatistic should be rewritten as self.setStatistic.

Command-line Tool

This section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all buildbot command-line tool was divided into two parts namely buildbot and buildslave. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to buildbot tool.

Every command-line tool has a list of global options and a set of commands which have their own options. One can run these tools in the following way:

buildbot [global options] command [command options]
buildslave [global options] command [command options]

The buildbot command is used on the master, while buildslave is used on the slave. Global options are the same for both tools which perform the following actions:

--help Print general help about available commands and global options and exit. All subsequent arguments are ignored.
--verbose Set verbose output.
--version Print current buildbot version and exit. All subsequent arguments are ignored.

You can get help on any command by specifying --help as a command option:

buildbot @var{command} --help

You can also use manual pages for buildbot and buildslave for quick reference on command-line options.

The remainder of this section describes each buildbot command. See Command Line Index for a full list.

buildbot

The buildbot command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.

Administrator Tools

The following buildbot sub-commands are intended for buildmaster administrators:

create-master
buildbot create-master -r {BASEDIR}

This creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.

You will usually want to use the -r option to create a relocatable buildbot.tac. This allows you to move the master directory without editing this file.

start
buildbot start [--nodaemon] {BASEDIR}

This starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named twistd.log.

The --nodaemon option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.

restart
buildbot restart [--nodaemon] {BASEDIR}

Restart the buildmaster. This is equivalent to stop followed by start The --nodaemon option has the same meaning as for start.

stop
buildbot stop {BASEDIR}

This terminates the daemon (either buildmaster or buildslave) running in the given directory. The --clean option shuts down the buildmaster cleanly.

sighup
buildbot sighup {BASEDIR}

This sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its master.cfg file.

Developer Tools

These tools are provided for use by the developers who are working on the code that the buildbot is monitoring.

statuslog
buildbot statuslog --master {MASTERHOST}:{PORT}

This command starts a simple text-based status client, one which just prints out a new line each time an event occurs on the buildmaster.

The --master option provides the location of the buildbot.status.client.PBListener status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (HOSTNAME:PORTNUM). Note that this port is not the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of Failure: twisted.cred.error.UnauthorizedLogin:, this may indicate that you are connecting to the slaveport rather than a PBListener port.

The --master option can also be provided by the masterstatus name in .buildbot/options (see .buildbot config directory).

statusgui

If you have set up a PBListener, you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the buildbot statusgui command:

buildbot statusgui --master {MASTERHOST}:{PORT}

This command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same --master argument and masterstatus option as the buildbot statuslog command (statuslog).

try

This lets a developer to ask the question What would happen if I committed this patch right now?. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.

The buildbot try command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This (revision, patch) pair is then sent to the buildmaster, which runs a build with that SourceStamp. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).

There is an alternate form which accepts a pre-made patch file (typically the output of a command like svn diff). This --diff form does not require a local tree to run from. See try --diff concerning the --diff command option.

For this command to work, several pieces must be in place: the Try_Jobdir or :Try_Userpass, as well as some client-side configuration.

Locating the master

The try command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using --connect=ssh or --connect=pb (or try_connect = 'ssh' or try_connect = 'pb' in .buildbot/options).

For the PB approach, the command must be given a --master argument (in the form HOST:PORT) that points to TCP port that you picked in the Try_Userpass scheduler. It also takes a --username and --passwd pair of arguments that match one of the entries in the buildmaster's userpass list. These arguments can also be provided as try_master, try_username, and try_password entries in the .buildbot/options file.

For the SSH approach, the command must be given --host and --username, to get to the buildmaster host. It must also be given --jobdir, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like ~buildbot/project/trydir. These arguments can be provided in .buildbot/options as try_host, try_username, try_password, and try_jobdir.

The SSH approach also provides a --buildbotbin argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a virtualenv on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by --username. The --buildbotbin argument can be provided in .buildbot/options as try_buildbotbin

The following command line arguments are deprecated, but retained for backward compatibility:

--tryhost is replaced by --host
--trydir is replaced by --jobdir
--master is replaced by --masterstatus

Likewise, the following .buildbot/options file entries are deprecated, but retained for backward compatibility:

  • try_dir is replaced by try_jobdir
  • masterstatus is replaced by try_masterstatus
Waiting for results

If you provide the --wait option (or try_wait = True in .buildbot/options), the buildbot try command will wait until your changes have either been proven good or bad before exiting. Unless you use the --quiet option (or try_quiet=True), it will emit a progress message every 60 seconds until the builds have completed.

The SSH connection method does not support waiting for results.

Choosing the Builders

A trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the TryScheduler's builderNames= argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.

The set of Builders to use can be specified with multiple --builder arguments on the command line. It can also be specified with a single try_builders option in .buildbot/options that uses a list of strings to specify all the Builder names:

try_builders = ["full-OSX", "full-win32", "full-linux"]

If you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the get-builder-names argument:

buildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...
Specifying the VC system

The try command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the try command which VC system you are using, with an argument like --vc=cvs or --vc=git. This can also be provided as try_vc in .buildbot/options.

The following names are recognized: bzr cvs darcs hg git mtn p4 svn

Finding the top of the tree

Some VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the try command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the try command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is .buildbot-top, so when you are using CVS or SVN you should touch .buildbot-top from the top of your tree before running buildbot try. Alternatively, you can use a filename like ChangeLog or README, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use --topfile=ChangeLog, or set it in the options file with try_topfile = 'ChangeLog'.

You can also manually set the top of the tree with --topdir=~/trees/mytree, or try_topdir = '~/trees/mytree'. If you use try_topdir, in a .buildbot/options file, you will need a separate options file for each tree you use, so it may be more convenient to use the try_topfile approach instead.

Other VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require try to know the top directory, so the --try-topfile and --try-topdir arguments will be ignored.

If the try command cannot find the top directory, it will abort with an error message.

The following command line arguments are deprecated, but retained for backward compatibility:

  • --try-topdir is replaced by --topdir
  • --try-topfile is replaced by --topfile
Determining the branch name

Some VC systems record the branch information in a way that try can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the --branch argument, or a try_branch entry in the .buildbot/options file.

Determining the revision and patch

Each VC system has a separate approach for determining the tree's base revision and computing a patch.

CVS
try pretends that the tree is up to date. It converts the current time into a -D time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.
SVN
try does a svn status -u to find the latest repository revision number (emitted on the last line in the Status against revision: NN message). It then performs an svn diff -rNN to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the try tree being created with the latest revision, then backwards patches applied to bring it back to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.
bzr
try does a bzr revision-info to find the base revision, then a bzr diff -r$base.. to obtain the patch.
Mercurial
hg parents --template '{node}\n' emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. hg diff then provides the patch relative to that revision. For try to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' source.Mercurial will use.
Perforce
try does a p4 changes -m1 ... to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a p4 diff -du to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see P4Source) is assumed to be //depot
Darcs
try does a darcs changes --context to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this context file are the revision stamp for a Darcs-controlled source tree. It then does a darcs diff -u to compute the patch relative to that revision.
Git
git branch -v lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with (star and space) while all the others start with    (two spaces). try scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.
Monotone
mtn automate get_base_revision_id emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. mtn diff then provides the patch relative to that revision. For try to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' source.Monotone will use.
patch information

You can provide the --who=dev to designate who is running the try build. This will add the dev to the Reason field on the try build's status web page. You can also set try_who = dev in the .buildbot/options file. Note that --who=dev will not work on version 0.8.3 or earlier masters.

Similarly, --comment=COMMENT will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is try_comment.

Sending properties

You can set properties to send with your change using either the --property=key=value option, which sets a single property, or the --properties=key1=value1,key2=value2... option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the --properties option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the --property option to set it.

try --diff

Sometimes you might have a patch from someone else that you want to submit to the buildbot. For example, a user may have created a patch to fix some specific bug and sent it to you by email. You've inspected the patch and suspect that it might do the job (and have at least confirmed that it doesn't do anything evil). Now you want to test it out.

One approach would be to check out a new local tree, apply the patch, run your local tests, then use buildbot try to run the tests on other platforms. An alternate approach is to use the buildbot try --diff form to have the buildbot test the patch without using a local tree.

This form takes a --diff argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional --baserev argument, a tree of the given revision will be used as a starting point instead of TRUNK.

You can also use buildbot try --diff=- to read the patch from stdin.

Each patch has a patchlevel associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the -p or --strip argument to the patch utility. By default buildbot try --diff uses a patchlevel of 0, but you can override this with the -p argument.

When you use --diff, you do not need to use any of the other options that relate to a local tree, specifically --vc, --try-topfile, or --try-topdir. These options will be ignored. Of course you must still specify how to get to the buildmaster (with --connect, --tryhost, etc).

Other Tools

These tools are generally used by buildmaster administrators.

sendchange

This command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a PBChangeSource (PBChangeSource) running in the buildmaster (by being set in c['change_source']).

buildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS}
        --who {USER} {FILENAMES..}

The auth option specifies the credentials to use to connect to the master, in the form user:pass. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.

The master and username arguments can also be given in the options file (see .buildbot config directory). There are other (optional) arguments which can influence the Change that gets submitted:

--branch (or option branch) This provides the (string) branch specifier. If omitted, it defaults to None, indicating the default branch. All files included in this Change must be on the same branch.
--category (or option category) This provides the (string) category specifier. If omitted, it defaults to None, indicating no category. The category property can be used by Schedulers to filter what changes they listen to.
--project (or option project) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.
--repository (or option repository) This provides the repository from which this change came, and defaults to ''.
--revision This provides a revision specifier, appropriate to the VC system in use.
--revision_file
 This provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of darcs changes --context as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.
--property This parameter is used to set a property on the Change generated by sendchange. Properties are specified as a name:value pair, separated by a colon. You may specify many properties by passing this parameter multiple times.
--comments This provides the change comments as a single argument. You may want to use --logfile instead.
--logfile This instructs the tool to read the change comments from the given file. If you use - as the filename, the tool will read the change comments from stdin.
--encoding Specifies the character encoding for all other parameters, defaulting to 'utf8'.
--vc Specifies which VC system the Change is coming from, one of: cvs, svn, darcs, hg, bzr, git, mtn, or p4. Defaults to None.
debugclient
buildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}

This launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's debug port. This debug port shares the same port number as the slaveport (see Setting the PB Port for Slaves), but the debugPort is only enabled if you set a debug password in the buildmaster's config file (see Debug Options). The --passwd option must match the c['debugPassword'] value.

--master can also be provided in .debug/options by the master key. --passwd can be provided by the debugPassword key. See .buildbot config directory.

The Connect button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:

Reload .cfg
Forces the buildmaster to reload its master.cfg file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's twistd.log as you reload the config file, as any errors which are detected in the config file will be announced there.
Rebuild .py
(not yet implemented). The idea here is to use Twisted's rebuild facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.
poke IRC
This locates a words.IRC status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.
Commit
This allows you to inject a Change, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.
Force Build
This lets you force a Builder (selected by name) to start a build of the current source tree.
Currently
(obsolete). This was used to manually set the status of the given Builder, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.
user

Note that in order to use this command, you need to configure a CommandlineUserManager instance in your master.cfg file, which is explained in Users Options.

This command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see Users.

--master The user command can be run virtually anywhere provided a location of the running buildmaster. The master argument is of the form {MASTERHOST}:{PORT}.
--username PB connection authentication that should match the arguments to CommandlineUserManager.
--passwd PB connection authentication that should match the arguments to CommandlineUserManager.
--op There are four supported values for the op argument: add, update, remove, and get. Each are described in full in the following sections.
--bb_username Used with the update option, this sets the user's username for web authentication in the database. It requires bb_password to be set along with it.
--bb_password Also used with the update option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.
--ids

When working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The ids option lets you specify a comma separated list of these identifiers for use with the user command.

The ids option is used only when using remove or show.

--info

Users are known in buildbot as a collection of attributes tied together by some unique identifier (see Users). These attributes are specified in the form {TYPE}={VALUE} when using the info option. These {TYPE}={VALUE} pairs are specified in a comma separated list, so for example:

--info=svn=jschmo,git='Joe Schmo <joe@schmo.com>'

The info option can be specified multiple times in the user command, as each specified option will be interpreted as a new user. Note that info is only used with add or with update, and whenever you use update you need to specify the identifier of the user you want to update. This is done by prepending the info arguments with {ID:}. If we were to update 'jschmo' from the previous example, it would look like this:

--info=jschmo:git='Joseph Schmo <joe@schmo.com>'

Note that --master, --username, --passwd, and --op are always required to issue the user command.

The --master, --username, and --passwd options can be specified in the option file with keywords user_master, user_username, and user_passwd, respectively. If user_master is not specified, then master from the options file will be used instead.

Below are examples of how each command should look. Whenever a user command is successful, results will be shown to whoever issued the command.

For add:

buildbot user --master={MASTERHOST} --op=add \
        --username={USER} --passwd={USERPW} \
        --info={TYPE}={VALUE},...

For update:

buildbot user --master={MASTERHOST} --op=update \
        --username={USER} --passwd={USERPW} \
        --info={ID}:{TYPE}={VALUE},...

For remove:

buildbot user --master={MASTERHOST} --op=remove \
        --username={USER} --passwd={USERPW} \
        --ids={ID1},{ID2},...

For get:

buildbot user --master={MASTERHOST} --op=get \
        --username={USER} --passwd={USERPW} \
        --ids={ID1},{ID2},...

A note on update: when updating the bb_username and bb_password, the info doesn't need to have additional {TYPE}={VALUE} pairs to update and can just take the {ID} portion.

.buildbot config directory

Many of the buildbot tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an options file. The buildbot command will look for a special directory named .buildbot, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named options in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple name = 'value' pairs in this file to set the options.

For a description of the names used in this file, please see the documentation for the individual buildbot sub-commands. The following is a brief sample of what this file's contents could be.

# for status-reading tools
masterstatus = 'buildbot.example.org:12345'
# for 'sendchange' or the debug port
master = 'buildbot.example.org:18990'
debugPassword = 'eiv7Po'

Note carefully that the names in the options file usually do not match the command-line option name.

masterstatus
Equivalent to --master for statuslog and statusgui, this gives the location of the client.PBListener status port.
master
Equivalent to --master for debugclient and sendchange. This option is used for two purposes. It is the location of the debugPort for debugclient and the location of the pb.PBChangeSource for `sendchange. Generally these are the same port.
debugPassword

Equivalent to --passwd for debugclient.

Important

This value must match the value of debugPassword, used to protect the debug port, for the debugclient command.

username
Equivalent to --username for the sendchange command.
branch
Equivalent to --branch for the sendchange command.
category
Equivalent to --category for the sendchange command.
try_connect
Equivalent to --connect, this specifies how the try command should deliver its request to the buildmaster. The currently accepted values are ssh and pb.
try_builders
Equivalent to --builders, specifies which builders should be used for the try build.
try_vc
Equivalent to --vc for try, this specifies the version control system being used.
try_branch
Equivalent to --branch, this indicates that the current tree is on a non-trunk branch.

try_topdir

try_topfile
Use try_topdir, equivalent to --try-topdir, to explicitly indicate the top of your working tree, or try_topfile, equivalent to --try-topfile to name a file that will only be found in that top-most directory.

try_host

try_username

try_dir
When try_connect is ssh, the command will use try_host for --tryhost, try_username for --username, and try_dir for --trydir. Apologies for the confusing presence and absence of 'try'.

try_username

try_password

try_master
Similarly, when try_connect is pb, the command will pay attention to try_username for --username, try_password for --passwd, and try_master for --master.

try_wait

masterstatus
try_wait and masterstatus (equivalent to --wait and master, respectively) are used to ask the try command to wait for the requested build to complete.

buildslave

buildslave command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.

create-slave

This creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial buildbot.tac file.

The -r option is advisable here, just like for create-master.

buildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}

The create-slave options are described in Buildslave Options.

start

This starts a buildslave which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named twistd.log.

buildslave start [--nodaemon] BASEDIR

The --nodaemon option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.

restart
buildslave restart [--nodaemon] BASEDIR

This restarts a buildslave which is already running. It is equivalent to a stop followed by a start.

The --nodaemon option has the same meaning as for start.

stop

This terminates the daemon buildslave running in the given directory.

buildbot stop BASEDIR

Resources

The Buildbot home page is http://buildbot.net/.

For configuration questions and general discussion, please use the buildbot-devel mailing list. The subscription instructions and archives are available at http://lists.sourceforge.net/lists/listinfo/buildbot-devel

The #buildbot channel on Freenode's IRC servers hosts development discussion, and often folks are available to answer questions there, as well.

Optimization

If you're feeling your Buildbot is running a bit slow, here are some tricks that may help you, but use them at your own risk.

Properties load speedup

For example, if most of your build properties are strings, you can gain an approx. 30% speedup if you put this snippet of code inside your master.cfg file:

def speedup_json_loads():
    import json, re

    original_decode = json._default_decoder.decode
    my_regexp = re.compile(r'^\[\"([^"]*)\",\s+\"([^"]*)\"\]$')
    def decode_with_re(str, *args, **kw):
        m = my_regexp.match(str)
        try:
            return list(m.groups())
        except:
            return original_decode(str, *args, **kw)
    json._default_decoder.decode = decode_with_re

speedup_json_loads()

It patches json decoder so that it would first try to extract a value from JSON that is a list of two strings (which is the case for a property being a string), and would fallback to general JSON decoder on any error

Buildbot Development

This chapter is the official repository for the collected wisdom of the Buildbot hackers. It is intended both for developers writing patches that will be included in Buildbot itself, and for advanced users who wish to customize Buildbot.

Master Organization

Buildbot makes heavy use of Twisted Python's support for services - software modules that can be started and stopped dynamically. Buildbot adds the ability to reconfigure such services, too - see Reconfiguration. Twisted arranges services into trees; the following section describes the service tree on a running master.

Buildmaster Service Hierarchy

The hierarchy begins with the master, a buildbot.master.BuildMaster instance. Most other services contain a reference to this object in their master attribute, and in general the appropriate way to access other objects or services is to begin with self.master and navigate from there.

The master has several child services:

master.metrics
A buildbot.process.metrics.MetricLogObserver instance that handles tracking and reporting on master metrics.
master.caches
A buildbot.process.caches.CacheManager instance that provides access to object caches.
master.pbmanager
A buildbot.pbmanager.PBManager instance that handles incoming PB connections, potentially on multiple ports, and dispatching those connections to appropriate components based on the supplied username.
master.change_svc
A buildbot.changes.manager.ChangeManager instance that manages the active change sources, as well as the stream of changes received from those sources. All active change sources are child services of this instance.
master.botmaster

A buildbot.process.botmaster.BotMaster instance that manages all of the slaves and builders as child services.

The botmaster acts as the parent service for a buildbot.process.botmaster.BuildRequestDistributor instance (at master.botmaster.brd) as well as all active slaves (buildbot.buildslave.AbstractBuildSlave instances) and builders (buildbot.process.builder.Builder instances).

master.scheduler_manager
A buildbot.schedulers.manager.SchedulerManager instance that manages the active schedulers. All active schedulers are child services of this instance.
master.user_manager
A buildbot.process.users.manager.UserManagerManager instance that manages access to users. All active user managers are child services of this instance.
master.db
A buildbot.db.connector.DBConnector instance that manages access to the buildbot database. See Database for more information.
master.debug
A buildbot.process.debug.DebugServices instance that manages debugging-related access -- the debug client and manhole.
master.status
A buildbot.status.master.Status instance that provides access to all status data. This instance is also the service parent for all status listeners.

Definitions

Buildbot uses some terms and concepts that have specific meanings.

Repository

See Repository.

Project

See Project.

Version Control Comparison

Buildbot supports a number of version control systems, and they don't all agree on their terms. This table should help to disambiguate them.

Name Change Revision Branches
CVS patch [1] timestamp unnamed
Subversion revision integer directories
Git commit sha1 hash named refs
Mercurial changeset sha1 hash different repos or (permanently) named commits
Darcs ? none [2] different repos
Bazaar ? ? ?
Perforce ? ? ?
BitKeeper changeset ? different repos
  • [1] note that CVS only tracks patches to individual files. Buildbot tries to recognize coordinated changes to multiple files by correlating change times.
  • [2] Darcs does not have a concise way of representing a particular revision of the source.

Buildbot Coding Style

Symbol Names

Buildbot follows PEP8 regarding the formatting of symbol names. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, this is not very consistently applied throughout the codebase.

The single exception to PEP8 is in naming of functions and methods. That is, you should spell methods and functions with the first character in lower-case, and the first letter of subsequent words capitalized, e.g., compareToOther or getChangesGreaterThan.

Symbols used as parameters to functions used in configuration files should use underscores.

In summary, then:

Symbol Type Format
Methods interCaps
Functions interCaps
Function Arguments under_scores
Classes InitialCaps
Variables under_scores
Constants ALL_CAPS

Twisted Idioms

Programming with Twisted Python can be daunting. But sticking to a few well-defined patterns can help avoid surprises.

Prefer to Return Deferreds

If you're writing a method that doesn't currently block, but could conceivably block sometime in the future, return a Deferred and document that it does so. Just about anything might block - even getters and setters!

Helpful Twisted Classes

Twisted has some useful, but little-known classes. Brief descriptions follow, but you should consult the API documentation or source code for the full details.

twisted.internet.task.LoopingCall
Calls an asynchronous function repeatedly at set intervals. Note that this will stop looping if the function fails. In general, you will want to wrap the function to capture and log errors.
twisted.application.internet.TimerService
Similar to t.i.t.LoopingCall, but implemented as a service that will automatically start and stop the function calls when the service starts and stops. See the warning about failing functions for t.i.t.LoopingCall.
Sequences of Operations

Especially in Buildbot, we're often faced with executing a sequence of operations, many of which may block.

In all cases where this occurs, there is a danger of pre-emption, so exercise the same caution you would if writing a threaded application.

For simple cases, you can use nested callback functions. For more complex cases, deferredGenerator is appropriate.

Nested Callbacks

First, an admonition: do not create extra class methods that represent the continuations of the first:

def myMethod(self):
    d = ...
    d.addCallback(self._myMethod_2) # BAD!
def _myMethod_2(self, res):         # BAD!
    ...

Invariably, this extra method gets separated from its parent as the code evolves, and the result is completely unreadable. Instead, include all of the code for a particular function or method within the same indented block, using nested functions:

def getRevInfo(revname):
    results = {}
    d = defer.succeed(None)
    def rev_parse(_): # note use of '_' to quietly indicate an ignored parameter
        return utils.getProcessOutput(git, [ 'rev-parse', revname ])
    d.addCallback(rev_parse)
    def parse_rev_parse(res):
        results['rev'] = res.strip()
        return utils.getProcessOutput(git, [ 'log', '-1', '--format=%s%n%b', results['rev'] ])
    d.addCallback(parse_rev_parse)
    def parse_log(res):
        results['comments'] = res.strip()
    d.addCallback(parse_log)
    def set_results(_):
        return results
    d.addCallback(set_results)
    return d

it is usually best to make the first operation occur within a callback, as the deferred machinery will then handle any exceptions as a failure in the outer Deferred. As a shortcut, d.addCallback works as a decorator:

d = defer.succeed(None)
@d.addCallback
def rev_parse(_): # note use of '_' to quietly indicate an ignored parameter
    return utils.getProcessOutput(git, [ 'rev-parse', revname ])

Be careful with local variables. For example, if parse_rev_parse, above, merely assigned rev = res.strip(), then that variable would be local to parse_rev_parse and not available in set_results. Mutable variables (dicts and lists) at the outer function level are appropriate for this purpose.

Note

do not try to build a loop in this style by chaining multiple Deferreds! Unbounded chaining can result in stack overflows, at least on older versions of Twisted. Use deferredGenerator instead.

inlineCallbacks

twisted.internet.defer.inlineCallbacks is a great help to writing code that makes a lot of asynchronous calls, particularly if those calls are made in loop or conditionals. Refer to the Twisted documentation for the details, but the style within Buildbot is as follows:

from twisted.internet import defer

@defer.inlineCallbacks
def mymethod(self, x, y):
    xval = yield getSomething(x)

    for z in (yield getZValues()):
        y += z

    if xval > 10:
        defer.returnValue(xval + y)
        return

    self.someOtherMethod()

The key points to notice here:

  • Always import defer as a module, not the names within it.
  • Use the decorator form of inlineCallbacks.
  • In most cases, the result of a yield expression should be assigned to a variable. It can be used in a larger expression, but remember that Python requires that you enclose the expression in its own set of parentheses.
  • Python does not permit returning a value from a generator, so statements like return xval + y are invalid. Instead, yield the result of defer.returnValue. Although this function does cause an immediate function exit, for clarity follow it with a bare return, as in the example, unless it is the last statement in a function.

The great advantage of inlineCallbacks is that it allows you to use all of the usual Pythonic control structures in their natural form. In particular, it is easy to represent a loop, or even nested loops, in this style without losing any readability.

Note that code using deferredGenerator is no longer acceptable in Buildbot.

Locking

Remember that asynchronous programming does not free you from the need to worry about concurrency issues. Particularly if you are executing a sequence of operations, each time you wait for a Deferred, arbitrary other actions can take place.

In general, you should try to perform actions atomically, but for the rare situations that require synchronization, the following might be useful:

Joining Sequences

It's often the case that you'll want to perform multiple operations in parallel, and re-join the results at the end. For this purpose, you'll want to use a DeferredList

def getRevInfo(revname):
    results = {}
    finished = dict(rev_parse=False, log=False)

    rev_parse_d = utils.getProcessOutput(git, [ 'rev-parse', revname ])
    def parse_rev_parse(res):
        return res.strip()
    rev_parse_d.addCallback(parse_rev_parse)

    log_d = utils.getProcessOutput(git, [ 'log', '-1', '--format=%s%n%b', results['rev'] ])
    def parse_log(res):
        return res.strip()
    log_d.addCallback(parse_log)

    d = defer.DeferredList([rev_parse_d, log_d], consumeErrors=1, fireOnFirstErrback=1)
    def handle_results(results):
        return dict(rev=results[0][1], log=results[1][1])
    d.addCallback(handle_results)
    return d

Here the deferred list will wait for both rev_parse_d and log_d to fire, or for one of them to fail. You may attach callbacks and errbacks to a DeferredList just as for a deferred.

Buildbot's Test Suite

Buildbot's tests are under buildbot.test and, for the buildslave, buildslave.test. Tests for the slave are similar to the master, although in some cases helpful functionality on the master is not re-implemented on the slave.

Suites

Tests are divided into a few suites:

  • Unit tests (buildbot.test.unit) - these follow unit-testing practices and attempt to maximally isolate the system under test. Unit tests are the main mechanism of achieving test coverage, and all new code should be well-covered by corresponding unit tests.
  • Interface tests (buildbot.test.interface). In many cases, Buildbot has multiple implementations of the same interface -- at least one "real" implementation and a fake implementation used in unit testing. The interface tests ensure that these implementations all meet the same standards. This ensures consistency between implementations, and also ensures that the unit tests are testing against realistic fakes.
  • Integration tests (buildbot.test.integration) - these test combinations of multiple units. Of necessity, integration tests are incomplete - they cannot test every condition; difficult to maintain - they tend to be complex and touch a lot of code; and slow - they usually require considerable setup and execute a lot of code. As such, use of integration tests is limited to a few, broad tests to act as a failsafe for the unit and interface tests.
  • Regression tests (buildbot.test.regressions) - these test to prevent re-occurrence of historical bugs. In most cases, a regression is better tested by a test in the other suites, or unlike to recur, so this suite tends to be small.
  • Fuzz tests (buildbot.test.fuzz) - these tests run for a long time and apply randomization to try to reproduce rare or unusual failures. The Buildbot project does not currently have a framework to run fuzz tests regularly.
Unit Tests

Every code module should have corresponding unit tests. This is not currently true of Buildbot, due to a large body of legacy code, but is a goal of the project. All new code must meet this requirement.

Unit test modules are be named after the package or class they test, replacing . with _ and omitting the buildbot_. For example, test_status_web_authz_Authz.py tests the Authz class in buildbot/status/web/authz.py. Modules with only one class, or a few trivial classes, can be tested in a single test module. For more complex situations, prefer to use multiple test modules.

Interface Tests

Interface tests exist to verify that multiple implementations of an interface meet the same requirements. Note that the name 'interface' should not be confused with the sparse use of Zope Interfaces in the Buildbot code -- in this context, an interface is any boundary between testable units.

Ideally, all interfaces, both public and private, should be tested. Certainly, any public interfaces need interface tests.

Interface test modules are named after the interface they are testing, e.g., test_mq.py. They generally begin as follows:

from buildbot.test.util import interfaces
from twistd.trial import unittest

class Tests(interfaces.InterfaceTests):

    # define methods that must be overridden per implementation
    def someSetupMethod(self):
        raise NotImplementedError

    # tests that all implementations must pass
    def test_signature_someMethod(self):
        @self.assertArgSpecMatches(self.systemUnderTest.someMethod)
        def someMethod(self, arg1, arg2):
            pass

    def test_something(self):
        pass # ...

class RealTests(Tests):

    # tests that all *real* implementations must pass
    def test_something_else(self):
        pass # ...

All of the test methods are defined here, segregated into tests that all implementations must pass, and tests that the fake implementation is not expected to pass. The test_signature_someMethod test above illustrates the assertArgSpecMatches decorator, which can be used to compare the argument specification of a callable with a reference implementation conveniently written as a nested function.

At the bottom of the test module, a subclass is created for each implementation, implementing the setup methods that were stubbed out in the parent classes:

class TestFakeThing(unittest.TestCase, Tests):

    def someSetupMethod(self):
        pass # ...

class TestRealThing(unittest.TestCase, RealTests):

    def someSetupMethod(self):
        pass # ...

For implementations which require optional software, this is the appropriate place to signal that tests should be skipped when their prerequisites are not available.

Integration Tests

Integration test modules test several units at once, including their interactions. In general, they serve as a catch-all for failures and bugs that were not detected by the unit and interface tests. As such, they should not aim to be exhaustive, but merely representative.

Integration tests are very difficult to maintain if they reach into the internals of any part of Buildbot. Where possible, try to use the same means as a user would to set up, run, and check the results of an integration test. That may mean writing a master.cfg to be parsed, and checking the results by examining the database (or fake DB API) afterward.

Regression Tests

Regression tests are even more rare in Buildbot than integration tests. In many cases, a regression test is not necessary -- either the test is better-suited as a unit or interface test, or the failure is so specific that a test will never fail again.

Regression tests tend to be closely tied to the code in which the error occurred. When that code is refactored, the regression test generally becomes obsolete, and is deleted.

Fuzz Tests

Fuzz tests generally run for a fixed amount of time, running randomized tests against a system. They do not run at all during normal runs of the Buildbot tests, unless BUILDBOT_FUZZ is defined. This is accomplished with something like the following at the end of each test module:

if 'BUILDBOT_FUZZ' not in os.environ:
    del LRUCacheFuzzer

Mixins

Buildbot provides a number of purpose-specific mixin classes in master/buildbot/util. These generally define a set of utility functions as well as setUpXxx and tearDownXxx methods. These methods should be called explicitly from your subclass's setUp and tearDown methods. Note that some of these methods return Deferreds, which should be handled properly by the caller.

Fakes

Buildbot provides a number of pre-defined fake implementations of internal interfaces, in master/buildbot/fake. These are designed to be used in unit tests to limit the scope of the test. For example, the fake DB API eliminates the need to create a real database when testing code that uses the DB API, and isolates bugs in the system under test from bugs in the real DB implementation.

The danger of using fakes is that the fake interface and the real interface can differ. The interface tests exist to solve this problem. All fakes should be fully tested in an integration test, so that the fakes pass the same tests as the "real" thing. It is particularly important that the method signatures be compared.

Good Tests

Bad tests are worse than no tests at all, since they waste developers' time wondering "was that a spurious failure?" or "what the heck is this test trying to do?" Buildbot needs good tests. So what makes a good test?

Independent of Time

Tests that depend on wall time will fail. As a bonus, they run very slowly. Do not use reactor.callLater to wait "long enough" for something to happen.

For testing things that themselves depend on time, consider using twisted.internet.tasks.Clock. This may mean passing a clock instance to the code under test, and propagating that instance as necessary to ensure that all of the code using callLater uses it. Refactoring code for testability is difficult, but worthwhile.

For testing things that do not depend on time, but for which you cannot detect the "end" of an operation: add a way to detect the end of the operation!

Clean Code

Make your tests readable. This is no place to skimp on comments! Others will attempt to learn about the expected behavior of your class by reading the tests. As a side note, if you use a Deferred chain in your test, write the callbacks as nested functions, rather than using methods with funny names:

def testSomething(self):
    d = doThisFirst()
    def andThisNext(res):
        pass # ...
    d.addCallback(andThisNext)
    return d

This isolates the entire test into one indented block. It is OK to add methods for common functionality, but give them real names and explain in detail what they do.

Good Name

Test method names should follow the pattern test_METHOD_CONDITION where METHOD is the method being tested, and CONDITION is the condition under which it's tested. Since we can't always test a single method, this is not a hard-and-fast rule.

Assert Only One Thing

Where practical, each test should have a single assertion. This may require a little bit of work to get several related pieces of information into a single Python object for comparison. The problem with multiple assertions is that, if the first assertion fails, the remainder are not tested. The test results then do not tell the entire story.

Prefer Fakes to Mocks

Mock objects are too "compliant", and this often masks errors in the system under test. For example, a mis-spelled method name on a mock object will not raise an exception.

Where possible, use one of the pre-written fake objects (see Fakes) instead of a mock object. Fakes themselves should be well-tested using interface tests.

Where they are appropriate, Mock objects can be constructed easily using the aptly-named mock module, which is a requirement for Buildbot's tests.

Small Tests

The shorter each test is, the better. Test as little code as possible in each test.

It is fine, and in fact encouraged, to write the code under test in such a way as to facilitate this. As an illustrative example, if you are testing a new Step subclass, but your tests require instantiating a BuildMaster, you're probably doing something wrong!

This also applies to test modules. Several short, easily-digested test modules are preferred over a 1000-line monster.

Isolation

Each test should be maximally independent of other tests. Do not leave files laying around after your test has finished, and do not assume that some other test has run beforehand. It's fine to use caching techniques to avoid repeated, lengthy setup times.

Be Correct

Tests should be as robust as possible, which at a basic level means using the available frameworks correctly. All Deferreds should have callbacks and be chained properly. Error conditions should be checked properly. Race conditions should not exist (see Independent of Time, above).

Be Helpful

Note that tests will pass most of the time, but the moment when they are most useful is when they fail.

When the test fails, it should produce output that is helpful to the person chasing it down. This is particularly important when the tests are run remotely, in which case the person chasing down the bug does not have access to the system on which the test fails. A test which fails sporadically with no more information than "AssertionFailed" is a prime candidate for deletion if the error isn't obvious. Making the error obvious also includes adding comments describing the ways a test might fail.

Keeping State

Python does not allow assignment to anything but the innermost local scope or the global scope with the global keyword. This presents a problem when creating nested functions:

def test_localVariable(self):
    cb_called = False
    def cb():
        cb_called = True
    cb()
    self.assertTrue(cb_called) # will fail!

The cb_called = True assigns to a different variable than cb_called = False. In production code, it's usually best to work around such problems, but in tests this is often the clearest way to express the behavior under test.

The solution is to change something in a common mutable object. While a simple list can serve as such a mutable object, this leads to code that is hard to read. Instead, use State:

from buildbot.test.state import State

def test_localVariable(self):
    state = State(cb_called=False)
    def cb():
        state.cb_called = True
    cb()
    self.assertTrue(state.cb_called) # passes

This is almost as readable as the first example, but it actually works.

Configuration

Wherever possible, Buildbot components should access configuration information as needed from the canonical source, master.config, which is an instance of MasterConfig. For example, components should not keep a copy of the buildbotURL locally, as this value may change throughout the lifetime of the master.

Components which need to be notified of changes in the configuration should be implemented as services, subclassing ReconfigurableServiceMixin, as described in Reconfiguration.

class buildbot.config.MasterConfig

The master object makes much of the configuration available from an object named master.config. Configuration is stored as attributes of this object. Where possible, other Buildbot components should access this configuration directly and not cache the configuration values anywhere else. This avoids the need to ensure that update-from-configuration methods are called on a reconfig.

Aside from validating the configuration, this class handles any backward-compatibility issues - renamed parameters, type changes, and so on - removing those concerns from other parts of Buildbot.

This class may be instantiated directly, creating an entirely default configuration, or via loadConfig, which will load the configuration from a config file.

The following attributes are available from this class, representing the current configuration. This includes a number of global parameters:

title

The title of this buildmaster, from title.

titleURL

The URL corresponding to the title, from titleURL.

buildbotURL

The URL of this buildmaster, for use in constructing WebStatus URLs; from buildbotURL.

changeHorizon

The current change horizon, from changeHorizon.

eventHorizon

The current event horizon, from eventHorizon.

logHorizon

The current log horizon, from logHorizon.

buildHorizon

The current build horizon, from buildHorizon.

logCompressionLimit

The current log compression limit, from logCompressionLimit.

logCompressionMethod

The current log compression method, from logCompressionMethod.

logMaxSize

The current log maximum size, from logMaxSize.

logMaxTailSize

The current log maximum size, from logMaxTailSize.

properties

A Properties instance containing global properties, from properties.

mergeRequests

A callable, or True or False, describing how to merge requests; from mergeRequests.

prioritizeBuilders

A callable, or None, used to prioritize builders; from prioritizeBuilders.

codebaseGenerator

A callable, or None, used to determine the codebase from an incoming Change, from codebaseGenerator

protocols

The per-protocol port specification for slave connections. Based on protocols.

multiMaster

If true, then this master is part of a cluster; based on multiMaster.

debugPassword

The password for the debug client, or None; from debugPassword.

manhole

The manhole instance to use, or None; from manhole.

The remaining attributes contain compound configuration structures, usually dictionaries:

validation

Validation regular expressions, a dictionary from validation. It is safe to assume that all expected keys are present.

db

Database specification, a dictionary with keys db_url and db_poll_interval. It is safe to assume that both keys are present.

metrics

The metrics configuration from metrics, or an empty dictionary by default.

caches

The cache configuration, from caches as well as the deprecated buildCacheSize and changeCacheSize parameters.

The keys Builds and Caches are always available; other keys should use config.caches.get(cachename, 1).

schedulers

The dictionary of scheduler instances, by name, from schedulers.

builders

The list of BuilderConfig instances from builders. Builders specified as dictionaries in the configuration file are converted to instances.

slaves

The list of BuildSlave instances from slaves.

change_sources

The list of IChangeSource providers from change_source.

status

The list of IStatusReceiver providers from status.

user_managers

The list of user managers providers from user_managers.

Loading of the configuration file is generally triggered by the master, using the following methods:

classmethod loadConfig(basedir, filename)
Parameters:
  • basedir (string) -- directory to which config is relative
  • filename (string) -- the configuration file to load
Raises:

ConfigErrors if any errors occur

Returns:

new MasterConfig instance

Load the configuration in the given file. Aside from syntax errors, this will also detect a number of semantic errors such as multiple schedulers with the same name.

The filename is treated as relative to the basedir, if it is not absolute.

Builder Configuration

class buildbot.config.BuilderConfig([keyword args])

This class parameterizes configuration of builders; see Builder Configuration for its arguments. The constructor checks for errors and applies defaults, and sets the properties described here. Most are simply copied from the constructor argument of the same name.

Users may subclass this class to add defaults, for example.

name

The builder's name.

factory

The builder's factory.

slavenames

The builder's slave names (a list, regardless of whether the names were specified with slavename or slavenames).

builddir

The builder's builddir.

slavebuilddir

The builder's slave-side builddir.

category

The builder's category.

nextSlave

The builder's nextSlave callable.

nextBuild

The builder's nextBuild callable.

canStartBuild

The builder's canStartBuild callable.

locks

The builder's locks.

env

The builder's environmnet variables.

properties

The builder's properties, as a dictionary.

mergeRequests

The builder's mergeRequests callable.

description

The builder's description, displayed in the web status.

Error Handling

If any errors are encountered while loading the configuration buildbot.config.error should be called. This can occur both in the configuration-loading code, and in the constructors of any objects that are instantiated in the configuration - change sources, slaves, schedulers, build steps, and so on.

buildbot.config.error(error)
Parameters:error -- error to report
Raises:ConfigErrors if called at build-time

This function reports a configuration error. If a config file is being loaded, then the function merely records the error, and allows the rest of the configuration to be loaded. At any other time, it raises ConfigErrors. This is done so all config errors can be reported, rather than just the first.

exception buildbot.config.ConfigErrors([errors])
Parameters:errors (list) -- errors to report

This exception represents errors in the configuration. It supports reporting multiple errors to the user simultaneously, e.g., when several consistency checks fail.

errors

A list of detected errors, each given as a string.

addError(msg)
Parameters:msg (string) -- the message to add

Add another error message to the (presumably not-yet-raised) exception.

Reconfiguration

When the buildmaster receives a signal to begin a reconfig, it re-reads the configuration file, generating a new MasterConfig instance, and then notifies all of its child services via the reconfig mechanism described below. The master ensures that at most one reconfiguration is taking place at any time.

See Master Organization for the structure of the Buildbot service tree.

To simplify initialization, a reconfiguration is performed immediately on master startup. As a result, services only need to implement their configuration handling once, and can use startService for initialization.

See below for instructions on implementing configuration of common types of components in Buildbot.

Note

Because Buildbot uses a pure-Python configuration file, it is not possible to support all forms of reconfiguration. In particular, when the configuration includes custom subclasses or modules, reconfiguration can turn up some surprising behaviors due to the dynamic nature of Python. The reconfig support in Buildbot is intended for "intermediate" uses of the software, where there are fewer surprises.

Reconfigurable Services

Instances which need to be notified of a change in configuration should be implemented as Twisted services, and mix in the ReconfigurableServiceMixin class, overriding the reconfigService method.

class buildbot.config.ReconfigurableServiceMixin
reconfigService(new_config)
Parameters:new_config (MasterConfig) -- new master configuration
Returns:Deferred

This method notifies the service that it should make any changes necessary to adapt to the new configuration values given.

This method will be called automatically after a service is started.

It is generally too late at this point to roll back the reconfiguration, so if possible any errors should be detected in the MasterConfig implementation. Errors are handled as best as possible and communicated back to the top level invocation, but such errors may leave the master in an inconsistent state. ConfigErrors exceptions will be displayed appropriately to the user on startup.

Subclasses should always call the parent class's implementation. For MultiService instances, this will call any child services' reconfigService methods, as appropriate. This will be done sequentially, such that the Deferred from one service must fire before the next service is reconfigured.

priority

Child services are reconfigured in order of decreasing priority. The default priority is 128, so a service that must be reconfigured before others should be given a higher priority.

Change Sources

When reconfiguring, there is no method by which Buildbot can determine that a new ChangeSource represents the same source as an existing ChangeSource, but with different configuration parameters. As a result, the change source manager compares the lists of existing and new change sources using equality, stops any existing sources that are not in the new list, and starts any new change sources that do not already exist.

ChangeSource inherits ComparableMixin, so change sources are compared based on the attributes described in their compare_attrs.

If a change source does not make reference to any global configuration parameters, then there is no need to inherit ReconfigurableServiceMixin, as a simple comparison and startService and stopService will be sufficient.

If the change source does make reference to global values, e.g., as default values for its parameters, then it must inherit ReconfigurableServiceMixin to support the case where the global values change.

Schedulers

Schedulers have names, so Buildbot can determine whether a scheduler has been added, removed, or changed during a reconfig. Old schedulers will be stopped, new schedulers will be started, and both new and existing schedulers will see a call to reconfigService, if such a method exists. For backward compatibility, schedulers which do not support reconfiguration will be stopped, and the new scheduler started, when their configuration changes.

If, during a reconfiguration, a new and old scheduler's fully qualified class names differ, then the old class will be stopped and the new class started. This supports the case when a user changes, for example, a Nightly scheduler to a Periodic scheduler without changing the name.

Because Buildbot uses BaseScheduler instances directly in the configuration file, a reconfigured scheduler must extract its new configuration information from another instance of itself. BaseScheduler implements a helper method, findNewSchedulerInstance, which will return the new instance of the scheduler in the given MasterConfig object.

Custom Subclasses

Custom subclasses are most often defined directly in the configuration file, or in a Python module that is reloaded with reload every time the configuration is loaded. Because of the dynamic nature of Python, this creates a new object representing the subclass every time the configuration is loaded -- even if the class definition has not changed.

Note that if a scheduler's class changes in a reconfig, but the scheduler's name does not, it will still be treated as a reconfiguration of the existing scheduler. This means that implementation changes in custom scheduler subclasses will not be activated with a reconfig. This behavior avoids stopping and starting such schedulers on every reconfig, but can make development difficult.

One workaround for this is to change the name of the scheduler before each reconfig - this will cause the old scheduler to be stopped, and the new scheduler (with the new name and class) to be started.

Slaves

Similar to schedulers, slaves are specified by name, so new and old configurations are first compared by name, and any slaves to be added or removed are noted. Slaves for which the fully-qualified class name has changed are also added and removed. All slaves have their reconfigService method called.

This method takes care of the basic slave attributes, including changing the PB registration if necessary. Any subclasses that add configuration parameters should override reconfigService and update those parameters. As with Schedulers, because the AbstractBuildSlave instance is given directly in the configuration, on reconfig instances must extract the configuration from a new instance. The findNewSlaveInstance method can be used to find the new instance.

User Managers

Since user managers are rarely used, and their purpose is unclear, they are always stopped and re-started on every reconfig. This may change in figure versions.

Status Receivers

At every reconfig, all status listeners are stopped and new versions started.

Utilities

Several small utilities are available at the top-level buildbot.util package.

buildbot.util.naturalSort(list)
Parameters:list -- list of strings
Returns:sorted strings

This function sorts strings "naturally", with embedded numbers sorted numerically. This ordering is good for objects which might have a numeric suffix, e.g., winslave1, winslave2

buildbot.util.formatInterval(interval)
Parameters:interval -- duration in seconds
Returns:human-readable (English) equivalent

This function will return a human-readable string describing a length of time, given a number of seconds.

class buildbot.util.ComparableMixin

This mixin class adds comparability to a subclass. Use it like this:

class Widget(FactoryProduct, ComparableMixin):
    compare_attrs = [ 'radius', 'thickness' ]
    # ...

Any attributes not in compare_attrs will not be considered when comparing objects. This is particularly useful in implementing buildbot's reconfig logic, where a simple comparison between the new and existing objects can determine whether the new object should replace the existing object.

A point to note is that the compare_attrs list is cumulative; that is, when a subclass also has a compare_attrs and the parent class has a compare_attrs, the subclass' compare_attrs also includes the parent class' compare_attrs.

buildbot.util.safeTranslate(str)
Parameters:str -- input string
Returns:safe version of the input

This function will filter out some inappropriate characters for filenames; it is suitable for adapting strings from the configuration for use as filenames. It is not suitable for use with strings from untrusted sources.

buildbot.util.epoch2datetime(epoch)
Parameters:epoch -- an epoch time (integer)
Returns:equivalent datetime object

Convert a UNIX epoch timestamp to a Python datetime object, in the UTC timezone. Note that timestamps specify UTC time (modulo leap seconds and a few other minor details).

buildbot.util.datetime2epoch(datetime)
Parameters:datetime -- a datetime object
Returns:equivalent epoch time (integer)

Convert an arbitrary Python datetime object into a UNIX epoch timestamp.

buildbot.util.UTC

A datetime.tzinfo subclass representing UTC time. A similar class has finally been added to Python in version 3.2, but the implementation is simple enough to include here. This is mostly used in tests to create timezone-aware datetime objects in UTC:

dt = datetime.datetime(1978, 6, 15, 12, 31, 15, tzinfo=UTC)
buildbot.util.diffSets(old, new)
Parameters:
  • old (set or iterable) -- old set
  • new (set or iterable) -- new set
Returns:

a tuple, (removed, added)

This function compares two sets of objects, returning elements that were added and elements that were removed. This is largely a convenience function for reconfiguring services.

buildbot.util.makeList(input)
Parameters:input -- a thing
Returns:a list of zero or more things

This function is intended to support the many places in Buildbot where the user can specify either a string or a list of strings, but the implementation wishes to always consider lists. It converts any string to a single-element list, None to an empty list, and any iterable to a list. Input lists are copied, avoiding aliasing issues.

buildbot.util.now()
Returns:epoch time (integer)

Return the current time, using either reactor.seconds or time.time().

buildbot.util.flatten(list)
Parameters:list -- potentially nested list
Returns:flat list

Flatten nested lists into a list containing no other lists. For example:

>>> flatten([ [  1, 2 ], 3, [ [ 4 ] ] ])
[ 1, 2, 3, 4 ]

Note that this looks strictly for lists -- tuples, for example, are not flattened.

buildbot.util.none_or_str(obj)
Parameters:obj -- input value
Returns:string or None

If obj is not None, return its string representation.

buildbot.util.NotABranch

This is a sentinel value used to indicate that no branch is specified. It is necessary since schedulers and change sources consider None a valid name for a branch. This is generally used as a default value in a method signature, and then tested against with is:

if branch is NotABranch:
    pass # ...
buildbot.util.in_reactor(fn)

This decorator will cause the wrapped function to be run in the Twisted reactor, with the reactor stopped when the function completes. It returns the result of the wrapped function. If the wrapped function fails, its traceback will be printed, the reactor halted, and None returned.

buildbot.util.asyncSleep(secs)

Yield a deferred that will fire with no result after secs seconds. This is the asynchronous equivalent to time.sleep, and can be useful in tests.

buildbot.util.lru

LRUCache(miss_fn, max_size=50):
Parameters:
  • miss_fn -- function to call, with key as parameter, for cache misses. The function should return the value associated with the key argument, or None if there is no value associated with the key.
  • max_size -- maximum number of objects in the cache.

This is a simple least-recently-used cache. When the cache grows beyond the maximum size, the least-recently used items will be automatically removed from the cache.

This cache is designed to control memory usage by minimizing duplication of objects, while avoiding unnecessary re-fetching of the same rows from the database.

All values are also stored in a weak valued dictionary, even after they have expired from the cache. This allows values that are used elsewhere in Buildbot to "stick" in the cache in case they are needed by another component. Weak references cannot be used for some types, so these types are not compatible with this class. Note that dictionaries can be weakly referenced if they are an instance of a subclass of dict.

If the result of the miss_fn is None, then the value is not cached; this is intended to avoid caching negative results.

This is based on Raymond Hettinger's implementation, licensed under the PSF license, which is GPL-compatiblie.

buildbot.util.lru.hits

cache hits so far

buildbot.util.lru.refhits

cache misses found in the weak ref dictionary, so far

buildbot.util.lru.misses

cache misses leading to re-fetches, so far

buildbot.util.lru.max_size

maximum allowed size of the cache

buildbot.util.lru.get(key, **miss_fn_kwargs)
Parameters:
  • key -- cache key
  • miss_fn_kwargs -- keyword arguments to the miss_fn
Returns:

value via Deferred

Fetch a value from the cache by key, invoking miss_fn(key, **miss_fn_kwargs) if the key is not in the cache.

Any additional keyword arguments are passed to the miss_fn as keyword arguments; these can supply additional information relating to the key. It is up to the caller to ensure that this information is functionally identical for each key value: if the key is already in the cache, the miss_fn will not be invoked, even if the keyword arguments differ.

buildbot.util.lru.put(key, value)
Parameters:
  • key -- key at which to place the value
  • value -- value to place there

Add the given key and value into the cache. The purpose of this method is to insert a new value into the cache without invoking the miss_fn (e.g., to avoid unnecessary overhead).

buildbot.util.lru.inv()

Check invariants on the cache. This is intended for debugging purposes.

AsyncLRUCache(miss_fn, max_size=50):
Parameters:
  • miss_fn -- This is the same as the miss_fn for class LRUCache, with the difference that this function must return a Deferred.
  • max_size -- maximum number of objects in the cache.

This class has the same functional interface as LRUCache, but asynchronous locking is used to ensure that in the common case of multiple concurrent requests for the same key, only one fetch is performed.

buildbot.util.bbcollections

This package provides a few useful collection objects.

Note

This module used to be named collections, but without absolute imports (PEP 328), this precluded using the standard library's collections module.

class buildbot.util.bbcollections.defaultdict

This is a clone of the Python collections.defaultdict for use in Python-2.4. In later versions, this is simply a reference to the built-in defaultdict, so buildbot code can simply use buildbot.util.collections.defaultdict everywhere.

class buildbot.util.bbcollections.KeyedSets

This is a collection of named sets. In principal, it contains an empty set for every name, and you can add things to sets, discard things from sets, and so on.

>>> ks = KeyedSets()
>>> ks['tim']                   # get a named set
set([])
>>> ks.add('tim', 'friendly')   # add an element to a set
>>> ks.add('tim', 'dexterous')
>>> ks['tim']
set(['friendly', 'dexterous'])
>>> 'tim' in ks                 # membership testing
True
>>> 'ron' in ks
False
>>> ks.discard('tim', 'friendly')# discard set element
>>> ks.pop('tim')               # return set and reset to empty
set(['dexterous'])
>>> ks['tim']
set([])

This class is careful to conserve memory space - empty sets do not occupy any space.

buildbot.util.eventual

This function provides a simple way to say "please do this later". For example:

from buildbot.util.eventual import eventually
def do_what_I_say(what, where):
    # ...
    return d
eventually(do_what_I_say, "clean up", "your bedroom")

The package defines "later" as "next time the reactor has control", so this is a good way to avoid long loops that block other activity in the reactor.

buildbot.util.eventual.eventually(cb, *args, **kwargs)
Parameters:
  • cb -- callable to invoke later
  • args -- args to pass to cb
  • kwargs -- kwargs to pass to cb

Invoke the callable cb in a later reactor turn.

Callables given to eventually are guaranteed to be called in the same order as the calls to eventually -- writing eventually(a); eventually(b) guarantees that a will be called before b.

Any exceptions that occur in the callable will be logged with log.err(). If you really want to ignore them, provide a callable that catches those exceptions.

This function returns None. If you care to know when the callable was run, be sure to provide a callable that notifies somebody.

buildbot.util.eventual.fireEventually(value=None)
Parameters:value -- value with which the Deferred should fire
Returns:Deferred

This function returns a Deferred which will fire in a later reactor turn, after the current call stack has been completed, and after all other Deferreds previously scheduled with eventually. The returned Deferred will never fail.

buildbot.util.eventual.flushEventualQueue()
Returns:Deferred

This returns a Deferred which fires when the eventual-send queue is finally empty. This is useful for tests and other circumstances where it is useful to know that "later" has arrived.

buildbot.util.debounce

Often, a method must be called exactly once at a time, but many events may trigger a call to the method. A simple example is the step method updateSummary.

The debounce.method(wait) decorator is the tool for the job.

buildbot.util.debounce.method(wait)
Parameters:wait -- time to wait before invoking, in seconds

Returns a decorator that debounces the underlying method. The underlying method must take no arguments (except self).

For each call to the decorated method, the underlying method will be invocation at least once within wait seconds (plus the time the method takes to execute). Calls are "debounced" during that time, meaning that multiple calls to the decorated method may result in a single invocation.

The decorated method is an instance of Debouncer, allowing it to be started and stopped. This is useful when the method is a part of a Buidbot service: call method.start() from startService and method.stop() from stopService, handling its Deferred appropriately.

class buildbot.util.debounce.Debouncer
stop()
Returns:Deferred

Stop the debouncer. While the debouncer is stopped, calls to the decorated method will be ignored. When the Deferred that stop returns fires, the underlying method is not executing.

start()

Start the debouncer. This reverses the effects of stop. This method can be called on a started debouncer without issues.

buildbot.util.json

This package is just an import of the best available JSON module. Use it instead of a more complex conditional import of simplejson or json:

from buildbot.util import json

buildbot.util.maildir

Several Buildbot components make use of maildirs to hand off messages between components. On the receiving end, there's a need to watch a maildir for incoming messages and trigger some action when one arrives.

class buildbot.util.maildir.MaildirService(basedir)
param basedir:(optional) base directory of the maildir

A MaildirService instance watches a maildir for new messages. It should be a child service of some MultiService instance. When running, this class uses the linux dirwatcher API (if available) or polls for new files in the 'new' maildir subdirectory. When it discovers a new message, it invokes its messageReceived method.

To use this class, subclass it and implement a more interesting messageReceived function.

setBasedir(basedir)
Parameters:basedir -- base directory of the maildir

If no basedir is provided to the constructor, this method must be used to set the basedir before the service starts.

messageReceived(filename)
Parameters:filename -- unqualified filename of the new message

This method is called with the short filename of the new message. The full name of the new file can be obtained with os.path.join(maildir, 'new', filename). The method is un-implemented in the MaildirService class, and must be implemented in subclasses.

moveToCurDir(filename)
Parameters:filename -- unqualified filename of the new message
Returns:open file object

Call this from messageReceived to start processing the message; this moves the message file to the 'cur' directory and returns an open file handle for it.

buildbot.util.misc

buildbot.util.misc.deferredLocked(lock)
Parameters:lock -- a twisted.internet.defer.DeferredLock instance or a string naming an instance attribute containing one

This is a decorator to wrap an event-driven method (one returning a Deferred) in an acquire/release pair of a designated DeferredLock. For simple functions with a static lock, this is as easy as:

someLock = defer.DeferredLock()
@util.deferredLocked(someLock)
def someLockedFunction():
    # ..
    return d

For class methods which must access a lock that is an instance attribute, the lock can be specified by a string, which will be dynamically resolved to the specific instance at runtime:

def __init__(self):
    self.someLock = defer.DeferredLock()

@util.deferredLocked('someLock')
def someLockedFunction():
    # ..
    return d
class buildbot.util.misc.SerializedInvocation(method)

This is a method wrapper that will serialize calls to an asynchronous method. If a second call occurs while the first call is still executing, it will not begin until the first call has finished. If multiple calls queue up, they will be collapsed into a single call. The effect is that the underlying method is guaranteed to be called at least once after every call to the wrapper.

Note that if this class is used as a decorator on a method, it will serialize invocations across all class instances. For synchronization specific to each instance, wrap the method in the constructor:

def __init__(self):
    self.someMethod = SerializedInovcation(self.someMethod)

Tests can monkey-patch the _quiet method of the class to be notified when all planned invocations are complete.

buildbot.util.netstrings

Similar to maildirs, netstrings are used occasionally in Buildbot to encode data for interchange. While Twisted supports a basic netstring receiver protocol, it does not have a simple way to apply that to a non-network situation.

class buildbot.util.netstrings.NetstringParser

This class parses strings piece by piece, either collecting the accumulated strings or invoking a callback for each one.

feed(data)
Parameters:data -- a portion of netstring-formatted data
Raises:twisted.protocols.basic.NetstringParseError

Add arbitrarily-sized data to the incoming-data buffer. Any complete netstrings will trigger a call to the stringReceived method.

Note that this method (like the Twisted class it is based on) cannot detect a trailing partial netstring at EOF - the data will be silently ignored.

stringReceived(string):
Parameters:string -- the decoded string

This method is called for each decoded string as soon as it is read completely. The default implementation appends the string to the strings attribute, but subclasses can do anything.

strings

The strings decoded so far, if stringReceived is not overridden.

buildbot.util.sautils

This module contains a few utilities that are not included with SQLAlchemy.

class buildbot.util.sautils.InsertFromSelect(table, select)
Parameters:
  • table -- table into which insert should be performed
  • select -- select query from which data should be drawn

This class is taken directly from SQLAlchemy's compiler.html, and allows a Pythonic representation of INSERT INTO .. SELECT .. queries.

buildbot.util.sautils.sa_version()

Return a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a __version__ attribute are represented by (0,0,0).

buildbot.util.subscription

The classes in the buildbot.util.subscription module are used for master-local subscriptions. In the near future, all uses of this module will be replaced with message-queueing implementations that allow subscriptions and subscribers to span multiple masters.

buildbot.util.croniter

This module is a copy of https://github.com/taichino/croniter, and provides support for converting cron-like time specifications into actual times.

buildbot.util.state

The classes in the buildbot.util.subscription module are used for dealing with object state stored in the database.

class buildbot.util.state.StateMixin

This class provides helper methods for accessing the object state stored in the database.

name

This must be set to the name to be used to identify this object in the database.

master

This must point to the BuildMaster object.

getState(name, default)
Parameters:
  • name -- name of the value to retrieve
  • default -- (optional) value to return if name is not present
Returns:

state value via a Deferred

Raises:
  • KeyError -- if name is not present and no default is given
  • TypeError -- if JSON parsing fails

Get a named state value from the object's state.

getState(name, value)
Parameters:
  • name -- the name of the value to change
  • value -- the value to set - must be a JSONable object
  • returns -- Deferred
Raises TypeError:
 

if JSONification fails

Set a named state value in the object's persistent state. Note that value must be json-able.

buildbot.util.identifiers

This module makes it easy to manipulate identifiers.

buildbot.util.identifiers.isIdentifier(maxLength, object)
Parameters:
  • maxLength -- maximum length of the identifier
  • object -- object to test for identifier-ness
Returns:

boolean

Is object an identifier?

buildbot.util.identifiers.forceIdentifier(maxLength, str)
Parameters:
  • maxLength -- maximum length of the identifier
  • str -- string to coerce to an identifier
Returns:

identifer of maximum length maxLength

Coerce a string (assuming ASCII for bytestrings) into an identifier. This method will replace any invalid characters with _ and truncate to the given length.

buildbot.util.identifiers.incrementIdentifier(maxLength, str)
Parameters:
  • maxLength -- maximum length of the identifier
  • str -- identifier to increment
Returns:

identifer of maximum length maxLength

Raises:

ValueError if no suitable identifier can be constructed

"Increment" an identifier by adding a numeric suffix, while keeping the total length limited. This is useful when selecting a unique identifier for an object. Maximum-length identifiers like _999999 cannot be incremented and will raise ValueError.

Database

As of version 0.8.0, Buildbot has used a database as part of its storage backend. This section describes the database connector classes, which allow other parts of Buildbot to access the database. It also describes how to modify the database schema and the connector classes themselves.

Note

Buildbot is only half-migrated to a database backend. Build and builder status information is still stored on disk in pickle files. This is difficult to fix, although work is underway.

Database Overview

All access to the Buildbot database is mediated by database connector classes. These classes provide a functional, asynchronous interface to other parts of Buildbot, and encapsulate the database-specific details in a single location in the codebase.

The connector API, defined below, is a stable API in Buildbot, and can be called from any other component. Given a master master, the root of the database connectors is available at master.db, so, for example, the state connector's getState method is master.db.state.getState.

The connectors all use SQLAlchemy Core to achieve (almost) database-independent operation. Note that the SQLAlchemy ORM is not used in Buildbot. Database queries are carried out in threads, and report their results back to the main thread via Twisted Deferreds.

Schema

The database schema is maintained with SQLAlchemy-Migrate. This package handles the details of upgrading users between different schema versions.

The schema itself is considered an implementation detail, and may change significantly from version to version. Users should rely on the API (below), rather than performing queries against the database itself.

API

buildrequests
exception buildbot.db.buildrequests.AlreadyClaimedError

Raised when a build request is already claimed, usually by another master.

exception buildbot.db.buildrequests.NotClaimedError

Raised when a build request is not claimed by this master.

class buildbot.db.buildrequests.BuildRequestsConnectorComponent

This class handles the complex process of claiming and unclaiming build requests, based on a polling model: callers poll for unclaimed requests with getBuildRequests, then attempt to claim the requests with claimBuildRequests. The claim can fail if another master has claimed the request in the interim.

An instance of this class is available at master.db.buildrequests.

Build requests are indexed by an ID referred to as a brid. The contents of a request are represented as build request dictionaries (brdicts) with keys

  • brid
  • buildsetid
  • buildername
  • priority
  • claimed (boolean, true if the request is claimed)
  • claimed_at (datetime object, time this request was last claimed)
  • mine (boolean, true if the request is claimed by this master)
  • complete (boolean, true if the request is complete)
  • complete_at (datetime object, time this request was completed)
getBuildRequest(brid)
Parameters:brid -- build request id to look up
Returns:brdict or None, via Deferred

Get a single BuildRequest, in the format described above. This method returns None if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed.

getBuildRequests(buildername=None, complete=None, claimed=None, bsid=None, branch=None, repository=None))
Parameters:
  • buildername (string) -- limit results to buildrequests for this builder
  • complete -- if true, limit to completed buildrequests; if false, limit to incomplete buildrequests; if None, do not limit based on completion.
  • claimed -- see below
  • bsid -- see below
  • repository -- the repository associated with the sourcestamps originating the requests
  • branch -- the branch associated with the sourcestamps originating the requests
Returns:

list of brdicts, via Deferred

Get a list of build requests matching the given characteristics.

Pass all parameters as keyword parameters to allow future expansion.

The claimed parameter can be None (the default) to ignore the claimed status of requests; True to return only claimed builds, False to return only unclaimed builds, or "mine" to return only builds claimed by this master instance. A request is considered unclaimed if its claimed_at column is either NULL or 0, and it is not complete. If bsid is specified, then only build requests for that buildset will be returned.

A build is considered completed if its complete column is 1; the complete_at column is not consulted.

claimBuildRequests(brids[, claimed_at=XX])
Parameters:
  • brids (list) -- ids of buildrequests to claim
  • claimed_at (datetime) -- time at which the builds are claimed
Returns:

Deferred

Raises:

AlreadyClaimedError

Try to "claim" the indicated build requests for this buildmaster instance. The resulting deferred will fire normally on success, or fail with AlreadyClaimedError if any of the build requests are already claimed by another master instance. In this case, none of the claims will take effect.

If claimed_at is not given, then the current time will be used.

As of 0.8.5, this method can no longer be used to re-claim build requests. All given ID's must be unclaimed. Use reclaimBuildRequests to reclaim.

Note

On database backends that do not enforce referential integrity (e.g., SQLite), this method will not prevent claims for nonexistent build requests. On database backends that do not support transactions (MySQL), this method will not properly roll back any partial claims made before an AlreadyClaimedError is generated.

reclaimBuildRequests(brids)
Parameters:brids (list) -- ids of buildrequests to reclaim
Returns:Deferred
Raises:AlreadyClaimedError

Re-claim the given build requests, updating the timestamp, but checking that the requests are owned by this master. The resulting deferred will fire normally on success, or fail with AlreadyClaimedError if any of the build requests are already claimed by another master instance, or don't exist. In this case, none of the reclaims will take effect.

unclaimBuildRequests(brids)
Parameters:brids (list) -- ids of buildrequests to unclaim
Returns:Deferred

Release this master's claim on all of the given build requests. This will not unclaim requests that are claimed by another master, but will not fail in this case. The method does not check whether a request is completed.

completeBuildRequests(brids, results[, complete_at=XX])
Parameters:
  • brids (integer) -- build request IDs to complete
  • results (integer) -- integer result code
  • complete_at (datetime) -- time at which the buildset was completed
Returns:

Deferred

Raises:

NotClaimedError

Complete a set of build requests, all of which are owned by this master instance. This will fail with NotClaimedError if the build request is already completed or does not exist. If complete_at is not given, the current time will be used.

unclaimExpiredRequests(old)
Parameters:old (int) -- number of seconds after which a claim is considered old
Returns:Deferred

Find any incomplete claimed builds which are older than old seconds, and clear their claim information.

This is intended to catch builds that were claimed by a master which has since disappeared. As a side effect, it will log a message if any requests are unclaimed.

builds
class buildbot.db.builds.BuildsConnectorComponent

This class handles a little bit of information about builds.

Note

The interface for this class will change - the builds table duplicates some information available in pickles, without including all such information. Do not depend on this API.

An instance of this class is available at master.db.builds.

Builds are indexed by bid and their contents represented as bdicts (build dictionaries), with keys

  • bid (the build ID, globally unique)
  • number (the build number, unique only within this master and builder)
  • brid (the ID of the build request that caused this build)
  • start_time
  • finish_time (datetime objects, or None).
getBuild(bid)
Parameters:bid (integer) -- build id
Returns:Build dictionary as above or None, via Deferred

Get a single build, in the format described above. Returns None if there is no such build.

getBuildsForRequest(brid)
Parameters:brids -- list of build request ids
Returns:List of build dictionaries as above, via Deferred

Get a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for getBuild.

addBuild(brid, number)
Parameters:
  • brid -- build request id
  • number -- build number
Returns:

build ID via Deferred

Add a new build to the db, recorded as having started at the current time.

finishBuilds(bids)
Parameters:bids (list) -- build ids
Returns:Deferred

Mark the given builds as finished, with finish_time set to the current time. This is done unconditionally, even if the builds are already finished.

buildsets
class buildbot.db.buildsets.BuildsetsConnectorComponent

This class handles getting buildsets into and out of the database. Buildsets combine multiple build requests that were triggered together.

An instance of this class is available at master.db.buildsets.

Buildsets are indexed by bsid and their contents represented as bsdicts (buildset dictionaries), with keys

  • bsid
  • external_idstring (arbitrary string for mapping builds externally)
  • reason (string; reason these builds were triggered)
  • sourcestampsetid (source stamp set for this buildset)
  • submitted_at (datetime object; time this buildset was created)
  • complete (boolean; true if all of the builds for this buildset are complete)
  • complete_at (datetime object; time this buildset was completed)
  • results (aggregate result of this buildset; see Build Result Codes)
addBuildset(sourcestampsetid, reason, properties, builderNames, external_idstring=None)
Parameters:
  • sourcestampsetid (integer) -- id of the SourceStampSet for this buildset
  • reason (short unicode string) -- reason for this buildset
  • properties (dictionary, where values are tuples of (value, source)) -- properties for this buildset
  • builderNames (list of strings) -- builders specified by this buildset
  • external_idstring (unicode string) -- external key to identify this buildset; defaults to None
Returns:

buildset ID and buildrequest IDs, via a Deferred

Add a new Buildset to the database, along with BuildRequests for each named builder, returning the resulting bsid via a Deferred. Arguments should be specified by keyword.

The return value is a tuple (bsid, brids) where bsid is the inserted buildset ID and brids is a dictionary mapping buildernames to build request IDs.

completeBuildset(bsid, results[, complete_at=XX])
Parameters:
  • bsid (integer) -- buildset ID to complete
  • results (integer) -- integer result code
  • complete_at (datetime) -- time the buildset was completed
Returns:

Deferred

Raises:

KeyError if the buildset does not exist or is already complete

Complete a buildset, marking it with the given results and setting its completed_at to the current time, if the complete_at argument is omitted.

getBuildset(bsid)
Parameters:bsid -- buildset ID
Returns:bsdict, or None, via Deferred

Get a bsdict representing the given buildset, or None if no such buildset exists.

Note that buildsets are not cached, as the values in the database are not fixed.

getBuildsets(complete=None)
Parameters:complete -- if true, return only complete buildsets; if false, return only incomplete buildsets; if None or omitted, return all buildsets
Returns:list of bsdicts, via Deferred

Get a list of bsdicts matching the given criteria.

getRecentBuildsets(count, branch=None, repository=None,
complete=None):
Parameters:
  • count -- maximum number of buildsets to retrieve.
  • branch (string) -- optional branch name. If specified, only buildsets affecting such branch will be returned.
  • repository (string) -- optional repository name. If specified, only buildsets affecting such repository will be returned.
  • complete (Boolean) -- if true, return only complete buildsets; if false, return only incomplete buildsets; if None or omitted, return all buildsets
Returns:

list of bsdicts, via Deferred

getBuildsetProperties(buildsetid)
Parameters:buildsetid -- buildset ID
Returns:dictionary mapping property name to value, source, via Deferred

Return the properties for a buildset, in the same format they were given to addBuildset.

Note that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns {} in either case.

buildslaves
class buildbot.db.buildslaves.BuildslavesConnectorComponent

This class handles Buildbot's notion of buildslaves. The buildslave information is returned as a dictionary:

  • slaveid
  • name (the name of the buildslave)
  • slaveinfo (buildslave information as dictionary)

The 'slaveinfo' dictionary has the following keys:

  • admin (the admin information)
  • host (the name of the host)
  • access_uri (the access URI)
  • version (the version on the buildslave)
getBuildslaves()
Returns:list of partial information via Deferred

Get the entire list of buildslaves. Only id and name are returned.

getBuildslaveByName(name)
Parameters:name (string) -- the name of the buildslave to retrieve
Returns:info dictionary or None, via deferred

Looks up the buildslave with the name, returning the information or None if no matching buildslave is found.

updateBuildslave(name, slaveinfo)
Parameters:
  • name (string) -- the name of the buildslave to update
  • slaveinfo (dict) -- the full buildslave dictionary
Returns:

Deferred

Update information about the given buildslave.

changes
class buildbot.db.changes.ChangesConnectorComponent

This class handles changes in the buildbot database, including pulling information from the changes sub-tables.

An instance of this class is available at master.db.changes.

Changes are indexed by changeid, and are represented by a chdict, which has the following keys:

  • changeid (the ID of this change)
  • author (unicode; the author of the change)
  • files (list of unicode; source-code filenames changed)
  • comments (unicode; user comments)
  • is_dir (deprecated)
  • links (list of unicode; links for this change, e.g., to web views, review)
  • revision (unicode string; revision for this change, or None if unknown)
  • when_timestamp (datetime instance; time of the change)
  • branch (unicode string; branch on which the change took place, or None for the "default branch", whatever that might mean)
  • category (unicode string; user-defined category of this change, or None)
  • revlink (unicode string; link to a web view of this change)
  • properties (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))
  • repository (unicode string; repository where this change occurred)
  • project (unicode string; user-defined project to which this change corresponds)
addChange(author=None, files=None, comments=None, is_dir=0, links=None, revision=None, when_timestamp=None, branch=None, category=None, revlink='', properties={}, repository='', project='', uid=None)
Parameters:
  • author (unicode string) -- the author of this change
  • files -- a list of filenames that were changed
  • comments -- user comments on the change
  • is_dir -- deprecated
  • links (list of unicode strings) -- a list of links related to this change, e.g., to web viewers or review pages
  • revision (unicode string) -- the revision identifier for this change
  • when_timestamp (datetime instance or None) -- when this change occurred, or the current time if None
  • branch (unicode string) -- the branch on which this change took place
  • category (unicode string) -- category for this change (arbitrary use by Buildbot users)
  • revlink (unicode string) -- link to a web view of this revision
  • properties (dictionary) -- properties to set on this change, where values are tuples of (value, source). At the moment, the source must be 'Change', although this may be relaxed in later versions.
  • repository (unicode string) -- the repository in which this change took place
  • project (unicode string) -- the project this change is a part of
  • uid (integer) -- uid generated for the change author
Returns:

new change's ID via Deferred

Add a Change with the given attributes to the database, returning the changeid via a Deferred. All arguments should be given as keyword arguments.

The project and repository arguments must be strings; None is not allowed.

getChange(changeid, no_cache=False)
Parameters:
  • changeid -- the id of the change instance to fetch
  • no_cache (boolean) -- bypass cache and always fetch from database
Returns:

chdict via Deferred

Get a change dictionary for the given changeid, or None if no such change exists.

getChangeUids(changeid)
Parameters:changeid -- the id of the change instance to fetch
Returns:list of uids via Deferred

Get the userids associated with the given changeid.

getRecentChanges(count)
Parameters:count -- maximum number of instances to return
Returns:list of dictionaries via Deferred, ordered by changeid

Get a list of the count most recent changes, represented as dictionaries; returns fewer if that many do not exist.

Note

For this function, "recent" is determined by the order of the changeids, not by when_timestamp. This is most apparent in DVCS's, where the timestamp of a change may be significantly earlier than the time at which it is merged into a repository monitored by Buildbot.

getLatestChangeid()
Returns:changeid via Deferred

Get the most-recently-assigned changeid, or None if there are no changes at all.

schedulers
class buildbot.db.schedulers.SchedulersConnectorComponent

This class manages the state of the Buildbot schedulers. This state includes classifications of as-yet un-built changes.

An instance of this class is available at master.db.changes.

Schedulers are identified by a their objectid - see StateConnectorComponent.

classifyChanges(objectid, classifications)
Parameters:
  • objectid -- scheduler classifying the changes
  • classifications (dictionary) -- mapping of changeid to boolean, where the boolean is true if the change is important, and false if it is unimportant
Returns:

Deferred

Record the given classifications. This method allows a scheduler to record which changes were important and which were not immediately, even if the build based on those changes will not occur for some time (e.g., a tree stable timer). Schedulers should be careful to flush classifications once they are no longer needed, using flushChangeClassifications.

getChangeClassifications(objectid[, branch])
Parameters:
  • objectid (integer) -- scheduler to look up changes for
  • branch (string or None (for default branch)) -- (optional) limit to changes with this branch
Returns:

dictionary via Deferred

Return the classifications made by this scheduler, in the form of a dictionary mapping changeid to a boolean, just as supplied to classifyChanges.

If branch is specified, then only changes on that branch will be given. Note that specifying branch=None requests changes for the default branch, and is not the same as omitting the branch argument altogether.

sourcestamps
class buildbot.db.sourcestamps.SourceStampsConnectorComponent

This class manages source stamps, as stored in the database. Source stamps are linked to changes. Source stamps with the same sourcestampsetid belong to the same sourcestampset. Buildsets link to one or more source stamps via a sourcestampset id.

An instance of this class is available at master.db.sourcestamps.

Source stamps are identified by a ssid, and represented internally as a ssdict, with keys

  • ssid
  • sourcestampsetid (set to which the sourcestamp belongs)
  • branch (branch, or None for default branch)
  • revision (revision, or None to indicate the latest revision, in which case this is a relative source stamp)
  • patch_body (body of the patch, or None)
  • patch_level (directory stripping level of the patch, or None)
  • patch_subdir (subdirectory in which to apply the patch, or None)
  • patch_author (author of the patch, or None)
  • patch_comment (comment for the patch, or None)
  • repository (repository containing the source; never None)
  • project (project this source is for; never None)
  • changeids (list of changes, by id, that generated this sourcestamp)

Note

Presently, no attempt is made to ensure uniqueness of source stamps, so multiple ssids may correspond to the same source stamp. This may be fixed in a future version.

addSourceStamp(branch, revision, repository, project, patch_body=None, patch_level=0, patch_author="", patch_comment="", patch_subdir=None, changeids=[])
Parameters:
  • branch (unicode string) --
  • revision (unicode string) --
  • repository (unicode string) --
  • project (string) --
  • patch_body (string) -- (optional)
  • patch_level (int) -- (optional)
  • patch_author (unicode string) -- (optional)
  • patch_comment (unicode string) -- (optional)
  • patch_subdir (unicode string) -- (optional)
  • changeids (list of ints) --
Returns:

ssid, via Deferred

Create a new SourceStamp instance with the given attributes, and return its ssid. The arguments all have the same meaning as in an ssdict. Pass them as keyword arguments to allow for future expansion.

getSourceStamp(ssid)
Parameters:
  • ssid -- sourcestamp to get
  • no_cache (boolean) -- bypass cache and always fetch from database
Returns:

ssdict, or None, via Deferred

Get an ssdict representing the given source stamp, or None if no such source stamp exists.

getSourceStamps(sourcestampsetid)
Parameters:sourcestampsetid (integer) -- identification of the set, all returned sourcestamps belong to this set
Returns:sslist of ssdict

Get a set of sourcestamps identified by a set id. The set is returned as a sslist that contains one or more sourcestamps (represented as ssdicts). The list is empty if the set does not exist or no sourcestamps belong to the set.

sourcestampset
class buildbot.db.sourcestampsets.SourceStampSetsConnectorComponent

This class is responsible for adding new sourcestampsets to the database. Build sets link to sourcestamp sets, via their (set) id's.

An instance of this class is available at master.db.sourcestampsets.

Sourcestamp sets are identified by a sourcestampsetid.

addSourceStampSet()
Returns:new sourcestampsetid as integer, via Deferred

Add a new (empty) sourcestampset to the database. The unique identification of the set is returned as integer. The new id can be used to add new sourcestamps to the database and as reference in a buildset.

state
class buildbot.db.state.StateConnectorComponent

This class handles maintaining arbitrary key/value state for Buildbot objects. Each object can store arbitrary key/value pairs, where the values are any JSON-encodable value. Each pair can be set and retrieved atomically.

Objects are identified by their (user-visible) name and their class. This allows, for example, a nightly_smoketest object of class NightlyScheduler to maintain its state even if it moves between masters, but avoids cross-contaminating state between different classes of objects with the same name.

Note that "class" is not interpreted literally, and can be any string that will uniquely identify the class for the object; if classes are renamed, they can continue to use the old names.

An instance of this class is available at master.db.state.

Objects are identified by objectid.

getObjectId(name, class_name)
Parameters:
  • name -- name of the object
  • class_name -- object class name
Returns:

the objectid, via a Deferred.

Get the object ID for this combination of a name and a class. This will add a row to the 'objects' table if none exists already.

getState(objectid, name[, default])
Parameters:
  • objectid -- objectid on which the state should be checked
  • name -- name of the value to retrieve
  • default -- (optional) value to return if C{name} is not present
Returns:

state value via a Deferred

Raises KeyError:
 

if name is not present and no default is given

Raises:

TypeError if JSON parsing fails

Get the state value for key name for the object with id objectid.

setState(objectid, name, value)
Parameters:
  • objectid -- the objectid for which the state should be changed
  • name -- the name of the value to change
  • value (JSON-able value) -- the value to set
  • returns -- Deferred
Raises:

TypeError if JSONification fails

Set the state value for name for the object with id objectid, overwriting any existing value.

users
class buildbot.db.users.UsersConnectorComponent

This class handles Buildbot's notion of users. Buildbot tracks the usual information about users -- username and password, plus a display name.

The more complicated task is to recognize each user across multiple interfaces with Buildbot. For example, a user may be identified as 'djmitche' in Subversion, 'dustin@v.igoro.us' in Git, and 'dustin' on IRC. To support this functionality, each user as a set of attributes, keyed by type. The findUserByAttr method uses these attributes to match users, adding a new user if no matching user is found.

Users are identified canonically by uid, and are represented by usdicts (user dictionaries) with keys

  • uid
  • identifier (display name for the user)
  • bb_username (buildbot login username)
  • bb_password (hashed login password)

All attributes are also included in the dictionary, keyed by type. Types colliding with the keys above are ignored.

findUserByAttr(identifier, attr_type, attr_data)
Parameters:
  • identifier -- identifier to use for a new user
  • attr_type -- attribute type to search for and/or add
  • attr_data -- attribute data to add
Returns:

userid via Deferred

Get an existing user, or add a new one, based on the given attribute.

This method is intended for use by other components of Buildbot to search for a user with the given attributes.

Note that identifier is not used in the search for an existing user. It is only used when creating a new user. The identifier should be based deterministically on the attributes supplied, in some fashion that will seem natural to users.

For future compatibility, always use keyword parameters to call this method.

getUser(uid)
Parameters:
  • uid -- user id to look up
  • no_cache (boolean) -- bypass cache and always fetch from database
Returns:

usdict via Deferred

Get a usdict for the given user, or None if no matching user is found.

getUserByUsername(username)
Parameters:username (string) -- username portion of user credentials
Returns:usdict or None via deferred

Looks up the user with the bb_username, returning the usdict or None if no matching user is found.

getUsers()
Returns:list of partial usdicts via Deferred

Get the entire list of users. User attributes are not included, so the results are not full userdicts.

updateUser(uid=None, identifier=None, bb_username=None, bb_password=None, attr_type=None, attr_data=None)
Parameters:
  • uid (int) -- the user to change
  • identifier (string) -- (optional) new identifier for this user
  • bb_username (string) -- (optional) new buildbot username
  • bb_password (string) -- (optional) new hashed buildbot password
  • attr_type (string) -- (optional) attribute type to update
  • attr_data (string) -- (optional) value for attr_type
Returns:

Deferred

Update information about the given user. Only the specified attributes are updated. If no user with the given uid exists, the method will return silently.

Note that bb_password must be given if bb_username appears; similarly, attr_type requires attr_data.

removeUser(uid)
Parameters:uid (int) -- the user to remove
Returns:Deferred

Remove the user with the given uid from the database. This will remove the user from any associated tables as well.

identifierToUid(identifier)
Parameters:identifier (string) -- identifier to search for
Returns:uid or None, via Deferred

Fetch a uid for the given identifier, if one exists.

Writing Database Connector Methods

The information above is intended for developers working on the rest of Buildbot, and treating the database layer as an abstraction. The remainder of this section describes the internals of the database implementation, and is intended for developers modifying the schema or adding new methods to the database layer.

Warning

It's difficult to change the database schema significantly after it has been released, and very disruptive to users to change the database API. Consider very carefully the future-proofing of any changes here!

The DB Connector and Components
class buildbot.db.connector.DBConnector

The root of the database connectors, master.db, is a DBConnector instance. Its main purpose is to hold reference to each of the connector components, but it also handles timed cleanup tasks.

If you are adding a new connector component, import its module and create an instance of it in this class's constructor.

class buildbot.db.base.DBConnectorComponent

This is the base class for connector components.

There should be no need to override the constructor defined by this base class.

db

A reference to the DBConnector, so that connector components can use e.g., self.db.pool or self.db.model. In the unusual case that a connector component needs access to the master, the easiest path is self.db.master.

Direct Database Access

The connectors all use SQLAlchemy Core as a wrapper around database client drivers. Unfortunately, SQLAlchemy is a synchronous library, so some extra work is required to use it in an asynchronous context like Buildbot. This is accomplished by deferring all database operations to threads, and returning a Deferred. The Pool class takes care of the details.

A connector method should look like this:

def myMethod(self, arg1, arg2):
    def thd(conn):
        q = ... # construct a query
        for row in conn.execute(q):
            ... # do something with the results
        return ... # return an interesting value
    return self.db.pool.do(thd)

Picking that apart, the body of the method defines a function named thd taking one argument, a Connection object. It then calls self.db.pool.do, passing the thd function. This function is called in a thread, and can make blocking calls to SQLAlchemy as desired. The do method will return a Deferred that will fire with the return value of thd, or with a failure representing any exceptions raised by thd.

The return value of thd must not be an SQLAlchemy object - in particular, any ResultProxy objects must be parsed into lists or other data structures before they are returned.

Warning

As the name thd indicates, the function runs in a thread. It should not interact with any other part of Buildbot, nor with any of the Twisted components that expect to be accessed from the main thread -- the reactor, Deferreds, etc.

Queries can be constructed using any of the SQLAlchemy core methods, using tables from Model, and executed with the connection object, conn.

class buildbot.db.pool.DBThreadPool
do(callable, ...)
Returns:Deferred

Call callable in a thread, with a Connection object as first argument. Returns a deferred that will fire with the results of the callable, or with a failure representing any exception raised during its execution.

Any additional positional or keyword arguments are passed to callable.

do_with_engine(callable, ...)
Returns:Deferred

Similar to do, call callable in a thread, but with an Engine object as first argument.

This method is only used for schema manipulation, and should not be used in a running master.

Database Schema

Database connector methods access the database through SQLAlchemy, which requires access to Python objects representing the database tables. That is handled through the model.

class buildbot.db.model.Model

This class contains the canonical description of the buildbot schema, It is presented in the form of SQLAlchemy Table instances, as class variables. At runtime, the model is available at master.db.model, so for example the buildrequests table can be referred to as master.db.model.buildrequests, and columns are available in its c attribute.

The source file, master/buildbot/db/model.py, contains comments describing each table; that information is not replicated in this documentation.

Note that the model is not used for new installations or upgrades of the Buildbot database. See Modifying the Database Schema for more information.

metadata

The model object also has a metadata attribute containing a MetaData instance. Connector methods should not need to access this object. The metadata is not bound to an engine.

The Model class also defines some migration-related methods:

is_current()
Returns:boolean via Deferred

Returns true if the current database's version is current.

upgrade()
Returns:Deferred

Upgrades the database to the most recent schema version.

Caching

Connector component methods that get an object based on an ID are good candidates for caching. The cached decorator makes this automatic:

buildbot.db.base.cached(cachename)
Parameters:cache_name -- name of the cache to use

A decorator for "getter" functions that fetch an object from the database based on a single key. The wrapped method will only be called if the named cache does not contain the key.

The wrapped function must take one argument (the key); the wrapper will take a key plus an optional no_cache argument which, if true, will cause it to invoke the underlying method even if the key is in the cache.

The resulting method will have a cache attribute which can be used to access the underlying cache.

In most cases, getter methods return a well-defined dictionary. Unfortunately, Python does not handle weak references to bare dictionaries, so components must instantiate a subclass of dict. The whole assembly looks something like this:

class ThDict(dict):
    pass

class ThingConnectorComponent(base.DBConnectorComponent):

    @base.cached('thdicts')
    def getThing(self, thid):
        def thd(conn):
            ...
            thdict = ThDict(thid=thid, attr=row.attr, ...)
            return thdict
        return self.db.pool.do(thd)
Tests

It goes without saying that any new connector methods must be fully tested!

You will also want to add an in-memory implementation of the methods to the fake classes in master/buildbot/test/fake/fakedb.py. Non-DB Buildbot code is tested using these fake implementations in order to isolate that code from the database code.

Modifying the Database Schema

Changes to the schema are accomplished through migration scripts, supported by SQLAlchemy-Migrate. In fact, even new databases are created with the migration scripts -- a new database is a migrated version of an empty database.

The schema is tracked by a version number, stored in the migrate_version table. This number is incremented for each change to the schema, and used to determine whether the database must be upgraded. The master will refuse to run with an out-of-date database.

To make a change to the schema, first consider how to handle any existing data. When adding new columns, this may not be necessary, but table refactorings can be complex and require caution so as not to lose information.

Create a new script in master/buildbot/db/migrate/versions, following the numbering scheme already present. The script should have an update method, which takes an engine as a parameter, and upgrades the database, both changing the schema and performing any required data migrations. The engine passed to this parameter is "enhanced" by SQLAlchemy-Migrate, with methods to handle adding, altering, and dropping columns. See the SQLAlchemy-Migrate documentation for details.

Next, modify master/buildbot/db/model.py to represent the updated schema. Buildbot's automated tests perform a rudimentary comparison of an upgraded database with the model, but it is important to check the details - key length, nullability, and so on can sometimes be missed by the checks. If the schema and the upgrade scripts get out of sync, bizarre behavior can result.

Also, adjust the fake database table definitions in master/buildbot/test/fake/fakedb.py according to your changes.

Your upgrade script should have unit tests. The classes in master/buildbot/test/util/migration.py make this straightforward. Unit test scripts should be named e.g., test_db_migrate_versions_015_remove_bad_master_objectid.py.

The master/buildbot/test/integration/test_upgrade.py also tests upgrades, and will confirm that the resulting database matches the model. If you encounter implicit indexes on MySQL, that do not appear on SQLite or Postgres, add them to implied_indexes in master/buidlbot/db/model.py.

Database Compatibility Notes

Or: "If you thought any database worked right, think again"

Because Buildbot works over a wide range of databases, it is generally limited to database features present in all supported backends. This section highlights a few things to watch out for.

In general, Buildbot should be functional on all supported database backends. If use of a backend adds minor usage restrictions, or cannot implement some kinds of error checking, that is acceptable if the restrictions are well-documented in the manual.

The metabuildbot tests Buildbot against all supported databases, so most compatibility errors will be caught before a release.

Index Length in MySQL

MySQL only supports about 330-character indexes. The actual index length is 1000 bytes, but MySQL uses 3-byte encoding for UTF8 strings. This is a longstanding bug in MySQL - see "Specified key was too long; max key length is 1000 bytes" with utf8. While this makes sense for indexes used for record lookup, it limits the ability to use unique indexes to prevent duplicate rows.

InnoDB has even more severe restrictions on key lengths, which is why the MySQL implementation requires a MyISAM storage engine.

Transactions in MySQL

Unfortunately, use of the MyISAM storage engine precludes real transactions in MySQL. transaction.commit() and transaction.rollback() are essentially no-ops: modifications to data in the database are visible to other users immediately, and are not reverted in a rollback.

Referential Integrity in SQLite and MySQL

Neither MySQL nor SQLite enforce referential integrity based on foreign keys. Postgres does enforce, however. If possible, test your changes on Postgres before committing, to check that tables are added and removed in the proper order.

Subqueries in MySQL

MySQL's query planner is easily confused by subqueries. For example, a DELETE query specifying id's that are IN a subquery will not work. The workaround is to run the subquery directly, and then execute a DELETE query for each returned id.

If this weakness has a significant performance impact, it would be acceptable to conditionalize use of the subquery on the database dialect.

Build Result Codes

Buildbot represents the status of a step, build, or buildset using a set of numeric constants. From Python, these constants are available in the module buildbot.status.results, but the values also appear in the database and in external tools, so the values are fixed.

buildbot.status.results.SUCCESS

Value: 0; color: green; a successful run.

buildbot.status.results.WARNINGS

Value: 1; color: orange; a successful run, with some warnings.

buildbot.status.results.FAILURE

Value: 2; color: red; a failed run, due to problems in the build itself, as opposed to a Buildbot misconfiguration or bug.

buildbot.status.results.SKIPPED

Value: 3; color: white; a run that was skipped -- usually a step skipped by doStepIf (see Common Parameters)

buildbot.status.results.EXCEPTION

Value: 4; color: purple; a run that failed due to a problem in Buildbot itself.

buildbot.status.results.RETRY

Value: 4; color: purple; a run that should be retried, usually due to a slave disconnection.

buildbot.status.results.Results

A dictionary mapping result codes to their lowercase names.

buildbot.status.results.worst_status(a, b)

This function takes two status values, and returns the "worst" status of the two. This is used (with exceptions) to aggregate step statuses into build statuses, and build statuses into buildset statuses.

File Formats

Log File Format

class buildbot.status.logfile.LogFile

The master currently stores each logfile in a single file, which may have a standard compression applied.

The format is a special case of the netstrings protocol - see http://cr.yp.to/proto/netstrings.txt. The text in each netstring consists of a one-digit channel identifier followed by the data from that channel.

The formatting is implemented in the LogFile class in buildbot/status/logfile.py, and in particular by the merge method.

Web Status

Jinja Web Templates

Buildbot uses Jinja2 to render its web interface. The authoritative source for this templating engine is its own documentation, of course, but a few notes are in order for those who are making only minor modifications.

Whitespace

Jinja directives are enclosed in {% .. %}, and sometimes also have dashes. These dashes strip whitespace in the output. For example:

{% for entry in entries %}
  <li>{{ entry }}</li>
{% endfor %}

will produce output with too much whitespace:

<li>pigs</li>


<li>cows</li>

But adding the dashes will collapse that whitespace completely:

{% for entry in entries -%}
  <li>{{ entry }}</li>
{%- endfor %}

yields

<li>pigs</li><li>cows</li>

Web Authorization Framework

Whenever any part of the web framework wants to perform some action on the buildmaster, it should check the user's authorization first.

Always check authorization twice: once to decide whether to show the option to the user (link, button, form, whatever); and once before actually performing the action.

To check whether to display the option, you'll usually want to pass an authz object to the Jinja template in your HtmlResource subclass:

def content(self, req, cxt):
    # ...
    cxt['authz'] = self.getAuthz(req)
    template = ...
    return template.render(**cxt)

and then determine whether to advertise the action in the template:

{{ if authz.advertiseAction('myNewTrick') }}
  <form action="{{ myNewTrick_url }}"> ...
{{ endif }}

Actions can optionally require authentication, so use needAuthForm to determine whether to require a 'username' and 'passwd' field in the generated form. These fields are usually generated by authFormIfNeeded:

{{ authFormIfNeeded(authz, 'myNewTrick') }}

Once the POST request comes in, it's time to check authorization again. This usually looks something like

res = yield self.getAuthz(req).actionAllowed('myNewTrick', req, someExtraArg)
if not res:
    defer.returnValue(Redirect(path_to_authfail(req)))
    return

The someExtraArg is optional (it's handled with *args, so you can have several if you want), and is given to the user's authorization function. For example, a build-related action should pass the build status, so that the user's authorization function could ensure that devs can only operate on their own builds.

Note that actionAllowed returns a Deferred instance, so you must wait for the Deferred and yield the Redirect instead of returning it.

The available actions are described in WebStatus.

Master-Slave API

This section describes the master-slave interface.

Connection

The interface is based on Twisted's Perspective Broker, which operates over TCP connections.

The slave connects to the master, using the parameters supplied to buildslave create-slave. It uses a reconnecting process with an exponential backoff, and will automatically reconnect on disconnection.

Once connected, the slave authenticates with the Twisted Cred (newcred) mechanism, using the username and password supplied to buildslave create-slave. The mind is the slave bot instance (class buildslave.bot.Bot).

On the master side, the realm is implemented by buildbot.master.Dispatcher, which examines the username of incoming avatar requests. There are special cases for change, debug, and statusClient, which are not discussed here. For all other usernames, the botmaster is consulted, and if a slave with that name is configured, its buildbot.buildslave.BuildSlave instance is returned as the perspective.

Build Slaves

At this point, the master-side BuildSlave object has a pointer to the remote, slave-side Bot object in its self.slave, and the slave-side Bot object has a reference to the master-side BuildSlave object in its self.perspective.

Bot methods

The slave-side Bot object has the following remote methods:

remote_getCommands
Returns a list of (name, version) for all commands the slave recognizes
remote_setBuilderList

Given a list of builders and their build directories, ensures that those builders, and only those builders, are running. This can be called after the initial connection is established, with a new list, to add or remove builders.

This method returns a dictionary of SlaveBuilder objects - see below

remote_print
Adds a message to the slave logfile
remote_getSlaveInfo

Returns the contents of the slave's info/ directory. This also contains the keys

environ
copy of the slaves environment
system
OS the slave is running (extracted from Python's os.name)
basedir
base directory where slave is running
remote_getVersion
Returns the slave's version
BuildSlave methods

The master-side object has the following method:

perspective_keepalive
Does nothing - used to keep traffic flowing over the TCP connection

Setup

After the initial connection and trading of a mind (Bot) for an avatar (BuildSlave), the master calls the Bot's setBuilderList method to set up the proper slave builders on the slave side. This method returns a reference to each of the new slave-side SlaveBuilder objects, described below. Each of these is handed to the corresponding master-side SlaveBuilder object.

This immediately calls the remote setMaster method, then the print method.

Pinging

To ping a remote SlaveBuilder, the master calls its print method.

Building

When a build starts, the master calls the slave's startBuild method. Each BuildStep instance will subsequently call the startCommand method, passing a reference to itself as the stepRef parameter. The startCommand method returns immediately, and the end of the command is signalled with a call to a method on the master-side BuildStep object.

Slave Builders

Each build slave has a set of builders which can run on it. These are represented by distinct classes on the master and slave, just like the BuildSlave and Bot objects described above.

On the slave side, builders are represented as instances of the buildslave.bot.SlaveBuilder class. On the master side, they are represented by the buildbot.process.slavebuilder.SlaveBuilder class. The identical names are a source of confusion. The following will refer to these as the slave-side and master-side SlaveBuilder classes. Each object keeps a reference to its opposite in self.remote.

Slave-Side SlaveBuilder Methods
remote_setMaster
Provides a reference to the master-side SlaveBuilder
remote_print
Adds a message to the slave logfile; used to check round-trip connectivity
remote_startBuild
Indicates that a build is about to start, and that any subsequent commands are part of that build
remote_startCommand
Invokes a command on the slave side
remote_interruptCommand
Interrupts the currently-running command
remote_shutdown
Shuts down the slave cleanly
Master-side SlaveBuilder Methods

The master side does not have any remotely-callable methods.

Commands

Actual work done by the slave is represented on the master side by a buildbot.process.buildstep.RemoteCommand instance.

The command instance keeps a reference to the slave-side buildslave.bot.SlaveBuilder, and calls methods like remote_startCommand to start new commands. Once that method is called, the SlaveBuilder instance keeps a reference to the command, and calls the following methods on it:

Master-Side RemoteCommand Methods
remote_update
Update information about the running command. See below for the format.
remote_complete
Signal that the command is complete, either successfully or with a Twisted failure.

Updates

Updates from the slave, sent via remote_update, are a list of individual update elements. Each update element is, in turn, a list of the form [data, 0] where the 0 is present for historical reasons. The data is a dictionary, with keys describing the contents. The updates are handled by remoteUpdate.

Updates with different keys can be combined into a single dictionary or delivered sequentially as list elements, at the slave's option.

To summarize, an updates parameter to remote_update might look like this:

[
    [ { 'header' : 'running command..' }, 0 ],
    [ { 'stdout' : 'abcd', 'stderr' : 'local modifications' }, 0 ],
    [ { 'log' : ( 'cmd.log', 'cmd invoked at 12:33 pm\n' ) }, 0 ],
    [ { 'rc' : 0 }, 0 ],
]
Defined Commands

The following commands are defined on the slaves.

shell

Runs a shell command on the slave. This command takes the following arguments:

command

The command to run. If this is a string, will be passed to the system shell as a string. Otherwise, it must be a list, which will be executed directly.

workdir

Directory in which to run the command, relative to the builder dir.

env

A dictionary of environment variables to augment or replace the existing environment on the slave. In this dictionary, PYTHONPATH is treated specially: it should be a list of path components, rather than a string, and will be prepended to the existing Python path.

initial_stdin

A string which will be written to the command's standard input before it is closed.

want_stdout

If false, then no updates will be sent for stdout.

want_stderr

If false, then no updates will be sent for stderr.

usePTY

If true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's buildbot.tac.

not_really

If true, skip execution and return an update with rc=0.

timeout

Maximum time without output before the command is killed.

maxTime

Maximum overall time from the start before the command is killed.

logfiles

A dictionary specifying logfiles other than stdio. Keys are the logfile names, and values give the workdir-relative filename of the logfile. Alternately, a value can be a dictionary; in this case, the dictionary must have a filename key specifying the filename, and can also have the following keys:

follow

Only follow the file from its current end-of-file, rather that starting from the beginning.

logEnviron

If false, the command's environment will not be logged.

The shell command sends the following updates:

stdout
The data is a bytestring which represents a continuation of the stdout stream. Note that the bytestring boundaries are not necessarily aligned with newlines.
stderr
Similar to stdout, but for the error stream.
header
Similar to stdout, but containing data for a stream of buildbot-specific metadata.
rc
The exit status of the command, where -- in keeping with UNIX tradition -- 0 indicates success and any nonzero value is considered a failure. No further updates should be sent after an rc.
log
This update contains data for a logfile other than stdio. The data associated with the update is a tuple of the log name and the data for that log. Note that non-stdio logs do not distinguish output, error, and header streams.
uploadFile

Upload a file from the slave to the master. The arguments are

workdir

The base directory for the filename, relative to the builder's basedir.

slavesrc

Name of the filename to read from., relative to the workdir.

writer

A remote reference to a writer object, described below.

maxsize

Maximum size, in bytes, of the file to write. The operation will fail if the file exceeds this size.

blocksize

The block size with which to transfer the file.

keepstamp

If true, preserve the file modified and accessed times.

The slave calls a few remote methods on the writer object. First, the write method is called with a bytestring containing data, until all of the data has been transmitted. Then, the slave calls the writer's close, followed (if keepstamp is true) by a call to upload(atime, mtime).

This command sends rc and stderr updates, as defined for the shell command.

uploadDirectory

Similar to uploadFile, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:

workdir slavesrc writer maxsize blocksize

See uploadFile

compress

Compression algorithm to use -- one of None, 'bz2', or 'gz'.

The writer object is treated similarly to the uploadFile command, but after the file is closed, the slave calls the master's unpack method with no arguments to extract the tarball.

This command sends rc and stderr updates, as defined for the shell command.

downloadFile

This command will download a file from the master to the slave. It takes the following arguments:

workdir

Base directory for the destination filename, relative to the builder basedir.

slavedest

Filename to write to, relative to the workdir.

reader

A remote reference to a reader object, described below.

maxsize

Maximum size of the file.

blocksize

The block size with which to transfer the file.

mode

Access mode for the new file.

The reader object's read(maxsize) method will be called with a maximum size, which will return no more than that number of bytes as a bytestring. At EOF, it will return an empty string. Once EOF is received, the slave will call the remote close method.

This command sends rc and stderr updates, as defined for the shell command.

mkdir

This command will create a directory on the slave. It will also create any intervening directories required. It takes the following argument:

dir

Directory to create.

The mkdir command produces the same updates as shell.

rmdir

This command will remove a directory or file on the slave. It takes the following arguments:

dir

Directory to remove.

timeout maxTime

See shell, above.

The rmdir command produces the same updates as shell.

cpdir

This command will copy a directory from place to place on the slave. It takes the following arguments:

fromdir

Source directory for the copy operation, relative to the builder's basedir.

todir

Destination directory for the copy operation, relative to the builder's basedir.

timeout maxTime

See shell, above.

The cpdir command produces the same updates as shell.

stat

This command returns status information about a file or directory. It takes a single parameter, file, specifying the filename relative to the builder's basedir.

It produces two status updates:

stat

The return value from Python's os.stat.

rc

0 if the file is found, otherwise 1.
glob

This command finds all pathnames matching a specified pattern that uses shell-style wildcards. It takes a single parameter, pathname, specifying the pattern to pass to Python's glob.glob function.

It produces two status updates:

files

The list of matching files returned from glob.glob

rc

0 if the glob.glob does not raise exception, otherwise 1.
listdir

This command reads the directory and returns the list with directory contents. It takes a single parameter, dir, specifying the directory relative to builder's basedir.

It produces two status updates:

files

The list of files in the directory returned from os.listdir

rc

0 if the os.listdir does not raise exception, otherwise 1.
Source Commands

The source commands (bk, cvs, darcs, git, repo, bzr, hg, p4, p4sync, and mtn) are deprecated. See the docstrings in the source code for more information.

String Encodings

Buildbot expects all strings used internally to be valid Unicode strings - not bytestrings.

Note that Buildbot rarely feeds strings back into external tools in such a way that those strings must match. For example, Buildbot does not attempt to access the filenames specified in a Change. So it is more important to store strings in a manner that will be most useful to a human reader (e.g., in logfiles, web status, etc.) than to store them in a lossless format.

Inputs

On input, strings should be decoded, if their encoding is known. Where necessary, the assumed input encoding should be configurable. In some cases, such as filenames, this encoding is not known or not well-defined (e.g., a utf-8 encoded filename in a latin-1 directory). In these cases, the input mechanisms should make a best effort at decoding, and use e.g., the errors='replace' option to fail gracefully on un-decodable characters.

Outputs

At most points where Buildbot outputs a string, the target encoding is known. For example, the web status can encode to utf-8. In cases where it is not known, it should be configurable, with a safe fallback (e.g., ascii with errors='replace'. For HTML/XML outputs, consider using errors='xmlcharrefreplace' instead.

Metrics

New in buildbot 0.8.4 is support for tracking various performance metrics inside the buildbot master process. Currently these are logged periodically according to the log_interval configuration setting of the @ref{Metrics Options} configuration.

If WebStatus is enabled, the metrics data is also available via /json/metrics.

The metrics subsystem is implemented in buildbot.process.metrics. It makes use of twisted's logging system to pass metrics data from all over buildbot's code to a central MetricsLogObserver object, which is available at BuildMaster.metrics or via Status.getMetrics().

Metric Events

MetricEvent objects represent individual items to monitor. There are three sub-classes implemented:

MetricCountEvent

Records incremental increase or decrease of some value, or an absolute measure of some value.

from buildbot.process.metrics import MetricCountEvent

# We got a new widget!
MetricCountEvent.log('num_widgets', 1)

# We have exactly 10 widgets
MetricCountEvent.log('num_widgets', 10, absolute=True)
MetricTimeEvent

Measures how long things take. By default the average of the last 10 times will be reported.

from buildbot.process.metrics import MetricTimeEvent

# function took 0.001s
MetricTimeEvent.log('time_function', 0.001)
MetricAlarmEvent

Indicates the health of various metrics.

from buildbot.process.metrics import MetricAlarmEvent, ALARM_OK

# num_slaves looks ok
MetricAlarmEvent.log('num_slaves', level=ALARM_OK)

Metric Handlers

MetricsHandler objects are responsible for collecting MetricEvents of a specific type and keeping track of their values for future reporting. There are MetricsHandler classes corresponding to each of the MetricEvent types.

Metric Watchers

Watcher objects can be added to MetricsHandlers to be called when metric events of a certain type are received. Watchers are generally used to record alarm events in response to count or time events.

Metric Helpers

countMethod(name)

A function decorator that counts how many times the function is called.

from buildbot.process.metrics import countMethod

@countMethod('foo_called')
def foo():
    return "foo!"
Timer(name)

Timer objects can be used to make timing events easier. When Timer.stop() is called, a MetricTimeEvent is logged with the elapsed time since timer.start() was called.

from buildbot.process.metrics import Timer

def foo():
    t = Timer('time_foo')
    t.start()
    try:
        for i in range(1000):
            calc(i)
        return "foo!"
    finally:
        t.stop()

Timer objects also provide a pair of decorators, startTimer/stopTimer to decorate other functions.

from buildbot.process.metrics import Timer

t = Timer('time_thing')

@t.startTimer
def foo():
    return "foo!"

@t.stopTimer
def bar():
    return "bar!"

foo()
bar()
timeMethod(name)

A function decorator that measures how long a function takes to execute. Note that many functions in buildbot return deferreds, so may return before all the work they set up has completed. Using an explicit Timer is better in this case.

from buildbot.process.metrics import timeMethod

@timeMethod('time_foo')
def foo():
    for i in range(1000):
        calc(i)
    return "foo!"

Classes

The sections contained here document classes that can be used or subclassed.

Note

Some of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.

BuildFactory

BuildFactory Implementation Note

The default BuildFactory, provided in the buildbot.process.factory module, contains an internal list of BuildStep specifications: a list of (step_class, kwargs) tuples for each. These specification tuples are constructed when the config file is read, by asking the instances passed to addStep for their subclass and arguments.

To support config files from buildbot-0.7.5 and earlier, addStep also accepts the f.addStep(shell.Compile, command=["make","build"]) form, although its use is discouraged because then the Compile step doesn't get to validate or complain about its arguments until build time. The modern pass-by-instance approach allows this validation to occur while the config file is being loaded, where the admin has a better chance of noticing problems.

When asked to create a Build, the BuildFactory puts a copy of the list of step specifications into the new Build object. When the Build is actually started, these step specifications are used to create the actual set of BuildSteps, which are then executed one at a time. This serves to give each Build an independent copy of each step.

Each step can affect the build process in the following ways:

  • If the step's haltOnFailure attribute is True, then a failure in the step (i.e. if it completes with a result of FAILURE) will cause the whole build to be terminated immediately: no further steps will be executed, with the exception of steps with alwaysRun set to True. haltOnFailure is useful for setup steps upon which the rest of the build depends: if the CVS checkout or ./configure process fails, there is no point in trying to compile or test the resulting tree.
  • If the step's alwaysRun attribute is True, then it will always be run, regardless of if previous steps have failed. This is useful for cleanup steps that should always be run to return the build directory or build slave into a good state.
  • If the flunkOnFailure or flunkOnWarnings flag is set, then a result of FAILURE or WARNINGS will mark the build as a whole as FAILED. However, the remaining steps will still be executed. This is appropriate for things like multiple testing steps: a failure in any one of them will indicate that the build has failed, however it is still useful to run them all to completion.
  • Similarly, if the warnOnFailure or warnOnWarnings flag is set, then a result of FAILURE or WARNINGS will mark the build as having WARNINGS, and the remaining steps will still be executed. This may be appropriate for certain kinds of optional build or test steps. For example, a failure experienced while building documentation files should be made visible with a WARNINGS result but not be serious enough to warrant marking the whole build with a FAILURE.

In addition, each Step produces its own results, may create logfiles, etc. However only the flags described above have any effect on the build as a whole.

The pre-defined BuildSteps like CVS and Compile have reasonably appropriate flags set on them already. For example, without a source tree there is no point in continuing the build, so the CVS class has the haltOnFailure flag set to True. Look in buildbot/steps/*.py to see how the other Steps are marked.

Each Step is created with an additional workdir argument that indicates where its actions should take place. This is specified as a subdirectory of the slave builder's base directory, with a default value of build. This is only implemented as a step argument (as opposed to simply being a part of the base directory) because the CVS/SVN steps need to perform their checkouts from the parent directory.

BuildSetSummaryNotifierMixin

Some status notifiers will want to report the status of all builds all at once for a particular buildset, instead of reporting each build individually as it finishes. In order to do this, the status notifier must wait for all builds to finish, collect their results, and then report a kind of summary on all of the collected results. The act of waiting for and collecting the results of all of the builders is implemented via BuildSetSummaryNotifierMixin, to be subclassed by a status notification implementation.

BuildSetSummaryNotifierMixin
buildbot.status.buildset.BuildSetSummaryNotifierMixin::

This class provides some helper methods for implementing a status notification that provides notifications for all build results for a buildset at once.

This class provides the following methods:

buildbot.status.buildset.summarySubscribe()

Call this to start receiving sendBuildSetSummary callbacks. Typically this will be called from the subclass's startService method.

buildbot.status.buildset.summaryUnsubscribe()

Call this to stop receiving sendBuildSetSummary callbacks. Typically this will be called from the subclass's stopService method.

The following methods are hooks to be implemented by the subclass.

buildbot.status.buildset.sendBuildSetSummary(buildset, builds)
Parameters:
  • buildset -- A BuildSet object
  • builds -- A list of Build objects

This method must be implemented by the subclass. This method is called when all of the builds for a buildset have finished, and it should initiate sending a summary status for the buildset.

The following attributes must be provided by the subclass.

buildbot.status.buildset.master

This must point to the BuildMaster object.

RemoteCommands

Most of the action in build steps consists of performing operations on the slave. This is accomplished via RemoteCommand and its subclasses. Each represents a single operation on the slave.

Most data is returned to a command via updates. These updates are described in detail in Updates.

RemoteCommand
class buildbot.process.buildstep.RemoteCommand(remote_command, args, collectStdout=False, ignore_updates=False, decodeRC=dict(0))
Parameters:
  • remote_command (string) -- command to run on the slave
  • args (dictionary) -- arguments to pass to the command
  • collectStdout -- if True, collect the command's stdout
  • ignore_updates -- true to ignore remote updates
  • decodeRC -- dictionary associating rc values to buildsteps results constants (e.g. SUCCESS, FAILURE, WARNINGS)

This class handles running commands, consisting of a command name and a dictionary of arguments. If true, ignore_updates will suppress any updates sent from the slave.

This class handles updates for stdout, stderr, and header by appending them to a stdio logfile, if one is in use. It handles updates for rc by recording the value in its rc attribute.

Most slave-side commands, even those which do not spawn a new process on the slave, generate logs and an rc, requiring this class or one of its subclasses. See Updates for the updates that each command may send.

active

True if the command is currently running

run(step, remote)
Parameters:
  • step -- the buildstep invoking this command
  • remote -- a reference to the remote SlaveBuilder instance
Returns:

Deferred

Run the command. Call this method to initiate the command; the returned Deferred will fire when the command is complete. The Deferred fires with the RemoteCommand instance as its value.

interrupt(why)
Parameters:why (Twisted Failure) -- reason for interrupt
Returns:Deferred

This method attempts to stop the running command early. The Deferred it returns will fire when the interrupt request is received by the slave; this may be a long time before the command itself completes, at which time the Deferred returned from run will fire.

results()
Returns:results constant

This method checks the rc against the decodeRC dictionary, and returns results constant

didFail()
Returns:bool

This method returns True if the results() function returns FAILURE

The following methods are invoked from the slave. They should not be called directly.

remote_update(updates)
Parameters:updates -- new information from the slave

Handles updates from the slave on the running command. See Updates for the content of the updates. This class splits the updates out, and handles the ignore_updates option, then calls remoteUpdate to process the update.

remote_complete(failure=None)
Parameters:failure -- the failure that caused the step to complete, or None for success

Called by the slave to indicate that the command is complete. Normal completion (even with a nonzero rc) will finish with no failure; if failure is set, then the step should finish with status EXCEPTION.

These methods are hooks for subclasses to add functionality.

remoteUpdate(update)
Parameters:update -- the update to handle

Handle a single update. Subclasses must override this method.

remoteComplete(failure)
Parameters:failure -- the failure that caused the step to complete, or None for success
Returns:Deferred

Handle command completion, performing any necessary cleanup. Subclasses should override this method. If failure is not None, it should be returned to ensure proper processing.

logs

A dictionary of LogFile instances representing active logs. Do not modify this directly -- use useLog instead.

rc

Set to the return code of the command, after the command has completed. For compatibility with shell commands, 0 is taken to indicate success, while nonzero return codes indicate failure.

stdout

If the collectStdout constructor argument is true, then this attribute will contain all data from stdout, as a single string. This is helpful when running informational commands (e.g., svnversion), but is not appropriate for commands that will produce a large amount of output, as that output is held in memory.

To set up logging, use useLog or useLogDelayed before starting the command:

useLog(log, closeWhenFinished=False, logfileName=None)
Parameters:
  • log -- the LogFile instance to add to.
  • closeWhenFinished -- if true, call finish when the command is finished.
  • logfileName -- the name of the logfile, as given to the slave. This is stdio for standard streams.

Route log-related updates to the given logfile. Note that stdio is not included by default, and must be added explicitly. The logfileName must match the name given by the slave in any log updates.

useLogDelayed(logfileName, activateCallback, closeWhenFinished=False)
Parameters:
  • logfileName -- the name of the logfile, as given to the slave. This is stdio for standard streams.
  • activateCallback -- callback for when the log is added; see below
  • closeWhenFinished -- if true, call finish when the command is finished.

Similar to useLog, but the logfile is only actually added when an update arrives for it. The callback, activateCallback, will be called with the RemoteCommand instance when the first update for the log is delivered.

With that finished, run the command using the inherited run method. During the run, you can inject data into the logfiles with any of these methods:

addStdout(data)
Parameters:data -- data to add to the logfile

Add stdout data to the stdio log.

addStderr(data)
Parameters:data -- data to add to the logfile

Add stderr data to the stdio log.

addHeader(data)
Parameters:data -- data to add to the logfile

Add header data to the stdio log.

addToLog(logname, data)
Parameters:
  • logname -- the logfile to receive the data
  • data -- data to add to the logfile

Add data to a logfile other than stdio.

class buildbot.process.buildstep.RemoteShellCommand(workdir, command, env=None, want_stdout=True, want_stderr=True, timeout=20*60, maxTime=None, sigtermTime=None, logfiles={}, usePTY="slave-config", logEnviron=True, collectStdio=False)
Parameters:
  • workdir -- directory in which command should be executed, relative to the builder's basedir.
  • command (string or list) -- shell command to run
  • want_stdout -- If false, then no updates will be sent for stdout.
  • want_stderr -- If false, then no updates will be sent for stderr.
  • timeout -- Maximum time without output before the command is killed.
  • maxTime -- Maximum overall time from the start before the command is killed.
  • sigtermTime -- Try to kill the command with SIGTERM and wait for sigtermTime seconds before firing SIGKILL. If None, SIGTERM will not be fired.
  • env -- A dictionary of environment variables to augment or replace the existing environment on the slave.
  • logfiles -- Additional logfiles to request from the slave.
  • usePTY -- True to use a PTY, false to not use a PTY; the default value uses the default configured on the slave.
  • logEnviron -- If false, do not log the environment on the slave.
  • collectStdout -- If True, collect the command's stdout.

Most of the constructor arguments are sent directly to the slave; see shell for the details of the formats. The collectStdout parameter is as described for the parent class.

If shell command contains passwords they can be hidden from log files by passing them as tuple in command argument. Eg. ['print', ('obfuscated', 'password', 'dummytext')] is logged as ['print', 'dummytext'].

This class is used by the ShellCommand step, and by steps that run multiple customized shell commands.

BuildSteps

There are a few parent classes that are used as base classes for real buildsteps. This section describes the base classes. The "leaf" classes are described in Build Steps.

BuildStep
class buildbot.process.buildstep.BuildStep(name, description, descriptionDone, descriptionSuffix, locks, haltOnFailure, flunkOnWarnings, flunkOnFailure, warnOnWarnings, warnOnFailure, alwaysRun, progressMetrics, useProgress, doStepIf, hideStepIf)

All constructor arguments must be given as keyword arguments. Each constructor parameter is copied to the corresponding attribute.

name

The name of the step.

description

The description of the step.

descriptionDone

The description of the step after it has finished.

descriptionSuffix

Any extra information to append to the description.

locks

List of locks for this step; see Interlocks.

progressMetrics

List of names of metrics that should be used to track the progress of this build, and build ETA's for users. This is generally set in the

useProgress

If true (the default), then ETAs will be calculated for this step using progress metrics. If the step is known to have unpredictable timing (e.g., an incremental build), then this should be set to false.

doStepIf

A callable or bool to determine whether this step should be executed. See Common Parameters for details.

hideStepIf

A callable or bool to determine whether this step should be shown in the waterfall and build details pages. See Common Parameters for details.

The following attributes affect the behavior of the containing build:

haltOnFailure

If true, the build will halt on a failure of this step, and not execute subsequent tests (except those with alwaysRun).

flunkOnWarnings

If true, the build will be marked as a failure if this step ends with warnings.

flunkOnFailure

If true, the build will be marked as a failure if this step fails.

warnOnWarnings

If true, the build will be marked as warnings, or worse, if this step ends with warnings.

warnOnFailure

If true, the build will be marked as warnings, or worse, if this step fails.

alwaysRun

If true, the step will run even if a previous step halts the build with haltOnFailure.

A few important pieces of information are not available when a step is constructed, and are added later. These are set by the following methods; the order in which these methods are called is not defined.

setBuild(build)
Parameters:build -- the Build instance controlling this step.

This method is called during setup to set the build instance controlling this slave. Subclasses can override this to get access to the build object as soon as it is available. The default implementation sets the build attribute.

build

The build object controlling this step.

setBuildSlave(build)
Parameters:build -- the BuildSlave instance on which this step will run.

Similarly, this method is called with the build slave that will run this step. The default implementation sets the buildslave attribute.

buildslave

The build slave that will run this step.

setDefaultWorkdir(workdir)
Parameters:workdir -- the default workdir, from the build

This method is called at build startup with the default workdir for the build. Steps which allow a workdir to be specified, but want to override it with the build's default workdir, can use this method to apply the default.

setupProgress()

This method is called during build setup to give the step a chance to set up progress tracking. It is only called if the build has useProgress set. There is rarely any reason to override this method.

progress

If the step is tracking progress, this is a StepProgress instance performing that task.

Execution of the step itself is governed by the following methods and attributes.

startStep(remote)
Parameters:remote -- a remote reference to the slave-side SlaveBuilder instance
Returns:Deferred

Begin the step. This is the build's interface to step execution. Subclasses should override run to implement custom behaviors.

run()
Returns:result via Deferred

Execute the step. When this method returns (or when the Deferred it returns fires), the step is complete. The method's return value must be an integer, giving the result of the step -- a constant from buildbot.status.results. If the method raises an exception or its Deferred fires with failure, then the step will be completed with an EXCEPTION result. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the run method.

Subclasses should override this method. Do not call finished or failed from this method.

start()
Returns:None or SKIPPED, optionally via a Deferred.

Begin the step. BuildSteps written before Buildbot-0.9.0 often override this method instead of run, but this approach is deprecated.

When the step is done, it should call finished, with a result -- a constant from buildbot.status.results. The result will be handed off to the Build.

If the step encounters an exception, it should call failed with a Failure object.

If the step decides it does not need to be run, start can return the constant SKIPPED. In this case, it is not necessary to call finished directly.

finished(results)
Parameters:results -- a constant from results

A call to this method indicates that the step is finished and the build should analyze the results and perhaps proceed to the next step. The step should not perform any additional processing after calling this method. This method must only be called from the (deprecated) start method.

failed(failure)
Parameters:failure -- a Failure instance

Similar to finished, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.

This method handles BuildStepFailed specially, by calling finished(FAILURE). This provides subclasses with a shortcut to stop execution of a step by raising this failure in a context where failed will catch it. This method must only be called from the (deprecated) start method.

interrupt(reason)
Parameters:reason (string or Failure) -- why the build was interrupted

This method is used from various control interfaces to stop a running step. The step should be brought to a halt as quickly as possible, by cancelling a remote command, killing a local process, etc. The step must still finish with either finished or failed.

The reason parameter can be a string or, when a slave is lost during step processing, a ConnectionLost failure.

The parent method handles any pending lock operations, and should be called by implementations in subclasses.

stopped

If false, then the step is running. If true, the step is not running, or has been interrupted.

A step can indicate its up-to-the-moment status using a short summary string. These methods allow step subclasses to produce such summaries.

updateSummary()

Update the summary, calling getCurrentSummary or getResultSummary as appropriate. New-style build steps should call this method any time the summary may have changed. This method is debounced, so even calling it for every log line is acceptable.

getCurrentSummary()
Returns:dictionary, optionally via Deferred

Returns a dictionary containing status information for a running step. The dictionary can a step key with a unicode value giving a summary for display with the step. This method is only called while the step is running.

New-style build steps should override this method to provide a more interesting summary than the default u"running".

getResultSummary()
Returns:dictionary, optionally via Deferred

Returns a dictionary containing status information for a completed step. The dictionary can have keys step and build, each with unicode values. The step key gives a summary for display with the step, while the build key gives a summary for display with the entire build. The latter should be used sparingly, and include only information that the user would find relevant for the entire build, such as a number of test failures. Either or both keys can be omitted.

This method is only called while the step is finished.

New-style build steps should override this method to provide a more interesting summary than the default u"running", or to provide any build summary information.

describe(done=False)
Parameters:done -- If true, the step is finished.
Returns:list of strings

Describe the step succinctly. The return value should be a sequence of short strings suitable for display in a horizontally constrained space.

Note

Be careful not to assume that the step has been started in this method. In relatively rare circumstances, steps are described before they have started. Ideally, unit tests should be used to ensure that this method is resilient.

Note

This method is not called for new-style steps. Instead, override getCurrentSummary and getResultSummary.

Build steps have statistics, a simple key/value store of data which can later be aggregated over all steps in a build. Note that statistics are not preserved after a build is complete.

hasStatistic(stat)
Parameters:stat (string) -- name of the statistic
Returns:True if the statistic exists on this step
getStatistic(stat, default=None)
Parameters:
  • stat (string) -- name of the statistic
  • default -- default value if the statistic does not exist
Returns:

value of the statistic, or the default value

getStatistics()
Returns:a dictionary of all statistics for this step
setStatistic(stat, value)
Parameters:
  • stat (string) -- name of the statistic
  • value -- value to assign to the statistic
Returns:

value of the statistic

Build steps support progress metrics - values that increase roughly linearly during the execution of the step, and can thus be used to calculate an expected completion time for a running step. A metric may be a count of lines logged, tests executed, or files compiled. The build mechanics will take care of translating this progress information into an ETA for the user.

setProgress(metric, value)
Parameters:
  • metric (string) -- the metric to update
  • value (integer) -- the new value for the metric

Update a progress metric. This should be called by subclasses that can provide useful progress-tracking information.

The specified metric name must be included in progressMetrics.

The following methods are provided as utilities to subclasses. These methods should only be invoked after the step is started.

slaveVersion(command, oldversion=None)
Parameters:
  • command (string) -- command to examine
  • oldversion -- return value if the slave does not specify a version
Returns:

string

Fetch the version of the named command, as specified on the slave. In practice, all commands on a slave have the same version, but passing command is still useful to ensure that the command is implemented on the slave. If the command is not implemented on the slave, slaveVersion will return None.

Versions take the form x.y where x and y are integers, and are compared as expected for version numbers.

Buildbot versions older than 0.5.0 did not support version queries; in this case, slaveVersion will return oldVersion. Since such ancient versions of Buildbot are no longer in use, this functionality is largely vestigial.

slaveVersionIsOlderThan(command, minversion)
Parameters:
  • command (string) -- command to examine
  • minversion -- minimum version
Returns:

boolean

This method returns true if command is not implemented on the slave, or if it is older than minversion.

getSlaveName()
Returns:string

Get the name of the buildslave assigned to this step.

Most steps exist to run commands. While the details of exactly how those commands are constructed are left to subclasses, the execution of those commands comes down to this method:

runCommand(command)
Parameters:command -- RemoteCommand instance
Returns:Deferred

This method connects the given command to the step's buildslave and runs it, returning the Deferred from run.

addURL(name, url)
Parameters:
  • name -- URL name
  • url -- the URL

Add a link to the given url, with the given name to displays of this step. This allows a step to provide links to data that is not available in the log files.

The BuildStep class provides minimal support for log handling, that is extended by the LoggingBuildStep class. The following methods provide some useful behaviors. These methods can be called while the step is running, but not before.

addLog(name)
Parameters:name -- log name
Returns:LogFile instance via Deferred

Add a new logfile with the given name to the step, and return the log file instance.

getLog(name)
Parameters:name -- log name
Returns:LogFile instance
Raises:KeyError if the log is not found

Get an existing logfile by name.

addCompleteLog(name, text)
Parameters:
  • name -- log name
  • text -- content of the logfile
Returns:

Deferred

This method adds a new log and sets text as its content. This is often useful to add a short logfile describing activities performed on the master. The logfile is immediately closed, and no further data can be added.

addHTMLLog(name, html)
Parameters:
  • name -- log name
  • html -- content of the logfile
Returns:

Deferred

Similar to addCompleteLog, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by addCompleteLog.

addLogObserver(logname, observer)
Parameters:
  • logname -- log name
  • observer -- log observer instance

Add a log observer for the named log. The named log need not have been added already: the observer will be connected when the log is added.

See Adding LogObservers for more information on log observers.

LoggingBuildStep
class buildbot.process.buildstep.LoggingBuildStep(logfiles, lazylogfiles, log_eval_func, name, locks, haltOnFailure, flunkOnWarnings, flunkOnFailure, warnOnWarnings, warnOnFailure, alwaysRun, progressMetrics, useProgress, doStepIf, hideStepIf)
Parameters:

The remaining arguments are passed to the BuildStep constructor.

Warning

Subclasses of this class are always old-style steps. As such, this class will be removed after Buildbot-0.9.0. Instead, subclass BuildStep and mix in ShellMixin to get similar behavior.

This subclass of BuildStep is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:

  • tracks progress using the length of the stdout logfile
  • provides hooks for summarizing and evaluating the command's result
  • supports lazy logfiles
  • handles the mechanics of starting, interrupting, and finishing remote commands
  • detects lost slaves and finishes with a status of RETRY
logfiles

The logfiles to track, as described for ShellCommand. The contents of the class-level logfiles attribute are combined with those passed to the constructor, so subclasses may add log files with a class attribute:

class MyStep(LoggingBuildStep):
    logfiles = dict(debug='debug.log')

Note that lazy logfiles cannot be specified using this method; they must be provided as constructor arguments.

startCommand(command)
Parameters:command -- the RemoteCommand instance to start

Note

This method permits an optional errorMessages parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated.

Handle all of the mechanics of running the given command. This sets up all required logfiles, keeps status text up to date, and calls the utility hooks described below. When the command is finished, the step is finished as well, making this class is unsuitable for steps that run more than one command in sequence.

Subclasses should override start and, after setting up an appropriate command, call this method.

def start(self):
    cmd = RemoteShellCommand(...)
    self.startCommand(cmd, warnings)

To refine the status output, override one or more of the following methods. The LoggingBuildStep implementations are stubs, so there is no need to call the parent method.

commandComplete(command)
Parameters:command -- the just-completed remote command

This is a general-purpose hook method for subclasses. It will be called after the remote command has finished, but before any of the other hook functions are called.

createSummary(stdio)
Parameters:stdio -- stdio LogFile

This hook is designed to perform any summarization of the step, based either on the contents of the stdio logfile, or on instance attributes set earlier in the step processing. Implementations of this method often call e.g., addURL.

evaluateCommand(command)
Parameters:command -- the just-completed remote command
Returns:step result from buildbot.status.results

This hook should decide what result the step should have. The default implementation invokes log_eval_func if it exists, and looks at rc to distinguish SUCCESS from FAILURE.

The remaining methods provide an embarrassment of ways to set the summary of the step that appears in the various status interfaces. The easiest way to affect this output is to override describe. If that is not flexible enough, override getText and/or getText2.

getText(command, results)
Parameters:
  • command -- the just-completed remote command
  • results -- step result from evaluateCommand
Returns:

a list of short strings

This method is the primary means of describing the step. The default implementation calls describe, which is usually the easiest method to override, and then appends a string describing the step status if it was not successful.

getText2(command, results)
Parameters:
  • command -- the just-completed remote command
  • results -- step result from evaluateCommand
Returns:

a list of short strings

Like getText, this method summarizes the step's result, but it is only called when that result affects the build, either by making it halt, flunk, or end with warnings.

CommandMixin

The runCommand method can run a RemoteCommand instance, but it's no help in building that object or interpreting the results afterward. This mixin class adds some useful methods for running commands.

This class can only be used in new-style steps.

class buildbot.process.buildstep.CommandMixin

Some remote commands are simple enough that they can boil down to a method call. Most of these take an abandonOnFailure argument which, if true, will abandon the entire buildstep on command failure. This is accomplished by raising BuildStepFailed.

These methods all write to the stdio log (generally just for errors). They do not close the log when finished.

runRmdir(dir, abandonOnFailure=True)
Parameters:
  • dir -- directory to remove
  • abndonOnFailure -- if true, abandon step on failure
Returns:

Boolean via Deferred

Remove the given directory, using the rmdir command. Returns False on failure.

runMkdir(dir, abandonOnFailure=True)
Parameters:
  • dir -- directory to create
  • abndonOnFailure -- if true, abandon step on failure
Returns:

Boolean via Deferred

Create the given directory and any parent directories, using the mkdir command. Returns False on failure.

pathExists(path)

:param path path to test :returns: Boolean via Deferred

Determine if the given path exists on the slave (in any form - file, directory, or otherwise). This uses the stat command.

glob(path)

:param path path to test :returns: list of filenames

Get the list of files matching the given path pattern on the slave. This uses Python's glob module. If the glob method fails, it aborts the step.

ShellMixin

Most Buildbot steps run shell commands on the slave, and Buildbot has an impressive array of configuration parameters to control that execution. The ShellMixin mixin provides the tools to make running shell commands easy and flexible.

This class can only be used in new-style steps.

class buildbot.process.buildstep.ShellMixin

This mixin manages the following step configuration parameters, the contents of which are documented in the manual. Naturally, all of these are renderable.

..py:attribute:: command ..py:attribute:: workdir ..py:attribute:: env ..py:attribute:: want_stdout ..py:attribute:: want_stderr ..py:attribute:: usePTY ..py:attribute:: logfiles ..py:attribute:: lazylogfiles ..py:attribute:: timeout ..py:attribute:: maxTime ..py:attribute:: logEnviron ..py:attribute:: interruptSignal ..py:attribute:: sigtermTime ..py:attribute:: initialStdin ..py:attribute:: decodeRC

..py:method:: setupShellMixin(constructorArgs, prohibitArgs=[])

:param dict constructorArgs constructor keyword arguments :param list prohibitArgs list of recognized arguments to reject :returns: keyword arguments destined for BuildStep

This method is intended to be called from the shell constructor, passed any keyword arguments not otherwise used by the step. Any attributes set on the instance already (e.g., class-level attributes) are used as defaults. Attributes named in prohibitArgs are rejected with a configuration error.

The return value should be passed to the BuildStep constructor.

..py:method:: makeRemoteShellCommand(collectStdout=False, collectStderr=False, **overrides)

param collectStdout:
 if true, the command's stdout wil be available in cmd.stdout on completion
param collectStderr:
 if true, the command's stderr wil be available in cmd.stderr on completion
param overrides:
 overrides arguments that might have been passed to setupShellMixin
returns:RemoteShellCommand instance via Deferred

This method constructs a RemoteShellCommand instance based on the instance attributes and any supplied overrides. It must be called while the step is running, as it examines the slave capabilities before creating the command. It takes care of just about everything:

  • Creating log files and associating them with the command
  • Merging environment configuration
  • Selecting the appropriate workdir configuration

All that remains is to run the command with runCommand.

Exceptions
exception buildbot.process.buildstep.BuildStepFailed

This exception indicates that the buildstep has failed. It is useful as a way to skip all subsequent processing when a step goes wrong. It is handled by BuildStep.failed.

ForceScheduler

The force scheduler has a symbiotic relationship with the web status, so it deserves some further description.

Parameters

The force scheduler comes with a fleet of parameter classes. This section contains information to help users or developers who are interested in adding new parameter types or hacking the existing types.

class buildbot.schedulers.forceshed.BaseParameter(name, label, regex, **kwargs)

This is the base implementation for most parameters, it will check validity, ensure the arg is present if the required attribute is set, and implement the default value. It will finally call updateFromKwargs to process the string(s) from the HTTP POST.

The BaseParameter constructor converts all keyword arguments into instance attributes, so it is generally not necessary for subclasses to implement a constructor.

For custom parameters that set properties, one simple customization point is getFromKwargs:

getFromKwargs(kwargs)
Parameters:kwargs -- a dictionary of the posted values

Given the passed-in POST parameters, return the value of the property that should be set.

For more control over parameter parsing, including modifying sourcestamps or changeids, override the updateFromKwargs function, which is the function that ForceScheduler invokes for processing:

updateFromKwargs(master, properties, changes, sourcestamps, kwargs)
Parameters:
  • master -- the BuildMaster instance
  • properties -- a dictionary of properties
  • changes -- a list of changeids that will be used to build the SourceStamp for the forced builds
  • sourcestamps -- the SourceStamp dictionary that will be passed to the build; some parameters modify sourcestamps rather than properties.
  • kwargs -- a dictionary of the posted values

This method updates properties, changes, and/or sourcestamps according to the request. The default implementation is good for many simple uses, but can be overridden for more complex purposes.

When overriding this function, take all parameters by name (not by position), and include an **unused catch-all to guard against future changes.

The remaining attributes and methods should be overridden by subclasses, although BaseParameter provides appropriate defaults.

name

The name of the parameter. This corresponds to the name of the property that your parameter will set. This name is also used internally as identifier for http POST arguments

label

The label of the parameter, as displayed to the user. This value can contain raw HTML.

fullName()

A fully-qualified name that uniquely identifies the parameter in the scheduler. This name is used internally as the identifier for HTTP POST arguments. It is a mix of name and the parent's name (in the case of nested parameters). This field is not modifiable.

type

A list of types that the parameter conforms to. These are used by the jinja template to create appropriate html form widget. The available values are visible in master/buildbot/status/web/template/forms.html in the force_build_one_scheduler macro.

default

The default value to use if there is no user input. This is also used to fill in the form presented to the user.

required

If true, an error will be shown to user if there is no input in this field

multiple

If true, this parameter represents a list of values (e.g. list of tests to run)

regex

A string that will be compiled as a regex and used to validate the string value of this parameter. If None, then no validation will take place.

parse_from_args(l)

return the list of object corresponding to the list or string passed default function will just call parse_from_arg with the first argument

parse_from_arg(s)

return the object corresponding to the string passed default function will just return the unmodified string

Nested Parameters

The NestedParameter class is a container for parameters. The motivating purpose for this feature is the multiple-codebase configuration, which needs to provide the user with a form to control the branch (et al) for each codebase independently. Each branch parameter is a string field with name 'branch' and these must be disambiguated.

Each of the child parameters mixes in the parent's name to create the fully qualified fullName. This allows, for example, each of the 'branch' fields to have a unique name in the POST request. The NestedParameter handles adding this extra bit to the name to each of the children. When the kwarg dictionary is posted back, this class also converts the flat POST dictionary into a richer structure that represents the nested structure.

As illustration, if the nested parameter has the name 'foo', and has children 'bar1' and 'bar2', then the POST will have entries like "foo-bar1" and "foo-bar2". The nested parameter will translate this into a dictionary in the 'kwargs' structure, resulting in something like:

kwargs = {
    # ...
    'foo': {
        'bar1': '...',
        'bar2': '...'
    }
}

Arbitrary nesting is allowed and results in a deeper dictionary structure.

Nesting can also be used for presentation purposes. If the name of the NestedParameter is empty, the nest is "anonymous" and does not mangle the child names. However, in the HTML layout, the nest will be presented as a logical group.

IRenderable

buildbot.interfaces.IRenderable::

Providers of this class can be "rendered", based on available properties, when a build is started.

getRenderingFor(iprops)
Parameters:iprops -- the IProperties provider supplying the properties of the build.

Returns the interpretation of the given properties, optionally in a Deferred.

IProperties

buildbot.interfaces.IProperties::

Providers of this interface allow get and set access to a build's properties.

getProperty(propname, default=None)

Get a named property, returning the default value if the property is not found.

hasProperty(propname)

Determine whether the named property exists.

setProperty(propname, value, source)

Set a property's value, also specifying the source for this value.

getProperties()

Get a buildbot.process.properties.Properties instance. The interface of this class is not finalized; where possible, use the other IProperties methods.

Release Notes for Buildbot 0.8.9

The following are the release notes for Buildbot 0.8.9. Buildbot 0.8.9 was released on 14 June, 2014.

Master

Features

  • The following optional parameters have been added to EC2LatentBuildSlave
    • Boolean parameter spot_instance, default False, creates a spot instance.
    • Float parameter max_spot_price defines the maximum bid for a spot instance.
    • List parameter volumes, takes a list of (volume_id, mount_point) tuples.
    • String parameter placement is appended to the region parameter, e.g. region='us-west-2', placement='b' will result in the spot request being placed in us-west-2b.
    • Float parameter price_multiplier specifies the percentage bid above the 24-hour average spot price.
    • Dict parameter tags specifies AWS tags as key/value pairs to be applied to new instances.

    With spot_instance=True, an EC2LatentBuildSlave will attempt to create a spot instance with the provided spot price, placement, and so on.

  • The web hooks now include support for Bitbucket, GitLab and Gitorious.

  • The GitHub webhook has been updated to work with v3 of the GitHub webhook API.

  • The GitHub webhook can now optionally ignore non-distinct commits (bug #1861).

  • The HgPoller and GitPoller now split filenames on newlines, rather than whitespace, so files containing whitespace are handled correctly.

  • Add 'pollAtLaunch' flag for polling change sources. This allows a poller to poll immediately on launch and get changes that occurred while it was down.

  • Added the BitbucketPullrequestPoller changesource.

  • The GitPoller can now be configured to poll all available branches (pull request 1010).

  • The P4Source changesource now supports Perforce servers in a different timezone than the buildbot master (pull request 728).

  • Each Scheduler type can now take a 'reason' argument to customize the reason it uses for triggered builds.

  • A new argument createAbsoluteSourceStamps has been added to SingleBranchScheduler for use with multiple codebases.

  • A new argument createAbsoluteSourceStamps has been added to Nightly for use with multiple codebases.

  • The Periodic scheduler now supports codebases.

  • The ForceScheduler now takes a buttonName argument to specify the name of the button on the force-build form.

  • Master side source checkout steps now support patches (bug #2098). The Git and Mercurial steps use their inbuilt commands to apply patches (bug #2563).

  • Master side source checkout steps now support retry option (bug #2465).

  • Master-side source checkout steps now respond to the "stop build" button (bug #2356).

  • Git source checkout step now supports reference repositories.

  • The Git step now uses the git clean option -f twice, to also remove untracked directories managed by another git repository. See bug #2560.

  • The branch and codebase arguments to the Git step are now renderable.

  • Gerrit integration with Git Source step on master side (bug #2485).

  • P4 source step now supports more advanced options.

  • The master-side SVN step now supports authentication for mode=export, fixing bug #2463.

  • The SVN step will now canonicalize URL's before matching them for better accuracy.

  • The SVN step now obfuscates the password in status logs, fixing bug #2468.

  • SVN source step and ShellCommand now support password obfuscation. (bug #2468 and bug #1478).

  • CVS source step now checks for "sticky dates" from a previous checkout before updating an existing source directory.

  • :Repo now supports a depth flag when initializing the repo. This controls the amount of git history to download.

  • The manifestBranch of the bb:step:Repo step is now renderable

  • New source step Monotone added on master side.

  • New source step Darcs added on master side.

  • A new Robocopy step is available for Windows builders (pull request 728).

  • The attributes description, descriptionDone and descriptionSuffix have been moved from ShellCommand to its superclass BuildStep so that any class that inherits from BuildStep can provide a suitable description of itself.

  • A new FlattenList Renderable has been added which can flatten nested lists.

  • Added new build steps for VC12, VS2013 and MsBuild12.

  • The mode parameter of the VS steps is now renderable (bug #2592).

  • The HTTPStep step can make arbitrary HTTP requests from the master, allowing communication with external APIs. This new feature requires the optional txrequests and requests Python packages.

  • A new MultipleFileUpload step was added to allow uploading several files (or directories) in a single step.

  • Information about the buildslaves (admin, host, etc) is now persisted in the database and available even if the slave is not connected.

  • Buildslave info can now be retrieved via Interpolate and a new SetSlaveInfo buildstep.

  • The GNUAutotools factory now has a reconf option to run autoreconf before ./configure.

  • Builder configurations can now include a description, which will appear in the web UI to help humans figure out what the builder does.

  • The WebStatus builder page can now filter pending/current/finished builds by property parameters of the form ?property.<name>=<value>.

  • The WebStatus StatusResourceBuilder page can now take the maxsearch argument

  • The WebStatus has a new authz "view" action that allows you to require users to logged in to view the WebStatus.

  • The WebStatus now shows revisions (+ codebase) where it used to simply say "multiple rev".

  • The Console view now supports codebases.

  • The web UI for Builders has been updated:
    • shows the build 'reason' and 'interested users'
    • shows sourcestamp information for builders that use multiple codebases (instead of the generic "multiple rev" placeholder that was shown before).
  • The waterfall and atom/rss feeds can be filtered with the project url paramter.

  • The WebStatus Authorization support now includes a view action which can be used to restrict read-only access to the Buildbot instance.

  • The web status now has options to cancel some or all pending builds.

  • The WebStatus now interprets ANSI color codes in stdio output.

  • It is now possible to select categories to show in the waterfall help

  • The web status now automatically scrolls output logs (pull request 1078).

  • The web UI now supports a PNG Status Resource that can be accessed publicly from for example README.md files or wikis or whatever other resource. This view produces an image in PNG format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view.

  • Revision links for commits on SouceForge (Allura) are now automatically generated.

  • The 'Rebuild' button on the web pages for builds features a dropdown to choose whether to rebuild from exact revisions or from the same sourcestamps (ie, update branch references)

  • Build status can be sent to GitHub. Depends on txgithub package. See GitHubStatus and GitHub Commit Status.

  • The IRC bot of IRC will, unless useRevisions is set, shorten long lists of revisions printed when a build starts; it will only show two, and the number of additional revisions included in the build.

  • A new argument summaryCB has been added to GerritStatusPush, to allow sending one review per buildset. Sending a single "summary" review per buildset is now the default if neither summaryCB nor reviewCB are specified.

  • The comments field of changes is no longer limited to 1024 characters on MySQL and Postgres. See bug #2367 and pull request 736.

  • HTML log files are no longer stored in status pickles (pull request 1077)

  • Builds are now retried after a slave is lost (pull request 1049).

  • The buildbot status client can now access a build properties via the getProperties call.

  • The start, restart, and reconfig commands will now wait for longer than 10 seconds as long as the master continues producing log lines indicating that the configuration is progressing.

  • Added new config option protocols which allows to configure multiple protocols on single master.

  • RemoteShellCommands can be killed by SIGTERM with the sigtermTime parameter before resorting to SIGKILL (bug #751). If the slave's version is less than 0.8.9, the slave will kill the process with SIGKILL regardless of whether sigtermTime is supplied.

  • Introduce an alternative way to deploy Buildbot and try the pyflakes tutorial using Docker.

  • Added zsh and bash tab-completions support for 'buildbot' command.

  • An example of a declarative configuration is included in master/contrib/SimpleConfig.py, with copious comments.

  • Systemd unit files for Buildbot are available in the contrib/ directory.

  • We've added some extra checking to make sure that you have a valid locale before starting buildbot (#2608).

Forward Compatibility

In preparation for a more asynchronous implementation of build steps in Buildbot 0.9.0, this version introduces support for new-style steps. Existing old-style steps will continue to function correctly in Buildbot 0.8.x releases and in Buildbot 0.9.0, but support will be dropped soon afterward. See New-Style Build Steps for guidance on rewriting existing steps in this new style. To eliminate ambiguity, the documentation for this version only reflects support for new-style steps. Refer to the documentation for previous versions for infrormation on old-style steps.

Fixes

  • Fixes an issue where GitPoller sets the change branch to refs/heads/master - which isn't compatible with Git (pull request 1069).
  • Fixed an issue where the Git and CVS source steps silently changed the workdir to 'build' when the 'copy' method is used.
  • The CVS source step now respects the timeout parameter.
  • The Git step now uses the git submodule update option --init when updating the submodules of an existing repository, so that it will receive any newly added submodules.
  • The web status no longer relies on the current working directory, which is not set correctly by some initscripts, to find the templates/ directory (bug #2586).
  • The Perforce source step uses the correct path separator when the master is on Windows and the build slave is on a POSIX OS (pull request 1114).
  • The source steps now correctly interpolate properties in env.
  • GerritStatusPush now supports setting scores with Gerrit 2.6 and newer
  • The change hook no longer fails when passing unicode to change_hook_auth (pull request 996).
  • The source steps now correctly interpolate properties in env.
  • Whitespace is properly handled for StringParameter, so that appropriate validation errors are raised for required parameters (pull request 1084).
  • Fix a rare case where a buildtep might fail from a GeneratorExit exception (pull request 1063).
  • Fixed an issue where UTF-8 data in logs caused RSS feed exceptions (bug #951).
  • Fix an issue with unescaped author names causing invalid RSS feeds (bug #2596).
  • Fixed an issue with pubDate format in feeds.
  • Fixed an issue where the step text value could cause a TypeError in the build detail page (pull request 1061).
  • Fix failures where git clean fails but could be clobbered (pull request 1058).
  • Build step now correctly fails when the git clone step fails (pull request 1057).
  • Fixed a race condition in slave shutdown (pull request 1019).
  • Now correctly unsubscribes StatusPush from status updates when reconfiguring (pull request 997).
  • Fixes parsing git commit messages that are blank.
  • Git no longer fails when work dir exists but isn't a checkout (bug #2531).
  • The haltOnFailure and flunkOnFailure attricutes of ShellCommand are now renderable. (:bb:bug 2486).
  • The rotateLength and maxRotatedFile arguments are no longer treated as strings in buildbot.tac. This fixes log rotation. The upgrade_master command will notify users if they have this problem.
  • Builbot no longer specifies a revision when pulling from a mercurial (bug #438).
  • The WebStatus no longer incorrectly refers to fields that might not be visible.
  • The GerritChangeSource now sets a default author, fixing an exception that occured when Gerrit didn't report an owner name/email.
  • Respects the RETRY status when an interrupt occurs.
  • Fixes an off-by-one error when the tryclient is finding the current git branch.
  • Improve the Mercurial source stamp extraction in the try client.
  • Fixes some edge cases in timezone handling for python < 2.7.4 (bug #2522).
  • The EC2LatentBuildSlave will now only consider available AMI's.
  • Fixes a case where the first build runs on an old slave instead of a new one after reconfig (bug #2507).
  • The e-mail address validation for the MailNotifier status receiver has been improved.
  • The --db parameter of buildbot create-master is now validated.
  • No longer ignores default choice for ForceScheduler list parameters
  • Now correctly handles BuilderConfig(..., mergeRequests=False) (bug #2555).
  • Now excludes changes from sourcestamps when they aren't in the DB (bug #2554).
  • Fixes a compatibility issue with HPCloud in the OpenStack latent slave.
  • Allow _ as a valid character in JSONP callback names.
  • Fix build start time retrieval in the WebStatus grid view.
  • Increase the length of the DB fields changes.comments and buildset_properties.property_value.

Deprecations, Removals, and Non-Compatible Changes

  • The slave-side source steps are deprecated in this version of Buildbot, and master-side support will be removed in a future version. Please convert any use of slave-side steps (imported directly from buildbot.steps.source, rather than from a specific module like buildbot.steps.source.svn) to use master-side steps.
  • Both old-style and new-style steps are supported in this version of Buildbot. Upgrade your steps to new-style now, as support for old-style steps will be dropped after Buildbot-0.9.0. See New-Style Build Steps for details.
    • The LoggingBuildStep class has been deprecated, and support will be removed along with support for old-style steps after the Buildbot-0.9.0 release. Instead, subclass BuildStep and mix in ShellMixin to get similar behavior.
  • slavePortnum option deprecated, please use c['protocols']['pb']['port'] to set up PB port
  • The buildbot.process.mtrlogobserver module have been renamed to buildbot.steps.mtrlogobserver.
  • The buildmaster now requires at least Twisted-11.0.0.
  • The buildmaster now requires at least sqlalchemy-migrate 0.6.1.
  • The hgbuildbot Mercurial hook has been moved to contrib/, and does not work with recent versions of Mercurial and Twisted. The runtimes for these two tools are incompatible, yet hgbuildbot attempts to run both in the same Python interpreter. Mayhem ensues.
  • The try scheduler's --connect=ssh method no longer supports waiting for results (--wait).
  • The former buildbot.process.buildstep.RemoteCommand class and its subclasses are now in buildbot.process.remotecommand, although imports from the previous path will continue to work. Similarly, the former buildbot.process.buildstep.LogObserver class and its subclasses are now in buildbot.process.logobserver, although imports from the previous path will continue to work.
  • The undocumented BuildStep method checkDisconnect is deprecated and now does nothing as the handling of disconnects is now handled in the failed method. Any custom steps adding this method as a callback or errback should no longer do so.
  • The build step MsBuild is now called MsBuild4 as multiple versions are now supported. An alias is provided so existing setups will continue to work, but this will be removed in a future release.

Changes for Developers

  • The CompositeStepMixin now provides a runGlob method to check for files on the slave that match a given shell-style pattern.
  • The BuilderStatus now allows you to pass a filter_fn arguent to generateBuilds.

Slave

Features

  • Added zsh and bash tab-completions support for 'buildslave' command.
  • RemoteShellCommands accept the new sigtermTime parameter from master. This allows processes to be killed by SIGTERM before resorting to SIGKILL (bug #751)
  • Commands will now throw a ValueError if mandatory args are not present.
  • Added a new remote command GlobPath that can be used to call Python's glob.glob on the slave.

Fixes

  • Fixed an issue when buildstep stop() was raising an exception incorrectly if timeout for buildstep wasn't set or was None (see pull request 753) thus keeping watched logfiles open (this prevented their removal on Windows in subsequent builds).
  • Fixed a bug in P4 source step where the timeout parameter was ignored.
  • Fixed a bug in P4 source step where using a custom view-spec could result in failed syncs due to incorrectly generated command-lines.
  • The logwatcher will use /usr/xpg4/bin/tail on Solaris, it if is available (pull request 1065).

Deprecations, Removals, and Non-Compatible Changes

Details

For a more detailed description of the changes made in this version, see the git log itself:

git log v0.8.8..v0.8.9

Older Versions

Release notes for older versions of Buildbot are available in the master/docs/relnotes/ directory of the source tree. Newer versions are also available here:

Release Notes for Buildbot v0.8.8

The following are the release notes for Buildbot v0.8.8 Buildbot v0.8.8 was released on August 22, 2013

Master
Features
  • The MasterShellCommand step now correctly handles environment variables passed as list.
  • The master now poll the database for pending tasks when running buildbot in multi-master mode.
  • The algorithm to match build requests to slaves has been rewritten in pull request 615. The new algorithm automatically takes locks into account, and will not schedule a build only to have it wait on a lock. The algorithm also introduces a canStartBuild builder configuration option which can be used to prevent a build request being assigned to a slave.
  • buildbot stop and buildbot restart now accept --clean to stop or restart the master cleanly (allowing all running builds to complete first).
  • The IRC bot now supports clean shutdown and immediate shutdown by using the command 'shutdown'. To allow the command to function, you must provide allowShutdown=True.
  • CopyDirectory has been added.
  • BuildslaveChoiceParameter has been added to provide a way to explicitly choose a buildslave for a given build.
  • default.css now wraps preformatted text by default.
  • Slaves can now be paused through the web status.
  • The latent buildslave support is less buggy, thanks to pull request 646.
  • The treeStableTimer for AnyBranchScheduler now maintains separate timers for separate branches, codebases, projects, and repositories.
  • SVN has a new option preferLastChangedRev=True to use the last changed revision for got_revision
  • The build request DB connector method getBuildRequests can now filter by branch and repository.
  • A new SetProperty step has been added in buildbot.steps.master which can set a property directly without accessing the slave.
  • The new LogRenderable step logs Python objects, which can contain renderables, to the logfile. This is helpful for debugging property values during a build.
  • 'buildbot try' now has an additional --property option to set properties. Unlike the existing --properties option, this new option supports setting only a single property and therefore allows commas to be included in the property name and value.
  • The Git step has a new config option, which accepts a dict of git configuration options to pass to the low-level git commands. See Git for details.
  • In ShellCommand ShellCommand now validates its arguments during config and will identify any invalid arguments before a build is started.
  • The list of force schedulers in the web UI is now sorted by name.
  • OpenStack-based Latent Buildslave support was added. See pull request 666.
  • Master-side support for P4 is available, and provides a great deal more flexibility than the old slave-side step. See pull request 596.
  • Master-side support for Repo is available. The step parameters changed to camelCase. repo_downloads, and manifest_override_url properties are no longer hardcoded, but instead consult as default values via renderables. Renderable are used in favor of callables for syncAllBranches and updateTarball.
  • Builder configurations can now include a description, which will appear in the web UI to help humans figure out what the builder does.
  • GNUAutoconf and other pre-defined factories now work correctly (bug #2402)
  • The pubDate in RSS feeds is now rendered correctly (bug #2530)
Deprecations, Removals, and Non-Compatible Changes
  • The split_file function for SVNPoller may now return a dictionary instead of a tuple. This allows it to add extra information about a change (such as project or repository).
  • The workdir build property has been renamed to builddir. This change accurately reflects its content; the term "workdir" means something different. workdir is currently still supported for backwards compatability, but will be removed eventually.
  • The Blocker step has been removed.
  • Several polling ChangeSources are now documented to take a pollInterval argument, instead of pollinterval. The old name is still supported.
  • StatusReceivers' checkConfig method should no longer take an errors parameter. It should indicate errors by calling error.
  • Build steps now require that their name be a string. Previously, they would accept anything, but not behave appropriately.
  • The web status no longer displays a potentially misleading message, indicating whether the build can be rebuilt exactly.
  • The SetProperty step in buildbot.steps.shell has been renamed to SetPropertyFromCommand.
  • The EC2 and libvirt latent slaves have been moved to buildbot.buildslave.ec2 and buildbot.buildslave.libirt respectively.
  • Pre v0.8.7 versions of buildbot supported passing keyword arguments to buildbot.process.BuildFactory.addStep, but this was dropped. Support was added again, while still being deprecated, to ease transition.
Changes for Developers
  • Added an optional build start callback to buildbot.status.status_gerrit.GerritStatusPush This release includes the fix for bug #2536.
  • An optional startCB callback to GerritStatusPush can be used to send a message back to the committer. See the linked documentation for details.
  • bb:sched:ChoiceStringParameter has a new method getChoices that can be used to generate content dynamically for Force scheduler forms.
Slave
Features
  • The fix for Twisted bug #5079 is now applied on the slave side, too. This fixes a perspective broker memory leak in older versions of Twisted. This fix was added on the master in Buildbot-0.8.4 (see bug #1958).
  • The --nodaemon option to buildslave start now correctly prevents the slave from forking before running.
Deprecations, Removals, and Non-Compatible Changes
Details

For a more detailed description of the changes made in this version, see the git log itself:

git log v0.8.7..v0.8.8
Older Versions

Release notes for older versions of Buildbot are available in the master/docs/relnotes/ directory of the source tree. Newer versions are also available here:

Release Notes for Buildbot v0.8.7

The following are the release notes for Buildbot v0.8.7. Buildbot v0.8.7 was released on September 22, 2012. Buildbot 0.8.7p1 was released on November 21, 2012.

0.8.7p1

In addition to what's listed below, the 0.8.7p1 release adds the following.

  • The SetPropertiesFromEnv step now correctly gets environment variables from the slave, rather than those set on the master. Also, it logs the changes made to properties.
  • The master-side Git source step now doesn't try to clone a branch called HEAD. This is what git does by default, and specifying it explicitly doesn't work as expected.
  • The Git step properly deals with the case when there is a file called FETCH_HEAD in the checkout.
  • Buildbot no longer forks when told not to daemonize.
  • Buildbot's startup is now more robust. See bug #1992.
  • The Trigger step uses the provided list of source stamps exactly, if given, instead of adding them to the sourcestamps of the current build. In 0.8.7, they were combined with the source stamps for the current build.
  • The Trigger step again completely ignores the source stamp of the current build, if alwaysUseLatest is set. In 0.8.7, this was mistakenly changed to only ignore the specified revision of the source stamp.
  • The Triggerable scheduler is again properly passing changes through to the scheduled builds. See bug #2376.
  • Web change hooks log errors, allowing debugging.
  • The base change hook now properly decodes the provided date.
  • CVSMailDir has been fixed.
  • Importing buildbot.test no longer causes python to exit, if mock insn't installed. The fixes pydoc -k when buildbot is installed.
  • Mercurial properly updates to the correct branch, when using inrepo branches.
  • Buildbot now doesn't fail on invalid UTF-8 in a number of places.
  • Many documenation updates and fixes.
Master
Features
  • Buildbot now supports building projects composed of multiple codebases. New schedulers can aggregate changes to multiple codebases into source stamp sets (with one source stamp for each codebase). Source steps then check out each codebase as required, and the remainder of the build process proceeds normally. See the Multiple-Codebase Builds for details.
    • The format of the got_revision property has changed for multi-codebase builds. It is now a dictionary keyed by codebase.
  • Source and ShellCommand steps now have an optional descriptionSuffix, a suffix to the description/descriptionDone values. For example this can help distinguish between multiple Compile steps that are applied to different codebases.
  • The Git step has a new getDescription option, which will run git describe after checkout normally. See Git for details.
  • A new interpolation placeholder Interpolate, with more regular syntax, is available.
  • A new ternary substitution operator :? and :#? is available with the Interpolate class.
  • IRenderable.getRenderingFor can now return a deferred.
  • The Mercurial hook now supports multiple masters. See pull request 436.
  • There's a new poller for Mercurial: HgPoller.
  • The new HTPasswdAprAuth uses libaprutil (through ctypes) to validate the password against the hash from the .htpasswd file. This adds support for all hash types htpasswd can generate.
  • GitPoller has been rewritten. It now supports multiple branches and can share a directory between multiple pollers. It is also more resilient to changes in configuration, or in the underlying repository.
  • Added a new property httpLoginUrl to buildbot.status.web.authz.Authz to render a nice Login link in WebStatus for unauthenticated users if useHttpHeader and httpLoginUrl are set.
  • ForceScheduler has been updated:
    • support for multiple codebases via the codebases parameter
    • NestedParameter to provide a logical grouping of parameters.
    • CodebaseParameter to set the branch/revision/repository/project for a codebase
    • new HTML/CSS customization points. Each parameter is contained in a row with multiple 'class' attributes associated with them (eg, 'force-string' and 'force-nested') as well as a unique id to use with Javascript. Explicit line-breaks have been removed from the HTML generator and are now controlled using CSS.
  • The SVNPoller now supports multiple projects and codebases. See pull request 443.
  • The MailNotifier now takes a callable to calculate the "previous" build for purposes of determining status changes. See pull request 489.
  • The copy_properties parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of set_properties.
Deprecations, Removals, and Non-Compatible Changes
  • Buildbot master now requires at least Python-2.5 and Twisted-9.0.0.

  • Passing a BuildStep subclass (rather than instance) to addStep is no longer supported. The addStep method now takes exactly one argument.

  • Buildbot master requires python-dateutil version 1.5 to support the Nightly scheduler.

  • ForceScheduler has been updated to support multiple codebases. The branch/revision/repository/project are deprecated; if you have customized these values, simply provide them as codebases=[CodebaseParameter(name='', ...)].

    • The POST URL names for AnyPropertyParameter fields have changed. For example, 'property1name' is now 'property1_name', and 'property1value' is now 'property1_value'. Please update any bookmarked or saved URL's that used these fields.
    • forcesched.BaseParameter API has changed quite a bit and is no longer backwards compatible. Updating guidelines:
      • get_from_post is renamed to getFromKwargs
      • update_from_post is renamed to updateFromKwargs. This function's parameters are now called via named parameters to allow subclasses to ignore values it doesnt use. Subclasses should add **unused for future compatibility. A new parameter sourcestampset is provided to allow subclasses to modify the sourcestamp set, and will probably require you to add the **unused field.
  • The parameters to the callable version of build.workdir have changed. Instead of a single sourcestamp, a list of sourcestamps is passed. Each sourcestamp in the list has a different codebase

  • The undocumented renderable _ComputeRepositoryURL is no longer imported to buildbot.steps.source. It is still available at buildbot.steps.source.oldsource.

  • IProperties.render now returns a deferred, so any code rendering properties by hand will need to take this into account.

  • baseURL has been removed in SVN to use just repourl - see bug #2066. Branch info should be provided with Interpolate.

    from buildbot.steps.source.svn import SVN
    factory.append(SVN(baseURL="svn://svn.example.org/svn/"))
    

    can be replaced with

    from buildbot.process.properties import Interpolate
    from buildbot.steps.source.svn import SVN
    factory.append(SVN(repourl=Interpolate("svn://svn.example.org/svn/%(src::branch)s")))
    

    and

    from buildbot.steps.source.svn import SVN
    factory.append(SVN(baseURL="svn://svn.example.org/svn/%%BRANCH%%/project"))
    

    can be replaced with

    from buildbot.process.properties import Interpolate
    from buildbot.steps.source.svn import SVN
    factory.append(SVN(repourl=Interpolate("svn://svn.example.org/svn/%(src::branch)s/project")))
    

    and

    from buildbot.steps.source.svn import SVN
    factory.append(SVN(baseURL="svn://svn.example.org/svn/", defaultBranch="branches/test"))
    

    can be replaced with

    from buildbot.process.properties import Interpolate
    from buildbot.steps.source.svn import SVN
    factory.append(SVN(repourl=Interpolate("svn://svn.example.org/svn/%(src::branch:-branches/test)s")))
    
  • The P4Sync step, deprecated since 0.8.5, has been removed. The P4 step remains.

  • The fetch_spec argument to GitPoller is no longer supported. GitPoller now only downloads branches that it is polling, so specifies a refspec itself.

  • The format of the changes produced by SVNPoller has changed: directory pathnames end with a forward slash. This allows the split_file function to distinguish between files and directories. Customized split functions may need to be adjusted accordingly.

  • FlattenList has been deprecated in favor of Interpolate. Interpolate doesn't handle functions as keyword arguments. The following code using WithProperties

    from buildbot.process.properties import WithProperties
    def determine_foo(props):
        if props.hasProperty('bar'):
            return props['bar']
        elif props.hasProperty('baz'):
            return props['baz']
        return 'qux'
    WithProperties('%(foo)s', foo=determine_foo)
    

    can be replaced with

    from zope.interface import implementer
    from buildbot.interfaces import IRenderable
    from buildbot.process.properties import Interpolate
    @implementer(IRenderable)
    class determineFoo(object):
        def getRenderingFor(self, props):
            if props.hasProperty('bar'):
                return props['bar']
            elif props.hasProperty('baz'):
                return props['baz']
            return 'qux'
    Interpolate('%s(kw:foo)s', foo=determineFoo())
    
Changes for Developers
  • BuildStep.start can now optionally return a deferred and any errback will be handled gracefully. If you use inlineCallbacks, this means that unexpected exceptions and failures raised will be captured and logged and the build shut down normally.
  • The helper methods getState and setState from BaseScheduler have been factored into buildbot.util.state.StateMixin for use elsewhere.
Slave
Features
Deprecations, Removals, and Non-Compatible Changes
  • The P4Sync step, deprecated since 0.8.5, has been removed. The P4 step remains.
Details

For a more detailed description of the changes made in this version, see the Git log itself:

git log v0.8.6..v0.8.7
Older Versions

Release notes for older versions of Buildbot are available in the master/docs/relnotes/ directory of the source tree. Starting with version 0.8.6, they are also available under the appropriate version at http://buildbot.net/buildbot/docs.

Release Notes for Buildbot v0.8.6p1

The following are the release notes for Buildbot v0.8.6p1. Buildbot v0.8.6 was released on March 11, 2012. Buildbot v0.8.6p1 was released on March 25, 2012.

0.8.6p1

In addition to what's listed below, the 0.8.6p1 release adds the following.

  • Builders are no longer displayed in the order they were configured. This was never intended behavior, and will become impossible in the distributed architecture planned for Buildbot-0.9.x. As of 0.8.6p1, builders are sorted naturally: lexically, but with numeric segments sorted numerically.
  • Slave properties in the configuration are now handled correctly.
  • The web interface buttons to cancel individual builds now appear when configured.
  • The ForceScheduler's properties are correctly updated on reconfig - bug #2248.
  • If a slave is lost while waiting for locks, it is properly cleaned up - bug #2247.
  • Crashes when adding new steps to a factory in a reconfig are fixed - bug #2252.
  • MailNotifier AttributeErrors are fixed - bug #2254.
  • Cleanup from failed builds is improved - bug #2253.
Master
  • If you are using the GitHub hook, carefully consider the security implications of allowing un-authenticated change requests, which can potentially build arbitrary code. See bug #2186.
Deprecations, Removals, and Non-Compatible Changes
  • Forced builds now require that a ForceScheduler be defined in the Buildbot configuration. For compatible behavior, this should look like:

    from buildbot.schedulers.forcesched import ForceScheduler
    c['schedulers'].append(ForceScheduler(
                            name="force",
                            builderNames=["b1", "b2", ... ]))
    

    Where all of the builder names in the configuration are listed. See the documentation for the much more flexiblie configuration options now available.

  • This is the last release of Buildbot that will be compatible with Python 2.4. The next version will minimally require Python-2.5. See bug #2157.

  • This is the last release of Buildbot that will be compatible with Twisted-8.x.y. The next version will minimally require Twisted-9.0.0. See bug #2182.

  • buildbot start no longer invokes make if a Makefile.buildbot exists. If you are using this functionality, consider invoking make directly.

  • The buildbot sendchange option --username has been removed as promised in bug #1711.

  • StatusReceivers' checkConfig method should now take an additional errors parameter and call its addError method to indicate errors.

  • The gerrit status callback now gets an additional parameter (the master status). If you use this callback, you will need to adjust its implementation.

  • SQLAlchemy-Migrate version 0.6.0 is no longer supported. See Buildmaster Requirements.

  • Older versions of SQLite which could limp along for previous versions of Buildbot are no longer supported. The minimum version is 3.4.0, and 3.7.0 or higher is recommended.

  • The master-side Git step now checks out 'HEAD' by default, rather than master, which translates to the default branch on the upstream repository. See pull request 301.

  • The format of the repository strings created by hgbuildbot has changed to contain the entire repository URL, based on the web.baseurl value in hgrc. To continue the old (incorrect) behavior, set hgbuildbot.baseurl to an empty string as suggested in the Buildbot manual.

  • Master Side SVN Step has been corrected to properly use --revision when alwaysUseLatest is set to False when in the full mode. See bug #2194

  • Master Side SVN Step paramater svnurl has been renamed repourl, to be consistent with other master-side source steps.

  • Master Side Mercurial step parameter baseURL has been merged with repourl parameter. The behavior of the step is already controled by branchType parameter, so just use a single argument to specify the repository.

  • Passing a buildbot.process.buildstep.BuildStep subclass (rather than instance) to buildbot.process.factory.BuildFactory.addStep has long been deprecated, and will be removed in version 0.8.7.

  • The hgbuildbot tool now defaults to the 'inrepo' branch type. Users who do not explicitly set a branch type would previously have seen empty branch strings, and will now see a branch string based on the branch in the repository (e.g., default).

Changes for Developers
  • The interface for runtime access to the master's configuration has changed considerably. See Configuration for more details.
  • The DB connector methods completeBuildset, completeBuildRequest, and claimBuildRequest now take an optional complete_at parameter to specify the completion time explicitly.
  • Buildbot now sports sourcestamp sets, which collect multiple sourcestamps used to generate a single build, thanks to Harry Borkhuis. See pull request 287.
  • Schedulers no longer have a schedulerid, but rather an objectid. In a related change, the schedulers table has been removed, along with the buildbot.db.schedulers.SchedulersConnectorComponent.getSchedulerId method.
  • The Dependent scheduler tracks its upstream buildsets using buildbot.db.schedulers.StateConnectorComponent, so the scheduler_upstream_buildsets table has been removed, along with corresponding (undocumented) buildbot.db.buildsets.BuildsetsConnector methods.
  • Errors during configuration (in particular in BuildStep constructors), should be reported by calling buildbot.config.error.
Features
  • The IRC status bot now display build status in colors by default. It is controllable and may be disabled with useColors=False in constructor.

  • Buildbot can now take advantage of authentication done by a front-end web server - see pull request 266.

  • Buildbot supports a simple cookie-based login system, so users no longer need to enter a username and password for every request. See the earlier commits in pull request 278.

  • The master-side SVN step now has an export method which is similar to copy, but the build directory does not contain Subversion metdata. (bug #2078)

  • Property instances will now render any properties in the default value if necessary. This makes possible constructs like

    command=Property('command', default=Property('default-command'))
    
  • Buildbot has a new web hook to handle push notifications from Google Code - see pull request 278.

  • Revision links are now generated by a flexible runtime conversion configured by revlink - see pull request 280.

  • Shell command steps will now "flatten" nested lists in the command argument. This allows substitution of multiple command-line arguments using properties. See bug #2150.

  • Steps now take an optional hideStepIf parameter to suppress the step from the waterfall and build details in the web. (bug #1743)

  • Trigger steps with waitForFinish=True now receive a URL to all the triggered builds. This URL is displayed in the waterfall and build details. See bug #2170.

  • The master/contrib/fakemaster.py` script allows you to run arbitrary commands on a slave by emulating a master. See the file itself for documentation.

  • MailNotifier allows multiple notification modes in the same instance. See bug #2205.

  • SVNPoller now allows passing extra arguments via argument extra_args. See bug #1766

Slave
Deprecations, Removals, and Non-Compatible Changes
  • BitKeeper support is in the "Last-Rites" state, and will be removed in the next version unless a maintainer steps forward.
Features
Details

For a more detailed description of the changes made in this version, see the Git log itself:

git log buildbot-0.8.5..buildbot-0.8.6
Older Versions

Release notes for older versions of Buildbot are available in the master/docs/release-notes/ directory of the source tree, or in the archived documentation for those versions at http://buildbot.net/buildbot/docs.

Release Notes for Buildbot v0.8.7

The following are the release notes for Buildbot v0.8.7. Buildbot v0.8.7 was released on September 22, 2012. Buildbot 0.8.7p1 was released on November 21, 2012.

0.8.7p1

In addition to what's listed below, the 0.8.7p1 release adds the following.

  • The SetPropertiesFromEnv step now correctly gets environment variables from the slave, rather than those set on the master. Also, it logs the changes made to properties.
  • The master-side Git source step now doesn't try to clone a branch called HEAD. This is what git does by default, and specifying it explicitly doesn't work as expected.
  • The Git step properly deals with the case when there is a file called FETCH_HEAD in the checkout.
  • Buildbot no longer forks when told not to daemonize.
  • Buildbot's startup is now more robust. See bug #1992.
  • The Trigger step uses the provided list of source stamps exactly, if given, instead of adding them to the sourcestamps of the current build. In 0.8.7, they were combined with the source stamps for the current build.
  • The Trigger step again completely ignores the source stamp of the current build, if alwaysUseLatest is set. In 0.8.7, this was mistakenly changed to only ignore the specified revision of the source stamp.
  • The Triggerable scheduler is again properly passing changes through to the scheduled builds. See bug #2376.
  • Web change hooks log errors, allowing debugging.
  • The base change hook now properly decodes the provided date.
  • CVSMailDir has been fixed.
  • Importing buildbot.test no longer causes python to exit, if mock insn't installed. The fixes pydoc -k when buildbot is installed.
  • Mercurial properly updates to the correct branch, when using inrepo branches.
  • Buildbot now doesn't fail on invalid UTF-8 in a number of places.
  • Many documenation updates and fixes.
Master
Features
  • Buildbot now supports building projects composed of multiple codebases. New schedulers can aggregate changes to multiple codebases into source stamp sets (with one source stamp for each codebase). Source steps then check out each codebase as required, and the remainder of the build process proceeds normally. See the Multiple-Codebase Builds for details.
    • The format of the got_revision property has changed for multi-codebase builds. It is now a dictionary keyed by codebase.
  • Source and ShellCommand steps now have an optional descriptionSuffix, a suffix to the description/descriptionDone values. For example this can help distinguish between multiple Compile steps that are applied to different codebases.
  • The Git step has a new getDescription option, which will run git describe after checkout normally. See Git for details.
  • A new interpolation placeholder Interpolate, with more regular syntax, is available.
  • A new ternary substitution operator :? and :#? is available with the Interpolate class.
  • IRenderable.getRenderingFor can now return a deferred.
  • The Mercurial hook now supports multiple masters. See pull request 436.
  • There's a new poller for Mercurial: HgPoller.
  • The new HTPasswdAprAuth uses libaprutil (through ctypes) to validate the password against the hash from the .htpasswd file. This adds support for all hash types htpasswd can generate.
  • GitPoller has been rewritten. It now supports multiple branches and can share a directory between multiple pollers. It is also more resilient to changes in configuration, or in the underlying repository.
  • Added a new property httpLoginUrl to buildbot.status.web.authz.Authz to render a nice Login link in WebStatus for unauthenticated users if useHttpHeader and httpLoginUrl are set.
  • ForceScheduler has been updated:
    • support for multiple codebases via the codebases parameter
    • NestedParameter to provide a logical grouping of parameters.
    • CodebaseParameter to set the branch/revision/repository/project for a codebase
    • new HTML/CSS customization points. Each parameter is contained in a row with multiple 'class' attributes associated with them (eg, 'force-string' and 'force-nested') as well as a unique id to use with Javascript. Explicit line-breaks have been removed from the HTML generator and are now controlled using CSS.
  • The SVNPoller now supports multiple projects and codebases. See pull request 443.
  • The MailNotifier now takes a callable to calculate the "previous" build for purposes of determining status changes. See pull request 489.
  • The copy_properties parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of set_properties.
Deprecations, Removals, and Non-Compatible Changes
  • Buildbot master now requires at least Python-2.5 and Twisted-9.0.0.

  • Passing a BuildStep subclass (rather than instance) to addStep is no longer supported. The addStep method now takes exactly one argument.

  • Buildbot master requires python-dateutil version 1.5 to support the Nightly scheduler.

  • ForceScheduler has been updated to support multiple codebases. The branch/revision/repository/project are deprecated; if you have customized these values, simply provide them as codebases=[CodebaseParameter(name='', ...)].

    • The POST URL names for AnyPropertyParameter fields have changed. For example, 'property1name' is now 'property1_name', and 'property1value' is now 'property1_value'. Please update any bookmarked or saved URL's that used these fields.
    • forcesched.BaseParameter API has changed quite a bit and is no longer backwards compatible. Updating guidelines:
      • get_from_post is renamed to getFromKwargs
      • update_from_post is renamed to updateFromKwargs. This function's parameters are now called via named parameters to allow subclasses to ignore values it doesnt use. Subclasses should add **unused for future compatibility. A new parameter sourcestampset is provided to allow subclasses to modify the sourcestamp set, and will probably require you to add the **unused field.
  • The parameters to the callable version of build.workdir have changed. Instead of a single sourcestamp, a list of sourcestamps is passed. Each sourcestamp in the list has a different codebase

  • The undocumented renderable _ComputeRepositoryURL is no longer imported to buildbot.steps.source. It is still available at buildbot.steps.source.oldsource.

  • IProperties.render now returns a deferred, so any code rendering properties by hand will need to take this into account.

  • baseURL has been removed in SVN to use just repourl - see bug #2066. Branch info should be provided with Interpolate.

    from buildbot.steps.source.svn import SVN
    factory.append(SVN(baseURL="svn://svn.example.org/svn/"))
    

    can be replaced with

    from buildbot.process.properties import Interpolate
    from buildbot.steps.source.svn import SVN
    factory.append(SVN(repourl=Interpolate("svn://svn.example.org/svn/%(src::branch)s")))
    

    and

    from buildbot.steps.source.svn import SVN
    factory.append(SVN(baseURL="svn://svn.example.org/svn/%%BRANCH%%/project"))
    

    can be replaced with

    from buildbot.process.properties import Interpolate
    from buildbot.steps.source.svn import SVN
    factory.append(SVN(repourl=Interpolate("svn://svn.example.org/svn/%(src::branch)s/project")))
    

    and

    from buildbot.steps.source.svn import SVN
    factory.append(SVN(baseURL="svn://svn.example.org/svn/", defaultBranch="branches/test"))
    

    can be replaced with

    from buildbot.process.properties import Interpolate
    from buildbot.steps.source.svn import SVN
    factory.append(SVN(repourl=Interpolate("svn://svn.example.org/svn/%(src::branch:-branches/test)s")))
    
  • The P4Sync step, deprecated since 0.8.5, has been removed. The P4 step remains.

  • The fetch_spec argument to GitPoller is no longer supported. GitPoller now only downloads branches that it is polling, so specifies a refspec itself.

  • The format of the changes produced by SVNPoller has changed: directory pathnames end with a forward slash. This allows the split_file function to distinguish between files and directories. Customized split functions may need to be adjusted accordingly.

  • FlattenList has been deprecated in favor of Interpolate. Interpolate doesn't handle functions as keyword arguments. The following code using WithProperties

    from buildbot.process.properties import WithProperties
    def determine_foo(props):
        if props.hasProperty('bar'):
            return props['bar']
        elif props.hasProperty('baz'):
            return props['baz']
        return 'qux'
    WithProperties('%(foo)s', foo=determine_foo)
    

    can be replaced with

    from zope.interface import implementer
    from buildbot.interfaces import IRenderable
    from buildbot.process.properties import Interpolate
    @implementer(IRenderable)
    class determineFoo(object):
        def getRenderingFor(self, props):
            if props.hasProperty('bar'):
                return props['bar']
            elif props.hasProperty('baz'):
                return props['baz']
            return 'qux'
    Interpolate('%s(kw:foo)s', foo=determineFoo())
    
Changes for Developers
  • BuildStep.start can now optionally return a deferred and any errback will be handled gracefully. If you use inlineCallbacks, this means that unexpected exceptions and failures raised will be captured and logged and the build shut down normally.
  • The helper methods getState and setState from BaseScheduler have been factored into buildbot.util.state.StateMixin for use elsewhere.
Slave
Features
Deprecations, Removals, and Non-Compatible Changes
  • The P4Sync step, deprecated since 0.8.5, has been removed. The P4 step remains.
Details

For a more detailed description of the changes made in this version, see the Git log itself:

git log v0.8.6..v0.8.7
Older Versions

Release notes for older versions of Buildbot are available in the master/docs/relnotes/ directory of the source tree. Starting with version 0.8.6, they are also available under the appropriate version at http://buildbot.net/buildbot/docs.

Release Notes for Buildbot v0.8.6p1

The following are the release notes for Buildbot v0.8.6p1. Buildbot v0.8.6 was released on March 11, 2012. Buildbot v0.8.6p1 was released on March 25, 2012.

0.8.6p1

In addition to what's listed below, the 0.8.6p1 release adds the following.

  • Builders are no longer displayed in the order they were configured. This was never intended behavior, and will become impossible in the distributed architecture planned for Buildbot-0.9.x. As of 0.8.6p1, builders are sorted naturally: lexically, but with numeric segments sorted numerically.
  • Slave properties in the configuration are now handled correctly.
  • The web interface buttons to cancel individual builds now appear when configured.
  • The ForceScheduler's properties are correctly updated on reconfig - bug #2248.
  • If a slave is lost while waiting for locks, it is properly cleaned up - bug #2247.
  • Crashes when adding new steps to a factory in a reconfig are fixed - bug #2252.
  • MailNotifier AttributeErrors are fixed - bug #2254.
  • Cleanup from failed builds is improved - bug #2253.
Master
  • If you are using the GitHub hook, carefully consider the security implications of allowing un-authenticated change requests, which can potentially build arbitrary code. See bug #2186.
Deprecations, Removals, and Non-Compatible Changes
  • Forced builds now require that a ForceScheduler be defined in the Buildbot configuration. For compatible behavior, this should look like:

    from buildbot.schedulers.forcesched import ForceScheduler
    c['schedulers'].append(ForceScheduler(
                            name="force",
                            builderNames=["b1", "b2", ... ]))
    

    Where all of the builder names in the configuration are listed. See the documentation for the much more flexiblie configuration options now available.

  • This is the last release of Buildbot that will be compatible with Python 2.4. The next version will minimally require Python-2.5. See bug #2157.

  • This is the last release of Buildbot that will be compatible with Twisted-8.x.y. The next version will minimally require Twisted-9.0.0. See bug #2182.

  • buildbot start no longer invokes make if a Makefile.buildbot exists. If you are using this functionality, consider invoking make directly.

  • The buildbot sendchange option --username has been removed as promised in bug #1711.

  • StatusReceivers' checkConfig method should now take an additional errors parameter and call its addError method to indicate errors.

  • The gerrit status callback now gets an additional parameter (the master status). If you use this callback, you will need to adjust its implementation.

  • SQLAlchemy-Migrate version 0.6.0 is no longer supported. See Buildmaster Requirements.

  • Older versions of SQLite which could limp along for previous versions of Buildbot are no longer supported. The minimum version is 3.4.0, and 3.7.0 or higher is recommended.

  • The master-side Git step now checks out 'HEAD' by default, rather than master, which translates to the default branch on the upstream repository. See pull request 301.

  • The format of the repository strings created by hgbuildbot has changed to contain the entire repository URL, based on the web.baseurl value in hgrc. To continue the old (incorrect) behavior, set hgbuildbot.baseurl to an empty string as suggested in the Buildbot manual.

  • Master Side SVN Step has been corrected to properly use --revision when alwaysUseLatest is set to False when in the full mode. See bug #2194

  • Master Side SVN Step paramater svnurl has been renamed repourl, to be consistent with other master-side source steps.

  • Master Side Mercurial step parameter baseURL has been merged with repourl parameter. The behavior of the step is already controled by branchType parameter, so just use a single argument to specify the repository.

  • Passing a buildbot.process.buildstep.BuildStep subclass (rather than instance) to buildbot.process.factory.BuildFactory.addStep has long been deprecated, and will be removed in version 0.8.7.

  • The hgbuildbot tool now defaults to the 'inrepo' branch type. Users who do not explicitly set a branch type would previously have seen empty branch strings, and will now see a branch string based on the branch in the repository (e.g., default).

Changes for Developers
  • The interface for runtime access to the master's configuration has changed considerably. See Configuration for more details.
  • The DB connector methods completeBuildset, completeBuildRequest, and claimBuildRequest now take an optional complete_at parameter to specify the completion time explicitly.
  • Buildbot now sports sourcestamp sets, which collect multiple sourcestamps used to generate a single build, thanks to Harry Borkhuis. See pull request 287.
  • Schedulers no longer have a schedulerid, but rather an objectid. In a related change, the schedulers table has been removed, along with the buildbot.db.schedulers.SchedulersConnectorComponent.getSchedulerId method.
  • The Dependent scheduler tracks its upstream buildsets using buildbot.db.schedulers.StateConnectorComponent, so the scheduler_upstream_buildsets table has been removed, along with corresponding (undocumented) buildbot.db.buildsets.BuildsetsConnector methods.
  • Errors during configuration (in particular in BuildStep constructors), should be reported by calling buildbot.config.error.
Features
  • The IRC status bot now display build status in colors by default. It is controllable and may be disabled with useColors=False in constructor.

  • Buildbot can now take advantage of authentication done by a front-end web server - see pull request 266.

  • Buildbot supports a simple cookie-based login system, so users no longer need to enter a username and password for every request. See the earlier commits in pull request 278.

  • The master-side SVN step now has an export method which is similar to copy, but the build directory does not contain Subversion metdata. (bug #2078)

  • Property instances will now render any properties in the default value if necessary. This makes possible constructs like

    command=Property('command', default=Property('default-command'))
    
  • Buildbot has a new web hook to handle push notifications from Google Code - see pull request 278.

  • Revision links are now generated by a flexible runtime conversion configured by revlink - see pull request 280.

  • Shell command steps will now "flatten" nested lists in the command argument. This allows substitution of multiple command-line arguments using properties. See bug #2150.

  • Steps now take an optional hideStepIf parameter to suppress the step from the waterfall and build details in the web. (bug #1743)

  • Trigger steps with waitForFinish=True now receive a URL to all the triggered builds. This URL is displayed in the waterfall and build details. See bug #2170.

  • The master/contrib/fakemaster.py` script allows you to run arbitrary commands on a slave by emulating a master. See the file itself for documentation.

  • MailNotifier allows multiple notification modes in the same instance. See bug #2205.

  • SVNPoller now allows passing extra arguments via argument extra_args. See bug #1766

Slave
Deprecations, Removals, and Non-Compatible Changes
  • BitKeeper support is in the "Last-Rites" state, and will be removed in the next version unless a maintainer steps forward.
Features
Details

For a more detailed description of the changes made in this version, see the Git log itself:

git log buildbot-0.8.5..buildbot-0.8.6
Older Versions

Release notes for older versions of Buildbot are available in the master/docs/release-notes/ directory of the source tree, or in the archived documentation for those versions at http://buildbot.net/buildbot/docs.

PK7D\P ,buildbot-v0.8.9/.doctrees/environment.pickle(csphinx.environment BuildEnvironment qoq}q(Udlfilesqcsphinx.util FilenameUniqDict q)qc__builtin__ set q]RqbUappq NU _warnfuncq NUtitlesq }q (Xmanual/cfg-buildslavesq cdocutils.nodes title q)q}q(U rawsourceqUU attributesq}q(Udupnamesq]Uclassesq]Ubackrefsq]Uidsq]Unamesq]uUchildrenq]qcdocutils.nodes Text qX Buildslavesqq}q(hX BuildslavesqUparentq hubaUtagnameq!Utitleq"ubXrelnotes/0.8.7q#h)q$}q%(hUh}q&(h]h]h]h]h]uh]q'hX!Release Notes for Buildbot v0.8.7q(q)}q*(hX!Release Notes for Buildbot v0.8.7q+h h$ubah!h"ubXdeveloper/cls-remotecommandsq,h)q-}q.(hUh}q/(h]h]h]h]h]uh]q0hXRemoteCommandsq1q2}q3(hXRemoteCommandsq4h h-ubah!h"ubXmanual/cfg-interlocksq5h)q6}q7(hUh}q8(h]h]h]h]h]uh]q9hX Interlocksq:q;}q<(hX Interlocksq=h h6ubah!h"ubXdeveloper/encodingsq>h)q?}q@(hUh}qA(h]h]h]h]h]uh]qBhXString EncodingsqCqD}qE(hXString EncodingsqFh h?ubah!h"ubXtutorial/indexqGh)qH}qI(hUh}qJ(h]h]h]h]h]uh]qKhXBuildbot TutorialqLqM}qN(hXBuildbot TutorialqOh hHubah!h"ubXdeveloper/cls-ipropertiesqPh)qQ}qR(hUh}qS(h]h]h]h]h]uh]qThX IPropertiesqUqV}qW(hX IPropertiesqXh hQubah!h"ubXmanual/resourcesqYh)qZ}q[(hUh}q\(h]h]h]h]h]uh]q]hX Resourcesq^q_}q`(hX Resourcesqah hZubah!h"ubXmanual/cmdlineqbh)qc}qd(hUh}qe(h]h]h]h]h]uh]qfhXCommand-line Toolqgqh}qi(hXCommand-line Toolqjh hcubah!h"ubXmanual/new-style-stepsqkh)ql}qm(hUh}qn(h]h]h]h]h]uh]qohXNew-Style Build Stepsqpqq}qr(hXNew-Style Build Stepsqsh hlubah!h"ubXdeveloper/cls-buildfactoryqth)qu}qv(hUh}qw(h]h]h]h]h]uh]qxhX BuildFactoryqyqz}q{(hX BuildFactoryq|h huubah!h"ubXmanual/introductionq}h)q~}q(hUh}q(h]h]h]h]h]uh]qhX Introductionqq}q(hX Introductionqh h~ubah!h"ubXtutorial/furtherqh)q}q(hUh}q(h]h]h]h]h]uh]qhXFurther Readingqq}q(hXFurther Readingqh hubah!h"ubXmanual/cfg-propertiesqh)q}q(hUh}q(h]h]h]h]h]uh]qhX Propertiesqq}q(hX Propertiesqh hubah!h"ubXmanual/cfg-globalqh)q}q(hUh}q(h]h]h]h]h]uh]qhXGlobal Configurationqq}q(hXGlobal Configurationqh hubah!h"ubXmanual/optimizationqh)q}q(hUh}q(h]h]h]h]h]uh]qhX Optimizationqq}q(hX Optimizationqh hubah!h"ubXdeveloper/resultsqh)q}q(hUh}q(h]h]h]h]h]uh]qhXBuild Result Codesqq}q(hXBuild Result Codesqh hubah!h"ubXtutorial/dockerqh)q}q(hUh}q(h]h]h]h]h]uh]qhXFirst Buildbot run with Dockerqq}q(hXFirst Buildbot run with Dockerqh hubah!h"ubXindexqh)q}q(hUh}q(h]h]h]h]h]uh]qhXTable Of Contentsqq}q(hXTable Of Contentsqh hubah!h"ubXdeveloper/cls-irenderableqh)q}q(hUh}q(h]h]h]h]h]uh]qhX IRenderableqʅq}q(hX IRenderableqh hubah!h"ubXdeveloper/styleqh)q}q(hUh}q(h]h]h]h]h]uh]qhXBuildbot Coding StyleqӅq}q(hXBuildbot Coding Styleqh hubah!h"ubXdeveloper/metricsqh)q}q(hUh}q(h]h]h]h]h]uh]qhXMetricsq܅q}q(hXMetricsqh hubah!h"ubXdeveloper/cls-forceschedqh)q}q(hUh}q(h]h]h]h]h]uh]qhXForceSchedulerq允q}q(hXForceSchedulerqh hubah!h"ubXdeveloper/master-overviewqh)q}q(hUh}q(h]h]h]h]h]uh]qhXMaster Organizationqq}q(hXMaster Organizationqh hubah!h"ubXtutorial/fiveminutesqh)q}q(hUh}q(h]h]h]h]h]uh]qhX3Buildbot in 5 minutes - a user-contributed tutorialqq}q(hX3Buildbot in 5 minutes - a user-contributed tutorialqh hubah!h"ubXmanual/cfg-buildfactoriesqh)q}q(hUh}q(h]h]h]h]h]uh]qhXBuild Factoriesrr}r(hXBuild Factoriesrh hubah!h"ubXdeveloper/utilsrh)r}r(hUh}r(h]h]h]h]h]uh]rhX Utilitiesr r }r (hX Utilitiesr h jubah!h"ubXdeveloper/indexr h)r}r(hUh}r(h]h]h]h]h]uh]rhXBuildbot Developmentrr}r(hXBuildbot Developmentrh jubah!h"ubXrelnotes/0.8.6rh)r}r(hUh}r(h]h]h]h]h]uh]rhX#Release Notes for Buildbot v0.8.6p1rr}r(hX#Release Notes for Buildbot v0.8.6p1rh jubah!h"ubXmanual/installationrh)r }r!(hUh}r"(h]h]h]h]h]uh]r#hX Installationr$r%}r&(hX Installationr'h j ubah!h"ubXrelnotes/indexr(h)r)}r*(hUh}r+(h]h]h]h]h]uh]r,hX Release Notes for Buildbot 0.8.9r-r.}r/(hX Release Notes for Buildbot 0.8.9r0h j)ubah!h"ubXmanual/cfg-schedulersr1h)r2}r3(hUh}r4(h]h]h]h]h]uh]r5hX Schedulersr6r7}r8(hX Schedulersr9h j2ubah!h"ubXdeveloper/configr:h)r;}r<(hUh}r=(h]h]h]h]h]uh]r>hX Configurationr?r@}rA(hX ConfigurationrBh j;ubah!h"ubXdeveloper/webstatusrCh)rD}rE(hUh}rF(h]h]h]h]h]uh]rGhX Web StatusrHrI}rJ(hX Web StatusrKh jDubah!h"ubXmanual/cfg-statustargetsrLh)rM}rN(hUh}rO(h]h]h]h]h]uh]rPhXStatus TargetsrQrR}rS(hXStatus TargetsrTh jMubah!h"ubXmanual/customizationrUh)rV}rW(hUh}rX(h]h]h]h]h]uh]rYhX CustomizationrZr[}r\(hX Customizationr]h jVubah!h"ubXrelnotes/0.8.8r^h)r_}r`(hUh}ra(h]h]h]h]h]uh]rbhX!Release Notes for Buildbot v0.8.8rcrd}re(hX!Release Notes for Buildbot v0.8.8rfh j_ubah!h"ubXmanual/cfg-introrgh)rh}ri(hUh}rj(h]h]h]h]h]uh]rkhXConfiguring Buildbotrlrm}rn(hXConfiguring Buildbotroh jhubah!h"ubXdeveloper/databaserph)rq}rr(hUh}rs(h]h]h]h]h]uh]rthXDatabaserurv}rw(hXDatabaserxh jqubah!h"ubXmanual/cfg-buildersryh)rz}r{(hUh}r|(h]h]h]h]h]uh]r}hXBuilder Configurationr~r}r(hXBuilder Configurationrh jzubah!h"ubXmanual/cfg-buildstepsrh)r}r(hUh}r(h]h]h]h]h]uh]rhX Build Stepsrr}r(hX Build Stepsrh jubah!h"ubX manual/indexrh)r}r(hUh}r(h]h]h]h]h]uh]rhXBuildbot Manualrr}r(hXBuildbot Manualrh jubah!h"ubXdeveloper/definitionsrh)r}r(hUh}r(h]h]h]h]h]uh]rhX Definitionsrr}r(hX Definitionsrh jubah!h"ubXtutorial/firstrunrh)r}r(hUh}r(h]h]h]h]h]uh]rhX First Runrr}r(hX First Runrh jubah!h"ubXdeveloper/testsrh)r}r(hUh}r(h]h]h]h]h]uh]rhXBuildbot's Test Suiterr}r(hXBuildbot's Test Suiterh jubah!h"ubXdeveloper/classesrh)r}r(hUh}r(h]h]h]h]h]uh]rhXClassesrr}r(hXClassesrh jubah!h"ubXmanual/conceptsrh)r}r(hUh}r(h]h]h]h]h]uh]rhXConceptsrr}r(hXConceptsrh jubah!h"ubXmanual/configurationrh)r}r(hUh}r(h]h]h]h]h]uh]rhX Configurationrr}r(hX Configurationrh jubah!h"ubXdeveloper/formatsrh)r}r(hUh}r(h]h]h]h]h]uh]rhX File Formatsrr}r(hX File Formatsrh jubah!h"ubXdeveloper/cls-buildstepsrh)r}r(hUh}r(h]h]h]h]h]uh]rhX BuildStepsrr}r(hX BuildStepsrh jubah!h"ubXdeveloper/master-slaverh)r}r(hUh}r(h]h]h]h]h]uh]rhXMaster-Slave APIrr}r(hXMaster-Slave APIrh jubah!h"ubXmanual/cfg-changesourcesrh)r}r(hUh}r(h]h]h]h]h]uh]rhXChange Sourcesrr}r(hXChange Sourcesrh jubah!h"ubX tutorial/tourrh)r}r(hUh}r(h]h]h]h]h]uh]rhX A Quick Tourrr}r(hX A Quick Tourrh jubah!h"ubX*developer/cls-buildsetsummarynotifiermixinrh)r}r(hUh}r(h]h]h]h]h]uh]rhXBuildSetSummaryNotifierMixinrr}r(hXBuildSetSummaryNotifierMixinrh jubah!h"ubuU domaindatar}r(Ustdr}r(UversionrKU anonlabelsr}r(Xbuildslave-connectionsrh}Ubuildslave-connectionsrXbzrlaunchpademailmaildirsourcer jUbzrlaunchpademailmaildirsourcer X distutilshU distutilsX change-hooksr jLU change-hooksr Xwriting-new-buildstepsr jUUwriting-new-buildstepsrXadding-logobserversrjUUadding-logobserversrXstep-cvsrjUstep-cvsrXjinja-web-templatesrjCUjinja-web-templatesrXcreating-a-buildslaverjUcreating-a-buildslaverXinstalling-the-coderjUinstalling-the-coderXcommand-line-toolrhbUcommand-line-toolrXtriggering-schedulersrjUtriggering-schedulersrXstep-bzrrjUstep-bzrrX source-stampsrjU source-stampsr X(how-different-vc-systems-specify-sourcesr!jU(how-different-vc-systems-specify-sourcesr"X attr-projectr#jU attr-projectr$Xmerge-request-functionsr%jUUmerge-request-functionsr&Xbuildbot developmentr'j Ubuildbot-developmentr(Xcommon-build-propertiesr)hUcommon-build-propertiesr*X optimizationr+hU optimizationr,Xbuild-factoriesr-hUbuild-factoriesr.Xsubscribing-the-buildmasterr/jUsubscribing-the-buildmasterr0Xbuilder-priority-functionsr1jUUbuilder-priority-functionsr2Xsvncommitemailmaildirsourcer3jUsvncommitemailmaildirsourcer4Xstatus-targetsr5jLUstatus-targetsr6Xconcepts-usersr7jUconcepts-usersr8Xslave-filesystem-stepsr9jUslave-filesystem-stepsr:Xparsing-email-change-messagesr;jUparsing-email-change-messagesr<Xmail-parsing-changesourcesr=jUmail-parsing-changesourcesr>X bonsaipollerr?jU bonsaipollerr@XgerritchangesourcerAjUgerritchangesourcerBX bzr-pollerrCjU bzr-pollerrDXfactory-workdir-functionsrEjUUfactory-workdir-functionsrFXscheduling-buildsrGjUscheduling-buildsrHXattr-repositoryrIjUattr-repositoryrJXmodifying-the-database-schemarKjpUmodifying-the-database-schemarLXusing-maildirsrMjUusing-maildirsrNXperiodic-schedulerrOj1Uperiodic-schedulerrPXwithproperties-dictstylehUwithproperties-dictstyleX attr-revisionrQjU attr-revisionrRX step-sphinxrSjU step-sphinxrTXbuildbot-componentsrUjUbuildbot-componentsrVXchange-filtersrWj1Uchange-filtersrXXsetting-the-pb-port-for-slavesrYhUsetting-the-pb-port-for-slavesrZXpbchangesourcer[jUpbchangesourcer\Xlogfilesr]jUlogfilesr^Xother-buildslave-configurationr_jUother-buildslave-configurationr`Xlatent-buildslavesrah Ulatent-buildslavesrbX attr-commentsrcjU attr-commentsrdXbuildmaster-architecturereh}Ubuildmaster-architecturerfXtroubleshootingrgjUtroubleshootingrhXbasicbuildfactoryhUbasicbuildfactoryXtesting-the-config-filerijgUtesting-the-config-filerjXmaster-slave-updatesrkjUmaster-slave-updatesrlXsource-stamp-attributesrmhUsource-stamp-attributesrnUmodindexroU py-modindexUXsource-checkoutrpjUsource-checkoutrqXstarting-the-buildslaverrjUstarting-the-buildslaversX buildfactoryhU buildfactoryX svnpollerrtjU svnpollerruXsetting-propertiesrvjUsetting-propertiesrwXbzr-hookrxjUbzr-hookryXquick-tour-labelrzjUquick-tour-labelr{Xconnecting-to-the-buildmasterr|jUconnecting-to-the-buildmasterr}X schedulersr~j1U schedulersrXstep-mercurialrjUstep-mercurialrXdependent-schedulerrj1Udependent-schedulerrXf1jUf1X customizationrjUU customizationrXmulti-master-moderhUmulti-master-moderXstatus-delivery-architecturerh}Ustatus-delivery-architecturerXprioritizing-buildersrhUprioritizing-buildersrXchoosing-a-change-sourcerjUchoosing-a-change-sourcerXp4sourcerjUp4sourcerXgetting-code-labelrjUgetting-code-labelrXbuild-propertiesrjUbuild-propertiesrX interpolaterhU interpolaterXconcepts-build-slavesrjUconcepts-build-slavesrXconcepts-buildrjUconcepts-buildrXversion-control-systemsrjUversion-control-systemsrXstep-cvs-slave-siderjUstep-cvs-slave-siderXbuilder-configurationrjyUbuilder-configurationrX configurationrjU configurationrXstep-setpropertyrjUstep-setpropertyrX debug-optionsrhU debug-optionsrXbuildslave-optionsrjUbuildslave-optionsrXsetting-buildslave-inforjUsetting-buildslave-inforXbuildbot-config-directoryrhbUbuildbot-config-directoryrXmaster-service-hierarchyrhUmaster-service-hierarchyrXfirst-run-labelrjUfirst-run-labelrXbasicsvnhUbasicsvnX control-flowrh}U control-flowrXtrialhUtrialXdeveloper-databaserjpUdeveloper-databaserX factory-cpanhU factory-cpanXchange-sourcesrjUchange-sourcesrXhistory-and-philosophyrh}Uhistory-and-philosophyrX upgrading-an-existing-buildslaverjU upgrading-an-existing-buildslaverXshutdownrjUshutdownrXbuild-result-codesrhUbuild-result-codesrXtry-schedulersrj1Utry-schedulersrXnightly-schedulerrj1Unightly-schedulerrXdeveloper-reconfigurationrj:Udeveloper-reconfigurationrXcommon-requirementsrjUcommon-requirementsrXbuildsetrjUbuildsetrXgooglecodeatompollerrjUgooglecodeatompollerrXrendererrhUrendererrXshell-command-argsrjUshell-command-argsrX step-gerritrjU step-gerritrX!buildslave-version-specific-notesrjU!buildslave-version-specific-notesrX introductionrh}U introductionrX try--diffrhbUtry-diffrX interlocksrh5U interlocksrXmultiple-codebase-buildsrjUmultiple-codebase-buildsrX propertiesrhU propertiesrXchange-hooks-http-notificationsrjUchange-hooks-http-notificationsrX gitpollerrjU gitpollerrXconfig-file-formatrjgUconfig-file-formatrXforceschedulerrhUforceschedulerrXcontrib-scriptsrjUcontrib-scriptsrX gnuautoconfhU gnuautoconfX authorizationrjLU authorizationrX attr-filesrjU attr-filesrXbitbucketpullrequestpollerrjUbitbucketpullrequestpollerrUgenindexrjUX attr-codebaserjU attr-codebaserX maintenancerjU maintenancerXstep-buildepydocrjUstep-buildepydocrXbuildmaster-requirementsrjUbuildmaster-requirementsrXmerging-build-requestsrjyUmerging-build-requestsrUsearchrUsearchUXwhen-buildslaves-go-missingrh Uwhen-buildslaves-go-missingrXdatabase-specificationrhUdatabase-specificationrXconfiguring-schedulersrj1Uconfiguring-schedulersrX(upgrading-a-buildmaster-to-later-versionrjU(upgrading-a-buildmaster-to-later-versionrXcvsmaildirsourcerjUcvsmaildirsourcerXframboozle_regrjUUframboozle-regrX step-pylintrjU step-pylintrXpredefined-config-file-symbolsrjgUpredefined-config-file-symbolsrXlive-status-clientsrjUlive-status-clientsr Xsystem-architecturer h}Usystem-architecturer X step-trialr jU step-trialr X resourcesrhYU resourcesrXsource-checkout-slave-siderjUsource-checkout-slave-siderXpropertyrhUpropertyrX step-darcsrjU step-darcsrXbuild-priority-functionsrjUUbuild-priority-functionsrXstep-svnrjUstep-svnrXinput-validationrhUinput-validationrXhgpollerrjUhgpollerrXwithpropertiesrhUwithpropertiesrX!upgrading-an-existing-buildmasterr jU!upgrading-an-existing-buildmasterr!Xconcepts-build-factoriesr"jUconcepts-build-factoriesr#Xweb-authorization-frameworkr$jCUweb-authorization-frameworkr%X buildslavesh U buildslavesXfakesr&jUfakesr'Xfirst-run-docker-labelr(hUfirst-run-docker-labelr)Xstep-subunitshellcommandr*jUstep-subunitshellcommandr+Xbuildstep-common-parametersr,jUbuildstep-common-parametersr-Xtriggerable-schedulerr.j1Utriggerable-schedulerr/Xattributes-of-changesr0jUattributes-of-changesr1Xinstallation-in-a-virtualenvr2jUinstallation-in-a-virtualenvr3X step-monotoner4jU step-monotoner5X requirementsr6jU requirementsr7X access-modesr8h5U access-modesr9X step-pyflaker:jU step-pyflaker;Xanybranchschedulerr<j1Uanybranchschedulerr=Xtests-independent-of-timer>jUtests-independent-of-timer?Xpython-buildstepsr@jUpython-buildstepsrAXscheduler-singlebranchschedulerrBj1Uscheduler-singlebranchschedulerrCXlaunching-the-daemonsrDjUlaunching-the-daemonsrEX user-objectsrFjU user-objectsrGX fiveminutesrHhU fiveminutesrIXcreating-a-buildmasterrJjUcreating-a-buildmasterrKXstep-svn-slave-siderLjUstep-svn-slave-siderMXforcescheduler-parametersrNj1Uforcescheduler-parametersrOXdoing-things-with-usersrPjUdoing-things-with-usersrQX running-buildbots-tests-optionalrRjU running-buildbots-tests-optionalrSXwriting-change-sourcesrTjUUwriting-change-sourcesrUXcustomizing-svnpollerrVjUUcustomizing-svnpollerrWXnew-style-build-stepsrXhkUnew-style-build-stepsrYXmetricsrZhUmetricsr[X irc-nicknamesr\jU irc-nicknamesr]X buildrequestr^jU buildrequestr_Xemail-addressesr`jUemail-addressesraXattr-whorbjUattr-whorcXwriting-buildstep-constructorsrdjUUwriting-buildstep-constructorsreX"buildmaster-version-specific-notesrfjU"buildmaster-version-specific-notesrgXinterpolate-dictstylehUinterpolate-dictstyleXbuilderrhjUbuilderriXstep-setslaveinforjjUstep-setslaveinforkXprioritizing-buildsrljyUprioritizing-buildsrmXquickbuildfactoryhUquickbuildfactoryXstep-gitrnjUstep-gitroX users-optionsrphU users-optionsrqX build-stepsrrjU build-stepsrsuUlabelsrt}ru(jh}jXBuildSlave Connectionsj jj XBzrLaunchpadEmailMaildirSourcej jLj X Change Hooksj jUjXWriting New BuildStepsjjUjXAdding LogObserversjjjXCVSjjCjXJinja Web TemplatesjjjXCreating a buildslavejjjXInstalling the codejhbjXCommand-line TooljjjXTriggering SchedulersjjjXBzrjjj X Source Stampsj!jj"X(How Different VC Systems Specify Sourcesj#jj$XProjectj%jUj&XMerge Request Functionsj'j j(XBuildbot Developmentj)hj*XCommon Build Propertiesj+hj,X Optimizationj-hj.XBuild Factoriesj/jj0XSubscribing the Buildmasterj1jUj2XBuilder Priority Functionsj3jj4XSVNCommitEmailMaildirSourcej5jLj6XStatus Targetsj7jj8XUsersj9jj:XSlave Filesystem Stepsj;jj<XParsing Email Change Messagesj=jj>XMail-parsing ChangeSourcesj?jj@X BonsaiPollerjAjjBXGerritChangeSourcejCjjDX Bzr Pollerjh}jX Control FlowjGjjHXScheduling BuildsjIjjJX RepositoryjKjpjLXModifying the Database SchemajMjjNXUsing MaildirsjOj1jPXPeriodic Schedulerj jj!X!Upgrading an Existing BuildmasterjQjjRXRevisionjSjjTXSphinxjUjjVXBuildbot ComponentsjWj1jXXChange FiltersjYhjZXSetting the PB Port for SlavesjijgjjXTesting the Config Filej]jj^XLogfilesj_jj`XOther Buildslave Configurationjah jbXLatent BuildslavesjcjjdXCommentsjeh}jfXBuildmaster ArchitecturejgjjhXTroubleshootingj[jj\XPBChangeSourcejkjjlXUpdatesjmhjnXSource Stamp AttributesjoU py-modindexUcsphinx.locale _TranslationProxy rvcsphinx.locale mygettext rwU Module IndexrxryjwjxrzbjpjjqXSource CheckoutjrjjsXStarting the buildslavejtjjuX SVNPollerjvjjwXSetting PropertiesjxjjyXBzr Hookj|jj}XConnecting to the buildmasterj~j1jX SchedulersjjjX Mercurialjj1jXDependent SchedulerjjUjX CustomizationjhjXMulti-master modejh}jXStatus Delivery ArchitecturejhjXPrioritizing BuildersjjjXChoosing a Change SourcejjjXP4SourcejjjXGetting the codejjjXBuild PropertiesjhjX InterpolatejjjX Build SlavesjjjXBuildsjjjXVersion Control SystemsjjjXCVS (Slave-Side)jjyjXBuilder ConfigurationjjjX ConfigurationjjjX SetPropertyjhjX Debug OptionsjjjXBuildslave OptionsjjjXSetting Buildslave InfojhbjX.buildbot config directoryjhjXMaster OrganizationjjjX First RunjjpjXDatabasej@jjAXPython BuildStepsjjjXChange Sourcesjh}jXHistory and PhilosophyjjjX Upgrading an Existing BuildslavejjjXShutdownjhjXBuild Result Codesjj1jXTry Schedulersjj1jXNightly Schedulerjj:jXReconfigurationjjjXCommon RequirementsjjjX BuildSetsjjjXGoogleCodeAtomPollerjhjXRendererjjjXshelljjjXGerritjjjXVersion-specific Notesjh}jX IntroductionjhbjX try --diffjh5jX InterlocksjjjXMultiple-Codebase BuildsjhjX PropertiesjjjX!Change Hooks (HTTP Notifications)jjjX GitPollerjjgjXConfig File FormatjhjXForceSchedulerjjjXContrib ScriptsjjLjX AuthorizationjjjXFilesjhjX FlattenListjjUjvjwUIndexr{r|jwj{r}bjjjXCodebasejjjX MaintenancejjjX BuildEPYDocjjjXBuildmaster RequirementsjjyjXMerging Build RequestsjjUjvjwU Search Pager~rjwj~rbjh jXWhen Buildslaves Go MissingjhjXDatabase Specificationjj1jXConfiguring SchedulersjjjX)Upgrading a Buildmaster to Later VersionsjjjXCVSMaildirSourcejjjXPyLintjjgjXPredefined Config File Symbolsjjj XLive Status Clientsj h}j XSystem Architecturej jj XTrialjhYjX ResourcesjjjXSource Checkout (Slave-Side)jhjXPropertyjjjXDarcsjjUjXBuild Priority FunctionsjjjXSVNjhjXInput ValidationjjjXHgPollerjjjXBitbucketPullrequestPollerj"jj#XBuild Factoriesj$jCj%XWeb Authorization Frameworkj&jj'XFakesj(hj)XFirst Buildbot run with Dockerj*jj+XSubunitShellCommandj,jj-XCommon Parametersj.j1j/XTriggerable Schedulerj0jj1XChangesj2jj3XInstallation in a Virtualenvj4jj5XMonotonej6jj7X Requirementsj8h5j9X Access Modesj:jj;XPyFlakesj<j1j=XAnyBranchSchedulerj>jj?XIndependent of TimejBj1jCXSingleBranchSchedulerjDjjEXLaunching the daemonsjFjjGX User ObjectsjHhjIX3Buildbot in 5 minutes - a user-contributed tutorialjJjjKXCreating a buildmasterjLjjMXSVN (Slave-Side)jNj1jOXForceSched Parametersjzjj{X A Quick TourjRjjSX#Running Buildbot's Tests (optional)jTjUjUXWriting Change SourcesjVjUjWXCustomizing SVNPollerjXhkjYXNew-Style Build StepsjZhj[XMetricsj\jj]X IRC Nicknamesj^jj_X BuildRequestsj`jjaXEmail AddressesjbjjcXWhojdjUjeXWriting BuildStep ConstructorsjfjjgXVersion-specific NotesjEjUjFXFactory Workdir FunctionsjhjjiXBuildersjjjjkX SetSlaveInfojljyjmXPrioritizing BuildsjPjjQXDoing Things With UsersjnjjoXGitjphjqX Users OptionsjrjjsX Build StepsuU progoptionsr}r(Xbuildslave-create-slaverX --log-sizejX+cmdoption-buildslave-create-slave--log-sizerjX --log-countjX,cmdoption-buildslave-create-slave--log-countrjX--umaskjX(cmdoption-buildslave-create-slave--umaskrjX --maxdelayjX+cmdoption-buildslave-create-slave--maxdelayrjX --keepalivejX,cmdoption-buildslave-create-slave--keepaliverjX--allow-shutdownjX1cmdoption-buildslave-create-slave--allow-shutdownrjX--no-logrotatejX/cmdoption-buildslave-create-slave--no-logrotaterjX--useptyjX)cmdoption-buildslave-create-slave--useptyruUobjectsr}ruUc}r(j}rjKuUbbr}r(jKUtargetsr}r(Uchsrcr}r(X BzrPollerjXchsrc-BzrPollerrX BonsaiPollerjXchsrc-BonsaiPollerrXBzrLaunchpadEmailMaildirSourcejX$chsrc-BzrLaunchpadEmailMaildirSourcerXBitbucketPullrequestPollerjX chsrc-BitbucketPullrequestPollerrXHgPollerjXchsrc-HgPollerrXPBChangeSourcejXchsrc-PBChangeSourcerXGoogleCodeAtomPollerjXchsrc-GoogleCodeAtomPollerrX Change HooksjXchsrc-Change HooksrX GitPollerjXchsrc-GitPollerrXGerritChangeSourcejXchsrc-GerritChangeSourcerX SVNPollerjXchsrc-SVNPollerrXSVNCommitEmailMaildirSourcejX!chsrc-SVNCommitEmailMaildirSourcerXP4SourcejXchsrc-P4SourcerXCVSMaildirSourcejXchsrc-CVSMaildirSourceruUstatusr}r(X WebStatusjLXstatus-WebStatusrXIRCjLX status-IRCrXGerritStatusPushjLXstatus-GerritStatusPushrX GitHubStatusjLXstatus-GitHubStatusrX PBListenerjLXstatus-PBListenerrXHttpStatusPushjLXstatus-HttpStatusPushrX MailNotifierjLXstatus-MailNotifierrX StatusPushjLXstatus-StatusPushruUschedr}r(X Try_Userpassj1Xsched-Try_UserpassrXForceSchedulerj1Xsched-ForceSchedulerrX Try_Jobdirj1Xsched-Try_JobdirrXAnyBranchSchedulerj1Xsched-AnyBranchSchedulerrX Dependentj1Xsched-DependentrXInheritBuildParameterj1Xsched-InheritBuildParameterrXNightlyTriggerablej1Xsched-NightlyTriggerablerXBuildslaveChoiceParameterj1Xsched-BuildslaveChoiceParameterrXSingleBranchSchedulerj1Xsched-SingleBranchSchedulerrXNightlyj1X sched-NightlyrXPeriodicj1Xsched-PeriodicrX Schedulerj1Xsched-SchedulerrX Triggerablej1Xsched-TriggerablerXChoiceStringParameterj1Xsched-ChoiceStringParameterruUcfgr}r(X user_managershXcfg-user_managersrXcodebaseGeneratorhXcfg-codebaseGeneratorrX changeHorizonhXcfg-changeHorizonrX logMaxSizehXcfg-logMaxSizerX propertieshXcfg-propertiesrX schedulersj1Xcfg-schedulersrXlogCompressionLimithXcfg-logCompressionLimitrXtitlehX cfg-titlerX buildHorizonhXcfg-buildHorizonrXbuildCacheSizehXcfg-buildCacheSizerX debugPasswordhXcfg-debugPasswordrX multiMasterhXcfg-multiMasterrXstatusjLX cfg-statusrXchangeCacheSizehXcfg-changeCacheSizerXdbhXcfg-dbrXdb_urlhX cfg-db_urlrXmetricshX cfg-metricsrXlogCompressionMethodhXcfg-logCompressionMethodrX eventHorizonhXcfg-eventHorizonrXmanholehX cfg-manholerX buildbotURLhXcfg-buildbotURLrX logHorizonhXcfg-logHorizonrX protocolshX cfg-protocolsrXtitleURLhX cfg-titleURLrXlogMaxTailSizehXcfg-logMaxTailSizerX change_sourcejXcfg-change_sourcerXdb_poll_intervalhXcfg-db_poll_intervalrXrevlinkhX cfg-revlinkrXprioritizeBuildershXcfg-prioritizeBuildersrX validationhXcfg-validationrXslavesh X cfg-slavesrX mergeRequestshXcfg-mergeRequestsrXbuildersjyX cfg-buildersrXcacheshX cfg-cachesruUcmdliner}r(Xstart (buildbot)hbXcmdline-start (buildbot)rXsighuphbXcmdline-sighuprXrestart (buildslave)hbXcmdline-restart (buildslave)rX create-slavehbXcmdline-create-slaverXstop (buildslave)hbXcmdline-stop (buildslave)rXstart (buildslave)hbXcmdline-start (buildslave)rXtryhbX cmdline-tryrX statusloghbXcmdline-statuslogrX debugclienthbXcmdline-debugclientrX sendchangehbXcmdline-sendchangerX statusguihbXcmdline-statusguirXrestart (buildbot)hbXcmdline-restart (buildbot)rXstop (buildbot)hbXcmdline-stop (buildbot)rX create-masterhbXcmdline-create-masterrXuserhbX cmdline-userruUstepr}r(X FileExistsjXstep-FileExistsrX SetSlaveInfojXstep-SetSlaveInforXGitjXstep-GitrXVS2008jX step-VS2008rX FileDownloadjXstep-FileDownloadrXDarcs (Slave-Side)jXstep-Darcs (Slave-Side)rXGit (Slave-Side)jXstep-Git (Slave-Side)rXStringDownloadjXstep-StringDownloadrX FileUploadjXstep-FileUploadrXP4 (Slave-Side)jXstep-P4 (Slave-Side)rXPyLintjX step-PyLintrXCVSjXstep-CVSrXVS2003jX step-VS2003rXMaxQjX step-MaxQrXJSONStringDownloadjXstep-JSONStringDownloadrX MsBuild12jXstep-MsBuild12rX DebCowbuilderjXstep-DebCowbuilderrXTestjX step-TestrXSphinxjX step-SphinxrXSetPropertiesFromEnvjXstep-SetPropertiesFromEnvrXOPTIONSjX step-OPTIONSr XHEADjX step-HEADr X MockBuildSRPMjXstep-MockBuildSRPMr XVC12jX step-VC12r XMsBuild4jX step-MsBuild4r XMonotone (Slave-Side)jXstep-Monotone (Slave-Side)rXVC11jX step-VC11rXMasterShellCommandjXstep-MasterShellCommandrX ConfigurejXstep-ConfigurerXPyFlakesjX step-PyFlakesrXSVN (Slave-Side)jXstep-SVN (Slave-Side)rX DebLintianjXstep-DebLintianrX CopyDirectoryjXstep-CopyDirectoryrXSubunitShellCommandjXstep-SubunitShellCommandrXDirectoryUploadjXstep-DirectoryUploadrXRepojX step-ReporXVS2005jX step-VS2005rXRpmLintjX step-RpmLintrXVC6jXstep-VC6rXVC7jXstep-VC7rXVC8jXstep-VC8rXVC9jXstep-VC9rXGETjXstep-GETrXCVS (Slave-Side)jXstep-CVS (Slave-Side)r XJSONPropertiesDownloadjXstep-JSONPropertiesDownloadr!XSVNjXstep-SVNr"XDarcsjX step-Darcsr#XRobocopyjX step-Robocopyr$XBK (Slave-Side)jXstep-BK (Slave-Side)r%XBzrjXstep-Bzrr&XP4jXstep-P4r'XMTRjXstep-MTRr(X MercurialjXstep-Mercurialr)XTreeSizejX step-TreeSizer*XVS2012jX step-VS2012r+XGerritjX step-Gerritr,XMercurial (Slave-Side)jXstep-Mercurial (Slave-Side)r-XVS2013jX step-VS2013r.XCompilejX step-Compiler/XTrialjX step-Trialr0X LogRenderablejXstep-LogRenderabler1XVS2010jX step-VS2010r2XRemoveDirectoryjXstep-RemoveDirectoryr3X RemovePYCsjXstep-RemovePYCsr4X MockRebuildjXstep-MockRebuildr5XPOSTjX step-POSTr6XMultipleFileUploadjXstep-MultipleFileUploadr7X BuildEPYDocjXstep-BuildEPYDocr8XVC10jX step-VC10r9XPUTjXstep-PUTr:XRepo (Slave-Side)jXstep-Repo (Slave-Side)r;XRpmBuildjX step-RpmBuildr<X DebPbuilderjXstep-DebPbuilderr=XSetPropertyFromCommandjXstep-SetPropertyFromCommandr>X ShellCommandjXstep-ShellCommandr?XHLintjX step-HLintr@XTriggerjX step-TriggerrAX MakeDirectoryjXstep-MakeDirectoryrBXBzr (Slave-Side)jXstep-Bzr (Slave-Side)rCXMonotonejX step-MonotonerDX SetPropertyjXstep-SetPropertyrEXHTTPStepjX step-HTTPSteprFXDELETEjX step-DELETErGX VCExpress9jXstep-VCExpress9rHXPerlModuleTestjXstep-PerlModuleTestrIuuuUpyrJ}rK(j}rL(X buildbot.db.model.Model.metadatarMjpX attributeX6buildbot.process.buildstep.RemoteCommand.useLogDelayedrNh,XmethodXbuildbot.process.factory.TrialrOhXclassX:buildbot.steps.source.buildbot.steps.transfer.FileDownloadrPjXclassX2buildbot.process.buildstep.RemoteCommand.interruptrQh,XmethodXbuildbot.util.naturalSortrRjXfunctionXLbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromPropertiesrSjXclassXKbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.runMkdirrTjXmethodX1buildbot.process.buildstep.BuildStep.setStatisticrUjXmethodXbuildbot.config.errorrVj:XfunctionXbuildbot.util.datetime2epochrWjXfunctionX"buildbot.changes.pb.PBChangeSourcerXjXclassX*buildbot.process.factory.BasicBuildFactoryrYhXclassX5buildbot.steps.source.buildbot.steps.source.repo.ReporZjXclassX2buildbot.steps.source.buildbot.steps.python.Sphinxr[jXclassX#buildbot.config.MasterConfig.statusr\j:X attributeX?buildbot.steps.source.buildbot.steps.slave.SetPropertiesFromEnvr]jXclassX0buildbot.config.MasterConfig.logCompressionLimitr^j:X attributeX3buildbot.config.ReconfigurableServiceMixin.priorityr_j:X attributeX&buildbot.changes.mail.CVSMaildirSourcer`jXclassX1buildbot.steps.source.buildbot.steps.source.p4.P4rajXclassX,buildbot.process.buildstep.RemoteCommand.runrbh,XmethodX4buildbot.changes.mail.BzrLaunchpadEmailMaildirSourcercjXclassXCbuildbot.db.schedulers.SchedulersConnectorComponent.classifyChangesrdjpXmethodX-buildbot.process.buildstep.BuildStep.setBuildrejXmethodXbuildbot.status.buildset.masterrfjX attributeX'buildbot.config.MasterConfig.logMaxSizergj:X attributeXbuildbot.util.asyncSleeprhjXfunctionX@buildbot.steps.source.buildbot.steps.transfer.MultipleFileUploadrijXclassX3buildbot.process.buildstep.BuildStep.addLogObserverrjjXmethodXbuildbot.status.results.SUCCESSrkhXdataXbuildbot.util.debounce.methodrljXfunctionX2buildbot.process.buildstep.BuildStep.updateSummaryrmjXmethodX2buildbot.process.buildstep.RemoteCommand.addStderrrnh,XmethodXbuildbot.util.maildirrojUmodulerpX>buildbot.steps.source.buildbot.steps.master.MasterShellCommandrqjXclassXbuildbot.util.miscrrjjpX-buildbot.process.buildstep.RemoteCommand.logsrsh,X attributeXbuildbot.util.epoch2datetimertjXfunctionX)buildbot.config.MasterConfig.eventHorizonruj:X attributeX&buildbot.status.status_push.StatusPushrvjLXclassX0buildbot.process.buildstep.RemoteCommand.resultsrwh,XmethodX)buildbot.db.state.StateConnectorComponentrxjpXclassX)buildbot.status.buildset.summarySubscriberyjXmethodX'buildbot.config.BuilderConfig.nextBuildrzj:X attributeX3buildbot.steps.source.buildbot.steps.source.cvs.CVSr{jXclassX"buildbot.config.MasterConfig.titler|j:X attributeXgetRenderingForr}hXmethodXIbuildbot.db.buildslaves.BuildslavesConnectorComponent.getBuildslaveByNamer~jpXmethodXbuildbot.util.state.StateMixinrjXclassX)buildbot.config.MasterConfig.buildHorizonrj:X attributeX*buildbot.config.ReconfigurableServiceMixinrj:XclassX=buildbot.db.buildsets.BuildsetsConnectorComponent.addBuildsetrjpXmethodX4buildbot.schedulers.forceshed.BaseParameter.multiplerhX attributeX6buildbot.process.buildstep.BuildStep.setDefaultWorkdirrjXmethodX%buildbot.config.MasterConfig.titleURLrj:X attributeX!buildbot.config.BuilderConfig.envrj:X attributeX@buildbot.steps.source.buildbot.steps.subunit.SubunitShellCommandrjXclassXbuildbot.util.netstringsrjjpX,buildbot.db.pool.DBThreadPool.do_with_enginerjpXmethodX#buildbot.status.github.GitHubStatusrjLXclassXbuildbot.db.changesrjpjpX>buildbot.steps.source.buildbot.steps.python_twisted.RemovePYCsrjXclassX buildbot.util.sautils.sa_versionrjXfunctionX2buildbot.process.buildstep.BuildStep.haltOnFailurerjX attributeXbuildbot.configrj:jpX3buildbot.db.schedulers.SchedulersConnectorComponentrjpXclassX:buildbot.schedulers.forceshed.BaseParameter.parse_from_argrhXmethodX3buildbot.steps.source.buildbot.steps.source.bzr.BzrrjXclassXGbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStampsrjpXmethodX*buildbot.process.buildstep.BuildStep.startrjXmethodX*buildbot.config.MasterConfig.user_managersrj:X attributeX4buildbot.steps.source.buildbot.steps.python.PyFlakesrjXclassXAbuildbot.steps.source.buildbot.steps.shell.SetPropertyFromCommandrjXclassX%buildbot.db.base.DBConnectorComponentrjpXclassX+buildbot.config.BuilderConfig.mergeRequestsrj:X attributeX)buildbot.config.BuilderConfig.descriptionrj:X attributeX9buildbot.db.users.UsersConnectorComponent.identifierToUidrjpXmethodXGbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.globrjXmethodX&buildbot.config.BuilderConfig.categoryrj:X attributeX0buildbot.steps.source.buildbot.steps.source.ReporjXclassX,buildbot.schedulers.timed.NightlyTriggerablerj1XclassX*buildbot.process.buildstep.BuildStepFailedrjX exceptionX5buildbot.process.buildstep.BuildStep.getResultSummaryrjXmethodXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.reclaimBuildRequestsrjpXmethodXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.addSourceStamprjpXmethodXbuildbot.db.modelrjpjpX4buildbot.process.buildstep.LoggingBuildStep.getText2rjXmethodX buildbot.utilrjjpX3buildbot.process.buildstep.BuildStep.flunkOnFailurerjX attributeX?buildbot.steps.source.buildbot.steps.source.mercurial.MercurialrjXclassX5buildbot.changes.bitbucket.BitbucketPullrequestPollerrjXclassX1buildbot.process.buildstep.BuildStep.hasStatisticrjXmethodX*buildbot.process.buildstep.BuildStep.locksrjX attributeX$buildbot.util.maildir.MaildirServicerjXclassX+buildbot.db.builds.BuildsConnectorComponentrjpXclassXbuildbot.util.diffSetsrjXfunctionX4buildbot.util.maildir.MaildirService.messageReceivedrjXmethodX%buildbot.util.bbcollections.KeyedSetsrjXclassX!buildbot.status.mail.MailNotifierrjLXclassX>buildbot.db.changes.ChangesConnectorComponent.getRecentChangesrjpXmethodX?buildbot.db.builds.BuildsConnectorComponent.getBuildsForRequestrjpXmethodX%buildbot.config.MasterConfig.buildersrj:X attributeX%buildbot.util.state.StateMixin.masterrjX attributeXDbuildbot.steps.source.buildbot.steps.transfer.JSONPropertiesDownloadrjXclassX(buildbot.process.buildstep.RemoteCommandrh,XclassX=buildbot.db.sourcestampsets.SourceStampSetsConnectorComponentrjpXclassX+buildbot.process.buildstep.BuildStep.addURLrjXmethodX%buildbot.config.BuilderConfig.factoryrj:X attributeX0buildbot.process.buildstep.BuildStep.useProgressrjX attributeXbuildbot.util.jsonrjjpXbuildbot.db.poolrjpjpXbuildbot.status.results.FAILURErhXdataXbuildbot.config.MasterConfig.dbrj:X attributeX4buildbot.process.buildstep.BuildStep.descriptionDonerjX attributeXObuildbot.db.buildrequests.BuildRequestsConnectorComponent.completeBuildRequestsrjpXmethodX"buildbot.db.model.Model.is_currentrjpXmethodX7buildbot.steps.source.buildbot.steps.python.BuildEPYDocrjXclassX5buildbot.db.buildslaves.BuildslavesConnectorComponentrjpXclassX4buildbot.process.buildstep.LoggingBuildStep.logfilesrjX attributeXbuildbot.steps.sourcerjjpX@buildbot.steps.source.buildbot.steps.transfer.JSONStringDownloadrjXclassX4buildbot.db.users.UsersConnectorComponent.removeUserrjpXmethodX7buildbot.db.sourcestamps.SourceStampsConnectorComponentrjpXclassXbuildbot.util.lru.putrjXmethodX&buildbot.config.BuilderConfig.builddirrj:X attributeXbuildbot.db.staterjpjpX4buildbot.db.builds.BuildsConnectorComponent.addBuildrjpXmethodX!buildbot.db.connector.DBConnectorrjpXclassX+buildbot.process.buildstep.BuildStep.addLogrjXmethodX+buildbot.status.buildset.summaryUnsubscriberjXmethodX(buildbot.config.MasterConfig.multiMasterrj:X attributeXbuildbot.util.eventualrjjpX6buildbot.process.buildstep.BuildStep.getCurrentSummaryrjXmethodXDbuildbot.db.buildslaves.BuildslavesConnectorComponent.getBuildslavesrjpXmethodXbuildbot.util.lru.max_sizerjX attributeX!buildbot.util.eventual.eventuallyrjXfunctionXbuildbot.util.flattenrjXfunctionX$buildbot.changes.svnpoller.SVNPollerrjXclassX+buildbot.config.MasterConfig.logMaxTailSizerj:X attributeX2buildbot.db.users.UsersConnectorComponent.getUsersrjpXmethodXbuildbot.status.words.IRCrjLXclassX+buildbot.process.buildstep.BuildStep.failedrjXmethodX9buildbot.process.buildstep.LoggingBuildStep.createSummaryrjXmethodX*buildbot.process.factory.QuickBuildFactoryrhXclassXKbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.runRmdirrjXmethodX setPropertyrhPXmethodX)buildbot.changes.base.PollingChangeSourcerjUXclassrXbuildbot.util.lru.hitsrjX attributeXbuildbot.util.lru.refhitsrjX attributeX$buildbot.status.results.worst_statusrhXfunctionX7buildbot.steps.source.buildbot.steps.source.darcs.DarcsrjXclassX(buildbot.db.base.DBConnectorComponent.dbrjpX attributeX getPropertiesrhPXmethodX(buildbot.process.buildstep.BuildStep.runrjXmethodX(buildbot.config.MasterConfig.buildbotURLrj:X attributeX;buildbot.process.buildstep.LoggingBuildStep.evaluateCommandrjXmethodX.buildbot.process.buildstep.BuildStep.startSteprjXmethodX2buildbot.db.state.StateConnectorComponent.getStaterjpXmethodX!buildbot.process.factory.BasicSVNrhXclassX5buildbot.db.state.StateConnectorComponent.getObjectIdrjpXmethodX/buildbot.process.buildstep.BuildStep.buildslaverjX attributeX0buildbot.schedulers.forceshed.BaseParameter.namerhX attributeX&buildbot.util.sautils.InsertFromSelectrjXclassX4buildbot.db.users.UsersConnectorComponent.updateUserrjpXmethodXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimBuildRequestsrjpXmethodX2buildbot.process.buildstep.BuildStep.getStatisticsrjXmethodX3buildbot.steps.source.buildbot.steps.source.svn.SVNrjXclassX*buildbot.process.buildstep.BuildStep.buildrjX attributeX1buildbot.changes.mail.SVNCommitEmailMaildirSourcerjXclassX2buildbot.process.buildstep.RemoteCommand.addHeaderrh,XmethodXbuildbot.db.pool.DBThreadPoolrjpXclassX+buildbot.config.BuilderConfig.canStartBuildrj:X attributeX7buildbot.db.changes.ChangesConnectorComponent.getChangerjpXmethodX'buildbot.config.MasterConfig.validationrj:X attributeX3buildbot.steps.source.buildbot.steps.source.git.GitrjXclassX/buildbot.config.MasterConfig.prioritizeBuildersrj:X attributeX$buildbot.process.factory.GNUAutoconfrhXclassXbuildbot.config.BuilderConfigrj:XclassX,buildbot.process.buildstep.BuildStep.stoppedrjX attributeX8buildbot.db.users.UsersConnectorComponent.findUserByAttrrjpXmethodX2buildbot.db.state.StateConnectorComponent.setStaterjpXmethodXbuildbot.util.in_reactorrjXfunctionXbuildbot.config.ConfigErrorsrj:X exceptionX9buildbot.steps.source.buildbot.steps.master.LogRenderablerjXclassX1buildbot.process.buildstep.RemoteCommand.addToLogrh,XmethodX!buildbot.status.results.EXCEPTIONr hXdataX8buildbot.steps.source.buildbot.steps.master.SetSlaveInfor jXclassX8buildbot.process.buildstep.LoggingBuildStep.startCommandr jXmethodX3buildbot.process.buildstep.BuildStep.warnOnWarningsr jX attributeX(buildbot.config.BuilderConfig.slavenamesr j:X attributeXbuildbot.schedulers.forceshedrhjpX'buildbot.config.MasterConfig.logHorizonrj:X attributeXbuildbot.util.identifiersrjjpX3buildbot.process.buildstep.BuildStep.addCompleteLogrjXmethodX>buildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetsrjpXmethodX-buildbot.process.buildstep.BuildStep.finishedrjXmethodXbuildbot.util.lrurjjpX6buildbot.changes.gerritchangesource.GerritChangeSourcerjXclassX'buildbot.config.MasterConfig.schedulersrj:X attributeX/buildbot.process.buildstep.RemoteCommand.activerh,X attributeX-buildbot.db.buildrequests.AlreadyClaimedErrorrjpX exceptionX1buildbot.db.users.UsersConnectorComponent.getUserrjpXmethodX3buildbot.steps.source.buildbot.steps.mswin.RobocopyrjXclassX4buildbot.process.buildstep.BuildStep.flunkOnWarningsrjX attributeX"buildbot.config.BuilderConfig.namerj:X attributeXbuildbot.db.buildsrjpjpX9buildbot.db.buildrequests.BuildRequestsConnectorComponentrjpXclassX9buildbot.steps.source.buildbot.steps.python_twisted.TrialrjXclassX'buildbot.util.misc.SerializedInvocationr jXclassX5buildbot.process.buildstep.RemoteCommand.remoteUpdater!h,XmethodX<buildbot.steps.source.buildbot.steps.transfer.StringDownloadr"jXclassX%buildbot.status.web.baseweb.WebStatusr#jLXclassX buildbot.db.pool.DBThreadPool.dor$jpXmethodX*buildbot.config.MasterConfig.mergeRequestsr%j:X attributeX2buildbot.process.buildstep.BuildStep.warnOnFailurer&jX attributeX8buildbot.db.builds.BuildsConnectorComponent.finishBuildsr'jpXmethodX/buildbot.process.buildstep.RemoteCommand.stdoutr(h,X attributeX1buildbot.schedulers.forceshed.BaseParameter.regexr)hX attributeX buildbot.status.results.WARNINGSr*hXdataX)buildbot.process.buildstep.BuildStep.namer+jX attributeX-buildbot.process.buildstep.RemoteShellCommandr,h,XclassX'buildbot.util.state.StateMixin.getStater-jXmethodXbuildbot.util.stater.jjpX+buildbot.config.MasterConfig.change_sourcesr/j:X attributeX.buildbot.process.buildstep.BuildStep.interruptr0jXmethodX+buildbot.process.buildstep.BuildStep.getLogr1jXmethodX0buildbot.schedulers.forceshed.BaseParameter.typer2hX attributeX"buildbot.process.factory.Distutilsr3hXclassXbuildbot.util.bbcollectionsr4jjpX4buildbot.process.buildstep.BuildStep.progressMetricsr5jX attributeX4buildbot.db.builds.BuildsConnectorComponent.getBuildr6jpXmethodX0buildbot.util.netstrings.NetstringParser.stringsr7jX attributeX%buildbot.util.debounce.Debouncer.stopr8jXmethodX6buildbot.process.buildstep.RemoteCommand.remote_updater9h,XmethodXJbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestsr:jpXmethodXPbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimExpiredRequestsr;jpXmethodXbuildbot.util.makeListr<jXfunctionX1buildbot.util.maildir.MaildirService.moveToCurDirr=jXmethodX;buildbot.schedulers.forceshed.BaseParameter.parse_from_argsr>hXmethodX#buildbot.config.ConfigErrors.errorsr?j:X attributeX%buildbot.config.ConfigErrors.addErrorr@j:XmethodX1buildbot.process.buildstep.BuildStep.getStatisticrAjXmethodX&buildbot.util.identifiers.isIdentifierrBjXfunctionX2buildbot.process.buildstep.RemoteCommand.addStdoutrCh,XmethodX$buildbot.config.MasterConfig.metricsrDj:X attributeXNbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromChangeSourcerEjXclassX!buildbot.util.misc.deferredLockedrFjXfunctionX1buildbot.process.buildstep.BuildStep.getSlaveNamerGjXmethodX"buildbot.changes.base.ChangeSourcerHjUXclassrIXbuildbot.db.sourcestampsetsrJjpjpX&buildbot.util.debounce.Debouncer.startrKjXmethodX*buildbot.config.MasterConfig.changeHorizonrLj:X attributeX1buildbot.config.MasterConfig.logCompressionMethodrMj:X attributeX1buildbot.db.buildsets.BuildsetsConnectorComponentrNjpXclassXbuildbot.db.sourcestampsrOjpjpX'buildbot.config.MasterConfig.propertiesrPj:X attributeX1buildbot.schedulers.forceshed.BaseParameter.labelrQhX attributeX.buildbot.process.buildstep.BuildStep.alwaysRunrRjX attributeX0buildbot.process.buildstep.BuildStep.setProgressrSjXmethodX2buildbot.process.buildstep.BuildStep.setBuildSlaverTjXmethodX)buildbot.db.users.UsersConnectorComponentrUjpXclassX2buildbot.process.buildstep.BuildStep.setupProgressrVjXmethodXbuildbot.util.lru.missesrWjX attributeX8buildbot.steps.source.buildbot.steps.transfer.FileUploadrXjXclassX'buildbot.util.bbcollections.defaultdictrYjXclassXbuildbot.util.ComparableMixinrZjXclassX4buildbot.steps.source.buildbot.steps.shell.Configurer[jXclassXbuildbot.util.lru.getr\jXmethodXbuildbot.status.resultsr]hjpX-buildbot.process.buildstep.BuildStep.doStepIfr^jX attributeXbuildbot.db.model.Modelr_jpXclassXbuildbot.util.NotABranchr`jXdataX-buildbot.db.changes.ChangesConnectorComponentrajpXclassX;buildbot.db.users.UsersConnectorComponent.getUserByUsernamerbjpXmethodX<buildbot.schedulers.forceshed.BaseParameter.updateFromKwargsrchXmethodX'buildbot.config.BuilderConfig.nextSlaverdj:X attributeX4buildbot.schedulers.forceshed.BaseParameter.fullNamerehXmethodX0buildbot.process.buildstep.RemoteCommand.didFailrfh,XmethodXMbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.pathExistsrgjXmethodX9buildbot.steps.source.buildbot.steps.source.gerrit.GerritrhjXclassX+buildbot.config.BuilderConfig.slavebuilddirrij:X attributeX3buildbot.process.buildstep.LoggingBuildStep.getTextrjjXmethodXbuildbot.util.lru.invrkjXmethodX!buildbot.status.client.PBListenerrljLXclassX.buildbot.config.MasterConfig.codebaseGeneratorrmj:X attributeXbuildbot.db.connectorrnjpjpXBbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixinrojXclassX buildbot.util.debounce.DebouncerrpjXclassXObuildbot.db.sourcestampsets.SourceStampSetsConnectorComponent.addSourceStampSetrqjpXmethodX7buildbot.process.buildstep.RemoteCommand.remoteCompleterrh,XmethodX6buildbot.process.buildstep.BuildStep.descriptionSuffixrsjX attributeX/buildbot.util.maildir.MaildirService.setBasedirrtjXmethodX*buildbot.config.MasterConfig.debugPasswordruj:X attributeX'buildbot.config.MasterConfig.loadConfigrvj:X classmethodX9buildbot.schedulers.forceshed.BaseParameter.getFromKwargsrwhXmethodX&buildbot.config.MasterConfig.protocolsrxj:X attributeX#buildbot.config.MasterConfig.cachesryj:X attributeXbuildbot.process.buildsteprzjjpX)buildbot.db.buildrequests.NotClaimedErrorr{jpX exceptionX:buildbot.config.ReconfigurableServiceMixin.reconfigServicer|j:XmethodXbuildbot.db.buildslavesr}jpjpXbuildbot.config.MasterConfigr~j:XclassXbuildbot.util.none_or_strrjXfunctionX hasPropertyrhPXmethodX=buildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetrjpXmethodXLbuildbot.db.buildrequests.BuildRequestsConnectorComponent.claimBuildRequestsrjpXmethodXbuildbot.util.debouncerjjpXbuildbot.db.buildsetsrjpjpXbuildbot.db.baserjpjpXbuildbot.status.logfile.LogFilerjXclassX%buildbot.util.eventual.fireEventuallyrjXfunctionX?buildbot.db.changes.ChangesConnectorComponent.getLatestChangeidrjpXmethodX=buildbot.steps.source.buildbot.steps.transfer.DirectoryUploadrjXclassX7buildbot.steps.source.buildbot.steps.shell.ShellCommandrjXclassXbuildbot.db.buildrequestsrjpjpX<buildbot.process.buildstep.BuildStep.slaveVersionIsOlderThanrjXmethodX.buildbot.status.status_gerrit.GerritStatusPushrjLXclassXbuildbot.util.sautilsrjjpX+buildbot.process.buildstep.RemoteCommand.rcrh,X attributeXbuildbot.db.usersrjpjpX)buildbot.util.identifiers.forceIdentifierrjXfunctionXbuildbot.status.results.RETRYrhXdataXbuildbot.util.safeTranslaterjXfunctionX+buildbot.process.buildstep.LoggingBuildSteprjXclassX-buildbot.util.identifiers.incrementIdentifierrjXfunctionXbuildbot.status.results.ResultsrhXdataX/buildbot.process.buildstep.BuildStep.runCommandrjXmethodXBbuildbot.db.buildsets.BuildsetsConnectorComponent.completeBuildsetrjpXmethodX$buildbot.process.buildstep.BuildSteprjXclassXGbuildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetPropertiesrjpXmethodX4buildbot.schedulers.forceshed.BaseParameter.requiredrhX attributeX#buildbot.config.MasterConfig.slavesrj:X attributeX(buildbot.config.BuilderConfig.propertiesrj:X attributeX/buildbot.process.buildstep.BuildStep.addHTMLLogrjXmethodXbuildbot.process.factory.CPANrhXclassX(buildbot.util.netstrings.NetstringParserrjXclassX;buildbot.process.buildstep.LoggingBuildStep.commandCompleterjXmethodX getPropertyrhPXmethodXbuildbot.db.base.cachedrjpXfunctionX;buildbot.db.changes.ChangesConnectorComponent.getChangeUidsrjpXmethodXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStamprjpXmethodXbuildbot.util.nowrjXfunctionXFbuildbot.db.buildslaves.BuildslavesConnectorComponent.updateBuildslaverjpXmethodX/buildbot.process.buildstep.BuildStep.hideStepIfrjX attributeXLbuildbot.db.schedulers.SchedulersConnectorComponent.getChangeClassificationsrjpXmethodX#buildbot.config.BuilderConfig.locksrj:X attributeX8buildbot.process.buildstep.RemoteCommand.remote_completerh,XmethodX@buildbot.process.buildstep.buildbot.process.buildstep.ShellMixinrjXclassX$buildbot.config.MasterConfig.manholerj:X attributeX-buildbot.process.buildstep.BuildStep.describerjXmethodX,buildbot.status.buildset.sendBuildSetSummaryrjXmethodX-buildbot.util.netstrings.NetstringParser.feedrjXmethodXIbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestrjpXmethodX3buildbot.schedulers.forceshed.BaseParameter.defaultrhX attributeXbuildbot.util.UTCrjXdataX1buildbot.process.buildstep.BuildStep.slaveVersionrjXmethodX)buildbot.util.eventual.flushEventualQueuerjXfunctionX8buildbot.steps.source.buildbot.steps.source.mtn.MonotonerjXclassX#buildbot.util.state.StateMixin.namerjX attributeXbuildbot.status.results.SKIPPEDrhXdataX+buildbot.schedulers.forceshed.BaseParameterrhXclassX7buildbot.steps.source.buildbot.steps.master.SetPropertyrjXclassXbuildbot.db.model.Model.upgraderjpXmethodX/buildbot.process.buildstep.RemoteCommand.useLogrh,XmethodX-buildbot.process.buildstep.BuildStep.progressrjX attributeX0buildbot.process.buildstep.BuildStep.descriptionrjX attributeXbuildbot.util.formatIntervalrjXfunctionXbuildbot.db.schedulersrjpjpX7buildbot.db.changes.ChangesConnectorComponent.addChangerjpXmethoduUmodulesr}r(j(jpUUtj(jpUUtjz(jUUtj(jUUtjO(jpUUtj}(jpUUtj(jUUtj(jUUtj(hUUtj(jpUUtj(jUUtjo(jUUtj(jUUtj(jpUUtjr(jUUtj.(jUUtj(jpUUtj(jUUtjn(jpUUtj(jUUtj4(jUUtj(jUUtj(jpUUtj(jpUUtjJ(jpUUtj(jpUUtj](hUUtj(j:UUtj(jpUUtj(jpUUtj(jUUtujKuUjsr}r(j}rjKuUrstr}r(j}rjKuUcppr}r(j}rjKuuU glob_toctreesrh]RrU reread_alwaysrh]RrU doctreedirrXX/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/_build/localmedia/.doctreesrUversioning_conditionrU citationsr}jK*Utodo_all_todosr]r(}r(UdocnamerjUsourcercdocutils.nodes reprunicode rXR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/classes.rstrr}rbUtodorcsphinx.ext.todo todo_node r)r}r(hXcls-logobserverrh}r(h]h]rUadmonition-todorah]h]uh]r(h)r}r(hXTodorh}r(h]h]h]h]h]uh jh]rhXTodorr}r(hjh jubah!h"ubcdocutils.nodes paragraph r)r}r(hjh}r(h]h]h]h]h]uh jh]rhXcls-logobserverrr}r(hjh jubah!U paragraphrubeh!U todo_noderubUlinenorKUtargetrcdocutils.nodes target r)r}r(hUh cdocutils.nodes section r)r}r(hUh cdocutils.nodes document r)r}r(U nametypesr}rXclassesrNsUsubstitution_defsr}rUparse_messagesr ]r Ucurrent_sourcer NU decorationr NUautofootnote_startr KUnameidsr}rjUclassesrsh]rjahUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rj]rUdocumentrjU current_linerNUtransform_messagesr ]r!cdocutils.nodes system_message r")r#}r$(hUh}r%(h]UlevelKh]h]Usourcejh]h]UtypeUINFOr&uh]r'j)r(}r)(hUh}r*(h]h]h]h]h]uh j#h]r+hX-Hyperlink target "index-0" is not referenced.r,r-}r.(hUh j(ubah!jubah!Usystem_messager/ubaUreporterr0NUid_startr1KU autofootnotesr2]r3U citation_refsr4}r5Uindirect_targetsr6]r7Usettingsr8(cdocutils.frontend Values r9or:}r;(Ufootnote_backlinksr<KUrecord_dependenciesr=NU rfc_base_urlr>Uhttp://tools.ietf.org/html/r?U tracebackr@Upep_referencesrANUstrip_commentsrBNU toc_backlinksrCUentryrDU language_coderEUenrFU datestamprGNU report_levelrHKU _destinationrINU halt_levelrJKU strip_classesrKNh"NUerror_encoding_error_handlerrLUbackslashreplacerMUdebugrNNUembed_stylesheetrOUoutput_encoding_error_handlerrPUstrictrQU sectnum_xformrRKUdump_transformsrSNU docinfo_xformrTKUwarning_streamrUNUpep_file_url_templaterVUpep-%04drWUexit_status_levelrXKUconfigrYNUstrict_visitorrZNUcloak_email_addressesr[Utrim_footnote_reference_spacer\Uenvr]NUdump_pseudo_xmlr^NUexpose_internalsr_NUsectsubtitle_xformr`U source_linkraNUrfc_referencesrbNUoutput_encodingrcUutf-8rdU source_urlreNUinput_encodingrfU utf-8-sigrgU_disable_configrhNU id_prefixriUU tab_widthrjKUerror_encodingrkUUTF-8rlU_sourcermUR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/classes.rstUgettext_compactrnU generatorroNUdump_internalsrpNU smart_quotesrqU pep_base_urlrrUhttp://www.python.org/dev/peps/rsUsyntax_highlightrtUlongruUinput_encoding_error_handlerrvjQUauto_id_prefixrwUidrxUdoctitle_xformryUstrip_elements_with_classesrzNU _config_filesr{]Ufile_insertion_enabledr|U raw_enabledr}KU dump_settingsr~NubUsymbol_footnote_startrKUidsr}r(jjUindex-0rj)r}r(hjh jjjUexpect_referenced_by_namer}h!jh}r(h]h]rjah]h]rjah]uUlinerKjjUexpect_referenced_by_idr}rjjsh]r(h)r}r(hjh}r(h]h]h]h]h]uh jh]rhXTodorr}r(hjh jubah!h"ubj)r}r(hjh jjjh!jh}r(h]h]h]h]h]ujKh]rhXcls-logobserverrr}r(hjh jubaubeubuUsubstitution_namesr}rh!jh}r(h]h]h]Usourcejh]h]uU footnotesr]rUrefidsr}rj]rjasubjjh!Usectionrh}r(h]h]h]h]rjah]rjaujKjjh]r(h)r}r(hjh jjjh!h"h}r(h]h]h]h]h]ujKjjh]rhXClassesrr}r(hjh jubaubj)r}r(hXLThe sections contained here document classes that can be used or subclassed.rh jjjh!jh}r(h]h]h]h]h]ujKjjh]rhXLThe sections contained here document classes that can be used or subclassed.rr}r(hjh jubaubcdocutils.nodes note r)r}r(hXSome of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.h jjjh!Unoterh}r(h]h]h]h]h]ujNjjh]rj)r}r(hXSome of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.rh jjjh!jh}r(h]h]h]h]h]ujKh]rhXSome of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.rr}r(hjh jubaubaubcdocutils.nodes compound r)r}r(hUh jjjh!Ucompoundrh}r(h]h]rUtoctree-wrapperrah]h]h]ujNjjh]rcsphinx.addnodes toctree r)r}r(hUh jjjh!Utoctreerh}r(UnumberedrKU includehiddenrh jU titlesonlyrUglobrh]h]h]h]h]Uentriesr]r(NXdeveloper/cls-buildfactoryrrNX*developer/cls-buildsetsummarynotifiermixinrrNXdeveloper/cls-remotecommandsrrNXdeveloper/cls-buildstepsrrNXdeveloper/cls-forceschedrrNXdeveloper/cls-irenderablerrNXdeveloper/cls-ipropertiesrreUhiddenrU includefilesr]r(jjjjjjjeUmaxdepthrKujK h]ubaubjjeubjjh!jh}r(h]h]h]h]h]UrefidrjujNjjh]ubu}r(jhbjjXO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cmdline.rstrr}rbjj)r}r(hXI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.rh}r(h]h]rUadmonition-todorah]h]uh]r(h)r}r(hXTodorh}r(h]h]h]h]h]uh jh]rhXTodorr}r(hjh jubah!h"ubj)r}r(hXI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.rh}r(h]h]h]h]h]uh jh]rhXI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.rr}r(hjh jubah!jubeh!jubjMjj)r}r(hUh j)r }r (hUh j)r }r (hUh j)r }r(hUh j)r}r(hUh j)r}r(hUh j)r}r(j}r(Xwaiting for resultsrNXbuildbotrNjX buildslaverNX statusguirNXadministrator toolsrNXpatch informationrNjXspecifying the vc systemrNXstartrNXsending propertiesrNX sendchangerNX create-masterr NXdeveloper toolsr!NXcommand-line toolr"NXsighupr#NXstopr$NX statuslogr%NX debugclientr&NXuserr'NX other toolsr(NX"determining the revision and patchr)NXrestartr*NXlocating the masterr+NjXtryr,NX create-slaver-NX try --diffr.NXchoosing the buildersr/NXdetermining the branch namer0NX.buildbot config directoryr1NXfinding the top of the treer2Nuj}r3j ]r4(j")r5}r6(hUh j)r7}r8(hUU referencedr9Kh j)r:}r;(hUh jjjh!jh}r<(h]h]h]h]r=U buildslaver>ah]r?jaujMjjh]r@(h)rA}rB(hX buildslaverCh j:jjh!h"h}rD(h]h]h]h]h]ujMjjh]rEhX buildslaverFrG}rH(hjCh jAubaubj)rI}rJ(hX:command:`buildslave` command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.h j:jjh!jh}rK(h]h]h]h]h]ujMjjh]rL(cdocutils.nodes strong rM)rN}rO(hX:command:`buildslave`h}rP(h]h]rQUcommandrRah]h]h]uh jIh]rShX buildslaverTrU}rV(hUh jNubah!UstrongrWubhX command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.rXrY}rZ(hX command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.h jIubeubcsphinx.addnodes index r[)r\}r](hUh j:jjh!Uindexr^h}r_(h]h]h]h]h]Uentries]r`((UsingleX&Command Line Subcommands; create-slavejjtra(UsingleX$create-slave Command Line SubcommandjjtrbeujMjjh]ubj)rc}rd(hUh j:jjh!jh}re(h]h]h]h]h]jjujMjjh]ubj)rf}rg(hUh j:jjj}h!jh}rh(h]h]h]h]ri(U create-slaverjjeh]rkj-aujMjjj}rljjcsh]rm(h)rn}ro(hX create-slaverph jfjjh!h"h}rq(h]h]h]h]h]ujMjjh]rrhX create-slaversrt}ru(hjph jnubaubj)rv}rw(hXThis creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial :file:`buildbot.tac` file.h jfjjh!jh}rx(h]h]h]h]h]ujMjjh]ry(hXThis creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial rzr{}r|(hXThis creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial h jvubcdocutils.nodes literal r})r~}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jvh]rhX buildbot.tacrr}r(hX buildbot.tach j~ubah!UliteralrubhX file.rr}r(hX file.h jvubeubj)r}r(hXKThe :option:`-r` option is advisable here, just like for ``create-master``.h jfjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXThe rr}r(hXThe h jubcsphinx.addnodes pending_xref r)r}r(hX :option:`-r`rh jjjh!U pending_xrefrh}r(UreftypeXoptionUrefwarnrU reftargetrX-rU refdomainXstdrU refprogramrNh]h]U refexplicith]h]h]UrefdocrhbujMh]rcsphinx.addnodes literal_emphasis r)r}r(hjh}r(h]h]r(UxrefrjX std-optionreh]h]h]uh jh]rhX-rrr}r(hUh jubah!Uliteral_emphasisrubaubhX) option is advisable here, just like for rr}r(hX) option is advisable here, just like for h jubj})r}r(hX``create-master``h}r(h]h]h]h]h]uh jh]rhX create-masterrr}r(hUh jubah!jubhX.r}r(hX.h jubeubcdocutils.nodes literal_block r)r}r(hXObuildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}h jfjjh!U literal_blockrh}r(UlinenosrUlanguagerXnoneU xml:spacerUpreserverh]h]h]h]h]ujMjjh]rhXObuildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}rr}r(hUh jubaubj)r}r(hXDThe create-slave options are described in :ref:`Buildslave-Options`.h jfjjh!jh}r(h]h]h]h]h]ujMjjh]r(hX*The create-slave options are described in rr}r(hX*The create-slave options are described in h jubj)r}r(hX:ref:`Buildslave-Options`rh jjjh!jh}r(UreftypeXrefjjXbuildslave-optionsU refdomainXstdrh]h]U refexplicith]h]h]jhbujMh]rcdocutils.nodes emphasis r)r}r(hjh}r(h]h]r(jjXstd-refreh]h]h]uh jh]rhXBuildslave-Optionsrr}r(hUh jubah!UemphasisrubaubhX.r}r(hX.h jubeubj[)r}r(hUh jfjjh!j^h}r(h]h]h]h]h]Uentries]r((UsingleX,Command Line Subcommands; start (buildslave)jjtr(UsingleX*start (buildslave) Command Line SubcommandjjtreujMjjh]ubj)r}r(hUh jfjjh!jh}r(h]h]h]h]h]jjujMjjh]ubeubj7j)r}r(hUj9Kh j:jjj}h!jh}r(h]rXrestartrah]h]h]r(jUid5reh]ujMjjj}rjj)r}r(hUh j7jjh!jh}r(h]h]h]h]h]jjujMjjh]ubsh]r(h)r}r(hXrestartrh jjjh!h"h}r(h]h]h]h]h]ujMjjh]rhXrestartrr}r(hjh jubaubj)r}r(hX'buildslave restart [--nodaemon] BASEDIRh jjjh!jh}r(jjXnonejjh]h]h]h]h]ujMjjh]rhX'buildslave restart [--nodaemon] BASEDIRrr}r(hUh jubaubj)r}r(hXlThis restarts a buildslave which is already running. It is equivalent to a ``stop`` followed by a ``start``.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXKThis restarts a buildslave which is already running. It is equivalent to a rr}r(hXKThis restarts a buildslave which is already running. It is equivalent to a h jubj})r}r (hX``stop``h}r (h]h]h]h]h]uh jh]r hXstopr r }r(hUh jubah!jubhX followed by a rr}r(hX followed by a h jubj})r}r(hX ``start``h}r(h]h]h]h]h]uh jh]rhXstartrr}r(hUh jubah!jubhX.r}r(hX.h jubeubj)r}r(hXFThe :option:`--nodaemon` option has the same meaning as for ``start``.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXThe rr }r!(hXThe h jubj)r"}r#(hX:option:`--nodaemon`r$h jjjh!jh}r%(UreftypeXoptionjjX --nodaemonU refdomainXstdr&jNh]h]U refexplicith]h]h]jhbujMh]r'j)r(}r)(hj$h}r*(h]h]r+(jj&X std-optionr,eh]h]h]uh j"h]r-hX --nodaemonr.r/}r0(hUh j(ubah!jubaubhX$ option has the same meaning as for r1r2}r3(hX$ option has the same meaning as for h jubj})r4}r5(hX ``start``h}r6(h]h]h]h]h]uh jh]r7hXstartr8r9}r:(hUh j4ubah!jubhX.r;}r<(hX.h jubeubj[)r=}r>(hUh jjjh!j^h}r?(h]h]h]h]h]Uentries]r@((UsingleX+Command Line Subcommands; stop (buildslave)jjtrA(UsingleX)stop (buildslave) Command Line SubcommandjjtrBeujMjjh]ubj)rC}rD(hUh jjjh!jh}rE(h]h]h]h]h]jjujMjjh]ubeubj)rF}rG(hUj9Kh j:jjj}h!jh}rH(h]rIXstoprJah]h]h]rK(jUid6rLeh]ujMjjj}rMjjCsh]rN(h)rO}rP(hXstoprQh jFjjh!h"h}rR(h]h]h]h]h]ujMjjh]rShXstoprTrU}rV(hjQh jOubaubj)rW}rX(hXEThis terminates the daemon buildslave running in the given directory.rYh jFjjh!jh}rZ(h]h]h]h]h]ujMjjh]r[hXEThis terminates the daemon buildslave running in the given directory.r\r]}r^(hjYh jWubaubj)r_}r`(hXbuildbot stop BASEDIRh jFjjh!jh}ra(jjXnonejjh]h]h]h]h]ujMjjh]rbhXbuildbot stop BASEDIRrcrd}re(hUh j_ubaubeubeubjjj}h!jh}rf(h]rgXstartrhah]h]h]ri(jUid4rjeh]ujMjjj}rkjjsh]rl(h)rm}rn(hXstartroh j7jjh!h"h}rp(h]h]h]h]h]ujMjjh]rqhXstartrrrs}rt(hjoh jmubaubj)ru}rv(hXThis starts a buildslave which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named :file:`twistd.log`.h j7jjh!jh}rw(h]h]h]h]h]ujMjjh]rx(hXThis starts a buildslave which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named ryrz}r{(hXThis starts a buildslave which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named h juubj})r|}r}(hUh}r~(h]h]h]h]rXfileraUrolejh]uh juh]rhX twistd.logrr}r(hX twistd.logh j|ubah!jubhX.r}r(hX.h juubeubj)r}r(hX%buildslave start [--nodaemon] BASEDIRh j7jjh!jh}r(jjXnonejjh]h]h]h]h]ujMjjh]rhX%buildslave start [--nodaemon] BASEDIRrr}r(hUh jubaubj)r}r(hXThe :option:`--nodaemon` option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.h j7jjh!jh}r(h]h]h]h]h]ujMjjh]r(hXThe rr}r(hXThe h jubj)r}r(hX:option:`--nodaemon`rh jjjh!jh}r(UreftypeXoptionjjX --nodaemonU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --nodaemonrr}r(hUh jubah!jubaubhX option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.rr}r(hX option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.h jubeubj[)r}r(hUh j7jjh!j^h}r(h]h]h]h]h]Uentries]r((UsingleX.Command Line Subcommands; restart (buildslave)jjtr(UsingleX,restart (buildslave) Command Line SubcommandjjtreujMjjh]ubjeubjjh!j/h}r(h]UlevelKh]h]rjjaUsourcejh]h]UlineMUtypej&ujMjjh]rj)r}r(hUh}r(h]h]h]h]h]uh j5h]rhX(Duplicate implicit target name: "start".rr}r(hUh jubah!jubaubj")r}r(hUh jjjh!j/h}r(h]UlevelKh]h]rjaUsourcejh]h]UlineMUtypej&ujMjjh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX*Duplicate implicit target name: "restart".rr}r(hUh jubah!jubaubj")r}r(hUh jFjjh!j/h}r(h]UlevelKh]h]rjLaUsourcejh]h]UlineMUtypej&ujMjjh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX'Duplicate implicit target name: "stop".rr}r(hUh jubah!jubaubej Nj Nj Kj}r(jUwaiting-for-resultsrjUbuildbotrjjjj>jU statusguirjUadministrator-toolsrjUpatch-informationrjjjUspecifying-the-vc-systemrjNjUsending-propertiesrjU sendchangerj U create-masterrj!Udeveloper-toolsrj"Uid1rj#Usighuprj$Nj%U statuslogrj&U debugclientrj'Uuserrj(U other-toolsrj)U"determining-the-revision-and-patchrj*Nj+Ulocating-the-masterrjjj,Utryrj-jjj.Uid2rj/Uchoosing-the-buildersrj0Udetermining-the-branch-namerj1Uid3rj2Ufinding-the-top-of-the-treeruh]r(j)r}r(hX.. _Command-line-Tool:h jjjh!jh}r(h]h]h]h]h]jjujKjjh]ubjehUjNj}rj}rj]rj]rj]rj]rjjjNj ]r(j")r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKUtypej&uh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX7Hyperlink target "command-line-tool" is not referenced.rr}r(hUh jubah!jubah!j/ubj")r}r(hUh}r (h]UlevelKh]h]Usourcejh]h]UlineKAUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh jh]r hX;Hyperlink target "cmdline-create-master" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineKOUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX>Hyperlink target "cmdline-start (buildbot)" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineK_Utypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX@Hyperlink target "cmdline-restart (buildbot)" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r! (h]UlevelKh]h]Usourcejh]h]UlineKlUtypej&uh]r" j)r# }r$ (hUh}r% (h]h]h]h]h]uh j h]r& hX=Hyperlink target "cmdline-stop (buildbot)" is not referenced.r' r( }r) (hUh j# ubah!jubah!j/ubj")r* }r+ (hUh}r, (h]UlevelKh]h]Usourcejh]h]UlineKxUtypej&uh]r- j)r. }r/ (hUh}r0 (h]h]h]h]h]uh j* h]r1 hX4Hyperlink target "cmdline-sighup" is not referenced.r2 r3 }r4 (hUh j. ubah!jubah!j/ubj")r5 }r6 (hUh}r7 (h]UlevelKh]h]Usourcejh]h]UlineKUtypej&uh]r8 j)r9 }r: (hUh}r; (h]h]h]h]h]uh j5 h]r< hX7Hyperlink target "cmdline-statuslog" is not referenced.r= r> }r? (hUh j9 ubah!jubah!j/ubj")r@ }rA (hUh}rB (h]UlevelKh]h]Usourcejh]h]UlineKUtypej&uh]rC j)rD }rE (hUh}rF (h]h]h]h]h]uh j@ h]rG hX7Hyperlink target "cmdline-statusgui" is not referenced.rH rI }rJ (hUh jD ubah!jubah!j/ubj")rK }rL (hUh}rM (h]UlevelKh]h]Usourcejh]h]UlineKUtypej&uh]rN j)rO }rP (hUh}rQ (h]h]h]h]h]uh jK h]rR hX1Hyperlink target "cmdline-try" is not referenced.rS rT }rU (hUh jO ubah!jubah!j/ubj")rV }rW (hUh}rX (h]UlevelKh]h]Usourcejh]h]Utypej&uh]rY j)rZ }r[ (hUh}r\ (h]h]h]h]h]uh jV h]r] hX-Hyperlink target "index-0" is not referenced.r^ r_ }r` (hUh jZ ubah!jubah!j/ubj")ra }rb (hUh}rc (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]rd j)re }rf (hUh}rg (h]h]h]h]h]uh ja h]rh hX.Hyperlink target "try-diff" is not referenced.ri rj }rk (hUh je ubah!jubah!j/ubj")rl }rm (hUh}rn (h]UlevelKh]h]Usourcejh]h]UlineM Utypej&uh]ro j)rp }rq (hUh}rr (h]h]h]h]h]uh jl h]rs hX8Hyperlink target "cmdline-sendchange" is not referenced.rt ru }rv (hUh jp ubah!jubah!j/ubj")rw }rx (hUh}ry (h]UlevelKh]h]Usourcejh]h]UlineM\Utypej&uh]rz j)r{ }r| (hUh}r} (h]h]h]h]h]uh jw h]r~ hX9Hyperlink target "cmdline-debugclient" is not referenced.r r }r (hUh j{ ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX2Hyperlink target "cmdline-user" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX?Hyperlink target "buildbot-config-directory" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX:Hyperlink target "cmdline-create-slave" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX@Hyperlink target "cmdline-start (buildslave)" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hXBHyperlink target "cmdline-restart (buildslave)" is not referenced.r r }r (hUh j ubah!jubah!j/ubj")r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypej&uh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX?Hyperlink target "cmdline-stop (buildslave)" is not referenced.r r }r (hUh j ubah!jubah!j/ubej0Nj1Kj2]r j4}r j6]r j8(j9or }r (j<Kj=Nj>j?j@jANjBNjCjDjEjFjGNjHKjINjJKjKNh"NjLjMjNNjOjPjQjRKjSNjTKjUNjVjWjXKjYNjZNj[j\j]Nj^Nj_Nj`jaNjbNjcjdjeNjfjgjhNjiUjjKjkjljmUO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cmdline.rstjnjoNjpNjqjrjsjtjujvjQjwjxjyjzNj{]j|j}Kj~NubjKj}r (jj jj)r }r (hUh j jjh!jh}r (h]h]h]h]r jah]r jaujMjjh]r (h)r }r (hXpatch informationr h j jjh!h"h}r (h]h]h]h]h]ujMjjh]r hXpatch informationr r }r (hj h j ubaubj)r }r (hX?You can provide the :option:`--who=dev` to designate who is running the try build. This will add the ``dev`` to the Reason field on the try build's status web page. You can also set ``try_who = dev`` in the :file:`.buildbot/options` file. Note that :option:`--who=dev` will not work on version 0.8.3 or earlier masters.h j jjh!jh}r (h]h]h]h]h]ujMjjh]r (hXYou can provide the r r }r (hXYou can provide the h j ubj)r }r (hX:option:`--who=dev`r h j jjh!jh}r (UreftypeXoptionjjX --who=devU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --who=devr r }r (hUh j ubah!jubaubhX> to designate who is running the try build. This will add the r r }r (hX> to designate who is running the try build. This will add the h j ubj})r }r (hX``dev``h}r (h]h]h]h]h]uh j h]r hXdevr r }r (hUh j ubah!jubhXJ to the Reason field on the try build's status web page. You can also set r r }r (hXJ to the Reason field on the try build's status web page. You can also set h j ubj})r }r (hX``try_who = dev``h}r (h]h]h]h]h]uh j h]r hX try_who = devr r }r (hUh j ubah!jubhX in the r r }r (hX in the h j ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX.buildbot/optionsr r }r (hX.buildbot/optionsh j ubah!jubhX file. Note that r r }r (hX file. Note that h j ubj)r }r (hX:option:`--who=dev`r h j jjh!jh}r (UreftypeXoptionjjX --who=devU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --who=devr r }r (hUh j ubah!jubaubhX3 will not work on version 0.8.3 or earlier masters.r r! }r" (hX3 will not work on version 0.8.3 or earlier masters.h j ubeubj)r# }r$ (hXSimilarly, :option:`--comment=COMMENT` will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is ``try_comment``.h j jjh!jh}r% (h]h]h]h]h]ujMjjh]r& (hX Similarly, r' r( }r) (hX Similarly, h j# ubj)r* }r+ (hX:option:`--comment=COMMENT`r, h j# jjh!jh}r- (UreftypeXoptionjjX--comment=COMMENTU refdomainXstdr. jNh]h]U refexplicith]h]h]jhbujMh]r/ j)r0 }r1 (hj, h}r2 (h]h]r3 (jj. X std-optionr4 eh]h]h]uh j* h]r5 hX--comment=COMMENTr6 r7 }r8 (hUh j0 ubah!jubaubhX will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is r9 r: }r; (hX will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is h j# ubj})r< }r= (hX``try_comment``h}r> (h]h]h]h]h]uh j# h]r? hX try_commentr@ rA }rB (hUh j< ubah!jubhX.rC }rD (hX.h j# ubeubeubjj)rE }rF (hUh j jjh!jh}rG (h]h]h]h]rH jah]rI j2aujMAjjh]rJ (h)rK }rL (hXFinding the top of the treerM h jE jjh!h"h}rN (h]h]h]h]h]ujMAjjh]rO hXFinding the top of the treerP rQ }rR (hjM h jK ubaubj)rS }rT (hXKSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the :command:`try` command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the :command:`try` command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is :file:`.buildbot-top`, so when you are using CVS or SVN you should ``touch .buildbot-top`` from the top of your tree before running :command:`buildbot try`. Alternatively, you can use a filename like :file:`ChangeLog` or :file:`README`, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use ``--topfile=ChangeLog``, or set it in the options file with ``try_topfile = 'ChangeLog'``.h jE jjh!jh}rU (h]h]h]h]h]ujMCjjh]rV (hXgSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the rW rX }rY (hXgSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the h jS ubjM)rZ }r[ (hX:command:`try`h}r\ (h]h]r] jRah]h]h]uh jS h]r^ hXtryr_ r` }ra (hUh jZ ubah!jWubhX command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the rb rc }rd (hX command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the h jS ubjM)re }rf (hX:command:`try`h}rg (h]h]rh jRah]h]h]uh jS h]ri hXtryrj rk }rl (hUh je ubah!jWubhX} command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is rm rn }ro (hX} command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is h jS ubj})rp }rq (hUh}rr (h]h]h]h]rs Xfilert aUrolejt h]uh jS h]ru hX .buildbot-toprv rw }rx (hX .buildbot-toph jp ubah!jubhX., so when you are using CVS or SVN you should ry rz }r{ (hX., so when you are using CVS or SVN you should h jS ubj})r| }r} (hX``touch .buildbot-top``h}r~ (h]h]h]h]h]uh jS h]r hXtouch .buildbot-topr r }r (hUh j| ubah!jubhX* from the top of your tree before running r r }r (hX* from the top of your tree before running h jS ubjM)r }r (hX:command:`buildbot try`h}r (h]h]r jRah]h]h]uh jS h]r hX buildbot tryr r }r (hUh j ubah!jWubhX-. Alternatively, you can use a filename like r r }r (hX-. Alternatively, you can use a filename like h jS ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh jS h]r hX ChangeLogr r }r (hX ChangeLogh j ubah!jubhX or r r }r (hX or h jS ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh jS h]r hXREADMEr r }r (hXREADMEh j ubah!jubhXw, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use r r }r (hXw, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use h jS ubj})r }r (hX``--topfile=ChangeLog``h}r (h]h]h]h]h]uh jS h]r hX--topfile=ChangeLogr r }r (hUh j ubah!jubhX%, or set it in the options file with r r }r (hX%, or set it in the options file with h jS ubj})r }r (hX``try_topfile = 'ChangeLog'``h}r (h]h]h]h]h]uh jS h]r hXtry_topfile = 'ChangeLog'r r }r (hUh j ubah!jubhX.r }r (hX.h jS ubeubj)r }r (hX<You can also manually set the top of the tree with ``--topdir=~/trees/mytree``, or ``try_topdir = '~/trees/mytree'``. If you use ``try_topdir``, in a :file:`.buildbot/options` file, you will need a separate options file for each tree you use, so it may be more convenient to use the ``try_topfile`` approach instead.h jE jjh!jh}r (h]h]h]h]h]ujMQjjh]r (hX3You can also manually set the top of the tree with r r }r (hX3You can also manually set the top of the tree with h j ubj})r }r (hX``--topdir=~/trees/mytree``h}r (h]h]h]h]h]uh j h]r hX--topdir=~/trees/mytreer r }r (hUh j ubah!jubhX, or r r }r (hX, or h j ubj})r }r (hX!``try_topdir = '~/trees/mytree'``h}r (h]h]h]h]h]uh j h]r hXtry_topdir = '~/trees/mytree'r r }r (hUh j ubah!jubhX . If you use r r }r (hX . If you use h j ubj})r }r (hX``try_topdir``h}r (h]h]h]h]h]uh j h]r hX try_topdirr r }r (hUh j ubah!jubhX, in a r r }r (hX, in a h j ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX.buildbot/optionsr r }r (hX.buildbot/optionsh j ubah!jubhXl file, you will need a separate options file for each tree you use, so it may be more convenient to use the r r }r (hXl file, you will need a separate options file for each tree you use, so it may be more convenient to use the h j ubj})r }r (hX``try_topfile``h}r (h]h]h]h]h]uh j h]r hX try_topfiler r }r (hUh j ubah!jubhX approach instead.r r }r (hX approach instead.h j ubeubj)r }r (hXOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require :command:`try` to know the top directory, so the :option:`--try-topfile` and :option:`--try-topdir` arguments will be ignored.h jE jjh!jh}r (h]h]h]h]h]ujMXjjh]r (hXOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require r r }r (hXOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require h j ubjM)r }r (hX:command:`try`h}r (h]h]r jRah]h]h]uh j h]r hXtryr r }r (hUh j ubah!jWubhX# to know the top directory, so the r r }r (hX# to know the top directory, so the h j ubj)r }r (hX:option:`--try-topfile`r h j jjh!jh}r (UreftypeXoptionjjX --try-topfileU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMXh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --try-topfiler r }r (hUh j ubah!jubaubhX and r r }r (hX and h j ubj)r }r (hX:option:`--try-topdir`r h j jjh!jh}r (UreftypeXoptionjjX --try-topdirU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMXh]r j)r! }r" (hj h}r# (h]h]r$ (jj X std-optionr% eh]h]h]uh j h]r& hX --try-topdirr' r( }r) (hUh j! ubah!jubaubhX arguments will be ignored.r* r+ }r, (hX arguments will be ignored.h j ubeubj)r- }r. (hXaIf the :command:`try` command cannot find the top directory, it will abort with an error message.h jE jjh!jh}r/ (h]h]h]h]h]ujM]jjh]r0 (hXIf the r1 r2 }r3 (hXIf the h j- ubjM)r4 }r5 (hX:command:`try`h}r6 (h]h]r7 jRah]h]h]uh j- h]r8 hXtryr9 r: }r; (hUh j4 ubah!jWubhXL command cannot find the top directory, it will abort with an error message.r< r= }r> (hXL command cannot find the top directory, it will abort with an error message.h j- ubeubj)r? }r@ (hX]The following command line arguments are deprecated, but retained for backward compatibility:rA h jE jjh!jh}rB (h]h]h]h]h]ujM`jjh]rC hX]The following command line arguments are deprecated, but retained for backward compatibility:rD rE }rF (hjA h j? ubaubcdocutils.nodes block_quote rG )rH }rI (hUh jE jNh!U block_quoterJ h}rK (h]h]h]h]h]ujNjjh]rL cdocutils.nodes bullet_list rM )rN }rO (hUh}rP (UbulletrQ X*h]h]h]h]h]uh jH h]rR (cdocutils.nodes list_item rS )rT }rU (hX2``--try-topdir`` is replaced by :option:`--topdir`rV h}rW (h]h]h]h]h]uh jN h]rX j)rY }rZ (hjV h jT jjh!jh}r[ (h]h]h]h]h]ujMch]r\ (j})r] }r^ (hX``--try-topdir``h}r_ (h]h]h]h]h]uh jY h]r` hX --try-topdirra rb }rc (hUh j] ubah!jubhX is replaced by rd re }rf (hX is replaced by h jY ubj)rg }rh (hX:option:`--topdir`ri h jY jjh!jh}rj (UreftypeXoptionjjX--topdirU refdomainXstdrk jNh]h]U refexplicith]h]h]jhbujMch]rl j)rm }rn (hji h}ro (h]h]rp (jjk X std-optionrq eh]h]h]uh jg h]rr hX--topdirrs rt }ru (hUh jm ubah!jubaubeubah!U list_itemrv ubjS )rw }rx (hX5``--try-topfile`` is replaced by :option:`--topfile` h}ry (h]h]h]h]h]uh jN h]rz j)r{ }r| (hX4``--try-topfile`` is replaced by :option:`--topfile`h jw jjh!jh}r} (h]h]h]h]h]ujMdh]r~ (j})r }r (hX``--try-topfile``h}r (h]h]h]h]h]uh j{ h]r hX --try-topfiler r }r (hUh j ubah!jubhX is replaced by r r }r (hX is replaced by h j{ ubj)r }r (hX:option:`--topfile`r h j{ jjh!jh}r (UreftypeXoptionjjX --topfileU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMdh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --topfiler r }r (hUh j ubah!jubaubeubah!jv ubeh!U bullet_listr ubaubeubjj)r }r (hUj9Kh j)r }r (hUh jjjh!jh}r (h]h]h]h]r jah]r jaujK;jjh]r (h)r }r (hXAdministrator Toolsr h j jjh!h"h}r (h]h]h]h]h]ujK;jjh]r hXAdministrator Toolsr r }r (hj h j ubaubj)r }r (hX[The following :command:`buildbot` sub-commands are intended for buildmaster administrators:h j jjh!jh}r (h]h]h]h]h]ujK=jjh]r (hXThe following r r }r (hXThe following h j ubjM)r }r (hX:command:`buildbot`h}r (h]h]r jRah]h]h]uh j h]r hXbuildbotr r }r (hUh j ubah!jWubhX: sub-commands are intended for buildmaster administrators:r r }r (hX: sub-commands are intended for buildmaster administrators:h j ubeubj[)r }r (hUh j jjh!j^h}r (h]h]h]h]h]Uentries]r ((UsingleX'Command Line Subcommands; create-masterjjtr (UsingleX%create-master Command Line Subcommandjjtr eujKAjjh]ubj)r }r (hUh j jjh!jh}r (h]h]h]h]h]jjujKAjjh]ubj)r }r (hUh j jjj}h!jh}r (h]h]h]h]r (jjeh]r j aujKCjjj}r jj sh]r (h)r }r (hX create-masterr h j jjh!h"h}r (h]h]h]h]h]ujKCjjh]r hX create-masterr r }r (hj h j ubaubj)r }r (hX#buildbot create-master -r {BASEDIR}h j jjh!jh}r (jjXnonejjh]h]h]h]h]ujKEjjh]r hX#buildbot create-master -r {BASEDIR}r r }r (hUh j ubaubj)r }r (hXtThis creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.r h j jjh!jh}r (h]h]h]h]h]ujKIjjh]r hXtThis creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.r r }r (hj h j ubaubj)r }r (hXYou will usually want to use the :option:`-r` option to create a relocatable :file:`buildbot.tac`. This allows you to move the master directory without editing this file.h j jjh!jh}r (h]h]h]h]h]ujKKjjh]r (hX!You will usually want to use the r r }r (hX!You will usually want to use the h j ubj)r }r (hX :option:`-r`r h j jjh!jh}r (UreftypeXoptionjjX-rU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujKKh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX-rr r }r (hUh j ubah!jubaubhX option to create a relocatable r r }r (hX option to create a relocatable h j ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX buildbot.tacr r }r (hX buildbot.tach j ubah!jubhXI. This allows you to move the master directory without editing this file.r r }r (hXI. This allows you to move the master directory without editing this file.h j ubeubj[)r }r (hUh j jjh!j^h}r (h]h]h]h]h]Uentries]r ((UsingleX*Command Line Subcommands; start (buildbot)jjtr (UsingleX(start (buildbot) Command Line Subcommandjjtr eujKOjjh]ubj)r }r (hUh j jjh!jh}r (h]h]h]h]h]jjujKOjjh]ubeubj)r }r (hUj9Kh j jjj}h!jh}r (h]r jhah]h]h]r (Ustartr jeh]ujKQjjj}r jj sh]r (h)r }r (hXstartr h j jjh!h"h}r (h]h]h]h]h]ujKQjjh]r hXstartr r }r (hj h j ubaubj)r }r! (hX%buildbot start [--nodaemon] {BASEDIR}h j jjh!jh}r" (jjXnonejjh]h]h]h]h]ujKSjjh]r# hX%buildbot start [--nodaemon] {BASEDIR}r$ r% }r& (hUh j ubaubj)r' }r( (hXThis starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named :file:`twistd.log`.h j jjh!jh}r) (h]h]h]h]h]ujKWjjh]r* (hXThis starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named r+ r, }r- (hXThis starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named h j' ubj})r. }r/ (hUh}r0 (h]h]h]h]r1 Xfiler2 aUrolej2 h]uh j' h]r3 hX twistd.logr4 r5 }r6 (hX twistd.logh j. ubah!jubhX.r7 }r8 (hX.h j' ubeubj)r9 }r: (hXThe :option:`--nodaemon` option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.h j jjh!jh}r; (h]h]h]h]h]ujKZjjh]r< (hXThe r= r> }r? (hXThe h j9 ubj)r@ }rA (hX:option:`--nodaemon`rB h j9 jjh!jh}rC (UreftypeXoptionjjX --nodaemonU refdomainXstdrD jNh]h]U refexplicith]h]h]jhbujKZh]rE j)rF }rG (hjB h}rH (h]h]rI (jjD X std-optionrJ eh]h]h]uh j@ h]rK hX --nodaemonrL rM }rN (hUh jF ubah!jubaubhX option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.rO rP }rQ (hX option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.h j9 ubeubj[)rR }rS (hUh j jjh!j^h}rT (h]h]h]h]h]Uentries]rU ((UsingleX,Command Line Subcommands; restart (buildbot)jjtrV (UsingleX*restart (buildbot) Command Line SubcommandjjtrW eujK_jjh]ubj)rX }rY (hUh j jjh!jh}rZ (h]h]h]h]h]jjujK_jjh]ubeubj)r[ }r\ (hUj9Kh j jjj}h!jh}r] (h]r^ jah]h]h]r_ (Urestartr` jeh]ujKajjj}ra jjX sh]rb (h)rc }rd (hXrestartre h j[ jjh!h"h}rf (h]h]h]h]h]ujKajjh]rg hXrestartrh ri }rj (hje h jc ubaubj)rk }rl (hX'buildbot restart [--nodaemon] {BASEDIR}h j[ jjh!jh}rm (jjXnonejjh]h]h]h]h]ujKcjjh]rn hX'buildbot restart [--nodaemon] {BASEDIR}ro rp }rq (hUh jk ubaubj)rr }rs (hXRestart the buildmaster. This is equivalent to ``stop`` followed by ``start`` The :option:`--nodaemon` option has the same meaning as for ``start``.h j[ jjh!jh}rt (h]h]h]h]h]ujKgjjh]ru (hX/Restart the buildmaster. This is equivalent to rv rw }rx (hX/Restart the buildmaster. This is equivalent to h jr ubj})ry }rz (hX``stop``h}r{ (h]h]h]h]h]uh jr h]r| hXstopr} r~ }r (hUh jy ubah!jubhX followed by r r }r (hX followed by h jr ubj})r }r (hX ``start``h}r (h]h]h]h]h]uh jr h]r hXstartr r }r (hUh j ubah!jubhX The r r }r (hX The h jr ubj)r }r (hX:option:`--nodaemon`r h jr jjh!jh}r (UreftypeXoptionjjX --nodaemonU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujKgh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --nodaemonr r }r (hUh j ubah!jubaubhX$ option has the same meaning as for r r }r (hX$ option has the same meaning as for h jr ubj})r }r (hX ``start``h}r (h]h]h]h]h]uh jr h]r hXstartr r }r (hUh j ubah!jubhX.r }r (hX.h jr ubeubj[)r }r (hUh j[ jjh!j^h}r (h]h]h]h]h]Uentries]r ((UsingleX)Command Line Subcommands; stop (buildbot)jjtr (UsingleX'stop (buildbot) Command Line Subcommandjjtr eujKljjh]ubj)r }r (hUh j[ jjh!jh}r (h]h]h]h]h]jjujKljjh]ubeubj j)r }r (hUh j jjj}h!jh}r (h]h]h]h]r (jjeh]r j#aujKzjjj}r jj)r }r (hUh j jjh!jh}r (h]h]h]h]h]jjujKxjjh]ubsh]r (h)r }r (hXsighupr h j jjh!h"h}r (h]h]h]h]h]ujKzjjh]r hXsighupr r }r (hj h j ubaubj)r }r (hXbuildbot sighup {BASEDIR}h j jjh!jh}r (jjXnonejjh]h]h]h]h]ujK|jjh]r hXbuildbot sighup {BASEDIR}r r }r (hUh j ubaubj)r }r (hX~This sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its :file:`master.cfg` file.h j jjh!jh}r (h]h]h]h]h]ujKjjh]r (hXfThis sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its r r }r (hXfThis sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its h j ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX master.cfgr r }r (hX master.cfgh j ubah!jubhX file.r r }r (hX file.h j ubeubeubeubjjj}h!jh}r (h]r jJah]h]h]r (Ustopr jeh]ujKnjjj}r jj sh]r (h)r }r (hXstopr h j jjh!h"h}r (h]h]h]h]h]ujKnjjh]r hXstopr r }r (hj h j ubaubj)r }r (hXbuildbot stop {BASEDIR}h j jjh!jh}r (jjXnonejjh]h]h]h]h]ujKpjjh]r hXbuildbot stop {BASEDIR}r r }r (hUh j ubaubj)r }r (hXThis terminates the daemon (either buildmaster or buildslave) running in the given directory. The :option:`--clean` option shuts down the buildmaster cleanly.h j jjh!jh}r (h]h]h]h]h]ujKtjjh]r (hXbThis terminates the daemon (either buildmaster or buildslave) running in the given directory. The r r }r (hXbThis terminates the daemon (either buildmaster or buildslave) running in the given directory. The h j ubj)r }r (hX:option:`--clean`r h j jjh!jh}r (UreftypeXoptionjjX--cleanU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujKth]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX--cleanr r }r (hUh j ubah!jubaubhX+ option shuts down the buildmaster cleanly.r r }r (hX+ option shuts down the buildmaster cleanly.h j ubeubj[)r }r (hUh j jjh!j^h}r (h]h]h]h]h]Uentries]r ((UsingleX Command Line Subcommands; sighupjjtr (UsingleXsighup Command Line Subcommandjjtr eujKxjjh]ubj eubjj)r }r (hUh j jjj}h!jh}r (h]h]h]h]r (jjeh]r jaujKjjj}r jj)r }r (hUh j)r }r (hUh j jjj}h!jh}r (h]h]h]h]r (jjeh]r j%aujKjjj}r jj)r }r (hUh j jjh!jh}r! (h]h]h]h]h]jjujKjjh]ubsh]r" (h)r# }r$ (hX statuslogr% h j jjh!h"h}r& (h]h]h]h]h]ujKjjh]r' hX statuslogr( r) }r* (hj% h j# ubaubj)r+ }r, (hX/buildbot statuslog --master {MASTERHOST}:{PORT}h j jjh!jh}r- (jjXnonejjh]h]h]h]h]ujKjjh]r. hX/buildbot statuslog --master {MASTERHOST}:{PORT}r/ r0 }r1 (hUh j+ ubaubj)r2 }r3 (hXThis command starts a simple text-based status client, one which just prints out a new line each time an event occurs on the buildmaster.r4 h j jjh!jh}r5 (h]h]h]h]h]ujKjjh]r6 hXThis command starts a simple text-based status client, one which just prints out a new line each time an event occurs on the buildmaster.r7 r8 }r9 (hj4 h j2 ubaubj)r: }r; (hXThe :option:`--master` option provides the location of the :class:`buildbot.status.client.PBListener` status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (:samp:`{HOSTNAME}:{PORTNUM}`). Note that this port is *not* the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of ``Failure: twisted.cred.error.UnauthorizedLogin:``, this may indicate that you are connecting to the slaveport rather than a :class:`PBListener` port.h j jjh!jh}r< (h]h]h]h]h]ujKjjh]r= (hXThe r> r? }r@ (hXThe h j: ubj)rA }rB (hX:option:`--master`rC h j: jjh!jh}rD (UreftypeXoptionjjX--masterU refdomainXstdrE jNh]h]U refexplicith]h]h]jhbujKh]rF j)rG }rH (hjC h}rI (h]h]rJ (jjE X std-optionrK eh]h]h]uh jA h]rL hX--masterrM rN }rO (hUh jG ubah!jubaubhX% option provides the location of the rP rQ }rR (hX% option provides the location of the h j: ubj)rS }rT (hX*:class:`buildbot.status.client.PBListener`rU h j: jjh!jh}rV (UreftypeXclassjjX!buildbot.status.client.PBListenerU refdomainXpyrW h]h]U refexplicith]h]h]jhbUpy:classrX NU py:modulerY NujKh]rZ j})r[ }r\ (hjU h}r] (h]h]r^ (jjW Xpy-classr_ eh]h]h]uh jS h]r` hX!buildbot.status.client.PBListenerra rb }rc (hUh j[ ubah!jubaubhX status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (rd re }rf (hX status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (h j: ubj})rg }rh (hUh}ri (h]h]h]h]rj Xsamprk aUrolejk h]uh j: h]rl (j)rm }rn (hXHOSTNAMEh}ro (h]h]h]h]h]uh jg h]rp hXHOSTNAMErq rr }rs (hUh jm ubah!jubhX:rt }ru (hX:h jg ubj)rv }rw (hXPORTNUMh}rx (h]h]h]h]h]uh jg h]ry hXPORTNUMrz r{ }r| (hUh jv ubah!jubeh!jubhX). Note that this port is r} r~ }r (hX). Note that this port is h j: ubj)r }r (hX*not*h}r (h]h]h]h]h]uh j: h]r hXnotr r }r (hUh j ubah!jubhX the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of r r }r (hX the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of h j: ubj})r }r (hX2``Failure: twisted.cred.error.UnauthorizedLogin:``h}r (h]h]h]h]h]uh j: h]r hX.Failure: twisted.cred.error.UnauthorizedLogin:r r }r (hUh j ubah!jubhXK, this may indicate that you are connecting to the slaveport rather than a r r }r (hXK, this may indicate that you are connecting to the slaveport rather than a h j: ubj)r }r (hX:class:`PBListener`r h j: jjh!jh}r (UreftypeXclassjjX PBListenerU refdomainXpyr h]h]U refexplicith]h]h]jhbjX NjY NujKh]r j})r }r (hj h}r (h]h]r (jj Xpy-classr eh]h]h]uh j h]r hX PBListenerr r }r (hUh j ubah!jubaubhX port.r r }r (hX port.h j: ubeubj)r }r (hXThe :option:`--master` option can also be provided by the ``masterstatus`` name in :file:`.buildbot/options` (see :ref:`buildbot-config-directory`).h j jjh!jh}r (h]h]h]h]h]ujKjjh]r (hXThe r r }r (hXThe h j ubj)r }r (hX:option:`--master`r h j jjh!jh}r (UreftypeXoptionjjX--masterU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujKh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX--masterr r }r (hUh j ubah!jubaubhX$ option can also be provided by the r r }r (hX$ option can also be provided by the h j ubj})r }r (hX``masterstatus``h}r (h]h]h]h]h]uh j h]r hX masterstatusr r }r (hUh j ubah!jubhX name in r r }r (hX name in h j ubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX.buildbot/optionsr r }r (hX.buildbot/optionsh j ubah!jubhX (see r r }r (hX (see h j ubj)r }r (hX :ref:`buildbot-config-directory`r h j jjh!jh}r (UreftypeXrefjjXbuildbot-config-directoryU refdomainXstdr h]h]U refexplicith]h]h]jhbujKh]r j)r }r (hj h}r (h]h]r (jj Xstd-refr eh]h]h]uh j h]r hXbuildbot-config-directoryr r }r (hUh j ubah!jubaubhX).r r }r (hX).h j ubeubj[)r }r (hUh j jjh!j^h}r (h]h]h]h]h]Uentries]r ((UsingleX#Command Line Subcommands; statusguijjtr (UsingleX!statusgui Command Line Subcommandjjtr eujKjjh]ubj eubjjh!jh}r (h]h]h]h]h]jjujKjjh]ubsh]r (h)r }r (hX statusguir h j jjh!h"h}r (h]h]h]h]h]ujKjjh]r hX statusguir r }r (hj h j ubaubj)r }r (hXIf you have set up a :bb:status:`PBListener`, you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the ``buildbot statusgui`` command:h j jjh!jh}r (h]h]h]h]h]ujKjjh]r (hXIf you have set up a r r }r (hXIf you have set up a h j ubj)r }r (hX:bb:status:`PBListener`rh j jjh!jh}r(UreftypeXstatusjjX PBListenerU refdomainXbbrh]h]U refexplicith]h]h]jhbujKh]rj})r}r(hjh}r(h]h]r(jjX bb-statusreh]h]h]uh j h]r hX PBListenerr r }r (hUh jubah!jubaubhX], you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the r r}r(hX], you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the h j ubj})r}r(hX``buildbot statusgui``h}r(h]h]h]h]h]uh j h]rhXbuildbot statusguirr}r(hUh jubah!jubhX command:rr}r(hX command:h j ubeubj)r}r(hX/buildbot statusgui --master {MASTERHOST}:{PORT}h j jjh!jh}r(jjXnonejjh]h]h]h]h]ujKjjh]rhX/buildbot statusgui --master {MASTERHOST}:{PORT}rr}r (hUh jubaubj)r!}r"(hX This command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same ``--master`` argument and ``masterstatus`` option as the ``buildbot statuslog`` command (:bb:cmdline:`statuslog`).h j jjh!jh}r#(h]h]h]h]h]ujKjjh]r$(hXThis command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same r%r&}r'(hXThis command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same h j!ubj})r(}r)(hX ``--master``h}r*(h]h]h]h]h]uh j!h]r+hX--masterr,r-}r.(hUh j(ubah!jubhX argument and r/r0}r1(hX argument and h j!ubj})r2}r3(hX``masterstatus``h}r4(h]h]h]h]h]uh j!h]r5hX masterstatusr6r7}r8(hUh j2ubah!jubhX option as the r9r:}r;(hX option as the h j!ubj})r<}r=(hX``buildbot statuslog``h}r>(h]h]h]h]h]uh j!h]r?hXbuildbot statuslogr@rA}rB(hUh j<ubah!jubhX command (rCrD}rE(hX command (h j!ubj)rF}rG(hX:bb:cmdline:`statuslog`rHh j!jjh!jh}rI(UreftypeXcmdlinejjX statuslogU refdomainXbbrJh]h]U refexplicith]h]h]jhbujKh]rKj})rL}rM(hjHh}rN(h]h]rO(jjJX bb-cmdlinerPeh]h]h]uh jFh]rQhX statuslogrRrS}rT(hUh jLubah!jubaubhX).rUrV}rW(hX).h j!ubeubj[)rX}rY(hUh j jjh!j^h}rZ(h]h]h]h]h]Uentries]r[((UsingleXCommand Line Subcommands; tryjjtr\(UsingleXtry Command Line Subcommandjjtr]eujKjjh]ubj)r^}r_(hUh j jjh!jh}r`(h]h]h]h]h]jjujKjjh]ubeubjj jj)ra}rb(hUh j jjh!jh}rc(h]h]h]h]rdjah]rej+aujKjjh]rf(h)rg}rh(hXLocating the masterrih jajjh!h"h}rj(h]h]h]h]h]ujKjjh]rkhXLocating the masterrlrm}rn(hjih jgubaubj)ro}rp(hXPThe :command:`try` command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using ``--connect=ssh`` or ``--connect=pb`` (or ``try_connect = 'ssh'`` or ``try_connect = 'pb'`` in :file:`.buildbot/options`).h jajjh!jh}rq(h]h]h]h]h]ujKjjh]rr(hXThe rsrt}ru(hXThe h joubjM)rv}rw(hX:command:`try`h}rx(h]h]ryjRah]h]h]uh joh]rzhXtryr{r|}r}(hUh jvubah!jWubhX command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using r~r}r(hX command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using h joubj})r}r(hX``--connect=ssh``h}r(h]h]h]h]h]uh joh]rhX --connect=sshrr}r(hUh jubah!jubhX or rr}r(hX or h joubj})r}r(hX``--connect=pb``h}r(h]h]h]h]h]uh joh]rhX --connect=pbrr}r(hUh jubah!jubhX (or rr}r(hX (or h joubj})r}r(hX``try_connect = 'ssh'``h}r(h]h]h]h]h]uh joh]rhXtry_connect = 'ssh'rr}r(hUh jubah!jubhX or rr}r(hX or h joubj})r}r(hX``try_connect = 'pb'``h}r(h]h]h]h]h]uh joh]rhXtry_connect = 'pb'rr}r(hUh jubah!jubhX in rr}r(hX in h joubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh joh]rhX.buildbot/optionsrr}r(hX.buildbot/optionsh jubah!jubhX).rr}r(hX).h joubeubj)r}r(hXFor the PB approach, the command must be given a :option:`--master` argument (in the form :samp:`{HOST}:{PORT}`) that points to TCP port that you picked in the :class:`Try_Userpass` scheduler. It also takes a :option:`--username` and :option:`--passwd` pair of arguments that match one of the entries in the buildmaster's ``userpass`` list. These arguments can also be provided as ``try_master``, ``try_username``, and ``try_password`` entries in the :file:`.buildbot/options` file.h jajjh!jh}r(h]h]h]h]h]ujKjjh]r(hX1For the PB approach, the command must be given a rr}r(hX1For the PB approach, the command must be given a h jubj)r}r(hX:option:`--master`rh jjjh!jh}r(UreftypeXoptionjjX--masterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--masterrr}r(hUh jubah!jubaubhX argument (in the form rr}r(hX argument (in the form h jubj})r}r(hUh}r(h]h]h]h]rXsampraUrolejh]uh jh]r(j)r}r(hXHOSTh}r(h]h]h]h]h]uh jh]rhXHOSTrr}r(hUh jubah!jubhX:r}r(hX:h jubj)r}r(hXPORTh}r(h]h]h]h]h]uh jh]rhXPORTrr}r(hUh jubah!jubeh!jubhX1) that points to TCP port that you picked in the rr}r(hX1) that points to TCP port that you picked in the h jubj)r}r(hX:class:`Try_Userpass`rh jjjh!jh}r(UreftypeXclassjjX Try_UserpassU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujKh]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhX Try_Userpassrr}r(hUh jubah!jubaubhX scheduler. It also takes a rr}r(hX scheduler. It also takes a h jubj)r}r(hX:option:`--username`rh jjjh!jh}r(UreftypeXoptionjjX --usernameU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --usernamerr}r(hUh jubah!jubaubhX and rr }r (hX and h jubj)r }r (hX:option:`--passwd`r h jjjh!jh}r(UreftypeXoptionjjX--passwdU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hj h}r(h]h]r(jjX std-optionreh]h]h]uh j h]rhX--passwdrr}r(hUh jubah!jubaubhXF pair of arguments that match one of the entries in the buildmaster's rr}r(hXF pair of arguments that match one of the entries in the buildmaster's h jubj})r}r(hX ``userpass``h}r(h]h]h]h]h]uh jh]r hXuserpassr!r"}r#(hUh jubah!jubhX/ list. These arguments can also be provided as r$r%}r&(hX/ list. These arguments can also be provided as h jubj})r'}r((hX``try_master``h}r)(h]h]h]h]h]uh jh]r*hX try_masterr+r,}r-(hUh j'ubah!jubhX, r.r/}r0(hX, h jubj})r1}r2(hX``try_username``h}r3(h]h]h]h]h]uh jh]r4hX try_usernamer5r6}r7(hUh j1ubah!jubhX, and r8r9}r:(hX, and h jubj})r;}r<(hX``try_password``h}r=(h]h]h]h]h]uh jh]r>hX try_passwordr?r@}rA(hUh j;ubah!jubhX entries in the rBrC}rD(hX entries in the h jubj})rE}rF(hUh}rG(h]h]h]h]rHXfilerIaUrolejIh]uh jh]rJhX.buildbot/optionsrKrL}rM(hX.buildbot/optionsh jEubah!jubhX file.rNrO}rP(hX file.h jubeubj)rQ}rR(hXFor the SSH approach, the command must be given :option:`--host` and :option:`--username`, to get to the buildmaster host. It must also be given :option:`--jobdir`, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like :file:`~buildbot/project/trydir`. These arguments can be provided in :file:`.buildbot/options` as ``try_host``, ``try_username``, ``try_password``, and ``try_jobdir``.h jajjh!jh}rS(h]h]h]h]h]ujKjjh]rT(hX0For the SSH approach, the command must be given rUrV}rW(hX0For the SSH approach, the command must be given h jQubj)rX}rY(hX:option:`--host`rZh jQjjh!jh}r[(UreftypeXoptionjjX--hostU refdomainXstdr\jNh]h]U refexplicith]h]h]jhbujKh]r]j)r^}r_(hjZh}r`(h]h]ra(jj\X std-optionrbeh]h]h]uh jXh]rchX--hostrdre}rf(hUh j^ubah!jubaubhX and rgrh}ri(hX and h jQubj)rj}rk(hX:option:`--username`rlh jQjjh!jh}rm(UreftypeXoptionjjX --usernameU refdomainXstdrnjNh]h]U refexplicith]h]h]jhbujKh]roj)rp}rq(hjlh}rr(h]h]rs(jjnX std-optionrteh]h]h]uh jjh]ruhX --usernamervrw}rx(hUh jpubah!jubaubhX8, to get to the buildmaster host. It must also be given ryrz}r{(hX8, to get to the buildmaster host. It must also be given h jQubj)r|}r}(hX:option:`--jobdir`r~h jQjjh!jh}r(UreftypeXoptionjjX--jobdirU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hj~h}r(h]h]r(jjX std-optionreh]h]h]uh j|h]rhX--jobdirrr}r(hUh jubah!jubaubhX, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like rr}r(hX, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like h jQubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jQh]rhX~buildbot/project/trydirrr}r(hX~buildbot/project/trydirh jubah!jubhX%. These arguments can be provided in rr}r(hX%. These arguments can be provided in h jQubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jQh]rhX.buildbot/optionsrr}r(hX.buildbot/optionsh jubah!jubhX as rr}r(hX as h jQubj})r}r(hX ``try_host``h}r(h]h]h]h]h]uh jQh]rhXtry_hostrr}r(hUh jubah!jubhX, rr}r(hX, h jQubj})r}r(hX``try_username``h}r(h]h]h]h]h]uh jQh]rhX try_usernamerr}r(hUh jubah!jubhX, rr}r(hX, h jQubj})r}r(hX``try_password``h}r(h]h]h]h]h]uh jQh]rhX try_passwordrr}r(hUh jubah!jubhX, and rr}r(hX, and h jQubj})r}r(hX``try_jobdir``h}r(h]h]h]h]h]uh jQh]rhX try_jobdirrr}r(hUh jubah!jubhX.r}r(hX.h jQubeubj)r}r(hXThe SSH approach also provides a :option:`--buildbotbin` argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a :ref:`virtualenv ` on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by :option:`--username`. The :option:`--buildbotbin` argument can be provided in :file:`.buildbot/options` as ``try_buildbotbin``h jajjh!jh}r(h]h]h]h]h]ujKjjh]r(hX!The SSH approach also provides a rr}r(hX!The SSH approach also provides a h jubj)r}r(hX:option:`--buildbotbin`rh jjjh!jh}r(UreftypeXoptionjjX --buildbotbinU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --buildbotbinrr}r(hUh jubah!jubaubhX argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a rr}r(hX argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a h jubj)r}r(hX0:ref:`virtualenv `rh jjjh!jh}r(UreftypeXrefjjXinstallation-in-a-virtualenvU refdomainXstdrh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hjh}r(h]h]r(jjXstd-refreh]h]h]uh jh]rhX virtualenvrr}r(hUh jubah!jubaubhXw on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by rr}r(hXw on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by h jubj)r}r(hX:option:`--username`rh jjjh!jh}r(UreftypeXoptionjjX --usernameU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --usernamerr}r(hUh jubah!jubaubhX. The rr}r (hX. The h jubj)r }r (hX:option:`--buildbotbin`r h jjjh!jh}r (UreftypeXoptionjjX --buildbotbinU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hj h}r(h]h]r(jjX std-optionreh]h]h]uh j h]rhX --buildbotbinrr}r(hUh jubah!jubaubhX argument can be provided in rr}r(hX argument can be provided in h jubj})r}r(hUh}r(h]h]h]h]rXfiler aUrolej h]uh jh]r!hX.buildbot/optionsr"r#}r$(hX.buildbot/optionsh jubah!jubhX as r%r&}r'(hX as h jubj})r(}r)(hX``try_buildbotbin``h}r*(h]h]h]h]h]uh jh]r+hXtry_buildbotbinr,r-}r.(hUh j(ubah!jubeubj)r/}r0(hX]The following command line arguments are deprecated, but retained for backward compatibility:r1h jajjh!jh}r2(h]h]h]h]h]ujKjjh]r3hX]The following command line arguments are deprecated, but retained for backward compatibility:r4r5}r6(hj1h j/ubaubcdocutils.nodes option_list r7)r8}r9(hUh jajjh!U option_listr:h}r;(h]h]h]h]h]ujNjjh]r<(cdocutils.nodes option_list_item r=)r>}r?(hUh j8jjh!Uoption_list_itemr@h}rA(h]h]h]h]h]ujNjjh]rB(cdocutils.nodes option_group rC)rD}rE(hUh}rF(h]h]h]h]h]uh j>h]rGcdocutils.nodes option rH)rI}rJ(hX --tryhostrKh}rL(h]h]h]h]h]uh jDh]rMcdocutils.nodes option_string rN)rO}rP(hjKh}rQ(h]h]h]h]h]uh jIh]rRhX --tryhostrSrT}rU(hUh jOubah!U option_stringrVubah!UoptionrWubah!U option_grouprXubcdocutils.nodes description rY)rZ}r[(hXis replaced by :option:`--host`r\h}r](h]h]h]h]h]uh j>h]r^j)r_}r`(hj\h jZjjh!jh}ra(h]h]h]h]h]ujKh]rb(hXis replaced by rcrd}re(hXis replaced by h j_ubj)rf}rg(hX:option:`--host`rhh j_jjh!jh}ri(UreftypeXoptionjjX--hostU refdomainXstdrjjNh]h]U refexplicith]h]h]jhbujKh]rkj)rl}rm(hjhh}rn(h]h]ro(jjjX std-optionrpeh]h]h]uh jfh]rqhX--hostrrrs}rt(hUh jlubah!jubaubeubah!U descriptionruubeubj=)rv}rw(hUh j8jjh!j@h}rx(h]h]h]h]h]ujNjjh]ry(jC)rz}r{(hUh}r|(h]h]h]h]h]uh jvh]r}jH)r~}r(hX--trydirrh}r(h]h]h]h]h]uh jzh]rjN)r}r(hjh}r(h]h]h]h]h]uh j~h]rhX--trydirrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hX!is replaced by :option:`--jobdir`rh}r(h]h]h]h]h]uh jvh]rj)r}r(hjh jjjh!jh}r(h]h]h]h]h]ujKh]r(hXis replaced by rr}r(hXis replaced by h jubj)r}r(hX:option:`--jobdir`rh jjjh!jh}r(UreftypeXoptionjjX--jobdirU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujKh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--jobdirrr}r(hUh jubah!jubaubeubah!juubeubj=)r}r(hUh j8jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX--masterrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--masterrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hX(is replaced by :option:`--masterstatus` h}r(h]h]h]h]h]uh jh]rj)r}r(hX'is replaced by :option:`--masterstatus`h jjjh!jh}r(h]h]h]h]h]ujMh]r(hXis replaced by rr}r(hXis replaced by h jubj)r}r(hX:option:`--masterstatus`rh jjjh!jh}r(UreftypeXoptionjjX--masterstatusU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--masterstatusrr}r(hUh jubah!jubaubeubah!juubeubeubj)r}r(hXwLikewise, the following :file:`.buildbot/options` file entries are deprecated, but retained for backward compatibility:h jajjh!jh}r(h]h]h]h]h]ujMjjh]r(hXLikewise, the following rr}r(hXLikewise, the following h jubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jh]rhX.buildbot/optionsrr}r(hX.buildbot/optionsh jubah!jubhXF file entries are deprecated, but retained for backward compatibility:rr}r(hXF file entries are deprecated, but retained for backward compatibility:h jubeubjG )r}r(hUh jajNh!jJ h}r(h]h]h]h]h]ujNjjh]rjM )r}r(hUh}r(jQ X*h]h]h]h]h]uh jh]r(jS )r}r(hX)``try_dir`` is replaced by ``try_jobdir``rh}r(h]h]h]h]h]uh jh]rj)r}r(hjh jjjh!jh}r(h]h]h]h]h]ujMh]r(j})r}r(hX ``try_dir``h}r(h]h]h]h]h]uh jh]rhXtry_dirrr}r(hUh jubah!jubhX is replaced by rr}r(hX is replaced by h jubj})r}r(hX``try_jobdir``h}r(h]h]h]h]h]uh jh]rhX try_jobdirrr}r(hUh jubah!jubeubah!jv ubjS )r}r (hX5``masterstatus`` is replaced by ``try_masterstatus`` h}r (h]h]h]h]h]uh jh]r j)r }r (hX4``masterstatus`` is replaced by ``try_masterstatus``h jjjh!jh}r(h]h]h]h]h]ujMh]r(j})r}r(hX``masterstatus``h}r(h]h]h]h]h]uh j h]rhX masterstatusrr}r(hUh jubah!jubhX is replaced by rr}r(hX is replaced by h j ubj})r}r(hX``try_masterstatus``h}r(h]h]h]h]h]uh j h]rhXtry_masterstatusrr}r (hUh jubah!jubeubah!jv ubeh!j ubaubeubjj)r!}r"(hUh j jjh!jh}r#(h]h]h]h]r$jah]r%j0aujMgjjh]r&(h)r'}r((hXDetermining the branch namer)h j!jjh!h"h}r*(h]h]h]h]h]ujMgjjh]r+hXDetermining the branch namer,r-}r.(hj)h j'ubaubj)r/}r0(hX^Some VC systems record the branch information in a way that ``try`` can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the :option:`--branch` argument, or a ``try_branch`` entry in the :file:`.buildbot/options` file.h j!jjh!jh}r1(h]h]h]h]h]ujMijjh]r2(hX<Some VC systems record the branch information in a way that r3r4}r5(hX<Some VC systems record the branch information in a way that h j/ubj})r6}r7(hX``try``h}r8(h]h]h]h]h]uh j/h]r9hXtryr:r;}r<(hUh j6ubah!jubhX can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the r=r>}r?(hX can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the h j/ubj)r@}rA(hX:option:`--branch`rBh j/jjh!jh}rC(UreftypeXoptionjjX--branchU refdomainXstdrDjNh]h]U refexplicith]h]h]jhbujMih]rEj)rF}rG(hjBh}rH(h]h]rI(jjDX std-optionrJeh]h]h]uh j@h]rKhX--branchrLrM}rN(hUh jFubah!jubaubhX argument, or a rOrP}rQ(hX argument, or a h j/ubj})rR}rS(hX``try_branch``h}rT(h]h]h]h]h]uh j/h]rUhX try_branchrVrW}rX(hUh jRubah!jubhX entry in the rYrZ}r[(hX entry in the h j/ubj})r\}r](hUh}r^(h]h]h]h]r_Xfiler`aUrolej`h]uh j/h]rahX.buildbot/optionsrbrc}rd(hX.buildbot/optionsh j\ubah!jubhX file.rerf}rg(hX file.h j/ubeubeubjj)rh}ri(hUh j)rj}rk(hUh jjjh!jh}rl(h]h]h]h]rmjah]rnj(aujMjjh]ro(h)rp}rq(hX Other Toolsrrh jjjjh!h"h}rs(h]h]h]h]h]ujMjjh]rthX Other Toolsrurv}rw(hjrh jpubaubj)rx}ry(hX=These tools are generally used by buildmaster administrators.rzh jjjjh!jh}r{(h]h]h]h]h]ujM jjh]r|hX=These tools are generally used by buildmaster administrators.r}r~}r(hjzh jxubaubj[)r}r(hUh jjjjh!j^h}r(h]h]h]h]h]Uentries]r((UsingleX$Command Line Subcommands; sendchangejjtr(UsingleX"sendchange Command Line SubcommandjjtreujM jjh]ubj)r}r(hUh jjjjh!jh}r(h]h]h]h]h]jjujM jjh]ubj)r}r(hUh jjjjj}h!jh}r(h]h]h]h]r(jjeh]rjaujMjjj}rjjsh]r(h)r}r(hX sendchangerh jjjh!h"h}r(h]h]h]h]h]ujMjjh]rhX sendchangerr}r(hjh jubaubj)r}r(hX+This command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a :class:`PBChangeSource` (:bb:chsrc:`PBChangeSource`) running in the buildmaster (by being set in ``c['change_source']``).h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXThis command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a rr}r(hXThis command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a h jubj)r}r(hX:class:`PBChangeSource`rh jjjh!jh}r(UreftypeXclassjjXPBChangeSourceU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujMh]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhXPBChangeSourcerr}r(hUh jubah!jubaubhX (rr}r(hX (h jubj)r}r(hX:bb:chsrc:`PBChangeSource`rh jjjh!jh}r(UreftypeXchsrcjjXPBChangeSourceU refdomainXbbrh]h]U refexplicith]h]h]jhbujMh]rj})r}r(hjh}r(h]h]r(jjXbb-chsrcreh]h]h]uh jh]rhXPBChangeSourcerr}r(hUh jubah!jubaubhX.) running in the buildmaster (by being set in rr}r(hX.) running in the buildmaster (by being set in h jubj})r}r(hX``c['change_source']``h}r(h]h]h]h]h]uh jh]rhXc['change_source']rr}r(hUh jubah!jubhX).rr}r(hX).h jubeubj)r}r(hXhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}h jjjh!jh}r(jjXnonejjh]h]h]h]h]ujMjjh]rhXhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}rr}r(hUh jubaubj)r}r(hXoThe :option:`auth` option specifies the credentials to use to connect to the master, in the form ``user:pass``. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXThe rr}r(hXThe h jubj)r}r(hX:option:`auth`rh jjjh!jh}r(UreftypeXoptionjjXauthU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXauthrr}r(hUh jubah!jubaubhXO option specifies the credentials to use to connect to the master, in the form rr}r(hXO option specifies the credentials to use to connect to the master, in the form h jubj})r}r(hX ``user:pass``h}r(h]h]h]h]h]uh jh]rhX user:passrr}r(hUh jubah!jubhX. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.rr}r(hX. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.h jubeubj)r}r(hXThe :option:`master` and :option:`username` arguments can also be given in the options file (see :ref:`buildbot-config-directory`). There are other (optional) arguments which can influence the ``Change`` that gets submitted:h jjjh!jh}r(h]h]h]h]h]ujM"jjh]r(hXThe rr}r(hXThe h jubj)r}r(hX:option:`master`rh jjjh!jh}r(UreftypeXoptionjjXmasterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujM"h]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]r hXmasterr r }r (hUh jubah!jubaubhX and r r}r(hX and h jubj)r}r(hX:option:`username`rh jjjh!jh}r(UreftypeXoptionjjXusernameU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujM"h]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXusernamerr}r(hUh jubah!jubaubhX6 arguments can also be given in the options file (see rr }r!(hX6 arguments can also be given in the options file (see h jubj)r"}r#(hX :ref:`buildbot-config-directory`r$h jjjh!jh}r%(UreftypeXrefjjXbuildbot-config-directoryU refdomainXstdr&h]h]U refexplicith]h]h]jhbujM"h]r'j)r(}r)(hj$h}r*(h]h]r+(jj&Xstd-refr,eh]h]h]uh j"h]r-hXbuildbot-config-directoryr.r/}r0(hUh j(ubah!jubaubhXA). There are other (optional) arguments which can influence the r1r2}r3(hXA). There are other (optional) arguments which can influence the h jubj})r4}r5(hX ``Change``h}r6(h]h]h]h]h]uh jh]r7hXChanger8r9}r:(hUh j4ubah!jubhX that gets submitted:r;r<}r=(hX that gets submitted:h jubeubj7)r>}r?(hUh jjjh!j:h}r@(h]h]h]h]h]ujNjjh]rA(j=)rB}rC(hUh j>jjh!j@h}rD(h]h]h]h]h]ujNjjh]rE(jC)rF}rG(hUh}rH(h]h]h]h]h]uh jBh]rIjH)rJ}rK(hX--branchrLh}rM(h]h]h]h]h]uh jFh]rNjN)rO}rP(hjLh}rQ(h]h]h]h]h]uh jJh]rRhX--branchrSrT}rU(hUh jOubah!jVubah!jWubah!jXubjY)rV}rW(hX(or option ``branch``) This provides the (string) branch specifier. If omitted, it defaults to ``None``, indicating the ``default branch``. All files included in this Change must be on the same branch. h}rX(h]h]h]h]h]uh jBh]rYj)rZ}r[(hX(or option ``branch``) This provides the (string) branch specifier. If omitted, it defaults to ``None``, indicating the ``default branch``. All files included in this Change must be on the same branch.h jVjjh!jh}r\(h]h]h]h]h]ujM'h]r](hX (or option r^r_}r`(hX (or option h jZubj})ra}rb(hX ``branch``h}rc(h]h]h]h]h]uh jZh]rdhXbranchrerf}rg(hUh jaubah!jubhXJ) This provides the (string) branch specifier. If omitted, it defaults to rhri}rj(hXJ) This provides the (string) branch specifier. If omitted, it defaults to h jZubj})rk}rl(hX``None``h}rm(h]h]h]h]h]uh jZh]rnhXNonerorp}rq(hUh jkubah!jubhX, indicating the rrrs}rt(hX, indicating the h jZubj})ru}rv(hX``default branch``h}rw(h]h]h]h]h]uh jZh]rxhXdefault branchryrz}r{(hUh juubah!jubhX?. All files included in this Change must be on the same branch.r|r}}r~(hX?. All files included in this Change must be on the same branch.h jZubeubah!juubeubj=)r}r(hUh j>jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX --categoryrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --categoryrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hX(or option ``category``) This provides the (string) category specifier. If omitted, it defaults to ``None``, indicating ``no category``. The category property can be used by :class:`Scheduler`\s to filter what changes they listen to. h}r(h]h]h]h]h]uh jh]rj)r}r(hX(or option ``category``) This provides the (string) category specifier. If omitted, it defaults to ``None``, indicating ``no category``. The category property can be used by :class:`Scheduler`\s to filter what changes they listen to.h jjjh!jh}r(h]h]h]h]h]ujM,h]r(hX (or option rr}r(hX (or option h jubj})r}r(hX ``category``h}r(h]h]h]h]h]uh jh]rhXcategoryrr}r(hUh jubah!jubhXL) This provides the (string) category specifier. If omitted, it defaults to rr}r(hXL) This provides the (string) category specifier. If omitted, it defaults to h jubj})r}r(hX``None``h}r(h]h]h]h]h]uh jh]rhXNonerr}r(hUh jubah!jubhX , indicating rr}r(hX , indicating h jubj})r}r(hX``no category``h}r(h]h]h]h]h]uh jh]rhX no categoryrr}r(hUh jubah!jubhX'. The category property can be used by rr}r(hX'. The category property can be used by h jubj)r}r(hX:class:`Scheduler`rh jjjh!jh}r(UreftypeXclassjjX SchedulerU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujM,h]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhX Schedulerrr}r(hUh jubah!jubaubhX(s to filter what changes they listen to.rr}r(hX)\s to filter what changes they listen to.h jubeubah!juubeubj=)r}r(hUh j>jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX --projectrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --projectrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hX(or option ``project``) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change. h}r(h]h]h]h]h]uh jh]rj)r}r(hX(or option ``project``) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.h jjjh!jh}r(h]h]h]h]h]ujM1h]r(hX (or option rr}r(hX (or option h jubj})r}r(hX ``project``h}r(h]h]h]h]h]uh jh]rhXprojectrr}r(hUh jubah!jubhX) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.rr}r(hX) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.h jubeubah!juubeubj=)r}r(hUh j>jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX --repositoryrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --repositoryrr }r (hUh jubah!jVubah!jWubah!jXubjY)r }r (hXm(or option ``repository``) This provides the repository from which this change came, and defaults to ``''``. h}r (h]h]h]h]h]uh jh]rj)r}r(hXl(or option ``repository``) This provides the repository from which this change came, and defaults to ``''``.h j jjh!jh}r(h]h]h]h]h]ujM6h]r(hX (or option rr}r(hX (or option h jubj})r}r(hX``repository``h}r(h]h]h]h]h]uh jh]rhX repositoryrr}r(hUh jubah!jubhXL) This provides the repository from which this change came, and defaults to rr}r(hXL) This provides the repository from which this change came, and defaults to h jubj})r }r!(hX``''``h}r"(h]h]h]h]h]uh jh]r#hX''r$r%}r&(hUh j ubah!jubhX.r'}r((hX.h jubeubah!juubeubj=)r)}r*(hUh j>jjh!j@h}r+(h]h]h]h]h]ujNjjh]r,(jC)r-}r.(hUh}r/(h]h]h]h]h]uh j)h]r0jH)r1}r2(hX --revisionr3h}r4(h]h]h]h]h]uh j-h]r5jN)r6}r7(hj3h}r8(h]h]h]h]h]uh j1h]r9hX --revisionr:r;}r<(hUh j6ubah!jVubah!jWubah!jXubjY)r=}r>(hXIThis provides a revision specifier, appropriate to the VC system in use. h}r?(h]h]h]h]h]uh j)h]r@j)rA}rB(hXHThis provides a revision specifier, appropriate to the VC system in use.rCh j=jjh!jh}rD(h]h]h]h]h]ujM:h]rEhXHThis provides a revision specifier, appropriate to the VC system in use.rFrG}rH(hjCh jAubaubah!juubeubj=)rI}rJ(hUh j>jjh!j@h}rK(h]h]h]h]h]ujNjjh]rL(jC)rM}rN(hUh}rO(h]h]h]h]h]uh jIh]rPjH)rQ}rR(hX--revision_filerSh}rT(h]h]h]h]h]uh jMh]rUjN)rV}rW(hjSh}rX(h]h]h]h]h]uh jQh]rYhX--revision_filerZr[}r\(hUh jVubah!jVubah!jWubah!jXubjY)r]}r^(hX_This provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of ``darcs changes --context`` as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument. h}r_(h]h]h]h]h]uh jIh]r`j)ra}rb(hX^This provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of ``darcs changes --context`` as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.h j]jjh!jh}rc(h]h]h]h]h]ujM=h]rd(hXThis provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of rerf}rg(hXThis provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of h jaubj})rh}ri(hX``darcs changes --context``h}rj(h]h]h]h]h]uh jah]rkhXdarcs changes --contextrlrm}rn(hUh jhubah!jubhX as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.rorp}rq(hX as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.h jaubeubah!juubeubj=)rr}rs(hUh j>jjh!j@h}rt(h]h]h]h]h]ujNjjh]ru(jC)rv}rw(hUh}rx(h]h]h]h]h]uh jrh]ryjH)rz}r{(hX --propertyr|h}r}(h]h]h]h]h]uh jvh]r~jN)r}r(hj|h}r(h]h]h]h]h]uh jzh]rhX --propertyrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hXThis parameter is used to set a property on the :class:`Change` generated by ``sendchange``. Properties are specified as a :samp:`{name}:{value}` pair, separated by a colon. You may specify many properties by passing this parameter multiple times. h}r(h]h]h]h]h]uh jrh]rj)r}r(hXThis parameter is used to set a property on the :class:`Change` generated by ``sendchange``. Properties are specified as a :samp:`{name}:{value}` pair, separated by a colon. You may specify many properties by passing this parameter multiple times.h jjjh!jh}r(h]h]h]h]h]ujMEh]r(hX0This parameter is used to set a property on the rr}r(hX0This parameter is used to set a property on the h jubj)r}r(hX:class:`Change`rh jjjh!jh}r(UreftypeXclassjjXChangeU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujMEh]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhXChangerr}r(hUh jubah!jubaubhX generated by rr}r(hX generated by h jubj})r}r(hX``sendchange``h}r(h]h]h]h]h]uh jh]rhX sendchangerr}r(hUh jubah!jubhX . Properties are specified as a rr}r(hX . Properties are specified as a h jubj})r}r(hUh}r(h]h]h]h]rXsampraUrolejh]uh jh]r(j)r}r(hXnameh}r(h]h]h]h]h]uh jh]rhXnamerr}r(hUh jubah!jubhX:r}r(hX:h jubj)r}r(hXvalueh}r(h]h]h]h]h]uh jh]rhXvaluerr}r(hUh jubah!jubeh!jubhXf pair, separated by a colon. You may specify many properties by passing this parameter multiple times.rr}r(hXf pair, separated by a colon. You may specify many properties by passing this parameter multiple times.h jubeubah!juubeubj=)r}r(hUh j>jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX --commentsrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --commentsrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hXiThis provides the change comments as a single argument. You may want to use :option:`--logfile` instead. h}r(h]h]h]h]h]uh jh]rj)r}r(hXhThis provides the change comments as a single argument. You may want to use :option:`--logfile` instead.h jjjh!jh}r(h]h]h]h]h]ujMJh]r(hXLThis provides the change comments as a single argument. You may want to use rr}r(hXLThis provides the change comments as a single argument. You may want to use h jubj)r}r(hX:option:`--logfile`rh jjjh!jh}r(UreftypeXoptionjjX --logfileU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMJh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --logfilerr}r(hUh jubah!jubaubhX instead.rr}r(hX instead.h jubeubah!juubeubj=)r}r(hUh j>jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX --logfilerh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --logfilerr }r (hUh jubah!jVubah!jWubah!jXubjY)r }r (hXThis instructs the tool to read the change comments from the given file. If you use ``-`` as the filename, the tool will read the change comments from stdin. h}r (h]h]h]h]h]uh jh]rj)r}r(hXThis instructs the tool to read the change comments from the given file. If you use ``-`` as the filename, the tool will read the change comments from stdin.h j jjh!jh}r(h]h]h]h]h]ujMNh]r(hXTThis instructs the tool to read the change comments from the given file. If you use rr}r(hXTThis instructs the tool to read the change comments from the given file. If you use h jubj})r}r(hX``-``h}r(h]h]h]h]h]uh jh]rhX-r}r(hUh jubah!jubhXD as the filename, the tool will read the change comments from stdin.rr}r(hXD as the filename, the tool will read the change comments from stdin.h jubeubah!juubeubj=)r}r (hUh j>jjh!j@h}r!(h]h]h]h]h]ujNjjh]r"(jC)r#}r$(hUh}r%(h]h]h]h]h]uh jh]r&jH)r'}r((hX --encodingr)h}r*(h]h]h]h]h]uh j#h]r+jN)r,}r-(hj)h}r.(h]h]h]h]h]uh j'h]r/hX --encodingr0r1}r2(hUh j,ubah!jVubah!jWubah!jXubjY)r3}r4(hXUSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``. h}r5(h]h]h]h]h]uh jh]r6j)r7}r8(hXTSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``.h j3jjh!jh}r9(h]h]h]h]h]ujMSh]r:(hXISpecifies the character encoding for all other parameters, defaulting to r;r<}r=(hXISpecifies the character encoding for all other parameters, defaulting to h j7ubj})r>}r?(hX ``'utf8'``h}r@(h]h]h]h]h]uh j7h]rAhX'utf8'rBrC}rD(hUh j>ubah!jubhX.rE}rF(hX.h j7ubeubah!juubeubj=)rG}rH(hUh j>jjh!j@h}rI(h]h]h]h]h]ujNjjh]rJ(jC)rK}rL(hUh}rM(h]h]h]h]h]uh jGh]rNjH)rO}rP(hX--vcrQh}rR(h]h]h]h]h]uh jKh]rSjN)rT}rU(hjQh}rV(h]h]h]h]h]uh jOh]rWhX--vcrXrY}rZ(hUh jTubah!jVubah!jWubah!jXubjY)r[}r\(hXSpecifies which VC system the Change is coming from, one of: ``cvs``, ``svn``, ``darcs``, ``hg``, ``bzr``, ``git``, ``mtn``, or ``p4``. Defaults to ``None``. h}r](h]h]h]h]h]uh jGh]r^j)r_}r`(hXSpecifies which VC system the Change is coming from, one of: ``cvs``, ``svn``, ``darcs``, ``hg``, ``bzr``, ``git``, ``mtn``, or ``p4``. Defaults to ``None``.h j[jjh!jh}ra(h]h]h]h]h]ujMWh]rb(hX=Specifies which VC system the Change is coming from, one of: rcrd}re(hX=Specifies which VC system the Change is coming from, one of: h j_ubj})rf}rg(hX``cvs``h}rh(h]h]h]h]h]uh j_h]rihXcvsrjrk}rl(hUh jfubah!jubhX, rmrn}ro(hX, h j_ubj})rp}rq(hX``svn``h}rr(h]h]h]h]h]uh j_h]rshXsvnrtru}rv(hUh jpubah!jubhX, rwrx}ry(hX, h j_ubj})rz}r{(hX ``darcs``h}r|(h]h]h]h]h]uh j_h]r}hXdarcsr~r}r(hUh jzubah!jubhX, rr}r(hX, h j_ubj})r}r(hX``hg``h}r(h]h]h]h]h]uh j_h]rhXhgrr}r(hUh jubah!jubhX, rr}r(hX, h j_ubj})r}r(hX``bzr``h}r(h]h]h]h]h]uh j_h]rhXbzrrr}r(hUh jubah!jubhX, rr}r(hX, h j_ubj})r}r(hX``git``h}r(h]h]h]h]h]uh j_h]rhXgitrr}r(hUh jubah!jubhX, rr}r(hX, h j_ubj})r}r(hX``mtn``h}r(h]h]h]h]h]uh j_h]rhXmtnrr}r(hUh jubah!jubhX, or rr}r(hX, or h j_ubj})r}r(hX``p4``h}r(h]h]h]h]h]uh j_h]rhXp4rr}r(hUh jubah!jubhX. Defaults to rr}r(hX. Defaults to h j_ubj})r}r(hX``None``h}r(h]h]h]h]h]uh j_h]rhXNonerr}r(hUh jubah!jubhX.r}r(hX.h j_ubeubah!juubeubeubj[)r}r(hUh jjjh!j^h}r(h]h]h]h]h]Uentries]r((UsingleX%Command Line Subcommands; debugclientjjtr(UsingleX#debugclient Command Line SubcommandjjtreujM\jjh]ubj)r}r(hUh jjjh!jh}r(h]h]h]h]h]jjujM\jjh]ubeubjhj)r}r(hUh jjjjj}h!jh}r(h]h]h]h]r(jjeh]rj'aujMjjj}rjj)r}r(hUh jhjjh!jh}r(h]h]h]h]h]jjujMjjh]ubsh]r(h)r}r(hXuserrh jjjh!h"h}r(h]h]h]h]h]ujMjjh]rhXuserrr}r(hjh jubaubj)r}r(hXNote that in order to use this command, you need to configure a `CommandlineUserManager` instance in your `master.cfg` file, which is explained in :ref:`Users-Options`.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hX@Note that in order to use this command, you need to configure a rr}r(hX@Note that in order to use this command, you need to configure a h jubcdocutils.nodes title_reference r)r}r(hX`CommandlineUserManager`h}r(h]h]h]h]h]uh jh]rhXCommandlineUserManagerrr}r(hUh jubah!Utitle_referencerubhX instance in your rr}r(hX instance in your h jubj)r}r(hX `master.cfg`h}r(h]h]h]h]h]uh jh]rhX master.cfgrr}r(hUh jubah!jubhX file, which is explained in rr}r(hX file, which is explained in h jubj)r}r(hX:ref:`Users-Options`rh jjjh!jh}r(UreftypeXrefjjX users-optionsU refdomainXstdrh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjXstd-refreh]h]h]uh jh]rhX Users-Optionsrr}r(hUh jubah!jubaubhX.r}r(hX.h jubeubj)r}r (hXThis command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see :ref:`Concepts-Users`.h jjjh!jh}r (h]h]h]h]h]ujMjjh]r (hXThis command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see r r }r(hXThis command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see h jubj)r}r(hX:ref:`Concepts-Users`rh jjjh!jh}r(UreftypeXrefjjXconcepts-usersU refdomainXstdrh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjXstd-refreh]h]h]uh jh]rhXConcepts-Usersrr}r(hUh jubah!jubaubhX.r}r(hX.h jubeubj7)r }r!(hUh jjjh!j:h}r"(h]h]h]h]h]ujNjjh]r#(j=)r$}r%(hUh j jjh!j@h}r&(h]h]h]h]h]ujNjjh]r'(jC)r(}r)(hUh}r*(h]h]h]h]h]uh j$h]r+jH)r,}r-(hX--masterr.h}r/(h]h]h]h]h]uh j(h]r0jN)r1}r2(hj.h}r3(h]h]h]h]h]uh j,h]r4hX--masterr5r6}r7(hUh j1ubah!jVubah!jWubah!jXubjY)r8}r9(hXThe :command:`user` command can be run virtually anywhere provided a location of the running buildmaster. The :option:`master` argument is of the form ``{MASTERHOST}:{PORT}``. h}r:(h]h]h]h]h]uh j$h]r;j)r<}r=(hXThe :command:`user` command can be run virtually anywhere provided a location of the running buildmaster. The :option:`master` argument is of the form ``{MASTERHOST}:{PORT}``.h j8jjh!jh}r>(h]h]h]h]h]ujMh]r?(hXThe r@rA}rB(hXThe h j<ubjM)rC}rD(hX:command:`user`h}rE(h]h]rFjRah]h]h]uh j<h]rGhXuserrHrI}rJ(hUh jCubah!jWubhX[ command can be run virtually anywhere provided a location of the running buildmaster. The rKrL}rM(hX[ command can be run virtually anywhere provided a location of the running buildmaster. The h j<ubj)rN}rO(hX:option:`master`rPh j<jjh!jh}rQ(UreftypeXoptionjjXmasterU refdomainXstdrRjNh]h]U refexplicith]h]h]jhbujMh]rSj)rT}rU(hjPh}rV(h]h]rW(jjRX std-optionrXeh]h]h]uh jNh]rYhXmasterrZr[}r\(hUh jTubah!jubaubhX argument is of the form r]r^}r_(hX argument is of the form h j<ubj})r`}ra(hX``{MASTERHOST}:{PORT}``h}rb(h]h]h]h]h]uh j<h]rchX{MASTERHOST}:{PORT}rdre}rf(hUh j`ubah!jubhX.rg}rh(hX.h j<ubeubah!juubeubj=)ri}rj(hUh j jjh!j@h}rk(h]h]h]h]h]ujNjjh]rl(jC)rm}rn(hUh}ro(h]h]h]h]h]uh jih]rpjH)rq}rr(hX --usernamersh}rt(h]h]h]h]h]uh jmh]rujN)rv}rw(hjsh}rx(h]h]h]h]h]uh jqh]ryhX --usernamerzr{}r|(hUh jvubah!jVubah!jWubah!jXubjY)r}}r~(hXZPB connection authentication that should match the arguments to `CommandlineUserManager`. h}r(h]h]h]h]h]uh jih]rj)r}r(hXYPB connection authentication that should match the arguments to `CommandlineUserManager`.h j}jjh!jh}r(h]h]h]h]h]ujMh]r(hX@PB connection authentication that should match the arguments to rr}r(hX@PB connection authentication that should match the arguments to h jubj)r}r(hX`CommandlineUserManager`h}r(h]h]h]h]h]uh jh]rhXCommandlineUserManagerrr}r(hUh jubah!jubhX.r}r(hX.h jubeubah!juubeubj=)r}r(hUh j jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX--passwdrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--passwdrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hXZPB connection authentication that should match the arguments to `CommandlineUserManager`. h}r(h]h]h]h]h]uh jh]rj)r}r(hXYPB connection authentication that should match the arguments to `CommandlineUserManager`.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hX@PB connection authentication that should match the arguments to rr}r(hX@PB connection authentication that should match the arguments to h jubj)r}r(hX`CommandlineUserManager`h}r(h]h]h]h]h]uh jh]rhXCommandlineUserManagerrr}r(hUh jubah!jubhX.r}r(hX.h jubeubah!juubeubj=)r}r(hUh j jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX--oprh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--oprr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hXThere are four supported values for the :option:`op` argument: :option:`add`, :option:`update`, :option:`remove`, and :option:`get`. Each are described in full in the following sections. h}r(h]h]h]h]h]uh jh]rj)r}r(hXThere are four supported values for the :option:`op` argument: :option:`add`, :option:`update`, :option:`remove`, and :option:`get`. Each are described in full in the following sections.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hX(There are four supported values for the rr}r(hX(There are four supported values for the h jubj)r}r(hX :option:`op`rh jjjh!jh}r(UreftypeXoptionjjXopU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXoprr}r(hUh jubah!jubaubhX argument: rr}r(hX argument: h jubj)r}r(hX :option:`add`rh jjjh!jh}r(UreftypeXoptionjjXaddU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXaddrr}r(hUh jubah!jubaubhX, rr}r(hX, h jubj)r}r(hX:option:`update`rh jjjh!jh}r(UreftypeXoptionjjXupdateU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXupdaterr }r (hUh jubah!jubaubhX, r r }r (hX, h jubj)r}r(hX:option:`remove`rh jjjh!jh}r(UreftypeXoptionjjXremoveU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXremoverr}r(hUh jubah!jubaubhX, and rr}r(hX, and h jubj)r }r!(hX :option:`get`r"h jjjh!jh}r#(UreftypeXoptionjjXgetU refdomainXstdr$jNh]h]U refexplicith]h]h]jhbujMh]r%j)r&}r'(hj"h}r((h]h]r)(jj$X std-optionr*eh]h]h]uh j h]r+hXgetr,r-}r.(hUh j&ubah!jubaubhX7. Each are described in full in the following sections.r/r0}r1(hX7. Each are described in full in the following sections.h jubeubah!juubeubj=)r2}r3(hUh j jjh!j@h}r4(h]h]h]h]h]ujNjjh]r5(jC)r6}r7(hUh}r8(h]h]h]h]h]uh j2h]r9jH)r:}r;(hX --bb_usernamer<h}r=(h]h]h]h]h]uh j6h]r>jN)r?}r@(hj<h}rA(h]h]h]h]h]uh j:h]rBhX --bb_usernamerCrD}rE(hUh j?ubah!jVubah!jWubah!jXubjY)rF}rG(hXUsed with the :option:`update` option, this sets the user's username for web authentication in the database. It requires :option:`bb_password` to be set along with it. h}rH(h]h]h]h]h]uh j2h]rIj)rJ}rK(hXUsed with the :option:`update` option, this sets the user's username for web authentication in the database. It requires :option:`bb_password` to be set along with it.h jFjjh!jh}rL(h]h]h]h]h]ujMh]rM(hXUsed with the rNrO}rP(hXUsed with the h jJubj)rQ}rR(hX:option:`update`rSh jJjjh!jh}rT(UreftypeXoptionjjXupdateU refdomainXstdrUjNh]h]U refexplicith]h]h]jhbujMh]rVj)rW}rX(hjSh}rY(h]h]rZ(jjUX std-optionr[eh]h]h]uh jQh]r\hXupdater]r^}r_(hUh jWubah!jubaubhX[ option, this sets the user's username for web authentication in the database. It requires r`ra}rb(hX[ option, this sets the user's username for web authentication in the database. It requires h jJubj)rc}rd(hX:option:`bb_password`reh jJjjh!jh}rf(UreftypeXoptionjjX bb_passwordU refdomainXstdrgjNh]h]U refexplicith]h]h]jhbujMh]rhj)ri}rj(hjeh}rk(h]h]rl(jjgX std-optionrmeh]h]h]uh jch]rnhX bb_passwordrorp}rq(hUh jiubah!jubaubhX to be set along with it.rrrs}rt(hX to be set along with it.h jJubeubah!juubeubj=)ru}rv(hUh j jjh!j@h}rw(h]h]h]h]h]ujNjjh]rx(jC)ry}rz(hUh}r{(h]h]h]h]h]uh juh]r|jH)r}}r~(hX --bb_passwordrh}r(h]h]h]h]h]uh jyh]rjN)r}r(hjh}r(h]h]h]h]h]uh j}h]rhX --bb_passwordrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hXAlso used with the :option:`update` option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons. h}r(h]h]h]h]h]uh juh]rj)r}r(hXAlso used with the :option:`update` option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hXAlso used with the rr}r(hXAlso used with the h jubj)r}r(hX:option:`update`rh jjjh!jh}r(UreftypeXoptionjjXupdateU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!jubaubhX option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.rr}r(hX option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.h jubeubah!juubeubj=)r}r(hUh j jjh!j@h}r(h]h]h]h]h]ujNjjh]r(jC)r}r(hUh}r(h]h]h]h]h]uh jh]rjH)r}r(hX--idsrh}r(h]h]h]h]h]uh jh]rjN)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--idsrr}r(hUh jubah!jVubah!jWubah!jXubjY)r}r(hXTWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The :option:`ids` option lets you specify a comma separated list of these identifiers for use with the :command:`user` command. The :option:`ids` option is used only when using :option:`remove` or :option:`show`. h}r(h]h]h]h]h]uh jh]r(j)r}r(hXWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The :option:`ids` option lets you specify a comma separated list of these identifiers for use with the :command:`user` command.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hXWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The rr}r(hXWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The h jubj)r}r(hX :option:`ids`rh jjjh!jh}r(UreftypeXoptionjjXidsU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXidsrr}r(hUh jubah!jubaubhXV option lets you specify a comma separated list of these identifiers for use with the rr}r(hXV option lets you specify a comma separated list of these identifiers for use with the h jubjM)r}r(hX:command:`user`h}r(h]h]rjRah]h]h]uh jh]rhXuserrr}r(hUh jubah!jWubhX command.rr}r(hX command.h jubeubj)r}r(hXTThe :option:`ids` option is used only when using :option:`remove` or :option:`show`.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hXThe rr}r(hXThe h jubj)r}r(hX :option:`ids`rh jjjh!jh}r(UreftypeXoptionjjXidsU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXidsrr}r(hUh jubah!jubaubhX option is used only when using rr}r(hX option is used only when using h jubj)r}r(hX:option:`remove`rh jjjh!jh}r(UreftypeXoptionjjXremoveU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXremoverr}r (hUh jubah!jubaubhX or r r }r (hX or h jubj)r }r(hX:option:`show`rh jjjh!jh}r(UreftypeXoptionjjXshowU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh j h]rhXshowrr}r(hUh jubah!jubaubhX.r}r(hX.h jubeubeh!juubeubj=)r}r(hUh j jNh!j@h}r (h]h]h]h]h]ujNjjh]r!(jC)r"}r#(hUh}r$(h]h]h]h]h]uh jh]r%jH)r&}r'(hX--infor(h}r)(h]h]h]h]h]uh j"h]r*jN)r+}r,(hj(h}r-(h]h]h]h]h]uh j&h]r.hX--infor/r0}r1(hUh j+ubah!jVubah!jWubah!jXubjY)r2}r3(hXUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see :ref:`Concepts-Users`). These attributes are specified in the form ``{TYPE}={VALUE}`` when using the :option:`info` option. These ``{TYPE}={VALUE}`` pairs are specified in a comma separated list, so for example: .. code-block:: none --info=svn=jschmo,git='Joe Schmo ' The :option:`info` option can be specified multiple times in the :command:`user` command, as each specified option will be interpreted as a new user. Note that :option:`info` is only used with :option:`add` or with :option:`update`, and whenever you use :option:`update` you need to specify the identifier of the user you want to update. This is done by prepending the :option:`info` arguments with ``{ID:}``. If we were to update ``'jschmo'`` from the previous example, it would look like this: .. code-block:: none --info=jschmo:git='Joseph Schmo ' h}r4(h]h]h]h]h]uh jh]r5(j)r6}r7(hX:Users are known in buildbot as a collection of attributes tied together by some unique identifier (see :ref:`Concepts-Users`). These attributes are specified in the form ``{TYPE}={VALUE}`` when using the :option:`info` option. These ``{TYPE}={VALUE}`` pairs are specified in a comma separated list, so for example:h j2jjh!jh}r8(h]h]h]h]h]ujMh]r9(hXgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see r:r;}r<(hXgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see h j6ubj)r=}r>(hX:ref:`Concepts-Users`r?h j6jjh!jh}r@(UreftypeXrefjjXconcepts-usersU refdomainXstdrAh]h]U refexplicith]h]h]jhbujMh]rBj)rC}rD(hj?h}rE(h]h]rF(jjAXstd-refrGeh]h]h]uh j=h]rHhXConcepts-UsersrIrJ}rK(hUh jCubah!jubaubhX.). These attributes are specified in the form rLrM}rN(hX.). These attributes are specified in the form h j6ubj})rO}rP(hX``{TYPE}={VALUE}``h}rQ(h]h]h]h]h]uh j6h]rRhX{TYPE}={VALUE}rSrT}rU(hUh jOubah!jubhX when using the rVrW}rX(hX when using the h j6ubj)rY}rZ(hX:option:`info`r[h j6jjh!jh}r\(UreftypeXoptionjjXinfoU refdomainXstdr]jNh]h]U refexplicith]h]h]jhbujMh]r^j)r_}r`(hj[h}ra(h]h]rb(jj]X std-optionrceh]h]h]uh jYh]rdhXinforerf}rg(hUh j_ubah!jubaubhX option. These rhri}rj(hX option. These h j6ubj})rk}rl(hX``{TYPE}={VALUE}``h}rm(h]h]h]h]h]uh j6h]rnhX{TYPE}={VALUE}rorp}rq(hUh jkubah!jubhX? pairs are specified in a comma separated list, so for example:rrrs}rt(hX? pairs are specified in a comma separated list, so for example:h j6ubeubj)ru}rv(hX1--info=svn=jschmo,git='Joe Schmo 'h j2jjh!jh}rw(jjXnonejjh]h]h]h]h]ujMh]rxhX1--info=svn=jschmo,git='Joe Schmo 'ryrz}r{(hUh juubaubj)r|}r}(hXThe :option:`info` option can be specified multiple times in the :command:`user` command, as each specified option will be interpreted as a new user. Note that :option:`info` is only used with :option:`add` or with :option:`update`, and whenever you use :option:`update` you need to specify the identifier of the user you want to update. This is done by prepending the :option:`info` arguments with ``{ID:}``. If we were to update ``'jschmo'`` from the previous example, it would look like this:h j2jjh!jh}r~(h]h]h]h]h]ujMh]r(hXThe rr}r(hXThe h j|ubj)r}r(hX:option:`info`rh j|jjh!jh}r(UreftypeXoptionjjXinfoU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!jubaubhX/ option can be specified multiple times in the rr}r(hX/ option can be specified multiple times in the h j|ubjM)r}r(hX:command:`user`h}r(h]h]rjRah]h]h]uh j|h]rhXuserrr}r(hUh jubah!jWubhXP command, as each specified option will be interpreted as a new user. Note that rr}r(hXP command, as each specified option will be interpreted as a new user. Note that h j|ubj)r}r(hX:option:`info`rh j|jjh!jh}r(UreftypeXoptionjjXinfoU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!jubaubhX is only used with rr}r(hX is only used with h j|ubj)r}r(hX :option:`add`rh j|jjh!jh}r(UreftypeXoptionjjXaddU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXaddrr}r(hUh jubah!jubaubhX or with rr}r(hX or with h j|ubj)r}r(hX:option:`update`rh j|jjh!jh}r(UreftypeXoptionjjXupdateU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!jubaubhX, and whenever you use rr}r(hX, and whenever you use h j|ubj)r}r(hX:option:`update`rh j|jjh!jh}r(UreftypeXoptionjjXupdateU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!jubaubhXc you need to specify the identifier of the user you want to update. This is done by prepending the rr}r(hXc you need to specify the identifier of the user you want to update. This is done by prepending the h j|ubj)r}r(hX:option:`info`rh j|jjh!jh}r(UreftypeXoptionjjXinfoU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!jubaubhX arguments with rr}r(hX arguments with h j|ubj})r}r(hX ``{ID:}``h}r(h]h]h]h]h]uh j|h]rhX{ID:}rr}r(hUh jubah!jubhX. If we were to update rr}r(hX. If we were to update h j|ubj})r}r(hX ``'jschmo'``h}r(h]h]h]h]h]uh j|h]rhX'jschmo'rr }r (hUh jubah!jubhX4 from the previous example, it would look like this:r r }r (hX4 from the previous example, it would look like this:h j|ubeubj)r}r(hX0--info=jschmo:git='Joseph Schmo 'h j2jjh!jh}r(jjXnonejjh]h]h]h]h]ujMh]rhX0--info=jschmo:git='Joseph Schmo 'rr}r(hUh jubaubeh!juubeubeubj)r}r(hXNote that :option:`--master`, :option:`--username`, :option:`--passwd`, and :option:`--op` are always required to issue the :command:`user` command.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hX Note that rr}r(hX Note that h jubj)r}r(hX:option:`--master`rh jjjh!jh}r(UreftypeXoptionjjX--masterU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMh]r!j)r"}r#(hjh}r$(h]h]r%(jj X std-optionr&eh]h]h]uh jh]r'hX--masterr(r)}r*(hUh j"ubah!jubaubhX, r+r,}r-(hX, h jubj)r.}r/(hX:option:`--username`r0h jjjh!jh}r1(UreftypeXoptionjjX --usernameU refdomainXstdr2jNh]h]U refexplicith]h]h]jhbujMh]r3j)r4}r5(hj0h}r6(h]h]r7(jj2X std-optionr8eh]h]h]uh j.h]r9hX --usernamer:r;}r<(hUh j4ubah!jubaubhX, r=r>}r?(hX, h jubj)r@}rA(hX:option:`--passwd`rBh jjjh!jh}rC(UreftypeXoptionjjX--passwdU refdomainXstdrDjNh]h]U refexplicith]h]h]jhbujMh]rEj)rF}rG(hjBh}rH(h]h]rI(jjDX std-optionrJeh]h]h]uh j@h]rKhX--passwdrLrM}rN(hUh jFubah!jubaubhX, and rOrP}rQ(hX, and h jubj)rR}rS(hX:option:`--op`rTh jjjh!jh}rU(UreftypeXoptionjjX--opU refdomainXstdrVjNh]h]U refexplicith]h]h]jhbujMh]rWj)rX}rY(hjTh}rZ(h]h]r[(jjVX std-optionr\eh]h]h]uh jRh]r]hX--opr^r_}r`(hUh jXubah!jubaubhX" are always required to issue the rarb}rc(hX" are always required to issue the h jubjM)rd}re(hX:command:`user`h}rf(h]h]rgjRah]h]h]uh jh]rhhXuserrirj}rk(hUh jdubah!jWubhX command.rlrm}rn(hX command.h jubeubj)ro}rp(hXEThe :option:`--master`, :option:`--username`, and :option:`--passwd` options can be specified in the option file with keywords :option:`user_master`, :option:`user_username`, and :option:`user_passwd`, respectively. If :option:`user_master` is not specified, then :option:`master` from the options file will be used instead.h jjjh!jh}rq(h]h]h]h]h]ujMjjh]rr(hXThe rsrt}ru(hXThe h joubj)rv}rw(hX:option:`--master`rxh jojjh!jh}ry(UreftypeXoptionjjX--masterU refdomainXstdrzjNh]h]U refexplicith]h]h]jhbujMh]r{j)r|}r}(hjxh}r~(h]h]r(jjzX std-optionreh]h]h]uh jvh]rhX--masterrr}r(hUh j|ubah!jubaubhX, rr}r(hX, h joubj)r}r(hX:option:`--username`rh jojjh!jh}r(UreftypeXoptionjjX --usernameU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --usernamerr}r(hUh jubah!jubaubhX, and rr}r(hX, and h joubj)r}r(hX:option:`--passwd`rh jojjh!jh}r(UreftypeXoptionjjX--passwdU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!jubaubhX; options can be specified in the option file with keywords rr}r(hX; options can be specified in the option file with keywords h joubj)r}r(hX:option:`user_master`rh jojjh!jh}r(UreftypeXoptionjjX user_masterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX user_masterrr}r(hUh jubah!jubaubhX, rr}r(hX, h joubj)r}r(hX:option:`user_username`rh jojjh!jh}r(UreftypeXoptionjjX user_usernameU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX user_usernamerr}r(hUh jubah!jubaubhX, and rr}r(hX, and h joubj)r}r(hX:option:`user_passwd`rh jojjh!jh}r(UreftypeXoptionjjX user_passwdU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX user_passwdrr}r(hUh jubah!jubaubhX, respectively. If rr}r(hX, respectively. If h joubj)r}r(hX:option:`user_master`rh jojjh!jh}r(UreftypeXoptionjjX user_masterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX user_masterrr}r(hUh jubah!jubaubhX is not specified, then rr}r(hX is not specified, then h joubj)r}r(hX:option:`master`rh jojjh!jh}r(UreftypeXoptionjjXmasterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXmasterrr}r(hUh jubah!jubaubhX, from the options file will be used instead.rr}r(hX, from the options file will be used instead.h joubeubj)r}r(hXBelow are examples of how each command should look. Whenever a :command:`user` command is successful, results will be shown to whoever issued the command.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r (hX?Below are examples of how each command should look. Whenever a r r }r (hX?Below are examples of how each command should look. Whenever a h jubjM)r }r(hX:command:`user`h}r(h]h]rjRah]h]h]uh jh]rhXuserrr}r(hUh j ubah!jWubhXL command is successful, results will be shown to whoever issued the command.rr}r(hXL command is successful, results will be shown to whoever issued the command.h jubeubj)r}r(hXFor :option:`add`:h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXFor rr}r(hXFor h jubj)r}r (hX :option:`add`r!h jjjh!jh}r"(UreftypeXoptionjjXaddU refdomainXstdr#jNh]h]U refexplicith]h]h]jhbujMh]r$j)r%}r&(hj!h}r'(h]h]r((jj#X std-optionr)eh]h]h]uh jh]r*hXaddr+r,}r-(hUh j%ubah!jubaubhX:r.}r/(hX:h jubeubj)r0}r1(hX~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...h jjjh!jh}r2(jjXnonejjh]h]h]h]h]ujMjjh]r3hX~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...r4r5}r6(hUh j0ubaubj)r7}r8(hXFor :option:`update`:h jjjh!jh}r9(h]h]h]h]h]ujMjjh]r:(hXFor r;r<}r=(hXFor h j7ubj)r>}r?(hX:option:`update`r@h j7jjh!jh}rA(UreftypeXoptionjjXupdateU refdomainXstdrBjNh]h]U refexplicith]h]h]jhbujMh]rCj)rD}rE(hj@h}rF(h]h]rG(jjBX std-optionrHeh]h]h]uh j>h]rIhXupdaterJrK}rL(hUh jDubah!jubaubhX:rM}rN(hX:h j7ubeubj)rO}rP(hXbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...h jjjh!jh}rQ(jjXnonejjh]h]h]h]h]ujMjjh]rRhXbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...rSrT}rU(hUh jOubaubj)rV}rW(hXFor :option:`remove`:h jjjh!jh}rX(h]h]h]h]h]ujMjjh]rY(hXFor rZr[}r\(hXFor h jVubj)r]}r^(hX:option:`remove`r_h jVjjh!jh}r`(UreftypeXoptionjjXremoveU refdomainXstdrajNh]h]U refexplicith]h]h]jhbujMh]rbj)rc}rd(hj_h}re(h]h]rf(jjaX std-optionrgeh]h]h]uh j]h]rhhXremoverirj}rk(hUh jcubah!jubaubhX:rl}rm(hX:h jVubeubj)rn}ro(hX}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h jjjh!jh}rp(jjXnonejjh]h]h]h]h]ujMjjh]rqhX}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...rrrs}rt(hUh jnubaubj)ru}rv(hXFor :option:`get`:h jjjh!jh}rw(h]h]h]h]h]ujMjjh]rx(hXFor ryrz}r{(hXFor h juubj)r|}r}(hX :option:`get`r~h jujjh!jh}r(UreftypeXoptionjjXgetU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hj~h}r(h]h]r(jjX std-optionreh]h]h]uh j|h]rhXgetrr}r(hUh jubah!jubaubhX:r}r(hX:h juubeubj)r}r(hXzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h jjjh!jh}r(jjXnonejjh]h]h]h]h]ujM jjh]rhXzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...rr}r(hUh jubaubj)r}r(hXA note on :option:`update`: when updating the :option:`bb_username` and :option:`bb_password`, the :option:`info` doesn't need to have additional ``{TYPE}={VALUE}`` pairs to update and can just take the ``{ID}`` portion.h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(hX A note on rr}r(hX A note on h jubj)r}r(hX:option:`update`rh jjjh!jh}r(UreftypeXoptionjjXupdateU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!jubaubhX: when updating the rr}r(hX: when updating the h jubj)r}r(hX:option:`bb_username`rh jjjh!jh}r(UreftypeXoptionjjX bb_usernameU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX bb_usernamerr}r(hUh jubah!jubaubhX and rr}r(hX and h jubj)r}r(hX:option:`bb_password`rh jjjh!jh}r(UreftypeXoptionjjX bb_passwordU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX bb_passwordrr}r(hUh jubah!jubaubhX, the rr}r(hX, the h jubj)r}r(hX:option:`info`rh jjjh!jh}r(UreftypeXoptionjjXinfoU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!jubaubhX! doesn't need to have additional rr}r(hX! doesn't need to have additional h jubj})r}r(hX``{TYPE}={VALUE}``h}r(h]h]h]h]h]uh jh]rhX{TYPE}={VALUE}rr}r(hUh jubah!jubhX' pairs to update and can just take the rr}r(hX' pairs to update and can just take the h jubj})r}r(hX``{ID}``h}r(h]h]h]h]h]uh jh]rhX{ID}rr}r(hUh jubah!jubhX portion.rr}r(hX portion.h jubeubj)r}r(hX.. _buildbot-config-directory:h jjjh!jh}r(h]h]h]h]h]jjujMjjh]ubeubeubjjj}h!jh}r(h]h]h]h]r(jjeh]rj&aujM^jjj}rjjsh]r(h)r}r(hX debugclientrh jhjjh!h"h}r(h]h]h]h]h]ujM^jjh]rhX debugclientrr}r(hjh jubaubj)r}r(hXDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}h jhjjh!jh}r (jjXnonejjh]h]h]h]h]ujM`jjh]r hXDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}r r }r (hUh jubaubj)r}r(hXThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's ``debug port``. This debug port shares the same port number as the slaveport (see :ref:`Setting-the-PB-Port-for-Slaves`), but the ``debugPort`` is only enabled if you set a debug password in the buildmaster's config file (see :ref:`Debug-Options`). The :option:`--passwd` option must match the ``c['debugPassword']`` value.h jhjjh!jh}r(h]h]h]h]h]ujMdjjh]r(hXSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's rr}r(hXSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's h jubj})r}r(hX``debug port``h}r(h]h]h]h]h]uh jh]rhX debug portrr}r(hUh jubah!jubhXD. This debug port shares the same port number as the slaveport (see rr}r(hXD. This debug port shares the same port number as the slaveport (see h jubj)r}r (hX%:ref:`Setting-the-PB-Port-for-Slaves`r!h jjjh!jh}r"(UreftypeXrefjjXsetting-the-pb-port-for-slavesU refdomainXstdr#h]h]U refexplicith]h]h]jhbujMdh]r$j)r%}r&(hj!h}r'(h]h]r((jj#Xstd-refr)eh]h]h]uh jh]r*hXSetting-the-PB-Port-for-Slavesr+r,}r-(hUh j%ubah!jubaubhX ), but the r.r/}r0(hX ), but the h jubj})r1}r2(hX ``debugPort``h}r3(h]h]h]h]h]uh jh]r4hX debugPortr5r6}r7(hUh j1ubah!jubhXS is only enabled if you set a debug password in the buildmaster's config file (see r8r9}r:(hXS is only enabled if you set a debug password in the buildmaster's config file (see h jubj)r;}r<(hX:ref:`Debug-Options`r=h jjjh!jh}r>(UreftypeXrefjjX debug-optionsU refdomainXstdr?h]h]U refexplicith]h]h]jhbujMdh]r@j)rA}rB(hj=h}rC(h]h]rD(jj?Xstd-refrEeh]h]h]uh j;h]rFhX Debug-OptionsrGrH}rI(hUh jAubah!jubaubhX). The rJrK}rL(hX). The h jubj)rM}rN(hX:option:`--passwd`rOh jjjh!jh}rP(UreftypeXoptionjjX--passwdU refdomainXstdrQjNh]h]U refexplicith]h]h]jhbujMdh]rRj)rS}rT(hjOh}rU(h]h]rV(jjQX std-optionrWeh]h]h]uh jMh]rXhX--passwdrYrZ}r[(hUh jSubah!jubaubhX option must match the r\r]}r^(hX option must match the h jubj})r_}r`(hX``c['debugPassword']``h}ra(h]h]h]h]h]uh jh]rbhXc['debugPassword']rcrd}re(hUh j_ubah!jubhX value.rfrg}rh(hX value.h jubeubj)ri}rj(hX:option:`--master` can also be provided in :file:`.debug/options` by the ``master`` key. :option:`--passwd` can be provided by the ``debugPassword`` key. See :ref:`buildbot-config-directory`.h jhjjh!jh}rk(h]h]h]h]h]ujMljjh]rl(j)rm}rn(hX:option:`--master`roh jijjh!jh}rp(UreftypeXoptionjjX--masterU refdomainXstdrqjNh]h]U refexplicith]h]h]jhbujMlh]rrj)rs}rt(hjoh}ru(h]h]rv(jjqX std-optionrweh]h]h]uh jmh]rxhX--masterryrz}r{(hUh jsubah!jubaubhX can also be provided in r|r}}r~(hX can also be provided in h jiubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jih]rhX.debug/optionsrr}r(hX.debug/optionsh jubah!jubhX by the rr}r(hX by the h jiubj})r}r(hX ``master``h}r(h]h]h]h]h]uh jih]rhXmasterrr}r(hUh jubah!jubhX key. rr}r(hX key. h jiubj)r}r(hX:option:`--passwd`rh jijjh!jh}r(UreftypeXoptionjjX--passwdU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMlh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!jubaubhX can be provided by the rr}r(hX can be provided by the h jiubj})r}r(hX``debugPassword``h}r(h]h]h]h]h]uh jih]rhX debugPasswordrr}r(hUh jubah!jubhX key. See rr}r(hX key. See h jiubj)r}r(hX :ref:`buildbot-config-directory`rh jijjh!jh}r(UreftypeXrefjjXbuildbot-config-directoryU refdomainXstdrh]h]U refexplicith]h]h]jhbujMlh]rj)r}r(hjh}r(h]h]r(jjXstd-refreh]h]h]uh jh]rhXbuildbot-config-directoryrr}r(hUh jubah!jubaubhX.r}r(hX.h jiubeubj)r}r(hXThe :guilabel:`Connect` button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:h jhjjh!jh}r(h]h]h]h]h]ujMpjjh]r(hXThe rr}r(hXThe h jubj)r}r(hUh}r(UrawtextX:guilabel:`Connect`h]h]h]h]rXguilabelrah]uh jh]rhXConnectrr}r(hUh jubah!jubhX button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:rr}r(hX button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:h jubeubcdocutils.nodes definition_list r)r}r(hUh jhjjh!Udefinition_listrh}r(h]h]h]h]h]ujNjjh]r(cdocutils.nodes definition_list_item r)r}r(hX~:guilabel:`Reload .cfg` Forces the buildmaster to reload its :file:`master.cfg` file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's :file:`twistd.log` as you reload the config file, as any errors which are detected in the config file will be announced there. h jjjh!Udefinition_list_itemrh}r(h]h]h]h]h]ujMzh]r(cdocutils.nodes term r)r}r(hX:guilabel:`Reload .cfg`rh jjjh!Utermrh}r(h]h]h]h]h]ujMzh]rj)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Reload .cfgrr}r(hUh jubah!jubaubcdocutils.nodes definition r)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hXeForces the buildmaster to reload its :file:`master.cfg` file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's :file:`twistd.log` as you reload the config file, as any errors which are detected in the config file will be announced there.h jjjh!jh}r(h]h]h]h]h]ujMuh]r(hX%Forces the buildmaster to reload its rr}r(hX%Forces the buildmaster to reload its h jubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jh]rhX master.cfgrr}r(hX master.cfgh jubah!jubhX file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's rr}r(hX file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's h jubj})r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh jh]rhX twistd.logrr}r(hX twistd.logh j ubah!jubhXl as you reload the config file, as any errors which are detected in the config file will be announced there.rr}r(hXl as you reload the config file, as any errors which are detected in the config file will be announced there.h jubeubah!U definitionrubeubj)r}r(hX:guilabel:`Rebuild .py` (not yet implemented). The idea here is to use Twisted's ``rebuild`` facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers. h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(j)r}r(hX:guilabel:`Rebuild .py`rh jjjh!jh}r(h]h]h]h]h]ujMh]rj)r}r (hUh}r!(Urawtextjh]h]h]h]r"Xguilabelr#ah]uh jh]r$hX Rebuild .pyr%r&}r'(hUh jubah!jubaubj)r(}r)(hUh}r*(h]h]h]h]h]uh jh]r+j)r,}r-(hX(not yet implemented). The idea here is to use Twisted's ``rebuild`` facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.h j(jjh!jh}r.(h]h]h]h]h]ujM}h]r/(hX9(not yet implemented). The idea here is to use Twisted's r0r1}r2(hX9(not yet implemented). The idea here is to use Twisted's h j,ubj})r3}r4(hX ``rebuild``h}r5(h]h]h]h]h]uh j,h]r6hXrebuildr7r8}r9(hUh j3ubah!jubhX facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.r:r;}r<(hX facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.h j,ubeubah!jubeubj)r=}r>(hX:guilabel:`poke IRC` This locates a :class:`words.IRC` status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect. h jjjh!jh}r?(h]h]h]h]h]ujMjjh]r@(j)rA}rB(hX:guilabel:`poke IRC`rCh j=jjh!jh}rD(h]h]h]h]h]ujMh]rEj)rF}rG(hUh}rH(UrawtextjCh]h]h]h]rIXguilabelrJah]uh jAh]rKhXpoke IRCrLrM}rN(hUh jFubah!jubaubj)rO}rP(hUh}rQ(h]h]h]h]h]uh j=h]rRj)rS}rT(hX This locates a :class:`words.IRC` status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.h jOjjh!jh}rU(h]h]h]h]h]ujMh]rV(hXThis locates a rWrX}rY(hXThis locates a h jSubj)rZ}r[(hX:class:`words.IRC`r\h jSjjh!jh}r](UreftypeXclassjjX words.IRCU refdomainXpyr^h]h]U refexplicith]h]h]jhbjX NjY NujMh]r_j})r`}ra(hj\h}rb(h]h]rc(jj^Xpy-classrdeh]h]h]uh jZh]rehX words.IRCrfrg}rh(hUh j`ubah!jubaubhX status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.rirj}rk(hX status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.h jSubeubah!jubeubj)rl}rm(hX:guilabel:`Commit` This allows you to inject a :class:`Change`, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string. h jjjh!jh}rn(h]h]h]h]h]ujMjjh]ro(j)rp}rq(hX:guilabel:`Commit`rrh jljjh!jh}rs(h]h]h]h]h]ujMh]rtj)ru}rv(hUh}rw(Urawtextjrh]h]h]h]rxXguilabelryah]uh jph]rzhXCommitr{r|}r}(hUh juubah!jubaubj)r~}r(hUh}r(h]h]h]h]h]uh jlh]rj)r}r(hXThis allows you to inject a :class:`Change`, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.h j~jjh!jh}r(h]h]h]h]h]ujMh]r(hXThis allows you to inject a rr}r(hXThis allows you to inject a h jubj)r}r(hX:class:`Change`rh jjjh!jh}r(UreftypeXclassjjXChangeU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujMh]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhXChangerr}r(hUh jubah!jubaubhXY, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.rr}r(hXY, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.h jubeubah!jubeubj)r}r(hX:guilabel:`Force Build` This lets you force a :class:`Builder` (selected by name) to start a build of the current source tree. h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(j)r}r(hX:guilabel:`Force Build`rh jjjh!jh}r(h]h]h]h]h]ujMh]rj)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Force Buildrr}r(hUh jubah!jubaubj)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hXfThis lets you force a :class:`Builder` (selected by name) to start a build of the current source tree.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hXThis lets you force a rr}r(hXThis lets you force a h jubj)r}r(hX:class:`Builder`rh jjjh!jh}r(UreftypeXclassjjXBuilderU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujMh]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhXBuilderrr}r(hUh jubah!jubaubhX@ (selected by name) to start a build of the current source tree.rr}r(hX@ (selected by name) to start a build of the current source tree.h jubeubah!jubeubj)r}r(hX:guilabel:`Currently` (obsolete). This was used to manually set the status of the given :class:`Builder`, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful. h jjjh!jh}r(h]h]h]h]h]ujMjjh]r(j)r}r(hX:guilabel:`Currently`rh jjjh!jh}r(h]h]h]h]h]ujMh]rj)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Currentlyrr}r(hUh jubah!jubaubj)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hX(obsolete). This was used to manually set the status of the given :class:`Builder`, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.h jjjh!jh}r(h]h]h]h]h]ujMh]r(hXB(obsolete). This was used to manually set the status of the given rr}r(hXB(obsolete). This was used to manually set the status of the given h jubj)r}r(hX:class:`Builder`rh jjjh!jh}r(UreftypeXclassjjXBuilderU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujMh]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhXBuilderrr}r(hUh jubah!jubaubhXo, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.rr}r(hXo, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.h jubeubah!jubeubeubj[)r}r(hUh jhjjh!j^h}r(h]h]h]h]h]Uentries]r((UsingleXCommand Line Subcommands; userjjtr(UsingleXuser Command Line SubcommandjjtreujMjjh]ubjeubjj jjjj)r}r(hUh j jjh!jh}r(h]h]h]h]rjah]rjaujM jjh]r(h)r}r(hXWaiting for resultsrh jjjh!h"h}r(h]h]h]h]h]ujM jjh]r hXWaiting for resultsr r }r (hjh jubaubj)r }r(hXfIf you provide the :option:`--wait` option (or ``try_wait = True`` in :file:`.buildbot/options`), the ``buildbot try`` command will wait until your changes have either been proven good or bad before exiting. Unless you use the :option:`--quiet` option (or ``try_quiet=True``), it will emit a progress message every 60 seconds until the builds have completed.h jjjh!jh}r(h]h]h]h]h]ujM jjh]r(hXIf you provide the rr}r(hXIf you provide the h j ubj)r}r(hX:option:`--wait`rh j jjh!jh}r(UreftypeXoptionjjX--waitU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujM h]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--waitr r!}r"(hUh jubah!jubaubhX option (or r#r$}r%(hX option (or h j ubj})r&}r'(hX``try_wait = True``h}r((h]h]h]h]h]uh j h]r)hXtry_wait = Truer*r+}r,(hUh j&ubah!jubhX in r-r.}r/(hX in h j ubj})r0}r1(hUh}r2(h]h]h]h]r3Xfiler4aUrolej4h]uh j h]r5hX.buildbot/optionsr6r7}r8(hX.buildbot/optionsh j0ubah!jubhX), the r9r:}r;(hX), the h j ubj})r<}r=(hX``buildbot try``h}r>(h]h]h]h]h]uh j h]r?hX buildbot tryr@rA}rB(hUh j<ubah!jubhXm command will wait until your changes have either been proven good or bad before exiting. Unless you use the rCrD}rE(hXm command will wait until your changes have either been proven good or bad before exiting. Unless you use the h j ubj)rF}rG(hX:option:`--quiet`rHh j jjh!jh}rI(UreftypeXoptionjjX--quietU refdomainXstdrJjNh]h]U refexplicith]h]h]jhbujM h]rKj)rL}rM(hjHh}rN(h]h]rO(jjJX std-optionrPeh]h]h]uh jFh]rQhX--quietrRrS}rT(hUh jLubah!jubaubhX option (or rUrV}rW(hX option (or h j ubj})rX}rY(hX``try_quiet=True``h}rZ(h]h]h]h]h]uh j h]r[hXtry_quiet=Truer\r]}r^(hUh jXubah!jubhXT), it will emit a progress message every 60 seconds until the builds have completed.r_r`}ra(hXT), it will emit a progress message every 60 seconds until the builds have completed.h j ubeubj)rb}rc(hX?The SSH connection method does not support waiting for results.rdh jjjh!jh}re(h]h]h]h]h]ujMjjh]rfhX?The SSH connection method does not support waiting for results.rgrh}ri(hjdh jbubaubeubjjj>j:jjFjj jjjjj[ jLjFjjj7jjjj)rj}rk(hUh j jjj}rljj)rm}rn(hX.. _try--diff:h j)ro}rp(hUh j jjh!jh}rq(h]h]h]h]rrjah]rsjaujMjjh]rt(h)ru}rv(hXSending propertiesrwh jojjh!h"h}rx(h]h]h]h]h]ujMjjh]ryhXSending propertiesrzr{}r|(hjwh juubaubj)r}}r~(hXYou can set properties to send with your change using either the :option:`--property=key=value` option, which sets a single property, or the :option:`--properties=key1=value1,key2=value2...` option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the :option:`--properties` option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the :option:`--property` option to set it.h jojjh!jh}r(h]h]h]h]h]ujMjjh]r(hXAYou can set properties to send with your change using either the rr}r(hXAYou can set properties to send with your change using either the h j}ubj)r}r(hX:option:`--property=key=value`rh j}jjh!jh}r(UreftypeXoptionjjX--property=key=valueU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--property=key=valuerr}r(hUh jubah!jubaubhX. option, which sets a single property, or the rr}r(hX. option, which sets a single property, or the h j}ubj)r}r(hX1:option:`--properties=key1=value1,key2=value2...`rh j}jjh!jh}r(UreftypeXoptionjjX'--properties=key1=value1,key2=value2...U refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX'--properties=key1=value1,key2=value2...rr}r(hUh jubah!jubaubhXx option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the rr}r(hXx option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the h j}ubj)r}r(hX:option:`--properties`rh j}jjh!jh}r(UreftypeXoptionjjX --propertiesU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --propertiesrr}r(hUh jubah!jubaubhXv option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the rr}r(hXv option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the h j}ubj)r}r(hX:option:`--property`rh j}jjh!jh}r(UreftypeXoptionjjX --propertyU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --propertyrr}r(hUh jubah!jubaubhX option to set it.rr}r(hX option to set it.h j}ubeubjmeubjjh!jh}r(h]h]h]h]h]jjujMjjh]ubsh!jh}r(h]h]h]h]r(jjeh]r(j.jeujMjjj}rjjmsh]r(h)r}r(hX try --diffrh jjjjh!h"h}r(h]h]h]h]h]ujMjjh]rhX try --diffrr}r(hjh jubaubj)r}r(hX[Sometimes you might have a patch from someone else that you want to submit to the buildbot. For example, a user may have created a patch to fix some specific bug and sent it to you by email. You've inspected the patch and suspect that it might do the job (and have at least confirmed that it doesn't do anything evil). Now you want to test it out.rh jjjjh!jh}r(h]h]h]h]h]ujMjjh]rhX[Sometimes you might have a patch from someone else that you want to submit to the buildbot. For example, a user may have created a patch to fix some specific bug and sent it to you by email. You've inspected the patch and suspect that it might do the job (and have at least confirmed that it doesn't do anything evil). Now you want to test it out.rr}r(hjh jubaubj)r}r(hXOne approach would be to check out a new local tree, apply the patch, run your local tests, then use ``buildbot try`` to run the tests on other platforms. An alternate approach is to use the ``buildbot try --diff`` form to have the buildbot test the patch without using a local tree.h jjjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXeOne approach would be to check out a new local tree, apply the patch, run your local tests, then use rr}r(hXeOne approach would be to check out a new local tree, apply the patch, run your local tests, then use h jubj})r}r(hX``buildbot try``h}r(h]h]h]h]h]uh jh]rhX buildbot tryrr}r(hUh jubah!jubhXJ to run the tests on other platforms. An alternate approach is to use the rr}r(hXJ to run the tests on other platforms. An alternate approach is to use the h jubj})r}r(hX``buildbot try --diff``h}r(h]h]h]h]h]uh jh]rhXbuildbot try --diffrr}r(hUh jubah!jubhXE form to have the buildbot test the patch without using a local tree.rr}r(hXE form to have the buildbot test the patch without using a local tree.h jubeubj)r}r(hX5This form takes a :option:`--diff` argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional :option:`--baserev` argument, a tree of the given revision will be used as a starting point instead of TRUNK.h jjjjh!jh}r(h]h]h]h]h]ujMjjh]r(hXThis form takes a rr}r(hXThis form takes a h jubj)r}r(hX:option:`--diff`rh jjjh!jh}r(UreftypeXoptionjjX--diffU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]r j)r }r (hjh}r (h]h]r (jjX std-optionreh]h]h]uh jh]rhX--diffrr}r(hUh j ubah!jubaubhX argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional rr}r(hX argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional h jubj)r}r(hX:option:`--baserev`rh jjjh!jh}r(UreftypeXoptionjjX --baserevU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionr eh]h]h]uh jh]r!hX --baserevr"r#}r$(hUh jubah!jubaubhXZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.r%r&}r'(hXZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.h jubeubj)r(}r)(hXPYou can also use ``buildbot try --diff=-`` to read the patch from :file:`stdin`.h jjjjh!jh}r*(h]h]h]h]h]ujMjjh]r+(hXYou can also use r,r-}r.(hXYou can also use h j(ubj})r/}r0(hX``buildbot try --diff=-``h}r1(h]h]h]h]h]uh j(h]r2hXbuildbot try --diff=-r3r4}r5(hUh j/ubah!jubhX to read the patch from r6r7}r8(hX to read the patch from h j(ubj})r9}r:(hUh}r;(h]h]h]h]r<Xfiler=aUrolej=h]uh j(h]r>hXstdinr?r@}rA(hXstdinh j9ubah!jubhX.rB}rC(hX.h j(ubeubj)rD}rE(hXEach patch has a ``patchlevel`` associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the :option:`-p` or :option:`--strip` argument to the :command:`patch` utility. By default ``buildbot try --diff`` uses a patchlevel of 0, but you can override this with the :option:`-p` argument.h jjjjh!jh}rF(h]h]h]h]h]ujMjjh]rG(hXEach patch has a rHrI}rJ(hXEach patch has a h jDubj})rK}rL(hX``patchlevel``h}rM(h]h]h]h]h]uh jDh]rNhX patchlevelrOrP}rQ(hUh jKubah!jubhX associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the rRrS}rT(hX associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the h jDubj)rU}rV(hX :option:`-p`rWh jDjjh!jh}rX(UreftypeXoptionjjX-pU refdomainXstdrYjNh]h]U refexplicith]h]h]jhbujMh]rZj)r[}r\(hjWh}r](h]h]r^(jjYX std-optionr_eh]h]h]uh jUh]r`hX-prarb}rc(hUh j[ubah!jubaubhX or rdre}rf(hX or h jDubj)rg}rh(hX:option:`--strip`rih jDjjh!jh}rj(UreftypeXoptionjjX--stripU refdomainXstdrkjNh]h]U refexplicith]h]h]jhbujMh]rlj)rm}rn(hjih}ro(h]h]rp(jjkX std-optionrqeh]h]h]uh jgh]rrhX--striprsrt}ru(hUh jmubah!jubaubhX argument to the rvrw}rx(hX argument to the h jDubjM)ry}rz(hX:command:`patch`h}r{(h]h]r|jRah]h]h]uh jDh]r}hXpatchr~r}r(hUh jyubah!jWubhX utility. By default rr}r(hX utility. By default h jDubj})r}r(hX``buildbot try --diff``h}r(h]h]h]h]h]uh jDh]rhXbuildbot try --diffrr}r(hUh jubah!jubhX< uses a patchlevel of 0, but you can override this with the rr}r(hX< uses a patchlevel of 0, but you can override this with the h jDubj)r}r(hX :option:`-p`rh jDjjh!jh}r(UreftypeXoptionjjX-pU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX-prr}r(hUh jubah!jubaubhX argument.rr}r(hX argument.h jDubeubj)r}r(hXPWhen you use :option:`--diff`, you do not need to use any of the other options that relate to a local tree, specifically :option:`--vc`, :option:`--try-topfile`, or :option:`--try-topdir`. These options will be ignored. Of course you must still specify how to get to the buildmaster (with :option:`--connect`, :option:`--tryhost`, etc).h jjjjh!jh}r(h]h]h]h]h]ujMjjh]r(hX When you use rr}r(hX When you use h jubj)r}r(hX:option:`--diff`rh jjjh!jh}r(UreftypeXoptionjjX--diffU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--diffrr}r(hUh jubah!jubaubhX\, you do not need to use any of the other options that relate to a local tree, specifically rr}r(hX\, you do not need to use any of the other options that relate to a local tree, specifically h jubj)r}r(hX:option:`--vc`rh jjjh!jh}r(UreftypeXoptionjjX--vcU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--vcrr}r(hUh jubah!jubaubhX, rr}r(hX, h jubj)r}r(hX:option:`--try-topfile`rh jjjh!jh}r(UreftypeXoptionjjX --try-topfileU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --try-topfilerr}r(hUh jubah!jubaubhX, or rr}r(hX, or h jubj)r}r(hX:option:`--try-topdir`rh jjjh!jh}r(UreftypeXoptionjjX --try-topdirU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --try-topdirrr}r(hUh jubah!jubaubhXf. These options will be ignored. Of course you must still specify how to get to the buildmaster (with rr}r(hXf. These options will be ignored. Of course you must still specify how to get to the buildmaster (with h jubj)r}r(hX:option:`--connect`rh jjjh!jh}r(UreftypeXoptionjjX --connectU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX --connectrr}r(hUh jubah!jubaubhX, rr}r(hX, h jubj)r}r(hX:option:`--tryhost`rh jjjh!jh}r(UreftypeXoptionjjX --tryhostU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMh]rj)r}r(hjh}r (h]h]r (jjX std-optionr eh]h]h]uh jh]r hX --tryhostr r}r(hUh jubah!jubaubhX, etc).rr}r(hX, etc).h jubeubeubjj)r}r(hUh jjjj}rjjsh!jh}r(h]h]h]h]r(jjeh]r(j1jeujMjjj}rjjsh]r(h)r}r(hX.buildbot config directoryrh jjjh!h"h}r(h]h]h]h]h]ujMjjh]rhX.buildbot config directoryr r!}r"(hjh jubaubj)r#}r$(hXMany of the :command:`buildbot` tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an ``options`` file. The :command:`buildbot` command will look for a special directory named :file:`.buildbot`, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named :file:`options` in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple ``name = 'value'`` pairs in this file to set the options.h jjjh!jh}r%(h]h]h]h]h]ujMjjh]r&(hX Many of the r'r(}r)(hX Many of the h j#ubjM)r*}r+(hX:command:`buildbot`h}r,(h]h]r-jRah]h]h]uh j#h]r.hXbuildbotr/r0}r1(hUh j*ubah!jWubhX tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an r2r3}r4(hX tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an h j#ubj})r5}r6(hX ``options``h}r7(h]h]h]h]h]uh j#h]r8hXoptionsr9r:}r;(hUh j5ubah!jubhX file. The r<r=}r>(hX file. The h j#ubjM)r?}r@(hX:command:`buildbot`h}rA(h]h]rBjRah]h]h]uh j#h]rChXbuildbotrDrE}rF(hUh j?ubah!jWubhX1 command will look for a special directory named rGrH}rI(hX1 command will look for a special directory named h j#ubj})rJ}rK(hUh}rL(h]h]h]h]rMXfilerNaUrolejNh]uh j#h]rOhX .buildbotrPrQ}rR(hX .buildboth jJubah!jubhX, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named rSrT}rU(hX, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named h j#ubj})rV}rW(hUh}rX(h]h]h]h]rYXfilerZaUrolejZh]uh j#h]r[hXoptionsr\r]}r^(hXoptionsh jVubah!jubhXz in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple r_r`}ra(hXz in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple h j#ubj})rb}rc(hX``name = 'value'``h}rd(h]h]h]h]h]uh j#h]rehXname = 'value'rfrg}rh(hUh jbubah!jubhX' pairs in this file to set the options.rirj}rk(hX' pairs in this file to set the options.h j#ubeubj)rl}rm(hXFor a description of the names used in this file, please see the documentation for the individual :command:`buildbot` sub-commands. The following is a brief sample of what this file's contents could be.h jjjh!jh}rn(h]h]h]h]h]ujM&jjh]ro(hXbFor a description of the names used in this file, please see the documentation for the individual rprq}rr(hXbFor a description of the names used in this file, please see the documentation for the individual h jlubjM)rs}rt(hX:command:`buildbot`h}ru(h]h]rvjRah]h]h]uh jlh]rwhXbuildbotrxry}rz(hUh jsubah!jWubhXU sub-commands. The following is a brief sample of what this file's contents could be.r{r|}r}(hXU sub-commands. The following is a brief sample of what this file's contents could be.h jlubeubj)r~}r(hX# for status-reading tools masterstatus = 'buildbot.example.org:12345' # for 'sendchange' or the debug port master = 'buildbot.example.org:18990' debugPassword = 'eiv7Po'h jjjh!jh}r(jjXnonejjh]h]h]h]h]ujM*jjh]rhX# for status-reading tools masterstatus = 'buildbot.example.org:12345' # for 'sendchange' or the debug port master = 'buildbot.example.org:18990' debugPassword = 'eiv7Po'rr}r(hUh j~ubaubj)r}r(hXlNote carefully that the names in the :file:`options` file usually do not match the command-line option name.h jjjh!jh}r(h]h]h]h]h]ujM2jjh]r(hX%Note carefully that the names in the rr}r(hX%Note carefully that the names in the h jubj})r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jh]rhXoptionsrr}r(hXoptionsh jubah!jubhX8 file usually do not match the command-line option name.rr}r(hX8 file usually do not match the command-line option name.h jubeubj)r}r(hUh jjjh!jh}r(h]h]h]h]h]ujNjjh]r(j)r}r(hX``masterstatus`` Equivalent to :option:`--master` for :bb:cmdline:`statuslog` and :bb:cmdline:`statusgui`, this gives the location of the :class:`client.PBListener` status port. h jjjh!jh}r(h]h]h]h]h]ujM7h]r(j)r}r(hX``masterstatus``rh jjjh!jh}r(h]h]h]h]h]ujM7h]rj})r}r(hjh}r(h]h]h]h]h]uh jh]rhX masterstatusrr}r(hUh jubah!jubaubj)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hXEquivalent to :option:`--master` for :bb:cmdline:`statuslog` and :bb:cmdline:`statusgui`, this gives the location of the :class:`client.PBListener` status port.h jjjh!jh}r(h]h]h]h]h]ujM6h]r(hXEquivalent to rr}r(hXEquivalent to h jubj)r}r(hX:option:`--master`rh jjjh!jh}r(UreftypeXoptionjjX--masterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujM6h]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--masterrr}r(hUh jubah!jubaubhX for rr}r(hX for h jubj)r}r(hX:bb:cmdline:`statuslog`rh jjjh!jh}r(UreftypeXcmdlinejjX statuslogU refdomainXbbrh]h]U refexplicith]h]h]jhbujM6h]rj})r}r(hjh}r(h]h]r(jjX bb-cmdlinereh]h]h]uh jh]rhX statuslogrr}r(hUh jubah!jubaubhX and rr}r(hX and h jubj)r}r(hX:bb:cmdline:`statusgui`rh jjjh!jh}r(UreftypeXcmdlinejjX statusguiU refdomainXbbrh]h]U refexplicith]h]h]jhbujM6h]rj})r}r(hjh}r(h]h]r(jjX bb-cmdlinereh]h]h]uh jh]rhX statusguirr}r(hUh jubah!jubaubhX!, this gives the location of the rr}r(hX!, this gives the location of the h jubj)r}r(hX:class:`client.PBListener`rh jjjh!jh}r(UreftypeXclassjjXclient.PBListenerU refdomainXpyrh]h]U refexplicith]h]h]jhbjX NjY NujM6h]rj})r}r(hjh}r(h]h]r(jjXpy-classreh]h]h]uh jh]rhXclient.PBListenerrr}r(hUh jubah!jubaubhX status port.rr}r(hX status port.h jubeubah!jubeubj)r}r(hX7``master`` Equivalent to :option:`--master` for :bb:cmdline:`debugclient` and :bb:cmdline:`sendchange`. This option is used for two purposes. It is the location of the ``debugPort`` for ``debugclient`` and the location of the :class:`pb.PBChangeSource` for ```sendchange``. Generally these are the same port. h jjjh!jh}r(h]h]h]h]h]ujM>jjh]r(j)r}r(hX ``master``rh jjjh!jh}r(h]h]h]h]h]ujM>h]rj})r}r (hjh}r (h]h]h]h]h]uh jh]r hXmasterr r }r(hUh jubah!jubaubj)r}r(hUh}r(h]h]h]h]h]uh jh]rj)r}r(hX+Equivalent to :option:`--master` for :bb:cmdline:`debugclient` and :bb:cmdline:`sendchange`. This option is used for two purposes. It is the location of the ``debugPort`` for ``debugclient`` and the location of the :class:`pb.PBChangeSource` for ```sendchange``. Generally these are the same port.h jjjh!jh}r(h]h]h]h]h]ujM:h]r(hXEquivalent to rr}r(hXEquivalent to h jubj)r}r(hX:option:`--master`rh jjjh!jh}r(UreftypeXoptionjjX--masterU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujM:h]rj)r }r!(hjh}r"(h]h]r#(jjX std-optionr$eh]h]h]uh jh]r%hX--masterr&r'}r((hUh j ubah!jubaubhX for r)r*}r+(hX for h jubj)r,}r-(hX:bb:cmdline:`debugclient`r.h jjjh!jh}r/(UreftypeXcmdlinejjX debugclientU refdomainXbbr0h]h]U refexplicith]h]h]jhbujM:h]r1j})r2}r3(hj.h}r4(h]h]r5(jj0X bb-cmdliner6eh]h]h]uh j,h]r7hX debugclientr8r9}r:(hUh j2ubah!jubaubhX and r;r<}r=(hX and h jubj)r>}r?(hX:bb:cmdline:`sendchange`r@h jjjh!jh}rA(UreftypeXcmdlinejjX sendchangeU refdomainXbbrBh]h]U refexplicith]h]h]jhbujM:h]rCj})rD}rE(hj@h}rF(h]h]rG(jjBX bb-cmdlinerHeh]h]h]uh j>h]rIhX sendchangerJrK}rL(hUh jDubah!jubaubhXC. This option is used for two purposes. It is the location of the rMrN}rO(hXC. This option is used for two purposes. It is the location of the h jubj})rP}rQ(hX ``debugPort``h}rR(h]h]h]h]h]uh jh]rShX debugPortrTrU}rV(hUh jPubah!jubhX for rWrX}rY(hX for h jubj})rZ}r[(hX``debugclient``h}r\(h]h]h]h]h]uh jh]r]hX debugclientr^r_}r`(hUh jZubah!jubhX and the location of the rarb}rc(hX and the location of the h jubj)rd}re(hX:class:`pb.PBChangeSource`rfh jjjh!jh}rg(UreftypeXclassjjXpb.PBChangeSourceU refdomainXpyrhh]h]U refexplicith]h]h]jhbjX NjY NujM:h]rij})rj}rk(hjfh}rl(h]h]rm(jjhXpy-classrneh]h]h]uh jdh]rohXpb.PBChangeSourcerprq}rr(hUh jjubah!jubaubhX for rsrt}ru(hX for h jubj})rv}rw(hX```sendchange``h}rx(h]h]h]h]h]uh jh]ryhX `sendchangerzr{}r|(hUh jvubah!jubhX%. Generally these are the same port.r}r~}r(hX%. Generally these are the same port.h jubeubah!jubeubj)r}r(hX``debugPassword`` Equivalent to :option:`--passwd` for :bb:cmdline:`debugclient`. .. important:: This value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command. h jjjh!jh}r(h]h]h]h]h]ujMFjjh]r(j)r}r(hX``debugPassword``rh jjjh!jh}r(h]h]h]h]h]ujMFh]rj})r}r(hjh}r(h]h]h]h]h]uh jh]rhX debugPasswordrr}r(hUh jubah!jubaubj)r}r(hUh}r(h]h]h]h]h]uh jh]r(j)r}r(hX?Equivalent to :option:`--passwd` for :bb:cmdline:`debugclient`.h jjjh!jh}r(h]h]h]h]h]ujMAh]r(hXEquivalent to rr}r(hXEquivalent to h jubj)r}r(hX:option:`--passwd`rh jjjh!jh}r(UreftypeXoptionjjX--passwdU refdomainXstdrjNh]h]U refexplicith]h]h]jhbujMAh]rj)r}r(hjh}r(h]h]r(jjX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!jubaubhX for rr}r(hX for h jubj)r}r(hX:bb:cmdline:`debugclient`rh jjjh!jh}r(UreftypeXcmdlinejjX debugclientU refdomainXbbrh]h]U refexplicith]h]h]jhbujMAh]rj})r}r(hjh}r(h]h]r(jjX bb-cmdlinereh]h]h]uh jh]rhX debugclientrr}r(hUh jubah!jubaubhX.r}r(hX.h jubeubcdocutils.nodes important r)r}r(hXThis value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command.h}r(h]h]h]h]h]uh jh]rj)r}r(hXThis value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command.h jjjh!jh}r(h]h]h]h]h]ujMEh]r(hX#This value must match the value of rr}r(hX#This value must match the value of h jubj)r}r(hX:bb:cfg:`debugPassword`rh jjjh!jh}r(UreftypeXcfgjjX debugPasswordU refdomainXbbrh]h]U refexplicith]h]h]jhbujMEh]rj})r}r(hjh}r(h]h]r(jjXbb-cfgreh]h]h]uh jh]rhX debugPasswordrr}r(hUh jubah!jubaubhX*, used to protect the debug port, for the rr}r(hX*, used to protect the debug port, for the h jubj)r}r(hX:bb:cmdline:`debugclient`rh jjjh!jh}r(UreftypeXcmdlinejjX debugclientU refdomainXbbrh]h]U refexplicith]h]h]jhbujMEh]rj})r}r(hjh}r(h]h]r(jjX bb-cmdlinereh]h]h]uh jh]rhX debugclientrr}r(hUh jubah!jubaubhX command.rr}r(hX command.h jubeubah!U importantrubeh!jubeubj)r}r(hXZ``username`` Equivalent to :option:`--username` for the :bb:cmdline:`sendchange` command. h jjjh!jh}r(h]h]h]h]h]ujMIjjh]r(j)r}r(hX ``username``rh jjjh!jh}r(h]h]h]h]h]ujMIh]rj})r}r(hjh}r(h]h]h]h]h]uh jh]rhXusernamerr}r(hUh jubah!jubaubj)r}r (hUh}r (h]h]h]h]h]uh jh]r j)r }r (hXLEquivalent to :option:`--username` for the :bb:cmdline:`sendchange` command.h jjjh!jh}r (h]h]h]h]h]ujMIh]r (hXEquivalent to r r }r (hXEquivalent to h j ubj)r }r (hX:option:`--username`r h j jjh!jh}r (UreftypeXoptionjjX --usernameU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMIh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --usernamer r }r (hUh j ubah!jubaubhX for the r r }r (hX for the h j ubj)r }r (hX:bb:cmdline:`sendchange`r h j jjh!jh}r (UreftypeXcmdlinejjX sendchangeU refdomainXbbr h]h]U refexplicith]h]h]jhbujMIh]r! j})r" }r# (hj h}r$ (h]h]r% (jj X bb-cmdliner& eh]h]h]uh j h]r' hX sendchanger( r) }r* (hUh j" ubah!jubaubhX command.r+ r, }r- (hX command.h j ubeubah!jubeubj)r. }r/ (hXV``branch`` Equivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command. h jjjh!jh}r0 (h]h]h]h]h]ujMLjjh]r1 (j)r2 }r3 (hX ``branch``r4 h j. jjh!jh}r5 (h]h]h]h]h]ujMLh]r6 j})r7 }r8 (hj4 h}r9 (h]h]h]h]h]uh j2 h]r: hXbranchr; r< }r= (hUh j7 ubah!jubaubj)r> }r? (hUh}r@ (h]h]h]h]h]uh j. h]rA j)rB }rC (hXJEquivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command.h j> jjh!jh}rD (h]h]h]h]h]ujMLh]rE (hXEquivalent to rF rG }rH (hXEquivalent to h jB ubj)rI }rJ (hX:option:`--branch`rK h jB jjh!jh}rL (UreftypeXoptionjjX--branchU refdomainXstdrM jNh]h]U refexplicith]h]h]jhbujMLh]rN j)rO }rP (hjK h}rQ (h]h]rR (jjM X std-optionrS eh]h]h]uh jI h]rT hX--branchrU rV }rW (hUh jO ubah!jubaubhX for the rX rY }rZ (hX for the h jB ubj)r[ }r\ (hX:bb:cmdline:`sendchange`r] h jB jjh!jh}r^ (UreftypeXcmdlinejjX sendchangeU refdomainXbbr_ h]h]U refexplicith]h]h]jhbujMLh]r` j})ra }rb (hj] h}rc (h]h]rd (jj_ X bb-cmdlinere eh]h]h]uh j[ h]rf hX sendchangerg rh }ri (hUh ja ubah!jubaubhX command.rj rk }rl (hX command.h jB ubeubah!jubeubj)rm }rn (hXZ``category`` Equivalent to :option:`--category` for the :bb:cmdline:`sendchange` command. h jjjh!jh}ro (h]h]h]h]h]ujMOjjh]rp (j)rq }rr (hX ``category``rs h jm jjh!jh}rt (h]h]h]h]h]ujMOh]ru j})rv }rw (hjs h}rx (h]h]h]h]h]uh jq h]ry hXcategoryrz r{ }r| (hUh jv ubah!jubaubj)r} }r~ (hUh}r (h]h]h]h]h]uh jm h]r j)r }r (hXLEquivalent to :option:`--category` for the :bb:cmdline:`sendchange` command.h j} jjh!jh}r (h]h]h]h]h]ujMOh]r (hXEquivalent to r r }r (hXEquivalent to h j ubj)r }r (hX:option:`--category`r h j jjh!jh}r (UreftypeXoptionjjX --categoryU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMOh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --categoryr r }r (hUh j ubah!jubaubhX for the r r }r (hX for the h j ubj)r }r (hX:bb:cmdline:`sendchange`r h j jjh!jh}r (UreftypeXcmdlinejjX sendchangeU refdomainXbbr h]h]U refexplicith]h]h]jhbujMOh]r j})r }r (hj h}r (h]h]r (jj X bb-cmdliner eh]h]h]uh j h]r hX sendchanger r }r (hUh j ubah!jubaubhX command.r r }r (hX command.h j ubeubah!jubeubj)r }r (hX``try_connect`` Equivalent to :option:`--connect`, this specifies how the :bb:cmdline:`try` command should deliver its request to the buildmaster. The currently accepted values are ``ssh`` and ``pb``. h jjjh!jh}r (h]h]h]h]h]ujMTjjh]r (j)r }r (hX``try_connect``r h j jjh!jh}r (h]h]h]h]h]ujMTh]r j})r }r (hj h}r (h]h]h]h]h]uh j h]r hX try_connectr r }r (hUh j ubah!jubaubj)r }r (hUh}r (h]h]h]h]h]uh j h]r j)r }r (hXEquivalent to :option:`--connect`, this specifies how the :bb:cmdline:`try` command should deliver its request to the buildmaster. The currently accepted values are ``ssh`` and ``pb``.h j jjh!jh}r (h]h]h]h]h]ujMRh]r (hXEquivalent to r r }r (hXEquivalent to h j ubj)r }r (hX:option:`--connect`r h j jjh!jh}r (UreftypeXoptionjjX --connectU refdomainXstdr jNh]h]U refexplicith]h]h]jhbujMRh]r j)r }r (hj h}r (h]h]r (jj X std-optionr eh]h]h]uh j h]r hX --connectr r }r (hUh j ubah!jubaubhX, this specifies how the r r }r (hX, this specifies how the h j ubj)r }r (hX:bb:cmdline:`try`r h j jjh!jh}r (UreftypeXcmdlinejjXtryU refdomainXbbr h]h]U refexplicith]h]h]jhbujMRh]r j})r }r (hj h}r (h]h]r (jj X bb-cmdliner eh]h]h]uh j h]r hXtryr r }r (hUh j ubah!jubaubhXZ command should deliver its request to the buildmaster. The currently accepted values are r r }r (hXZ command should deliver its request to the buildmaster. The currently accepted values are h j ubj})r }r (hX``ssh``h}r (h]h]h]h]h]uh j h]r hXsshr r }r (hUh j ubah!jubhX and r r }r (hX and h j ubj})r }r (hX``pb``h}r (h]h]h]h]h]uh j h]r hXpbr r }r (hUh j ubah!jubhX.r }r (hX.h j ubeubah!jubeubj)r }r (hX~``try_builders`` Equivalent to :option:`--builders`, specifies which builders should be used for the :bb:cmdline:`try` build. h jjjh!jh}r!(h]h]h]h]h]ujMXjjh]r!(j)r!}r!(hX``try_builders``r!h j jjh!jh}r!(h]h]h]h]h]ujMXh]r!j})r!}r!(hj!h}r !(h]h]h]h]h]uh j!h]r !hX try_buildersr !r !}r !(hUh j!ubah!jubaubj)r!}r!(hUh}r!(h]h]h]h]h]uh j h]r!j)r!}r!(hXlEquivalent to :option:`--builders`, specifies which builders should be used for the :bb:cmdline:`try` build.h j!jjh!jh}r!(h]h]h]h]h]ujMWh]r!(hXEquivalent to r!r!}r!(hXEquivalent to h j!ubj)r!}r!(hX:option:`--builders`r!h j!jjh!jh}r!(UreftypeXoptionjjX --buildersU refdomainXstdr!jNh]h]U refexplicith]h]h]jhbujMWh]r!j)r!}r !(hj!h}r!!(h]h]r"!(jj!X std-optionr#!eh]h]h]uh j!h]r$!hX --buildersr%!r&!}r'!(hUh j!ubah!jubaubhX2, specifies which builders should be used for the r(!r)!}r*!(hX2, specifies which builders should be used for the h j!ubj)r+!}r,!(hX:bb:cmdline:`try`r-!h j!jjh!jh}r.!(UreftypeXcmdlinejjXtryU refdomainXbbr/!h]h]U refexplicith]h]h]jhbujMWh]r0!j})r1!}r2!(hj-!h}r3!(h]h]r4!(jj/!X bb-cmdliner5!eh]h]h]uh j+!h]r6!hXtryr7!r8!}r9!(hUh j1!ubah!jubaubhX build.r:!r;!}r!(hXu``try_vc`` Equivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used. h jjjh!jh}r?!(h]h]h]h]h]ujM\jjh]r@!(j)rA!}rB!(hX ``try_vc``rC!h j=!jjh!jh}rD!(h]h]h]h]h]ujM\h]rE!j})rF!}rG!(hjC!h}rH!(h]h]h]h]h]uh jA!h]rI!hXtry_vcrJ!rK!}rL!(hUh jF!ubah!jubaubj)rM!}rN!(hUh}rO!(h]h]h]h]h]uh j=!h]rP!j)rQ!}rR!(hXiEquivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used.h jM!jjh!jh}rS!(h]h]h]h]h]ujM[h]rT!(hXEquivalent to rU!rV!}rW!(hXEquivalent to h jQ!ubj)rX!}rY!(hX:option:`--vc`rZ!h jQ!jjh!jh}r[!(UreftypeXoptionjjX--vcU refdomainXstdr\!jNh]h]U refexplicith]h]h]jhbujM[h]r]!j)r^!}r_!(hjZ!h}r`!(h]h]ra!(jj\!X std-optionrb!eh]h]h]uh jX!h]rc!hX--vcrd!re!}rf!(hUh j^!ubah!jubaubhX for rg!rh!}ri!(hX for h jQ!ubj)rj!}rk!(hX:bb:cmdline:`try`rl!h jQ!jjh!jh}rm!(UreftypeXcmdlinejjXtryU refdomainXbbrn!h]h]U refexplicith]h]h]jhbujM[h]ro!j})rp!}rq!(hjl!h}rr!(h]h]rs!(jjn!X bb-cmdlinert!eh]h]h]uh jj!h]ru!hXtryrv!rw!}rx!(hUh jp!ubah!jubaubhX7, this specifies the version control system being used.ry!rz!}r{!(hX7, this specifies the version control system being used.h jQ!ubeubah!jubeubj)r|!}r}!(hXp``try_branch`` Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch. h jjjh!jh}r~!(h]h]h]h]h]ujM`jjh]r!(j)r!}r!(hX``try_branch``r!h j|!jjh!jh}r!(h]h]h]h]h]ujM`h]r!j})r!}r!(hj!h}r!(h]h]h]h]h]uh j!h]r!hX try_branchr!r!}r!(hUh j!ubah!jubaubj)r!}r!(hUh}r!(h]h]h]h]h]uh j|!h]r!j)r!}r!(hX`Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch.h j!jjh!jh}r!(h]h]h]h]h]ujM_h]r!(hXEquivalent to r!r!}r!(hXEquivalent to h j!ubj)r!}r!(hX:option:`--branch`r!h j!jjh!jh}r!(UreftypeXoptionjjX--branchU refdomainXstdr!jNh]h]U refexplicith]h]h]jhbujM_h]r!j)r!}r!(hj!h}r!(h]h]r!(jj!X std-optionr!eh]h]h]uh j!h]r!hX--branchr!r!}r!(hUh j!ubah!jubaubhX@, this indicates that the current tree is on a non-trunk branch.r!r!}r!(hX@, this indicates that the current tree is on a non-trunk branch.h j!ubeubah!jubeubeubj)r!}r!(hX``try_topdir``r!h jjjh!jh}r!(h]h]h]h]h]ujMbjjh]r!j})r!}r!(hj!h}r!(h]h]h]h]h]uh j!h]r!hX try_topdirr!r!}r!(hUh j!ubah!jubaubj)r!}r!(hUh jjjh!jh}r!(h]h]h]h]h]ujNjjh]r!j)r!}r!(hX``try_topfile`` Use ``try_topdir``, equivalent to :option:`--try-topdir`, to explicitly indicate the top of your working tree, or ``try_topfile``, equivalent to :option:`--try-topfile` to name a file that will only be found in that top-most directory. h j!jjh!jh}r!(h]h]h]h]h]ujMhh]r!(j)r!}r!(hX``try_topfile``r!h j!jjh!jh}r!(h]h]h]h]h]ujMhh]r!j})r!}r!(hj!h}r!(h]h]h]h]h]uh j!h]r!hX try_topfiler!r!}r!(hUh j!ubah!jubaubj)r!}r!(hUh}r!(h]h]h]h]h]uh j!h]r!j)r!}r!(hXUse ``try_topdir``, equivalent to :option:`--try-topdir`, to explicitly indicate the top of your working tree, or ``try_topfile``, equivalent to :option:`--try-topfile` to name a file that will only be found in that top-most directory.h j!jjh!jh}r!(h]h]h]h]h]ujMeh]r!(hXUse r!r!}r!(hXUse h j!ubj})r!}r!(hX``try_topdir``h}r!(h]h]h]h]h]uh j!h]r!hX try_topdirr!r!}r!(hUh j!ubah!jubhX, equivalent to r!r!}r!(hX, equivalent to h j!ubj)r!}r!(hX:option:`--try-topdir`r!h j!jjh!jh}r!(UreftypeXoptionjjX --try-topdirU refdomainXstdr!jNh]h]U refexplicith]h]h]jhbujMeh]r!j)r!}r!(hj!h}r!(h]h]r!(jj!X std-optionr!eh]h]h]uh j!h]r!hX --try-topdirr!r!}r!(hUh j!ubah!jubaubhX:, to explicitly indicate the top of your working tree, or r!r!}r!(hX:, to explicitly indicate the top of your working tree, or h j!ubj})r!}r!(hX``try_topfile``h}r!(h]h]h]h]h]uh j!h]r!hX try_topfiler!r!}r!(hUh j!ubah!jubhX, equivalent to r!r!}r!(hX, equivalent to h j!ubj)r!}r!(hX:option:`--try-topfile`r!h j!jjh!jh}r!(UreftypeXoptionjjX --try-topfileU refdomainXstdr!jNh]h]U refexplicith]h]h]jhbujMeh]r!j)r"}r"(hj!h}r"(h]h]r"(jj!X std-optionr"eh]h]h]uh j!h]r"hX --try-topfiler"r"}r"(hUh j"ubah!jubaubhXC to name a file that will only be found in that top-most directory.r "r "}r "(hXC to name a file that will only be found in that top-most directory.h j!ubeubah!jubeubaubj)r "}r "(hX ``try_host``r"h jjjh!jh}r"(h]h]h]h]h]ujMjjjh]r"j})r"}r"(hj"h}r"(h]h]h]h]h]uh j "h]r"hXtry_hostr"r"}r"(hUh j"ubah!jubaubj)r"}r"(hX``try_username``r"h jjjh!jh}r"(h]h]h]h]h]ujMljjh]r"j})r"}r"(hj"h}r"(h]h]h]h]h]uh j"h]r "hX try_usernamer!"r""}r#"(hUh j"ubah!jubaubj)r$"}r%"(hUh jjjh!jh}r&"(h]h]h]h]h]ujNjjh]r'"j)r("}r)"(hX``try_dir`` When ``try_connect`` is ``ssh``, the command will use ``try_host`` for :option:`--tryhost`, ``try_username`` for :option:`--username`, and ``try_dir`` for :option:`--trydir`. Apologies for the confusing presence and absence of 'try'. h j$"jjh!jh}r*"(h]h]h]h]h]ujMrh]r+"(j)r,"}r-"(hX ``try_dir``r."h j("jjh!jh}r/"(h]h]h]h]h]ujMrh]r0"j})r1"}r2"(hj."h}r3"(h]h]h]h]h]uh j,"h]r4"hXtry_dirr5"r6"}r7"(hUh j1"ubah!jubaubj)r8"}r9"(hUh}r:"(h]h]h]h]h]uh j("h]r;"j)r<"}r="(hXWhen ``try_connect`` is ``ssh``, the command will use ``try_host`` for :option:`--tryhost`, ``try_username`` for :option:`--username`, and ``try_dir`` for :option:`--trydir`. Apologies for the confusing presence and absence of 'try'.h j8"jjh!jh}r>"(h]h]h]h]h]ujMoh]r?"(hXWhen r@"rA"}rB"(hXWhen h j<"ubj})rC"}rD"(hX``try_connect``h}rE"(h]h]h]h]h]uh j<"h]rF"hX try_connectrG"rH"}rI"(hUh jC"ubah!jubhX is rJ"rK"}rL"(hX is h j<"ubj})rM"}rN"(hX``ssh``h}rO"(h]h]h]h]h]uh j<"h]rP"hXsshrQ"rR"}rS"(hUh jM"ubah!jubhX, the command will use rT"rU"}rV"(hX, the command will use h j<"ubj})rW"}rX"(hX ``try_host``h}rY"(h]h]h]h]h]uh j<"h]rZ"hXtry_hostr["r\"}r]"(hUh jW"ubah!jubhX for r^"r_"}r`"(hX for h j<"ubj)ra"}rb"(hX:option:`--tryhost`rc"h j<"jjh!jh}rd"(UreftypeXoptionjjX --tryhostU refdomainXstdre"jNh]h]U refexplicith]h]h]jhbujMoh]rf"j)rg"}rh"(hjc"h}ri"(h]h]rj"(jje"X std-optionrk"eh]h]h]uh ja"h]rl"hX --tryhostrm"rn"}ro"(hUh jg"ubah!jubaubhX, rp"rq"}rr"(hX, h j<"ubj})rs"}rt"(hX``try_username``h}ru"(h]h]h]h]h]uh j<"h]rv"hX try_usernamerw"rx"}ry"(hUh js"ubah!jubhX for rz"r{"}r|"(hX for h j<"ubj)r}"}r~"(hX:option:`--username`r"h j<"jjh!jh}r"(UreftypeXoptionjjX --usernameU refdomainXstdr"jNh]h]U refexplicith]h]h]jhbujMoh]r"j)r"}r"(hj"h}r"(h]h]r"(jj"X std-optionr"eh]h]h]uh j}"h]r"hX --usernamer"r"}r"(hUh j"ubah!jubaubhX, and r"r"}r"(hX, and h j<"ubj})r"}r"(hX ``try_dir``h}r"(h]h]h]h]h]uh j<"h]r"hXtry_dirr"r"}r"(hUh j"ubah!jubhX for r"r"}r"(hX for h j<"ubj)r"}r"(hX:option:`--trydir`r"h j<"jjh!jh}r"(UreftypeXoptionjjX--trydirU refdomainXstdr"jNh]h]U refexplicith]h]h]jhbujMoh]r"j)r"}r"(hj"h}r"(h]h]r"(jj"X std-optionr"eh]h]h]uh j"h]r"hX--trydirr"r"}r"(hUh j"ubah!jubaubhX=. Apologies for the confusing presence and absence of 'try'.r"r"}r"(hX=. Apologies for the confusing presence and absence of 'try'.h j<"ubeubah!jubeubaubj)r"}r"(hX``try_username``r"h jjjh!jh}r"(h]h]h]h]h]ujMtjjh]r"j})r"}r"(hj"h}r"(h]h]h]h]h]uh j"h]r"hX try_usernamer"r"}r"(hUh j"ubah!jubaubj)r"}r"(hX``try_password``r"h jjjh!jh}r"(h]h]h]h]h]ujMvjjh]r"j})r"}r"(hj"h}r"(h]h]h]h]h]uh j"h]r"hX try_passwordr"r"}r"(hUh j"ubah!jubaubj)r"}r"(hUh jjjh!jh}r"(h]h]h]h]h]ujNjjh]r"j)r"}r"(hX``try_master`` Similarly, when ``try_connect`` is ``pb``, the command will pay attention to ``try_username`` for :option:`--username`, ``try_password`` for :option:`--passwd`, and ``try_master`` for :option:`--master`. h j"jjh!jh}r"(h]h]h]h]h]ujM{h]r"(j)r"}r"(hX``try_master``r"h j"jjh!jh}r"(h]h]h]h]h]ujM{h]r"j})r"}r"(hj"h}r"(h]h]h]h]h]uh j"h]r"hX try_masterr"r"}r"(hUh j"ubah!jubaubj)r"}r"(hUh}r"(h]h]h]h]h]uh j"h]r"j)r"}r"(hXSimilarly, when ``try_connect`` is ``pb``, the command will pay attention to ``try_username`` for :option:`--username`, ``try_password`` for :option:`--passwd`, and ``try_master`` for :option:`--master`.h j"jjh!jh}r"(h]h]h]h]h]ujMyh]r"(hXSimilarly, when r"r"}r"(hXSimilarly, when h j"ubj})r"}r"(hX``try_connect``h}r"(h]h]h]h]h]uh j"h]r"hX try_connectr"r"}r"(hUh j"ubah!jubhX is r"r"}r"(hX is h j"ubj})r"}r"(hX``pb``h}r"(h]h]h]h]h]uh j"h]r"hXpbr"r"}r"(hUh j"ubah!jubhX$, the command will pay attention to r"r"}r"(hX$, the command will pay attention to h j"ubj})r"}r"(hX``try_username``h}r"(h]h]h]h]h]uh j"h]r"hX try_usernamer"r"}r"(hUh j"ubah!jubhX for r"r"}r"(hX for h j"ubj)r#}r#(hX:option:`--username`r#h j"jjh!jh}r#(UreftypeXoptionjjX --usernameU refdomainXstdr#jNh]h]U refexplicith]h]h]jhbujMyh]r#j)r#}r#(hj#h}r#(h]h]r #(jj#X std-optionr #eh]h]h]uh j#h]r #hX --usernamer #r #}r#(hUh j#ubah!jubaubhX, r#r#}r#(hX, h j"ubj})r#}r#(hX``try_password``h}r#(h]h]h]h]h]uh j"h]r#hX try_passwordr#r#}r#(hUh j#ubah!jubhX for r#r#}r#(hX for h j"ubj)r#}r#(hX:option:`--passwd`r#h j"jjh!jh}r#(UreftypeXoptionjjX--passwdU refdomainXstdr #jNh]h]U refexplicith]h]h]jhbujMyh]r!#j)r"#}r##(hj#h}r$#(h]h]r%#(jj #X std-optionr&#eh]h]h]uh j#h]r'#hX--passwdr(#r)#}r*#(hUh j"#ubah!jubaubhX, and r+#r,#}r-#(hX, and h j"ubj})r.#}r/#(hX``try_master``h}r0#(h]h]h]h]h]uh j"h]r1#hX try_masterr2#r3#}r4#(hUh j.#ubah!jubhX for r5#r6#}r7#(hX for h j"ubj)r8#}r9#(hX:option:`--master`r:#h j"jjh!jh}r;#(UreftypeXoptionjjX--masterU refdomainXstdr<#jNh]h]U refexplicith]h]h]jhbujMyh]r=#j)r>#}r?#(hj:#h}r@#(h]h]rA#(jj<#X std-optionrB#eh]h]h]uh j8#h]rC#hX--masterrD#rE#}rF#(hUh j>#ubah!jubaubhX.rG#}rH#(hX.h j"ubeubah!jubeubaubj)rI#}rJ#(hX ``try_wait``rK#h jjjh!jh}rL#(h]h]h]h]h]ujM}jjh]rM#j})rN#}rO#(hjK#h}rP#(h]h]h]h]h]uh jI#h]rQ#hXtry_waitrR#rS#}rT#(hUh jN#ubah!jubaubj)rU#}rV#(hUh jjjh!jh}rW#(h]h]h]h]h]ujNjjh]rX#j)rY#}rZ#(hX``masterstatus`` ``try_wait`` and ``masterstatus`` (equivalent to :option:`--wait` and ``master``, respectively) are used to ask the :bb:cmdline:`try` command to wait for the requested build to complete. h jU#jjh!jh}r[#(h]h]h]h]h]ujMh]r\#(j)r]#}r^#(hX``masterstatus``r_#h jY#jjh!jh}r`#(h]h]h]h]h]ujMh]ra#j})rb#}rc#(hj_#h}rd#(h]h]h]h]h]uh j]#h]re#hX masterstatusrf#rg#}rh#(hUh jb#ubah!jubaubj)ri#}rj#(hUh}rk#(h]h]h]h]h]uh jY#h]rl#j)rm#}rn#(hX``try_wait`` and ``masterstatus`` (equivalent to :option:`--wait` and ``master``, respectively) are used to ask the :bb:cmdline:`try` command to wait for the requested build to complete.h ji#jjh!jh}ro#(h]h]h]h]h]ujMh]rp#(j})rq#}rr#(hX ``try_wait``h}rs#(h]h]h]h]h]uh jm#h]rt#hXtry_waitru#rv#}rw#(hUh jq#ubah!jubhX and rx#ry#}rz#(hX and h jm#ubj})r{#}r|#(hX``masterstatus``h}r}#(h]h]h]h]h]uh jm#h]r~#hX masterstatusr#r#}r#(hUh j{#ubah!jubhX (equivalent to r#r#}r#(hX (equivalent to h jm#ubj)r#}r#(hX:option:`--wait`r#h jm#jjh!jh}r#(UreftypeXoptionjjX--waitU refdomainXstdr#jNh]h]U refexplicith]h]h]jhbujMh]r#j)r#}r#(hj#h}r#(h]h]r#(jj#X std-optionr#eh]h]h]uh j#h]r#hX--waitr#r#}r#(hUh j#ubah!jubaubhX and r#r#}r#(hX and h jm#ubj})r#}r#(hX ``master``h}r#(h]h]h]h]h]uh jm#h]r#hXmasterr#r#}r#(hUh j#ubah!jubhX$, respectively) are used to ask the r#r#}r#(hX$, respectively) are used to ask the h jm#ubj)r#}r#(hX:bb:cmdline:`try`r#h jm#jjh!jh}r#(UreftypeXcmdlinejjXtryU refdomainXbbr#h]h]U refexplicith]h]h]jhbujMh]r#j})r#}r#(hj#h}r#(h]h]r#(jj#X bb-cmdliner#eh]h]h]uh j#h]r#hXtryr#r#}r#(hUh j#ubah!jubaubhX5 command to wait for the requested build to complete.r#r#}r#(hX5 command to wait for the requested build to complete.h jm#ubeubah!jubeubaubeubjjojjj j Uindex-0r#j)r#}r#(hjh j jjj}h!jh}r#(h]h]r#jah]h]r#j#ah]ujMjjj}r#j#jsh]r#(h)r#}r#(hjh}r#(h]h]h]h]h]uh j#h]r#hXTodor#r#}r#(hjh j#ubah!h"ubj)r#}r#(hjh j#jjh!jh}r#(h]h]h]h]h]ujMh]r#hXI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.r#r#}r#(hjh j#ubaubeubjjjj jj jj jj jjjjj)r#}r#(hUh j jjh!jh}r#(h]h]h]h]r#jah]r#jaujM0jjh]r#(h)r#}r#(hXSpecifying the VC systemr#h j#jjh!h"h}r#(h]h]h]h]h]ujM0jjh]r#hXSpecifying the VC systemr#r#}r#(hj#h j#ubaubj)r#}r#(hXThe :command:`try` command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the :command:`try` command which VC system you are using, with an argument like :option:`--vc=cvs` or :option:`--vc=git`. This can also be provided as ``try_vc`` in :file:`.buildbot/options`.h j#jjh!jh}r#(h]h]h]h]h]ujM2jjh]r#(hXThe r#r#}r#(hXThe h j#ubjM)r#}r#(hX:command:`try`h}r#(h]h]r#jRah]h]h]uh j#h]r#hXtryr#r#}r#(hUh j#ubah!jWubhX command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the r#r#}r#(hX command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the h j#ubjM)r#}r#(hX:command:`try`h}r#(h]h]r#jRah]h]h]uh j#h]r#hXtryr#r#}r#(hUh j#ubah!jWubhX> command which VC system you are using, with an argument like r#r#}r#(hX> command which VC system you are using, with an argument like h j#ubj)r#}r#(hX:option:`--vc=cvs`r#h j#jjh!jh}r#(UreftypeXoptionjjX--vc=cvsU refdomainXstdr#jNh]h]U refexplicith]h]h]jhbujM2h]r#j)r#}r#(hj#h}r#(h]h]r#(jj#X std-optionr#eh]h]h]uh j#h]r#hX--vc=cvsr$r$}r$(hUh j#ubah!jubaubhX or r$r$}r$(hX or h j#ubj)r$}r$(hX:option:`--vc=git`r$h j#jjh!jh}r $(UreftypeXoptionjjX--vc=gitU refdomainXstdr $jNh]h]U refexplicith]h]h]jhbujM2h]r $j)r $}r $(hj$h}r$(h]h]r$(jj $X std-optionr$eh]h]h]uh j$h]r$hX--vc=gitr$r$}r$(hUh j $ubah!jubaubhX. This can also be provided as r$r$}r$(hX. This can also be provided as h j#ubj})r$}r$(hX ``try_vc``h}r$(h]h]h]h]h]uh j#h]r$hXtry_vcr$r$}r$(hUh j$ubah!jubhX in r$r $}r!$(hX in h j#ubj})r"$}r#$(hUh}r$$(h]h]h]h]r%$Xfiler&$aUrolej&$h]uh j#h]r'$hX.buildbot/optionsr($r)$}r*$(hX.buildbot/optionsh j"$ubah!jubhX.r+$}r,$(hX.h j#ubeubcdocutils.nodes comment r-$)r.$}r/$(hXAThe order of this list comes from the end of scripts/tryclient.pyh j#jjh!Ucommentr0$h}r1$(jjh]h]h]h]h]ujM;jjh]r2$hXAThe order of this list comes from the end of scripts/tryclient.pyr3$r4$}r5$(hUh j.$ubaubj)r6$}r7$(hXcThe following names are recognized: ``bzr`` ``cvs`` ``darcs`` ``hg`` ``git`` ``mtn`` ``p4`` ``svn``h j#jjh!jh}r8$(h]h]h]h]h]ujM<jjh]r9$(hX$The following names are recognized: r:$r;$}r<$(hX$The following names are recognized: h j6$ubj})r=$}r>$(hX``bzr``h}r?$(h]h]h]h]h]uh j6$h]r@$hXbzrrA$rB$}rC$(hUh j=$ubah!jubhX rD$}rE$(hX h j6$ubj})rF$}rG$(hX``cvs``h}rH$(h]h]h]h]h]uh j6$h]rI$hXcvsrJ$rK$}rL$(hUh jF$ubah!jubhX rM$}rN$(hX h j6$ubj})rO$}rP$(hX ``darcs``h}rQ$(h]h]h]h]h]uh j6$h]rR$hXdarcsrS$rT$}rU$(hUh jO$ubah!jubhX rV$}rW$(hX h j6$ubj})rX$}rY$(hX``hg``h}rZ$(h]h]h]h]h]uh j6$h]r[$hXhgr\$r]$}r^$(hUh jX$ubah!jubhX r_$}r`$(hX h j6$ubj})ra$}rb$(hX``git``h}rc$(h]h]h]h]h]uh j6$h]rd$hXgitre$rf$}rg$(hUh ja$ubah!jubhX rh$}ri$(hX h j6$ubj})rj$}rk$(hX``mtn``h}rl$(h]h]h]h]h]uh j6$h]rm$hXmtnrn$ro$}rp$(hUh jj$ubah!jubhX rq$}rr$(hX h j6$ubj})rs$}rt$(hX``p4``h}ru$(h]h]h]h]h]uh j6$h]rv$hXp4rw$rx$}ry$(hUh js$ubah!jubhX rz$}r{$(hX h j6$ubj})r|$}r}$(hX``svn``h}r~$(h]h]h]h]h]uh j6$h]r$hXsvnr$r$}r$(hUh j|$ubah!jubeubeubjj7j j jjjj jjjj)r$}r$(hUh j jjh!jh}r$(h]h]h]h]r$jah]r$j/aujMjjh]r$(h)r$}r$(hXChoosing the Buildersr$h j$jjh!h"h}r$(h]h]h]h]h]ujMjjh]r$hXChoosing the Buildersr$r$}r$(hj$h j$ubaubj)r$}r$(hX]A trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the :class:`TryScheduler`'s ``builderNames=`` argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.h j$jjh!jh}r$(h]h]h]h]h]ujMjjh]r$(hXA trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the r$r$}r$(hXA trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the h j$ubj)r$}r$(hX:class:`TryScheduler`r$h j$jjh!jh}r$(UreftypeXclassjjX TrySchedulerU refdomainXpyr$h]h]U refexplicith]h]h]jhbjX NjY NujMh]r$j})r$}r$(hj$h}r$(h]h]r$(jj$Xpy-classr$eh]h]h]uh j$h]r$hX TrySchedulerr$r$}r$(hUh j$ubah!jubaubhX's r$r$}r$(hX's h j$ubj})r$}r$(hX``builderNames=``h}r$(h]h]h]h]h]uh j$h]r$hX builderNames=r$r$}r$(hUh j$ubah!jubhX| argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.r$r$}r$(hX| argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.h j$ubeubj)r$}r$(hXThe set of Builders to use can be specified with multiple :option:`--builder` arguments on the command line. It can also be specified with a single ``try_builders`` option in :file:`.buildbot/options` that uses a list of strings to specify all the Builder names:h j$jjh!jh}r$(h]h]h]h]h]ujM!jjh]r$(hX:The set of Builders to use can be specified with multiple r$r$}r$(hX:The set of Builders to use can be specified with multiple h j$ubj)r$}r$(hX:option:`--builder`r$h j$jjh!jh}r$(UreftypeXoptionjjX --builderU refdomainXstdr$jNh]h]U refexplicith]h]h]jhbujM!h]r$j)r$}r$(hj$h}r$(h]h]r$(jj$X std-optionr$eh]h]h]uh j$h]r$hX --builderr$r$}r$(hUh j$ubah!jubaubhXG arguments on the command line. It can also be specified with a single r$r$}r$(hXG arguments on the command line. It can also be specified with a single h j$ubj})r$}r$(hX``try_builders``h}r$(h]h]h]h]h]uh j$h]r$hX try_buildersr$r$}r$(hUh j$ubah!jubhX option in r$r$}r$(hX option in h j$ubj})r$}r$(hUh}r$(h]h]h]h]r$Xfiler$aUrolej$h]uh j$h]r$hX.buildbot/optionsr$r$}r$(hX.buildbot/optionsh j$ubah!jubhX> that uses a list of strings to specify all the Builder names:r$r$}r$(hX> that uses a list of strings to specify all the Builder names:h j$ubeubjG )r$}r$(hUh j$jjh!jJ h}r$(h]h]h]h]h]ujNjjh]r$j)r$}r$(hX7try_builders = ["full-OSX", "full-win32", "full-linux"]r$h j$jjh!jh}r$(h]h]h]h]h]ujM'h]r$hX7try_builders = ["full-OSX", "full-win32", "full-linux"]r$r$}r$(hj$h j$ubaubaubj)r$}r$(hXIf you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the ``get-builder-names`` argument:h j$jjh!jh}r$(h]h]h]h]h]ujM)jjh]r$(hX|If you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the r$r$}r$(hX|If you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the h j$ubj})r$}r$(hX``get-builder-names``h}r$(h]h]h]h]h]uh j$h]r$hXget-builder-namesr$r$}r$(hUh j$ubah!jubhX argument:r$r$}r$(hX argument:h j$ubeubjG )r%}r%(hUh j$jjh!jJ h}r%(h]h]h]h]h]ujNjjh]r%j)r%}r%(hXVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...r%h j%jjh!jh}r%(h]h]h]h]h]ujM-h]r%hXVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...r %r %}r %(hj%h j%ubaubaubeubjjjj jjjjfj` j[ jjjjjfjj jjhjj jj uj}r %h!jh}r %(h]h]h]Usourcejh]h]uj]r%j}r%(j]r%jmaj]r%jX aj]r%jaj]r%jaj]r%j aj]r%j aj]r%j aj]r%jaj]r%jCaj]r%jaj#]r%jaj]r%jaj]r%j aj]r%jaj]r%j^aj]r%jaj]r %j aj]r!%jcaj]r"%j auubjjj}r#%jjsh!jh}r$%(h]h]h]h]r%%(jjeh]r&%(j"jeujKjjj}r'%jjsh]r(%(h)r)%}r*%(hhjh jjjh!h"h}r+%(h]h]h]h]h]ujKjjh]r,%hXCommand-line Toolr-%r.%}r/%(hhjh j)%ubaubj)r0%}r1%(hXThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all :command:`buildbot` command-line tool was divided into two parts namely :command:`buildbot` and :command:`buildslave`. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to :command:`buildbot` tool.h jjjh!jh}r2%(h]h]h]h]h]ujKjjh]r3%(hXsThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all r4%r5%}r6%(hXsThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all h j0%ubjM)r7%}r8%(hX:command:`buildbot`h}r9%(h]h]r:%jRah]h]h]uh j0%h]r;%hXbuildbotr<%r=%}r>%(hUh j7%ubah!jWubhX5 command-line tool was divided into two parts namely r?%r@%}rA%(hX5 command-line tool was divided into two parts namely h j0%ubjM)rB%}rC%(hX:command:`buildbot`h}rD%(h]h]rE%jRah]h]h]uh j0%h]rF%hXbuildbotrG%rH%}rI%(hUh jB%ubah!jWubhX and rJ%rK%}rL%(hX and h j0%ubjM)rM%}rN%(hX:command:`buildslave`h}rO%(h]h]rP%jRah]h]h]uh j0%h]rQ%hX buildslaverR%rS%}rT%(hUh jM%ubah!jWubhX. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to rU%rV%}rW%(hX. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to h j0%ubjM)rX%}rY%(hX:command:`buildbot`h}rZ%(h]h]r[%jRah]h]h]uh j0%h]r\%hXbuildbotr]%r^%}r_%(hUh jX%ubah!jWubhX tool.r`%ra%}rb%(hX tool.h j0%ubeubj)rc%}rd%(hXEvery command-line tool has a list of global options and a set of commands which have their own options. One can run these tools in the following way:re%h jjjh!jh}rf%(h]h]h]h]h]ujK jjh]rg%hXEvery command-line tool has a list of global options and a set of commands which have their own options. One can run these tools in the following way:rh%ri%}rj%(hje%h jc%ubaubj)rk%}rl%(hXibuildbot [global options] command [command options] buildslave [global options] command [command options]h jjjh!jh}rm%(jjXnonejjh]h]h]h]h]ujKjjh]rn%hXibuildbot [global options] command [command options] buildslave [global options] command [command options]ro%rp%}rq%(hUh jk%ubaubj)rr%}rs%(hXThe ``buildbot`` command is used on the master, while ``buildslave`` is used on the slave. Global options are the same for both tools which perform the following actions:h jjjh!jh}rt%(h]h]h]h]h]ujKjjh]ru%(hXThe rv%rw%}rx%(hXThe h jr%ubj})ry%}rz%(hX ``buildbot``h}r{%(h]h]h]h]h]uh jr%h]r|%hXbuildbotr}%r~%}r%(hUh jy%ubah!jubhX& command is used on the master, while r%r%}r%(hX& command is used on the master, while h jr%ubj})r%}r%(hX``buildslave``h}r%(h]h]h]h]h]uh jr%h]r%hX buildslaver%r%}r%(hUh j%ubah!jubhXg is used on the slave. Global options are the same for both tools which perform the following actions:r%r%}r%(hXg is used on the slave. Global options are the same for both tools which perform the following actions:h jr%ubeubj7)r%}r%(hUh jjjh!j:h}r%(h]h]h]h]h]ujNjjh]r%(j=)r%}r%(hUh j%jjh!j@h}r%(h]h]h]h]h]ujNjjh]r%(jC)r%}r%(hUh}r%(h]h]h]h]h]uh j%h]r%jH)r%}r%(hX--helpr%h}r%(h]h]h]h]h]uh j%h]r%jN)r%}r%(hj%h}r%(h]h]h]h]h]uh j%h]r%hX--helpr%r%}r%(hUh j%ubah!jVubah!jWubah!jXubjY)r%}r%(hXoPrint general help about available commands and global options and exit. All subsequent arguments are ignored. h}r%(h]h]h]h]h]uh j%h]r%j)r%}r%(hXnPrint general help about available commands and global options and exit. All subsequent arguments are ignored.r%h j%jjh!jh}r%(h]h]h]h]h]ujKh]r%hXnPrint general help about available commands and global options and exit. All subsequent arguments are ignored.r%r%}r%(hj%h j%ubaubah!juubeubj=)r%}r%(hUh j%jjh!j@h}r%(h]h]h]h]h]ujNjjh]r%(jC)r%}r%(hUh}r%(h]h]h]h]h]uh j%h]r%jH)r%}r%(hX --verboser%h}r%(h]h]h]h]h]uh j%h]r%jN)r%}r%(hj%h}r%(h]h]h]h]h]uh j%h]r%hX --verboser%r%}r%(hUh j%ubah!jVubah!jWubah!jXubjY)r%}r%(hXSet verbose output. h}r%(h]h]h]h]h]uh j%h]r%j)r%}r%(hXSet verbose output.r%h j%jjh!jh}r%(h]h]h]h]h]ujKh]r%hXSet verbose output.r%r%}r%(hj%h j%ubaubah!juubeubj=)r%}r%(hUh j%jjh!j@h}r%(h]h]h]h]h]ujNjjh]r%(jC)r%}r%(hUh}r%(h]h]h]h]h]uh j%h]r%jH)r%}r%(hX --versionr%h}r%(h]h]h]h]h]uh j%h]r%jN)r%}r%(hj%h}r%(h]h]h]h]h]uh j%h]r%hX --versionr%r%}r%(hUh j%ubah!jVubah!jWubah!jXubjY)r%}r%(hXOPrint current buildbot version and exit. All subsequent arguments are ignored. h}r%(h]h]h]h]h]uh j%h]r%j)r%}r%(hXNPrint current buildbot version and exit. All subsequent arguments are ignored.r%h j%jjh!jh}r%(h]h]h]h]h]ujK!h]r%hXNPrint current buildbot version and exit. All subsequent arguments are ignored.r%r%}r%(hj%h j%ubaubah!juubeubeubj)r%}r%(hXMYou can get help on any command by specifying ``--help`` as a command option:h jjjh!jh}r%(h]h]h]h]h]ujK$jjh]r%(hX.You can get help on any command by specifying r%r%}r%(hX.You can get help on any command by specifying h j%ubj})r%}r%(hX ``--help``h}r%(h]h]h]h]h]uh j%h]r%hX--helpr%r%}r%(hUh j%ubah!jubhX as a command option:r%r&}r&(hX as a command option:h j%ubeubj)r&}r&(hXbuildbot @var{command} --helph jjjh!jh}r&(jjXnonejjh]h]h]h]h]ujK'jjh]r&hXbuildbot @var{command} --helpr&r&}r&(hUh j&ubaubj)r &}r &(hX|You can also use manual pages for :command:`buildbot` and :command:`buildslave` for quick reference on command-line options.h jjjh!jh}r &(h]h]h]h]h]ujK+jjh]r &(hX"You can also use manual pages for r &r&}r&(hX"You can also use manual pages for h j &ubjM)r&}r&(hX:command:`buildbot`h}r&(h]h]r&jRah]h]h]uh j &h]r&hXbuildbotr&r&}r&(hUh j&ubah!jWubhX and r&r&}r&(hX and h j &ubjM)r&}r&(hX:command:`buildslave`h}r&(h]h]r&jRah]h]h]uh j &h]r&hX buildslaver &r!&}r"&(hUh j&ubah!jWubhX- for quick reference on command-line options.r#&r$&}r%&(hX- for quick reference on command-line options.h j &ubeubj)r&&}r'&(hXhThe remainder of this section describes each buildbot command. See :bb:index:`cmdline` for a full list.h jjjh!jh}r(&(h]h]h]h]h]ujK.jjh]r)&(hXDThe remainder of this section describes each buildbot command. See r*&r+&}r,&(hXDThe remainder of this section describes each buildbot command. See h j&&ubj)r-&}r.&(hX:bb:index:`cmdline`r/&h j&&jjh!jh}r0&(UreftypeXindexjjXcmdlineU refdomainXbbr1&h]h]U refexplicith]h]h]jhbujK.h]r2&j})r3&}r4&(hj/&h}r5&(h]h]r6&(jj1&Xbb-indexr7&eh]h]h]uh j-&h]r8&hXcmdliner9&r:&}r;&(hUh j3&ubah!jubaubhX for a full list.r<&r=&}r>&(hX for a full list.h j&&ubeubjj:eubjjh!jh}r?&(h]h]h]h]r@&jah]rA&jaujK2jjh]rB&(h)rC&}rD&(hXbuildbotrE&h jjjh!h"h}rF&(h]h]h]h]h]ujK2jjh]rG&hXbuildbotrH&rI&}rJ&(hjE&h jC&ubaubj)rK&}rL&(hX"The :command:`buildbot` command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.h jjjh!jh}rM&(h]h]h]h]h]ujK4jjh]rN&(hXThe rO&rP&}rQ&(hXThe h jK&ubjM)rR&}rS&(hX:command:`buildbot`h}rT&(h]h]rU&jRah]h]h]uh jK&h]rV&hXbuildbotrW&rX&}rY&(hUh jR&ubah!jWubhX  command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.rZ&r[&}r\&(hX  command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.h jK&ubeubj j jjjeubjjh!jh}r]&(h]h]h]h]r^&jah]r_&j!aujKjjh]r`&(h)ra&}rb&(hXDeveloper Toolsrc&h j jjh!h"h}rd&(h]h]h]h]h]ujKjjh]re&hXDeveloper Toolsrf&rg&}rh&(hjc&h ja&ubaubj)ri&}rj&(hXoThese tools are provided for use by the developers who are working on the code that the buildbot is monitoring.rk&h j jjh!jh}rl&(h]h]h]h]h]ujKjjh]rm&hXoThese tools are provided for use by the developers who are working on the code that the buildbot is monitoring.rn&ro&}rp&(hjk&h ji&ubaubj[)rq&}rr&(hUh j jjh!j^h}rs&(h]h]h]h]h]Uentries]rt&((UsingleX#Command Line Subcommands; statuslogjjtru&(UsingleX!statuslog Command Line Subcommandjjtrv&eujKjjh]ubj j j j jjeubjjj}h!jh}rw&(h]h]h]h]rx&(jjeh]ry&j,aujKjjj}rz&jj^sh]r{&(h)r|&}r}&(hXtryr~&h j jjh!h"h}r&(h]h]h]h]h]ujKjjh]r&hXtryr&r&}r&(hj~&h j|&ubaubj)r&}r&(hX$This lets a developer to ask the question ``What would happen if I committed this patch right now?``. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.h j jjh!jh}r&(h]h]h]h]h]ujKjjh]r&(hX*This lets a developer to ask the question r&r&}r&(hX*This lets a developer to ask the question h j&ubj})r&}r&(hX:``What would happen if I committed this patch right now?``h}r&(h]h]h]h]h]uh j&h]r&hX6What would happen if I committed this patch right now?r&r&}r&(hUh j&ubah!jubhX. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.r&r&}r&(hX. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.h j&ubeubj)r&}r&(hXBThe ``buildbot try`` command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This ``(revision, patch)`` pair is then sent to the buildmaster, which runs a build with that :class:`SourceStamp`. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).h j jjh!jh}r&(h]h]h]h]h]ujKjjh]r&(hXThe r&r&}r&(hXThe h j&ubj})r&}r&(hX``buildbot try``h}r&(h]h]h]h]h]uh j&h]r&hX buildbot tryr&r&}r&(hUh j&ubah!jubhX% command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This r&r&}r&(hX% command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This h j&ubj})r&}r&(hX``(revision, patch)``h}r&(h]h]h]h]h]uh j&h]r&hX(revision, patch)r&r&}r&(hUh j&ubah!jubhXD pair is then sent to the buildmaster, which runs a build with that r&r&}r&(hXD pair is then sent to the buildmaster, which runs a build with that h j&ubj)r&}r&(hX:class:`SourceStamp`r&h j&jjh!jh}r&(UreftypeXclassjjX SourceStampU refdomainXpyr&h]h]U refexplicith]h]h]jhbjX NjY NujKh]r&j})r&}r&(hj&h}r&(h]h]r&(jj&Xpy-classr&eh]h]h]uh j&h]r&hX SourceStampr&r&}r&(hUh j&ubah!jubaubhX. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).r&r&}r&(hX. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).h j&ubeubj)r&}r&(hXThere is an alternate form which accepts a pre-made patch file (typically the output of a command like :command:`svn diff`). This ``--diff`` form does not require a local tree to run from. See :ref:`try--diff` concerning the ``--diff`` command option.h j jjh!jh}r&(h]h]h]h]h]ujKjjh]r&(hXgThere is an alternate form which accepts a pre-made patch file (typically the output of a command like r&r&}r&(hXgThere is an alternate form which accepts a pre-made patch file (typically the output of a command like h j&ubjM)r&}r&(hX:command:`svn diff`h}r&(h]h]r&jRah]h]h]uh j&h]r&hXsvn diffr&r&}r&(hUh j&ubah!jWubhX). This r&r&}r&(hX). This h j&ubj})r&}r&(hX ``--diff``h}r&(h]h]h]h]h]uh j&h]r&hX--diffr&r&}r&(hUh j&ubah!jubhX5 form does not require a local tree to run from. See r&r&}r&(hX5 form does not require a local tree to run from. See h j&ubj)r&}r&(hX:ref:`try--diff`r&h j&jjh!jh}r&(UreftypeXrefjjX try--diffU refdomainXstdr&h]h]U refexplicith]h]h]jhbujKh]r&j)r&}r&(hj&h}r&(h]h]r&(jj&Xstd-refr&eh]h]h]uh j&h]r&hX try--diffr&r&}r&(hUh j&ubah!jubaubhX concerning the r&r&}r&(hX concerning the h j&ubj})r&}r&(hX ``--diff``h}r&(h]h]h]h]h]uh j&h]r&hX--diffr&r&}r&(hUh j&ubah!jubhX command option.r&r&}r&(hX command option.h j&ubeubj)r&}r&(hXFor this command to work, several pieces must be in place: the :bb:sched:`Try_Jobdir` or ::bb:sched:`Try_Userpass`, as well as some client-side configuration.h j jjh!jh}r&(h]h]h]h]h]ujKjjh]r&(hX?For this command to work, several pieces must be in place: the r&r&}r'(hX?For this command to work, several pieces must be in place: the h j&ubj)r'}r'(hX:bb:sched:`Try_Jobdir`r'h j&jjh!jh}r'(UreftypeXschedjjX Try_JobdirU refdomainXbbr'h]h]U refexplicith]h]h]jhbujKh]r'j})r'}r'(hj'h}r '(h]h]r '(jj'Xbb-schedr 'eh]h]h]uh j'h]r 'hX Try_Jobdirr 'r'}r'(hUh j'ubah!jubaubhX or :r'r'}r'(hX or :h j&ubj)r'}r'(hX:bb:sched:`Try_Userpass`r'h j&jjh!jh}r'(UreftypeXschedjjX Try_UserpassU refdomainXbbr'h]h]U refexplicith]h]h]jhbujKh]r'j})r'}r'(hj'h}r'(h]h]r'(jj'Xbb-schedr'eh]h]h]uh j'h]r'hX Try_Userpassr'r '}r!'(hUh j'ubah!jubaubhX,, as well as some client-side configuration.r"'r#'}r$'(hX,, as well as some client-side configuration.h j&ubeubjajj$j#jE j!j j joeubjjh!jh}r%'(h]h]h]h]r&'jah]r''j)aujMqjjh]r('(h)r)'}r*'(hX"Determining the revision and patchr+'h j jjh!h"h}r,'(h]h]h]h]h]ujMqjjh]r-'hX"Determining the revision and patchr.'r/'}r0'(hj+'h j)'ubaubj)r1'}r2'(hXfEach VC system has a separate approach for determining the tree's base revision and computing a patch.r3'h j jjh!jh}r4'(h]h]h]h]h]ujMsjjh]r5'hXfEach VC system has a separate approach for determining the tree's base revision and computing a patch.r6'r7'}r8'(hj3'h j1'ubaubj)r9'}r:'(hUh j jjh!jh}r;'(h]h]h]h]h]ujNjjh]r<'(j)r='}r>'(hXnCVS :command:`try` pretends that the tree is up to date. It converts the current time into a :option:`-D` time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository. h j9'jjh!jh}r?'(h]h]h]h]h]ujM|h]r@'(j)rA'}rB'(hXCVSrC'h j='jjh!jh}rD'(h]h]h]h]h]ujM|h]rE'hXCVSrF'rG'}rH'(hjC'h jA'ubaubj)rI'}rJ'(hUh}rK'(h]h]h]h]h]uh j='h]rL'j)rM'}rN'(hXi:command:`try` pretends that the tree is up to date. It converts the current time into a :option:`-D` time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.h jI'jjh!jh}rO'(h]h]h]h]h]ujMwh]rP'(jM)rQ'}rR'(hX:command:`try`h}rS'(h]h]rT'jRah]h]h]uh jM'h]rU'hXtryrV'rW'}rX'(hUh jQ'ubah!jWubhXK pretends that the tree is up to date. It converts the current time into a rY'rZ'}r['(hXK pretends that the tree is up to date. It converts the current time into a h jM'ubj)r\'}r]'(hX :option:`-D`r^'h jM'jjh!jh}r_'(UreftypeXoptionjjX-DU refdomainXstdr`'jNh]h]U refexplicith]h]h]jhbujMwh]ra'j)rb'}rc'(hj^'h}rd'(h]h]re'(jj`'X std-optionrf'eh]h]h]uh j\'h]rg'hX-Drh'ri'}rj'(hUh jb'ubah!jubaubhX time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.rk'rl'}rm'(hX time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.h jM'ubeubah!jubeubj)rn'}ro'(hXSVN :command:`try` does a :command:`svn status -u` to find the latest repository revision number (emitted on the last line in the :samp:`Status against revision: {NN}` message). It then performs an :samp:`svn diff -r{NN}` to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the ``try`` tree being created with the latest revision, then *backwards* patches applied to bring it ``back`` to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build. h j9'jjh!jh}rp'(h]h]h]h]h]ujMjjh]rq'(j)rr'}rs'(hXSVNrt'h jn'jjh!jh}ru'(h]h]h]h]h]ujMh]rv'hXSVNrw'rx'}ry'(hjt'h jr'ubaubj)rz'}r{'(hUh}r|'(h]h]h]h]h]uh jn'h]r}'j)r~'}r'(hX:command:`try` does a :command:`svn status -u` to find the latest repository revision number (emitted on the last line in the :samp:`Status against revision: {NN}` message). It then performs an :samp:`svn diff -r{NN}` to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the ``try`` tree being created with the latest revision, then *backwards* patches applied to bring it ``back`` to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.h jz'jjh!jh}r'(h]h]h]h]h]ujMh]r'(jM)r'}r'(hX:command:`try`h}r'(h]h]r'jRah]h]h]uh j~'h]r'hXtryr'r'}r'(hUh j'ubah!jWubhX does a r'r'}r'(hX does a h j~'ubjM)r'}r'(hX:command:`svn status -u`h}r'(h]h]r'jRah]h]h]uh j~'h]r'hX svn status -ur'r'}r'(hUh j'ubah!jWubhXP to find the latest repository revision number (emitted on the last line in the r'r'}r'(hXP to find the latest repository revision number (emitted on the last line in the h j~'ubj})r'}r'(hUh}r'(h]h]h]h]r'Xsampr'aUrolej'h]uh j~'h]r'(hXStatus against revision: r'r'}r'(hXStatus against revision: h j'ubj)r'}r'(hXNNh}r'(h]h]h]h]h]uh j'h]r'hXNNr'r'}r'(hUh j'ubah!jubeh!jubhX message). It then performs an r'r'}r'(hX message). It then performs an h j~'ubj})r'}r'(hUh}r'(h]h]h]h]r'Xsampr'aUrolej'h]uh j~'h]r'(hX svn diff -rr'r'}r'(hX svn diff -rh j'ubj)r'}r'(hXNNh}r'(h]h]h]h]h]uh j'h]r'hXNNr'r'}r'(hUh j'ubah!jubeh!jubhX to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the r'r'}r'(hX to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the h j~'ubj})r'}r'(hX``try``h}r'(h]h]h]h]h]uh j~'h]r'hXtryr'r'}r'(hUh j'ubah!jubhX3 tree being created with the latest revision, then r'r'}r'(hX3 tree being created with the latest revision, then h j~'ubj)r'}r'(hX *backwards*h}r'(h]h]h]h]h]uh j~'h]r'hX backwardsr'r'}r'(hUh j'ubah!jubhX patches applied to bring it r'r'}r'(hX patches applied to bring it h j~'ubj})r'}r'(hX``back``h}r'(h]h]h]h]h]uh j~'h]r'hXbackr'r'}r'(hUh j'ubah!jubhX to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.r'r'}r'(hX to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.h j~'ubeubah!jubeubj)r'}r'(hX~bzr :command:`try` does a ``bzr revision-info`` to find the base revision, then a ``bzr diff -r$base..`` to obtain the patch. h j9'jjh!jh}r'(h]h]h]h]h]ujMjjh]r'(j)r'}r'(hXbzrr'h j'jjh!jh}r'(h]h]h]h]h]ujMh]r'hXbzrr'r'}r'(hj'h j'ubaubj)r'}r'(hUh}r'(h]h]h]h]h]uh j'h]r'j)r'}r'(hXy:command:`try` does a ``bzr revision-info`` to find the base revision, then a ``bzr diff -r$base..`` to obtain the patch.h j'jjh!jh}r'(h]h]h]h]h]ujMh]r'(jM)r'}r'(hX:command:`try`h}r'(h]h]r'jRah]h]h]uh j'h]r'hXtryr'r'}r'(hUh j'ubah!jWubhX does a r'r'}r'(hX does a h j'ubj})r'}r'(hX``bzr revision-info``h}r'(h]h]h]h]h]uh j'h]r'hXbzr revision-infor'r(}r((hUh j'ubah!jubhX# to find the base revision, then a r(r(}r((hX# to find the base revision, then a h j'ubj})r(}r((hX``bzr diff -r$base..``h}r((h]h]h]h]h]uh j'h]r(hXbzr diff -r$base..r (r (}r ((hUh j(ubah!jubhX to obtain the patch.r (r (}r((hX to obtain the patch.h j'ubeubah!jubeubj)r(}r((hXMercurial ``hg parents --template '{node}\n'`` emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. ``hg diff`` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' ``source.Mercurial`` will use. h j9'jjh!jh}r((h]h]h]h]h]ujMjjh]r((j)r(}r((hX Mercurialr(h j(jjh!jh}r((h]h]h]h]h]ujMh]r(hX Mercurialr(r(}r((hj(h j(ubaubj)r(}r((hUh}r((h]h]h]h]h]uh j(h]r(j)r(}r ((hX``hg parents --template '{node}\n'`` emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. ``hg diff`` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' ``source.Mercurial`` will use.h j(jjh!jh}r!((h]h]h]h]h]ujMh]r"((j})r#(}r$((hX$``hg parents --template '{node}\n'``h}r%((h]h]h]h]h]uh j(h]r&(hX hg parents --template '{node}\n'r'(r((}r)((hUh j#(ubah!jubhX emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. r*(r+(}r,((hX emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. h j(ubj})r-(}r.((hX ``hg diff``h}r/((h]h]h]h]h]uh j(h]r0(hXhg diffr1(r2(}r3((hUh j-(ubah!jubhX8 then provides the patch relative to that revision. For r4(r5(}r6((hX8 then provides the patch relative to that revision. For h j(ubjM)r7(}r8((hX:command:`try`h}r9((h]h]r:(jRah]h]h]uh j(h]r;(hXtryr<(r=(}r>((hUh j7(ubah!jWubhX to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' r?(r@(}rA((hX to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' h j(ubj})rB(}rC((hX``source.Mercurial``h}rD((h]h]h]h]h]uh j(h]rE(hXsource.MercurialrF(rG(}rH((hUh jB(ubah!jubhX will use.rI(rJ(}rK((hX will use.h j(ubeubah!jubeubj)rL(}rM((hXPerforce :command:`try` does a ``p4 changes -m1 ...`` to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a ``p4 diff -du`` to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see :bb:chsrc:`P4Source`) is assumed to be ``//depot`` h j9'jjh!jh}rN((h]h]h]h]h]ujMjjh]rO((j)rP(}rQ((hXPerforcerR(h jL(jjh!jh}rS((h]h]h]h]h]ujMh]rT(hXPerforcerU(rV(}rW((hjR(h jP(ubaubj)rX(}rY((hUh}rZ((h]h]h]h]h]uh jL(h]r[(j)r\(}r]((hX:command:`try` does a ``p4 changes -m1 ...`` to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a ``p4 diff -du`` to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see :bb:chsrc:`P4Source`) is assumed to be ``//depot``h jX(jjh!jh}r^((h]h]h]h]h]ujMh]r_((jM)r`(}ra((hX:command:`try`h}rb((h]h]rc(jRah]h]h]uh j\(h]rd(hXtryre(rf(}rg((hUh j`(ubah!jWubhX does a rh(ri(}rj((hX does a h j\(ubj})rk(}rl((hX``p4 changes -m1 ...``h}rm((h]h]h]h]h]uh j\(h]rn(hXp4 changes -m1 ...ro(rp(}rq((hUh jk(ubah!jubhX to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a rr(rs(}rt((hX to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a h j\(ubj})ru(}rv((hX``p4 diff -du``h}rw((h]h]h]h]h]uh j\(h]rx(hX p4 diff -dury(rz(}r{((hUh ju(ubah!jubhX to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see r|(r}(}r~((hX to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see h j\(ubj)r(}r((hX:bb:chsrc:`P4Source`r(h j\(jjh!jh}r((UreftypeXchsrcjjXP4SourceU refdomainXbbr(h]h]U refexplicith]h]h]jhbujMh]r(j})r(}r((hj(h}r((h]h]r((jj(Xbb-chsrcr(eh]h]h]uh j(h]r(hXP4Sourcer(r(}r((hUh j(ubah!jubaubhX) is assumed to be r(r(}r((hX) is assumed to be h j\(ubj})r(}r((hX ``//depot``h}r((h]h]h]h]h]uh j\(h]r(hX//depotr(r(}r((hUh j(ubah!jubeubah!jubeubj)r(}r((hXDarcs :command:`try` does a ``darcs changes --context`` to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this ``context`` file *are* the revision stamp for a Darcs-controlled source tree. It then does a ``darcs diff -u`` to compute the patch relative to that revision. h j9'jjh!jh}r((h]h]h]h]h]ujMjjh]r((j)r(}r((hXDarcsr(h j(jjh!jh}r((h]h]h]h]h]ujMh]r(hXDarcsr(r(}r((hj(h j(ubaubj)r(}r((hUh}r((h]h]h]h]h]uh j(h]r(j)r(}r((hX:command:`try` does a ``darcs changes --context`` to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this ``context`` file *are* the revision stamp for a Darcs-controlled source tree. It then does a ``darcs diff -u`` to compute the patch relative to that revision.h j(jjh!jh}r((h]h]h]h]h]ujMh]r((jM)r(}r((hX:command:`try`h}r((h]h]r(jRah]h]h]uh j(h]r(hXtryr(r(}r((hUh j(ubah!jWubhX does a r(r(}r((hX does a h j(ubj})r(}r((hX``darcs changes --context``h}r((h]h]h]h]h]uh j(h]r(hXdarcs changes --contextr(r(}r((hUh j(ubah!jubhX to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this r(r(}r((hX to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this h j(ubj})r(}r((hX ``context``h}r((h]h]h]h]h]uh j(h]r(hXcontextr(r(}r((hUh j(ubah!jubhX file r(r(}r((hX file h j(ubj)r(}r((hX*are*h}r((h]h]h]h]h]uh j(h]r(hXarer(r(}r((hUh j(ubah!jubhXH the revision stamp for a Darcs-controlled source tree. It then does a r(r(}r((hXH the revision stamp for a Darcs-controlled source tree. It then does a h j(ubj})r(}r((hX``darcs diff -u``h}r((h]h]h]h]h]uh j(h]r(hX darcs diff -ur(r(}r((hUh j(ubah!jubhX0 to compute the patch relative to that revision.r(r(}r((hX0 to compute the patch relative to that revision.h j(ubeubah!jubeubj)r(}r((hXGit ``git branch -v`` lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with ``* `` (star and space) while all the others start with ``  `` (two spaces). :command:`try` scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision. h j9'jjh!jh}r((h]h]h]h]h]ujMjjh]r((j)r(}r((hXGitr(h j(jjh!jh}r((h]h]h]h]h]ujMh]r(hXGitr(r(}r((hj(h j(ubaubj)r(}r((hUh}r((h]h]h]h]h]uh j(h]r(j)r(}r((hX``git branch -v`` lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with ``* `` (star and space) while all the others start with ``  `` (two spaces). :command:`try` scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.h j(jjh!jh}r((h]h]h]h]h]ujMh]r((j})r(}r((hX``git branch -v``h}r((h]h]h]h]h]uh j(h]r(hX git branch -vr(r(}r((hUh j(ubah!jubhX lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with r(r(}r((hX lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with h j(ubj})r(}r((hX``* ``h}r((h]h]h]h]h]uh j(h]r)hX* r)r)}r)(hUh j(ubah!jubhX2 (star and space) while all the others start with r)r)}r)(hX2 (star and space) while all the others start with h j(ubj})r)}r)(hX``  ``h}r )(h]h]h]h]h]uh j(h]r )hX  r )r )}r )(hUh j)ubah!jubhX (two spaces). r)r)}r)(hX (two spaces). h j(ubjM)r)}r)(hX:command:`try`h}r)(h]h]r)jRah]h]h]uh j(h]r)hXtryr)r)}r)(hUh j)ubah!jWubhX{ scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.r)r)}r)(hX{ scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.h j(ubeubah!jubeubeubj-$)r)}r)(hXEThe spaces in the previous 2 literals are non-breakable spaces  h j jjh!j0$h}r)(jjh]h]h]h]h]ujMjjh]r)hXEThe spaces in the previous 2 literals are non-breakable spaces  r )r!)}r")(hUh j)ubaubjj#j)r#)}r$)(hUh j jjh!jh}r%)(h]h]h]h]h]ujNjjh]r&)j)r')}r()(hXMonotone :command:`mtn automate get_base_revision_id` emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. :command:`mtn diff` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' :class:`source.Monotone` will use. h j#)jjh!jh}r))(h]h]h]h]h]ujMh]r*)(j)r+)}r,)(hXMonotoner-)h j')jjh!jh}r.)(h]h]h]h]h]ujMh]r/)hXMonotoner0)r1)}r2)(hj-)h j+)ubaubj)r3)}r4)(hUh}r5)(h]h]h]h]h]uh j')h]r6)j)r7)}r8)(hX:command:`mtn automate get_base_revision_id` emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. :command:`mtn diff` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' :class:`source.Monotone` will use.h j3)jjh!jh}r9)(h]h]h]h]h]ujMh]r:)(jM)r;)}r<)(hX,:command:`mtn automate get_base_revision_id`h}r=)(h]h]r>)jRah]h]h]uh j7)h]r?)hX!mtn automate get_base_revision_idr@)rA)}rB)(hUh j;)ubah!jWubhXx emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. rC)rD)}rE)(hXx emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. h j7)ubjM)rF)}rG)(hX:command:`mtn diff`h}rH)(h]h]rI)jRah]h]h]uh j7)h]rJ)hXmtn diffrK)rL)}rM)(hUh jF)ubah!jWubhX9 then provides the patch relative to that revision. For rN)rO)}rP)(hX9 then provides the patch relative to that revision. For h j7)ubjM)rQ)}rR)(hX:command:`try`h}rS)(h]h]rT)jRah]h]h]uh j7)h]rU)hXtryrV)rW)}rX)(hUh jQ)ubah!jWubhX to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' rY)rZ)}r[)(hX to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' h j7)ubj)r\)}r])(hX:class:`source.Monotone`r^)h j7)jjh!jh}r_)(UreftypeXclassjjXsource.MonotoneU refdomainXpyr`)h]h]U refexplicith]h]h]jhbjX NjY NujMh]ra)j})rb)}rc)(hj^)h}rd)(h]h]re)(jj`)Xpy-classrf)eh]h]h]uh j\)h]rg)hXsource.Monotonerh)ri)}rj)(hUh jb)ubah!jubaubhX will use.rk)rl)}rm)(hX will use.h j7)ubeubah!jubeubaubeubjjh!jh}rn)(h]h]h]h]h]jj#ujNjjh]ubu}ro)(jjUjjXU/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/customization.rstrp)rq)}rr)bjj)rs)}rt)(hXStep Progress BuildStepFailedru)h}rv)(h]h]rw)Uadmonition-todorx)ah]h]uh]ry)(h)rz)}r{)(hXTodor|)h}r})(h]h]h]h]h]uh js)h]r~)hXTodor)r)}r)(hj|)h jz)ubah!h"ubj)r)}r)(hXStep Progress BuildStepFailedr)h}r)(h]h]h]h]h]uh js)h]r)hXStep Progress BuildStepFailedr)r)}r)(hj)h j)ubah!jubeh!jubjMjj)r)}r)(hUh j)r)}r)(hUh j)r)}r)(hUh j)r)}r)(hUj9Kh j)r)}r)(j}r)(jXbuilder priority functionsr)NXusing statisticsr)Nj jXwriting buildstep constructorsr)NXstep execution processr)NjXfactory workdir functionsr)NXa somewhat whimsical exampler)NXusing propertiesr)NXabout logfilesr)NjVj%Xdiscovering filesr)NX(project/branchname/filepath repositoriesr)NX:submit the code for inclusion in the buildbot distributionr)NX#python file somewhere on the systemr)NXwriting new status pluginsr)NXadding logobserversr)NXmerge request functionsr)NXupdating status stringsr)NXcustomizing svnpollerr)NXrunning commandsr)NX(branchname/project/filepath repositoriesr)NjX inclusion in the master.cfg filer)NX%programmatic configuration generationr)NX.writing a new latent buildslave implementationr)NXcustom build classesr)NX divmod.orgr)jTXbuild priority functionsr)NXwriting new buildstepsr)Nj1jjdjEXwriting a change pollerr)NX*writing a notification-based change sourcer)NX:install this code into a standard python library directoryr)NjHXbuildstep urlsr)NXreading logfilesr)NXwriting change sourcesr)NXwriting log filesr)Nuj}r)j ]r)j")r)}r)(hUh j)jjq)h!j/h}r)(h]UlevelKh]h]r)Uid1r)aUsourcejq)h]h]UlineKUtypej&ujKjj)h]r)j)r)}r)(hUh}r)(h]h]h]h]h]uh j)h]r)hX0Duplicate implicit target name: "customization".r)r)}r)(hUh j)ubah!jubaubaj Nj Nj Kj}r)(jjj)Uid3r)j)Uusing-statisticsr)j jjjj)Uid9r)j)Ustep-execution-processr)jjj)Uid7r)j)Ua-somewhat-whimsical-exampler)j)Uusing-propertiesr)j)Uabout-logfilesr)jVjWj%j&j)Udiscovering-filesr)j)U(project-branchname-filepath-repositoriesr)j)U:submit-the-code-for-inclusion-in-the-buildbot-distributionr)j)U#python-file-somewhere-on-the-systemr)j)Uwriting-new-status-pluginsr)j)Uid10r)j)Uid2r)j)Uupdating-status-stringsr)j)Uid5r)j)Urunning-commandsr)j)U(branchname-project-filepath-repositoriesr)jjj)U inclusion-in-the-master-cfg-filer)j)U%programmatic-configuration-generationr)j)U.writing-a-new-latent-buildslave-implementationr)j)Ucustom-build-classesr)j)U divmod-orgr)jTjUj)Uid4r)j)Uid8r)j1j2jjjdjejEjFj)Uwriting-a-change-pollerr)j)U*writing-a-notification-based-change-sourcer)j)U:install-this-code-into-a-standard-python-library-directoryr)jHjHj)Ubuildstep-urlsr)j)Ureading-logfilesr)j)Uid6r)j)Uwriting-log-filesr)uh]r)(j)r)}r)(hX.. _Customization:h j)jjq)h!jh}r)(h]h]h]h]h]jjujKjj)h]ubj)ehUjNj}r)Xframboozle_regr)]r)cdocutils.nodes footnote_reference r))r)}r)(hX[#framboozle_reg]_Uresolvedr)Kh j)r)}r)(hXLet's say that we've got some snazzy new unit-test framework called Framboozle. It's the hottest thing since sliced bread. It slices, it dices, it runs unit tests like there's no tomorrow. Plus if your unit tests fail, you can use its name for a Web 2.1 startup company, make millions of dollars, and hire engineers to fix the bugs for you, while you spend your afternoons lazily hang-gliding along a scenic pacific beach, blissfully unconcerned about the state of your tests. [#framboozle_reg]_h j)r)}r)(hUh j)jjq)h!jh}r)(h]h]h]h]r)j)ah]r)j)aujMjj)h]r)(h)r)}r)(hXA Somewhat Whimsical Exampler)h j)jjq)h!h"h}r)(h]h]h]h]h]ujMjj)h]r)hXA Somewhat Whimsical Exampler)r*}r*(hj)h j)ubaubj)j)r*}r*(hXzTo run a Framboozle-enabled test suite, you just run the 'framboozler' command from the top of your source code tree. The 'framboozler' command emits a bunch of stuff to stdout, but the most interesting bit is that it emits the line "FNURRRGH!" every time it finishes running a test case You'd like to have a test-case counting LogObserver that watches for these lines and counts them, because counting them will help the buildbot more accurately calculate how long the build will take, and this will let you know exactly how long you can sneak out of the office for your hang-gliding lessons without anyone noticing that you're gone.r*h j)jjq)h!jh}r*(h]h]h]h]h]ujMjj)h]r*hXzTo run a Framboozle-enabled test suite, you just run the 'framboozler' command from the top of your source code tree. The 'framboozler' command emits a bunch of stuff to stdout, but the most interesting bit is that it emits the line "FNURRRGH!" every time it finishes running a test case You'd like to have a test-case counting LogObserver that watches for these lines and counts them, because counting them will help the buildbot more accurately calculate how long the build will take, and this will let you know exactly how long you can sneak out of the office for your hang-gliding lessons without anyone noticing that you're gone.r*r*}r *(hj*h j*ubaubj)r *}r *(hXThis will involve writing a new :class:`BuildStep` (probably named "Framboozle") which inherits from :bb:step:`ShellCommand`. The :class:`BuildStep` class definition itself will look something like this::h j)jjq)h!jh}r *(h]h]h]h]h]ujMjj)h]r *(hX This will involve writing a new r*r*}r*(hX This will involve writing a new h j *ubj)r*}r*(hX:class:`BuildStep`r*h j *jjq)h!jh}r*(UreftypeXclassjjX BuildStepU refdomainXpyr*h]h]U refexplicith]h]h]jjUjX NjY NujMh]r*j})r*}r*(hj*h}r*(h]h]r*(jj*Xpy-classr*eh]h]h]uh j*h]r*hX BuildStepr*r*}r*(hUh j*ubah!jubaubhX3 (probably named "Framboozle") which inherits from r *r!*}r"*(hX3 (probably named "Framboozle") which inherits from h j *ubj)r#*}r$*(hX:bb:step:`ShellCommand`r%*h j *jjq)h!jh}r&*(UreftypeXstepjjX ShellCommandU refdomainXbbr'*h]h]U refexplicith]h]h]jjUujMh]r(*j})r)*}r**(hj%*h}r+*(h]h]r,*(jj'*Xbb-stepr-*eh]h]h]uh j#*h]r.*hX ShellCommandr/*r0*}r1*(hUh j)*ubah!jubaubhX. The r2*r3*}r4*(hX. The h j *ubj)r5*}r6*(hX:class:`BuildStep`r7*h j *jjq)h!jh}r8*(UreftypeXclassjjX BuildStepU refdomainXpyr9*h]h]U refexplicith]h]h]jjUjX NjY NujMh]r:*j})r;*}r<*(hj7*h}r=*(h]h]r>*(jj9*Xpy-classr?*eh]h]h]uh j5*h]r@*hX BuildSteprA*rB*}rC*(hUh j;*ubah!jubaubhX7 class definition itself will look something like this:rD*rE*}rF*(hX7 class definition itself will look something like this:h j *ubeubj)rG*}rH*(hX^from buildbot.steps.shell import ShellCommand from buildbot.process.logobserver import LogLineObserver class FNURRRGHCounter(LogLineObserver): numTests = 0 def outLineReceived(self, line): if "FNURRRGH!" in line: self.numTests += 1 self.step.setProgress('tests', self.numTests) class Framboozle(ShellCommand): command = ["framboozler"] def __init__(self, **kwargs): ShellCommand.__init__(self, **kwargs) # always upcall! counter = FNURRRGHCounter() self.addLogObserver('stdio', counter) self.progressMetrics += ('tests',)h j)jjq)h!jh}rI*(jjh]h]h]h]h]ujMjj)h]rJ*hX^from buildbot.steps.shell import ShellCommand from buildbot.process.logobserver import LogLineObserver class FNURRRGHCounter(LogLineObserver): numTests = 0 def outLineReceived(self, line): if "FNURRRGH!" in line: self.numTests += 1 self.step.setProgress('tests', self.numTests) class Framboozle(ShellCommand): command = ["framboozler"] def __init__(self, **kwargs): ShellCommand.__init__(self, **kwargs) # always upcall! counter = FNURRRGHCounter() self.addLogObserver('stdio', counter) self.progressMetrics += ('tests',)rK*rL*}rM*(hUh jG*ubaubj)rN*}rO*(hXOSo that's the code that we want to wind up using. How do we actually deploy it?rP*h j)jjq)h!jh}rQ*(h]h]h]h]h]ujMjj)h]rR*hXOSo that's the code that we want to wind up using. How do we actually deploy it?rS*rT*}rU*(hjP*h jN*ubaubj)rV*}rW*(hX'You have a couple of different options.rX*h j)jjq)h!jh}rY*(h]h]h]h]h]ujMjj)h]rZ*hX'You have a couple of different options.r[*r\*}r]*(hjX*h jV*ubaubj)r^*}r_*(hUh j)jjq)h!jh}r`*(h]h]h]h]ra*j)ah]rb*j)aujMjj)h]rc*(h)rd*}re*(hX(Inclusion in the :file:`master.cfg` fileh j^*jjq)h!h"h}rf*(h]h]h]h]h]ujMjj)h]rg*(hXInclusion in the rh*ri*}rj*(hXInclusion in the rk*h jd*ubj})rl*}rm*(hUh}rn*(h]h]h]h]ro*Xfilerp*aUrolejp*h]uh jd*h]rq*hX master.cfgrr*rs*}rt*(hX master.cfgru*h jl*ubah!jubhX filerv*rw*}rx*(hX filery*h jd*ubeubj)rz*}r{*(hXThe simplest technique is to simply put the step class definitions in your :file:`master.cfg` file, somewhere before the :class:`BuildFactory` definition where you actually use it in a clause like::h j^*jjq)h!jh}r|*(h]h]h]h]h]ujMjj)h]r}*(hXKThe simplest technique is to simply put the step class definitions in your r~*r*}r*(hXKThe simplest technique is to simply put the step class definitions in your h jz*ubj})r*}r*(hUh}r*(h]h]h]h]r*Xfiler*aUrolej*h]uh jz*h]r*hX master.cfgr*r*}r*(hX master.cfgh j*ubah!jubhX file, somewhere before the r*r*}r*(hX file, somewhere before the h jz*ubj)r*}r*(hX:class:`BuildFactory`r*h jz*jjq)h!jh}r*(UreftypeXclassjjX BuildFactoryU refdomainXpyr*h]h]U refexplicith]h]h]jjUjX NjY NujMh]r*j})r*}r*(hj*h}r*(h]h]r*(jj*Xpy-classr*eh]h]h]uh j*h]r*hX BuildFactoryr*r*}r*(hUh j*ubah!jubaubhX7 definition where you actually use it in a clause like:r*r*}r*(hX7 definition where you actually use it in a clause like:h jz*ubeubj)r*}r*(hXIf = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())h j^*jjq)h!jh}r*(jjh]h]h]h]h]ujM jj)h]r*hXIf = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())r*r*}r*(hUh j*ubaubj)r*}r*(hXSRemember that :file:`master.cfg` is secretly just a Python program with one job: populating the :file:`BuildmasterConfig` dictionary. And Python programs are allowed to define as many classes as they like. So you can define classes and use them in the same file, just as long as the class is defined before some other code tries to use it.h j^*jjq)h!jh}r*(h]h]h]h]h]ujM jj)h]r*(hXRemember that r*r*}r*(hXRemember that h j*ubj})r*}r*(hUh}r*(h]h]h]h]r*Xfiler*aUrolej*h]uh j*h]r*hX master.cfgr*r*}r*(hX master.cfgh j*ubah!jubhX@ is secretly just a Python program with one job: populating the r*r*}r*(hX@ is secretly just a Python program with one job: populating the h j*ubj})r*}r*(hUh}r*(h]h]h]h]r*Xfiler*aUrolej*h]uh j*h]r*hXBuildmasterConfigr*r*}r*(hXBuildmasterConfigh j*ubah!jubhX dictionary. And Python programs are allowed to define as many classes as they like. So you can define classes and use them in the same file, just as long as the class is defined before some other code tries to use it.r*r*}r*(hX dictionary. And Python programs are allowed to define as many classes as they like. So you can define classes and use them in the same file, just as long as the class is defined before some other code tries to use it.h j*ubeubj)r*}r*(hXThis is easy, and it keeps the point of definition very close to the point of use, and whoever replaces you after that unfortunate hang-gliding accident will appreciate being able to easily figure out what the heck this stupid "Framboozle" step is doing anyways. The downside is that every time you reload the config file, the Framboozle class will get redefined, which means that the buildmaster will think that you've reconfigured all the Builders that use it, even though nothing changed. Bleh.r*h j^*jjq)h!jh}r*(h]h]h]h]h]ujMjj)h]r*hXThis is easy, and it keeps the point of definition very close to the point of use, and whoever replaces you after that unfortunate hang-gliding accident will appreciate being able to easily figure out what the heck this stupid "Framboozle" step is doing anyways. The downside is that every time you reload the config file, the Framboozle class will get redefined, which means that the buildmaster will think that you've reconfigured all the Builders that use it, even though nothing changed. Bleh.r*r*}r*(hj*h j*ubaubeubj)r*}r*(hUh j)jjq)h!jh}r*(h]h]h]h]r*j)ah]r*j)aujMjj)h]r*(h)r*}r*(hX#python file somewhere on the systemr*h j*jjq)h!h"h}r*(h]h]h]h]h]ujMjj)h]r*hX#python file somewhere on the systemr*r*}r*(hj*h j*ubaubj)r*}r*(hXInstead, we can put this code in a separate file, and import it into the master.cfg file just like we would the normal buildsteps like :bb:step:`ShellCommand` and :bb:step:`SVN`.h j*jjq)h!jh}r*(h]h]h]h]h]ujMjj)h]r*(hXInstead, we can put this code in a separate file, and import it into the master.cfg file just like we would the normal buildsteps like r*r*}r*(hXInstead, we can put this code in a separate file, and import it into the master.cfg file just like we would the normal buildsteps like h j*ubj)r*}r*(hX:bb:step:`ShellCommand`r*h j*jjq)h!jh}r*(UreftypeXstepjjX ShellCommandU refdomainXbbr*h]h]U refexplicith]h]h]jjUujMh]r*j})r*}r*(hj*h}r*(h]h]r*(jj*Xbb-stepr*eh]h]h]uh j*h]r*hX ShellCommandr*r*}r*(hUh j*ubah!jubaubhX and r*r*}r*(hX and h j*ubj)r*}r*(hX:bb:step:`SVN`r*h j*jjq)h!jh}r*(UreftypeXstepjjXSVNU refdomainXbbr*h]h]U refexplicith]h]h]jjUujMh]r*j})r*}r*(hj*h}r*(h]h]r*(jj*Xbb-stepr*eh]h]h]uh j*h]r*hXSVNr+r+}r+(hUh j*ubah!jubaubhX.r+}r+(hX.h j*ubeubj)r+}r+(hXCreate a directory named :file:`~/lib/python`, put the step class definitions in :file:`~/lib/python/framboozle.py`, and run your buildmaster using:h j*jjq)h!jh}r+(h]h]h]h]h]ujM#jj)h]r+(hXCreate a directory named r +r +}r +(hXCreate a directory named h j+ubj})r +}r +(hUh}r+(h]h]h]h]r+Xfiler+aUrolej+h]uh j+h]r+hX ~/lib/pythonr+r+}r+(hX ~/lib/pythonh j +ubah!jubhX$, put the step class definitions in r+r+}r+(hX$, put the step class definitions in h j+ubj})r+}r+(hUh}r+(h]h]h]h]r+Xfiler+aUrolej+h]uh j+h]r+hX~/lib/python/framboozle.pyr+r+}r +(hX~/lib/python/framboozle.pyh j+ubah!jubhX!, and run your buildmaster using:r!+r"+}r#+(hX!, and run your buildmaster using:h j+ubeubj)r$+}r%+(hX0PYTHONPATH=~/lib/python buildbot start MASTERDIRh j*jjq)h!jh}r&+(jjXbashjjh]h]h]h]h]ujM&jj)h]r'+hX0PYTHONPATH=~/lib/python buildbot start MASTERDIRr(+r)+}r*+(hUh j$+ubaubj)r++}r,+(hXor use the :file:`Makefile.buildbot` to control the way ``buildbot start`` works. Or add something like this to something like your :file:`~/.bashrc` or :file:`~/.bash_profile` or :file:`~/.cshrc`:h j*jjq)h!jh}r-+(h]h]h]h]h]ujM*jj)h]r.+(hX or use the r/+r0+}r1+(hX or use the h j++ubj})r2+}r3+(hUh}r4+(h]h]h]h]r5+Xfiler6+aUrolej6+h]uh j++h]r7+hXMakefile.buildbotr8+r9+}r:+(hXMakefile.buildboth j2+ubah!jubhX to control the way r;+r<+}r=+(hX to control the way h j++ubj})r>+}r?+(hX``buildbot start``h}r@+(h]h]h]h]h]uh j++h]rA+hXbuildbot startrB+rC+}rD+(hUh j>+ubah!jubhX: works. Or add something like this to something like your rE+rF+}rG+(hX: works. Or add something like this to something like your h j++ubj})rH+}rI+(hUh}rJ+(h]h]h]h]rK+XfilerL+aUrolejL+h]uh j++h]rM+hX ~/.bashrcrN+rO+}rP+(hX ~/.bashrch jH+ubah!jubhX or rQ+rR+}rS+(hX or h j++ubj})rT+}rU+(hUh}rV+(h]h]h]h]rW+XfilerX+aUrolejX+h]uh j++h]rY+hX~/.bash_profilerZ+r[+}r\+(hX~/.bash_profileh jT+ubah!jubhX or r]+r^+}r_+(hX or h j++ubj})r`+}ra+(hUh}rb+(h]h]h]h]rc+Xfilerd+aUrolejd+h]uh j++h]re+hX~/.cshrcrf+rg+}rh+(hX~/.cshrch j`+ubah!jubhX:ri+}rj+(hX:h j++ubeubj)rk+}rl+(hXexport PYTHONPATH=~/lib/pythonh j*jjq)h!jh}rm+(jjXbashjjh]h]h]h]h]ujM.jj)h]rn+hXexport PYTHONPATH=~/lib/pythonro+rp+}rq+(hUh jk+ubaubj)rr+}rs+(hX<Once we've done this, our :file:`master.cfg` can look like::h j*jjq)h!jh}rt+(h]h]h]h]h]ujM2jj)h]ru+(hXOnce we've done this, our rv+rw+}rx+(hXOnce we've done this, our h jr+ubj})ry+}rz+(hUh}r{+(h]h]h]h]r|+Xfiler}+aUrolej}+h]uh jr+h]r~+hX master.cfgr+r+}r+(hX master.cfgh jy+ubah!jubhX can look like:r+r+}r+(hX can look like:h jr+ubeubj)r+}r+(hXkfrom framboozle import Framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())h j*jjq)h!jh}r+(jjh]h]h]h]h]ujM4jj)h]r+hXkfrom framboozle import Framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())r+r+}r+(hUh j+ubaubj)r+}r+(hXor::h j*jjq)h!jh}r+(h]h]h]h]h]ujM9jj)h]r+hXor:r+r+}r+(hXor:h j+ubaubj)r+}r+(hXfimport framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())h j*jjq)h!jh}r+(jjh]h]h]h]h]ujM;jj)h]r+hXfimport framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())r+r+}r+(hUh j+ubaubj)r+}r+(hXZ(check out the Python docs for details about how ``import`` and ``from A import B`` work).h j*jjq)h!jh}r+(h]h]h]h]h]ujM@jj)h]r+(hX1(check out the Python docs for details about how r+r+}r+(hX1(check out the Python docs for details about how h j+ubj})r+}r+(hX ``import``h}r+(h]h]h]h]h]uh j+h]r+hXimportr+r+}r+(hUh j+ubah!jubhX and r+r+}r+(hX and h j+ubj})r+}r+(hX``from A import B``h}r+(h]h]h]h]h]uh j+h]r+hXfrom A import Br+r+}r+(hUh j+ubah!jubhX work).r+r+}r+(hX work).h j+ubeubj)r+}r+(hXWhat we've done here is to tell Python that every time it handles an "import" statement for some named module, it should look in our :file:`~/lib/python/` for that module before it looks anywhere else. After our directories, it will try in a bunch of standard directories too (including the one where buildbot is installed). By setting the :envvar:`PYTHONPATH` environment variable, you can add directories to the front of this search list.h j*jjq)h!jh}r+(h]h]h]h]h]ujMCjj)h]r+(hXWhat we've done here is to tell Python that every time it handles an "import" statement for some named module, it should look in our r+r+}r+(hXWhat we've done here is to tell Python that every time it handles an "import" statement for some named module, it should look in our h j+ubj})r+}r+(hUh}r+(h]h]h]h]r+Xfiler+aUrolej+h]uh j+h]r+hX ~/lib/python/r+r+}r+(hX ~/lib/python/h j+ubah!jubhX for that module before it looks anywhere else. After our directories, it will try in a bunch of standard directories too (including the one where buildbot is installed). By setting the r+r+}r+(hX for that module before it looks anywhere else. After our directories, it will try in a bunch of standard directories too (including the one where buildbot is installed). By setting the h j+ubj[)r+}r+(hUh}r+(h]h]h]h]h]j]r+((Usingler+X PYTHONPATHr+Uindex-5r+Utr+(j+X environment variable; PYTHONPATHj+Utr+euh j+h]h!j^ubj)r+}r+(hUh}r+(h]h]h]h]r+j+ah]uh j+h]h!jubj)r+}r+(hX:envvar:`PYTHONPATH`r+h j+jjq)h!jh}r+(UreftypeXenvvarjjj+U refdomainXstdr+h]h]U refexplicith]h]h]jjUujMCh]r+j})r+}r+(hj+h}r+(h]h]r+(jj+X std-envvarr+eh]h]h]uh j+h]r+hX PYTHONPATHr+r+}r+(hUh j+ubah!jubaubhXP environment variable, you can add directories to the front of this search list.r+r+}r+(hXP environment variable, you can add directories to the front of this search list.h j+ubeubj)r+}r+(hXPython knows that once it "import"s a file, it doesn't need to re-import it again. This means that reconfiguring the buildmaster (with ``buildbot reconfig``, for example) won't make it think the Framboozle class has changed every time, so the Builders that use it will not be spuriously restarted. On the other hand, you either have to start your buildmaster in a slightly weird way, or you have to modify your environment to set the :envvar:`PYTHONPATH` variable.h j*jjq)h!jh}r+(h]h]h]h]h]ujMKjj)h]r+(hXPython knows that once it "import"s a file, it doesn't need to re-import it again. This means that reconfiguring the buildmaster (with r+r+}r+(hXPython knows that once it "import"s a file, it doesn't need to re-import it again. This means that reconfiguring the buildmaster (with h j+ubj})r+}r+(hX``buildbot reconfig``h}r+(h]h]h]h]h]uh j+h]r+hXbuildbot reconfigr+r+}r+(hUh j+ubah!jubhX, for example) won't make it think the Framboozle class has changed every time, so the Builders that use it will not be spuriously restarted. On the other hand, you either have to start your buildmaster in a slightly weird way, or you have to modify your environment to set the r+r+}r+(hX, for example) won't make it think the Framboozle class has changed every time, so the Builders that use it will not be spuriously restarted. On the other hand, you either have to start your buildmaster in a slightly weird way, or you have to modify your environment to set the h j+ubj[)r+}r+(hUh}r+(h]h]h]h]h]j]r+((j+X PYTHONPATHr+Uindex-6r+Utr+(j+X environment variable; PYTHONPATHj+Utr+euh j+h]h!j^ubj)r,}r,(hUh}r,(h]h]h]h]r,j+ah]uh j+h]h!jubj)r,}r,(hX:envvar:`PYTHONPATH`r,h j+jjq)h!jh}r,(UreftypeXenvvarjjj+U refdomainXstdr,h]h]U refexplicith]h]h]jjUujMKh]r ,j})r ,}r ,(hj,h}r ,(h]h]r ,(jj,X std-envvarr,eh]h]h]uh j,h]r,hX PYTHONPATHr,r,}r,(hUh j ,ubah!jubaubhX variable.r,r,}r,(hX variable.h j+ubeubeubj)r,}r,(hUh j)jjq)h!jh}r,(h]h]h]h]r,j)ah]r,j)aujMUjj)h]r,(h)r,}r,(hX:Install this code into a standard Python library directoryr,h j,jjq)h!h"h}r,(h]h]h]h]h]ujMUjj)h]r ,hX:Install this code into a standard Python library directoryr!,r",}r#,(hj,h j,ubaubj)r$,}r%,(hXBFind out what your Python's standard include path is by asking it:r&,h j,jjq)h!jh}r',(h]h]h]h]h]ujMWjj)h]r(,hXBFind out what your Python's standard include path is by asking it:r),r*,}r+,(hj&,h j$,ubaubj)r,,}r-,(hX[80:warner@luther% python Python 2.4.4c0 (#2, Oct 2 2006, 00:57:46) [GCC 4.1.2 20060928 (prerelease) (Debian 4.1.1-15)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> import pprint >>> pprint.pprint(sys.path) ['', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/Numeric', '/var/lib/python-support/python2.4', '/usr/lib/site-python']h j,jjq)h!jh}r.,(jjXnonejjh]h]h]h]h]ujMYjj)h]r/,hX[80:warner@luther% python Python 2.4.4c0 (#2, Oct 2 2006, 00:57:46) [GCC 4.1.2 20060928 (prerelease) (Debian 4.1.1-15)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> import pprint >>> pprint.pprint(sys.path) ['', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/Numeric', '/var/lib/python-support/python2.4', '/usr/lib/site-python']r0,r1,}r2,(hUh j,,ubaubj)r3,}r4,(hXIn this case, putting the code into /usr/local/lib/python2.4/site-packages/framboozle.py would work just fine. We can use the same :file:`master.cfg` ``import framboozle`` statement as in Option 2. By putting it in a standard include directory (instead of the decidedly non-standard :file:`~/lib/python`), we don't even have to set :envvar:`PYTHONPATH` to anything special. The downside is that you probably have to be root to write to one of those standard include directories.h j,jjq)h!jh}r5,(h]h]h]h]h]ujMnjj)h]r6,(hXIn this case, putting the code into /usr/local/lib/python2.4/site-packages/framboozle.py would work just fine. We can use the same r7,r8,}r9,(hXIn this case, putting the code into /usr/local/lib/python2.4/site-packages/framboozle.py would work just fine. We can use the same h j3,ubj})r:,}r;,(hUh}r<,(h]h]h]h]r=,Xfiler>,aUrolej>,h]uh j3,h]r?,hX master.cfgr@,rA,}rB,(hX master.cfgh j:,ubah!jubhX rC,}rD,(hX h j3,ubj})rE,}rF,(hX``import framboozle``h}rG,(h]h]h]h]h]uh j3,h]rH,hXimport framboozlerI,rJ,}rK,(hUh jE,ubah!jubhXp statement as in Option 2. By putting it in a standard include directory (instead of the decidedly non-standard rL,rM,}rN,(hXp statement as in Option 2. By putting it in a standard include directory (instead of the decidedly non-standard h j3,ubj})rO,}rP,(hUh}rQ,(h]h]h]h]rR,XfilerS,aUrolejS,h]uh j3,h]rT,hX ~/lib/pythonrU,rV,}rW,(hX ~/lib/pythonh jO,ubah!jubhX), we don't even have to set rX,rY,}rZ,(hX), we don't even have to set h j3,ubj[)r[,}r\,(hUh}r],(h]h]h]h]h]j]r^,((j+X PYTHONPATHr_,Uindex-7r`,Utra,(j+X environment variable; PYTHONPATHj`,Utrb,euh j3,h]h!j^ubj)rc,}rd,(hUh}re,(h]h]h]h]rf,j`,ah]uh j3,h]h!jubj)rg,}rh,(hX:envvar:`PYTHONPATH`ri,h j3,jjq)h!jh}rj,(UreftypeXenvvarjjj_,U refdomainXstdrk,h]h]U refexplicith]h]h]jjUujMnh]rl,j})rm,}rn,(hji,h}ro,(h]h]rp,(jjk,X std-envvarrq,eh]h]h]uh jg,h]rr,hX PYTHONPATHrs,rt,}ru,(hUh jm,ubah!jubaubhX~ to anything special. The downside is that you probably have to be root to write to one of those standard include directories.rv,rw,}rx,(hX~ to anything special. The downside is that you probably have to be root to write to one of those standard include directories.h j3,ubeubeubj)ry,}rz,(hUh j)jjq)h!jh}r{,(h]h]h]h]r|,j)ah]r},j)aujMxjj)h]r~,(h)r,}r,(hX:Submit the code for inclusion in the Buildbot distributionr,h jy,jjq)h!h"h}r,(h]h]h]h]h]ujMxjj)h]r,hX:Submit the code for inclusion in the Buildbot distributionr,r,}r,(hj,h j,ubaubj)r,}r,(hXMake a fork of buildbot on http://github.com/buildbot/buildbot or post a patch in a bug at http://buildbot.net. In either case, post a note about your patch to the mailing list, so others can provide feedback and, eventually, commit it.h jy,jjq)h!jh}r,(h]h]h]h]h]ujMzjj)h]r,(hXMake a fork of buildbot on r,r,}r,(hXMake a fork of buildbot on h j,ubcdocutils.nodes reference r,)r,}r,(hX#http://github.com/buildbot/buildbotr,h}r,(Urefurij,h]h]h]h]h]uh j,h]r,hX#http://github.com/buildbot/buildbotr,r,}r,(hUh j,ubah!U referencer,ubhX or post a patch in a bug at r,r,}r,(hX or post a patch in a bug at h j,ubj,)r,}r,(hXhttp://buildbot.netr,h}r,(Urefurij,h]h]h]h]h]uh j,h]r,hXhttp://buildbot.netr,r,}r,(hUh j,ubah!j,ubhX. In either case, post a note about your patch to the mailing list, so others can provide feedback and, eventually, commit it.r,r,}r,(hX. In either case, post a note about your patch to the mailing list, so others can provide feedback and, eventually, commit it.h j,ubeubj)r,}r,(hXzfrom buildbot.steps import framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())h jy,jjq)h!jh}r,(jjh]h]h]h]h]ujMjj)h]r,hXzfrom buildbot.steps import framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())r,r,}r,(hUh j,ubaubj)r,}r,(hXkAnd then you don't even have to install framboozle.py anywhere on your system, since it will ship with Buildbot. You don't have to be root, you don't have to set :envvar:`PYTHONPATH`. But you do have to make a good case for Framboozle being worth going into the main distribution, you'll probably have to provide docs and some unit test cases, you'll need to figure out what kind of beer the author likes (IPA's and Stouts for Dustin), and then you'll have to wait until the next release. But in some environments, all this is easier than getting root on your buildmaster box, so the tradeoffs may actually be worth it.h jy,jjq)h!jh}r,(h]h]h]h]h]ujMjj)h]r,(hXAnd then you don't even have to install framboozle.py anywhere on your system, since it will ship with Buildbot. You don't have to be root, you don't have to set r,r,}r,(hXAnd then you don't even have to install framboozle.py anywhere on your system, since it will ship with Buildbot. You don't have to be root, you don't have to set h j,ubj[)r,}r,(hUh}r,(h]h]h]h]h]j]r,((j+X PYTHONPATHr,Uindex-8r,Utr,(j+X environment variable; PYTHONPATHj,Utr,euh j,h]h!j^ubj)r,}r,(hUh}r,(h]h]h]h]r,j,ah]uh j,h]h!jubj)r,}r,(hX:envvar:`PYTHONPATH`r,h j,jjq)h!jh}r,(UreftypeXenvvarjjj,U refdomainXstdr,h]h]U refexplicith]h]h]jjUujMh]r,j})r,}r,(hj,h}r,(h]h]r,(jj,X std-envvarr,eh]h]h]uh j,h]r,hX PYTHONPATHr,r,}r,(hUh j,ubah!jubaubhX. But you do have to make a good case for Framboozle being worth going into the main distribution, you'll probably have to provide docs and some unit test cases, you'll need to figure out what kind of beer the author likes (IPA's and Stouts for Dustin), and then you'll have to wait until the next release. But in some environments, all this is easier than getting root on your buildmaster box, so the tradeoffs may actually be worth it.r,r,}r,(hX. But you do have to make a good case for Framboozle being worth going into the main distribution, you'll probably have to provide docs and some unit test cases, you'll need to figure out what kind of beer the author likes (IPA's and Stouts for Dustin), and then you'll have to wait until the next release. But in some environments, all this is easier than getting root on your buildmaster box, so the tradeoffs may actually be worth it.h j,ubeubj)r,}r,(hX/Putting the code in master.cfg (1) makes it available to that buildmaster instance. Putting it in a file in a personal library directory (2) makes it available for any buildmasters you might be running. Putting it in a file in a system-wide shared library directory (3) makes it available for any buildmasters that anyone on that system might be running. Getting it into the buildbot's upstream repository (4) makes it available for any buildmasters that anyone in the world might be running. It's all a matter of how widely you want to deploy that new class.r,h jy,jjq)h!jh}r,(h]h]h]h]h]ujMjj)h]r,hX/Putting the code in master.cfg (1) makes it available to that buildmaster instance. Putting it in a file in a personal library directory (2) makes it available for any buildmasters you might be running. Putting it in a file in a system-wide shared library directory (3) makes it available for any buildmasters that anyone on that system might be running. Getting it into the buildbot's upstream repository (4) makes it available for any buildmasters that anyone in the world might be running. It's all a matter of how widely you want to deploy that new class.r,r,}r,(hj,h j,ubaubeubeubjjq)h!jh}r,(h]h]h]h]h]ujMjj)h]r,(hXLet's say that we've got some snazzy new unit-test framework called Framboozle. It's the hottest thing since sliced bread. It slices, it dices, it runs unit tests like there's no tomorrow. Plus if your unit tests fail, you can use its name for a Web 2.1 startup company, make millions of dollars, and hire engineers to fix the bugs for you, while you spend your afternoons lazily hang-gliding along a scenic pacific beach, blissfully unconcerned about the state of your tests. r,r,}r,(hXLet's say that we've got some snazzy new unit-test framework called Framboozle. It's the hottest thing since sliced bread. It slices, it dices, it runs unit tests like there's no tomorrow. Plus if your unit tests fail, you can use its name for a Web 2.1 startup company, make millions of dollars, and hire engineers to fix the bugs for you, while you spend your afternoons lazily hang-gliding along a scenic pacific beach, blissfully unconcerned about the state of your tests. h j)ubj)eubh!Ufootnote_referencer,h}r,(Uautor,Kh]r,Uid11r,ah]h]h]h]jjuh]r,hX1r,}r,(hUh j)ubaubasj}r,j)]r,j)asj]r,j]r,j)aj]r,j]r,jj)jNj ]r,(j")r,}r,(hUh}r,(h]UlevelKh]h]Usourcejq)h]h]UlineKUtypej&uh]r,j)r,}r,(hUh}r,(h]h]h]h]h]uh j,h]r,hX3Hyperlink target "customization" is not referenced.r,r,}r,(hUh j,ubah!jubah!j/ubj")r,}r,(hUh}r,(h]UlevelKh]h]Usourcejq)h]h]UlineK$Utypej&uh]r,j)r,}r,(hUh}r,(h]h]h]h]h]uh j,h]r-hX=Hyperlink target "merge-request-functions" is not referenced.r-r-}r-(hUh j,ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineK*Utypej&uh]r-j)r-}r -(hUh}r -(h]h]h]h]h]uh j-h]r -hX-Hyperlink target "index-0" is not referenced.r -r -}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineKVUtypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX@Hyperlink target "builder-priority-functions" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineK\Utypej&uh]r-j)r-}r-(hUh}r -(h]h]h]h]h]uh j-h]r!-hX-Hyperlink target "index-1" is not referenced.r"-r#-}r$-(hUh j-ubah!jubah!j/ubj")r%-}r&-(hUh}r'-(h]UlevelKh]h]Usourcejq)h]h]UlineKuUtypej&uh]r(-j)r)-}r*-(hUh}r+-(h]h]h]h]h]uh j%-h]r,-hX-Hyperlink target "index-2" is not referenced.r--r.-}r/-(hUh j)-ubah!jubah!j/ubj")r0-}r1-(hUh}r2-(h]UlevelKh]h]Usourcejq)h]h]UlineKvUtypej&uh]r3-j)r4-}r5-(hUh}r6-(h]h]h]h]h]uh j0-h]r7-hX>Hyperlink target "build-priority-functions" is not referenced.r8-r9-}r:-(hUh j4-ubah!jubah!j/ubj")r;-}r<-(hUh}r=-(h]UlevelKh]h]Usourcejq)h]h]UlineKUtypej&uh]r>-j)r?-}r@-(hUh}rA-(h]h]h]h]h]uh j;-h]rB-hX;Hyperlink target "customizing-svnpoller" is not referenced.rC-rD-}rE-(hUh j?-ubah!jubah!j/ubj")rF-}rG-(hUh}rH-(h]UlevelKh]h]Usourcejq)h]h]UlineMdUtypej&uh]rI-j)rJ-}rK-(hUh}rL-(h]h]h]h]h]uh jF-h]rM-hX<Hyperlink target "writing-change-sources" is not referenced.rN-rO-}rP-(hUh jJ-ubah!jubah!j/ubj")rQ-}rR-(hUh}rS-(h]UlevelKh]h]Usourcejq)h]h]UlineMUtypej&uh]rT-j)rU-}rV-(hUh}rW-(h]h]h]h]h]uh jQ-h]rX-hX?Hyperlink target "factory-workdir-functions" is not referenced.rY-rZ-}r[-(hUh jU-ubah!jubah!j/ubj")r\-}r]-(hUh}r^-(h]UlevelKh]h]Usourcejq)h]h]UlineMUtypej&uh]r_-j)r`-}ra-(hUh}rb-(h]h]h]h]h]uh j\-h]rc-hX<Hyperlink target "writing-new-buildsteps" is not referenced.rd-re-}rf-(hUh j`-ubah!jubah!j/ubj")rg-}rh-(hUh}ri-(h]UlevelKh]h]Usourcejq)h]h]UlineMUtypej&uh]rj-j)rk-}rl-(hUh}rm-(h]h]h]h]h]uh jg-h]rn-hXDHyperlink target "writing-buildstep-constructors" is not referenced.ro-rp-}rq-(hUh jk-ubah!jubah!j/ubj")rr-}rs-(hUh}rt-(h]UlevelKh]h]Usourcejq)h]h]UlineMUtypej&uh]ru-j)rv-}rw-(hUh}rx-(h]h]h]h]h]uh jr-h]ry-hX9Hyperlink target "adding-logobservers" is not referenced.rz-r{-}r|-(hUh jv-ubah!jubah!j/ubj")r}-}r~-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineMUUtypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j}-h]r-hX-Hyperlink target "index-3" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]Utypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX-Hyperlink target "index-4" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineMCUtypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX-Hyperlink target "index-5" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineMKUtypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX-Hyperlink target "index-6" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineMnUtypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX-Hyperlink target "index-7" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubj")r-}r-(hUh}r-(h]UlevelKh]h]Usourcejq)h]h]UlineMUtypej&uh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX-Hyperlink target "index-8" is not referenced.r-r-}r-(hUh j-ubah!jubah!j/ubej0Nj1K j2]r-cdocutils.nodes footnote r-)r-}r-(hX:framboozle.com is still available. Remember, I get 10% :).r-h j)r-}r-(hUh j)jjq)h!jh}r-(h]h]h]h]r-j)ah]r-j)aujMjj)h]r-(h)r-}r-(hXWriting New Status Pluginsr-h j-jjq)h!h"h}r-(h]h]h]h]h]ujMjj)h]r-hXWriting New Status Pluginsr-r-}r-(hj-h j-ubaubj)r-}r-(hXEach status plugin is an object which provides the :class:`twisted.application.service.IService` interface, which creates a tree of Services with the buildmaster at the top [not strictly true]. The status plugins are all children of an object which implements :class:`buildbot.interfaces.IStatus`, the main status object. From this object, the plugin can retrieve anything it wants about current and past builds. It can also subscribe to hear about new and upcoming builds.h j-jjq)h!jh}r-(h]h]h]h]h]ujMjj)h]r-(hX3Each status plugin is an object which provides the r-r-}r-(hX3Each status plugin is an object which provides the h j-ubj)r-}r-(hX-:class:`twisted.application.service.IService`r-h j-jjq)h!jh}r-(UreftypeXclassjjX$twisted.application.service.IServiceU refdomainXpyr-h]h]U refexplicith]h]h]jjUjX NjY NujMh]r-j})r-}r-(hj-h}r-(h]h]r-(jj-Xpy-classr-eh]h]h]uh j-h]r-hX$twisted.application.service.IServicer-r-}r-(hUh j-ubah!jubaubhX interface, which creates a tree of Services with the buildmaster at the top [not strictly true]. The status plugins are all children of an object which implements r-r-}r-(hX interface, which creates a tree of Services with the buildmaster at the top [not strictly true]. The status plugins are all children of an object which implements h j-ubj)r-}r-(hX$:class:`buildbot.interfaces.IStatus`r-h j-jjq)h!jh}r-(UreftypeXclassjjXbuildbot.interfaces.IStatusU refdomainXpyr-h]h]U refexplicith]h]h]jjUjX NjY NujMh]r-j})r-}r-(hj-h}r-(h]h]r-(jj-Xpy-classr-eh]h]h]uh j-h]r-hXbuildbot.interfaces.IStatusr-r-}r-(hUh j-ubah!jubaubhX, the main status object. From this object, the plugin can retrieve anything it wants about current and past builds. It can also subscribe to hear about new and upcoming builds.r-r-}r-(hX, the main status object. From this object, the plugin can retrieve anything it wants about current and past builds. It can also subscribe to hear about new and upcoming builds.h j-ubeubj)r-}r-(hXStatus plugins which only react to human queries (like the Waterfall display) never need to subscribe to anything: they are idle until someone asks a question, then wake up and extract the information they need to answer it, then they go back to sleep. Plugins which need to act spontaneously when builds complete (like the :class:`MailNotifier` plugin) need to subscribe to hear about new builds.h j-jjq)h!jh}r-(h]h]h]h]h]ujMjj)h]r.(hXDStatus plugins which only react to human queries (like the Waterfall display) never need to subscribe to anything: they are idle until someone asks a question, then wake up and extract the information they need to answer it, then they go back to sleep. Plugins which need to act spontaneously when builds complete (like the r.r.}r.(hXDStatus plugins which only react to human queries (like the Waterfall display) never need to subscribe to anything: they are idle until someone asks a question, then wake up and extract the information they need to answer it, then they go back to sleep. Plugins which need to act spontaneously when builds complete (like the h j-ubj)r.}r.(hX:class:`MailNotifier`r.h j-jjq)h!jh}r.(UreftypeXclassjjX MailNotifierU refdomainXpyr.h]h]U refexplicith]h]h]jjUjX NjY NujMh]r .j})r .}r .(hj.h}r .(h]h]r .(jj.Xpy-classr.eh]h]h]uh j.h]r.hX MailNotifierr.r.}r.(hUh j .ubah!jubaubhX4 plugin) need to subscribe to hear about new builds.r.r.}r.(hX4 plugin) need to subscribe to hear about new builds.h j-ubeubj)r.}r.(hXIf the status plugin needs to run network services (like the HTTP server used by the Waterfall plugin), they can be attached as Service children of the plugin itself, using the :class:`IServiceCollection` interface.h j-jjq)h!jh}r.(h]h]h]h]h]ujMjj)h]r.(hXIf the status plugin needs to run network services (like the HTTP server used by the Waterfall plugin), they can be attached as Service children of the plugin itself, using the r.r.}r.(hXIf the status plugin needs to run network services (like the HTTP server used by the Waterfall plugin), they can be attached as Service children of the plugin itself, using the h j.ubj)r.}r.(hX:class:`IServiceCollection`r.h j.jjq)h!jh}r .(UreftypeXclassjjXIServiceCollectionU refdomainXpyr!.h]h]U refexplicith]h]h]jjUjX NjY NujMh]r".j})r#.}r$.(hj.h}r%.(h]h]r&.(jj!.Xpy-classr'.eh]h]h]uh j.h]r(.hXIServiceCollectionr).r*.}r+.(hUh j#.ubah!jubaubhX interface.r,.r-.}r..(hX interface.h j.ubeubj-eubjjq)h!Ufootnoter/.h}r0.(j,Kh]r1.jah]r2.j,ah]h]h]r3.jaujMjj)h]r4.(cdocutils.nodes label r5.)r6.}r7.(hUh j-jNh!Ulabelr8.h}r9.(h]h]h]h]h]ujNjj)h]r:.hX1r;.}r<.(hUh j6.ubaubj)r=.}r>.(hj-h j-jjq)h!jh}r?.(h]h]h]h]h]ujMh]r@.hX:framboozle.com is still available. Remember, I get 10% :).rA.rB.}rC.(hj-h j=.ubaubeubaj4}rD.j6]rE.j8(j9orF.}rG.(j<Kj=Nj>j?j@jANjBNjCjDjEjFjGNjHKjINjJKjKNh"NjLjMjNNjOjPjQjRKjSNjTKjUNjVjWjXKjYNjZNj[j\j]Nj^Nj_Nj`jaNjbNjcjdjeNjfjgjhNjiUjjKjkjljmUU/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/customization.rstjnjoNjpNjqjrjsjtjujvjQjwjxjyjzNj{]j|j}Kj~NubjKj}rH.(jj)rI.}rJ.(hUh j)jjq)j}rK.jj)rL.}rM.(hX.. _Build-Priority-Functions:h j)rN.}rO.(hUh j)jjq)j}rP.j1j)rQ.}rR.(hX.. _Builder-Priority-Functions:h j)rS.}rT.(hUh j)jjq)j}rU.j%j)rV.}rW.(hX.. _Merge-Request-Functions:h j)rX.}rY.(hUh j)jjq)h!jh}rZ.(h]h]h]h]r[.j)ah]r\.j)aujKjj)h]r].(h)r^.}r_.(hX%Programmatic Configuration Generationr`.h jX.jjq)h!h"h}ra.(h]h]h]h]h]ujKjj)h]rb.hX%Programmatic Configuration Generationrc.rd.}re.(hj`.h j^.ubaubj)rf.}rg.(hXBearing in mind that ``master.cfg`` is a Python file, large configurations can be shortened considerably by judicious use of Python loops. For example, the following will generate a builder for each of a range of supported versions of Python::h jX.jjq)h!jh}rh.(h]h]h]h]h]ujKjj)h]ri.(hXBearing in mind that rj.rk.}rl.(hXBearing in mind that h jf.ubj})rm.}rn.(hX``master.cfg``h}ro.(h]h]h]h]h]uh jf.h]rp.hX master.cfgrq.rr.}rs.(hUh jm.ubah!jubhX is a Python file, large configurations can be shortened considerably by judicious use of Python loops. For example, the following will generate a builder for each of a range of supported versions of Python:rt.ru.}rv.(hX is a Python file, large configurations can be shortened considerably by judicious use of Python loops. For example, the following will generate a builder for each of a range of supported versions of Python:h jf.ubeubj)rw.}rx.(hXpythons = [ 'python2.4', 'python2.5', 'python2.6', 'python2.7', 'python3.2', 'python3.3' ] pytest_slaves = [ "slave%s" % n for n in range(10) ] for python in pythons: f = BuildFactory() f.addStep(SVN(...)) f.addStep(ShellCommand(command=[ python, 'test.py' ])) c['builders'].append(BuilderConfig( name="test-%s" % python, factory=f, slavenames=pytest_slaves))h jX.jjq)h!jh}ry.(jjh]h]h]h]h]ujKjj)h]rz.hXpythons = [ 'python2.4', 'python2.5', 'python2.6', 'python2.7', 'python3.2', 'python3.3' ] pytest_slaves = [ "slave%s" % n for n in range(10) ] for python in pythons: f = BuildFactory() f.addStep(SVN(...)) f.addStep(ShellCommand(command=[ python, 'test.py' ])) c['builders'].append(BuilderConfig( name="test-%s" % python, factory=f, slavenames=pytest_slaves))r{.r|.}r}.(hUh jw.ubaubjV.eubjjq)h!jh}r~.(h]h]h]h]h]jj&ujK$jj)h]ubsh!jh}r.(h]h]h]h]r.(j&j)eh]r.(j)j%eujK'jj)j}r.j&jV.sh]r.(h)r.}r.(hXMerge Request Functionsr.h jS.jjq)h!h"h}r.(h]h]h]h]h]ujK'jj)h]r.hXMerge Request Functionsr.r.}r.(hj.h j.ubaubj[)r.}r.(hUh jS.jjq)h!j^h}r.(h]h]h]h]h]j]r.(j+XBuilds; mergingUindex-0r.Utr.aUinliner.ujK)jj)h]ubj)r.}r.(hUh jS.jjq)h!jh}r.(h]h]h]h]h]jj.ujK*jj)h]ubj)r.}r.(hXThe logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of ``True`` or ``False`` described in :ref:`Merging-Build-Requests`.h jS.jjq)j}h!jh}r.(h]h]h]h]r.j.ah]ujK+jj)j}r.j.j.sh]r.(hXThe logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of r.r.}r.(hXThe logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of h j.ubj})r.}r.(hX``True``h}r.(h]h]h]h]h]uh j.h]r.hXTruer.r.}r.(hUh j.ubah!jubhX or r.r.}r.(hX or h j.ubj})r.}r.(hX ``False``h}r.(h]h]h]h]h]uh j.h]r.hXFalser.r.}r.(hUh j.ubah!jubhX described in r.r.}r.(hX described in h j.ubj)r.}r.(hX:ref:`Merging-Build-Requests`r.h j.jjq)h!jh}r.(UreftypeXrefjjXmerging-build-requestsU refdomainXstdr.h]h]U refexplicith]h]h]jjUujK+h]r.j)r.}r.(hj.h}r.(h]h]r.(jj.Xstd-refr.eh]h]h]uh j.h]r.hXMerging-Build-Requestsr.r.}r.(hUh j.ubah!jubaubhX.r.}r.(hX.h j.ubeubj)r.}r.(hXThe callable will be invoked with three positional arguments: a :class:`Builder` object and two :class:`BuildRequest` objects. It should return true if the requests can be merged, and False otherwise. For example::h jS.jjq)h!jh}r.(h]h]h]h]h]ujK/jj)h]r.(hX@The callable will be invoked with three positional arguments: a r.r.}r.(hX@The callable will be invoked with three positional arguments: a h j.ubj)r.}r.(hX:class:`Builder`r.h j.jjq)h!jh}r.(UreftypeXclassjjXBuilderU refdomainXpyr.h]h]U refexplicith]h]h]jjUjX NjY NujK/h]r.j})r.}r.(hj.h}r.(h]h]r.(jj.Xpy-classr.eh]h]h]uh j.h]r.hXBuilderr.r.}r.(hUh j.ubah!jubaubhX object and two r.r.}r.(hX object and two h j.ubj)r.}r.(hX:class:`BuildRequest`r.h j.jjq)h!jh}r.(UreftypeXclassjjX BuildRequestU refdomainXpyr.h]h]U refexplicith]h]h]jjUjX NjY NujK/h]r.j})r.}r.(hj.h}r.(h]h]r.(jj.Xpy-classr.eh]h]h]uh j.h]r.hX BuildRequestr.r.}r.(hUh j.ubah!jubaubhX` objects. It should return true if the requests can be merged, and False otherwise. For example:r.r.}r.(hX` objects. It should return true if the requests can be merged, and False otherwise. For example:h j.ubeubj)r.}r.(hXdef mergeRequests(builder, req1, req2): "any requests with the same branch can be merged" return req1.source.branch == req2.source.branch c['mergeRequests'] = mergeRequestsh jS.jjq)h!jh}r.(jjh]h]h]h]h]ujK3jj)h]r.hXdef mergeRequests(builder, req1, req2): "any requests with the same branch can be merged" return req1.source.branch == req2.source.branch c['mergeRequests'] = mergeRequestsr.r.}r.(hUh j.ubaubj)r.}r.(hXnIn many cases, the details of the :class:`SourceStamp`\s and :class:`BuildRequest`\s are important. In this example, only :class:`BuildRequest`\s with the same "reason" are merged; thus developers forcing builds for different reasons will see distinct builds. Note the use of the :func:`canBeMergedWith` method to access the source stamp compatibility algorithm. ::h jS.jjq)h!jh}r.(h]h]h]h]h]ujK8jj)h]r.(hX"In many cases, the details of the r.r.}r.(hX"In many cases, the details of the h j.ubj)r.}r.(hX:class:`SourceStamp`r.h j.jjq)h!jh}r/(UreftypeXclassjjX SourceStampU refdomainXpyr/h]h]U refexplicith]h]h]jjUjX NjY NujK8h]r/j})r/}r/(hj.h}r/(h]h]r/(jj/Xpy-classr/eh]h]h]uh j.h]r/hX SourceStampr /r /}r /(hUh j/ubah!jubaubhXs and r /r /}r/(hX\s and h j.ubj)r/}r/(hX:class:`BuildRequest`r/h j.jjq)h!jh}r/(UreftypeXclassjjX BuildRequestU refdomainXpyr/h]h]U refexplicith]h]h]jjUjX NjY NujK8h]r/j})r/}r/(hj/h}r/(h]h]r/(jj/Xpy-classr/eh]h]h]uh j/h]r/hX BuildRequestr/r/}r/(hUh j/ubah!jubaubhX's are important. In this example, only r/r/}r /(hX(\s are important. In this example, only h j.ubj)r!/}r"/(hX:class:`BuildRequest`r#/h j.jjq)h!jh}r$/(UreftypeXclassjjX BuildRequestU refdomainXpyr%/h]h]U refexplicith]h]h]jjUjX NjY NujK8h]r&/j})r'/}r(/(hj#/h}r)/(h]h]r*/(jj%/Xpy-classr+/eh]h]h]uh j!/h]r,/hX BuildRequestr-/r./}r//(hUh j'/ubah!jubaubhXs with the same "reason" are merged; thus developers forcing builds for different reasons will see distinct builds. Note the use of the r0/r1/}r2/(hX\s with the same "reason" are merged; thus developers forcing builds for different reasons will see distinct builds. Note the use of the h j.ubj)r3/}r4/(hX:func:`canBeMergedWith`r5/h j.jjq)h!jh}r6/(UreftypeXfuncjjXcanBeMergedWithU refdomainXpyr7/h]h]U refexplicith]h]h]jjUjX NjY NujK8h]r8/j})r9/}r:/(hj5/h}r;/(h]h]r/hXcanBeMergedWithr?/r@/}rA/(hUh j9/ubah!jubaubhX; method to access the source stamp compatibility algorithm.rB/rC/}rD/(hX; method to access the source stamp compatibility algorithm.h j.ubeubj)rE/}rF/(hXdef mergeRequests(builder, req1, req2): if req1.source.canBeMergedWith(req2.source) and req1.reason == req2.reason: return True return False c['mergeRequests'] = mergeRequestsh jS.jjq)h!jh}rG/(jjh]h]h]h]h]ujK>jj)h]rH/hXdef mergeRequests(builder, req1, req2): if req1.source.canBeMergedWith(req2.source) and req1.reason == req2.reason: return True return False c['mergeRequests'] = mergeRequestsrI/rJ/}rK/(hUh jE/ubaubj)rL/}rM/(hXIf it's necessary to perform some extended operation to determine whether two requests can be merged, then the ``mergeRequests`` callable may return its result via Deferred. Note, however, that the number of invocations of the callable is proportional to the square of the request queue length, so a long-running callable may cause undesirable delays when the queue length grows. For example::h jS.jjq)h!jh}rN/(h]h]h]h]h]ujKDjj)h]rO/(hXoIf it's necessary to perform some extended operation to determine whether two requests can be merged, then the rP/rQ/}rR/(hXoIf it's necessary to perform some extended operation to determine whether two requests can be merged, then the h jL/ubj})rS/}rT/(hX``mergeRequests``h}rU/(h]h]h]h]h]uh jL/h]rV/hX mergeRequestsrW/rX/}rY/(hUh jS/ubah!jubhX  callable may return its result via Deferred. Note, however, that the number of invocations of the callable is proportional to the square of the request queue length, so a long-running callable may cause undesirable delays when the queue length grows. For example:rZ/r[/}r\/(hX  callable may return its result via Deferred. Note, however, that the number of invocations of the callable is proportional to the square of the request queue length, so a long-running callable may cause undesirable delays when the queue length grows. For example:h jL/ubeubj)r]/}r^/(hX,def mergeRequests(builder, req1, req2): d = defer.gatherResults([ getMergeInfo(req1.source.revision), getMergeInfo(req2.source.revision), ]) def process(info1, info2): return info1 == info2 d.addCallback(process) return d c['mergeRequests'] = mergeRequestsh jS.jjq)h!jh}r_/(jjh]h]h]h]h]ujKKjj)h]r`/hX,def mergeRequests(builder, req1, req2): d = defer.gatherResults([ getMergeInfo(req1.source.revision), getMergeInfo(req2.source.revision), ]) def process(info1, info2): return info1 == info2 d.addCallback(process) return d c['mergeRequests'] = mergeRequestsra/rb/}rc/(hUh j]/ubaubjQ.eubjjq)h!jh}rd/(h]h]h]h]h]jj2ujKVjj)h]ubsh!jh}re/(h]h]h]h]rf/(j2j)eh]rg/(j)j1eujKYjj)j}rh/j2jQ.sh]ri/(h)rj/}rk/(hXBuilder Priority Functionsrl/h jN.jjq)h!h"h}rm/(h]h]h]h]h]ujKYjj)h]rn/hXBuilder Priority Functionsro/rp/}rq/(hjl/h jj/ubaubj[)rr/}rs/(hUh jN.jjq)h!j^h}rt/(h]h]h]h]h]j]ru/(j+XBuilders; priorityUindex-1rv/Utrw/aj.ujK[jj)h]ubj)rx/}ry/(hUh jN.jjq)h!jh}rz/(h]h]h]h]h]jjv/ujK\jj)h]ubj)r{/}r|/(hXThe :bb:cfg:`prioritizeBuilders` configuration key specifies a function which is called with two arguments: a :class:`BuildMaster` and a list of :class:`Builder` objects. It should return a list of the same :class:`Builder` objects, in the desired order. It may also remove items from the list if builds should not be started on those builders. If necessary, this function can return its results via a Deferred (it is called with ``maybeDeferred``).h jN.jjq)j}h!jh}r}/(h]h]h]h]r~/jv/ah]ujK]jj)j}r/jv/jx/sh]r/(hXThe r/r/}r/(hXThe h j{/ubj)r/}r/(hX:bb:cfg:`prioritizeBuilders`r/h j{/jjq)h!jh}r/(UreftypeXcfgjjXprioritizeBuildersU refdomainXbbr/h]h]U refexplicith]h]h]jjUujK]h]r/j})r/}r/(hj/h}r/(h]h]r/(jj/Xbb-cfgr/eh]h]h]uh j/h]r/hXprioritizeBuildersr/r/}r/(hUh j/ubah!jubaubhXN configuration key specifies a function which is called with two arguments: a r/r/}r/(hXN configuration key specifies a function which is called with two arguments: a h j{/ubj)r/}r/(hX:class:`BuildMaster`r/h j{/jjq)h!jh}r/(UreftypeXclassjjX BuildMasterU refdomainXpyr/h]h]U refexplicith]h]h]jjUjX NjY NujK]h]r/j})r/}r/(hj/h}r/(h]h]r/(jj/Xpy-classr/eh]h]h]uh j/h]r/hX BuildMasterr/r/}r/(hUh j/ubah!jubaubhX and a list of r/r/}r/(hX and a list of h j{/ubj)r/}r/(hX:class:`Builder`r/h j{/jjq)h!jh}r/(UreftypeXclassjjXBuilderU refdomainXpyr/h]h]U refexplicith]h]h]jjUjX NjY NujK]h]r/j})r/}r/(hj/h}r/(h]h]r/(jj/Xpy-classr/eh]h]h]uh j/h]r/hXBuilderr/r/}r/(hUh j/ubah!jubaubhX/ objects. It should return a list of the same r/r/}r/(hX/ objects. It should return a list of the same h j{/ubj)r/}r/(hX:class:`Builder`r/h j{/jjq)h!jh}r/(UreftypeXclassjjXBuilderU refdomainXpyr/h]h]U refexplicith]h]h]jjUjX NjY NujK]h]r/j})r/}r/(hj/h}r/(h]h]r/(jj/Xpy-classr/eh]h]h]uh j/h]r/hXBuilderr/r/}r/(hUh j/ubah!jubaubhX objects, in the desired order. It may also remove items from the list if builds should not be started on those builders. If necessary, this function can return its results via a Deferred (it is called with r/r/}r/(hX objects, in the desired order. It may also remove items from the list if builds should not be started on those builders. If necessary, this function can return its results via a Deferred (it is called with h j{/ubj})r/}r/(hX``maybeDeferred``h}r/(h]h]h]h]h]uh j{/h]r/hX maybeDeferredr/r/}r/(hUh j/ubah!jubhX).r/r/}r/(hX).h j{/ubeubj)r/}r/(hXEA simple ``prioritizeBuilders`` implementation might look like this::h jN.jjq)h!jh}r/(h]h]h]h]h]ujKdjj)h]r/(hX A simple r/r/}r/(hX A simple h j/ubj})r/}r/(hX``prioritizeBuilders``h}r/(h]h]h]h]h]uh j/h]r/hXprioritizeBuildersr/r/}r/(hUh j/ubah!jubhX% implementation might look like this:r/r/}r/(hX% implementation might look like this:h j/ubeubj)r/}r/(hXdef prioritizeBuilders(buildmaster, builders): """Prioritize builders. 'finalRelease' builds have the highest priority, so they should be built before running tests, or creating builds.""" builderPriorities = { "finalRelease": 0, "test": 1, "build": 2, } builders.sort(key=lambda b: builderPriorities.get(b.name, 0)) return builders c['prioritizeBuilders'] = prioritizeBuildersh jN.jjq)h!jh}r/(jjh]h]h]h]h]ujKfjj)h]r/hXdef prioritizeBuilders(buildmaster, builders): """Prioritize builders. 'finalRelease' builds have the highest priority, so they should be built before running tests, or creating builds.""" builderPriorities = { "finalRelease": 0, "test": 1, "build": 2, } builders.sort(key=lambda b: builderPriorities.get(b.name, 0)) return builders c['prioritizeBuilders'] = prioritizeBuildersr/r/}r/(hUh j/ubaubj[)r/}r/(hUh jN.jjq)h!j^h}r/(h]h]h]h]h]j]r/(j+XBuilds; priorityUindex-2r/Utr/aj.ujKtjj)h]ubj)r/}r/(hUh jN.jjq)h!jh}r/(h]h]h]h]h]jj/ujKujj)h]ubjL.eubjjq)j}h!jh}r/(h]h]h]h]h]jjujKvjj)j}r/j/j/sh]ubsh!jh}r/(h]h]h]h]r/(jj/j)eh]r/(j)jeujKyjj)j}r/(jjL.j/j/uh]r/(h)r/}r/(hXBuild Priority Functionsr0h jI.jjq)h!h"h}r0(h]h]h]h]h]ujKyjj)h]r0hXBuild Priority Functionsr0r0}r0(hj0h j/ubaubj)r0}r0(hXWhen a builder has multiple pending build requests, it uses a ``nextBuild`` function to decide which build it should start first. This function is given two parameters: the :class:`Builder`, and a list of :class:`BuildRequest` objects representing pending build requests.h jI.jjq)h!jh}r0(h]h]h]h]h]ujK{jj)h]r 0(hX>When a builder has multiple pending build requests, it uses a r 0r 0}r 0(hX>When a builder has multiple pending build requests, it uses a h j0ubj})r 0}r0(hX ``nextBuild``h}r0(h]h]h]h]h]uh j0h]r0hX nextBuildr0r0}r0(hUh j 0ubah!jubhXc function to decide which build it should start first. This function is given two parameters: the r0r0}r0(hXc function to decide which build it should start first. This function is given two parameters: the h j0ubj)r0}r0(hX:class:`Builder`r0h j0jjq)h!jh}r0(UreftypeXclassjjXBuilderU refdomainXpyr0h]h]U refexplicith]h]h]jjUjX NjY NujK{h]r0j})r0}r0(hj0h}r0(h]h]r 0(jj0Xpy-classr!0eh]h]h]uh j0h]r"0hXBuilderr#0r$0}r%0(hUh j0ubah!jubaubhX, and a list of r&0r'0}r(0(hX, and a list of h j0ubj)r)0}r*0(hX:class:`BuildRequest`r+0h j0jjq)h!jh}r,0(UreftypeXclassjjX BuildRequestU refdomainXpyr-0h]h]U refexplicith]h]h]jjUjX NjY NujK{h]r.0j})r/0}r00(hj+0h}r10(h]h]r20(jj-0Xpy-classr30eh]h]h]uh j)0h]r40hX BuildRequestr50r60}r70(hUh j/0ubah!jubaubhX- objects representing pending build requests.r80r90}r:0(hX- objects representing pending build requests.h j0ubeubj)r;0}r<0(hXWA simple function to prioritize release builds over other builds might look like this::h jI.jjq)h!jh}r=0(h]h]h]h]h]ujKjj)h]r>0hXVA simple function to prioritize release builds over other builds might look like this:r?0r@0}rA0(hXVA simple function to prioritize release builds over other builds might look like this:h j;0ubaubj)rB0}rC0(hXdef nextBuild(bldr, requests): for r in requests: if r.source.branch == 'release': return r return requests[0]h jI.jjq)h!jh}rD0(jjh]h]h]h]h]ujKjj)h]rE0hXdef nextBuild(bldr, requests): for r in requests: if r.source.branch == 'release': return r return requests[0]rF0rG0}rH0(hUh jB0ubaubj)rI0}rJ0(hXhIf some non-immediate result must be calculated, the ``nextBuild`` function can also return a Deferred::h jI.jjq)h!jh}rK0(h]h]h]h]h]ujKjj)h]rL0(hX5If some non-immediate result must be calculated, the rM0rN0}rO0(hX5If some non-immediate result must be calculated, the h jI0ubj})rP0}rQ0(hX ``nextBuild``h}rR0(h]h]h]h]h]uh jI0h]rS0hX nextBuildrT0rU0}rV0(hUh jP0ubah!jubhX% function can also return a Deferred:rW0rX0}rY0(hX% function can also return a Deferred:h jI0ubeubj)rZ0}r[0(hXdef nextBuild(bldr, requests): d = get_request_priorities(requests) def pick(priorities): if requests: return sorted(zip(priorities, requests))[0][1] d.addCallback(pick) return dh jI.jjq)h!jh}r\0(jjh]h]h]h]h]ujKjj)h]r]0hXdef nextBuild(bldr, requests): d = get_request_priorities(requests) def pick(priorities): if requests: return sorted(zip(priorities, requests))[0][1] d.addCallback(pick) return dr^0r_0}r`0(hUh jZ0ubaubj)ra0}rb0(hXLThe ``nextBuild`` function is passed as parameter to :class:`BuilderConfig`.h jI.jjq)h!jh}rc0(h]h]h]h]h]ujKjj)h]rd0(hXThe re0rf0}rg0(hXThe h ja0ubj})rh0}ri0(hX ``nextBuild``h}rj0(h]h]h]h]h]uh ja0h]rk0hX nextBuildrl0rm0}rn0(hUh jh0ubah!jubhX$ function is passed as parameter to ro0rp0}rq0(hX$ function is passed as parameter to h ja0ubj)rr0}rs0(hX:class:`BuilderConfig`rt0h ja0jjq)h!jh}ru0(UreftypeXclassjjX BuilderConfigU refdomainXpyrv0h]h]U refexplicith]h]h]jjUjX NjY NujKh]rw0j})rx0}ry0(hjt0h}rz0(h]h]r{0(jjv0Xpy-classr|0eh]h]h]uh jr0h]r}0hX BuilderConfigr~0r0}r0(hUh jx0ubah!jubaubhX.r0}r0(hX.h ja0ubeubj)r0}r0(hX.. _Customizing-SVNPoller:h jI.jjq)h!jh}r0(h]h]h]h]h]jjWujKjj)h]ubeubj)j)r0}r0(hUh j)jjq)h!jh}r0(h]h]h]h]r0j)ah]r0j)aujMjj)h]r0(h)r0}r0(hXUpdating Status Stringsr0h j0jjq)h!h"h}r0(h]h]h]h]h]ujMjj)h]r0hXUpdating Status Stringsr0r0}r0(hj0h j0ubaubj)r0}r0(hXEach step can summarize its current status in a very short string. For example, a compile step might display the file being compiled. This information can be helpful users eager to see their build finish.r0h j0jjq)h!jh}r0(h]h]h]h]h]ujMjj)h]r0hXEach step can summarize its current status in a very short string. For example, a compile step might display the file being compiled. This information can be helpful users eager to see their build finish.r0r0}r0(hj0h j0ubaubj)r0}r0(hXSimilarly, a build has a set of short strings collected from its steps summarizing the overall state of the build. Useful information here might include the number of tests run, but probably not the results of a ``make clean`` step.h j0jjq)h!jh}r0(h]h]h]h]h]ujMjj)h]r0(hXSimilarly, a build has a set of short strings collected from its steps summarizing the overall state of the build. Useful information here might include the number of tests run, but probably not the results of a r0r0}r0(hXSimilarly, a build has a set of short strings collected from its steps summarizing the overall state of the build. Useful information here might include the number of tests run, but probably not the results of a h j0ubj})r0}r0(hX``make clean``h}r0(h]h]h]h]h]uh j0h]r0hX make cleanr0r0}r0(hUh j0ubah!jubhX step.r0r0}r0(hX step.h j0ubeubj)r0}r0(hXAs a step runs, Buildbot calls its :py:meth:`~buildbot.process.buildstep.BuildStep.getCurrentSummary` method as necessary to get the step's current status. "As necessary" is determined by calls to :py:meth:`buildbot.process.buildstep.BuildStep.updateSummary`. Your step should call this method every time the status summary may have changed. Buildbot will take care of rate-limiting summary updates.h j0jjq)h!jh}r0(h]h]h]h]h]ujMjj)h]r0(hX#As a step runs, Buildbot calls its r0r0}r0(hX#As a step runs, Buildbot calls its h j0ubj)r0}r0(hXB:py:meth:`~buildbot.process.buildstep.BuildStep.getCurrentSummary`r0h j0jjq)h!jh}r0(UreftypeXmethjjX6buildbot.process.buildstep.BuildStep.getCurrentSummaryU refdomainXpyr0h]h]U refexplicith]h]h]jjUjX NjY NujMh]r0j})r0}r0(hj0h}r0(h]h]r0(jj0Xpy-methr0eh]h]h]uh j0h]r0hXgetCurrentSummaryr0r0}r0(hUh j0ubah!jubaubhX` method as necessary to get the step's current status. "As necessary" is determined by calls to r0r0}r0(hX` method as necessary to get the step's current status. "As necessary" is determined by calls to h j0ubj)r0}r0(hX=:py:meth:`buildbot.process.buildstep.BuildStep.updateSummary`r0h j0jjq)h!jh}r0(UreftypeXmethjjX2buildbot.process.buildstep.BuildStep.updateSummaryU refdomainXpyr0h]h]U refexplicith]h]h]jjUjX NjY NujMh]r0j})r0}r0(hj0h}r0(h]h]r0(jj0Xpy-methr0eh]h]h]uh j0h]r0hX2buildbot.process.buildstep.BuildStep.updateSummaryr0r0}r0(hUh j0ubah!jubaubhX. Your step should call this method every time the status summary may have changed. Buildbot will take care of rate-limiting summary updates.r0r0}r0(hX. Your step should call this method every time the status summary may have changed. Buildbot will take care of rate-limiting summary updates.h j0ubeubj)r0}r0(hXWhen the step is complete, Buildbot calls its :py:meth:`~buildbot.process.buildstep.BuildStep.getResultSummary` method to get a final summary of the step along with a summary for the build.h j0jjq)h!jh}r0(h]h]h]h]h]ujMjj)h]r0(hX.When the step is complete, Buildbot calls its r0r0}r0(hX.When the step is complete, Buildbot calls its h j0ubj)r0}r0(hXA:py:meth:`~buildbot.process.buildstep.BuildStep.getResultSummary`r0h j0jjq)h!jh}r0(UreftypeXmethjjX5buildbot.process.buildstep.BuildStep.getResultSummaryU refdomainXpyr0h]h]U refexplicith]h]h]jjUjX NjY NujMh]r0j})r0}r0(hj0h}r0(h]h]r0(jj0Xpy-methr0eh]h]h]uh j0h]r0hXgetResultSummaryr0r0}r0(hUh j0ubah!jubaubhXN method to get a final summary of the step along with a summary for the build.r0r0}r0(hXN method to get a final summary of the step along with a summary for the build.h j0ubeubeubj)j)r0}r0(hUh j)jjq)h!jh}r0(h]h]h]h]r0j)ah]r0j)aujMjj)h]r0(h)r0}r0(hXReading Logfilesr0h j0jjq)h!h"h}r0(h]h]h]h]h]ujMjj)h]r0hXReading Logfilesr0r0}r0(hj0h j0ubaubj)r0}r1(hXFor the most part, Buildbot tries to avoid loading the contents of a log file into memory as a single string. For large log files on a busy master, this behavior can quickly consume a great deal of memory.r1h j0jjq)h!jh}r1(h]h]h]h]h]ujMjj)h]r1hXFor the most part, Buildbot tries to avoid loading the contents of a log file into memory as a single string. For large log files on a busy master, this behavior can quickly consume a great deal of memory.r1r1}r1(hj1h j0ubaubj)r1}r1(hXInstead, steps should implement a :class:`~buildbot.process.logobserver.LogObserver` to examine log files one chunk or line at a time.h j0jjq)h!jh}r 1(h]h]h]h]h]ujMjj)h]r 1(hX"Instead, steps should implement a r 1r 1}r 1(hX"Instead, steps should implement a h j1ubj)r1}r1(hX2:class:`~buildbot.process.logobserver.LogObserver`r1h j1jjq)h!jh}r1(UreftypeXclassjjX(buildbot.process.logobserver.LogObserverU refdomainXpyr1h]h]U refexplicith]h]h]jjUjX NjY NujMh]r1j})r1}r1(hj1h}r1(h]h]r1(jj1Xpy-classr1eh]h]h]uh j1h]r1hX LogObserverr1r1}r1(hUh j1ubah!jubaubhX2 to examine log files one chunk or line at a time.r1r1}r1(hX2 to examine log files one chunk or line at a time.h j1ubeubj)r 1}r!1(hXFor commands which only produce a small quantity of output, :class:`~buildbot.process.remotecommand.RemoteCommand` will collect the command's stdout into its :attr:`~buildbot.process.remotecommand.RemoteCommand.stdout` attribute if given the ``collectStdout=True`` constructor argument.h j0jjq)h!jh}r"1(h]h]h]h]h]ujMjj)h]r#1(hX<For commands which only produce a small quantity of output, r$1r%1}r&1(hX<For commands which only produce a small quantity of output, h j 1ubj)r'1}r(1(hX6:class:`~buildbot.process.remotecommand.RemoteCommand`r)1h j 1jjq)h!jh}r*1(UreftypeXclassjjX,buildbot.process.remotecommand.RemoteCommandU refdomainXpyr+1h]h]U refexplicith]h]h]jjUjX NjY NujMh]r,1j})r-1}r.1(hj)1h}r/1(h]h]r01(jj+1Xpy-classr11eh]h]h]uh j'1h]r21hX RemoteCommandr31r41}r51(hUh j-1ubah!jubaubhX, will collect the command's stdout into its r61r71}r81(hX, will collect the command's stdout into its h j 1ubj)r91}r:1(hX<:attr:`~buildbot.process.remotecommand.RemoteCommand.stdout`r;1h j 1jjq)h!jh}r<1(UreftypeXattrjjX3buildbot.process.remotecommand.RemoteCommand.stdoutU refdomainXpyr=1h]h]U refexplicith]h]h]jjUjX NjY NujMh]r>1j})r?1}r@1(hj;1h}rA1(h]h]rB1(jj=1Xpy-attrrC1eh]h]h]uh j91h]rD1hXstdoutrE1rF1}rG1(hUh j?1ubah!jubaubhX attribute if given the rH1rI1}rJ1(hX attribute if given the h j 1ubj})rK1}rL1(hX``collectStdout=True``h}rM1(h]h]h]h]h]uh j 1h]rN1hXcollectStdout=TruerO1rP1}rQ1(hUh jK1ubah!jubhX constructor argument.rR1rS1}rT1(hX constructor argument.h j 1ubeubj)rU1}rV1(hX.. _Adding-LogObservers:h j0jjq)h!jh}rW1(h]h]h]h]h]jjujMjj)h]ubeubj)j)j)j)jj)j)j)rX1}rY1(hX j9Kh j)rZ1}r[1(hXFor example, `Divmod.org `_ hosts a project named `Nevow` as well as one named `Quotient`. In a checked-out Nevow tree there is a directory named `formless` that contains a Python source file named :file:`webform.py`. This repository is accessible via webdav (and thus uses an `http:` scheme) through the divmod.org hostname. There are many branches in this repository, and they use a ``({BRANCHNAME})/({PROJECT})`` naming policy.h j)r\1}r]1(hUh j)r^1}r_1(hUh j)jjq)j}r`1jVj0sh!jh}ra1(h]h]h]h]rb1(jWj)eh]rc1(j)jVeujKjj)j}rd1jWj0sh]re1(h)rf1}rg1(hXCustomizing SVNPollerrh1h j^1jjq)h!h"h}ri1(h]h]h]h]h]ujKjj)h]rj1hXCustomizing SVNPollerrk1rl1}rm1(hjh1h jf1ubaubj)rn1}ro1(hX_Each source file that is tracked by a Subversion repository has a fully-qualified SVN URL in the following form: ``({REPOURL})({PROJECT-plus-BRANCH})({FILEPATH})``. When you create the :bb:chsrc:`SVNPoller`, you give it a ``svnurl`` value that includes all of the ``{REPOURL}`` and possibly some portion of the ``{PROJECT-plus-BRANCH}`` string. The :bb:chsrc:`SVNPoller` is responsible for producing Changes that contain a branch name and a ``{FILEPATH}`` (which is relative to the top of a checked-out tree). The details of how these strings are split up depend upon how your repository names its branches.h j^1jjq)h!jh}rp1(h]h]h]h]h]ujKjj)h]rq1(hXqEach source file that is tracked by a Subversion repository has a fully-qualified SVN URL in the following form: rr1rs1}rt1(hXqEach source file that is tracked by a Subversion repository has a fully-qualified SVN URL in the following form: h jn1ubj})ru1}rv1(hX2``({REPOURL})({PROJECT-plus-BRANCH})({FILEPATH})``h}rw1(h]h]h]h]h]uh jn1h]rx1hX.({REPOURL})({PROJECT-plus-BRANCH})({FILEPATH})ry1rz1}r{1(hUh ju1ubah!jubhX. When you create the r|1r}1}r~1(hX. When you create the h jn1ubj)r1}r1(hX:bb:chsrc:`SVNPoller`r1h jn1jjq)h!jh}r1(UreftypeXchsrcjjX SVNPollerU refdomainXbbr1h]h]U refexplicith]h]h]jjUujKh]r1j})r1}r1(hj1h}r1(h]h]r1(jj1Xbb-chsrcr1eh]h]h]uh j1h]r1hX SVNPollerr1r1}r1(hUh j1ubah!jubaubhX, you give it a r1r1}r1(hX, you give it a h jn1ubj})r1}r1(hX ``svnurl``h}r1(h]h]h]h]h]uh jn1h]r1hXsvnurlr1r1}r1(hUh j1ubah!jubhX value that includes all of the r1r1}r1(hX value that includes all of the h jn1ubj})r1}r1(hX ``{REPOURL}``h}r1(h]h]h]h]h]uh jn1h]r1hX {REPOURL}r1r1}r1(hUh j1ubah!jubhX" and possibly some portion of the r1r1}r1(hX" and possibly some portion of the h jn1ubj})r1}r1(hX``{PROJECT-plus-BRANCH}``h}r1(h]h]h]h]h]uh jn1h]r1hX{PROJECT-plus-BRANCH}r1r1}r1(hUh j1ubah!jubhX string. The r1r1}r1(hX string. The h jn1ubj)r1}r1(hX:bb:chsrc:`SVNPoller`r1h jn1jjq)h!jh}r1(UreftypeXchsrcjjX SVNPollerU refdomainXbbr1h]h]U refexplicith]h]h]jjUujKh]r1j})r1}r1(hj1h}r1(h]h]r1(jj1Xbb-chsrcr1eh]h]h]uh j1h]r1hX SVNPollerr1r1}r1(hUh j1ubah!jubaubhXG is responsible for producing Changes that contain a branch name and a r1r1}r1(hXG is responsible for producing Changes that contain a branch name and a h jn1ubj})r1}r1(hX``{FILEPATH}``h}r1(h]h]h]h]h]uh jn1h]r1hX {FILEPATH}r1r1}r1(hUh j1ubah!jubhX (which is relative to the top of a checked-out tree). The details of how these strings are split up depend upon how your repository names its branches.r1r1}r1(hX (which is relative to the top of a checked-out tree). The details of how these strings are split up depend upon how your repository names its branches.h jn1ubeubj)r1}r1(hUh j^1jjq)h!jh}r1(h]h]h]h]r1j)ah]r1j)aujKjj)h]r1(h)r1}r1(hX(PROJECT/BRANCHNAME/FILEPATH repositoriesr1h j1jjq)h!h"h}r1(h]h]h]h]h]ujKjj)h]r1hX(PROJECT/BRANCHNAME/FILEPATH repositoriesr1r1}r1(hj1h j1ubaubj)r1}r1(hXOne common layout is to have all the various projects that share a repository get a single top-level directory each, with ``branches``, ``tags``, and ``trunk`` subdirectories:h j1jjq)h!jh}r1(h]h]h]h]h]ujKjj)h]r1(hXzOne common layout is to have all the various projects that share a repository get a single top-level directory each, with r1r1}r1(hXzOne common layout is to have all the various projects that share a repository get a single top-level directory each, with h j1ubj})r1}r1(hX ``branches``h}r1(h]h]h]h]h]uh j1h]r1hXbranchesr1r1}r1(hUh j1ubah!jubhX, r1r1}r1(hX, h j1ubj})r1}r1(hX``tags``h}r1(h]h]h]h]h]uh j1h]r1hXtagsr1r1}r1(hUh j1ubah!jubhX, and r1r1}r1(hX, and h j1ubj})r1}r1(hX ``trunk``h}r1(h]h]h]h]h]uh j1h]r1hXtrunkr1r1}r1(hUh j1ubah!jubhX subdirectories:r1r1}r1(hX subdirectories:h j1ubeubj)r1}r1(hXjamanda/trunk /branches/3_2 /3_3 /tags/3_2_1 /3_2_2 /3_3_0h j1jjq)h!jh}r2(jjXnonejjh]h]h]h]h]ujKjj)h]r2hXjamanda/trunk /branches/3_2 /3_3 /tags/3_2_1 /3_2_2 /3_3_0r2r2}r2(hUh j1ubaubj)r2}r2(hXTo set up a :bb:chsrc:`SVNPoller` that watches the Amanda trunk (and nothing else), we would use the following, using the default ``split_file``::h j1jjq)h!jh}r2(h]h]h]h]h]ujKjj)h]r2(hX To set up a r 2r 2}r 2(hX To set up a h j2ubj)r 2}r 2(hX:bb:chsrc:`SVNPoller`r2h j2jjq)h!jh}r2(UreftypeXchsrcjjX SVNPollerU refdomainXbbr2h]h]U refexplicith]h]h]jjUujKh]r2j})r2}r2(hj2h}r2(h]h]r2(jj2Xbb-chsrcr2eh]h]h]uh j 2h]r2hX SVNPollerr2r2}r2(hUh j2ubah!jubaubhXa that watches the Amanda trunk (and nothing else), we would use the following, using the default r2r2}r2(hXa that watches the Amanda trunk (and nothing else), we would use the following, using the default h j2ubj})r2}r2(hX``split_file``h}r 2(h]h]h]h]h]uh j2h]r!2hX split_filer"2r#2}r$2(hUh j2ubah!jubhX:r%2}r&2(hX:h j2ubeubj)r'2}r(2(hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller( svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/amanda/trunk")h j1jjq)h!jh}r)2(jjh]h]h]h]h]ujKjj)h]r*2hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller( svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/amanda/trunk")r+2r,2}r-2(hUh j'2ubaubj)r.2}r/2(hXIn this case, every Change that our :bb:chsrc:`SVNPoller` produces will have its branch attribute set to ``None``, to indicate that the Change is on the trunk. No other sub-projects or branches will be tracked.h j1jjq)h!jh}r02(h]h]h]h]h]ujKjj)h]r12(hX$In this case, every Change that our r22r32}r42(hX$In this case, every Change that our h j.2ubj)r52}r62(hX:bb:chsrc:`SVNPoller`r72h j.2jjq)h!jh}r82(UreftypeXchsrcjjX SVNPollerU refdomainXbbr92h]h]U refexplicith]h]h]jjUujKh]r:2j})r;2}r<2(hj72h}r=2(h]h]r>2(jj92Xbb-chsrcr?2eh]h]h]uh j52h]r@2hX SVNPollerrA2rB2}rC2(hUh j;2ubah!jubaubhX0 produces will have its branch attribute set to rD2rE2}rF2(hX0 produces will have its branch attribute set to h j.2ubj})rG2}rH2(hX``None``h}rI2(h]h]h]h]h]uh j.2h]rJ2hXNonerK2rL2}rM2(hUh jG2ubah!jubhXb, to indicate that the Change is on the trunk. No other sub-projects or branches will be tracked.rN2rO2}rP2(hXb, to indicate that the Change is on the trunk. No other sub-projects or branches will be tracked.h j.2ubeubj)rQ2}rR2(hXIf we want our ChangeSource to follow multiple branches, we have to do two things. First we have to change our ``svnurl=`` argument to watch more than just ``amanda/trunk``. We will set it to ``amanda`` so that we'll see both the trunk and all the branches. Second, we have to tell :bb:chsrc:`SVNPoller` how to split the ``({PROJECT-plus-BRANCH})({FILEPATH})`` strings it gets from the repository out into ``({BRANCH})`` and ``({FILEPATH})```.h j1jjq)h!jh}rS2(h]h]h]h]h]ujKjj)h]rT2(hXoIf we want our ChangeSource to follow multiple branches, we have to do two things. First we have to change our rU2rV2}rW2(hXoIf we want our ChangeSource to follow multiple branches, we have to do two things. First we have to change our h jQ2ubj})rX2}rY2(hX ``svnurl=``h}rZ2(h]h]h]h]h]uh jQ2h]r[2hXsvnurl=r\2r]2}r^2(hUh jX2ubah!jubhX" argument to watch more than just r_2r`2}ra2(hX" argument to watch more than just h jQ2ubj})rb2}rc2(hX``amanda/trunk``h}rd2(h]h]h]h]h]uh jQ2h]re2hX amanda/trunkrf2rg2}rh2(hUh jb2ubah!jubhX. We will set it to ri2rj2}rk2(hX. We will set it to h jQ2ubj})rl2}rm2(hX ``amanda``h}rn2(h]h]h]h]h]uh jQ2h]ro2hXamandarp2rq2}rr2(hUh jl2ubah!jubhXP so that we'll see both the trunk and all the branches. Second, we have to tell rs2rt2}ru2(hXP so that we'll see both the trunk and all the branches. Second, we have to tell h jQ2ubj)rv2}rw2(hX:bb:chsrc:`SVNPoller`rx2h jQ2jjq)h!jh}ry2(UreftypeXchsrcjjX SVNPollerU refdomainXbbrz2h]h]U refexplicith]h]h]jjUujKh]r{2j})r|2}r}2(hjx2h}r~2(h]h]r2(jjz2Xbb-chsrcr2eh]h]h]uh jv2h]r2hX SVNPollerr2r2}r2(hUh j|2ubah!jubaubhX how to split the r2r2}r2(hX how to split the h jQ2ubj})r2}r2(hX'``({PROJECT-plus-BRANCH})({FILEPATH})``h}r2(h]h]h]h]h]uh jQ2h]r2hX#({PROJECT-plus-BRANCH})({FILEPATH})r2r2}r2(hUh j2ubah!jubhX. strings it gets from the repository out into r2r2}r2(hX. strings it gets from the repository out into h jQ2ubj})r2}r2(hX``({BRANCH})``h}r2(h]h]h]h]h]uh jQ2h]r2hX ({BRANCH})r2r2}r2(hUh j2ubah!jubhX and r2r2}r2(hX and h jQ2ubj})r2}r2(hX``({FILEPATH})```h}r2(h]h]h]h]h]uh jQ2h]r2hX ({FILEPATH})`r2r2}r2(hUh j2ubah!jubhX.r2}r2(hX.h jQ2ubeubj)r2}r2(hXWe do the latter by providing a ``split_file`` function. This function is responsible for splitting something like ``branches/3_3/common-src/amanda.h`` into ``branch='branches/3_3'`` and ``filepath='common-src/amanda.h'``. The function is always given a string that names a file relative to the subdirectory pointed to by the :bb:chsrc:`SVNPoller`\'s ``svnurl=`` argument. It is expected to return a dictionary with at least the ``path`` key. The splitter may optionally set ``branch``, ``project`` and ``repository``. For backwards compatibility it may return a tuple of ``(branchname, path)``. It may also return ``None`` to indicate that the file is of no interest.h j1jjq)h!jh}r2(h]h]h]h]h]ujKjj)h]r2(hX We do the latter by providing a r2r2}r2(hX We do the latter by providing a h j2ubj})r2}r2(hX``split_file``h}r2(h]h]h]h]h]uh j2h]r2hX split_filer2r2}r2(hUh j2ubah!jubhXE function. This function is responsible for splitting something like r2r2}r2(hXE function. This function is responsible for splitting something like h j2ubj})r2}r2(hX$``branches/3_3/common-src/amanda.h``h}r2(h]h]h]h]h]uh j2h]r2hX branches/3_3/common-src/amanda.hr2r2}r2(hUh j2ubah!jubhX into r2r2}r2(hX into h j2ubj})r2}r2(hX``branch='branches/3_3'``h}r2(h]h]h]h]h]uh j2h]r2hXbranch='branches/3_3'r2r2}r2(hUh j2ubah!jubhX and r2r2}r2(hX and h j2ubj})r2}r2(hX"``filepath='common-src/amanda.h'``h}r2(h]h]h]h]h]uh j2h]r2hXfilepath='common-src/amanda.h'r2r2}r2(hUh j2ubah!jubhXi. The function is always given a string that names a file relative to the subdirectory pointed to by the r2r2}r2(hXi. The function is always given a string that names a file relative to the subdirectory pointed to by the h j2ubj)r2}r2(hX:bb:chsrc:`SVNPoller`r2h j2jjq)h!jh}r2(UreftypeXchsrcjjX SVNPollerU refdomainXbbr2h]h]U refexplicith]h]h]jjUujKh]r2j})r2}r2(hj2h}r2(h]h]r2(jj2Xbb-chsrcr2eh]h]h]uh j2h]r2hX SVNPollerr2r2}r2(hUh j2ubah!jubaubhX's r2r2}r2(hX\'s h j2ubj})r2}r2(hX ``svnurl=``h}r2(h]h]h]h]h]uh j2h]r2hXsvnurl=r2r2}r2(hUh j2ubah!jubhXC argument. It is expected to return a dictionary with at least the r2r2}r2(hXC argument. It is expected to return a dictionary with at least the h j2ubj})r2}r2(hX``path``h}r2(h]h]h]h]h]uh j2h]r2hXpathr2r2}r2(hUh j2ubah!jubhX& key. The splitter may optionally set r2r2}r2(hX& key. The splitter may optionally set h j2ubj})r2}r2(hX ``branch``h}r2(h]h]h]h]h]uh j2h]r2hXbranchr2r2}r3(hUh j2ubah!jubhX, r3r3}r3(hX, h j2ubj})r3}r3(hX ``project``h}r3(h]h]h]h]h]uh j2h]r3hXprojectr3r 3}r 3(hUh j3ubah!jubhX and r 3r 3}r 3(hX and h j2ubj})r3}r3(hX``repository``h}r3(h]h]h]h]h]uh j2h]r3hX repositoryr3r3}r3(hUh j3ubah!jubhX7. For backwards compatibility it may return a tuple of r3r3}r3(hX7. For backwards compatibility it may return a tuple of h j2ubj})r3}r3(hX``(branchname, path)``h}r3(h]h]h]h]h]uh j2h]r3hX(branchname, path)r3r3}r3(hUh j3ubah!jubhX. It may also return r3r 3}r!3(hX. It may also return h j2ubj})r"3}r#3(hX``None``h}r$3(h]h]h]h]h]uh j2h]r%3hXNoner&3r'3}r(3(hUh j"3ubah!jubhX- to indicate that the file is of no interest.r)3r*3}r+3(hX- to indicate that the file is of no interest.h j2ubeubj)r,3}r-3(hX2the function should return ``branches/3_3`` rather than just ``3_3`` because the SVN checkout step, will append the branch name to the ``baseURL``, which requires that we keep the ``branches`` component in there. Other VC schemes use a different approach towards branches and may not require this artifact.h j1jjq)h!jh}r.3(h]h]h]h]h]ujNjj)h]r/3j)r03}r13(hX2the function should return ``branches/3_3`` rather than just ``3_3`` because the SVN checkout step, will append the branch name to the ``baseURL``, which requires that we keep the ``branches`` component in there. Other VC schemes use a different approach towards branches and may not require this artifact.h j,3jjq)h!jh}r23(h]h]h]h]h]ujKh]r33(hXthe function should return r43r53}r63(hXthe function should return h j03ubj})r73}r83(hX``branches/3_3``h}r93(h]h]h]h]h]uh j03h]r:3hX branches/3_3r;3r<3}r=3(hUh j73ubah!jubhX rather than just r>3r?3}r@3(hX rather than just h j03ubj})rA3}rB3(hX``3_3``h}rC3(h]h]h]h]h]uh j03h]rD3hX3_3rE3rF3}rG3(hUh jA3ubah!jubhXC because the SVN checkout step, will append the branch name to the rH3rI3}rJ3(hXC because the SVN checkout step, will append the branch name to the h j03ubj})rK3}rL3(hX ``baseURL``h}rM3(h]h]h]h]h]uh j03h]rN3hXbaseURLrO3rP3}rQ3(hUh jK3ubah!jubhX", which requires that we keep the rR3rS3}rT3(hX", which requires that we keep the h j03ubj})rU3}rV3(hX ``branches``h}rW3(h]h]h]h]h]uh j03h]rX3hXbranchesrY3rZ3}r[3(hUh jU3ubah!jubhXr component in there. Other VC schemes use a different approach towards branches and may not require this artifact.r\3r]3}r^3(hXr component in there. Other VC schemes use a different approach towards branches and may not require this artifact.h j03ubeubaubj)r_3}r`3(hXuIf your repository uses this same ``{PROJECT}/{BRANCH}/{FILEPATH}`` naming scheme, the following function will work::h j1jjq)h!jh}ra3(h]h]h]h]h]ujKjj)h]rb3(hX"If your repository uses this same rc3rd3}re3(hX"If your repository uses this same h j_3ubj})rf3}rg3(hX!``{PROJECT}/{BRANCH}/{FILEPATH}``h}rh3(h]h]h]h]h]uh j_3h]ri3hX{PROJECT}/{BRANCH}/{FILEPATH}rj3rk3}rl3(hUh jf3ubah!jubhX1 naming scheme, the following function will work:rm3rn3}ro3(hX1 naming scheme, the following function will work:h j_3ubeubj)rp3}rq3(hX9def split_file_branches(path): pieces = path.split('/') if len(pieces) > 1 and pieces[0] == 'trunk': return (None, '/'.join(pieces[1:])) elif len(pieces) > 2 and pieces[0] == 'branches': return ('/'.join(pieces[0:2]), '/'.join(pieces[2:])) else: return Noneh j1jjq)h!jh}rr3(jjh]h]h]h]h]ujKjj)h]rs3hX9def split_file_branches(path): pieces = path.split('/') if len(pieces) > 1 and pieces[0] == 'trunk': return (None, '/'.join(pieces[1:])) elif len(pieces) > 2 and pieces[0] == 'branches': return ('/'.join(pieces[0:2]), '/'.join(pieces[2:])) else: return Nonert3ru3}rv3(hUh jp3ubaubj)rw3}rx3(hXIn fact, this is the definition of the provided ``split_file_branches`` function. So to have our Twisted-watching :bb:chsrc:`SVNPoller` follow multiple branches, we would use this::h j1jjq)h!jh}ry3(h]h]h]h]h]ujKjj)h]rz3(hX0In fact, this is the definition of the provided r{3r|3}r}3(hX0In fact, this is the definition of the provided h jw3ubj})r~3}r3(hX``split_file_branches``h}r3(h]h]h]h]h]uh jw3h]r3hXsplit_file_branchesr3r3}r3(hUh j~3ubah!jubhX, function. So to have our Twisted-watching r3r3}r3(hX, function. So to have our Twisted-watching h jw3ubj)r3}r3(hX:bb:chsrc:`SVNPoller`r3h jw3jjq)h!jh}r3(UreftypeXchsrcjjX SVNPollerU refdomainXbbr3h]h]U refexplicith]h]h]jjUujKh]r3j})r3}r3(hj3h}r3(h]h]r3(jj3Xbb-chsrcr3eh]h]h]uh j3h]r3hX SVNPollerr3r3}r3(hUh j3ubah!jubaubhX- follow multiple branches, we would use this:r3r3}r3(hX- follow multiple branches, we would use this:h jw3ubeubj)r3}r3(hXfrom buildbot.changes.svnpoller import SVNPoller, split_file_branches c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted", split_file=split_file_branches)h j1jjq)h!jh}r3(jjh]h]h]h]h]ujKjj)h]r3hXfrom buildbot.changes.svnpoller import SVNPoller, split_file_branches c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted", split_file=split_file_branches)r3r3}r3(hUh j3ubaubj)r3}r3(hXChanges for all sorts of branches (with names like ``"branches/1.5.x"``, and ``None`` to indicate the trunk) will be delivered to the Schedulers. Each Scheduler is then free to use or ignore each branch as it sees fit.h j1jjq)h!jh}r3(h]h]h]h]h]ujKjj)h]r3(hX3Changes for all sorts of branches (with names like r3r3}r3(hX3Changes for all sorts of branches (with names like h j3ubj})r3}r3(hX``"branches/1.5.x"``h}r3(h]h]h]h]h]uh j3h]r3hX"branches/1.5.x"r3r3}r3(hUh j3ubah!jubhX, and r3r3}r3(hX, and h j3ubj})r3}r3(hX``None``h}r3(h]h]h]h]h]uh j3h]r3hXNoner3r3}r3(hUh j3ubah!jubhX to indicate the trunk) will be delivered to the Schedulers. Each Scheduler is then free to use or ignore each branch as it sees fit.r3r3}r3(hX to indicate the trunk) will be delivered to the Schedulers. Each Scheduler is then free to use or ignore each branch as it sees fit.h j3ubeubj)r3}r3(hXIf you have multiple projects in the same repository your split function can attach a project name to the Change to help the Scheduler filter out unwanted changes::h j1jjq)h!jh}r3(h]h]h]h]h]ujKjj)h]r3hXIf you have multiple projects in the same repository your split function can attach a project name to the Change to help the Scheduler filter out unwanted changes:r3r3}r3(hXIf you have multiple projects in the same repository your split function can attach a project name to the Change to help the Scheduler filter out unwanted changes:h j3ubaubj)r3}r3(hXefrom buildbot.changes.svnpoller import split_file_branches def split_file_projects_branches(path): if not "/" in path: return None project, path = path.split("/", 1) f = split_file_branches(path) if f: info = dict(project=project, path=f[1]) if f[0]: info['branch'] = f[0] return info return fh j1jjq)h!jh}r3(jjh]h]h]h]h]ujKjj)h]r3hXefrom buildbot.changes.svnpoller import split_file_branches def split_file_projects_branches(path): if not "/" in path: return None project, path = path.split("/", 1) f = split_file_branches(path) if f: info = dict(project=project, path=f[1]) if f[0]: info['branch'] = f[0] return info return fr3r3}r3(hUh j3ubaubj)r3}r3(hXAAgain, this is provided by default. To use it you would do this::h j1jjq)h!jh}r3(h]h]h]h]h]ujMjj)h]r3hX@Again, this is provided by default. To use it you would do this:r3r3}r3(hX@Again, this is provided by default. To use it you would do this:h j3ubaubj)r3}r3(hXfrom buildbot.changes.svnpoller import SVNPoller, split_file_projects_branches c['change_source'] = SVNPoller( svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/", split_file=split_file_projects_branches)h j1jjq)h!jh}r3(jjh]h]h]h]h]ujMjj)h]r3hXfrom buildbot.changes.svnpoller import SVNPoller, split_file_projects_branches c['change_source'] = SVNPoller( svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/", split_file=split_file_projects_branches)r3r3}r3(hUh j3ubaubj)r3}r3(hXNote here that we are monitoring at the root of the repository, and that within that repository is a ``amanda`` subdirectory which in turn has ``trunk`` and ``branches``. It is that ``amanda`` subdirectory whose name becomes the ``project`` field of the Change.h j1jjq)h!jh}r3(h]h]h]h]h]ujM jj)h]r3(hXeNote here that we are monitoring at the root of the repository, and that within that repository is a r3r3}r3(hXeNote here that we are monitoring at the root of the repository, and that within that repository is a h j3ubj})r3}r3(hX ``amanda``h}r3(h]h]h]h]h]uh j3h]r3hXamandar3r3}r3(hUh j3ubah!jubhX subdirectory which in turn has r3r3}r3(hX subdirectory which in turn has h j3ubj})r3}r3(hX ``trunk``h}r3(h]h]h]h]h]uh j3h]r3hXtrunkr3r3}r3(hUh j3ubah!jubhX and r3r3}r3(hX and h j3ubj})r3}r3(hX ``branches``h}r3(h]h]h]h]h]uh j3h]r3hXbranchesr3r3}r3(hUh j3ubah!jubhX . It is that r3r3}r3(hX . It is that h j3ubj})r3}r3(hX ``amanda``h}r3(h]h]h]h]h]uh j3h]r4hXamandar4r4}r4(hUh j3ubah!jubhX% subdirectory whose name becomes the r4r4}r4(hX% subdirectory whose name becomes the h j3ubj})r4}r4(hX ``project``h}r 4(h]h]h]h]h]uh j3h]r 4hXprojectr 4r 4}r 4(hUh j4ubah!jubhX field of the Change.r4r4}r4(hX field of the Change.h j3ubeubeubj\1eubjjq)h!jh}r4(h]h]h]h]r4j)ah]r4j)aujMjj)h]r4(h)r4}r4(hX(BRANCHNAME/PROJECT/FILEPATH repositoriesr4h j\1jjq)h!h"h}r4(h]h]h]h]h]ujMjj)h]r4hX(BRANCHNAME/PROJECT/FILEPATH repositoriesr4r4}r4(hj4h j4ubaubj)r4}r4(hXAnother common way to organize a Subversion repository is to put the branch name at the top, and the projects underneath. This is especially frequent when there are a number of related sub-projects that all get released in a group.r4h j\1jjq)h!jh}r 4(h]h]h]h]h]ujMjj)h]r!4hXAnother common way to organize a Subversion repository is to put the branch name at the top, and the projects underneath. This is especially frequent when there are a number of related sub-projects that all get released in a group.r"4r#4}r$4(hj4h j4ubaubjZ1j)r%4}r&4(hXThe fully-qualified SVN URL for the trunk version of :file:`webform.py` is ``http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py``. The 1.5.x branch version of this file would have a URL of ``http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py``. The whole Nevow trunk would be checked out with ``http://divmod.org/svn/Divmod/trunk/Nevow``, while the Quotient trunk would be checked out using ``http://divmod.org/svn/Divmod/trunk/Quotient``.h j\1jjq)h!jh}r'4(h]h]h]h]h]ujMjj)h]r(4(hX5The fully-qualified SVN URL for the trunk version of r)4r*4}r+4(hX5The fully-qualified SVN URL for the trunk version of h j%4ubj})r,4}r-4(hUh}r.4(h]h]h]h]r/4Xfiler04aUrolej04h]uh j%4h]r14hX webform.pyr24r34}r44(hX webform.pyh j,4ubah!jubhX is r54r64}r74(hX is h j%4ubj})r84}r94(hX@``http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py``h}r:4(h]h]h]h]h]uh j%4h]r;4hX<http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.pyr<4r=4}r>4(hUh j84ubah!jubhX<. The 1.5.x branch version of this file would have a URL of r?4r@4}rA4(hX<. The 1.5.x branch version of this file would have a URL of h j%4ubj})rB4}rC4(hXI``http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py``h}rD4(h]h]h]h]h]uh j%4h]rE4hXEhttp://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.pyrF4rG4}rH4(hUh jB4ubah!jubhX2. The whole Nevow trunk would be checked out with rI4rJ4}rK4(hX2. The whole Nevow trunk would be checked out with h j%4ubj})rL4}rM4(hX,``http://divmod.org/svn/Divmod/trunk/Nevow``h}rN4(h]h]h]h]h]uh j%4h]rO4hX(http://divmod.org/svn/Divmod/trunk/NevowrP4rQ4}rR4(hUh jL4ubah!jubhX6, while the Quotient trunk would be checked out using rS4rT4}rU4(hX6, while the Quotient trunk would be checked out using h j%4ubj})rV4}rW4(hX/``http://divmod.org/svn/Divmod/trunk/Quotient``h}rX4(h]h]h]h]h]uh j%4h]rY4hX+http://divmod.org/svn/Divmod/trunk/QuotientrZ4r[4}r\4(hUh jV4ubah!jubhX.r]4}r^4(hX.h j%4ubeubj)r_4}r`4(hXNow suppose we want to have an :bb:chsrc:`SVNPoller` that only cares about the Nevow trunk. This case looks just like the ``{PROJECT}/{BRANCH}`` layout described earlier::h j\1jjq)h!jh}ra4(h]h]h]h]h]ujM&jj)h]rb4(hXNow suppose we want to have an rc4rd4}re4(hXNow suppose we want to have an h j_4ubj)rf4}rg4(hX:bb:chsrc:`SVNPoller`rh4h j_4jjq)h!jh}ri4(UreftypeXchsrcjjX SVNPollerU refdomainXbbrj4h]h]U refexplicith]h]h]jjUujM&h]rk4j})rl4}rm4(hjh4h}rn4(h]h]ro4(jjj4Xbb-chsrcrp4eh]h]h]uh jf4h]rq4hX SVNPollerrr4rs4}rt4(hUh jl4ubah!jubaubhXF that only cares about the Nevow trunk. This case looks just like the ru4rv4}rw4(hXF that only cares about the Nevow trunk. This case looks just like the h j_4ubj})rx4}ry4(hX``{PROJECT}/{BRANCH}``h}rz4(h]h]h]h]h]uh j_4h]r{4hX{PROJECT}/{BRANCH}r|4r}4}r~4(hUh jx4ubah!jubhX layout described earlier:r4r4}r4(hX layout described earlier:h j_4ubeubj)r4}r4(hX{from buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")h j\1jjq)h!jh}r4(jjh]h]h]h]h]ujM*jj)h]r4hX{from buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")r4r4}r4(hUh j4ubaubj)r4}r4(hXBut what happens when we want to track multiple Nevow branches? We have to point our ``svnurl=`` high enough to see all those branches, but we also don't want to include Quotient changes (since we're only building Nevow). To accomplish this, we must rely upon the ``split_file`` function to help us tell the difference between files that belong to Nevow and those that belong to Quotient, as well as figuring out which branch each one is on. ::h j\1jjq)h!jh}r4(h]h]h]h]h]ujM-jj)h]r4(hXUBut what happens when we want to track multiple Nevow branches? We have to point our r4r4}r4(hXUBut what happens when we want to track multiple Nevow branches? We have to point our h j4ubj})r4}r4(hX ``svnurl=``h}r4(h]h]h]h]h]uh j4h]r4hXsvnurl=r4r4}r4(hUh j4ubah!jubhX high enough to see all those branches, but we also don't want to include Quotient changes (since we're only building Nevow). To accomplish this, we must rely upon the r4r4}r4(hX high enough to see all those branches, but we also don't want to include Quotient changes (since we're only building Nevow). To accomplish this, we must rely upon the h j4ubj})r4}r4(hX``split_file``h}r4(h]h]h]h]h]uh j4h]r4hX split_filer4r4}r4(hUh j4ubah!jubhX function to help us tell the difference between files that belong to Nevow and those that belong to Quotient, as well as figuring out which branch each one is on.r4r4}r4(hX function to help us tell the difference between files that belong to Nevow and those that belong to Quotient, as well as figuring out which branch each one is on.h j4ubeubj)r4}r4(hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod", split_file=my_file_splitter)h j\1jjq)h!jh}r4(jjh]h]h]h]h]ujM5jj)h]r4hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod", split_file=my_file_splitter)r4r4}r4(hUh j4ubaubj)r4}r4(hXYThe ``my_file_splitter`` function will be called with repository-relative pathnames like:h j\1jjq)h!jh}r4(h]h]h]h]h]ujM9jj)h]r4(hXThe r4r4}r4(hXThe h j4ubj})r4}r4(hX``my_file_splitter``h}r4(h]h]h]h]h]uh j4h]r4hXmy_file_splitterr4r4}r4(hUh j4ubah!jubhXA function will be called with repository-relative pathnames like:r4r4}r4(hXA function will be called with repository-relative pathnames like:h j4ubeubj)r4}r4(hUh j\1jjq)h!jh}r4(h]h]h]h]h]ujNjj)h]r4(j)r4}r4(hX:file:`trunk/Nevow/formless/webform.py` This is a Nevow file, on the trunk. We want the Change that includes this to see a filename of :file:`formless/webform.py`, and a branch of ``None`` h j4jjq)h!jh}r4(h]h]h]h]h]ujM?h]r4(j)r4}r4(hX':file:`trunk/Nevow/formless/webform.py`h j4jjq)h!jh}r4(h]h]h]h]h]ujM?h]r4j})r4}r4(hUh}r4(h]h]h]h]r4Xfiler4aUrolej4h]uh j4h]r4hXtrunk/Nevow/formless/webform.pyr4r4}r4(hXtrunk/Nevow/formless/webform.pyh j4ubah!jubaubj)r4}r4(hUh}r4(h]h]h]h]h]uh j4h]r4j)r4}r4(hXThis is a Nevow file, on the trunk. We want the Change that includes this to see a filename of :file:`formless/webform.py`, and a branch of ``None``h j4jjq)h!jh}r4(h]h]h]h]h]ujM=h]r4(hX_This is a Nevow file, on the trunk. We want the Change that includes this to see a filename of r4r4}r4(hX_This is a Nevow file, on the trunk. We want the Change that includes this to see a filename of h j4ubj})r4}r4(hUh}r4(h]h]h]h]r4Xfiler4aUrolej4h]uh j4h]r4hXformless/webform.pyr4r4}r4(hXformless/webform.pyh j4ubah!jubhX, and a branch of r4r4}r4(hX, and a branch of h j4ubj})r4}r4(hX``None``h}r4(h]h]h]h]h]uh j4h]r4hXNoner4r4}r4(hUh j4ubah!jubeubah!jubeubj)r4}r4(hX:file:`branches/1.5.x/Nevow/formless/webform.py` This is a Nevow file, on a branch. We want to get ``branch='branches/1.5.x'`` and ``filename='formless/webform.py'``. h j4jjq)h!jh}r4(h]h]h]h]h]ujMCjj)h]r4(j)r4}r4(hX0:file:`branches/1.5.x/Nevow/formless/webform.py`h j4jjq)h!jh}r4(h]h]h]h]h]ujMCh]r4j})r4}r4(hUh}r4(h]h]h]h]r4Xfiler4aUrolej4h]uh j4h]r4hX(branches/1.5.x/Nevow/formless/webform.pyr4r4}r4(hX(branches/1.5.x/Nevow/formless/webform.pyh j4ubah!jubaubj)r5}r5(hUh}r5(h]h]h]h]h]uh j4h]r5j)r5}r5(hXuThis is a Nevow file, on a branch. We want to get ``branch='branches/1.5.x'`` and ``filename='formless/webform.py'``.h j5jjq)h!jh}r5(h]h]h]h]h]ujMBh]r5(hX2This is a Nevow file, on a branch. We want to get r5r 5}r 5(hX2This is a Nevow file, on a branch. We want to get h j5ubj})r 5}r 5(hX``branch='branches/1.5.x'``h}r 5(h]h]h]h]h]uh j5h]r5hXbranch='branches/1.5.x'r5r5}r5(hUh j 5ubah!jubhX and r5r5}r5(hX and h j5ubj})r5}r5(hX"``filename='formless/webform.py'``h}r5(h]h]h]h]h]uh j5h]r5hXfilename='formless/webform.py'r5r5}r5(hUh j5ubah!jubhX.r5}r5(hX.h j5ubeubah!jubeubj)r5}r5(hX:file:`trunk/Quotient/setup.py` This is a Quotient file, so we want to ignore it by having :meth:`my_file_splitter` return ``None``. h j4jjq)h!jh}r 5(h]h]h]h]h]ujMGjj)h]r!5(j)r"5}r#5(hX:file:`trunk/Quotient/setup.py`h j5jjq)h!jh}r$5(h]h]h]h]h]ujMGh]r%5j})r&5}r'5(hUh}r(5(h]h]h]h]r)5Xfiler*5aUrolej*5h]uh j"5h]r+5hXtrunk/Quotient/setup.pyr,5r-5}r.5(hXtrunk/Quotient/setup.pyh j&5ubah!jubaubj)r/5}r05(hUh}r15(h]h]h]h]h]uh j5h]r25j)r35}r45(hXdThis is a Quotient file, so we want to ignore it by having :meth:`my_file_splitter` return ``None``.h j/5jjq)h!jh}r55(h]h]h]h]h]ujMFh]r65(hX;This is a Quotient file, so we want to ignore it by having r75r85}r95(hX;This is a Quotient file, so we want to ignore it by having h j35ubj)r:5}r;5(hX:meth:`my_file_splitter`r<5h j35jjq)h!jh}r=5(UreftypeXmethjjXmy_file_splitterU refdomainXpyr>5h]h]U refexplicith]h]h]jjUjX NjY NujMFh]r?5j})r@5}rA5(hj<5h}rB5(h]h]rC5(jj>5Xpy-methrD5eh]h]h]uh j:5h]rE5hXmy_file_splitterrF5rG5}rH5(hUh j@5ubah!jubaubhX return rI5rJ5}rK5(hX return h j35ubj})rL5}rM5(hX``None``h}rN5(h]h]h]h]h]uh j35h]rO5hXNonerP5rQ5}rR5(hUh jL5ubah!jubhX.rS5}rT5(hX.h j35ubeubah!jubeubj)rU5}rV5(hX`:file:`branches/1.5.x/Quotient/setup.py` This is also a Quotient file, which should be ignored. h j4jjq)h!jh}rW5(h]h]h]h]h]ujMJjj)h]rX5(j)rY5}rZ5(hX(:file:`branches/1.5.x/Quotient/setup.py`h jU5jjq)h!jh}r[5(h]h]h]h]h]ujMJh]r\5j})r]5}r^5(hUh}r_5(h]h]h]h]r`5Xfilera5aUroleja5h]uh jY5h]rb5hX branches/1.5.x/Quotient/setup.pyrc5rd5}re5(hX branches/1.5.x/Quotient/setup.pyh j]5ubah!jubaubj)rf5}rg5(hUh}rh5(h]h]h]h]h]uh jU5h]ri5j)rj5}rk5(hX6This is also a Quotient file, which should be ignored.rl5h jf5jjq)h!jh}rm5(h]h]h]h]h]ujMJh]rn5hX6This is also a Quotient file, which should be ignored.ro5rp5}rq5(hjl5h jj5ubaubah!jubeubeubj)rr5}rs5(hXGThe following definition for :meth:`my_file_splitter` will do the job::h j\1jjq)h!jh}rt5(h]h]h]h]h]ujMLjj)h]ru5(hXThe following definition for rv5rw5}rx5(hXThe following definition for h jr5ubj)ry5}rz5(hX:meth:`my_file_splitter`r{5h jr5jjq)h!jh}r|5(UreftypeXmethjjXmy_file_splitterU refdomainXpyr}5h]h]U refexplicith]h]h]jjUjX NjY NujMLh]r~5j})r5}r5(hj{5h}r5(h]h]r5(jj}5Xpy-methr5eh]h]h]uh jy5h]r5hXmy_file_splitterr5r5}r5(hUh j5ubah!jubaubhX will do the job:r5r5}r5(hX will do the job:h jr5ubeubj)r5}r5(hXdef my_file_splitter(path): pieces = path.split('/') if pieces[0] == 'trunk': branch = None pieces.pop(0) # remove 'trunk' elif pieces[0] == 'branches': pieces.pop(0) # remove 'branches' # grab branch name branch = 'branches/' + pieces.pop(0) else: return None # something weird projectname = pieces.pop(0) if projectname != 'Nevow': return None # wrong project return dict(branch=branch, path='/'.join(pieces))h j\1jjq)h!jh}r5(jjh]h]h]h]h]ujMNjj)h]r5hXdef my_file_splitter(path): pieces = path.split('/') if pieces[0] == 'trunk': branch = None pieces.pop(0) # remove 'trunk' elif pieces[0] == 'branches': pieces.pop(0) # remove 'branches' # grab branch name branch = 'branches/' + pieces.pop(0) else: return None # something weird projectname = pieces.pop(0) if projectname != 'Nevow': return None # wrong project return dict(branch=branch, path='/'.join(pieces))r5r5}r5(hUh j5ubaubj)r5}r5(hXqIf you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply::h j\1jjq)h!jh}r5(h]h]h]h]h]ujM^jj)h]r5hXpIf you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply:r5r5}r5(hXpIf you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply:h j5ubaubj)r5}r5(hXFreturn dict(project=projectname, branch=branch, path='/'.join(pieces))h j\1jjq)h!jh}r5(jjh]h]h]h]h]ujMajj)h]r5hXFreturn dict(project=projectname, branch=branch, path='/'.join(pieces))r5r5}r5(hUh j5ubaubj)r5}r5(hX.. _Writing-Change-Sources:h j\1jjq)h!jh}r5(h]h]h]h]h]jjUujMdjj)h]ubeubjjq)h!jh}r5(h]h]h]h]h]ujMjj)h]r5(hX For example, r5r5}r5(hX For example, h jZ1ubj,)r5}r5(hX!`Divmod.org `_h}r5(UnameX Divmod.orgUrefurir5Xhttp://Divmod.orgr5h]h]h]h]h]uh jZ1h]r5hX Divmod.orgr5r5}r5(hUh j5ubah!j,ubjX1hX hosts a project named r5r5}r5(hX hosts a project named h jZ1ubj)r5}r5(hX`Nevow`h}r5(h]h]h]h]h]uh jZ1h]r5hXNevowr5r5}r5(hUh j5ubah!jubhX as well as one named r5r5}r5(hX as well as one named h jZ1ubj)r5}r5(hX `Quotient`h}r5(h]h]h]h]h]uh jZ1h]r5hXQuotientr5r5}r5(hUh j5ubah!jubhX9. In a checked-out Nevow tree there is a directory named r5r5}r5(hX9. In a checked-out Nevow tree there is a directory named h jZ1ubj)r5}r5(hX `formless`h}r5(h]h]h]h]h]uh jZ1h]r5hXformlessr5r5}r5(hUh j5ubah!jubhX* that contains a Python source file named r5r5}r5(hX* that contains a Python source file named h jZ1ubj})r5}r5(hUh}r5(h]h]h]h]r5Xfiler5aUrolej5h]uh jZ1h]r5hX webform.pyr5r5}r5(hX webform.pyh j5ubah!jubhX=. This repository is accessible via webdav (and thus uses an r5r5}r5(hX=. This repository is accessible via webdav (and thus uses an h jZ1ubj)r5}r5(hX`http:`h}r5(h]h]h]h]h]uh jZ1h]r5hXhttp:r5r5}r5(hUh j5ubah!jubhXe scheme) through the divmod.org hostname. There are many branches in this repository, and they use a r5r5}r5(hXe scheme) through the divmod.org hostname. There are many branches in this repository, and they use a h jZ1ubj})r5}r5(hX``({BRANCHNAME})/({PROJECT})``h}r5(h]h]h]h]h]uh jZ1h]r5hX({BRANCHNAME})/({PROJECT})r5r5}r5(hUh j5ubah!jubhX naming policy.r5r5}r5(hX naming policy.h jZ1ubeubh!jh}r5(Urefurij5h]r5j)ah]h]h]h]r5j)auh]ubj)j)r5}r5(hUh j)jjq)h!jh}r5(h]h]h]h]r5j)ah]r5j)aujMcjj)h]r5(h)r5}r5(hXBuildStep URLsr5h j5jjq)h!h"h}r5(h]h]h]h]h]ujMcjj)h]r5hXBuildStep URLsr6r6}r6(hj5h j5ubaubj)r6}r6(hX<Each BuildStep has a collection of `links`. Each has a name and a target URL. The web display displays clickable links for each link, making them a useful way to point to extra information about a step. For example, a step that uploads a build result to an external service might include a link to the uploaded flie.h j5jjq)h!jh}r6(h]h]h]h]h]ujMejj)h]r6(hX#Each BuildStep has a collection of r6r6}r 6(hX#Each BuildStep has a collection of h j6ubj)r 6}r 6(hX`links`h}r 6(h]h]h]h]h]uh j6h]r 6hXlinksr6r6}r6(hUh j 6ubah!jubhX. Each has a name and a target URL. The web display displays clickable links for each link, making them a useful way to point to extra information about a step. For example, a step that uploads a build result to an external service might include a link to the uploaded flie.r6r6}r6(hX. Each has a name and a target URL. The web display displays clickable links for each link, making them a useful way to point to extra information about a step. For example, a step that uploads a build result to an external service might include a link to the uploaded flie.h j6ubeubj)r6}r6(hXTo set one of these links, the :class:`BuildStep` should call the :meth:`~buildbot.process.buildstep.BuildStep.addURL` method with the name of the link and the target URL. Multiple URLs can be set. For example::h j5jjq)h!jh}r6(h]h]h]h]h]ujMjjj)h]r6(hXTo set one of these links, the r6r6}r6(hXTo set one of these links, the h j6ubj)r6}r6(hX:class:`BuildStep`r6h j6jjq)h!jh}r6(UreftypeXclassjjX BuildStepU refdomainXpyr6h]h]U refexplicith]h]h]jjUjX NjY NujMjh]r 6j})r!6}r"6(hj6h}r#6(h]h]r$6(jj6Xpy-classr%6eh]h]h]uh j6h]r&6hX BuildStepr'6r(6}r)6(hUh j!6ubah!jubaubhX should call the r*6r+6}r,6(hX should call the h j6ubj)r-6}r.6(hX4:meth:`~buildbot.process.buildstep.BuildStep.addURL`r/6h j6jjq)h!jh}r06(UreftypeXmethjjX+buildbot.process.buildstep.BuildStep.addURLU refdomainXpyr16h]h]U refexplicith]h]h]jjUjX NjY NujMjh]r26j})r36}r46(hj/6h}r56(h]h]r66(jj16Xpy-methr76eh]h]h]uh j-6h]r86hXaddURLr96r:6}r;6(hUh j36ubah!jubaubhX\ method with the name of the link and the target URL. Multiple URLs can be set. For example:r<6r=6}r>6(hX\ method with the name of the link and the target URL. Multiple URLs can be set. For example:h j6ubeubj)r?6}r@6(hX@defer.inlineCallbacks def run(self): ... # create and upload report to coverage server url = 'http://coverage.corp.com/reports/%s' % reportname yield self.addURL('coverage', url)h j5jjq)h!jh}rA6(jjh]h]h]h]h]ujMnjj)h]rB6hX@defer.inlineCallbacks def run(self): ... # create and upload report to coverage server url = 'http://coverage.corp.com/reports/%s' % reportname yield self.addURL('coverage', url)rC6rD6}rE6(hUh j?6ubaubeubj)j)rF6}rG6(hUh j)rH6}rI6(hUh j)jjq)j}rJ6jTj5sh!jh}rK6(h]h]h]h]rL6(jUj)eh]rM6(j)jTeujMgjj)j}rN6jUj5sh]rO6(h)rP6}rQ6(hXWriting Change SourcesrR6h jH6jjq)h!h"h}rS6(h]h]h]h]h]ujMgjj)h]rT6hXWriting Change SourcesrU6rV6}rW6(hjR6h jP6ubaubj)rX6}rY6(hXFor some version-control systems, making Buildbot aware of new changes can be a challenge. If the pre-supplied classes in :ref:`Change-Sources` are not sufficient, then you will need to write your own.h jH6jjq)h!jh}rZ6(h]h]h]h]h]ujMijj)h]r[6(hX{For some version-control systems, making Buildbot aware of new changes can be a challenge. If the pre-supplied classes in r\6r]6}r^6(hX{For some version-control systems, making Buildbot aware of new changes can be a challenge. If the pre-supplied classes in h jX6ubj)r_6}r`6(hX:ref:`Change-Sources`ra6h jX6jjq)h!jh}rb6(UreftypeXrefjjXchange-sourcesU refdomainXstdrc6h]h]U refexplicith]h]h]jjUujMih]rd6j)re6}rf6(hja6h}rg6(h]h]rh6(jjc6Xstd-refri6eh]h]h]uh j_6h]rj6hXChange-Sourcesrk6rl6}rm6(hUh je6ubah!jubaubhX: are not sufficient, then you will need to write your own.rn6ro6}rp6(hX: are not sufficient, then you will need to write your own.h jX6ubeubj)rq6}rr6(hXIThere are three approaches, one of which is not even a change source. The first option is to write a change source that exposes some service to which the version control system can "push" changes. This can be more complicated, since it requires implementing a new service, but delivers changes to Buildbot immediately on commit.rs6h jH6jjq)h!jh}rt6(h]h]h]h]h]ujMmjj)h]ru6hXIThere are three approaches, one of which is not even a change source. The first option is to write a change source that exposes some service to which the version control system can "push" changes. This can be more complicated, since it requires implementing a new service, but delivers changes to Buildbot immediately on commit.rv6rw6}rx6(hjs6h jq6ubaubj)ry6}rz6(hXThe second option is often preferable to the first: implement a notification service in an external process (perhaps one that is started directly by the version control system, or by an email server) and delivers changes to Buildbot via :ref:`PBChangeSource`. This section does not describe this particular approach, since it requires no customization within the buildmaster process.h jH6jjq)h!jh}r{6(h]h]h]h]h]ujMsjj)h]r|6(hXThe second option is often preferable to the first: implement a notification service in an external process (perhaps one that is started directly by the version control system, or by an email server) and delivers changes to Buildbot via r}6r~6}r6(hXThe second option is often preferable to the first: implement a notification service in an external process (perhaps one that is started directly by the version control system, or by an email server) and delivers changes to Buildbot via h jy6ubj)r6}r6(hX:ref:`PBChangeSource`r6h jy6jjq)h!jh}r6(UreftypeXrefjjXpbchangesourceU refdomainXstdr6h]h]U refexplicith]h]h]jjUujMsh]r6j)r6}r6(hj6h}r6(h]h]r6(jj6Xstd-refr6eh]h]h]uh j6h]r6hXPBChangeSourcer6r6}r6(hUh j6ubah!jubaubhX~. This section does not describe this particular approach, since it requires no customization within the buildmaster process.r6r6}r6(hX~. This section does not describe this particular approach, since it requires no customization within the buildmaster process.h jy6ubeubj)r6}r6(hXRThe third option is to write a change source which polls for changes - repeatedly connecting to an external service to check for new changes. This works well in many cases, but can produce a high load on the version control system if polling is too frequent, and can take too long to notice changes if the polling is not frequent enough.r6h jH6jjq)h!jh}r6(h]h]h]h]h]ujMyjj)h]r6hXRThe third option is to write a change source which polls for changes - repeatedly connecting to an external service to check for new changes. This works well in many cases, but can produce a high load on the version control system if polling is too frequent, and can take too long to notice changes if the polling is not frequent enough.r6r6}r6(hj6h j6ubaubj)r6}r6(hUh jH6jjq)h!jh}r6(h]h]h]h]r6j)ah]r6j)aujMjj)h]r6(h)r6}r6(hX*Writing a Notification-based Change Sourcer6h j6jjq)h!h"h}r6(h]h]h]h]h]ujMjj)h]r6hX*Writing a Notification-based Change Sourcer6r6}r6(hj6h j6ubaubj[)r6}r6(hUh j6jNh!j^h}r6(h]h]h]h]h]Uentries]r6(j+X3buildbot.changes.base.ChangeSource (built-in class)jHUtr6aujNjj)h]ubcsphinx.addnodes desc r6)r6}r6(hUh j6jNh!Udescr6h}r6(Unoindexr6Udomainr6Xpyh]h]h]h]h]Uobjtyper6jIUdesctyper6jIujNjj)h]r6(csphinx.addnodes desc_signature r6)r6}r6(hX"buildbot.changes.base.ChangeSourceh j6jjq)h!Udesc_signaturer6h}r6(h]r6jHajpNh]h]h]h]r6jHaUfullnamer6jHUclassr6Xbuildbot.changes.baseUfirstr6ujMjj)h]r6(csphinx.addnodes desc_annotation r6)r6}r6(hXclass h j6jjq)h!Udesc_annotationr6h}r6(h]h]h]h]h]ujMjj)h]r6hXclass r6r6}r6(hUh j6ubaubcsphinx.addnodes desc_addname r6)r6}r6(hXbuildbot.changes.base.h j6jjq)h!U desc_addnamer6h}r6(h]h]h]h]h]ujMjj)h]r6hXbuildbot.changes.base.r6r6}r6(hUh j6ubaubcsphinx.addnodes desc_name r6)r6}r6(hX ChangeSourceh j6jjq)h!U desc_namer6h}r6(h]h]h]h]h]ujMjj)h]r6hX ChangeSourcer6r6}r6(hUh j6ubaubeubcsphinx.addnodes desc_content r6)r6}r6(hUh j6jjq)h!U desc_contentr6h}r6(h]h]h]h]h]ujMjj)h]ubeubj)r6}r6(hXQA custom change source must implement :class:`buildbot.interfaces.IChangeSource`.h j6jjq)h!jh}r6(h]h]h]h]h]ujMjj)h]r6(hX&A custom change source must implement r6r6}r6(hX&A custom change source must implement h j6ubj)r6}r6(hX*:class:`buildbot.interfaces.IChangeSource`r6h j6jjq)h!jh}r6(UreftypeXclassjjX!buildbot.interfaces.IChangeSourceU refdomainXpyr6h]h]U refexplicith]h]h]jjUjX NjY NujMh]r6j})r6}r6(hj6h}r6(h]h]r6(jj6Xpy-classr6eh]h]h]uh j6h]r6hX!buildbot.interfaces.IChangeSourcer6r6}r6(hUh j6ubah!jubaubhX.r6}r6(hX.h j6ubeubj)r6}r6(hXeThe easiest way to do this is to subclass :class:`buildbot.changes.base.ChangeSource`, implementing the :meth:`describe` method to describe the instance. :class:`ChangeSource` is a Twisted service, so you will need to implement the :meth:`startService` and :meth:`stopService` methods to control the means by which your change source receives notifications.h j6jjq)h!jh}r6(h]h]h]h]h]ujMjj)h]r6(hX*The easiest way to do this is to subclass r6r6}r7(hX*The easiest way to do this is to subclass h j6ubj)r7}r7(hX+:class:`buildbot.changes.base.ChangeSource`r7h j6jjq)h!jh}r7(UreftypeXclassjjX"buildbot.changes.base.ChangeSourceU refdomainXpyr7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r7j})r7}r7(hj7h}r 7(h]h]r 7(jj7Xpy-classr 7eh]h]h]uh j7h]r 7hX"buildbot.changes.base.ChangeSourcer 7r7}r7(hUh j7ubah!jubaubhX, implementing the r7r7}r7(hX, implementing the h j6ubj)r7}r7(hX:meth:`describe`r7h j6jjq)h!jh}r7(UreftypeXmethjjXdescribeU refdomainXpyr7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r7j})r7}r7(hj7h}r7(h]h]r7(jj7Xpy-methr7eh]h]h]uh j7h]r7hXdescriber7r 7}r!7(hUh j7ubah!jubaubhX" method to describe the instance. r"7r#7}r$7(hX" method to describe the instance. h j6ubj)r%7}r&7(hX:class:`ChangeSource`r'7h j6jjq)h!jh}r(7(UreftypeXclassjjX ChangeSourceU refdomainXpyr)7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r*7j})r+7}r,7(hj'7h}r-7(h]h]r.7(jj)7Xpy-classr/7eh]h]h]uh j%7h]r07hX ChangeSourcer17r27}r37(hUh j+7ubah!jubaubhX9 is a Twisted service, so you will need to implement the r47r57}r67(hX9 is a Twisted service, so you will need to implement the h j6ubj)r77}r87(hX:meth:`startService`r97h j6jjq)h!jh}r:7(UreftypeXmethjjX startServiceU refdomainXpyr;7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r<7j})r=7}r>7(hj97h}r?7(h]h]r@7(jj;7Xpy-methrA7eh]h]h]uh j77h]rB7hX startServicerC7rD7}rE7(hUh j=7ubah!jubaubhX and rF7rG7}rH7(hX and h j6ubj)rI7}rJ7(hX:meth:`stopService`rK7h j6jjq)h!jh}rL7(UreftypeXmethjjX stopServiceU refdomainXpyrM7h]h]U refexplicith]h]h]jjUjX NjY NujMh]rN7j})rO7}rP7(hjK7h}rQ7(h]h]rR7(jjM7Xpy-methrS7eh]h]h]uh jI7h]rT7hX stopServicerU7rV7}rW7(hUh jO7ubah!jubaubhXQ methods to control the means by which your change source receives notifications.rX7rY7}rZ7(hXQ methods to control the means by which your change source receives notifications.h j6ubeubj)r[7}r\7(hXWhen the class does receive a change, it should call ``self.master.addChange(..)`` to submit it to the buildmaster. This method shares the same parameters as ``master.db.changes.addChange``, so consult the API documentation for that function for details on the available arguments.h j6jjq)h!jh}r]7(h]h]h]h]h]ujMjj)h]r^7(hX5When the class does receive a change, it should call r_7r`7}ra7(hX5When the class does receive a change, it should call h j[7ubj})rb7}rc7(hX``self.master.addChange(..)``h}rd7(h]h]h]h]h]uh j[7h]re7hXself.master.addChange(..)rf7rg7}rh7(hUh jb7ubah!jubhXM to submit it to the buildmaster. This method shares the same parameters as ri7rj7}rk7(hXM to submit it to the buildmaster. This method shares the same parameters as h j[7ubj})rl7}rm7(hX``master.db.changes.addChange``h}rn7(h]h]h]h]h]uh j[7h]ro7hXmaster.db.changes.addChangerp7rq7}rr7(hUh jl7ubah!jubhX\, so consult the API documentation for that function for details on the available arguments.rs7rt7}ru7(hX\, so consult the API documentation for that function for details on the available arguments.h j[7ubeubj)rv7}rw7(hX(You will probably also want to set ``compare_attrs`` to the list of object attributes which Buildbot will use to compare one change source to another when reconfiguring. During reconfiguration, if the new change source is different from the old, then the old will be stopped and the new started.h j6jjq)h!jh}rx7(h]h]h]h]h]ujMjj)h]ry7(hX#You will probably also want to set rz7r{7}r|7(hX#You will probably also want to set h jv7ubj})r}7}r~7(hX``compare_attrs``h}r7(h]h]h]h]h]uh jv7h]r7hX compare_attrsr7r7}r7(hUh j}7ubah!jubhX to the list of object attributes which Buildbot will use to compare one change source to another when reconfiguring. During reconfiguration, if the new change source is different from the old, then the old will be stopped and the new started.r7r7}r7(hX to the list of object attributes which Buildbot will use to compare one change source to another when reconfiguring. During reconfiguration, if the new change source is different from the old, then the old will be stopped and the new started.h jv7ubeubeubjF6eubjjq)h!jh}r7(h]h]h]h]r7j)ah]r7j)aujMjj)h]r7(h)r7}r7(hXWriting a Change Pollerr7h jF6jjq)h!h"h}r7(h]h]h]h]h]ujMjj)h]r7hXWriting a Change Pollerr7r7}r7(hj7h j7ubaubj[)r7}r7(hUh jF6jNh!j^h}r7(h]h]h]h]h]Uentries]r7(j+X:buildbot.changes.base.PollingChangeSource (built-in class)jUtr7aujNjj)h]ubj6)r7}r7(hUh jF6jNh!j6h}r7(j6j6Xpyh]h]h]h]h]j6jj6jujNjj)h]r7(j6)r7}r7(hX)buildbot.changes.base.PollingChangeSourceh j7jjq)h!j6h}r7(h]r7jajpNh]h]h]h]r7jaj6jj6Xbuildbot.changes.basej6ujMjj)h]r7(j6)r7}r7(hXclass h j7jjq)h!j6h}r7(h]h]h]h]h]ujMjj)h]r7hXclass r7r7}r7(hUh j7ubaubj6)r7}r7(hXbuildbot.changes.base.h j7jjq)h!j6h}r7(h]h]h]h]h]ujMjj)h]r7hXbuildbot.changes.base.r7r7}r7(hUh j7ubaubj6)r7}r7(hXPollingChangeSourceh j7jjq)h!j6h}r7(h]h]h]h]h]ujMjj)h]r7hXPollingChangeSourcer7r7}r7(hUh j7ubaubeubj6)r7}r7(hUh j7jjq)h!j6h}r7(h]h]h]h]h]ujMjj)h]ubeubj)r7}r7(hXPolling is a very common means of seeking changes, so Buildbot supplies a utility parent class to make it easier. A poller should subclass :class:`buildbot.changes.base.PollingChangeSource`, which is a subclass of :class:`ChangeSource`. This subclass implements the :meth:`Service` methods, and causes the :meth:`poll` method to be called every ``self.pollInterval`` seconds. This method should return a Deferred to signal its completion.h jF6jjq)h!jh}r7(h]h]h]h]h]ujMjj)h]r7(hXPolling is a very common means of seeking changes, so Buildbot supplies a utility parent class to make it easier. A poller should subclass r7r7}r7(hXPolling is a very common means of seeking changes, so Buildbot supplies a utility parent class to make it easier. A poller should subclass h j7ubj)r7}r7(hX2:class:`buildbot.changes.base.PollingChangeSource`r7h j7jjq)h!jh}r7(UreftypeXclassjjX)buildbot.changes.base.PollingChangeSourceU refdomainXpyr7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r7j})r7}r7(hj7h}r7(h]h]r7(jj7Xpy-classr7eh]h]h]uh j7h]r7hX)buildbot.changes.base.PollingChangeSourcer7r7}r7(hUh j7ubah!jubaubhX, which is a subclass of r7r7}r7(hX, which is a subclass of h j7ubj)r7}r7(hX:class:`ChangeSource`r7h j7jjq)h!jh}r7(UreftypeXclassjjX ChangeSourceU refdomainXpyr7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r7j})r7}r7(hj7h}r7(h]h]r7(jj7Xpy-classr7eh]h]h]uh j7h]r7hX ChangeSourcer7r7}r7(hUh j7ubah!jubaubhX . This subclass implements the r7r7}r7(hX . This subclass implements the h j7ubj)r7}r7(hX:meth:`Service`r7h j7jjq)h!jh}r7(UreftypeXmethjjXServiceU refdomainXpyr7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r7j})r7}r7(hj7h}r7(h]h]r7(jj7Xpy-methr7eh]h]h]uh j7h]r7hXServicer7r7}r7(hUh j7ubah!jubaubhX methods, and causes the r7r7}r7(hX methods, and causes the h j7ubj)r7}r7(hX :meth:`poll`r7h j7jjq)h!jh}r7(UreftypeXmethjjXpollU refdomainXpyr7h]h]U refexplicith]h]h]jjUjX NjY NujMh]r7j})r7}r7(hj7h}r7(h]h]r8(jj7Xpy-methr8eh]h]h]uh j7h]r8hXpollr8r8}r8(hUh j7ubah!jubaubhX method to be called every r8r8}r8(hX method to be called every h j7ubj})r 8}r 8(hX``self.pollInterval``h}r 8(h]h]h]h]h]uh j7h]r 8hXself.pollIntervalr 8r8}r8(hUh j 8ubah!jubhXI seconds. This method should return a Deferred to signal its completion.r8r8}r8(hXI seconds. This method should return a Deferred to signal its completion.h j7ubeubj)r8}r8(hX[Aside from the service methods, the other concerns in the previous section apply here, too.r8h jF6jjq)h!jh}r8(h]h]h]h]h]ujMjj)h]r8hX[Aside from the service methods, the other concerns in the previous section apply here, too.r8r8}r8(hj8h j8ubaubeubj)j*jj)Uindex-4r8j)r8}r8(hju)h j)jjq)j}h!jh}r8(h]h]r8jx)ah]h]r 8j8ah]ujMjj)j}r!8j8j)sh]r"8(h)r#8}r$8(hj|)h}r%8(h]h]h]h]h]uh j8h]r&8hXTodor'8r(8}r)8(hj|)h j#8ubah!h"ubj)r*8}r+8(hj)h j8jjq)h!jh}r,8(h]h]h]h]h]ujMh]r-8hXStep Progress BuildStepFailedr.8r/8}r08(hj)h j*8ubaubeubjej)r18}r28(hUh j)jjq)j}r38jdj)r48}r58(hX#.. _Writing-BuildStep-Constructors:h j)jjq)h!jh}r68(h]h]h]h]h]jjeujMjj)h]ubsh!jh}r78(h]h]h]h]r88(jej)eh]r98(j)jdeujMjj)j}r:8jej48sh]r;8(h)r<8}r=8(hXWriting BuildStep Constructorsr>8h j18jjq)h!h"h}r?8(h]h]h]h]h]ujMjj)h]r@8hXWriting BuildStep ConstructorsrA8rB8}rC8(hj>8h j<8ubaubj)rD8}rE8(hX2Build steps act as their own factories, so their constructors are a bit more complex than necessary. The configuration file instantiates a :class:`~buildbot.process.buildstep.BuildStep` object, but the step configuration must be re-used for multiple builds, so Buildbot needs some way to create more steps.h j18jjq)h!jh}rF8(h]h]h]h]h]ujMjj)h]rG8(hXBuild steps act as their own factories, so their constructors are a bit more complex than necessary. The configuration file instantiates a rH8rI8}rJ8(hXBuild steps act as their own factories, so their constructors are a bit more complex than necessary. The configuration file instantiates a h jD8ubj)rK8}rL8(hX.:class:`~buildbot.process.buildstep.BuildStep`rM8h jD8jjq)h!jh}rN8(UreftypeXclassjjX$buildbot.process.buildstep.BuildStepU refdomainXpyrO8h]h]U refexplicith]h]h]jjUjX NjY NujMh]rP8j})rQ8}rR8(hjM8h}rS8(h]h]rT8(jjO8Xpy-classrU8eh]h]h]uh jK8h]rV8hX BuildSteprW8rX8}rY8(hUh jQ8ubah!jubaubhXy object, but the step configuration must be re-used for multiple builds, so Buildbot needs some way to create more steps.rZ8r[8}r\8(hXy object, but the step configuration must be re-used for multiple builds, so Buildbot needs some way to create more steps.h jD8ubeubj)r]8}r^8(hX@Consider the use of a :class:`BuildStep` in :file:`master.cfg`::h j18jjq)h!jh}r_8(h]h]h]h]h]ujM jj)h]r`8(hXConsider the use of a ra8rb8}rc8(hXConsider the use of a h j]8ubj)rd8}re8(hX:class:`BuildStep`rf8h j]8jjq)h!jh}rg8(UreftypeXclassjjX BuildStepU refdomainXpyrh8h]h]U refexplicith]h]h]jjUjX NjY NujM h]ri8j})rj8}rk8(hjf8h}rl8(h]h]rm8(jjh8Xpy-classrn8eh]h]h]uh jd8h]ro8hX BuildSteprp8rq8}rr8(hUh jj8ubah!jubaubhX in rs8rt8}ru8(hX in h j]8ubj})rv8}rw8(hUh}rx8(h]h]h]h]ry8Xfilerz8aUrolejz8h]uh j]8h]r{8hX master.cfgr|8r}8}r~8(hX master.cfgh jv8ubah!jubhX:r8}r8(hX:h j]8ubeubj)r8}r8(hX0f.addStep(MyStep(someopt="stuff", anotheropt=1))h j18jjq)h!jh}r8(jjh]h]h]h]h]ujM"jj)h]r8hX0f.addStep(MyStep(someopt="stuff", anotheropt=1))r8r8}r8(hUh j8ubaubj)r8}r8(hXThis creates a single instance of class ``MyStep``. However, Buildbot needs a new object each time the step is executed. An instance of :class:`~buildbot.process.buildstep.BuildStep` remembers how it was constructed, and can create copies of itself. When writing a new step class, then, keep in mind are that you cannot do anything "interesting" in the constructor -- limit yourself to checking and storing arguments.h j18jjq)h!jh}r8(h]h]h]h]h]ujM$jj)h]r8(hX(This creates a single instance of class r8r8}r8(hX(This creates a single instance of class h j8ubj})r8}r8(hX ``MyStep``h}r8(h]h]h]h]h]uh j8h]r8hXMyStepr8r8}r8(hUh j8ubah!jubhXV. However, Buildbot needs a new object each time the step is executed. An instance of r8r8}r8(hXV. However, Buildbot needs a new object each time the step is executed. An instance of h j8ubj)r8}r8(hX.:class:`~buildbot.process.buildstep.BuildStep`r8h j8jjq)h!jh}r8(UreftypeXclassjjX$buildbot.process.buildstep.BuildStepU refdomainXpyr8h]h]U refexplicith]h]h]jjUjX NjY NujM$h]r8j})r8}r8(hj8h}r8(h]h]r8(jj8Xpy-classr8eh]h]h]uh j8h]r8hX BuildStepr8r8}r8(hUh j8ubah!jubaubhX remembers how it was constructed, and can create copies of itself. When writing a new step class, then, keep in mind are that you cannot do anything "interesting" in the constructor -- limit yourself to checking and storing arguments.r8r8}r8(hX remembers how it was constructed, and can create copies of itself. When writing a new step class, then, keep in mind are that you cannot do anything "interesting" in the constructor -- limit yourself to checking and storing arguments.h j8ubeubj)r8}r8(hXIt is customary to call the parent class's constructor with all otherwise-unspecified keyword arguments. Keep a ``**kwargs`` argument on the end of your options, and pass that up to the parent class's constructor.h j18jjq)h!jh}r8(h]h]h]h]h]ujM)jj)h]r8(hXpIt is customary to call the parent class's constructor with all otherwise-unspecified keyword arguments. Keep a r8r8}r8(hXpIt is customary to call the parent class's constructor with all otherwise-unspecified keyword arguments. Keep a h j8ubj})r8}r8(hX ``**kwargs``h}r8(h]h]h]h]h]uh j8h]r8hX**kwargsr8r8}r8(hUh j8ubah!jubhXY argument on the end of your options, and pass that up to the parent class's constructor.r8r8}r8(hXY argument on the end of your options, and pass that up to the parent class's constructor.h j8ubeubj)r8}r8(hX!The whole thing looks like this::h j18jjq)h!jh}r8(h]h]h]h]h]ujM,jj)h]r8hX The whole thing looks like this:r8r8}r8(hX The whole thing looks like this:h j8ubaubj)r8}r8(hXclass Frobnify(LoggingBuildStep): def __init__(self, frob_what="frobee", frob_how_many=None, frob_how=None, **kwargs): # check if frob_how_many is None: raise TypeError("Frobnify argument how_many is required") # override a parent option kwargs['parentOpt'] = 'xyz' # call parent LoggingBuildStep.__init__(self, **kwargs) # set Frobnify attributes self.frob_what = frob_what self.frob_how_many = how_many self.frob_how = frob_how class FastFrobnify(Frobnify): def __init__(self, speed=5, **kwargs): Frobnify.__init__(self, **kwargs) self.speed = speedh j18jjq)h!jh}r8(jjh]h]h]h]h]ujM.jj)h]r8hXclass Frobnify(LoggingBuildStep): def __init__(self, frob_what="frobee", frob_how_many=None, frob_how=None, **kwargs): # check if frob_how_many is None: raise TypeError("Frobnify argument how_many is required") # override a parent option kwargs['parentOpt'] = 'xyz' # call parent LoggingBuildStep.__init__(self, **kwargs) # set Frobnify attributes self.frob_what = frob_what self.frob_how_many = how_many self.frob_how = frob_how class FastFrobnify(Frobnify): def __init__(self, speed=5, **kwargs): Frobnify.__init__(self, **kwargs) self.speed = speedr8r8}r8(hUh j8ubaubeubj)j)r8}r8(hUh j)jjq)h!jh}r8(h]h]h]h]r8j)ah]r8j)aujMVjj)h]r8(h)r8}r8(hXRunning Commandsr8h j8jjq)h!h"h}r8(h]h]h]h]h]ujMVjj)h]r8hXRunning Commandsr8r8}r8(hj8h j8ubaubj)r8}r8(hXTo spawn a command in the buildslave, create a :class:`~buildbot.process.remotecommand.RemoteCommand` instance in your step's ``run`` method and run it with :meth:`~buildbot.process.remotecommand.BuildStep.runCommand`::h j8jjq)h!jh}r8(h]h]h]h]h]ujMXjj)h]r8(hX/To spawn a command in the buildslave, create a r8r8}r8(hX/To spawn a command in the buildslave, create a h j8ubj)r8}r8(hX6:class:`~buildbot.process.remotecommand.RemoteCommand`r8h j8jjq)h!jh}r8(UreftypeXclassjjX,buildbot.process.remotecommand.RemoteCommandU refdomainXpyr8h]h]U refexplicith]h]h]jjUjX NjY NujMXh]r8j})r8}r8(hj8h}r8(h]h]r8(jj8Xpy-classr8eh]h]h]uh j8h]r8hX RemoteCommandr8r8}r8(hUh j8ubah!jubaubhX instance in your step's r8r8}r8(hX instance in your step's h j8ubj})r8}r8(hX``run``h}r8(h]h]h]h]h]uh j8h]r8hXrunr8r8}r8(hUh j8ubah!jubhX method and run it with r8r8}r8(hX method and run it with h j8ubj)r8}r8(hX<:meth:`~buildbot.process.remotecommand.BuildStep.runCommand`r8h j8jjq)h!jh}r8(UreftypeXmethjjX3buildbot.process.remotecommand.BuildStep.runCommandU refdomainXpyr8h]h]U refexplicith]h]h]jjUjX NjY NujMXh]r9j})r9}r9(hj8h}r9(h]h]r9(jj8Xpy-methr9eh]h]h]uh j8h]r9hX runCommandr9r9}r 9(hUh j9ubah!jubaubhX:r 9}r 9(hX:h j8ubeubj)r 9}r 9(hX2cmd = RemoteCommand(args) d = self.runCommand(cmd)h j8jjq)h!jh}r9(jjh]h]h]h]h]ujMZjj)h]r9hX2cmd = RemoteCommand(args) d = self.runCommand(cmd)r9r9}r9(hUh j 9ubaubj)r9}r9(hXThe :py:class:`~buildbot.process.buildstep.CommandMixin` class offers a simple interface to several common slave-side commands.h j8jjq)h!jh}r9(h]h]h]h]h]ujM]jj)h]r9(hXThe r9r9}r9(hXThe h j9ubj)r9}r9(hX4:py:class:`~buildbot.process.buildstep.CommandMixin`r9h j9jjq)h!jh}r9(UreftypeXclassjjX'buildbot.process.buildstep.CommandMixinU refdomainXpyr9h]h]U refexplicith]h]h]jjUjX NjY NujM]h]r9j})r 9}r!9(hj9h}r"9(h]h]r#9(jj9Xpy-classr$9eh]h]h]uh j9h]r%9hX CommandMixinr&9r'9}r(9(hUh j 9ubah!jubaubhXG class offers a simple interface to several common slave-side commands.r)9r*9}r+9(hXG class offers a simple interface to several common slave-side commands.h j9ubeubj)r,9}r-9(hXFor the much more common task of running a shell command on the buildslave, use :py:class:`~buildbot.process.buildstep.ShellMixin`. This class provides a method to handle the myriad constructor arguments related to shell commands, as well as a method to create new :py:class:`~buildbot.process.remotecommand.RemoteCommand` instances. This mixin is the recommended method of implementing custom shell-based steps. The older pattern of subclassing ``ShellCommand`` is no longer recommended.h j8jjq)h!jh}r.9(h]h]h]h]h]ujM_jj)h]r/9(hXPFor the much more common task of running a shell command on the buildslave, use r09r19}r29(hXPFor the much more common task of running a shell command on the buildslave, use h j,9ubj)r39}r49(hX2:py:class:`~buildbot.process.buildstep.ShellMixin`r59h j,9jjq)h!jh}r69(UreftypeXclassjjX%buildbot.process.buildstep.ShellMixinU refdomainXpyr79h]h]U refexplicith]h]h]jjUjX NjY NujM_h]r89j})r99}r:9(hj59h}r;9(h]h]r<9(jj79Xpy-classr=9eh]h]h]uh j39h]r>9hX ShellMixinr?9r@9}rA9(hUh j99ubah!jubaubhX. This class provides a method to handle the myriad constructor arguments related to shell commands, as well as a method to create new rB9rC9}rD9(hX. This class provides a method to handle the myriad constructor arguments related to shell commands, as well as a method to create new h j,9ubj)rE9}rF9(hX9:py:class:`~buildbot.process.remotecommand.RemoteCommand`rG9h j,9jjq)h!jh}rH9(UreftypeXclassjjX,buildbot.process.remotecommand.RemoteCommandU refdomainXpyrI9h]h]U refexplicith]h]h]jjUjX NjY NujM_h]rJ9j})rK9}rL9(hjG9h}rM9(h]h]rN9(jjI9Xpy-classrO9eh]h]h]uh jE9h]rP9hX RemoteCommandrQ9rR9}rS9(hUh jK9ubah!jubaubhX| instances. This mixin is the recommended method of implementing custom shell-based steps. The older pattern of subclassing rT9rU9}rV9(hX| instances. This mixin is the recommended method of implementing custom shell-based steps. The older pattern of subclassing h j,9ubj})rW9}rX9(hX``ShellCommand``h}rY9(h]h]h]h]h]uh j,9h]rZ9hX ShellCommandr[9r\9}r]9(hUh jW9ubah!jubhX is no longer recommended.r^9r_9}r`9(hX is no longer recommended.h j,9ubeubj)ra9}rb9(hX5A simple example of a step using the shell mixin is::h j8jjq)h!jh}rc9(h]h]h]h]h]ujMdjj)h]rd9hX4A simple example of a step using the shell mixin is:re9rf9}rg9(hX4A simple example of a step using the shell mixin is:h ja9ubaubj)rh9}ri9(hXclass RunCleanup(buildstep.ShellMixin, buildstep.BuildStep): def __init__(self, cleanupScript='./cleanup.sh', **kwargs): self.cleanupScript = cleanupScript kwargs = self.setupShellMixin(kwargs, prohibitArgs=['command']) buildstep.BuildStep.__init__(self, **kwargs) @defer.inlineCallbacks def run(self): cmd = yield self.makeRemoteShellCommand( command=[self.cleanupScript]) yield self.runCommand(cmd) if cmd.didFail(): cmd = yield self.makeRemoteShellCommand( command=[self.cleanupScript, '--force'], logEnviron=False) yield self.runCommand(cmd) defer.returnValue(cmd.results()) @defer.inlineCallbacks def run(self): cmd = RemoteCommand(args) log = yield self.addLog('output') cmd.useLog(log, closeWhenFinished=True) yield self.runCommand(cmd)h j8jjq)h!jh}rj9(jjh]h]h]h]h]ujMfjj)h]rk9hXclass RunCleanup(buildstep.ShellMixin, buildstep.BuildStep): def __init__(self, cleanupScript='./cleanup.sh', **kwargs): self.cleanupScript = cleanupScript kwargs = self.setupShellMixin(kwargs, prohibitArgs=['command']) buildstep.BuildStep.__init__(self, **kwargs) @defer.inlineCallbacks def run(self): cmd = yield self.makeRemoteShellCommand( command=[self.cleanupScript]) yield self.runCommand(cmd) if cmd.didFail(): cmd = yield self.makeRemoteShellCommand( command=[self.cleanupScript, '--force'], logEnviron=False) yield self.runCommand(cmd) defer.returnValue(cmd.results()) @defer.inlineCallbacks def run(self): cmd = RemoteCommand(args) log = yield self.addLog('output') cmd.useLog(log, closeWhenFinished=True) yield self.runCommand(cmd)rl9rm9}rn9(hUh jh9ubaubeubj)j1j&jS.j)jH6j)j)ro9}rp9(hUh j)jjq)j}rq9jEj)rr9}rs9(hX.. _Factory-Workdir-Functions:h j)rt9}ru9(hUh j)jjq)h!jh}rv9(h]h]h]h]rw9j)ah]rx9j)aujMjj)h]ry9(h)rz9}r{9(hXCustom Build Classesr|9h jt9jjq)h!h"h}r}9(h]h]h]h]h]ujMjj)h]r~9hXCustom Build Classesr9r9}r9(hj|9h jz9ubaubj)r9}r9(hX-The standard :class:`BuildFactory` object creates :class:`Build` objects by default. These Builds will each execute a collection of :class:`BuildStep`\s in a fixed sequence. Each step can affect the results of the build, but in general there is little intelligence to tie the different steps together.h jt9jjq)h!jh}r9(h]h]h]h]h]ujMjj)h]r9(hX The standard r9r9}r9(hX The standard h j9ubj)r9}r9(hX:class:`BuildFactory`r9h j9jjq)h!jh}r9(UreftypeXclassjjX BuildFactoryU refdomainXpyr9h]h]U refexplicith]h]h]jjUjX NjY NujMh]r9j})r9}r9(hj9h}r9(h]h]r9(jj9Xpy-classr9eh]h]h]uh j9h]r9hX BuildFactoryr9r9}r9(hUh j9ubah!jubaubhX object creates r9r9}r9(hX object creates h j9ubj)r9}r9(hX:class:`Build`r9h j9jjq)h!jh}r9(UreftypeXclassjjXBuildU refdomainXpyr9h]h]U refexplicith]h]h]jjUjX NjY NujMh]r9j})r9}r9(hj9h}r9(h]h]r9(jj9Xpy-classr9eh]h]h]uh j9h]r9hXBuildr9r9}r9(hUh j9ubah!jubaubhXD objects by default. These Builds will each execute a collection of r9r9}r9(hXD objects by default. These Builds will each execute a collection of h j9ubj)r9}r9(hX:class:`BuildStep`r9h j9jjq)h!jh}r9(UreftypeXclassjjX BuildStepU refdomainXpyr9h]h]U refexplicith]h]h]jjUjX NjY NujMh]r9j})r9}r9(hj9h}r9(h]h]r9(jj9Xpy-classr9eh]h]h]uh j9h]r9hX BuildStepr9r9}r9(hUh j9ubah!jubaubhXs in a fixed sequence. Each step can affect the results of the build, but in general there is little intelligence to tie the different steps together.r9r9}r9(hX\s in a fixed sequence. Each step can affect the results of the build, but in general there is little intelligence to tie the different steps together.h j9ubeubj)r9}r9(hXBy setting the factory's ``buildClass`` attribute to a different class, you can instantiate a different build class. This might be useful, for example, to create a build class that dynamically determines which steps to run. The skeleton of such a project would look like::h jt9jjq)h!jh}r9(h]h]h]h]h]ujMjj)h]r9(hXBy setting the factory's r9r9}r9(hXBy setting the factory's h j9ubj})r9}r9(hX``buildClass``h}r9(h]h]h]h]h]uh j9h]r9hX buildClassr9r9}r9(hUh j9ubah!jubhX attribute to a different class, you can instantiate a different build class. This might be useful, for example, to create a build class that dynamically determines which steps to run. The skeleton of such a project would look like:r9r9}r9(hX attribute to a different class, you can instantiate a different build class. This might be useful, for example, to create a build class that dynamically determines which steps to run. The skeleton of such a project would look like:h j9ubeubj)r9}r9(hXclass DynamicBuild(Build): # override some methods ... f = factory.BuildFactory() f.buildClass = DynamicBuild f.addStep(...)h jt9jjq)h!jh}r9(jjh]h]h]h]h]ujMjj)h]r9hXclass DynamicBuild(Build): # override some methods ... f = factory.BuildFactory() f.buildClass = DynamicBuild f.addStep(...)r9r9}r9(hUh j9ubaubjr9eubjjq)h!jh}r9(h]h]h]h]h]jjFujMjj)h]ubsh!jh}r9(h]h]h]h]r9(jFj)eh]r9(j)jEeujMjj)j}r9jFjr9sh]r9(h)r9}r9(hXFactory Workdir Functionsr9h jo9jjq)h!h"h}r9(h]h]h]h]h]ujMjj)h]r9hXFactory Workdir Functionsr9r9}r9(hj9h j9ubaubj)r9}r9(hXIt is sometimes helpful to have a build's workdir determined at runtime based on the parameters of the build. To accomplish this, set the ``workdir`` attribute of the build factory to a callable. That callable will be invoked with the :class:`SourceStamp` for the build, and should return the appropriate workdir. Note that the value must be returned immediately - Deferreds are not supported.h jo9jjq)h!jh}r9(h]h]h]h]h]ujMjj)h]r9(hXIt is sometimes helpful to have a build's workdir determined at runtime based on the parameters of the build. To accomplish this, set the r9r9}r9(hXIt is sometimes helpful to have a build's workdir determined at runtime based on the parameters of the build. To accomplish this, set the h j9ubj})r9}r9(hX ``workdir``h}r9(h]h]h]h]h]uh j9h]r9hXworkdirr9r9}r9(hUh j9ubah!jubhXW attribute of the build factory to a callable. That callable will be invoked with the r9r9}r9(hXW attribute of the build factory to a callable. That callable will be invoked with the h j9ubj)r9}r9(hX:class:`SourceStamp`r9h j9jjq)h!jh}r9(UreftypeXclassjjX SourceStampU refdomainXpyr9h]h]U refexplicith]h]h]jjUjX NjY NujMh]r9j})r9}r9(hj9h}r9(h]h]r9(jj9Xpy-classr:eh]h]h]uh j9h]r:hX SourceStampr:r:}r:(hUh j9ubah!jubaubhX for the build, and should return the appropriate workdir. Note that the value must be returned immediately - Deferreds are not supported.r:r:}r:(hX for the build, and should return the appropriate workdir. Note that the value must be returned immediately - Deferreds are not supported.h j9ubeubj)r:}r :(hXThis can be useful, for example, in scenarios with multiple repositories submitting changes to BuildBot. In this case you likely will want to have a dedicated workdir per repository, since otherwise a sourcing step with mode = "update" will fail as a workdir with a working copy of repository A can't be "updated" for changes from a repository B. Here is an example how you can achieve workdir-per-repo::h jo9jjq)h!jh}r :(h]h]h]h]h]ujMjj)h]r :hXThis can be useful, for example, in scenarios with multiple repositories submitting changes to BuildBot. In this case you likely will want to have a dedicated workdir per repository, since otherwise a sourcing step with mode = "update" will fail as a workdir with a working copy of repository A can't be "updated" for changes from a repository B. Here is an example how you can achieve workdir-per-repo:r :r :}r:(hXThis can be useful, for example, in scenarios with multiple repositories submitting changes to BuildBot. In this case you likely will want to have a dedicated workdir per repository, since otherwise a sourcing step with mode = "update" will fail as a workdir with a working copy of repository A can't be "updated" for changes from a repository B. Here is an example how you can achieve workdir-per-repo:h j:ubaubj)r:}r:(hX}def workdir(source_stamp): return hashlib.md5 (source_stamp.repository).hexdigest()[:8] build_factory = factory.BuildFactory() build_factory.workdir = workdir build_factory.addStep(Git(mode="update")) # ... builders.append ({'name': 'mybuilder', 'slavename': 'myslave', 'builddir': 'mybuilder', 'factory': build_factory})h jo9jjq)h!jh}r:(jjh]h]h]h]h]ujMjj)h]r:hX}def workdir(source_stamp): return hashlib.md5 (source_stamp.repository).hexdigest()[:8] build_factory = factory.BuildFactory() build_factory.workdir = workdir build_factory.addStep(Git(mode="update")) # ... builders.append ({'name': 'mybuilder', 'slavename': 'myslave', 'builddir': 'mybuilder', 'factory': build_factory})r:r:}r:(hUh j:ubaubj)r:}r:(hX(The end result is a set of workdirs liker:h jo9jjq)h!jh}r:(h]h]h]h]h]ujMjj)h]r:hX(The end result is a set of workdirs liker:r:}r:(hj:h j:ubaubj)r:}r:(hX[Repo1 => /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88h jo9jjq)h!jh}r :(jjXnonejjh]h]h]h]h]ujMjj)h]r!:hX[Repo1 => /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88r":r#:}r$:(hUh j:ubaubj)r%:}r&:(hXYou could make the :func:`workdir()` function compute other paths, based on parts of the repo URL in the sourcestamp, or lookup in a lookup table based on repo URL. As long as there is a permanent 1:1 mapping between repos and workdir, this will work.h jo9jjq)h!jh}r':(h]h]h]h]h]ujMjj)h]r(:(hXYou could make the r):r*:}r+:(hXYou could make the h j%:ubj)r,:}r-:(hX:func:`workdir()`r.:h j%:jjq)h!jh}r/:(UreftypeXfuncjjXworkdirU refdomainXpyr0:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r1:j})r2:}r3:(hj.:h}r4:(h]h]r5:(jj0:Xpy-funcr6:eh]h]h]uh j,:h]r7:hXworkdirr8:r9:}r::(hUh j2:ubah!jubaubhX function compute other paths, based on parts of the repo URL in the sourcestamp, or lookup in a lookup table based on repo URL. As long as there is a permanent 1:1 mapping between repos and workdir, this will work.r;:r<:}r=:(hX function compute other paths, based on parts of the repo URL in the sourcestamp, or lookup in a lookup table based on repo URL. As long as there is a permanent 1:1 mapping between repos and workdir, this will work.h j%:ubeubj)r>:}r?:(hX.. _Writing-New-BuildSteps:h jo9jjq)h!jh}r@:(h]h]h]h]h]jjujMjj)h]ubeubj)jI.j)j^1j)jS.j)jN.j)j)j)j)rA:}rB:(hUh j)jjq)j}rC:jjU1sh!jh}rD:(h]h]h]h]rE:(jj)eh]rF:(j)jeujMjj)j}rG:jjU1sh]rH:(h)rI:}rJ:(hXAdding LogObserversrK:h jA:jjq)h!h"h}rL:(h]h]h]h]h]ujMjj)h]rM:hXAdding LogObserversrN:rO:}rP:(hjK:h jI:ubaubj)rQ:}rR:(hXtMost shell commands emit messages to stdout or stderr as they operate, especially if you ask them nicely with a :option:`--verbose` flag of some sort. They may also write text to a log file while they run. Your :class:`BuildStep` can watch this output as it arrives, to keep track of how much progress the command has made or to process log output for later summarization.h jA:jjq)h!jh}rS:(h]h]h]h]h]ujMjj)h]rT:(hXpMost shell commands emit messages to stdout or stderr as they operate, especially if you ask them nicely with a rU:rV:}rW:(hXpMost shell commands emit messages to stdout or stderr as they operate, especially if you ask them nicely with a h jQ:ubj)rX:}rY:(hX:option:`--verbose`rZ:h jQ:jjq)h!jh}r[:(UreftypeXoptionjjX --verboseU refdomainXstdr\:jNh]h]U refexplicith]h]h]jjUujMh]r]:j)r^:}r_:(hjZ:h}r`:(h]h]ra:(jj\:X std-optionrb:eh]h]h]uh jX:h]rc:hX --verboserd:re:}rf:(hUh j^:ubah!jubaubhXP flag of some sort. They may also write text to a log file while they run. Your rg:rh:}ri:(hXP flag of some sort. They may also write text to a log file while they run. Your h jQ:ubj)rj:}rk:(hX:class:`BuildStep`rl:h jQ:jjq)h!jh}rm:(UreftypeXclassjjX BuildStepU refdomainXpyrn:h]h]U refexplicith]h]h]jjUjX NjY NujMh]ro:j})rp:}rq:(hjl:h}rr:(h]h]rs:(jjn:Xpy-classrt:eh]h]h]uh jj:h]ru:hX BuildSteprv:rw:}rx:(hUh jp:ubah!jubaubhX can watch this output as it arrives, to keep track of how much progress the command has made or to process log output for later summarization.ry:rz:}r{:(hX can watch this output as it arrives, to keep track of how much progress the command has made or to process log output for later summarization.h jQ:ubeubj)r|:}r}:(hXTo accomplish this, you will need to attach a :class:`~buildbot.process.logobserver.LogObserver` to the log. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally.h jA:jjq)h!jh}r~:(h]h]h]h]h]ujMjj)h]r:(hX.To accomplish this, you will need to attach a r:r:}r:(hX.To accomplish this, you will need to attach a h j|:ubj)r:}r:(hX2:class:`~buildbot.process.logobserver.LogObserver`r:h j|:jjq)h!jh}r:(UreftypeXclassjjX(buildbot.process.logobserver.LogObserverU refdomainXpyr:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r:j})r:}r:(hj:h}r:(h]h]r:(jj:Xpy-classr:eh]h]h]uh j:h]r:hX LogObserverr:r:}r:(hUh j:ubah!jubaubhX to the log. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally.r:r:}r:(hX to the log. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally.h j|:ubeubj)r:}r:(hXThere are a number of pre-built :class:`~buildbot.process.logobserver.LogObserver` classes that you can choose from (defined in :mod:`buildbot.process.buildstep`, and of course you can subclass them to add further customization. The :class:`LogLineObserver` class handles the grunt work of buffering and scanning for end-of-line delimiters, allowing your parser to operate on complete :file:`stdout`/:file:`stderr` lines. (Lines longer than a set maximum length are dropped; the maximum defaults to 16384 bytes, but you can change it by calling :meth:`setMaxLineLength()` on your :class:`LogLineObserver` instance. Use ``sys.maxint`` for effective infinity.)h jA:jjq)h!jh}r:(h]h]h]h]h]ujMjj)h]r:(hX There are a number of pre-built r:r:}r:(hX There are a number of pre-built h j:ubj)r:}r:(hX2:class:`~buildbot.process.logobserver.LogObserver`r:h j:jjq)h!jh}r:(UreftypeXclassjjX(buildbot.process.logobserver.LogObserverU refdomainXpyr:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r:j})r:}r:(hj:h}r:(h]h]r:(jj:Xpy-classr:eh]h]h]uh j:h]r:hX LogObserverr:r:}r:(hUh j:ubah!jubaubhX. classes that you can choose from (defined in r:r:}r:(hX. classes that you can choose from (defined in h j:ubj)r:}r:(hX!:mod:`buildbot.process.buildstep`r:h j:jjq)h!jh}r:(UreftypeXmodjjXbuildbot.process.buildstepU refdomainXpyr:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r:j})r:}r:(hj:h}r:(h]h]r:(jj:Xpy-modr:eh]h]h]uh j:h]r:hXbuildbot.process.buildstepr:r:}r:(hUh j:ubah!jubaubhXH, and of course you can subclass them to add further customization. The r:r:}r:(hXH, and of course you can subclass them to add further customization. The h j:ubj)r:}r:(hX:class:`LogLineObserver`r:h j:jjq)h!jh}r:(UreftypeXclassjjXLogLineObserverU refdomainXpyr:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r:j})r:}r:(hj:h}r:(h]h]r:(jj:Xpy-classr:eh]h]h]uh j:h]r:hXLogLineObserverr:r:}r:(hUh j:ubah!jubaubhX class handles the grunt work of buffering and scanning for end-of-line delimiters, allowing your parser to operate on complete r:r:}r:(hX class handles the grunt work of buffering and scanning for end-of-line delimiters, allowing your parser to operate on complete h j:ubj})r:}r:(hUh}r:(h]h]h]h]r:Xfiler:aUrolej:h]uh j:h]r:hXstdoutr:r:}r:(hXstdouth j:ubah!jubhX/r:}r:(hX/h j:ubj})r:}r:(hUh}r:(h]h]h]h]r:Xfiler:aUrolej:h]uh j:h]r:hXstderrr:r:}r:(hXstderrh j:ubah!jubhX lines. (Lines longer than a set maximum length are dropped; the maximum defaults to 16384 bytes, but you can change it by calling r:r:}r:(hX lines. (Lines longer than a set maximum length are dropped; the maximum defaults to 16384 bytes, but you can change it by calling h j:ubj)r:}r:(hX:meth:`setMaxLineLength()`r:h j:jjq)h!jh}r:(UreftypeXmethjjXsetMaxLineLengthU refdomainXpyr:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r:j})r:}r:(hj:h}r:(h]h]r:(jj:Xpy-methr:eh]h]h]uh j:h]r:hXsetMaxLineLengthr:r:}r:(hUh j:ubah!jubaubhX on your r:r:}r:(hX on your h j:ubj)r:}r:(hX:class:`LogLineObserver`r:h j:jjq)h!jh}r:(UreftypeXclassjjXLogLineObserverU refdomainXpyr:h]h]U refexplicith]h]h]jjUjX NjY NujMh]r;j})r;}r;(hj:h}r;(h]h]r;(jj:Xpy-classr;eh]h]h]uh j:h]r;hXLogLineObserverr;r;}r ;(hUh j;ubah!jubaubhX instance. Use r ;r ;}r ;(hX instance. Use h j:ubj})r ;}r;(hX``sys.maxint``h}r;(h]h]h]h]h]uh j:h]r;hX sys.maxintr;r;}r;(hUh j ;ubah!jubhX for effective infinity.)r;r;}r;(hX for effective infinity.)h j:ubeubj)r;}r;(hXFor example, let's take a look at the :class:`TrialTestCaseCounter`, which is used by the :bb:step:`Trial` step to count test cases as they are run. As Trial executes, it emits lines like the following:h jA:jjq)h!jh}r;(h]h]h]h]h]ujMjj)h]r;(hX&For example, let's take a look at the r;r;}r;(hX&For example, let's take a look at the h j;ubj)r;}r;(hX:class:`TrialTestCaseCounter`r ;h j;jjq)h!jh}r!;(UreftypeXclassjjXTrialTestCaseCounterU refdomainXpyr";h]h]U refexplicith]h]h]jjUjX NjY NujMh]r#;j})r$;}r%;(hj ;h}r&;(h]h]r';(jj";Xpy-classr(;eh]h]h]uh j;h]r);hXTrialTestCaseCounterr*;r+;}r,;(hUh j$;ubah!jubaubhX, which is used by the r-;r.;}r/;(hX, which is used by the h j;ubj)r0;}r1;(hX:bb:step:`Trial`r2;h j;jjq)h!jh}r3;(UreftypeXstepjjXTrialU refdomainXbbr4;h]h]U refexplicith]h]h]jjUujMh]r5;j})r6;}r7;(hj2;h}r8;(h]h]r9;(jj4;Xbb-stepr:;eh]h]h]uh j0;h]r;;hXTrialr<;r=;}r>;(hUh j6;ubah!jubaubhX` step to count test cases as they are run. As Trial executes, it emits lines like the following:r?;r@;}rA;(hX` step to count test cases as they are run. As Trial executes, it emits lines like the following:h j;ubeubj)rB;}rC;(hXbuildbot.test.test_config.ConfigTest.testDebugPassword ... [OK] buildbot.test.test_config.ConfigTest.testEmpty ... [OK] buildbot.test.test_config.ConfigTest.testIRC ... [FAIL] buildbot.test.test_config.ConfigTest.testLocks ... [OK]h jA:jjq)h!jh}rD;(jjXnonejjh]h]h]h]h]ujMjj)h]rE;hXbuildbot.test.test_config.ConfigTest.testDebugPassword ... [OK] buildbot.test.test_config.ConfigTest.testEmpty ... [OK] buildbot.test.test_config.ConfigTest.testIRC ... [FAIL] buildbot.test.test_config.ConfigTest.testLocks ... [OK]rF;rG;}rH;(hUh jB;ubaubj)rI;}rJ;(hXWhen the tests are finished, trial emits a long line of `======` and then some lines which summarize the tests that failed. We want to avoid parsing these trailing lines, because their format is less well-defined than the `[OK]` lines.h jA:jjq)h!jh}rK;(h]h]h]h]h]ujM jj)h]rL;(hX8When the tests are finished, trial emits a long line of rM;rN;}rO;(hX8When the tests are finished, trial emits a long line of h jI;ubj)rP;}rQ;(hX`======`h}rR;(h]h]h]h]h]uh jI;h]rS;hX======rT;rU;}rV;(hUh jP;ubah!jubhX and then some lines which summarize the tests that failed. We want to avoid parsing these trailing lines, because their format is less well-defined than the rW;rX;}rY;(hX and then some lines which summarize the tests that failed. We want to avoid parsing these trailing lines, because their format is less well-defined than the h jI;ubj)rZ;}r[;(hX`[OK]`h}r\;(h]h]h]h]h]uh jI;h]r];hX[OK]r^;r_;}r`;(hUh jZ;ubah!jubhX lines.ra;rb;}rc;(hX lines.h jI;ubeubj)rd;}re;(hXA simple version of the parser for this output looks like this. The full version is in :bb:src:`master/buildbot/steps/python_twisted.py`.h jA:jjq)h!jh}rf;(h]h]h]h]h]ujMjj)h]rg;(hXWA simple version of the parser for this output looks like this. The full version is in rh;ri;}rj;(hXWA simple version of the parser for this output looks like this. The full version is in h jd;ubj,)rk;}rl;(hUh}rm;(Ureftitlern;X'master/buildbot/steps/python_twisted.pyro;j5XXhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/steps/python_twisted.pyh]h]h]h]h]uh jd;h]rp;j})rq;}rr;(hjo;h}rs;(h]h]h]h]h]uh jk;h]rt;hX'master/buildbot/steps/python_twisted.pyru;rv;}rw;(hUh jq;ubah!jubah!j,ubhX.rx;}ry;(hX.h jd;ubeubj)rz;}r{;(hX8from buildbot.process.logobserver import LogLineObserver class TrialTestCaseCounter(LogLineObserver): _line_re = re.compile(r'^([\w\.]+) \.\.\. \[([^\]]+)\]$') numTests = 0 finished = False def outLineReceived(self, line): if self.finished: return if line.startswith("=" * 40): self.finished = True return m = self._line_re.search(line.strip()) if m: testname, result = m.groups() self.numTests += 1 self.step.setProgress('tests', self.numTests)h jA:jjq)h!jh}r|;(jjXpythonjjh]h]h]h]h]ujMjj)h]r};hX8from buildbot.process.logobserver import LogLineObserver class TrialTestCaseCounter(LogLineObserver): _line_re = re.compile(r'^([\w\.]+) \.\.\. \[([^\]]+)\]$') numTests = 0 finished = False def outLineReceived(self, line): if self.finished: return if line.startswith("=" * 40): self.finished = True return m = self._line_re.search(line.strip()) if m: testname, result = m.groups() self.numTests += 1 self.step.setProgress('tests', self.numTests)r~;r;}r;(hUh jz;ubaubj)r;}r;(hXAThis parser only pays attention to stdout, since that's where trial writes the progress lines. It has a mode flag named ``finished`` to ignore everything after the ``====`` marker, and a scary-looking regular expression to match each line while hopefully ignoring other messages that might get displayed as the test runs.h jA:jjq)h!jh}r;(h]h]h]h]h]ujM*jj)h]r;(hXxThis parser only pays attention to stdout, since that's where trial writes the progress lines. It has a mode flag named r;r;}r;(hXxThis parser only pays attention to stdout, since that's where trial writes the progress lines. It has a mode flag named h j;ubj})r;}r;(hX ``finished``h}r;(h]h]h]h]h]uh j;h]r;hXfinishedr;r;}r;(hUh j;ubah!jubhX to ignore everything after the r;r;}r;(hX to ignore everything after the h j;ubj})r;}r;(hX``====``h}r;(h]h]h]h]h]uh j;h]r;hX====r;r;}r;(hUh j;ubah!jubhX marker, and a scary-looking regular expression to match each line while hopefully ignoring other messages that might get displayed as the test runs.r;r;}r;(hX marker, and a scary-looking regular expression to match each line while hopefully ignoring other messages that might get displayed as the test runs.h j;ubeubj)r;}r;(hXEach time it identifies a test has been completed, it increments its counter and delivers the new progress value to the step with ``self.step.setProgress``. This helps Buildbot to determine the ETA for the step.h jA:jjq)h!jh}r;(h]h]h]h]h]ujM0jj)h]r;(hXEach time it identifies a test has been completed, it increments its counter and delivers the new progress value to the step with r;r;}r;(hXEach time it identifies a test has been completed, it increments its counter and delivers the new progress value to the step with h j;ubj})r;}r;(hX``self.step.setProgress``h}r;(h]h]h]h]h]uh j;h]r;hXself.step.setProgressr;r;}r;(hUh j;ubah!jubhX8. This helps Buildbot to determine the ETA for the step.r;r;}r;(hX8. This helps Buildbot to determine the ETA for the step.h j;ubeubj)r;}r;(hXpTo connect this parser into the :bb:step:`Trial` build step, ``Trial.__init__`` ends with the following clause::h jA:jjq)h!jh}r;(h]h]h]h]h]ujM4jj)h]r;(hX To connect this parser into the r;r;}r;(hX To connect this parser into the h j;ubj)r;}r;(hX:bb:step:`Trial`r;h j;jjq)h!jh}r;(UreftypeXstepjjXTrialU refdomainXbbr;h]h]U refexplicith]h]h]jjUujM4h]r;j})r;}r;(hj;h}r;(h]h]r;(jj;Xbb-stepr;eh]h]h]uh j;h]r;hXTrialr;r;}r;(hUh j;ubah!jubaubhX build step, r;r;}r;(hX build step, h j;ubj})r;}r;(hX``Trial.__init__``h}r;(h]h]h]h]h]uh j;h]r;hXTrial.__init__r;r;}r;(hUh j;ubah!jubhX ends with the following clause:r;r;}r;(hX ends with the following clause:h j;ubeubj)r;}r;(hX# this counter will feed Progress along the 'test cases' metric counter = TrialTestCaseCounter() self.addLogObserver('stdio', counter) self.progressMetrics += ('tests',)h jA:jjq)h!jh}r;(jjh]h]h]h]h]ujM7jj)h]r;hX# this counter will feed Progress along the 'test cases' metric counter = TrialTestCaseCounter() self.addLogObserver('stdio', counter) self.progressMetrics += ('tests',)r;r;}r;(hUh j;ubaubj)r;}r;(hXThis creates a :class:`TrialTestCaseCounter` and tells the step that the counter wants to watch the :file:`stdio` log. The observer is automatically given a reference to the step in its :attr:`step` attribute.h jA:jjq)h!jh}r;(h]h]h]h]h]ujM<jj)h]r;(hXThis creates a r;r;}r;(hXThis creates a h j;ubj)r;}r;(hX:class:`TrialTestCaseCounter`r;h j;jjq)h!jh}r;(UreftypeXclassjjXTrialTestCaseCounterU refdomainXpyr;h]h]U refexplicith]h]h]jjUjX NjY NujM<h]r;j})r;}r;(hj;h}r;(h]h]r;(jj;Xpy-classr;eh]h]h]uh j;h]r;hXTrialTestCaseCounterr;r;}r;(hUh j;ubah!jubaubhX8 and tells the step that the counter wants to watch the r;r;}r;(hX8 and tells the step that the counter wants to watch the h j;ubj})r;}r;(hUh}r;(h]h]h]h]r;Xfiler;aUrolej;h]uh j;h]r;hXstdior;r;}r;(hXstdioh j;ubah!jubhXI log. The observer is automatically given a reference to the step in its r;r;}r;(hXI log. The observer is automatically given a reference to the step in its h j;ubj)r;}r;(hX :attr:`step`r;h j;jjq)h!jh}r;(UreftypeXattrjjXstepU refdomainXpyr<h]h]U refexplicith]h]h]jjUjX NjY NujM<h]r<j})r<}r<(hj;h}r<(h]h]r<(jj<Xpy-attrr<eh]h]h]uh j;h]r<hXstepr<r <}r <(hUh j<ubah!jubaubhX attribute.r <r <}r <(hX attribute.h j;ubeubeubj,j)j+j,j`,jc,j.j.jv/j{/j/jI.Uindex-3r<j)r<}r<(hUh j)jjq)j}h!jh}r<(h]h]h]h]r<(j)j<eh]r<j)aujMWjj)j}r<j<j)r<}r<(hUh j)r<}r<(hUh j)jjq)h!jh}r<(h]h]h]h]r<j)ah]r<j)aujMBjj)h]r<(h)r<}r<(hXUsing Propertiesr<h j<jjq)h!h"h}r <(h]h]h]h]h]ujMBjj)h]r!<hXUsing Propertiesr"<r#<}r$<(hj<h j<ubaubj)r%<}r&<(hX In custom :class:`BuildSteps`, you can get and set the build properties with the :meth:`getProperty` and :meth:`setProperty` methods. Each takes a string for the name of the property, and returns or accepts an arbitrary JSON-able (lists, dicts, strings, and numbers) object. For example::h j<jjq)h!jh}r'<(h]h]h]h]h]ujMDjj)h]r(<(hX In custom r)<r*<}r+<(hX In custom h j%<ubj)r,<}r-<(hX:class:`BuildSteps`r.<h j%<jjq)h!jh}r/<(UreftypeXclassjjX BuildStepsU refdomainXpyr0<h]h]U refexplicith]h]h]jjUjX NjY NujMDh]r1<j})r2<}r3<(hj.<h}r4<(h]h]r5<(jj0<Xpy-classr6<eh]h]h]uh j,<h]r7<hX BuildStepsr8<r9<}r:<(hUh j2<ubah!jubaubhX4, you can get and set the build properties with the r;<r<<}r=<(hX4, you can get and set the build properties with the h j%<ubj)r><}r?<(hX:meth:`getProperty`r@<h j%<jjq)h!jh}rA<(UreftypeXmethjjX getPropertyU refdomainXpyrB<h]h]U refexplicith]h]h]jjUjX NjY NujMDh]rC<j})rD<}rE<(hj@<h}rF<(h]h]rG<(jjB<Xpy-methrH<eh]h]h]uh j><h]rI<hX getPropertyrJ<rK<}rL<(hUh jD<ubah!jubaubhX and rM<rN<}rO<(hX and h j%<ubj)rP<}rQ<(hX:meth:`setProperty`rR<h j%<jjq)h!jh}rS<(UreftypeXmethjjX setPropertyU refdomainXpyrT<h]h]U refexplicith]h]h]jjUjX NjY NujMDh]rU<j})rV<}rW<(hjR<h}rX<(h]h]rY<(jjT<Xpy-methrZ<eh]h]h]uh jP<h]r[<hX setPropertyr\<r]<}r^<(hUh jV<ubah!jubaubhX methods. Each takes a string for the name of the property, and returns or accepts an arbitrary JSON-able (lists, dicts, strings, and numbers) object. For example:r_<r`<}ra<(hX methods. Each takes a string for the name of the property, and returns or accepts an arbitrary JSON-able (lists, dicts, strings, and numbers) object. For example:h j%<ubeubj)rb<}rc<(hXclass MakeTarball(ShellCommand): def start(self): if self.getProperty("os") == "win": self.setCommand([ ... ]) # windows-only command else: self.setCommand([ ... ]) # equivalent for other systems ShellCommand.start(self)h j<jjq)h!jh}rd<(jjh]h]h]h]h]ujMIjj)h]re<hXclass MakeTarball(ShellCommand): def start(self): if self.getProperty("os") == "win": self.setCommand([ ... ]) # windows-only command else: self.setCommand([ ... ]) # equivalent for other systems ShellCommand.start(self)rf<rg<}rh<(hUh jb<ubaubj)ri<}rj<(hX$Remember that properties set in a step may not be available until the next step begins. In particular, any :class:`Property` or :class:`Interpolate` instances for the current step are interpolated before the step starts, so they cannot use the value of any properties determined in that step.h j<jjq)h!jh}rk<(h]h]h]h]h]ujMQjj)h]rl<(hXkRemember that properties set in a step may not be available until the next step begins. In particular, any rm<rn<}ro<(hXkRemember that properties set in a step may not be available until the next step begins. In particular, any h ji<ubj)rp<}rq<(hX:class:`Property`rr<h ji<jjq)h!jh}rs<(UreftypeXclassjjXPropertyU refdomainXpyrt<h]h]U refexplicith]h]h]jjUjX NjY NujMQh]ru<j})rv<}rw<(hjr<h}rx<(h]h]ry<(jjt<Xpy-classrz<eh]h]h]uh jp<h]r{<hXPropertyr|<r}<}r~<(hUh jv<ubah!jubaubhX or r<r<}r<(hX or h ji<ubj)r<}r<(hX:class:`Interpolate`r<h ji<jjq)h!jh}r<(UreftypeXclassjjX InterpolateU refdomainXpyr<h]h]U refexplicith]h]h]jjUjX NjY NujMQh]r<j})r<}r<(hj<h}r<(h]h]r<(jj<Xpy-classr<eh]h]h]uh j<h]r<hX Interpolater<r<}r<(hUh j<ubah!jubaubhX instances for the current step are interpolated before the step starts, so they cannot use the value of any properties determined in that step.r<r<}r<(hX instances for the current step are interpolated before the step starts, so they cannot use the value of any properties determined in that step.h ji<ubeubj[)r<}r<(hUh j<jjq)h!j^h}r<(h]h]h]h]h]j]r<((j+Xlinksj<Utr<(j+XBuildStep URLsj<Utr<(j+XaddURLj<Utr<ej.ujMTjj)h]ubj<eubjjq)h!jh}r<(h]h]h]h]h]jj<ujMUjj)h]ubsh]r<(h)r<}r<(hXUsing Statisticsr<h j<jjq)h!h"h}r<(h]h]h]h]h]ujMWjj)h]r<hXUsing Statisticsr<r<}r<(hj<h j<ubaubj)r<}r<(hXStatistics can be generated for each step, and then summarized across all steps in a build. For example, a test step might set its ``warnings`` statistic to the number of warnings observed. The build could then sum the ``warnings`` on all steps to get a total number of warnings.h j<jjq)h!jh}r<(h]h]h]h]h]ujMYjj)h]r<(hXStatistics can be generated for each step, and then summarized across all steps in a build. For example, a test step might set its r<r<}r<(hXStatistics can be generated for each step, and then summarized across all steps in a build. For example, a test step might set its h j<ubj})r<}r<(hX ``warnings``h}r<(h]h]h]h]h]uh j<h]r<hXwarningsr<r<}r<(hUh j<ubah!jubhXL statistic to the number of warnings observed. The build could then sum the r<r<}r<(hXL statistic to the number of warnings observed. The build could then sum the h j<ubj})r<}r<(hX ``warnings``h}r<(h]h]h]h]h]uh j<h]r<hXwarningsr<r<}r<(hUh j<ubah!jubhX0 on all steps to get a total number of warnings.r<r<}r<(hX0 on all steps to get a total number of warnings.h j<ubeubj)r<}r<(hX!Statistics are set and retrieved with the :py:meth:`~buildbot.process.buildstep.BuildStep.setStatistic` and:py:meth:`~buildbot.process.buildstep.BuildStep.getStatistic` methods. The :py:meth:`~buildbot.process.buildstep.BuildStep.hasStatistic` method determines whether a statistic exists.h j<jjq)h!jh}r<(h]h]h]h]h]ujM]jj)h]r<(hX*Statistics are set and retrieved with the r<r<}r<(hX*Statistics are set and retrieved with the h j<ubj)r<}r<(hX=:py:meth:`~buildbot.process.buildstep.BuildStep.setStatistic`r<h j<jjq)h!jh}r<(UreftypeXmethjjX1buildbot.process.buildstep.BuildStep.setStatisticU refdomainXpyr<h]h]U refexplicith]h]h]jjUjX NjY NujM]h]r<j})r<}r<(hj<h}r<(h]h]r<(jj<Xpy-methr<eh]h]h]uh j<h]r<hX setStatisticr<r<}r<(hUh j<ubah!jubaubhX and:py:meth:r<r<}r<(hX and:py:meth:h j<ubj)r<}r<(hX4`~buildbot.process.buildstep.BuildStep.getStatistic`h}r<(h]h]h]h]h]uh j<h]r<hX2~buildbot.process.buildstep.BuildStep.getStatisticr<r<}r<(hUh j<ubah!jubhX methods. The r<r<}r<(hX methods. The h j<ubj)r<}r<(hX=:py:meth:`~buildbot.process.buildstep.BuildStep.hasStatistic`r<h j<jjq)h!jh}r<(UreftypeXmethjjX1buildbot.process.buildstep.BuildStep.hasStatisticU refdomainXpyr<h]h]U refexplicith]h]h]jjUjX NjY NujM]h]r<j})r<}r<(hj<h}r<(h]h]r<(jj<Xpy-methr<eh]h]h]uh j<h]r<hX hasStatisticr<r<}r<(hUh j<ubah!jubaubhX. method determines whether a statistic exists.r<r<}r<(hX. method determines whether a statistic exists.h j<ubeubj)r<}r<(hXThe Build method :py:meth:`~buildbot.process.build.Build.getSummaryStatistic` can be used to aggregate over all steps in a Build.h j<jjq)h!jh}r<(h]h]h]h]h]ujM`jj)h]r<(hXThe Build method r<r<}r<(hXThe Build method h j<ubj)r<}r<(hX<:py:meth:`~buildbot.process.build.Build.getSummaryStatistic`r<h j<jjq)h!jh}r<(UreftypeXmethjjX0buildbot.process.build.Build.getSummaryStatisticU refdomainXpyr=h]h]U refexplicith]h]h]jjUjX NjY NujM`h]r=j})r=}r=(hj<h}r=(h]h]r=(jj=Xpy-methr=eh]h]h]uh j<h]r=hXgetSummaryStatisticr=r =}r =(hUh j=ubah!jubaubhX4 can be used to aggregate over all steps in a Build.r =r =}r =(hX4 can be used to aggregate over all steps in a Build.h j<ubeubeubj2jN.j)jt9j,j,j)j,j)j6jj-j)jX.j+j+jjA:jUjH6jWj^1j)j^*j)j<j)j)r=}r=(hUh j)jjq)h!jh}r=(h]h]h]h]r=j)ah]r=j)aujMjj)h]r=(h)r=}r=(hXAbout Logfilesr=h j=jjq)h!h"h}r=(h]h]h]h]h]ujMjj)h]r=hXAbout Logfilesr=r=}r=(hj=h j=ubaubj)r=}r=(hXZEach BuildStep has a collection of log files. Each one has a short name, like `stdio` or `warnings`. Each log file contains an arbitrary amount of text, usually the contents of some output file generated during a build or test step, or a record of everything that was printed to :file:`stdout`/:file:`stderr` during the execution of some command.h j=jjq)h!jh}r=(h]h]h]h]h]ujMjj)h]r=(hXNEach BuildStep has a collection of log files. Each one has a short name, like r =r!=}r"=(hXNEach BuildStep has a collection of log files. Each one has a short name, like h j=ubj)r#=}r$=(hX`stdio`h}r%=(h]h]h]h]h]uh j=h]r&=hXstdior'=r(=}r)=(hUh j#=ubah!jubhX or r*=r+=}r,=(hX or h j=ubj)r-=}r.=(hX `warnings`h}r/=(h]h]h]h]h]uh j=h]r0=hXwarningsr1=r2=}r3=(hUh j-=ubah!jubhX. Each log file contains an arbitrary amount of text, usually the contents of some output file generated during a build or test step, or a record of everything that was printed to r4=r5=}r6=(hX. Each log file contains an arbitrary amount of text, usually the contents of some output file generated during a build or test step, or a record of everything that was printed to h j=ubj})r7=}r8=(hUh}r9=(h]h]h]h]r:=Xfiler;=aUrolej;=h]uh j=h]r<=hXstdoutr==r>=}r?=(hXstdouth j7=ubah!jubhX/r@=}rA=(hX/h j=ubj})rB=}rC=(hUh}rD=(h]h]h]h]rE=XfilerF=aUrolejF=h]uh j=h]rG=hXstderrrH=rI=}rJ=(hXstderrh jB=ubah!jubhX& during the execution of some command.rK=rL=}rM=(hX& during the execution of some command.h j=ubeubj)rN=}rO=(hX Each can contain multiple `channels`, generally limited to three basic ones: stdout, stderr, and `headers`. For example, when a shell command runs, it writes a few lines to the headers channel to indicate the exact argv strings being run, which directory the command is being executed in, and the contents of the current environment variables. Then, as the command runs, it adds a lot of :file:`stdout` and :file:`stderr` messages. When the command finishes, a final `header` line is added with the exit code of the process.h j=jjq)h!jh}rP=(h]h]h]h]h]ujMjj)h]rQ=(hXEach can contain multiple rR=rS=}rT=(hXEach can contain multiple h jN=ubj)rU=}rV=(hX `channels`h}rW=(h]h]h]h]h]uh jN=h]rX=hXchannelsrY=rZ=}r[=(hUh jU=ubah!jubhX=, generally limited to three basic ones: stdout, stderr, and r\=r]=}r^=(hX=, generally limited to three basic ones: stdout, stderr, and h jN=ubj)r_=}r`=(hX `headers`h}ra=(h]h]h]h]h]uh jN=h]rb=hXheadersrc=rd=}re=(hUh j_=ubah!jubhX. For example, when a shell command runs, it writes a few lines to the headers channel to indicate the exact argv strings being run, which directory the command is being executed in, and the contents of the current environment variables. Then, as the command runs, it adds a lot of rf=rg=}rh=(hX. For example, when a shell command runs, it writes a few lines to the headers channel to indicate the exact argv strings being run, which directory the command is being executed in, and the contents of the current environment variables. Then, as the command runs, it adds a lot of h jN=ubj})ri=}rj=(hUh}rk=(h]h]h]h]rl=Xfilerm=aUrolejm=h]uh jN=h]rn=hXstdoutro=rp=}rq=(hXstdouth ji=ubah!jubhX and rr=rs=}rt=(hX and h jN=ubj})ru=}rv=(hUh}rw=(h]h]h]h]rx=Xfilery=aUrolejy=h]uh jN=h]rz=hXstderrr{=r|=}r}=(hXstderrh ju=ubah!jubhX. messages. When the command finishes, a final r~=r=}r=(hX. messages. When the command finishes, a final h jN=ubj)r=}r=(hX`header`h}r=(h]h]h]h]h]uh jN=h]r=hXheaderr=r=}r=(hUh j=ubah!jubhX1 line is added with the exit code of the process.r=r=}r=(hX1 line is added with the exit code of the process.h jN=ubeubj)r=}r=(hXStatus display plugins can format these different channels in different ways. For example, the web page shows log files as text/html, with header lines in blue text, stdout in black, and stderr in red. A different URL is available which provides a text/plain format, in which stdout and stderr are collapsed together, and header lines are stripped completely. This latter option makes it easy to save the results to a file and run :command:`grep` or whatever against the output.h j=jjq)h!jh}r=(h]h]h]h]h]ujMjj)h]r=(hXStatus display plugins can format these different channels in different ways. For example, the web page shows log files as text/html, with header lines in blue text, stdout in black, and stderr in red. A different URL is available which provides a text/plain format, in which stdout and stderr are collapsed together, and header lines are stripped completely. This latter option makes it easy to save the results to a file and run r=r=}r=(hXStatus display plugins can format these different channels in different ways. For example, the web page shows log files as text/html, with header lines in blue text, stdout in black, and stderr in red. A different URL is available which provides a text/plain format, in which stdout and stderr are collapsed together, and header lines are stripped completely. This latter option makes it easy to save the results to a file and run h j=ubjM)r=}r=(hX:command:`grep`h}r=(h]h]r=jRah]h]h]uh j=h]r=hXgrepr=r=}r=(hUh j=ubah!jWubhX or whatever against the output.r=r=}r=(hX or whatever against the output.h j=ubeubeubj)j-j)j)jj7j)j)r=}r=(hUh j)jjq)h!jh}r=(h]h]h]h]r=j)ah]r=j)aujMjj)h]r=(h)r=}r=(hX.Writing a New Latent Buildslave Implementationr=h j=jjq)h!h"h}r=(h]h]h]h]h]ujMjj)h]r=hX.Writing a New Latent Buildslave Implementationr=r=}r=(hj=h j=ubaubj)r=}r=(hXWriting a new latent buildslave should only require subclassing :class:`buildbot.buildslave.AbstractLatentBuildSlave` and implementing :meth:`start_instance` and :meth:`stop_instance`. ::h j=jjq)h!jh}r=(h]h]h]h]h]ujMjj)h]r=(hX@Writing a new latent buildslave should only require subclassing r=r=}r=(hX@Writing a new latent buildslave should only require subclassing h j=ubj)r=}r=(hX5:class:`buildbot.buildslave.AbstractLatentBuildSlave`r=h j=jjq)h!jh}r=(UreftypeXclassjjX,buildbot.buildslave.AbstractLatentBuildSlaveU refdomainXpyr=h]h]U refexplicith]h]h]jjUjX NjY NujMh]r=j})r=}r=(hj=h}r=(h]h]r=(jj=Xpy-classr=eh]h]h]uh j=h]r=hX,buildbot.buildslave.AbstractLatentBuildSlaver=r=}r=(hUh j=ubah!jubaubhX and implementing r=r=}r=(hX and implementing h j=ubj)r=}r=(hX:meth:`start_instance`r=h j=jjq)h!jh}r=(UreftypeXmethjjXstart_instanceU refdomainXpyr=h]h]U refexplicith]h]h]jjUjX NjY NujMh]r=j})r=}r=(hj=h}r=(h]h]r=(jj=Xpy-methr=eh]h]h]uh j=h]r=hXstart_instancer=r=}r=(hUh j=ubah!jubaubhX and r=r=}r=(hX and h j=ubj)r=}r=(hX:meth:`stop_instance`r=h j=jjq)h!jh}r=(UreftypeXmethjjX stop_instanceU refdomainXpyr=h]h]U refexplicith]h]h]jjUjX NjY NujMh]r=j})r=}r=(hj=h}r=(h]h]r=(jj=Xpy-methr=eh]h]h]uh j=h]r=hX stop_instancer=r=}r=(hUh j=ubah!jubaubhX.r=}r=(hX.h j=ubeubj)r=}r=(hXdef start_instance(self): # responsible for starting instance that will try to connect with this # master. Should return deferred. Problems should use an errback. The # callback value can be None, or can be an iterable of short strings to # include in the "substantiate success" status message, such as # identifying the instance that started. raise NotImplementedError def stop_instance(self, fast=False): # responsible for shutting down instance. Return a deferred. If `fast`, # we're trying to shut the master down, so callback as soon as is safe. # Callback value is ignored. raise NotImplementedErrorh j=jjq)h!jh}r=(jjh]h]h]h]h]ujMjj)h]r=hXdef start_instance(self): # responsible for starting instance that will try to connect with this # master. Should return deferred. Problems should use an errback. The # callback value can be None, or can be an iterable of short strings to # include in the "substantiate success" status message, such as # identifying the instance that started. raise NotImplementedError def stop_instance(self, fast=False): # responsible for shutting down instance. Return a deferred. If `fast`, # we're trying to shut the master down, so callback as soon as is safe. # Callback value is ignored. raise NotImplementedErrorr=r=}r=(hUh j=ubaubj)r=}r=(hXSee :class:`buildbot.ec2buildslave.EC2LatentBuildSlave` for an example, or see the test example :class:`buildbot.test_slaves.FakeLatentBuildSlave`.h j=jjq)h!jh}r=(h]h]h]h]h]ujMjj)h]r=(hXSee r=r=}r=(hXSee h j=ubj)r=}r=(hX3:class:`buildbot.ec2buildslave.EC2LatentBuildSlave`r=h j=jjq)h!jh}r=(UreftypeXclassjjX*buildbot.ec2buildslave.EC2LatentBuildSlaveU refdomainXpyr=h]h]U refexplicith]h]h]jjUjX NjY NujMh]r=j})r=}r=(hj=h}r=(h]h]r=(jj=Xpy-classr=eh]h]h]uh j=h]r>hX*buildbot.ec2buildslave.EC2LatentBuildSlaver>r>}r>(hUh j=ubah!jubaubhX) for an example, or see the test example r>r>}r>(hX) for an example, or see the test example h j=ubj)r>}r>(hX2:class:`buildbot.test_slaves.FakeLatentBuildSlave`r >h j=jjq)h!jh}r >(UreftypeXclassjjX)buildbot.test_slaves.FakeLatentBuildSlaveU refdomainXpyr >h]h]U refexplicith]h]h]jjUjX NjY NujMh]r >j})r >}r>(hj >h}r>(h]h]r>(jj >Xpy-classr>eh]h]h]uh j>h]r>hX)buildbot.test_slaves.FakeLatentBuildSlaver>r>}r>(hUh j >ubah!jubaubhX.r>}r>(hX.h j=ubeubeubjFjo9j)j<j)j)r>}r>(hUh j)jjq)h!jh}r>(h]h]h]h]r>j)ah]r>j)aujMjj)h]r>(h)r>}r>(hXWriting Log Filesr >h j>jjq)h!h"h}r!>(h]h]h]h]h]ujMjj)h]r">hXWriting Log Filesr#>r$>}r%>(hj >h j>ubaubj)r&>}r'>(hXMost commonly, logfiles come from commands run on the build slave. Internally, these are configured by supplying the :class:`~buildbot.process.remotecommand.RemoteCommand` instance with log files via the :meth:`~buildbot.process.remoteCommand.RemoteCommand.useLog` method::h j>jjq)h!jh}r(>(h]h]h]h]h]ujMjj)h]r)>(hXuMost commonly, logfiles come from commands run on the build slave. Internally, these are configured by supplying the r*>r+>}r,>(hXuMost commonly, logfiles come from commands run on the build slave. Internally, these are configured by supplying the h j&>ubj)r->}r.>(hX6:class:`~buildbot.process.remotecommand.RemoteCommand`r/>h j&>jjq)h!jh}r0>(UreftypeXclassjjX,buildbot.process.remotecommand.RemoteCommandU refdomainXpyr1>h]h]U refexplicith]h]h]jjUjX NjY NujMh]r2>j})r3>}r4>(hj/>h}r5>(h]h]r6>(jj1>Xpy-classr7>eh]h]h]uh j->h]r8>hX RemoteCommandr9>r:>}r;>(hUh j3>ubah!jubaubhX! instance with log files via the r<>r=>}r>>(hX! instance with log files via the h j&>ubj)r?>}r@>(hX<:meth:`~buildbot.process.remoteCommand.RemoteCommand.useLog`rA>h j&>jjq)h!jh}rB>(UreftypeXmethjjX3buildbot.process.remoteCommand.RemoteCommand.useLogU refdomainXpyrC>h]h]U refexplicith]h]h]jjUjX NjY NujMh]rD>j})rE>}rF>(hjA>h}rG>(h]h]rH>(jjC>Xpy-methrI>eh]h]h]uh j?>h]rJ>hXuseLogrK>rL>}rM>(hUh jE>ubah!jubaubhX method:rN>rO>}rP>(hX method:h j&>ubeubj)rQ>}rR>(hX@defer.inlineCallbacks def run(self): ... log = yield self.addLog('stdio') cmd.useLog(log, closeWhenFinished=True, 'stdio') yield self.runCommand(cmd)h j>jjq)h!jh}rS>(jjh]h]h]h]h]ujMjj)h]rT>hX@defer.inlineCallbacks def run(self): ... log = yield self.addLog('stdio') cmd.useLog(log, closeWhenFinished=True, 'stdio') yield self.runCommand(cmd)rU>rV>}rW>(hUh jQ>ubaubj)rX>}rY>(hXThe name passed to :meth:`~buildbot.process.remoteCommand.RemoteCommand.useLog` must match that configured in the command. In this case, ``stdio`` is the default.h j>jjq)h!jh}rZ>(h]h]h]h]h]ujMjj)h]r[>(hXThe name passed to r\>r]>}r^>(hXThe name passed to h jX>ubj)r_>}r`>(hX<:meth:`~buildbot.process.remoteCommand.RemoteCommand.useLog`ra>h jX>jjq)h!jh}rb>(UreftypeXmethjjX3buildbot.process.remoteCommand.RemoteCommand.useLogU refdomainXpyrc>h]h]U refexplicith]h]h]jjUjX NjY NujMh]rd>j})re>}rf>(hja>h}rg>(h]h]rh>(jjc>Xpy-methri>eh]h]h]uh j_>h]rj>hXuseLogrk>rl>}rm>(hUh je>ubah!jubaubhX: must match that configured in the command. In this case, rn>ro>}rp>(hX: must match that configured in the command. In this case, h jX>ubj})rq>}rr>(hX ``stdio``h}rs>(h]h]h]h]h]uh jX>h]rt>hXstdioru>rv>}rw>(hUh jq>ubah!jubhX is the default.rx>ry>}rz>(hX is the default.h jX>ubeubj)r{>}r|>(hXIf the log file was already added by another part of the step, it can be retrieved with :meth:`~buildbot.process.buildstep.BuildStep.getLog`::h j>jjq)h!jh}r}>(h]h]h]h]h]ujMjj)h]r~>(hXXIf the log file was already added by another part of the step, it can be retrieved with r>r>}r>(hXXIf the log file was already added by another part of the step, it can be retrieved with h j{>ubj)r>}r>(hX4:meth:`~buildbot.process.buildstep.BuildStep.getLog`r>h j{>jjq)h!jh}r>(UreftypeXmethjjX+buildbot.process.buildstep.BuildStep.getLogU refdomainXpyr>h]h]U refexplicith]h]h]jjUjX NjY NujMh]r>j})r>}r>(hj>h}r>(h]h]r>(jj>Xpy-methr>eh]h]h]uh j>h]r>hXgetLogr>r>}r>(hUh j>ubah!jubaubhX:r>}r>(hX:h j{>ubeubj)r>}r>(hXstdioLog = self.getLog('stdio')h j>jjq)h!jh}r>(jjh]h]h]h]h]ujMjj)h]r>hXstdioLog = self.getLog('stdio')r>r>}r>(hUh j>ubaubj)r>}r>(hXLess frequently, some master-side processing produces a log file. If this log file is short and easily stored in memory, this is as simple as a call to :meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog`::h j>jjq)h!jh}r>(h]h]h]h]h]ujMjj)h]r>(hXLess frequently, some master-side processing produces a log file. If this log file is short and easily stored in memory, this is as simple as a call to r>r>}r>(hXLess frequently, some master-side processing produces a log file. If this log file is short and easily stored in memory, this is as simple as a call to h j>ubj)r>}r>(hX<:meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog`r>h j>jjq)h!jh}r>(UreftypeXmethjjX3buildbot.process.buildstep.BuildStep.addCompleteLogU refdomainXpyr>h]h]U refexplicith]h]h]jjUjX NjY NujMh]r>j})r>}r>(hj>h}r>(h]h]r>(jj>Xpy-methr>eh]h]h]uh j>h]r>hXaddCompleteLogr>r>}r>(hUh j>ubah!jubaubhX:r>}r>(hX:h j>ubeubj)r>}r>(hX@defer.inlineCallbacks def run(self): ... summary = u'\n'.join('%s: %s' % (k, count) for (k, count) in self.lint_results.iteritems()) yield self.addCompleteLog('summary', summary)h j>jjq)h!jh}r>(jjh]h]h]h]h]ujMjj)h]r>hX@defer.inlineCallbacks def run(self): ... summary = u'\n'.join('%s: %s' % (k, count) for (k, count) in self.lint_results.iteritems()) yield self.addCompleteLog('summary', summary)r>r>}r>(hUh j>ubaubj)r>}r>(hX4Note that the log contents must be a unicode string.r>h j>jjq)h!jh}r>(h]h]h]h]h]ujMjj)h]r>hX4Note that the log contents must be a unicode string.r>r>}r>(hj>h j>ubaubj)r>}r>(hX[Longer logfiles can be constructed line-by-line using the ``add`` methods of the log file::h j>jjq)h!jh}r>(h]h]h]h]h]ujMjj)h]r>(hX:Longer logfiles can be constructed line-by-line using the r>r>}r>(hX:Longer logfiles can be constructed line-by-line using the h j>ubj})r>}r>(hX``add``h}r>(h]h]h]h]h]uh j>h]r>hXaddr>r>}r>(hUh j>ubah!jubhX methods of the log file:r>r>}r>(hX methods of the log file:h j>ubeubj)r>}r>(hX@defer.inlineCallbacks def run(self): ... updates = yield self.addLog('updates') while True: ... yield updates.addStdout(some_update)h j>jjq)h!jh}r>(jjh]h]h]h]h]ujMjj)h]r>hX@defer.inlineCallbacks def run(self): ... updates = yield self.addLog('updates') while True: ... yield updates.addStdout(some_update)r>r>}r>(hUh j>ubaubj)r>}r>(hX8Again, note that the log input must be a unicode string.r>h j>jjq)h!jh}r>(h]h]h]h]h]ujMjj)h]r>hX8Again, note that the log input must be a unicode string.r>r>}r>(hj>h j>ubaubj)r>}r>(hX Finally, :meth:`~buildbot.process.buildstep.BuildStep.addHTMLLog` is similar to :meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog`, but the resulting log will be tagged as containing HTML. The web UI will display the contents of the log using the browser.h j>jjq)h!jh}r>(h]h]h]h]h]ujMjj)h]r>(hX Finally, r>r>}r>(hX Finally, h j>ubj)r>}r>(hX8:meth:`~buildbot.process.buildstep.BuildStep.addHTMLLog`r>h j>jjq)h!jh}r>(UreftypeXmethjjX/buildbot.process.buildstep.BuildStep.addHTMLLogU refdomainXpyr>h]h]U refexplicith]h]h]jjUjX NjY NujMh]r>j})r>}r>(hj>h}r>(h]h]r>(jj>Xpy-methr>eh]h]h]uh j>h]r>hX addHTMLLogr>r>}r>(hUh j>ubah!jubaubhX is similar to r>r>}r>(hX is similar to h j>ubj)r>}r>(hX<:meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog`r>h j>jjq)h!jh}r>(UreftypeXmethjjX3buildbot.process.buildstep.BuildStep.addCompleteLogU refdomainXpyr>h]h]U refexplicith]h]h]jjUjX NjY NujMh]r>j})r?}r?(hj>h}r?(h]h]r?(jj>Xpy-methr?eh]h]h]uh j>h]r?hXaddCompleteLogr?r?}r?(hUh j?ubah!jubaubhX}, but the resulting log will be tagged as containing HTML. The web UI will display the contents of the log using the browser.r ?r ?}r ?(hX}, but the resulting log will be tagged as containing HTML. The web UI will display the contents of the log using the browser.h j>ubeubj)r ?}r ?(hXhThe ``logfiles=`` argument to :bb:step:`ShellCommand` and its subclasses creates new log files and fills them in realtime by asking the buildslave to watch a actual file on disk. The buildslave will look for additions in the target file and report them back to the :class:`BuildStep`. These additions will be added to the log file by calling :meth:`addStdout`.h j>jjq)h!jh}r?(h]h]h]h]h]ujMjj)h]r?(hXThe r?r?}r?(hXThe h j ?ubj})r?}r?(hX ``logfiles=``h}r?(h]h]h]h]h]uh j ?h]r?hX logfiles=r?r?}r?(hUh j?ubah!jubhX argument to r?r?}r?(hX argument to h j ?ubj)r?}r?(hX:bb:step:`ShellCommand`r?h j ?jjq)h!jh}r ?(UreftypeXstepjjX ShellCommandU refdomainXbbr!?h]h]U refexplicith]h]h]jjUujMh]r"?j})r#?}r$?(hj?h}r%?(h]h]r&?(jj!?Xbb-stepr'?eh]h]h]uh j?h]r(?hX ShellCommandr)?r*?}r+?(hUh j#?ubah!jubaubhX and its subclasses creates new log files and fills them in realtime by asking the buildslave to watch a actual file on disk. The buildslave will look for additions in the target file and report them back to the r,?r-?}r.?(hX and its subclasses creates new log files and fills them in realtime by asking the buildslave to watch a actual file on disk. The buildslave will look for additions in the target file and report them back to the h j ?ubj)r/?}r0?(hX:class:`BuildStep`r1?h j ?jjq)h!jh}r2?(UreftypeXclassjjX BuildStepU refdomainXpyr3?h]h]U refexplicith]h]h]jjUjX NjY NujMh]r4?j})r5?}r6?(hj1?h}r7?(h]h]r8?(jj3?Xpy-classr9?eh]h]h]uh j/?h]r:?hX BuildStepr;?r?r??}r@?(hX;. These additions will be added to the log file by calling h j ?ubj)rA?}rB?(hX:meth:`addStdout`rC?h j ?jjq)h!jh}rD?(UreftypeXmethjjX addStdoutU refdomainXpyrE?h]h]U refexplicith]h]h]jjUjX NjY NujMh]rF?j})rG?}rH?(hjC?h}rI?(h]h]rJ?(jjE?Xpy-methrK?eh]h]h]uh jA?h]rL?hX addStdoutrM?rN?}rO?(hUh jG?ubah!jubaubhX.rP?}rQ?(hX.h j ?ubeubj)rR?}rS?(hXAll log files can be used as the source of a :class:`~buildbot.process.logobserver.LogObserver` just like the normal :file:`stdio` :class:`LogFile`. In fact, it's possible for one :class:`~buildbot.process.logobserver.LogObserver` to observe a logfile created by another.h j>jjq)h!jh}rT?(h]h]h]h]h]ujMjj)h]rU?(hX-All log files can be used as the source of a rV?rW?}rX?(hX-All log files can be used as the source of a h jR?ubj)rY?}rZ?(hX2:class:`~buildbot.process.logobserver.LogObserver`r[?h jR?jjq)h!jh}r\?(UreftypeXclassjjX(buildbot.process.logobserver.LogObserverU refdomainXpyr]?h]h]U refexplicith]h]h]jjUjX NjY NujMh]r^?j})r_?}r`?(hj[?h}ra?(h]h]rb?(jj]?Xpy-classrc?eh]h]h]uh jY?h]rd?hX LogObserverre?rf?}rg?(hUh j_?ubah!jubaubhX just like the normal rh?ri?}rj?(hX just like the normal h jR?ubj})rk?}rl?(hUh}rm?(h]h]h]h]rn?Xfilero?aUrolejo?h]uh jR?h]rp?hXstdiorq?rr?}rs?(hXstdioh jk?ubah!jubhX rt?}ru?(hX h jR?ubj)rv?}rw?(hX:class:`LogFile`rx?h jR?jjq)h!jh}ry?(UreftypeXclassjjXLogFileU refdomainXpyrz?h]h]U refexplicith]h]h]jjUjX NjY NujMh]r{?j})r|?}r}?(hjx?h}r~?(h]h]r?(jjz?Xpy-classr?eh]h]h]uh jv?h]r?hXLogFiler?r?}r?(hUh j|?ubah!jubaubhX!. In fact, it's possible for one r?r?}r?(hX!. In fact, it's possible for one h jR?ubj)r?}r?(hX2:class:`~buildbot.process.logobserver.LogObserver`r?h jR?jjq)h!jh}r?(UreftypeXclassjjX(buildbot.process.logobserver.LogObserverU refdomainXpyr?h]h]U refexplicith]h]h]jjUjX NjY NujMh]r?j})r?}r?(hj?h}r?(h]h]r?(jj?Xpy-classr?eh]h]h]uh j?h]r?hX LogObserverr?r?}r?(hUh j?ubah!jubaubhX) to observe a logfile created by another.r?r?}r?(hX) to observe a logfile created by another.h jR?ubeubeubj)j\1jHj6j)j)r?}r?(hUh j)jjq)h!jh}r?(h]h]h]h]r?j)ah]r?j)aujMLjj)h]r?(h)r?}r?(hXStep Execution Processr?h j?jjq)h!h"h}r?(h]h]h]h]h]ujMLjj)h]r?hXStep Execution Processr?r?}r?(hj?h j?ubaubj)r?}r?(hX}A step's execution occurs in its :py:meth:`~buildbot.process.buildstep.BuildStep.run` method. When this method returns (more accurately, when the Deferred it returns fires), the step is complete. The method's result must be an integer, giving the result of the step. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the ``run`` method.h j?jjq)h!jh}r?(h]h]h]h]h]ujMNjj)h]r?(hX!A step's execution occurs in its r?r?}r?(hX!A step's execution occurs in its h j?ubj)r?}r?(hX4:py:meth:`~buildbot.process.buildstep.BuildStep.run`r?h j?jjq)h!jh}r?(UreftypeXmethjjX(buildbot.process.buildstep.BuildStep.runU refdomainXpyr?h]h]U refexplicith]h]h]jjUjX NjY NujMNh]r?j})r?}r?(hj?h}r?(h]h]r?(jj?Xpy-methr?eh]h]h]uh j?h]r?hXrunr?r?}r?(hUh j?ubah!jubaubhX method. When this method returns (more accurately, when the Deferred it returns fires), the step is complete. The method's result must be an integer, giving the result of the step. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the r?r?}r?(hX method. When this method returns (more accurately, when the Deferred it returns fires), the step is complete. The method's result must be an integer, giving the result of the step. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the h j?ubj})r?}r?(hX``run``h}r?(h]h]h]h]h]uh j?h]r?hXrunr?r?}r?(hUh j?ubah!jubhX method.r?r?}r?(hX method.h j?ubeubj)r?}r?(hXThe :bb:step:`ShellCommand` class implements this ``run`` method, and in most cases steps subclassing ``ShellCommand`` simply implement some of the subsidiary methods that its ``run`` method calls.h j?jjq)h!jh}r?(h]h]h]h]h]ujMSjj)h]r?(hXThe r?r?}r?(hXThe h j?ubj)r?}r?(hX:bb:step:`ShellCommand`r?h j?jjq)h!jh}r?(UreftypeXstepjjX ShellCommandU refdomainXbbr?h]h]U refexplicith]h]h]jjUujMSh]r?j})r?}r?(hj?h}r?(h]h]r?(jj?Xbb-stepr?eh]h]h]uh j?h]r?hX ShellCommandr?r?}r?(hUh j?ubah!jubaubhX class implements this r?r?}r?(hX class implements this h j?ubj})r?}r?(hX``run``h}r?(h]h]h]h]h]uh j?h]r?hXrunr?r?}r?(hUh j?ubah!jubhX- method, and in most cases steps subclassing r?r?}r?(hX- method, and in most cases steps subclassing h j?ubj})r?}r?(hX``ShellCommand``h}r?(h]h]h]h]h]uh j?h]r?hX ShellCommandr?r?}r?(hUh j?ubah!jubhX: simply implement some of the subsidiary methods that its r?r?}r?(hX: simply implement some of the subsidiary methods that its h j?ubj})r?}r?(hX``run``h}r?(h]h]h]h]h]uh j?h]r?hXrunr?r?}r?(hUh j?ubah!jubhX method calls.r?r@}r@(hX method calls.h j?ubeubeubj)j18j)jy,uj}r@h!jh}r@(h]h]h]Usourcejq)h]h]uj]r@j}r@(j]r@jL.aj]r@j)aj]r@j)aj&]r @jV.aj]r @j>:ajU]r @j5ajW]r @j0aj]r @jU1aj8]r@j)aj.]r@j.ajv/]r@jx/aj/]r@j/aj<]r@j<aj2]r@jQ.aje]r@j48ajF]r@jr9auubjjq)j}r@jj)sh!jh}r@(h]r@X customizationr@ah]h]h]r@(jj)eh]r@jaujKjj)j}r@jj)sh]r@(h)r@}r@(hj]h j)jjq)h!h"h}r @(h]h]h]h]h]ujKjj)h]r!@hX Customizationr"@r#@}r$@(hj]h j@ubaubj)r%@}r&@(hXFor advanced users, Buildbot acts as a framework supporting a customized build application. For the most part, such configurations consist of subclasses set up for use in a regular Buildbot configuration file.r'@h j)jjq)h!jh}r(@(h]h]h]h]h]ujKjj)h]r)@hXFor advanced users, Buildbot acts as a framework supporting a customized build application. For the most part, such configurations consist of subclasses set up for use in a regular Buildbot configuration file.r*@r+@}r,@(hj'@h j%@ubaubj)r-@}r.@(hXZThis chapter describes some of the more common idioms in advanced Buildbot configurations.r/@h j)jjq)h!jh}r0@(h]h]h]h]h]ujK jj)h]r1@hXZThis chapter describes some of the more common idioms in advanced Buildbot configurations.r2@r3@}r4@(hj/@h j-@ubaubj)r5@}r6@(hXAt the moment, this chapter is an unordered set of suggestions; if you'd like to clean it up, fork the project on GitHub and get started!r7@h j)jjq)h!jh}r8@(h]h]h]h]h]ujK jj)h]r9@hXAt the moment, this chapter is an unordered set of suggestions; if you'd like to clean it up, fork the project on GitHub and get started!r:@r;@}r<@(hj7@h j5@ubaubjX.jS.jN.jI.j^1jH6j=jt9jo9j)j-eubjjq)j}r=@j j>:sh!jh}r>@(h]h]h]h]r?@(jj)eh]r@@(j)j eujMjj)j}rA@jj>:sh]rB@(h)rC@}rD@(hXWriting New BuildStepsrE@h j)jjq)h!h"h}rF@(h]h]h]h]h]ujMjj)h]rG@hXWriting New BuildStepsrH@rI@}rJ@(hjE@h jC@ubaubcdocutils.nodes warning rK@)rL@}rM@(hXBuildbot is transitioning to a new, simpler style for writing custom steps. See :doc:`new-style-steps` for details. This section documents new-style steps exclusively, although old-style steps are still supported.h j)jjq)h!UwarningrN@h}rO@(h]h]h]h]h]ujNjj)h]rP@j)rQ@}rR@(hXBuildbot is transitioning to a new, simpler style for writing custom steps. See :doc:`new-style-steps` for details. This section documents new-style steps exclusively, although old-style steps are still supported.h jL@jjq)h!jh}rS@(h]h]h]h]h]ujMh]rT@(hXPBuildbot is transitioning to a new, simpler style for writing custom steps. See rU@rV@}rW@(hXPBuildbot is transitioning to a new, simpler style for writing custom steps. See h jQ@ubj)rX@}rY@(hX:doc:`new-style-steps`rZ@h jQ@jjq)h!jh}r[@(UreftypeXdocr\@jjXnew-style-stepsU refdomainUh]h]U refexplicith]h]h]jjUujMh]r]@j})r^@}r_@(hjZ@h}r`@(h]h]ra@(jj\@eh]h]h]uh jX@h]rb@hXnew-style-stepsrc@rd@}re@(hUh j^@ubah!jubaubhXo for details. This section documents new-style steps exclusively, although old-style steps are still supported.rf@rg@}rh@(hXo for details. This section documents new-style steps exclusively, although old-style steps are still supported.h jQ@ubeubaubj)ri@}rj@(hXLWhile it is a good idea to keep your build process self-contained in the source code tree, sometimes it is convenient to put more intelligence into your Buildbot configuration. One way to do this is to write a custom :class:`~buildbot.process.buildstep.BuildStep`. Once written, this Step can be used in the :file:`master.cfg` file.h j)jjq)h!jh}rk@(h]h]h]h]h]ujM jj)h]rl@(hXWhile it is a good idea to keep your build process self-contained in the source code tree, sometimes it is convenient to put more intelligence into your Buildbot configuration. One way to do this is to write a custom rm@rn@}ro@(hXWhile it is a good idea to keep your build process self-contained in the source code tree, sometimes it is convenient to put more intelligence into your Buildbot configuration. One way to do this is to write a custom h ji@ubj)rp@}rq@(hX.:class:`~buildbot.process.buildstep.BuildStep`rr@h ji@jjq)h!jh}rs@(UreftypeXclassjjX$buildbot.process.buildstep.BuildStepU refdomainXpyrt@h]h]U refexplicith]h]h]jjUjX NjY NujM h]ru@j})rv@}rw@(hjr@h}rx@(h]h]ry@(jjt@Xpy-classrz@eh]h]h]uh jp@h]r{@hX BuildStepr|@r}@}r~@(hUh jv@ubah!jubaubhX-. Once written, this Step can be used in the r@r@}r@(hX-. Once written, this Step can be used in the h ji@ubj})r@}r@(hUh}r@(h]h]h]h]r@Xfiler@aUrolej@h]uh ji@h]r@hX master.cfgr@r@}r@(hX master.cfgh j@ubah!jubhX file.r@r@}r@(hX file.h ji@ubeubj)r@}r@(hXThe best reason for writing a custom :class:`BuildStep` is to better parse the results of the command being run. For example, a :class:`~buildbot.process.buildstep.BuildStep` that knows about JUnit could look at the logfiles to determine which tests had been run, how many passed and how many failed, and then report more detailed information than a simple ``rc==0`` -based `good/bad` decision.h j)jjq)h!jh}r@(h]h]h]h]h]ujMjj)h]r@(hX%The best reason for writing a custom r@r@}r@(hX%The best reason for writing a custom h j@ubj)r@}r@(hX:class:`BuildStep`r@h j@jjq)h!jh}r@(UreftypeXclassjjX BuildStepU refdomainXpyr@h]h]U refexplicith]h]h]jjUjX NjY NujMh]r@j})r@}r@(hj@h}r@(h]h]r@(jj@Xpy-classr@eh]h]h]uh j@h]r@hX BuildStepr@r@}r@(hUh j@ubah!jubaubhXI is to better parse the results of the command being run. For example, a r@r@}r@(hXI is to better parse the results of the command being run. For example, a h j@ubj)r@}r@(hX.:class:`~buildbot.process.buildstep.BuildStep`r@h j@jjq)h!jh}r@(UreftypeXclassjjX$buildbot.process.buildstep.BuildStepU refdomainXpyr@h]h]U refexplicith]h]h]jjUjX NjY NujMh]r@j})r@}r@(hj@h}r@(h]h]r@(jj@Xpy-classr@eh]h]h]uh j@h]r@hX BuildStepr@r@}r@(hUh j@ubah!jubaubhX that knows about JUnit could look at the logfiles to determine which tests had been run, how many passed and how many failed, and then report more detailed information than a simple r@r@}r@(hX that knows about JUnit could look at the logfiles to determine which tests had been run, how many passed and how many failed, and then report more detailed information than a simple h j@ubj})r@}r@(hX ``rc==0``h}r@(h]h]h]h]h]uh j@h]r@hXrc==0r@r@}r@(hUh j@ubah!jubhX -based r@r@}r@(hX -based h j@ubj)r@}r@(hX `good/bad`h}r@(h]h]h]h]h]uh j@h]r@hXgood/badr@r@}r@(hUh j@ubah!jubhX decision.r@r@}r@(hX decision.h j@ubeubj)r@}r@(hXBuildbot has acquired a large fleet of build steps, and sports a number of knobs and hooks to make steps easier to write. This section may seem a bit overwhelming, but most custom steps will only need to apply one or two of the techniques outlined here.r@h j)jjq)h!jh}r@(h]h]h]h]h]ujMjj)h]r@hXBuildbot has acquired a large fleet of build steps, and sports a number of knobs and hooks to make steps easier to write. This section may seem a bit overwhelming, but most custom steps will only need to apply one or two of the techniques outlined here.r@r@}r@(hj@h j@ubaubj)r@}r@(hX`For complete documentation of the build step interfaces, see :doc:`../developer/cls-buildsteps`.h j)jjq)h!jh}r@(h]h]h]h]h]ujMjj)h]r@(hX=For complete documentation of the build step interfaces, see r@r@}r@(hX=For complete documentation of the build step interfaces, see h j@ubj)r@}r@(hX":doc:`../developer/cls-buildsteps`r@h j@jjq)h!jh}r@(UreftypeXdocr@jjX../developer/cls-buildstepsU refdomainUh]h]U refexplicith]h]h]jjUujMh]r@j})r@}r@(hj@h}r@(h]h]r@(jj@eh]h]h]uh j@h]r@hX../developer/cls-buildstepsr@r@}r@(hUh j@ubah!jubaubhX.r@}r@(hX.h j@ubeubj48j18j?j8j0j=j>j0jA:j<j<j5j)j)eubjjq)h!jh}r@(h]h]h]h]r@j)ah]r@j)aujMujj)h]r@(h)r@}r@(hXDiscovering filesr@h j)jjq)h!h"h}r@(h]h]h]h]h]ujMujj)h]r@hXDiscovering filesr@r@}r@(hj@h j@ubaubj)r@}r@(hXWhen implementing a :class:`BuildStep` it may be necessary to know about files that are created during the build. There are a few slave commands that can be used to find files on the slave and test for the existence (and type) of files and directories.h j)jjq)h!jh}r@(h]h]h]h]h]ujMwjj)h]r@(hXWhen implementing a r@r@}r@(hXWhen implementing a h j@ubj)r@}rA(hX:class:`BuildStep`rAh j@jjq)h!jh}rA(UreftypeXclassjjX BuildStepU refdomainXpyrAh]h]U refexplicith]h]h]jjUjX NjY NujMwh]rAj})rA}rA(hjAh}rA(h]h]rA(jjAXpy-classr Aeh]h]h]uh j@h]r AhX BuildStepr Ar A}r A(hUh jAubah!jubaubhX it may be necessary to know about files that are created during the build. There are a few slave commands that can be used to find files on the slave and test for the existence (and type) of files and directories.rArA}rA(hX it may be necessary to know about files that are created during the build. There are a few slave commands that can be used to find files on the slave and test for the existence (and type) of files and directories.h j@ubeubj)rA}rA(hXAThe slave provides the following file-discovery related commands:rAh j)jjq)h!jh}rA(h]h]h]h]h]ujM|jj)h]rAhXAThe slave provides the following file-discovery related commands:rArA}rA(hjAh jAubaubjM )rA}rA(hUh j)jjq)h!j h}rA(jQ X*h]h]h]h]h]ujM~jj)h]rA(jS )rA}rA(hX`stat` calls :func:`os.stat` for a file in the slave's build directory. This can be used to check if a known file exists and whether it is a regular file, directory or symbolic link. h jAjjq)h!jv h}rA(h]h]h]h]h]ujNjj)h]r Aj)r!A}r"A(hX`stat` calls :func:`os.stat` for a file in the slave's build directory. This can be used to check if a known file exists and whether it is a regular file, directory or symbolic link.h jAjjq)h!jh}r#A(h]h]h]h]h]ujM~h]r$A(j)r%A}r&A(hX`stat`h}r'A(h]h]h]h]h]uh j!Ah]r(AhXstatr)Ar*A}r+A(hUh j%Aubah!jubhX calls r,Ar-A}r.A(hX calls h j!Aubj)r/A}r0A(hX:func:`os.stat`r1Ah j!Ajjq)h!jh}r2A(UreftypeXfuncjjXos.statU refdomainXpyr3Ah]h]U refexplicith]h]h]jjUjX NjY NujM~h]r4Aj})r5A}r6A(hj1Ah}r7A(h]h]r8A(jj3AXpy-funcr9Aeh]h]h]uh j/Ah]r:AhXos.statr;ArAr?A}r@A(hX for a file in the slave's build directory. This can be used to check if a known file exists and whether it is a regular file, directory or symbolic link.h j!AubeubaubjS )rAA}rBA(hX`listdir` calls :func:`os.listdir` for a directory on the slave. It can be used to obtain a list of files that are present in a directory on the slave. h jAjjq)h!jv h}rCA(h]h]h]h]h]ujNjj)h]rDAj)rEA}rFA(hX`listdir` calls :func:`os.listdir` for a directory on the slave. It can be used to obtain a list of files that are present in a directory on the slave.h jAAjjq)h!jh}rGA(h]h]h]h]h]ujMh]rHA(j)rIA}rJA(hX `listdir`h}rKA(h]h]h]h]h]uh jEAh]rLAhXlistdirrMArNA}rOA(hUh jIAubah!jubhX calls rPArQA}rRA(hX calls h jEAubj)rSA}rTA(hX:func:`os.listdir`rUAh jEAjjq)h!jh}rVA(UreftypeXfuncjjX os.listdirU refdomainXpyrWAh]h]U refexplicith]h]h]jjUjX NjY NujMh]rXAj})rYA}rZA(hjUAh}r[A(h]h]r\A(jjWAXpy-funcr]Aeh]h]h]uh jSAh]r^AhX os.listdirr_Ar`A}raA(hUh jYAubah!jubaubhXu for a directory on the slave. It can be used to obtain a list of files that are present in a directory on the slave.rbArcA}rdA(hXu for a directory on the slave. It can be used to obtain a list of files that are present in a directory on the slave.h jEAubeubaubjS )reA}rfA(hXd`glob` calls :func:`glob.glob` on the slave, with a given shell-style pattern containing wildcards. h jAjjq)h!jv h}rgA(h]h]h]h]h]ujNjj)h]rhAj)riA}rjA(hXc`glob` calls :func:`glob.glob` on the slave, with a given shell-style pattern containing wildcards.h jeAjjq)h!jh}rkA(h]h]h]h]h]ujMh]rlA(j)rmA}rnA(hX`glob`h}roA(h]h]h]h]h]uh jiAh]rpAhXglobrqArrA}rsA(hUh jmAubah!jubhX calls rtAruA}rvA(hX calls h jiAubj)rwA}rxA(hX:func:`glob.glob`ryAh jiAjjq)h!jh}rzA(UreftypeXfuncjjX glob.globU refdomainXpyr{Ah]h]U refexplicith]h]h]jjUjX NjY NujMh]r|Aj})r}A}r~A(hjyAh}rA(h]h]rA(jj{AXpy-funcrAeh]h]h]uh jwAh]rAhX glob.globrArA}rA(hUh j}Aubah!jubaubhXE on the slave, with a given shell-style pattern containing wildcards.rArA}rA(hXE on the slave, with a given shell-style pattern containing wildcards.h jiAubeubaubeubj)rA}rA(hXFor example, we could use stat to check if a given path exists and contains ``*.pyc`` files. If the path does not exist (or anything fails) we mark the step as failed; if the path exists but is not a directory, we mark the step as having "warnings".h j)jjq)h!jh}rA(h]h]h]h]h]ujMjj)h]rA(hXLFor example, we could use stat to check if a given path exists and contains rArA}rA(hXLFor example, we could use stat to check if a given path exists and contains h jAubj})rA}rA(hX ``*.pyc``h}rA(h]h]h]h]h]uh jAh]rAhX*.pycrArA}rA(hUh jAubah!jubhX files. If the path does not exist (or anything fails) we mark the step as failed; if the path exists but is not a directory, we mark the step as having "warnings".rArA}rA(hX files. If the path does not exist (or anything fails) we mark the step as failed; if the path exists but is not a directory, we mark the step as having "warnings".h jAubeubj)rA}rA(hXfrom buildbot.process import buildstep from buildbot.interfaces import BuildSlaveToOldError from buildbot.status.results import SUCCESS, WARNINGS, FAILURE import stat class MyBuildStep(buildstep.BuildStep): def __init__(self, dirname, **kwargs): buildstep.BuildStep.__init__(self, **kwargs) self.dirname = dirname def start(self): # make sure the slave knows about stat slavever = (self.slaveVersion('stat'), self.slaveVersion('glob')) if not all(slavever): raise BuildSlaveToOldError('need stat and glob') cmd = buildstep.RemoteCommand('stat', {'file': self.dirname}) d = self.runCommand(cmd) d.addCallback(lambda res: self.evaluateStat(cmd)) d.addErrback(self.failed) return d def evaluateStat(self, cmd): if cmd.didFail(): self.step_status.setText(["File not found."]) self.finished(FAILURE) return s = cmd.updates["stat"][-1] if not stat.S_ISDIR(s[stat.ST_MODE]): self.step_status.setText(["'tis not a directory"]) self.finished(WARNINGS) return cmd = buildstep.RemoteCommand('glob', {'glob': self.dirname + '/*.pyc'}) d = self.runCommand(cmd) d.addCallback(lambda res: self.evaluateGlob(cmd)) d.addErrback(self.failed) return d def evaluateGlob(self, cmd): if cmd.didFail(): self.step_status.setText(["Glob failed."]) self.finished(FAILURE) return files = cmd.updates["files"][-1] if len(files): self.step_status.setText(["Found pycs"]+files) else: self.step_status.setText(["No pycs found"]) self.finished(SUCCESS)h j)jjq)h!jh}rA(jjXpythonjjh]h]h]h]h]ujMjj)h]rAhXfrom buildbot.process import buildstep from buildbot.interfaces import BuildSlaveToOldError from buildbot.status.results import SUCCESS, WARNINGS, FAILURE import stat class MyBuildStep(buildstep.BuildStep): def __init__(self, dirname, **kwargs): buildstep.BuildStep.__init__(self, **kwargs) self.dirname = dirname def start(self): # make sure the slave knows about stat slavever = (self.slaveVersion('stat'), self.slaveVersion('glob')) if not all(slavever): raise BuildSlaveToOldError('need stat and glob') cmd = buildstep.RemoteCommand('stat', {'file': self.dirname}) d = self.runCommand(cmd) d.addCallback(lambda res: self.evaluateStat(cmd)) d.addErrback(self.failed) return d def evaluateStat(self, cmd): if cmd.didFail(): self.step_status.setText(["File not found."]) self.finished(FAILURE) return s = cmd.updates["stat"][-1] if not stat.S_ISDIR(s[stat.ST_MODE]): self.step_status.setText(["'tis not a directory"]) self.finished(WARNINGS) return cmd = buildstep.RemoteCommand('glob', {'glob': self.dirname + '/*.pyc'}) d = self.runCommand(cmd) d.addCallback(lambda res: self.evaluateGlob(cmd)) d.addErrback(self.failed) return d def evaluateGlob(self, cmd): if cmd.didFail(): self.step_status.setText(["Glob failed."]) self.finished(FAILURE) return files = cmd.updates["files"][-1] if len(files): self.step_status.setText(["Found pycs"]+files) else: self.step_status.setText(["No pycs found"]) self.finished(SUCCESS)rArA}rA(hUh jAubaubj)rA}rA(hXUFor more information on the available commands, see :doc:`../developer/master-slave`.h j)jjq)h!jh}rA(h]h]h]h]h]ujMjj)h]rA(hX4For more information on the available commands, see rArA}rA(hX4For more information on the available commands, see h jAubj)rA}rA(hX :doc:`../developer/master-slave`rAh jAjjq)h!jh}rA(UreftypeXdocrAjjX../developer/master-slaveU refdomainUh]h]U refexplicith]h]h]jjUujMh]rAj})rA}rA(hjAh}rA(h]h]rA(jjAeh]h]h]uh jAh]rAhX../developer/master-slaverArA}rA(hUh jAubah!jubaubhX.rA}rA(hX.h jAubeubj)j8eubjjq)h!jh}rA(h]h]h]h]h]jj8ujNjj)h]ubueUsrcdirrAX</var/build/user_builds/buildbot/checkouts/v0.8.9/master/docsrAjYcsphinx.config Config rA)rA}rA(U latex_logorAU#_images/header-text-transparent.pngrAUpygments_stylerAUsphinxrAUhtml_use_smartypantsrAUhtmlhelp_basenamerAU BuildBotdocrAU html_themerAUagogorAU html_contextrA}rA(Ubitbucket_versionUv0.8.9rAU using_themejAjAUcurrent_versionrAjAU canonical_urlUU source_suffixrAU.rstrAUPRODUCTION_DOMAINUreadthedocs.orgU github_userUbuildbotrAU new_themeUanalytics_codeU UA-12313843-4Usingle_versionUdisplay_githubU downloads]U READTHEDOCSU conf_py_pathU /master/docs/U github_repojAU rtd_languageXenUbitbucket_repoUNonerAUslugrAjAUapi_hostUhttps://readthedocs.orgUbitbucket_userjAUnamerAXBuildbotrAUversions]rA(UlatestU /en/latest/rAjAU /en/v0.8.9/rAUv0.8.8U /en/v0.8.8/rAUv0.8.7p1U /en/v0.8.7p1/rAUv0.8.7U /en/v0.8.7/rAUv0.8.6p1U /en/v0.8.6p1/rAUv0.8.6U /en/v0.8.6/rAUv0.8.5U /en/v0.8.5/rAUv0.8.4U /en/v0.8.4/rAeUgithub_versionjAUdisplay_bitbucketUFalserAU MEDIA_URLrAUhttps://media.readthedocs.org/ujAjAU copyrightrAXBuildbot Team MembersrAUadd_function_parenthesesrAUexclude_patternsrA]rA(U_buildrAUrelease-notes/*.rstrAeUlatex_paper_sizerAUa4rAjU0.8.9rAU man_pagesrA]rA(j^jAXBuildBot DocumentationrA]rAX Brian WarnerrAaKtrAaUlatex_show_urlsrAU master_docrAj^Utemplates_pathrA]rA(UA/home/docs/checkouts/readthedocs.org/readthedocs/templates/sphinxrAU _templatesrAeUlatex_documentsrA]rA(UindexU BuildBot.texjAjAUmanualtrAaU html_faviconrAU_static/buildbot.icorAUhtml_static_pathrA]rA(U_staticrAUI/home/docs/checkouts/readthedocs.org/readthedocs/templates/sphinx/_staticrAeU needs_sphinxrAU1.0rAUhtml_theme_pathrA]rB(U_themesrBjAeUlanguagerBXenrBU overridesrB}rBjBjBsUhtml_use_indexrBUhtml_use_modindexrBUprojectrBjAU html_logor BU#_images/header-text-transparent.pngr BU extensionsr B]r B(Usphinx.ext.todor BU bbdocs.extrBUreadthedocs_ext.readthedocsrBeUreleaserBjAUsetuprBNubUmetadatarB}rB(h }h#}h,}h5}h>}hG}hP}hY}hb}hk}ht}h}}h}h}h}h}h}h}h}h}h}h}h}h}h}h}j}j }j}j}j(}j1}j:}jC}jL}jU}j^}jg}jp}jy}j}j}j}j}j}j}j}j}j}j}j}j}j}j}uUversionchangesrB}Utoc_num_entriesrB}rB(h Kh#K h,Kh5Kh>KhGKhPKhYKhbK hkKhtKh}KhKhK hKhKhKhKhKhKhK hKhKhKhKhK jKj KjK jK%j(K j1Kj:K jCKjLKjUK!j^K jgKjpKjyKjKLjKjKjKjKjKjK!jKjKjKjKjKjK jKuUimagesrBh)rB(Xmanual/_images/slaves.svgrBh]rBh}aRrBX slaves.svgrBrBX%tutorial/_images/runtests-success.pngrBh]rBjaRr BXruntests-success.pngr!Br"BXmanual/_images/status.svgr#Bh]r$Bh}aRr%BX status.svgr&Br'BX tutorial/_images/irc-testrun.pngr(Bh]r)BjaRr*BXirc-testrun.pngr+Br,BXtutorial/_images/index.pngr-Bh]r.B(hjeRr/BX index.pngr0Br1BXmanual/_images/slaves.pngr2Bh]r3Bh}aRr4BX slaves.pngr5Br6BXmanual/_images/overview.pngr7Bh]r8Bh}aRr9BX overview.pngr:Br;BXmanual/_images/status.pngrBX status.pngr?Br@BXmanual/_images/master.svgrABh]rBBh}aRrCBX master.svgrDBrEBX$manual/../_images/success_normal.pngrFBh]rGBjLaRrHBXsuccess_normal.pngrIBrJBX$tutorial/_images/waterfall-empty.pngrKBh]rLB(hjeRrMBXwaterfall-empty.pngrNBrOBXmanual/_images/overview.svgrPBh]rQBh}aRrRBX overview.svgrSBrTBXmanual/_images/master.pngrUBh]rVBh}aRrWBX master.pngrXBrYBX tutorial/_images/force-build.pngrZBh]r[BjaRr\BXforce-build.pngr]Br^Buh]r_B(j0Bj&BjIBjBj?Bj5BjNBjSBjDBj!Bj+Bj:Bj]BjXBeRr`BbUnumbered_toctreesraBh]RrbBU found_docsrcBh]rdB(h h#h,h5h>hGhPhYhbhkhth}hjhhhhhhhhhhhhjj jjj(j1j:jCjLjUj^jgjpjyjjhjjjjjjjjjjjeRreBU longtitlesrfB}rgB(h hh#h$h,h-h5h6h>h?hGhHhPhQhYhZhbhchkhlhthuh}h~hhhhhhhhhhhhhhhhhhhhhhhhhhhhjjj jjjjj j(j)j1j2j:j;jCjDjLjMjUjVj^j_jgjhjpjqjyjzjjjjjjjjjjjjjjjjjjjjjjjjjjjjuU dependenciesrhB}riB(jLh]rjBjFBaRrkBjh]rlB(j(BjBjZBeRrmBhh]rnB(j-BjKBeRroBh}h]rpB(jBj2Bj7BjC}r?C(hUh}r@C(h]h]h]h]h]uh j/Ch]rAC(jS )rBC}rCC(hUh}rDC(h]h]h]h]h]uh j>Ch]rECjB)rFC}rGC(hUh}rHC(h]h]h]h]h]uh jBCh]rICj,)rJC}rKC(hUh}rLC(U anchornameU#get-an-aws-ec2-accountUrefurih h]h]h]h]h]Uinternaluh jFCh]rMChXGet an AWS EC2 AccountrNCrOC}rPC(hXGet an AWS EC2 Accounth jJCubah!j,ubah!jBubah!jv ubjS )rQC}rRC(hUh}rSC(h]h]h]h]h]uh j>Ch]rTCjB)rUC}rVC(hUh}rWC(h]h]h]h]h]uh jQCh]rXCj,)rYC}rZC(hUh}r[C(U anchornameU#create-an-amiUrefurih h]h]h]h]h]Uinternaluh jUCh]r\ChX Create an AMIr]Cr^C}r_C(hX Create an AMIh jYCubah!j,ubah!jBubah!jv ubjS )r`C}raC(hUh}rbC(h]h]h]h]h]uh j>Ch]rcCjB)rdC}reC(hUh}rfC(h]h]h]h]h]uh j`Ch]rgCj,)rhC}riC(hUh}rjC(U anchornameU1#configure-the-master-with-an-ec2latentbuildslaveUrefurih h]h]h]h]h]Uinternaluh jdCh]rkChX0Configure the Master with an EC2LatentBuildSlaverlCrmC}rnC(hX0Configure the Master with an EC2LatentBuildSlaveh jhCubah!j,ubah!jBubah!jv ubjS )roC}rpC(hUh}rqC(h]h]h]h]h]uh j>Ch]rrCjB)rsC}rtC(hUh}ruC(h]h]h]h]h]uh joCh]rvCj,)rwC}rxC(hUh}ryC(U anchornameU#spot-instancesUrefurih h]h]h]h]h]Uinternaluh jsCh]rzChXSpot instancesr{Cr|C}r}C(hXSpot instancesh jwCubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r~C}rC(hUh}rC(h]h]h]h]h]uh jCh]rC(jB)rC}rC(hUh}rC(h]h]h]h]h]uh j~Ch]rCj,)rC}rC(hUh}rC(U anchornameU#libvirtUrefurih h]h]h]h]h]Uinternaluh jCh]rChXLibvirtrCrC}rC(hXLibvirth jCubah!j,ubah!jBubjM )rC}rC(hUh}rC(h]h]h]h]h]uh j~Ch]rC(jS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU#setting-up-libvirtUrefurih h]h]h]h]h]Uinternaluh jCh]rChXSetting up libvirtrCrC}rC(hXSetting up libvirth jCubah!j,ubah!jBubah!jv ubjS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU#configuring-your-base-imageUrefurih h]h]h]h]h]Uinternaluh jCh]rChXConfiguring your base imagerCrC}rC(hXConfiguring your base imageh jCubah!j,ubah!jBubah!jv ubjS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU#configuring-your-masterUrefurih h]h]h]h]h]Uinternaluh jCh]rChXConfiguring your MasterrCrC}rC(hXConfiguring your Masterh jCubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rC(jB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU #openstackUrefurih h]h]h]h]h]Uinternaluh jCh]rChX OpenStackrCrC}rC(hX OpenStackh jCubah!j,ubah!jBubjM )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rC(jS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU%#get-an-account-in-an-openstack-cloudUrefurih h]h]h]h]h]Uinternaluh jCh]rChX$Get an Account in an OpenStack cloudrCrC}rC(hX$Get an Account in an OpenStack cloudh jCubah!j,ubah!jBubah!jv ubjS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU#create-an-imageUrefurih h]h]h]h]h]Uinternaluh jCh]rChXCreate an ImagerCrC}rC(hXCreate an Imageh jCubah!j,ubah!jBubah!jv ubjS )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjB)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj,)rC}rC(hUh}rC(U anchornameU7#configure-the-master-with-an-openstacklatentbuildslaveUrefurih h]h]h]h]h]Uinternaluh jCh]rChX6Configure the Master with an OpenStackLatentBuildSlaverCrC}rC(hX6Configure the Master with an OpenStackLatentBuildSlaveh jCubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rC}rC(hUh}rD(h]h]h]h]h]uh jCh]rDjB)rD}rD(hUh}rD(h]h]h]h]h]uh jCh]rDj,)rD}rD(hUh}rD(U anchornameU #dangers-with-latent-buildslavesUrefurih h]h]h]h]h]Uinternaluh jDh]r DhXDangers with Latent Buildslavesr Dr D}r D(hXDangers with Latent Buildslavesh jDubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubh#jM )r D}rD(hUh}rD(h]h]h]h]h]uh]rDjS )rD}rD(hUh}rD(h]h]h]h]h]uh j Dh]rD(jB)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj,)rD}rD(hUh}rD(U anchornameUUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhX!Release Notes for Buildbot v0.8.7rDrD}rD(hh+h jDubah!j,ubah!jBubjM )r D}r!D(hUh}r"D(h]h]h]h]h]uh jDh]r#D(jS )r$D}r%D(hUh}r&D(h]h]h]h]h]uh j Dh]r'DjB)r(D}r)D(hUh}r*D(h]h]h]h]h]uh j$Dh]r+Dj,)r,D}r-D(hUh}r.D(U anchornameU#p1Urefurih#h]h]h]h]h]Uinternaluh j(Dh]r/DhX0.8.7p1r0Dr1D}r2D(hX0.8.7p1r3Dh j,Dubah!j,ubah!jBubah!jv ubjS )r4D}r5D(hUh}r6D(h]h]h]h]h]uh j Dh]r7D(jB)r8D}r9D(hUh}r:D(h]h]h]h]h]uh j4Dh]r;Dj,)rD(U anchornameU#masterUrefurih#h]h]h]h]h]Uinternaluh j8Dh]r?DhXMasterr@DrAD}rBD(hXMasterrCDh jE}r?E(hUh}r@E(U anchornameU #examplesUrefurih5h]h]h]h]h]Uinternaluh j:Eh]rAEhXExamplesrBErCE}rDE(hXExamplesh j>Eubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubh>jM )rEE}rFE(hUh}rGE(h]h]h]h]h]uh]rHEjS )rIE}rJE(hUh}rKE(h]h]h]h]h]uh jEEh]rLE(jB)rME}rNE(hUh}rOE(h]h]h]h]h]uh jIEh]rPEj,)rQE}rRE(hUh}rSE(U anchornameUUrefurih>h]h]h]h]h]Uinternaluh jMEh]rTEhXString EncodingsrUErVE}rWE(hhFh jQEubah!j,ubah!jBubjM )rXE}rYE(hUh}rZE(h]h]h]h]h]uh jIEh]r[E(jS )r\E}r]E(hUh}r^E(h]h]h]h]h]uh jXEh]r_EjB)r`E}raE(hUh}rbE(h]h]h]h]h]uh j\Eh]rcEj,)rdE}reE(hUh}rfE(U anchornameU#inputsUrefurih>h]h]h]h]h]Uinternaluh j`Eh]rgEhXInputsrhEriE}rjE(hXInputsh jdEubah!j,ubah!jBubah!jv ubjS )rkE}rlE(hUh}rmE(h]h]h]h]h]uh jXEh]rnEjB)roE}rpE(hUh}rqE(h]h]h]h]h]uh jkEh]rrEj,)rsE}rtE(hUh}ruE(U anchornameU#outputsUrefurih>h]h]h]h]h]Uinternaluh joEh]rvEhXOutputsrwErxE}ryE(hXOutputsh jsEubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubhGjM )rzE}r{E(hUh}r|E(h]h]h]h]h]uh]r}EjS )r~E}rE(hUh}rE(h]h]h]h]h]uh jzEh]rE(jB)rE}rE(hUh}rE(h]h]h]h]h]uh j~Eh]rEj,)rE}rE(hUh}rE(U anchornameUUrefurihGh]h]h]h]h]Uinternaluh jEh]rEhXBuildbot TutorialrErE}rE(hhOh jEubah!j,ubah!jBubjM )rE}rE(hUh}rE(h]h]h]h]h]uh j~Eh]rEj)rE}rE(hUh}rE(UnumberedKUparenthGU titlesonlyUglobh]h]h]h]h]Uentries]rE(NjBrENjBrENjBrENjBrEeUhiddenUmaxdepthKU includefiles]rE(jBjBjBjBeU includehiddenuh jEh]h!jubah!j ubeh!jv ubah!j ubhPjM )rE}rE(hUh}rE(h]h]h]h]h]uh]rEjS )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjB)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj,)rE}rE(hUh}rE(U anchornameUUrefurihPh]h]h]h]h]Uinternaluh jEh]rEhX IPropertiesrErE}rE(hhXh jEubah!j,ubah!jBubah!jv ubah!j ubhYjM )rE}rE(hUh}rE(h]h]h]h]h]uh]rEjS )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjB)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj,)rE}rE(hUh}rE(U anchornameUUrefurihYh]h]h]h]h]Uinternaluh jEh]rEhX ResourcesrErE}rE(hhah jEubah!j,ubah!jBubah!jv ubah!j ubhbjM )rE}rE(hUh}rE(h]h]h]h]h]uh]rEjS )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jB)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj,)rE}rE(hUh}rE(U anchornameUUrefurihbh]h]h]h]h]Uinternaluh jEh]rEhXCommand-line ToolrErE}rE(hhjh jEubah!j,ubah!jBubjM )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jS )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jB)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj,)rE}rE(hUh}rE(U anchornameU #buildbotUrefurihbh]h]h]h]h]Uinternaluh jEh]rEhXbuildbotrErE}rE(hjE&h jEubah!j,ubah!jBubjM )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jS )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jB)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj,)rE}rE(hUh}rE(U anchornameU#administrator-toolsUrefurihbh]h]h]h]h]Uinternaluh jEh]rEhXAdministrator ToolsrErE}rE(hj h jEubah!j,ubah!jBubjM )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jS )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jEh]rFj,)rF}rF(hUh}rF(U anchornameU#create-masterUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhX create-masterr Fr F}r F(hj h jFubah!j,ubah!jBubah!jv ubjS )r F}r F(hUh}rF(h]h]h]h]h]uh jEh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh j Fh]rFj,)rF}rF(hUh}rF(U anchornameU#startUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXstartrFrF}rF(hj h jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jEh]rFjB)rF}r F(hUh}r!F(h]h]h]h]h]uh jFh]r"Fj,)r#F}r$F(hUh}r%F(U anchornameU#restartUrefurihbh]h]h]h]h]Uinternaluh jFh]r&FhXrestartr'Fr(F}r)F(hje h j#Fubah!j,ubah!jBubah!jv ubjS )r*F}r+F(hUh}r,F(h]h]h]h]h]uh jEh]r-FjB)r.F}r/F(hUh}r0F(h]h]h]h]h]uh j*Fh]r1Fj,)r2F}r3F(hUh}r4F(U anchornameU#stopUrefurihbh]h]h]h]h]Uinternaluh j.Fh]r5FhXstopr6Fr7F}r8F(hj h j2Fubah!j,ubah!jBubah!jv ubjS )r9F}r:F(hUh}r;F(h]h]h]h]h]uh jEh]rF(hUh}r?F(h]h]h]h]h]uh j9Fh]r@Fj,)rAF}rBF(hUh}rCF(U anchornameU#sighupUrefurihbh]h]h]h]h]Uinternaluh j=Fh]rDFhXsighuprEFrFF}rGF(hj h jAFubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rHF}rIF(hUh}rJF(h]h]h]h]h]uh jEh]rKF(jB)rLF}rMF(hUh}rNF(h]h]h]h]h]uh jHFh]rOFj,)rPF}rQF(hUh}rRF(U anchornameU#developer-toolsUrefurihbh]h]h]h]h]Uinternaluh jLFh]rSFhXDeveloper ToolsrTFrUF}rVF(hjc&h jPFubah!j,ubah!jBubjM )rWF}rXF(hUh}rYF(h]h]h]h]h]uh jHFh]rZF(jS )r[F}r\F(hUh}r]F(h]h]h]h]h]uh jWFh]r^FjB)r_F}r`F(hUh}raF(h]h]h]h]h]uh j[Fh]rbFj,)rcF}rdF(hUh}reF(U anchornameU #statuslogUrefurihbh]h]h]h]h]Uinternaluh j_Fh]rfFhX statuslogrgFrhF}riF(hj% h jcFubah!j,ubah!jBubah!jv ubjS )rjF}rkF(hUh}rlF(h]h]h]h]h]uh jWFh]rmFjB)rnF}roF(hUh}rpF(h]h]h]h]h]uh jjFh]rqFj,)rrF}rsF(hUh}rtF(U anchornameU #statusguiUrefurihbh]h]h]h]h]Uinternaluh jnFh]ruFhX statusguirvFrwF}rxF(hj h jrFubah!j,ubah!jBubah!jv ubjS )ryF}rzF(hUh}r{F(h]h]h]h]h]uh jWFh]r|F(jB)r}F}r~F(hUh}rF(h]h]h]h]h]uh jyFh]rFj,)rF}rF(hUh}rF(U anchornameU#tryUrefurihbh]h]h]h]h]Uinternaluh j}Fh]rFhXtryrFrF}rF(hj~&h jFubah!j,ubah!jBubjM )rF}rF(hUh}rF(h]h]h]h]h]uh jyFh]rF(jS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#locating-the-masterUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXLocating the masterrFrF}rF(hjih jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#waiting-for-resultsUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXWaiting for resultsrFrF}rF(hjh jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#choosing-the-buildersUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXChoosing the BuildersrFrF}rF(hj$h jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#specifying-the-vc-systemUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXSpecifying the VC systemrFrF}rF(hj#h jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#finding-the-top-of-the-treeUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXFinding the top of the treerFrF}rF(hjM h jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#determining-the-branch-nameUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXDetermining the branch namerFrF}rF(hj)h jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU##determining-the-revision-and-patchUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhX"Determining the revision and patchrFrF}rF(hj+'h jFubah!j,ubah!jBubah!jv ubjS )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjB)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj,)rF}rF(hUh}rF(U anchornameU#patch-informationUrefurihbh]h]h]h]h]Uinternaluh jFh]rGhXpatch informationrGrG}rG(hj h jFubah!j,ubah!jBubah!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jFh]rGjB)rG}r G(hUh}r G(h]h]h]h]h]uh jGh]r Gj,)r G}r G(hUh}rG(U anchornameU#sending-propertiesUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhXSending propertiesrGrG}rG(hjwh j Gubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jWFh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameU #try-diffUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhX try --diffrGr G}r!G(hjh jGubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r"G}r#G(hUh}r$G(h]h]h]h]h]uh jEh]r%G(jB)r&G}r'G(hUh}r(G(h]h]h]h]h]uh j"Gh]r)Gj,)r*G}r+G(hUh}r,G(U anchornameU #other-toolsUrefurihbh]h]h]h]h]Uinternaluh j&Gh]r-GhX Other Toolsr.Gr/G}r0G(hjrh j*Gubah!j,ubah!jBubjM )r1G}r2G(hUh}r3G(h]h]h]h]h]uh j"Gh]r4G(jS )r5G}r6G(hUh}r7G(h]h]h]h]h]uh j1Gh]r8GjB)r9G}r:G(hUh}r;G(h]h]h]h]h]uh j5Gh]rG(hUh}r?G(U anchornameU #sendchangeUrefurihbh]h]h]h]h]Uinternaluh j9Gh]r@GhX sendchangerAGrBG}rCG(hjh j=Gubah!j,ubah!jBubah!jv ubjS )rDG}rEG(hUh}rFG(h]h]h]h]h]uh j1Gh]rGGjB)rHG}rIG(hUh}rJG(h]h]h]h]h]uh jDGh]rKGj,)rLG}rMG(hUh}rNG(U anchornameU #debugclientUrefurihbh]h]h]h]h]Uinternaluh jHGh]rOGhX debugclientrPGrQG}rRG(hjh jLGubah!j,ubah!jBubah!jv ubjS )rSG}rTG(hUh}rUG(h]h]h]h]h]uh j1Gh]rVGjB)rWG}rXG(hUh}rYG(h]h]h]h]h]uh jSGh]rZGj,)r[G}r\G(hUh}r]G(U anchornameU#userUrefurihbh]h]h]h]h]Uinternaluh jWGh]r^GhXuserr_Gr`G}raG(hjh j[Gubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rbG}rcG(hUh}rdG(h]h]h]h]h]uh jEh]reGjB)rfG}rgG(hUh}rhG(h]h]h]h]h]uh jbGh]riGj,)rjG}rkG(hUh}rlG(U anchornameU#buildbot-config-directoryUrefurihbh]h]h]h]h]Uinternaluh jfGh]rmGhX.buildbot config directoryrnGroG}rpG(hjh jjGubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rqG}rrG(hUh}rsG(h]h]h]h]h]uh jEh]rtG(jB)ruG}rvG(hUh}rwG(h]h]h]h]h]uh jqGh]rxGj,)ryG}rzG(hUh}r{G(U anchornameU #buildslaveUrefurihbh]h]h]h]h]Uinternaluh juGh]r|GhX buildslaver}Gr~G}rG(hjCh jyGubah!j,ubah!jBubjM )rG}rG(hUh}rG(h]h]h]h]h]uh jqGh]rG(jS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameU #create-slaveUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhX create-slaverGrG}rG(hjph jGubah!j,ubah!jBubah!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameX#cmdline-start (buildslave)Urefurihbh]h]h]h]h]Uinternaluh jGh]rGhXstartrGrG}rG(hjoh jGubah!j,ubah!jBubah!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameX#cmdline-restart (buildslave)Urefurihbh]h]h]h]h]Uinternaluh jGh]rGhXrestartrGrG}rG(hjh jGubah!j,ubah!jBubah!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameX#cmdline-stop (buildslave)Urefurihbh]h]h]h]h]Uinternaluh jGh]rGhXstoprGrG}rG(hjQh jGubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubhkjM )rG}rG(hUh}rG(h]h]h]h]h]uh]rGjS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rG(jB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameUUrefurihkh]h]h]h]h]Uinternaluh jGh]rGhXNew-Style Build StepsrGrG}rG(hhsh jGubah!j,ubah!jBubjM )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rG(jS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameU#summary-of-changesUrefurihkh]h]h]h]h]Uinternaluh jGh]rGhXSummary of ChangesrGrG}rG(hXSummary of Changesh jGubah!j,ubah!jBubah!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj,)rG}rG(hUh}rG(U anchornameU#rewriting-startUrefurihkh]h]h]h]h]Uinternaluh jGh]rG(hX Rewriting rGrG}rG(hX Rewriting h jGubj})rG}rG(hX ``start``h}rG(h]h]h]h]h]uh jGh]rGhXstartrGrG}rG(hUh jGubah!jubeh!j,ubah!jBubah!jv ubjS )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjB)rH}rH(hUh}rH(h]h]h]h]h]uh jGh]rHj,)rH}rH(hUh}rH(U anchornameU#newly-asynchronous-methodsUrefurihkh]h]h]h]h]Uinternaluh jHh]rHhXNewly Asynchronous MethodsrHr H}r H(hXNewly Asynchronous Methodsh jHubah!j,ubah!jBubah!jv ubjS )r H}r H(hUh}r H(h]h]h]h]h]uh jGh]rHjB)rH}rH(hUh}rH(h]h]h]h]h]uh j Hh]rHj,)rH}rH(hUh}rH(U anchornameU #propertiesUrefurihkh]h]h]h]h]Uinternaluh jHh]rHhX PropertiesrHrH}rH(hX Propertiesh jHubah!j,ubah!jBubah!jv ubjS )rH}rH(hUh}rH(h]h]h]h]h]uh jGh]rHjB)rH}rH(hUh}r H(h]h]h]h]h]uh jHh]r!Hj,)r"H}r#H(hUh}r$H(U anchornameU #log-objectsUrefurihkh]h]h]h]h]Uinternaluh jHh]r%HhX Log Objectsr&Hr'H}r(H(hX Log Objectsh j"Hubah!j,ubah!jBubah!jv ubjS )r)H}r*H(hUh}r+H(h]h]h]h]h]uh jGh]r,HjB)r-H}r.H(hUh}r/H(h]h]h]h]h]uh j)Hh]r0Hj,)r1H}r2H(hUh}r3H(U anchornameU#status-stringsUrefurihkh]h]h]h]h]Uinternaluh j-Hh]r4HhXStatus Stringsr5Hr6H}r7H(hXStatus Stringsh j1Hubah!j,ubah!jBubah!jv ubjS )r8H}r9H(hUh}r:H(h]h]h]h]h]uh jGh]r;HjB)rH(h]h]h]h]h]uh j8Hh]r?Hj,)r@H}rAH(hUh}rBH(U anchornameU #statisticsUrefurihkh]h]h]h]h]Uinternaluh jI(U anchornameU#using-properties-in-stepsUrefurihh]h]h]h]h]Uinternaluh j8Ih]r?IhXUsing Properties in Stepsr@IrAI}rBI(hXUsing Properties in Stepsh jJ(h]h]h]h]h]uh j8Jh]r?Jj,)r@J}rAJ(hUh}rBJ(U anchornameU #horizonsUrefurihh]h]h]h]h]Uinternaluh jK(h]h]h]h]h]uh j8Kh]r?Kj,)r@K}rAK(hUh}rBK(U anchornameU#properties-load-speedupUrefurihh]h]h]h]h]Uinternaluh jLj,)r?L}r@L(hUh}rAL(U anchornameU#helpful-twisted-classesUrefurihh]h]h]h]h]Uinternaluh j;Lh]rBLhXHelpful Twisted ClassesrCLrDL}rEL(hXHelpful Twisted Classesh j?Lubah!j,ubah!jBubah!jv ubjS )rFL}rGL(hUh}rHL(h]h]h]h]h]uh j$Lh]rIL(jB)rJL}rKL(hUh}rLL(h]h]h]h]h]uh jFLh]rMLj,)rNL}rOL(hUh}rPL(U anchornameU#sequences-of-operationsUrefurihh]h]h]h]h]Uinternaluh jJLh]rQLhXSequences of OperationsrRLrSL}rTL(hXSequences of Operationsh jNLubah!j,ubah!jBubjM )rUL}rVL(hUh}rWL(h]h]h]h]h]uh jFLh]rXL(jS )rYL}rZL(hUh}r[L(h]h]h]h]h]uh jULh]r\LjB)r]L}r^L(hUh}r_L(h]h]h]h]h]uh jYLh]r`Lj,)raL}rbL(hUh}rcL(U anchornameU#nested-callbacksUrefurihh]h]h]h]h]Uinternaluh j]Lh]rdLhXNested CallbacksreLrfL}rgL(hXNested Callbacksh jaLubah!j,ubah!jBubah!jv ubjS )rhL}riL(hUh}rjL(h]h]h]h]h]uh jULh]rkLjB)rlL}rmL(hUh}rnL(h]h]h]h]h]uh jhLh]roLj,)rpL}rqL(hUh}rrL(U anchornameU#inlinecallbacksUrefurihh]h]h]h]h]Uinternaluh jlLh]rsLhXinlineCallbacksrtLruL}rvL(hXinlineCallbacksh jpLubah!j,ubah!jBubah!jv ubjS )rwL}rxL(hUh}ryL(h]h]h]h]h]uh jULh]rzLjB)r{L}r|L(hUh}r}L(h]h]h]h]h]uh jwLh]r~Lj,)rL}rL(hUh}rL(U anchornameU#lockingUrefurihh]h]h]h]h]Uinternaluh j{Lh]rLhXLockingrLrL}rL(hXLockingh jLubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rL}rL(hUh}rL(h]h]h]h]h]uh j$Lh]rLjB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameU#joining-sequencesUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXJoining SequencesrLrL}rL(hXJoining Sequencesh jLubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubhjM )rL}rL(hUh}rL(h]h]h]h]h]uh]rLjS )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rL(jB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXMetricsrLrL}rL(hhh jLubah!j,ubah!jBubjM )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rL(jS )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLjB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameU#metric-eventsUrefurihh]h]h]h]h]Uinternaluh jLh]rLhX Metric EventsrLrL}rL(hX Metric Eventsh jLubah!j,ubah!jBubah!jv ubjS )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLjB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameU#metric-handlersUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXMetric HandlersrLrL}rL(hXMetric Handlersh jLubah!j,ubah!jBubah!jv ubjS )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLjB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameU#metric-watchersUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXMetric WatchersrLrL}rL(hXMetric Watchersh jLubah!j,ubah!jBubah!jv ubjS )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLjB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameU#metric-helpersUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXMetric HelpersrLrL}rL(hXMetric Helpersh jLubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubhjM )rL}rL(hUh}rL(h]h]h]h]h]uh]rLjS )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rL(jB)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj,)rL}rL(hUh}rL(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXForceSchedulerrLrL}rL(hhh jLubah!j,ubah!jBubjM )rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rL(jS )rL}rM(hUh}rM(h]h]h]h]h]uh jLh]rMjB)rM}rM(hUh}rM(h]h]h]h]h]uh jLh]rMj,)rM}rM(hUh}r M(U anchornameU #parametersUrefurihh]h]h]h]h]Uinternaluh jMh]r MhX Parametersr Mr M}r M(hX Parametersh jMubah!j,ubah!jBubah!jv ubjS )rM}rM(hUh}rM(h]h]h]h]h]uh jLh]rMjB)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj,)rM}rM(hUh}rM(U anchornameU#nested-parametersUrefurihh]h]h]h]h]Uinternaluh jMh]rMhXNested ParametersrMrM}rM(hXNested Parametersh jMubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubhjM )rM}rM(hUh}rM(h]h]h]h]h]uh]r MjS )r!M}r"M(hUh}r#M(h]h]h]h]h]uh jMh]r$M(jB)r%M}r&M(hUh}r'M(h]h]h]h]h]uh j!Mh]r(Mj,)r)M}r*M(hUh}r+M(U anchornameUUrefurihh]h]h]h]h]Uinternaluh j%Mh]r,MhXMaster Organizationr-Mr.M}r/M(hhh j)Mubah!j,ubah!jBubjM )r0M}r1M(hUh}r2M(h]h]h]h]h]uh j!Mh]r3MjS )r4M}r5M(hUh}r6M(h]h]h]h]h]uh j0Mh]r7MjB)r8M}r9M(hUh}r:M(h]h]h]h]h]uh j4Mh]r;Mj,)rM(U anchornameU#buildmaster-service-hierarchyUrefurihh]h]h]h]h]Uinternaluh j8Mh]r?MhXBuildmaster Service Hierarchyr@MrAM}rBM(hXBuildmaster Service Hierarchyh jN(h]h]h]h]h]uh jMh]r?NjB)r@N}rAN(hUh}rBN(h]h]h]h]h]uh jO(U anchornameX!#module-buildbot.util.identifiersUrefurijh]h]h]h]h]Uinternaluh j8Oh]r?OhXbuildbot.util.identifiersr@OrAO}rBO(hXbuildbot.util.identifiersh jP(hUh}r?P(h]h]h]h]h]uh j9Ph]r@Pj,)rAP}rBP(hUh}rCP(U anchornameU#buildbot-componentsUrefurijh]h]h]h]h]Uinternaluh j=Ph]rDPhXBuildbot ComponentsrEPrFP}rGP(hXBuildbot Componentsh jAPubah!j,ubah!jBubah!jv ubjS )rHP}rIP(hUh}rJP(h]h]h]h]h]uh j5Ph]rKP(jB)rLP}rMP(hUh}rNP(h]h]h]h]h]uh jHPh]rOPj,)rPP}rQP(hUh}rRP(U anchornameU #requirementsUrefurijh]h]h]h]h]Uinternaluh jLPh]rSPhX RequirementsrTPrUP}rVP(hX Requirementsh jPPubah!j,ubah!jBubjM )rWP}rXP(hUh}rYP(h]h]h]h]h]uh jHPh]rZP(jS )r[P}r\P(hUh}r]P(h]h]h]h]h]uh jWPh]r^P(jB)r_P}r`P(hUh}raP(h]h]h]h]h]uh j[Ph]rbPj,)rcP}rdP(hUh}reP(U anchornameU#common-requirementsUrefurijh]h]h]h]h]Uinternaluh j_Ph]rfPhXCommon RequirementsrgPrhP}riP(hXCommon Requirementsh jcPubah!j,ubah!jBubjM )rjP}rkP(hUh}rlP(h]h]h]h]h]uh j[Ph]rmPjS )rnP}roP(hUh}rpP(h]h]h]h]h]uh jjPh]rqPjB)rrP}rsP(hUh}rtP(h]h]h]h]h]uh jnPh]ruPj,)rvP}rwP(hUh}rxP(U anchornameU#windows-supportUrefurijh]h]h]h]h]Uinternaluh jrPh]ryPhXWindows SupportrzPr{P}r|P(hXWindows Supporth jvPubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )r}P}r~P(hUh}rP(h]h]h]h]h]uh jWPh]rPjB)rP}rP(hUh}rP(h]h]h]h]h]uh j}Ph]rPj,)rP}rP(hUh}rP(U anchornameU#buildmaster-requirementsUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXBuildmaster RequirementsrPrP}rP(hXBuildmaster Requirementsh jPubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rP}rP(hUh}rP(h]h]h]h]h]uh j5Ph]rP(jB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU#installing-the-codeUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXInstalling the coderPrP}rP(hXInstalling the codeh jPubah!j,ubah!jBubjM )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rP(jS )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU#the-distribution-packageUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXThe Distribution PackagerPrP}rP(hXThe Distribution Packageh jPubah!j,ubah!jBubah!jv ubjS )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU#installation-from-pypiUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXInstallation From PyPIrPrP}rP(hXInstallation From PyPIh jPubah!j,ubah!jBubah!jv ubjS )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU#installation-from-tarballsUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXInstallation From TarballsrPrP}rP(hXInstallation From Tarballsh jPubah!j,ubah!jBubah!jv ubjS )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU#installation-in-a-virtualenvUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXInstallation in a VirtualenvrPrP}rP(hXInstallation in a Virtualenvh jPubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rP}rP(hUh}rP(h]h]h]h]h]uh j5Ph]rPjB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU"#running-buildbot-s-tests-optionalUrefurijh]h]h]h]h]Uinternaluh jPh]rPhX#Running Buildbot's Tests (optional)rPrP}rP(hX#Running Buildbot's Tests (optional)h jPubah!j,ubah!jBubah!jv ubjS )rP}rP(hUh}rP(h]h]h]h]h]uh j5Ph]rP(jB)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj,)rP}rP(hUh}rP(U anchornameU#creating-a-buildmasterUrefurijh]h]h]h]h]Uinternaluh jPh]rPhXCreating a buildmasterrPrP}rP(hXCreating a buildmasterh jPubah!j,ubah!jBubjM )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rP(jS )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rQ(jB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jPh]rQj,)rQ}rQ(hUh}rQ(U anchornameU#using-a-database-serverUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXUsing A Database Serverr Qr Q}r Q(hXUsing A Database Serverh jQubah!j,ubah!jBubjM )r Q}r Q(hUh}rQ(h]h]h]h]h]uh jPh]rQjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh j Qh]rQjB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU#additional-requirementsUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXAdditional RequirementsrQrQ}rQ(hXAdditional Requirementsh jQubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rQ}r Q(hUh}r!Q(h]h]h]h]h]uh jPh]r"QjB)r#Q}r$Q(hUh}r%Q(h]h]h]h]h]uh jQh]r&Qj,)r'Q}r(Q(hUh}r)Q(U anchornameU#buildmaster-optionsUrefurijh]h]h]h]h]Uinternaluh j#Qh]r*QhXBuildmaster Optionsr+Qr,Q}r-Q(hXBuildmaster Optionsh j'Qubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r.Q}r/Q(hUh}r0Q(h]h]h]h]h]uh j5Ph]r1Q(jB)r2Q}r3Q(hUh}r4Q(h]h]h]h]h]uh j.Qh]r5Qj,)r6Q}r7Q(hUh}r8Q(U anchornameU"#upgrading-an-existing-buildmasterUrefurijh]h]h]h]h]Uinternaluh j2Qh]r9QhX!Upgrading an Existing Buildmasterr:Qr;Q}rQ(hUh}r?Q(h]h]h]h]h]uh j.Qh]r@QjS )rAQ}rBQ(hUh}rCQ(h]h]h]h]h]uh j=Qh]rDQ(jB)rEQ}rFQ(hUh}rGQ(h]h]h]h]h]uh jAQh]rHQj,)rIQ}rJQ(hUh}rKQ(U anchornameU#version-specific-notesUrefurijh]h]h]h]h]Uinternaluh jEQh]rLQhXVersion-specific NotesrMQrNQ}rOQ(hXVersion-specific Notesh jIQubah!j,ubah!jBubjM )rPQ}rQQ(hUh}rRQ(h]h]h]h]h]uh jAQh]rSQ(jS )rTQ}rUQ(hUh}rVQ(h]h]h]h]h]uh jPQh]rWQjB)rXQ}rYQ(hUh}rZQ(h]h]h]h]h]uh jTQh]r[Qj,)r\Q}r]Q(hUh}r^Q(U anchornameU*#upgrading-a-buildmaster-to-buildbot-0-7-6Urefurijh]h]h]h]h]Uinternaluh jXQh]r_QhX)Upgrading a Buildmaster to Buildbot-0.7.6r`QraQ}rbQ(hX)Upgrading a Buildmaster to Buildbot-0.7.6h j\Qubah!j,ubah!jBubah!jv ubjS )rcQ}rdQ(hUh}reQ(h]h]h]h]h]uh jPQh]rfQjB)rgQ}rhQ(hUh}riQ(h]h]h]h]h]uh jcQh]rjQj,)rkQ}rlQ(hUh}rmQ(U anchornameU*#upgrading-a-buildmaster-to-buildbot-0-8-0Urefurijh]h]h]h]h]Uinternaluh jgQh]rnQhX)Upgrading a Buildmaster to Buildbot-0.8.0roQrpQ}rqQ(hX)Upgrading a Buildmaster to Buildbot-0.8.0h jkQubah!j,ubah!jBubah!jv ubjS )rrQ}rsQ(hUh}rtQ(h]h]h]h]h]uh jPQh]ruQ(jB)rvQ}rwQ(hUh}rxQ(h]h]h]h]h]uh jrQh]ryQj,)rzQ}r{Q(hUh}r|Q(U anchornameU%#upgrading-into-a-non-sqlite-databaseUrefurijh]h]h]h]h]Uinternaluh jvQh]r}QhX$Upgrading into a non-SQLite databaser~QrQ}rQ(hX$Upgrading into a non-SQLite databaseh jzQubah!j,ubah!jBubjM )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jrQh]rQjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU#change-encoding-issuesUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXChange Encoding IssuesrQrQ}rQ(hXChange Encoding Issuesh jQubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jPQh]rQjB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU*#upgrading-a-buildmaster-to-later-versionsUrefurijh]h]h]h]h]Uinternaluh jQh]rQhX)Upgrading a Buildmaster to Later VersionsrQrQ}rQ(hX)Upgrading a Buildmaster to Later Versionsh jQubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubeh!jv ubjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh j5Ph]rQ(jB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU#creating-a-buildslaveUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXCreating a buildslaverQrQ}rQ(hXCreating a buildslaveh jQubah!j,ubah!jBubjM )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQ(jS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU#buildslave-optionsUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXBuildslave OptionsrQrQ}rQ(hXBuildslave Optionsh jQubah!j,ubah!jBubah!jv ubjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU#other-buildslave-configurationUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXOther Buildslave ConfigurationrQrQ}rQ(hXOther Buildslave Configurationh jQubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh j5Ph]rQ(jB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU!#upgrading-an-existing-buildslaveUrefurijh]h]h]h]h]Uinternaluh jQh]rQhX Upgrading an Existing BuildslaverQrQ}rQ(hX Upgrading an Existing Buildslaveh jQubah!j,ubah!jBubjM )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQ(jB)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj,)rQ}rQ(hUh}rQ(U anchornameU"#buildslave-version-specific-notesUrefurijh]h]h]h]h]Uinternaluh jQh]rQhXVersion-specific NotesrQrQ}rQ(hXVersion-specific Notesh jQubah!j,ubah!jBubjM )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjS )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjB)rQ}rQ(hUh}rR(h]h]h]h]h]uh jQh]rRj,)rR}rR(hUh}rR(U anchornameU/#upgrading-a-buildslave-to-buildbot-slave-0-8-1Urefurijh]h]h]h]h]Uinternaluh jQh]rRhX.Upgrading a Buildslave to Buildbot-slave-0.8.1rRrR}rR(hX.Upgrading a Buildslave to Buildbot-slave-0.8.1h jRubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubah!j ubeh!jv ubjS )r R}r R(hUh}r R(h]h]h]h]h]uh j5Ph]r RjB)r R}rR(hUh}rR(h]h]h]h]h]uh j Rh]rRj,)rR}rR(hUh}rR(U anchornameU#launching-the-daemonsUrefurijh]h]h]h]h]Uinternaluh j Rh]rRhXLaunching the daemonsrRrR}rR(hXLaunching the daemonsh jRubah!j,ubah!jBubah!jv ubjS )rR}rR(hUh}rR(h]h]h]h]h]uh j5Ph]rRjB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)r R}r!R(hUh}r"R(U anchornameU #logfilesUrefurijh]h]h]h]h]Uinternaluh jRh]r#RhXLogfilesr$Rr%R}r&R(hXLogfilesh j Rubah!j,ubah!jBubah!jv ubjS )r'R}r(R(hUh}r)R(h]h]h]h]h]uh j5Ph]r*RjB)r+R}r,R(hUh}r-R(h]h]h]h]h]uh j'Rh]r.Rj,)r/R}r0R(hUh}r1R(U anchornameU #shutdownUrefurijh]h]h]h]h]Uinternaluh j+Rh]r2RhXShutdownr3Rr4R}r5R(hXShutdownh j/Rubah!j,ubah!jBubah!jv ubjS )r6R}r7R(hUh}r8R(h]h]h]h]h]uh j5Ph]r9RjB)r:R}r;R(hUh}rR}r?R(hUh}r@R(U anchornameU #maintenanceUrefurijh]h]h]h]h]Uinternaluh j:Rh]rARhX MaintenancerBRrCR}rDR(hX Maintenanceh j>Rubah!j,ubah!jBubah!jv ubjS )rER}rFR(hUh}rGR(h]h]h]h]h]uh j5Ph]rHR(jB)rIR}rJR(hUh}rKR(h]h]h]h]h]uh jERh]rLRj,)rMR}rNR(hUh}rOR(U anchornameU#troubleshootingUrefurijh]h]h]h]h]Uinternaluh jIRh]rPRhXTroubleshootingrQRrRR}rSR(hXTroubleshootingh jMRubah!j,ubah!jBubjM )rTR}rUR(hUh}rVR(h]h]h]h]h]uh jERh]rWR(jS )rXR}rYR(hUh}rZR(h]h]h]h]h]uh jTRh]r[RjB)r\R}r]R(hUh}r^R(h]h]h]h]h]uh jXRh]r_Rj,)r`R}raR(hUh}rbR(U anchornameU#starting-the-buildslaveUrefurijh]h]h]h]h]Uinternaluh j\Rh]rcRhXStarting the buildslaverdRreR}rfR(hXStarting the buildslaveh j`Rubah!j,ubah!jBubah!jv ubjS )rgR}rhR(hUh}riR(h]h]h]h]h]uh jTRh]rjRjB)rkR}rlR(hUh}rmR(h]h]h]h]h]uh jgRh]rnRj,)roR}rpR(hUh}rqR(U anchornameU#connecting-to-the-buildmasterUrefurijh]h]h]h]h]Uinternaluh jkRh]rrRhXConnecting to the buildmasterrsRrtR}ruR(hXConnecting to the buildmasterh joRubah!j,ubah!jBubah!jv ubjS )rvR}rwR(hUh}rxR(h]h]h]h]h]uh jTRh]ryRjB)rzR}r{R(hUh}r|R(h]h]h]h]h]uh jvRh]r}Rj,)r~R}rR(hUh}rR(U anchornameU#contrib-scriptsUrefurijh]h]h]h]h]Uinternaluh jzRh]rRhXContrib ScriptsrRrR}rR(hXContrib Scriptsh j~Rubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubj(jM )rR}rR(hUh}rR(h]h]h]h]h]uh]rRjS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameUUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhX Release Notes for Buildbot 0.8.9rRrR}rR(hj0h jRubah!j,ubah!jBubjM )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameU#masterUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhXMasterrRrR}rR(hXMasterrRh jRubah!j,ubah!jBubjM )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameU #featuresUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhXFeaturesrRrR}rR(hXFeaturesrRh jRubah!j,ubah!jBubah!jv ubjS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameU#forward-compatibilityUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhXForward CompatibilityrRrR}rR(hXForward CompatibilityrRh jRubah!j,ubah!jBubah!jv ubjS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameU#fixesUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhXFixesrRrR}rR(hXFixesrRh jRubah!j,ubah!jBubah!jv ubjS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameU1#deprecations-removals-and-non-compatible-changesUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhX2Deprecations, Removals, and Non-Compatible ChangesrRrR}rR(hX2Deprecations, Removals, and Non-Compatible ChangesrRh jRubah!j,ubah!jBubah!jv ubjS )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjB)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj,)rR}rR(hUh}rR(U anchornameU#changes-for-developersUrefurij(h]h]h]h]h]Uinternaluh jRh]rRhXChanges for DevelopersrRrR}rR(hXChanges for DevelopersrRh jRubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rS}rS(hUh}rS(h]h]h]h]h]uh jRh]rS(jB)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj,)rS}r S(hUh}r S(U anchornameU#slaveUrefurij(h]h]h]h]h]Uinternaluh jSh]r ShXSlaver Sr S}rS(hXSlaverSh jSubah!j,ubah!jBubjM )rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rS(jS )rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSjB)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj,)rS}rS(hUh}rS(U anchornameU#id1Urefurij(h]h]h]h]h]Uinternaluh jSh]rShXFeaturesr Sr!S}r"S(hXFeaturesr#Sh jSubah!j,ubah!jBubah!jv ubjS )r$S}r%S(hUh}r&S(h]h]h]h]h]uh jSh]r'SjB)r(S}r)S(hUh}r*S(h]h]h]h]h]uh j$Sh]r+Sj,)r,S}r-S(hUh}r.S(U anchornameU#id2Urefurij(h]h]h]h]h]Uinternaluh j(Sh]r/ShXFixesr0Sr1S}r2S(hXFixesr3Sh j,Subah!j,ubah!jBubah!jv ubjS )r4S}r5S(hUh}r6S(h]h]h]h]h]uh jSh]r7SjB)r8S}r9S(hUh}r:S(h]h]h]h]h]uh j4Sh]r;Sj,)rS(U anchornameU#id3Urefurij(h]h]h]h]h]Uinternaluh j8Sh]r?ShX2Deprecations, Removals, and Non-Compatible Changesr@SrAS}rBS(hX2Deprecations, Removals, and Non-Compatible ChangesrCSh jT(hX Authorizationh j8Tubah!j,ubah!jBubah!jv ubjS )r?T}r@T(hUh}rAT(h]h]h]h]h]uh j,Th]rBT(jB)rCT}rDT(hUh}rET(h]h]h]h]h]uh j?Th]rFTj,)rGT}rHT(hUh}rIT(U anchornameU#forcesched-parametersUrefurij1h]h]h]h]h]Uinternaluh jCTh]rJThXForceSched ParametersrKTrLT}rMT(hXForceSched Parametersh jGTubah!j,ubah!jBubjM )rNT}rOT(hUh}rPT(h]h]h]h]h]uh j?Th]rQT(jS )rRT}rST(hUh}rTT(h]h]h]h]h]uh jNTh]rUTjB)rVT}rWT(hUh}rXT(h]h]h]h]h]uh jRTh]rYTj,)rZT}r[T(hUh}r\T(U anchornameU#fixedparameterUrefurij1h]h]h]h]h]Uinternaluh jVTh]r]ThXFixedParameterr^Tr_T}r`T(hXFixedParameterh jZTubah!j,ubah!jBubah!jv ubjS )raT}rbT(hUh}rcT(h]h]h]h]h]uh jNTh]rdTjB)reT}rfT(hUh}rgT(h]h]h]h]h]uh jaTh]rhTj,)riT}rjT(hUh}rkT(U anchornameU#stringparameterUrefurij1h]h]h]h]h]Uinternaluh jeTh]rlThXStringParameterrmTrnT}roT(hXStringParameterh jiTubah!j,ubah!jBubah!jv ubjS )rpT}rqT(hUh}rrT(h]h]h]h]h]uh jNTh]rsTjB)rtT}ruT(hUh}rvT(h]h]h]h]h]uh jpTh]rwTj,)rxT}ryT(hUh}rzT(U anchornameU#textparameterUrefurij1h]h]h]h]h]Uinternaluh jtTh]r{ThX TextParameterr|Tr}T}r~T(hX TextParameterh jxTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU #intparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThX IntParameterrTrT}rT(hX IntParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#booleanparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXBooleanParameterrTrT}rT(hXBooleanParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#usernameparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXUserNameParameterrTrT}rT(hXUserNameParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#choicestringparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXChoiceStringParameterrTrT}rT(hXChoiceStringParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#codebaseparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXCodebaseParameterrTrT}rT(hXCodebaseParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#inheritbuildparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXInheritBuildParameterrTrT}rT(hXInheritBuildParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#buildslavechoiceparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXBuildslaveChoiceParameterrTrT}rT(hXBuildslaveChoiceParameterh jTubah!j,ubah!jBubah!jv ubjS )rT}rT(hUh}rT(h]h]h]h]h]uh jNTh]rTjB)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj,)rT}rT(hUh}rT(U anchornameU#anypropertyparameterUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXAnyPropertyParameterrTrT}rT(hXAnyPropertyParameterh jTubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubj:jM )rT}rT(hUh}rT(h]h]h]h]h]uh]rTjS )rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rT(jB)rT}rU(hUh}rU(h]h]h]h]h]uh jTh]rUj,)rU}rU(hUh}rU(U anchornameUUrefurij:h]h]h]h]h]Uinternaluh jTh]rUhX ConfigurationrUrU}r U(hjBh jUubah!j,ubah!jBubjM )r U}r U(hUh}r U(h]h]h]h]h]uh jTh]r U(jS )rU}rU(hUh}rU(h]h]h]h]h]uh j Uh]rUjB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU#builder-configurationUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXBuilder ConfigurationrUrU}rU(hXBuilder Configurationh jUubah!j,ubah!jBubah!jv ubjS )rU}rU(hUh}rU(h]h]h]h]h]uh j Uh]r UjB)r!U}r"U(hUh}r#U(h]h]h]h]h]uh jUh]r$Uj,)r%U}r&U(hUh}r'U(U anchornameU#error-handlingUrefurij:h]h]h]h]h]Uinternaluh j!Uh]r(UhXError Handlingr)Ur*U}r+U(hXError Handlingh j%Uubah!j,ubah!jBubah!jv ubjS )r,U}r-U(hUh}r.U(h]h]h]h]h]uh j Uh]r/U(jB)r0U}r1U(hUh}r2U(h]h]h]h]h]uh j,Uh]r3Uj,)r4U}r5U(hUh}r6U(U anchornameU#reconfigurationUrefurij:h]h]h]h]h]Uinternaluh j0Uh]r7UhXReconfigurationr8Ur9U}r:U(hXReconfigurationh j4Uubah!j,ubah!jBubjM )r;U}rU(jS )r?U}r@U(hUh}rAU(h]h]h]h]h]uh j;Uh]rBUjB)rCU}rDU(hUh}rEU(h]h]h]h]h]uh j?Uh]rFUj,)rGU}rHU(hUh}rIU(U anchornameU#reconfigurable-servicesUrefurij:h]h]h]h]h]Uinternaluh jCUh]rJUhXReconfigurable ServicesrKUrLU}rMU(hXReconfigurable Servicesh jGUubah!j,ubah!jBubah!jv ubjS )rNU}rOU(hUh}rPU(h]h]h]h]h]uh j;Uh]rQUjB)rRU}rSU(hUh}rTU(h]h]h]h]h]uh jNUh]rUUj,)rVU}rWU(hUh}rXU(U anchornameU#change-sourcesUrefurij:h]h]h]h]h]Uinternaluh jRUh]rYUhXChange SourcesrZUr[U}r\U(hXChange Sourcesh jVUubah!j,ubah!jBubah!jv ubjS )r]U}r^U(hUh}r_U(h]h]h]h]h]uh j;Uh]r`U(jB)raU}rbU(hUh}rcU(h]h]h]h]h]uh j]Uh]rdUj,)reU}rfU(hUh}rgU(U anchornameU #schedulersUrefurij:h]h]h]h]h]Uinternaluh jaUh]rhUhX SchedulersriUrjU}rkU(hX Schedulersh jeUubah!j,ubah!jBubjM )rlU}rmU(hUh}rnU(h]h]h]h]h]uh j]Uh]roUjS )rpU}rqU(hUh}rrU(h]h]h]h]h]uh jlUh]rsUjB)rtU}ruU(hUh}rvU(h]h]h]h]h]uh jpUh]rwUj,)rxU}ryU(hUh}rzU(U anchornameU#custom-subclassesUrefurij:h]h]h]h]h]Uinternaluh jtUh]r{UhXCustom Subclassesr|Ur}U}r~U(hXCustom Subclassesh jxUubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rU}rU(hUh}rU(h]h]h]h]h]uh j;Uh]rUjB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU#slavesUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXSlavesrUrU}rU(hXSlavesh jUubah!j,ubah!jBubah!jv ubjS )rU}rU(hUh}rU(h]h]h]h]h]uh j;Uh]rUjB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU#user-managersUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhX User ManagersrUrU}rU(hX User Managersh jUubah!j,ubah!jBubah!jv ubjS )rU}rU(hUh}rU(h]h]h]h]h]uh j;Uh]rUjB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU#status-receiversUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXStatus ReceiversrUrU}rU(hXStatus Receiversh jUubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjCjM )rU}rU(hUh}rU(h]h]h]h]h]uh]rUjS )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rU(jB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameUUrefurijCh]h]h]h]h]Uinternaluh jUh]rUhX Web StatusrUrU}rU(hjKh jUubah!j,ubah!jBubjM )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rU(jS )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rU(jB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU#jinja-web-templatesUrefurijCh]h]h]h]h]Uinternaluh jUh]rUhXJinja Web TemplatesrUrU}rU(hXJinja Web Templatesh jUubah!j,ubah!jBubjM )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjS )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU #whitespaceUrefurijCh]h]h]h]h]Uinternaluh jUh]rUhX WhitespacerUrU}rU(hX Whitespaceh jUubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rU}rU(hUh}rU(U anchornameU#web-authorization-frameworkUrefurijCh]h]h]h]h]Uinternaluh jUh]rUhXWeb Authorization FrameworkrUrU}rU(hXWeb Authorization Frameworkh jUubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjLjM )rU}rU(hUh}rU(h]h]h]h]h]uh]rUjS )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rU(jB)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj,)rV}rV(hUh}rV(U anchornameUUrefurijLh]h]h]h]h]Uinternaluh jUh]rVhXStatus TargetsrVrV}rV(hjTh jVubah!j,ubah!jBubjM )rV}rV(hUh}r V(h]h]h]h]h]uh jUh]r V(jS )r V}r V(hUh}r V(h]h]h]h]h]uh jVh]rV(jB)rV}rV(hUh}rV(h]h]h]h]h]uh j Vh]rVj,)rV}rV(hUh}rV(U anchornameU #webstatusUrefurijLh]h]h]h]h]Uinternaluh jVh]rVhX WebStatusrVrV}rV(hX WebStatush jVubah!j,ubah!jBubjM )rV}rV(hUh}rV(h]h]h]h]h]uh j Vh]rV(jS )rV}rV(hUh}r V(h]h]h]h]h]uh jVh]r!VjB)r"V}r#V(hUh}r$V(h]h]h]h]h]uh jVh]r%Vj,)r&V}r'V(hUh}r(V(U anchornameU#configurationUrefurijLh]h]h]h]h]Uinternaluh j"Vh]r)VhX Configurationr*Vr+V}r,V(hX Configurationh j&Vubah!j,ubah!jBubah!jv ubjS )r-V}r.V(hUh}r/V(h]h]h]h]h]uh jVh]r0VjB)r1V}r2V(hUh}r3V(h]h]h]h]h]uh j-Vh]r4Vj,)r5V}r6V(hUh}r7V(U anchornameU#buildbot-web-resourcesUrefurijLh]h]h]h]h]Uinternaluh j1Vh]r8VhXBuildbot Web Resourcesr9Vr:V}r;V(hXBuildbot Web Resourcesh j5Vubah!j,ubah!jBubah!jv ubjS )rV(h]h]h]h]h]uh jVh]r?V(jB)r@V}rAV(hUh}rBV(h]h]h]h]h]uh jW(h]h]h]h]h]uh j8Wh]r?Wj,)r@W}rAW(hUh}rBW(U anchornameU #poller-hookUrefurijLh]h]h]h]h]Uinternaluh jX(U anchornameU#customizing-svnpollerUrefurijUh]h]h]h]h]Uinternaluh j8Xh]r?XhXCustomizing SVNPollerr@XrAX}rBX(hjh1h j8h jXubah!j,ubah!jBubah!jv ubjS )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjB)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj,)rX}rX(hUh}rX(U anchornameU#step-execution-processUrefurijUh]h]h]h]h]Uinternaluh jXh]rXhXStep Execution ProcessrXrX}rX(hj?h jXubah!j,ubah!jBubah!jv ubjS )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjB)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj,)rX}rX(hUh}rX(U anchornameU#running-commandsUrefurijUh]h]h]h]h]Uinternaluh jXh]rXhXRunning CommandsrYrY}rY(hj8h jXubah!j,ubah!jBubah!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jXh]rYjB)rY}rY(hUh}r Y(h]h]h]h]h]uh jYh]r Yj,)r Y}r Y(hUh}r Y(U anchornameU#updating-status-stringsUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXUpdating Status StringsrYrY}rY(hj0h j Yubah!j,ubah!jBubah!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jXh]rYjB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU#about-logfilesUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXAbout LogfilesrYrY}r Y(hj=h jYubah!j,ubah!jBubah!jv ubjS )r!Y}r"Y(hUh}r#Y(h]h]h]h]h]uh jXh]r$YjB)r%Y}r&Y(hUh}r'Y(h]h]h]h]h]uh j!Yh]r(Yj,)r)Y}r*Y(hUh}r+Y(U anchornameU#writing-log-filesUrefurijUh]h]h]h]h]Uinternaluh j%Yh]r,YhXWriting Log Filesr-Yr.Y}r/Y(hj >h j)Yubah!j,ubah!jBubah!jv ubjS )r0Y}r1Y(hUh}r2Y(h]h]h]h]h]uh jXh]r3YjB)r4Y}r5Y(hUh}r6Y(h]h]h]h]h]uh j0Yh]r7Yj,)r8Y}r9Y(hUh}r:Y(U anchornameU#reading-logfilesUrefurijUh]h]h]h]h]Uinternaluh j4Yh]r;YhXReading LogfilesrY(hj0h j8Yubah!j,ubah!jBubah!jv ubjS )r?Y}r@Y(hUh}rAY(h]h]h]h]h]uh jXh]rBYjB)rCY}rDY(hUh}rEY(h]h]h]h]h]uh j?Yh]rFYj,)rGY}rHY(hUh}rIY(U anchornameU#adding-logobserversUrefurijUh]h]h]h]h]Uinternaluh jCYh]rJYhXAdding LogObserversrKYrLY}rMY(hjK:h jGYubah!j,ubah!jBubah!jv ubjS )rNY}rOY(hUh}rPY(h]h]h]h]h]uh jXh]rQYjB)rRY}rSY(hUh}rTY(h]h]h]h]h]uh jNYh]rUYj,)rVY}rWY(hUh}rXY(U anchornameU#using-propertiesUrefurijUh]h]h]h]h]Uinternaluh jRYh]rYYhXUsing PropertiesrZYr[Y}r\Y(hj<h jVYubah!j,ubah!jBubah!jv ubjS )r]Y}r^Y(hUh}r_Y(h]h]h]h]h]uh jXh]r`YjB)raY}rbY(hUh}rcY(h]h]h]h]h]uh j]Yh]rdYj,)reY}rfY(hUh}rgY(U anchornameU#using-statisticsUrefurijUh]h]h]h]h]Uinternaluh jaYh]rhYhXUsing StatisticsriYrjY}rkY(hj<h jeYubah!j,ubah!jBubah!jv ubjS )rlY}rmY(hUh}rnY(h]h]h]h]h]uh jXh]roYjB)rpY}rqY(hUh}rrY(h]h]h]h]h]uh jlYh]rsYj,)rtY}ruY(hUh}rvY(U anchornameU#buildstep-urlsUrefurijUh]h]h]h]h]Uinternaluh jpYh]rwYhXBuildStep URLsrxYryY}rzY(hj5h jtYubah!j,ubah!jBubah!jv ubjS )r{Y}r|Y(hUh}r}Y(h]h]h]h]h]uh jXh]r~YjB)rY}rY(hUh}rY(h]h]h]h]h]uh j{Yh]rYj,)rY}rY(hUh}rY(U anchornameU#discovering-filesUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXDiscovering filesrYrY}rY(hj@h jYubah!j,ubah!jBubah!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jXh]rY(jB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU#a-somewhat-whimsical-exampleUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXA Somewhat Whimsical ExamplerYrY}rY(hj)h jYubah!j,ubah!jBubjM )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rY(jS )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU!#inclusion-in-the-master-cfg-fileUrefurijUh]h]h]h]h]Uinternaluh jYh]rY(hXInclusion in the rYrY}rY(hjk*h jYubj})rY}rY(hUh}rY(h]h]h]h]rYjp*aUrolejp*h]uh jYh]rYhX master.cfgrYrY}rY(hju*h jYubah!jubhX filerYrY}rY(hjy*h jYubeh!j,ubah!jBubah!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU$#python-file-somewhere-on-the-systemUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhX#python file somewhere on the systemrYrY}rY(hj*h jYubah!j,ubah!jBubah!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU;#install-this-code-into-a-standard-python-library-directoryUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhX:Install this code into a standard Python library directoryrYrY}rY(hj,h jYubah!j,ubah!jBubah!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU;#submit-the-code-for-inclusion-in-the-buildbot-distributionUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhX:Submit the code for inclusion in the Buildbot distributionrYrY}rY(hj,h jYubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubjS )rY}rY(hUh}rY(h]h]h]h]h]uh jWh]rYjB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rY(hUh}rY(U anchornameU#writing-new-status-pluginsUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXWriting New Status PluginsrYrY}rY(hj-h jYubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubj^jM )rY}rY(hUh}rY(h]h]h]h]h]uh]rYjS )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rY(jB)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj,)rY}rZ(hUh}rZ(U anchornameUUrefurij^h]h]h]h]h]Uinternaluh jYh]rZhX!Release Notes for Buildbot v0.8.8rZrZ}rZ(hjfh jYubah!j,ubah!jBubjM )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jYh]r Z(jS )r Z}r Z(hUh}r Z(h]h]h]h]h]uh jZh]r Z(jB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh j Zh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#masterUrefurij^h]h]h]h]h]Uinternaluh jZh]rZhXMasterrZrZ}rZ(hXMasterh jZubah!j,ubah!jBubjM )rZ}rZ(hUh}rZ(h]h]h]h]h]uh j Zh]rZ(jS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]r ZjB)r!Z}r"Z(hUh}r#Z(h]h]h]h]h]uh jZh]r$Zj,)r%Z}r&Z(hUh}r'Z(U anchornameU #featuresUrefurij^h]h]h]h]h]Uinternaluh j!Zh]r(ZhXFeaturesr)Zr*Z}r+Z(hXFeaturesh j%Zubah!j,ubah!jBubah!jv ubjS )r,Z}r-Z(hUh}r.Z(h]h]h]h]h]uh jZh]r/ZjB)r0Z}r1Z(hUh}r2Z(h]h]h]h]h]uh j,Zh]r3Zj,)r4Z}r5Z(hUh}r6Z(U anchornameU1#deprecations-removals-and-non-compatible-changesUrefurij^h]h]h]h]h]Uinternaluh j0Zh]r7ZhX2Deprecations, Removals, and Non-Compatible Changesr8Zr9Z}r:Z(hX2Deprecations, Removals, and Non-Compatible Changesh j4Zubah!j,ubah!jBubah!jv ubjS )r;Z}rZjB)r?Z}r@Z(hUh}rAZ(h]h]h]h]h]uh j;Zh]rBZj,)rCZ}rDZ(hUh}rEZ(U anchornameU#changes-for-developersUrefurij^h]h]h]h]h]Uinternaluh j?Zh]rFZhXChanges for DevelopersrGZrHZ}rIZ(hXChanges for Developersh jCZubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rJZ}rKZ(hUh}rLZ(h]h]h]h]h]uh jZh]rMZ(jB)rNZ}rOZ(hUh}rPZ(h]h]h]h]h]uh jJZh]rQZj,)rRZ}rSZ(hUh}rTZ(U anchornameU#slaveUrefurij^h]h]h]h]h]Uinternaluh jNZh]rUZhXSlaverVZrWZ}rXZ(hXSlaveh jRZubah!j,ubah!jBubjM )rYZ}rZZ(hUh}r[Z(h]h]h]h]h]uh jJZh]r\Z(jS )r]Z}r^Z(hUh}r_Z(h]h]h]h]h]uh jYZh]r`ZjB)raZ}rbZ(hUh}rcZ(h]h]h]h]h]uh j]Zh]rdZj,)reZ}rfZ(hUh}rgZ(U anchornameU#id1Urefurij^h]h]h]h]h]Uinternaluh jaZh]rhZhXFeaturesriZrjZ}rkZ(hXFeaturesh jeZubah!j,ubah!jBubah!jv ubjS )rlZ}rmZ(hUh}rnZ(h]h]h]h]h]uh jYZh]roZjB)rpZ}rqZ(hUh}rrZ(h]h]h]h]h]uh jlZh]rsZj,)rtZ}ruZ(hUh}rvZ(U anchornameU#id2Urefurij^h]h]h]h]h]Uinternaluh jpZh]rwZhX2Deprecations, Removals, and Non-Compatible ChangesrxZryZ}rzZ(hX2Deprecations, Removals, and Non-Compatible Changesh jtZubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r{Z}r|Z(hUh}r}Z(h]h]h]h]h]uh jZh]r~ZjB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh j{Zh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#detailsUrefurij^h]h]h]h]h]Uinternaluh jZh]rZhXDetailsrZrZ}rZ(hXDetailsh jZubah!j,ubah!jBubah!jv ubjS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#older-versionsUrefurij^h]h]h]h]h]Uinternaluh jZh]rZhXOlder VersionsrZrZ}rZ(hXOlder Versionsh jZubah!j,ubah!jBubjM )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj)rZ}rZ(hUh}rZ(UnumberedKUparentj^U titlesonlyUglobh]h]h]h]h]Uentries]rZ(NjBrZNjBrZeUhiddenUmaxdepthKU includefiles]rZ(jBjBeU includehiddenuh jZh]h!jubah!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjgjM )rZ}rZ(hUh}rZ(h]h]h]h]h]uh]rZjS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj,)rZ}rZ(hUh}rZ(U anchornameUUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXConfiguring BuildbotrZrZ}rZ(hjoh jZubah!j,ubah!jBubjM )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#config-file-formatUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXConfig File FormatrZrZ}rZ(hXConfig File Formath jZubah!j,ubah!jBubjM )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#basic-python-syntaxUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXBasic Python SyntaxrZrZ}rZ(hXBasic Python Syntaxh jZubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#predefined-config-file-symbolsUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXPredefined Config File SymbolsrZrZ}rZ(hXPredefined Config File Symbolsh jZubah!j,ubah!jBubah!jv ubjS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjB)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj,)rZ}rZ(hUh}rZ(U anchornameU#testing-the-config-fileUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXTesting the Config FilerZrZ}rZ(hXTesting the Config Fileh jZubah!j,ubah!jBubah!jv ubjS )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jB)rZ}r[(hUh}r[(h]h]h]h]h]uh jZh]r[j,)r[}r[(hUh}r[(U anchornameU#loading-the-config-fileUrefurijgh]h]h]h]h]Uinternaluh jZh]r[hXLoading the Config Filer[r[}r [(hXLoading the Config Fileh j[ubah!j,ubah!jBubjM )r [}r [(hUh}r [(h]h]h]h]h]uh jZh]r [(jS )r[}r[(hUh}r[(h]h]h]h]h]uh j [h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameU##reloading-the-config-file-reconfigUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hX$Reloading the Config File (reconfig)r[r[}r[(hX$Reloading the Config File (reconfig)h j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh j [h]r [jB)r![}r"[(hUh}r#[(h]h]h]h]h]uh j[h]r$[j,)r%[}r&[(hUh}r'[(U anchornameU#reconfig-by-debug-clientUrefurijgh]h]h]h]h]Uinternaluh j![h]r([hXReconfig by Debug Clientr)[r*[}r+[(hXReconfig by Debug Clienth j%[ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjpjM )r,[}r-[(hUh}r.[(h]h]h]h]h]uh]r/[jS )r0[}r1[(hUh}r2[(h]h]h]h]h]uh j,[h]r3[(jB)r4[}r5[(hUh}r6[(h]h]h]h]h]uh j0[h]r7[j,)r8[}r9[(hUh}r:[(U anchornameUUrefurijph]h]h]h]h]Uinternaluh j4[h]r;[hXDatabaser<[r=[}r>[(hjxh j8[ubah!j,ubah!jBubjM )r?[}r@[(hUh}rA[(h]h]h]h]h]uh j0[h]rB[(jS )rC[}rD[(hUh}rE[(h]h]h]h]h]uh j?[h]rF[jB)rG[}rH[(hUh}rI[(h]h]h]h]h]uh jC[h]rJ[j,)rK[}rL[(hUh}rM[(U anchornameU#database-overviewUrefurijph]h]h]h]h]Uinternaluh jG[h]rN[hXDatabase OverviewrO[rP[}rQ[(hXDatabase Overviewh jK[ubah!j,ubah!jBubah!jv ubjS )rR[}rS[(hUh}rT[(h]h]h]h]h]uh j?[h]rU[jB)rV[}rW[(hUh}rX[(h]h]h]h]h]uh jR[h]rY[j,)rZ[}r[[(hUh}r\[(U anchornameU#schemaUrefurijph]h]h]h]h]Uinternaluh jV[h]r][hXSchemar^[r_[}r`[(hXSchemah jZ[ubah!j,ubah!jBubah!jv ubjS )ra[}rb[(hUh}rc[(h]h]h]h]h]uh j?[h]rd[(jB)re[}rf[(hUh}rg[(h]h]h]h]h]uh ja[h]rh[j,)ri[}rj[(hUh}rk[(U anchornameU#apiUrefurijph]h]h]h]h]Uinternaluh je[h]rl[hXAPIrm[rn[}ro[(hXAPIh ji[ubah!j,ubah!jBubjM )rp[}rq[(hUh}rr[(h]h]h]h]h]uh ja[h]rs[(jS )rt[}ru[(hUh}rv[(h]h]h]h]h]uh jp[h]rw[jB)rx[}ry[(hUh}rz[(h]h]h]h]h]uh jt[h]r{[j,)r|[}r}[(hUh}r~[(U anchornameX!#module-buildbot.db.buildrequestsUrefurijph]h]h]h]h]Uinternaluh jx[h]r[hX buildrequestsr[r[}r[(hX buildrequestsh j|[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX#module-buildbot.db.buildsUrefurijph]h]h]h]h]Uinternaluh j[h]r[hXbuildsr[r[}r[(hXbuildsh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX#module-buildbot.db.buildsetsUrefurijph]h]h]h]h]Uinternaluh j[h]r[hX buildsetsr[r[}r[(hX buildsetsh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX#module-buildbot.db.buildslavesUrefurijph]h]h]h]h]Uinternaluh j[h]r[hX buildslavesr[r[}r[(hX buildslavesh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX#module-buildbot.db.changesUrefurijph]h]h]h]h]Uinternaluh j[h]r[hXchangesr[r[}r[(hXchangesh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX#module-buildbot.db.schedulersUrefurijph]h]h]h]h]Uinternaluh j[h]r[hX schedulersr[r[}r[(hX schedulersh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX #module-buildbot.db.sourcestampsUrefurijph]h]h]h]h]Uinternaluh j[h]r[hX sourcestampsr[r[}r[(hX sourcestampsh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX##module-buildbot.db.sourcestampsetsUrefurijph]h]h]h]h]Uinternaluh j[h]r[hXsourcestampsetr[r[}r[(hXsourcestampseth j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j,)r[}r[(hUh}r[(U anchornameX#module-buildbot.db.stateUrefurijph]h]h]h]h]Uinternaluh j[h]r[hXstater[r[}r[(hXstateh j[ubah!j,ubah!jBubah!jv ubjS )r[}r[(hUh}r[(h]h]h]h]h]uh jp[h]r[jB)r[}r\(hUh}r\(h]h]h]h]h]uh j[h]r\j,)r\}r\(hUh}r\(U anchornameX#module-buildbot.db.usersUrefurijph]h]h]h]h]Uinternaluh j[h]r\hXusersr\r\}r \(hXusersh j\ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r \}r \(hUh}r \(h]h]h]h]h]uh j?[h]r \(jB)r\}r\(hUh}r\(h]h]h]h]h]uh j \h]r\j,)r\}r\(hUh}r\(U anchornameU##writing-database-connector-methodsUrefurijph]h]h]h]h]Uinternaluh j\h]r\hX"Writing Database Connector Methodsr\r\}r\(hX"Writing Database Connector Methodsh j\ubah!j,ubah!jBubjM )r\}r\(hUh}r\(h]h]h]h]h]uh j \h]r\(jS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r \jB)r!\}r"\(hUh}r#\(h]h]h]h]h]uh j\h]r$\j,)r%\}r&\(hUh}r'\(U anchornameX#module-buildbot.db.connectorUrefurijph]h]h]h]h]Uinternaluh j!\h]r(\hXThe DB Connector and Componentsr)\r*\}r+\(hXThe DB Connector and Componentsh j%\ubah!j,ubah!jBubah!jv ubjS )r,\}r-\(hUh}r.\(h]h]h]h]h]uh j\h]r/\jB)r0\}r1\(hUh}r2\(h]h]h]h]h]uh j,\h]r3\j,)r4\}r5\(hUh}r6\(U anchornameX#module-buildbot.db.poolUrefurijph]h]h]h]h]Uinternaluh j0\h]r7\hXDirect Database Accessr8\r9\}r:\(hXDirect Database Accessh j4\ubah!j,ubah!jBubah!jv ubjS )r;\}r<\(hUh}r=\(h]h]h]h]h]uh j\h]r>\jB)r?\}r@\(hUh}rA\(h]h]h]h]h]uh j;\h]rB\j,)rC\}rD\(hUh}rE\(U anchornameX#module-buildbot.db.modelUrefurijph]h]h]h]h]Uinternaluh j?\h]rF\hXDatabase SchemarG\rH\}rI\(hXDatabase Schemah jC\ubah!j,ubah!jBubah!jv ubjS )rJ\}rK\(hUh}rL\(h]h]h]h]h]uh j\h]rM\jB)rN\}rO\(hUh}rP\(h]h]h]h]h]uh jJ\h]rQ\j,)rR\}rS\(hUh}rT\(U anchornameU#cachingUrefurijph]h]h]h]h]Uinternaluh jN\h]rU\hXCachingrV\rW\}rX\(hXCachingh jR\ubah!j,ubah!jBubah!jv ubjS )rY\}rZ\(hUh}r[\(h]h]h]h]h]uh j\h]r\\jB)r]\}r^\(hUh}r_\(h]h]h]h]h]uh jY\h]r`\j,)ra\}rb\(hUh}rc\(U anchornameU#testsUrefurijph]h]h]h]h]Uinternaluh j]\h]rd\hXTestsre\rf\}rg\(hXTestsh ja\ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rh\}ri\(hUh}rj\(h]h]h]h]h]uh j?[h]rk\jB)rl\}rm\(hUh}rn\(h]h]h]h]h]uh jh\h]ro\j,)rp\}rq\(hUh}rr\(U anchornameU#modifying-the-database-schemaUrefurijph]h]h]h]h]Uinternaluh jl\h]rs\hXModifying the Database Schemart\ru\}rv\(hXModifying the Database Schemah jp\ubah!j,ubah!jBubah!jv ubjS )rw\}rx\(hUh}ry\(h]h]h]h]h]uh j?[h]rz\(jB)r{\}r|\(hUh}r}\(h]h]h]h]h]uh jw\h]r~\j,)r\}r\(hUh}r\(U anchornameU#database-compatibility-notesUrefurijph]h]h]h]h]Uinternaluh j{\h]r\hXDatabase Compatibility Notesr\r\}r\(hXDatabase Compatibility Notesh j\ubah!j,ubah!jBubjM )r\}r\(hUh}r\(h]h]h]h]h]uh jw\h]r\(jS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameU#index-length-in-mysqlUrefurijph]h]h]h]h]Uinternaluh j\h]r\hXIndex Length in MySQLr\r\}r\(hXIndex Length in MySQLh j\ubah!j,ubah!jBubah!jv ubjS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameU#transactions-in-mysqlUrefurijph]h]h]h]h]Uinternaluh j\h]r\hXTransactions in MySQLr\r\}r\(hXTransactions in MySQLh j\ubah!j,ubah!jBubah!jv ubjS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameU*#referential-integrity-in-sqlite-and-mysqlUrefurijph]h]h]h]h]Uinternaluh j\h]r\hX)Referential Integrity in SQLite and MySQLr\r\}r\(hX)Referential Integrity in SQLite and MySQLh j\ubah!j,ubah!jBubah!jv ubjS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameU#subqueries-in-mysqlUrefurijph]h]h]h]h]Uinternaluh j\h]r\hXSubqueries in MySQLr\r\}r\(hXSubqueries in MySQLh j\ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjyjM )r\}r\(hUh}r\(h]h]h]h]h]uh]r\jS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\(jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameUUrefurijyh]h]h]h]h]Uinternaluh j\h]r\hXBuilder Configurationr\r\}r\(hjh j\ubah!j,ubah!jBubjM )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\(jS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameU#merging-build-requestsUrefurijyh]h]h]h]h]Uinternaluh j\h]r\hXMerging Build Requestsr\r\}r\(hXMerging Build Requestsh j\ubah!j,ubah!jBubah!jv ubjS )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jB)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j,)r\}r\(hUh}r\(U anchornameU#prioritizing-buildsUrefurijyh]h]h]h]h]Uinternaluh j\h]r\hXPrioritizing Buildsr\r\}r\(hXPrioritizing Buildsh j\ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )r\}r\(hUh}r\(h]h]h]h]h]uh]r\jS )r\}r](hUh}r](h]h]h]h]h]uh j\h]r](jB)r]}r](hUh}r](h]h]h]h]h]uh j\h]r]j,)r]}r](hUh}r ](U anchornameUUrefurijh]h]h]h]h]Uinternaluh j]h]r ]hX Build Stepsr ]r ]}r ](hjh j]ubah!j,ubah!jBubjM )r]}r](hUh}r](h]h]h]h]h]uh j\h]r](jS )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#common-parametersUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXCommon Parametersr]r]}r ](hXCommon Parametersh j]ubah!j,ubah!jBubah!jv ubjS )r!]}r"](hUh}r#](h]h]h]h]h]uh j]h]r$](jB)r%]}r&](hUh}r'](h]h]h]h]h]uh j!]h]r(]j,)r)]}r*](hUh}r+](U anchornameX#module-buildbot.steps.sourceUrefurijh]h]h]h]h]Uinternaluh j%]h]r,]hXSource Checkoutr-]r.]}r/](hXSource Checkouth j)]ubah!j,ubah!jBubjM )r0]}r1](hUh}r2](h]h]h]h]h]uh j!]h]r3](jS )r4]}r5](hUh}r6](h]h]h]h]h]uh j0]h]r7]jB)r8]}r9](hUh}r:](h]h]h]h]h]uh j4]h]r;]j,)r<]}r=](hUh}r>](U anchornameU#id3Urefurijh]h]h]h]h]Uinternaluh j8]h]r?]hXCommon Parametersr@]rA]}rB](hXCommon Parametersh j<]ubah!j,ubah!jBubah!jv ubjS )rC]}rD](hUh}rE](h]h]h]h]h]uh j0]h]rF]jB)rG]}rH](hUh}rI](h]h]h]h]h]uh jC]h]rJ]j,)rK]}rL](hUh}rM](U anchornameU #mercurialUrefurijh]h]h]h]h]Uinternaluh jG]h]rN]hX MercurialrO]rP]}rQ](hX Mercurialh jK]ubah!j,ubah!jBubah!jv ubjS )rR]}rS](hUh}rT](h]h]h]h]h]uh j0]h]rU]jB)rV]}rW](hUh}rX](h]h]h]h]h]uh jR]h]rY]j,)rZ]}r[](hUh}r\](U anchornameU#gitUrefurijh]h]h]h]h]Uinternaluh jV]h]r]]hXGitr^]r_]}r`](hXGith jZ]ubah!j,ubah!jBubah!jv ubjS )ra]}rb](hUh}rc](h]h]h]h]h]uh j0]h]rd]jB)re]}rf](hUh}rg](h]h]h]h]h]uh ja]h]rh]j,)ri]}rj](hUh}rk](U anchornameU#svnUrefurijh]h]h]h]h]Uinternaluh je]h]rl]hXSVNrm]rn]}ro](hXSVNh ji]ubah!j,ubah!jBubah!jv ubjS )rp]}rq](hUh}rr](h]h]h]h]h]uh j0]h]rs]jB)rt]}ru](hUh}rv](h]h]h]h]h]uh jp]h]rw]j,)rx]}ry](hUh}rz](U anchornameU#cvsUrefurijh]h]h]h]h]Uinternaluh jt]h]r{]hXCVSr|]r}]}r~](hXCVSh jx]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j0]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#bzrUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXBzrr]r]}r](hXBzrh j]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j0]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#p4Urefurijh]h]h]h]h]Uinternaluh j]h]r]hXP4r]r]}r](hXP4h j]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j0]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#repoUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXRepor]r]}r](hXRepoh j]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j0]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#gerritUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXGerritr]r]}r](hXGerrith j]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j0]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#darcsUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXDarcsr]r]}r](hXDarcsh j]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j0]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU #monotoneUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXMonotoner]r]}r](hXMonotoneh j]ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j]h]r](jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#source-checkout-slave-sideUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXSource Checkout (Slave-Side)r]r]}r](hXSource Checkout (Slave-Side)h j]ubah!j,ubah!jBubjM )r]}r](hUh}r](h]h]h]h]h]uh j]h]r](jS )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]jB)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j,)r]}r](hUh}r](U anchornameU#cvs-slave-sideUrefurijh]h]h]h]h]Uinternaluh j]h]r]hXCVS (Slave-Side)r]r]}r](hXCVS (Slave-Side)h j]ubah!j,ubah!jBubah!jv ubjS )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]jB)r]}r^(hUh}r^(h]h]h]h]h]uh j]h]r^j,)r^}r^(hUh}r^(U anchornameU#svn-slave-sideUrefurijh]h]h]h]h]Uinternaluh j]h]r^hXSVN (Slave-Side)r^r^}r ^(hXSVN (Slave-Side)h j^ubah!j,ubah!jBubah!jv ubjS )r ^}r ^(hUh}r ^(h]h]h]h]h]uh j]h]r ^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j ^h]r^j,)r^}r^(hUh}r^(U anchornameU#darcs-slave-sideUrefurijh]h]h]h]h]Uinternaluh j^h]r^hXDarcs (Slave-Side)r^r^}r^(hXDarcs (Slave-Side)h j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j]h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r ^j,)r!^}r"^(hUh}r#^(U anchornameU#mercurial-slave-sideUrefurijh]h]h]h]h]Uinternaluh j^h]r$^hXMercurial (Slave-Side)r%^r&^}r'^(hXMercurial (Slave-Side)h j!^ubah!j,ubah!jBubah!jv ubjS )r(^}r)^(hUh}r*^(h]h]h]h]h]uh j]h]r+^jB)r,^}r-^(hUh}r.^(h]h]h]h]h]uh j(^h]r/^j,)r0^}r1^(hUh}r2^(U anchornameU#bzr-slave-sideUrefurijh]h]h]h]h]Uinternaluh j,^h]r3^hXBzr (Slave-Side)r4^r5^}r6^(hXBzr (Slave-Side)h j0^ubah!j,ubah!jBubah!jv ubjS )r7^}r8^(hUh}r9^(h]h]h]h]h]uh j]h]r:^jB)r;^}r<^(hUh}r=^(h]h]h]h]h]uh j7^h]r>^j,)r?^}r@^(hUh}rA^(U anchornameU#p4-slave-sideUrefurijh]h]h]h]h]Uinternaluh j;^h]rB^hXP4 (Slave-Side)rC^rD^}rE^(hXP4 (Slave-Side)h j?^ubah!j,ubah!jBubah!jv ubjS )rF^}rG^(hUh}rH^(h]h]h]h]h]uh j]h]rI^jB)rJ^}rK^(hUh}rL^(h]h]h]h]h]uh jF^h]rM^j,)rN^}rO^(hUh}rP^(U anchornameU#git-slave-sideUrefurijh]h]h]h]h]Uinternaluh jJ^h]rQ^hXGit (Slave-Side)rR^rS^}rT^(hXGit (Slave-Side)h jN^ubah!j,ubah!jBubah!jv ubjS )rU^}rV^(hUh}rW^(h]h]h]h]h]uh j]h]rX^jB)rY^}rZ^(hUh}r[^(h]h]h]h]h]uh jU^h]r\^j,)r]^}r^^(hUh}r_^(U anchornameU#bitkeeper-slave-sideUrefurijh]h]h]h]h]Uinternaluh jY^h]r`^hXBitKeeper (Slave-Side)ra^rb^}rc^(hXBitKeeper (Slave-Side)h j]^ubah!j,ubah!jBubah!jv ubjS )rd^}re^(hUh}rf^(h]h]h]h]h]uh j]h]rg^jB)rh^}ri^(hUh}rj^(h]h]h]h]h]uh jd^h]rk^j,)rl^}rm^(hUh}rn^(U anchornameU#repo-slave-sideUrefurijh]h]h]h]h]Uinternaluh jh^h]ro^hXRepo (Slave-Side)rp^rq^}rr^(hXRepo (Slave-Side)h jl^ubah!j,ubah!jBubah!jv ubjS )rs^}rt^(hUh}ru^(h]h]h]h]h]uh j]h]rv^jB)rw^}rx^(hUh}ry^(h]h]h]h]h]uh js^h]rz^j,)r{^}r|^(hUh}r}^(U anchornameU#monotone-slave-sideUrefurijh]h]h]h]h]Uinternaluh jw^h]r~^hXMonotone (Slave-Side)r^r^}r^(hXMonotone (Slave-Side)h j{^ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j]h]r^(jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU #shellcommandUrefurijh]h]h]h]h]Uinternaluh j^h]r^hX ShellCommandr^r^}r^(hX ShellCommandh j^ubah!j,ubah!jBubjM )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^(jS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU#using-shellcommandsUrefurijh]h]h]h]h]Uinternaluh j^h]r^hXUsing ShellCommandsr^r^}r^(hXUsing ShellCommandsh j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU #configureUrefurijh]h]h]h]h]Uinternaluh j^h]r^hX Configurer^r^}r^(hX Configureh j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU#compileUrefurijh]h]h]h]h]Uinternaluh j^h]r^hXCompiler^r^}r^(hXCompileh j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU #visual-cUrefurijh]h]h]h]h]Uinternaluh j^h]r^hX Visual C++r^r^}r^(hX Visual C++h j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU #robocopyUrefurijh]h]h]h]h]Uinternaluh j^h]r^hXRobocopyr^r^}r^(hXRobocopyh j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU#testUrefurijh]h]h]h]h]Uinternaluh j^h]r^hXTestr^r^}r^(hXTesth j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jB)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j,)r^}r^(hUh}r^(U anchornameU #treesizeUrefurijh]h]h]h]h]Uinternaluh j^h]r^hXTreeSizer^r^}r^(hXTreeSizeh j^ubah!j,ubah!jBubah!jv ubjS )r^}r^(hUh}r_(h]h]h]h]h]uh j^h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j^h]r_j,)r_}r_(hUh}r_(U anchornameU#perlmoduletestUrefurijh]h]h]h]h]Uinternaluh j_h]r _hXPerlModuleTestr _r _}r _(hXPerlModuleTesth j_ubah!j,ubah!jBubah!jv ubjS )r _}r_(hUh}r_(h]h]h]h]h]uh j^h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j _h]r_j,)r_}r_(hUh}r_(U anchornameU#mtr-mysql-test-runUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXMTR (mysql-test-run)r_r_}r_(hXMTR (mysql-test-run)h j_ubah!j,ubah!jBubah!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j^h]r_jB)r _}r!_(hUh}r"_(h]h]h]h]h]uh j_h]r#_j,)r$_}r%_(hUh}r&_(U anchornameU#subunitshellcommandUrefurijh]h]h]h]h]Uinternaluh j _h]r'_hXSubunitShellCommandr(_r)_}r*_(hXSubunitShellCommandh j$_ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r+_}r,_(hUh}r-_(h]h]h]h]h]uh j]h]r._(jB)r/_}r0_(hUh}r1_(h]h]h]h]h]uh j+_h]r2_j,)r3_}r4_(hUh}r5_(U anchornameU#slave-filesystem-stepsUrefurijh]h]h]h]h]Uinternaluh j/_h]r6_hXSlave Filesystem Stepsr7_r8_}r9_(hXSlave Filesystem Stepsh j3_ubah!j,ubah!jBubjM )r:_}r;_(hUh}r<_(h]h]h]h]h]uh j+_h]r=_(jS )r>_}r?_(hUh}r@_(h]h]h]h]h]uh j:_h]rA_jB)rB_}rC_(hUh}rD_(h]h]h]h]h]uh j>_h]rE_j,)rF_}rG_(hUh}rH_(U anchornameU #fileexistsUrefurijh]h]h]h]h]Uinternaluh jB_h]rI_hX FileExistsrJ_rK_}rL_(hX FileExistsh jF_ubah!j,ubah!jBubah!jv ubjS )rM_}rN_(hUh}rO_(h]h]h]h]h]uh j:_h]rP_jB)rQ_}rR_(hUh}rS_(h]h]h]h]h]uh jM_h]rT_j,)rU_}rV_(hUh}rW_(U anchornameU#copydirectoryUrefurijh]h]h]h]h]Uinternaluh jQ_h]rX_hX CopyDirectoryrY_rZ_}r[_(hX CopyDirectoryh jU_ubah!j,ubah!jBubah!jv ubjS )r\_}r]_(hUh}r^_(h]h]h]h]h]uh j:_h]r__jB)r`_}ra_(hUh}rb_(h]h]h]h]h]uh j\_h]rc_j,)rd_}re_(hUh}rf_(U anchornameU#removedirectoryUrefurijh]h]h]h]h]Uinternaluh j`_h]rg_hXRemoveDirectoryrh_ri_}rj_(hXRemoveDirectoryh jd_ubah!j,ubah!jBubah!jv ubjS )rk_}rl_(hUh}rm_(h]h]h]h]h]uh j:_h]rn_jB)ro_}rp_(hUh}rq_(h]h]h]h]h]uh jk_h]rr_j,)rs_}rt_(hUh}ru_(U anchornameU#makedirectoryUrefurijh]h]h]h]h]Uinternaluh jo_h]rv_hX MakeDirectoryrw_rx_}ry_(hX MakeDirectoryh js_ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rz_}r{_(hUh}r|_(h]h]h]h]h]uh j]h]r}_(jB)r~_}r_(hUh}r_(h]h]h]h]h]uh jz_h]r_j,)r_}r_(hUh}r_(U anchornameU#python-buildstepsUrefurijh]h]h]h]h]Uinternaluh j~_h]r_hXPython BuildStepsr_r_}r_(hXPython BuildStepsh j_ubah!j,ubah!jBubjM )r_}r_(hUh}r_(h]h]h]h]h]uh jz_h]r_(jS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU #buildepydocUrefurijh]h]h]h]h]Uinternaluh j_h]r_hX BuildEPYDocr_r_}r_(hX BuildEPYDoch j_ubah!j,ubah!jBubah!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU #pyflakesUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXPyFlakesr_r_}r_(hXPyFlakesh j_ubah!j,ubah!jBubah!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU#sphinxUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXSphinxr_r_}r_(hXSphinxh j_ubah!j,ubah!jBubah!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU#pylintUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXPyLintr_r_}r_(hXPyLinth j_ubah!j,ubah!jBubah!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU#trialUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXTrialr_r_}r_(hXTrialh j_ubah!j,ubah!jBubah!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU #removepycsUrefurijh]h]h]h]h]Uinternaluh j_h]r_hX RemovePYCsr_r_}r_(hX RemovePYCsh j_ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r_}r_(hUh}r_(h]h]h]h]h]uh j]h]r_(jB)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j,)r_}r_(hUh}r_(U anchornameU#transferring-filesUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXTransferring Filesr_r_}r_(hXTransferring Filesh j_ubah!j,ubah!jBubjM )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_(jS )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jB)r_}r_(hUh}r`(h]h]h]h]h]uh j_h]r`j,)r`}r`(hUh}r`(U anchornameU#other-parametersUrefurijh]h]h]h]h]Uinternaluh j_h]r`hXOther Parametersr`r`}r`(hXOther Parametersh j`ubah!j,ubah!jBubah!jv ubjS )r `}r `(hUh}r `(h]h]h]h]h]uh j_h]r `jB)r `}r`(hUh}r`(h]h]h]h]h]uh j `h]r`j,)r`}r`(hUh}r`(U anchornameU#transfering-directoriesUrefurijh]h]h]h]h]Uinternaluh j `h]r`hXTransfering Directoriesr`r`}r`(hXTransfering Directoriesh j`ubah!j,ubah!jBubah!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh j_h]r`jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r `}r!`(hUh}r"`(U anchornameU$#transferring-multiple-files-at-onceUrefurijh]h]h]h]h]Uinternaluh j`h]r#`hX#Transferring Multiple Files At Oncer$`r%`}r&`(hX#Transferring Multiple Files At Onceh j `ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r'`}r(`(hUh}r)`(h]h]h]h]h]uh j]h]r*`jB)r+`}r,`(hUh}r-`(h]h]h]h]h]uh j'`h]r.`j,)r/`}r0`(hUh}r1`(U anchornameU#transfering-stringsUrefurijh]h]h]h]h]Uinternaluh j+`h]r2`hXTransfering Stringsr3`r4`}r5`(hXTransfering Stringsh j/`ubah!j,ubah!jBubah!jv ubjS )r6`}r7`(hUh}r8`(h]h]h]h]h]uh j]h]r9`(jB)r:`}r;`(hUh}r<`(h]h]h]h]h]uh j6`h]r=`j,)r>`}r?`(hUh}r@`(U anchornameU#running-commands-on-the-masterUrefurijh]h]h]h]h]Uinternaluh j:`h]rA`hXRunning Commands on the MasterrB`rC`}rD`(hXRunning Commands on the Masterh j>`ubah!j,ubah!jBubjM )rE`}rF`(hUh}rG`(h]h]h]h]h]uh j6`h]rH`jS )rI`}rJ`(hUh}rK`(h]h]h]h]h]uh jE`h]rL`jB)rM`}rN`(hUh}rO`(h]h]h]h]h]uh jI`h]rP`j,)rQ`}rR`(hUh}rS`(U anchornameU#logrenderableUrefurijh]h]h]h]h]Uinternaluh jM`h]rT`hX LogRenderablerU`rV`}rW`(hX LogRenderableh jQ`ubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rX`}rY`(hUh}rZ`(h]h]h]h]h]uh j]h]r[`(jB)r\`}r]`(hUh}r^`(h]h]h]h]h]uh jX`h]r_`j,)r``}ra`(hUh}rb`(U anchornameU#setting-propertiesUrefurijh]h]h]h]h]Uinternaluh j\`h]rc`hXSetting Propertiesrd`re`}rf`(hXSetting Propertiesh j``ubah!j,ubah!jBubjM )rg`}rh`(hUh}ri`(h]h]h]h]h]uh jX`h]rj`(jS )rk`}rl`(hUh}rm`(h]h]h]h]h]uh jg`h]rn`jB)ro`}rp`(hUh}rq`(h]h]h]h]h]uh jk`h]rr`j,)rs`}rt`(hUh}ru`(U anchornameU #setpropertyUrefurijh]h]h]h]h]Uinternaluh jo`h]rv`hX SetPropertyrw`rx`}ry`(hX SetPropertyh js`ubah!j,ubah!jBubah!jv ubjS )rz`}r{`(hUh}r|`(h]h]h]h]h]uh jg`h]r}`jB)r~`}r`(hUh}r`(h]h]h]h]h]uh jz`h]r`j,)r`}r`(hUh}r`(U anchornameU#setpropertyfromcommandUrefurijh]h]h]h]h]Uinternaluh j~`h]r`hXSetPropertyFromCommandr`r`}r`(hXSetPropertyFromCommandh j`ubah!j,ubah!jBubah!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh jg`h]r`jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU#setpropertiesfromenvUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXSetPropertiesFromEnvr`r`}r`(hXSetPropertiesFromEnvh j`ubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh j]h]r`(jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU#setting-buildslave-infoUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXSetting Buildslave Infor`r`}r`(hXSetting Buildslave Infoh j`ubah!j,ubah!jBubjM )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`jS )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU #setslaveinfoUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX SetSlaveInfor`r`}r`(hX SetSlaveInfoh j`ubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh j]h]r`jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU#triggering-schedulersUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXTriggering Schedulersr`r`}r`(hXTriggering Schedulersh j`ubah!j,ubah!jBubah!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh j]h]r`(jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU#rpm-related-stepsUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXRPM-Related Stepsr`r`}r`(hXRPM-Related Stepsh j`ubah!j,ubah!jBubjM )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`(jS )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU #rpmbuildUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXRpmBuildr`r`}r`(hXRpmBuildh j`ubah!j,ubah!jBubah!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`jB)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j,)r`}r`(hUh}r`(U anchornameU#rpmlintUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXRpmLintr`r`}r`(hXRpmLinth j`ubah!j,ubah!jBubah!jv ubjS )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`jB)r`}r`(hUh}ra(h]h]h]h]h]uh j`h]raj,)ra}ra(hUh}ra(U anchornameU #mock-stepsUrefurijh]h]h]h]h]Uinternaluh j`h]rahX Mock Stepsrara}ra(hX Mock Stepsh jaubah!j,ubah!jBubah!jv ubjS )r a}r a(hUh}r a(h]h]h]h]h]uh j`h]r ajB)r a}ra(hUh}ra(h]h]h]h]h]uh j ah]raj,)ra}ra(hUh}ra(U anchornameU#mockbuildsrpm-stepUrefurijh]h]h]h]h]Uinternaluh j ah]rahXMockBuildSRPM Steprara}ra(hXMockBuildSRPM Steph jaubah!j,ubah!jBubah!jv ubjS )ra}ra(hUh}ra(h]h]h]h]h]uh j`h]rajB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)r a}r!a(hUh}r"a(U anchornameU#mockrebuild-stepUrefurijh]h]h]h]h]Uinternaluh jah]r#ahXMockRebuild Stepr$ar%a}r&a(hXMockRebuild Steph j aubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r'a}r(a(hUh}r)a(h]h]h]h]h]uh j]h]r*a(jB)r+a}r,a(hUh}r-a(h]h]h]h]h]uh j'ah]r.aj,)r/a}r0a(hUh}r1a(U anchornameU#debian-build-stepsUrefurijh]h]h]h]h]Uinternaluh j+ah]r2ahXDebian Build Stepsr3ar4a}r5a(hXDebian Build Stepsh j/aubah!j,ubah!jBubjM )r6a}r7a(hUh}r8a(h]h]h]h]h]uh j'ah]r9a(jS )r:a}r;a(hUh}ra}r?a(hUh}r@a(h]h]h]h]h]uh j:ah]rAaj,)rBa}rCa(hUh}rDa(U anchornameU #debpbuilderUrefurijh]h]h]h]h]Uinternaluh j>ah]rEahX DebPbuilderrFarGa}rHa(hX DebPbuilderh jBaubah!j,ubah!jBubah!jv ubjS )rIa}rJa(hUh}rKa(h]h]h]h]h]uh j6ah]rLajB)rMa}rNa(hUh}rOa(h]h]h]h]h]uh jIah]rPaj,)rQa}rRa(hUh}rSa(U anchornameU#debcowbuilderUrefurijh]h]h]h]h]Uinternaluh jMah]rTahX DebCowbuilderrUarVa}rWa(hX DebCowbuilderh jQaubah!j,ubah!jBubah!jv ubjS )rXa}rYa(hUh}rZa(h]h]h]h]h]uh j6ah]r[ajB)r\a}r]a(hUh}r^a(h]h]h]h]h]uh jXah]r_aj,)r`a}raa(hUh}rba(U anchornameU #deblintianUrefurijh]h]h]h]h]Uinternaluh j\ah]rcahX DebLintianrdarea}rfa(hX DebLintianh j`aubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rga}rha(hUh}ria(h]h]h]h]h]uh j]h]rja(jB)rka}rla(hUh}rma(h]h]h]h]h]uh jgah]rnaj,)roa}rpa(hUh}rqa(U anchornameU#miscellaneous-buildstepsUrefurijh]h]h]h]h]Uinternaluh jkah]rrahXMiscellaneous BuildStepsrsarta}rua(hXMiscellaneous BuildStepsh joaubah!j,ubah!jBubjM )rva}rwa(hUh}rxa(h]h]h]h]h]uh jgah]rya(jS )rza}r{a(hUh}r|a(h]h]h]h]h]uh jvah]r}ajB)r~a}ra(hUh}ra(h]h]h]h]h]uh jzah]raj,)ra}ra(hUh}ra(U anchornameU#hlintUrefurijh]h]h]h]h]Uinternaluh j~ah]rahXHLintrara}ra(hXHLinth jaubah!j,ubah!jBubah!jv ubjS )ra}ra(hUh}ra(h]h]h]h]h]uh jvah]rajB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)ra}ra(hUh}ra(U anchornameU#maxqUrefurijh]h]h]h]h]Uinternaluh jah]rahXMaxQrara}ra(hXMaxQh jaubah!j,ubah!jBubah!jv ubjS )ra}ra(hUh}ra(h]h]h]h]h]uh jvah]rajB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)ra}ra(hUh}ra(U anchornameU#http-requestsUrefurijh]h]h]h]h]Uinternaluh jah]rahX HTTP Requestsrara}ra(hX HTTP Requestsh jaubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjjM )ra}ra(hUh}ra(h]h]h]h]h]uh]rajS )ra}ra(hUh}ra(h]h]h]h]h]uh jah]ra(jB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)ra}ra(hUh}ra(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jah]rahXBuildbot Manualrara}ra(hjh jaubah!j,ubah!jBubjM )ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj)ra}ra(hUh}ra(UnumberedKUparentjU titlesonlyUglobh]h]h]h]h]Uentries]ra(NjBraNjBraNjBraNjBraNjBraNjBraNjBraNjBraNjBraeUhiddenUmaxdepthKU includefiles]ra(jBjBjBjBjBjBjBjBjBeU includehiddenuh jah]h!jubah!j ubeh!jv ubah!j ubjjM )ra}ra(hUh}ra(h]h]h]h]h]uh]rajS )ra}ra(hUh}ra(h]h]h]h]h]uh jah]ra(jB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)ra}ra(hUh}ra(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jah]rahX Definitionsrara}ra(hjh jaubah!j,ubah!jBubjM )ra}ra(hUh}ra(h]h]h]h]h]uh jah]ra(jS )ra}ra(hUh}ra(h]h]h]h]h]uh jah]rajB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)ra}ra(hUh}ra(U anchornameU #repositoryUrefurijh]h]h]h]h]Uinternaluh jah]rahX Repositoryrara}ra(hX Repositoryh jaubah!j,ubah!jBubah!jv ubjS )ra}ra(hUh}ra(h]h]h]h]h]uh jah]rajB)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj,)ra}ra(hUh}ra(U anchornameU#projectUrefurijh]h]h]h]h]Uinternaluh jah]rahXProjectrara}rb(hXProjecth jaubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jah]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)r b}r b(hUh}r b(U anchornameU#version-control-comparisonUrefurijh]h]h]h]h]Uinternaluh jbh]r bhXVersion Control Comparisonr brb}rb(hXVersion Control Comparisonh j bubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )rb}rb(hUh}rb(h]h]h]h]h]uh]rbjS )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rb(jB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jbh]rbhX First Runr br!b}r"b(hjh jbubah!j,ubah!jBubjM )r#b}r$b(hUh}r%b(h]h]h]h]h]uh jbh]r&b(jS )r'b}r(b(hUh}r)b(h]h]h]h]h]uh j#bh]r*bjB)r+b}r,b(hUh}r-b(h]h]h]h]h]uh j'bh]r.bj,)r/b}r0b(hUh}r1b(U anchornameU#goalUrefurijh]h]h]h]h]Uinternaluh j+bh]r2bhXGoalr3br4b}r5b(hXGoalr6bh j/bubah!j,ubah!jBubah!jv ubjS )r7b}r8b(hUh}r9b(h]h]h]h]h]uh j#bh]r:bjB)r;b}rbj,)r?b}r@b(hUh}rAb(U anchornameU#getting-the-codeUrefurijh]h]h]h]h]Uinternaluh j;bh]rBbhXGetting the coderCbrDb}rEb(hXGetting the coderFbh j?bubah!j,ubah!jBubah!jv ubjS )rGb}rHb(hUh}rIb(h]h]h]h]h]uh j#bh]rJbjB)rKb}rLb(hUh}rMb(h]h]h]h]h]uh jGbh]rNbj,)rOb}rPb(hUh}rQb(U anchornameU#creating-a-masterUrefurijh]h]h]h]h]Uinternaluh jKbh]rRbhXCreating a masterrSbrTb}rUb(hXCreating a masterrVbh jObubah!j,ubah!jBubah!jv ubjS )rWb}rXb(hUh}rYb(h]h]h]h]h]uh j#bh]rZbjB)r[b}r\b(hUh}r]b(h]h]h]h]h]uh jWbh]r^bj,)r_b}r`b(hUh}rab(U anchornameU#creating-a-slaveUrefurijh]h]h]h]h]Uinternaluh j[bh]rbbhXCreating a slavercbrdb}reb(hXCreating a slaverfbh j_bubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )rgb}rhb(hUh}rib(h]h]h]h]h]uh]rjbjS )rkb}rlb(hUh}rmb(h]h]h]h]h]uh jgbh]rnb(jB)rob}rpb(hUh}rqb(h]h]h]h]h]uh jkbh]rrbj,)rsb}rtb(hUh}rub(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jobh]rvbhXBuildbot's Test Suiterwbrxb}ryb(hjh jsbubah!j,ubah!jBubjM )rzb}r{b(hUh}r|b(h]h]h]h]h]uh jkbh]r}b(jS )r~b}rb(hUh}rb(h]h]h]h]h]uh jzbh]rb(jB)rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rbj,)rb}rb(hUh}rb(U anchornameU#suitesUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXSuitesrbrb}rb(hXSuitesh jbubah!j,ubah!jBubjM )rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rb(jS )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU #unit-testsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhX Unit Testsrbrb}rb(hX Unit Testsh jbubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU#interface-testsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXInterface Testsrbrb}rb(hXInterface Testsh jbubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU#integration-testsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXIntegration Testsrbrb}rb(hXIntegration Testsh jbubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU#regression-testsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXRegression Testsrbrb}rb(hXRegression Testsh jbubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU #fuzz-testsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhX Fuzz Testsrbrb}rb(hX Fuzz Testsh jbubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jzbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU#mixinsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXMixinsrbrb}rb(hXMixinsh jbubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jzbh]rbjB)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj,)rb}rb(hUh}rb(U anchornameU#fakesUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXFakesrbrb}rb(hXFakesh jbubah!j,ubah!jBubah!jv ubjS )rb}rb(hUh}rb(h]h]h]h]h]uh jzbh]rb(jB)rb}rb(hUh}rc(h]h]h]h]h]uh jbh]rcj,)rc}rc(hUh}rc(U anchornameU #good-testsUrefurijh]h]h]h]h]Uinternaluh jbh]rchX Good Testsrcrc}rc(hX Good Testsh jcubah!j,ubah!jBubjM )r c}r c(hUh}r c(h]h]h]h]h]uh jbh]r c(jS )r c}rc(hUh}rc(h]h]h]h]h]uh j ch]rcjB)rc}rc(hUh}rc(h]h]h]h]h]uh j ch]rcj,)rc}rc(hUh}rc(U anchornameU#independent-of-timeUrefurijh]h]h]h]h]Uinternaluh jch]rchXIndependent of Timercrc}rc(hXIndependent of Timeh jcubah!j,ubah!jBubah!jv ubjS )rc}rc(hUh}rc(h]h]h]h]h]uh j ch]rcjB)r c}r!c(hUh}r"c(h]h]h]h]h]uh jch]r#cj,)r$c}r%c(hUh}r&c(U anchornameU #clean-codeUrefurijh]h]h]h]h]Uinternaluh j ch]r'chX Clean Coder(cr)c}r*c(hX Clean Codeh j$cubah!j,ubah!jBubah!jv ubjS )r+c}r,c(hUh}r-c(h]h]h]h]h]uh j ch]r.cjB)r/c}r0c(hUh}r1c(h]h]h]h]h]uh j+ch]r2cj,)r3c}r4c(hUh}r5c(U anchornameU #good-nameUrefurijh]h]h]h]h]Uinternaluh j/ch]r6chX Good Namer7cr8c}r9c(hX Good Nameh j3cubah!j,ubah!jBubah!jv ubjS )r:c}r;c(hUh}rc}r?c(hUh}r@c(h]h]h]h]h]uh j:ch]rAcj,)rBc}rCc(hUh}rDc(U anchornameU#assert-only-one-thingUrefurijh]h]h]h]h]Uinternaluh j>ch]rEchXAssert Only One ThingrFcrGc}rHc(hXAssert Only One Thingh jBcubah!j,ubah!jBubah!jv ubjS )rIc}rJc(hUh}rKc(h]h]h]h]h]uh j ch]rLcjB)rMc}rNc(hUh}rOc(h]h]h]h]h]uh jIch]rPcj,)rQc}rRc(hUh}rSc(U anchornameU#prefer-fakes-to-mocksUrefurijh]h]h]h]h]Uinternaluh jMch]rTchXPrefer Fakes to MocksrUcrVc}rWc(hXPrefer Fakes to Mocksh jQcubah!j,ubah!jBubah!jv ubjS )rXc}rYc(hUh}rZc(h]h]h]h]h]uh j ch]r[cjB)r\c}r]c(hUh}r^c(h]h]h]h]h]uh jXch]r_cj,)r`c}rac(hUh}rbc(U anchornameU #small-testsUrefurijh]h]h]h]h]Uinternaluh j\ch]rcchX Small Testsrdcrec}rfc(hX Small Testsh j`cubah!j,ubah!jBubah!jv ubjS )rgc}rhc(hUh}ric(h]h]h]h]h]uh j ch]rjcjB)rkc}rlc(hUh}rmc(h]h]h]h]h]uh jgch]rncj,)roc}rpc(hUh}rqc(U anchornameU #isolationUrefurijh]h]h]h]h]Uinternaluh jkch]rrchX Isolationrscrtc}ruc(hX Isolationh jocubah!j,ubah!jBubah!jv ubjS )rvc}rwc(hUh}rxc(h]h]h]h]h]uh j ch]rycjB)rzc}r{c(hUh}r|c(h]h]h]h]h]uh jvch]r}cj,)r~c}rc(hUh}rc(U anchornameU #be-correctUrefurijh]h]h]h]h]Uinternaluh jzch]rchX Be Correctrcrc}rc(hX Be Correcth j~cubah!j,ubah!jBubah!jv ubjS )rc}rc(hUh}rc(h]h]h]h]h]uh j ch]rcjB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rc(U anchornameU #be-helpfulUrefurijh]h]h]h]h]Uinternaluh jch]rchX Be Helpfulrcrc}rc(hX Be Helpfulh jcubah!j,ubah!jBubah!jv ubjS )rc}rc(hUh}rc(h]h]h]h]h]uh j ch]rcjB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rc(U anchornameU#keeping-stateUrefurijh]h]h]h]h]Uinternaluh jch]rchX Keeping Statercrc}rc(hX Keeping Stateh jcubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjjM )rc}rc(hUh}rc(h]h]h]h]h]uh]rcjS )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rc(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jch]rchXClassesrcrc}rc(hjh jcubah!j,ubah!jBubjM )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj)rc}rc(hUh}rc(UnumberedKUparentjU titlesonlyUglobh]h]h]h]h]UentriesjUhiddenUmaxdepthKU includefilesjU includehiddenuh jch]h!jubah!j ubeh!jv ubah!j ubjjM )rc}rc(hUh}rc(h]h]h]h]h]uh]rcjS )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rc(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jch]rchXConceptsrcrc}rc(hjh jcubah!j,ubah!jBubjM )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jS )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rc(U anchornameU#source-stampsUrefurijh]h]h]h]h]Uinternaluh jch]rchX Source Stampsrcrc}rc(hX Source Stampsh jcubah!j,ubah!jBubah!jv ubjS )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rc(U anchornameU#version-control-systemsUrefurijh]h]h]h]h]Uinternaluh jch]rchXVersion Control Systemsrcrc}rc(hXVersion Control Systemsh jcubah!j,ubah!jBubjM )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jS )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjB)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj,)rc}rc(hUh}rd(U anchornameU#tree-stabilityUrefurijh]h]h]h]h]Uinternaluh jch]rdhXTree Stabilityrdrd}rd(hXTree Stabilityh jcubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)r d}r d(hUh}r d(h]h]h]h]h]uh jdh]r dj,)r d}rd(hUh}rd(U anchornameU)#how-different-vc-systems-specify-sourcesUrefurijh]h]h]h]h]Uinternaluh j dh]rdhX(How Different VC Systems Specify Sourcesrdrd}rd(hX(How Different VC Systems Specify Sourcesh j dubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rd(jB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU#changesUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXChangesr dr!d}r"d(hXChangesh jdubah!j,ubah!jBubjM )r#d}r$d(hUh}r%d(h]h]h]h]h]uh jdh]r&d(jS )r'd}r(d(hUh}r)d(h]h]h]h]h]uh j#dh]r*djB)r+d}r,d(hUh}r-d(h]h]h]h]h]uh j'dh]r.dj,)r/d}r0d(hUh}r1d(U anchornameU#whoUrefurijh]h]h]h]h]Uinternaluh j+dh]r2dhXWhor3dr4d}r5d(hXWhoh j/dubah!j,ubah!jBubah!jv ubjS )r6d}r7d(hUh}r8d(h]h]h]h]h]uh j#dh]r9djB)r:d}r;d(hUh}rd}r?d(hUh}r@d(U anchornameU#filesUrefurijh]h]h]h]h]Uinternaluh j:dh]rAdhXFilesrBdrCd}rDd(hXFilesh j>dubah!j,ubah!jBubah!jv ubjS )rEd}rFd(hUh}rGd(h]h]h]h]h]uh j#dh]rHdjB)rId}rJd(hUh}rKd(h]h]h]h]h]uh jEdh]rLdj,)rMd}rNd(hUh}rOd(U anchornameU #commentsUrefurijh]h]h]h]h]Uinternaluh jIdh]rPdhXCommentsrQdrRd}rSd(hXCommentsh jMdubah!j,ubah!jBubah!jv ubjS )rTd}rUd(hUh}rVd(h]h]h]h]h]uh j#dh]rWdjB)rXd}rYd(hUh}rZd(h]h]h]h]h]uh jTdh]r[dj,)r\d}r]d(hUh}r^d(U anchornameU#projectUrefurijh]h]h]h]h]Uinternaluh jXdh]r_dhXProjectr`drad}rbd(hXProjecth j\dubah!j,ubah!jBubah!jv ubjS )rcd}rdd(hUh}red(h]h]h]h]h]uh j#dh]rfdjB)rgd}rhd(hUh}rid(h]h]h]h]h]uh jcdh]rjdj,)rkd}rld(hUh}rmd(U anchornameU #repositoryUrefurijh]h]h]h]h]Uinternaluh jgdh]rndhX Repositoryrodrpd}rqd(hX Repositoryh jkdubah!j,ubah!jBubah!jv ubjS )rrd}rsd(hUh}rtd(h]h]h]h]h]uh j#dh]rudjB)rvd}rwd(hUh}rxd(h]h]h]h]h]uh jrdh]rydj,)rzd}r{d(hUh}r|d(U anchornameU #codebaseUrefurijh]h]h]h]h]Uinternaluh jvdh]r}dhXCodebaser~drd}rd(hXCodebaseh jzdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh j#dh]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU #revisionUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXRevisionrdrd}rd(hXRevisionh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh j#dh]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU #branchesUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXBranchesrdrd}rd(hXBranchesh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh j#dh]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU#change-propertiesUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXChange Propertiesrdrd}rd(hXChange Propertiesh jdubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU#scheduling-buildsUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXScheduling Buildsrdrd}rd(hXScheduling Buildsh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU #buildsetsUrefurijh]h]h]h]h]Uinternaluh jdh]rdhX BuildSetsrdrd}rd(hX BuildSetsh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU#buildrequestsUrefurijh]h]h]h]h]Uinternaluh jdh]rdhX BuildRequestsrdrd}rd(hX BuildRequestsh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU #buildersUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXBuildersrdrd}rd(hXBuildersh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj,)rd}rd(hUh}rd(U anchornameU#build-factoriesUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXBuild Factoriesrdrd}rd(hXBuild Factoriesh jdubah!j,ubah!jBubah!jv ubjS )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjB)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rej,)re}re(hUh}re(U anchornameU #build-slavesUrefurijh]h]h]h]h]Uinternaluh jdh]rehX Build Slavesrere}re(hX Build Slavesh jeubah!j,ubah!jBubah!jv ubjS )re}r e(hUh}r e(h]h]h]h]h]uh jch]r ejB)r e}r e(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameU#buildsUrefurijh]h]h]h]h]Uinternaluh j eh]rehXBuildsrere}re(hXBuildsh jeubah!j,ubah!jBubah!jv ubjS )re}re(hUh}re(h]h]h]h]h]uh jch]re(jB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}r e(hUh}r!e(U anchornameU#usersUrefurijh]h]h]h]h]Uinternaluh jeh]r"ehXUsersr#er$e}r%e(hXUsersh jeubah!j,ubah!jBubjM )r&e}r'e(hUh}r(e(h]h]h]h]h]uh jeh]r)e(jS )r*e}r+e(hUh}r,e(h]h]h]h]h]uh j&eh]r-e(jB)r.e}r/e(hUh}r0e(h]h]h]h]h]uh j*eh]r1ej,)r2e}r3e(hUh}r4e(U anchornameU #user-objectsUrefurijh]h]h]h]h]Uinternaluh j.eh]r5ehX User Objectsr6er7e}r8e(hX User Objectsh j2eubah!j,ubah!jBubjM )r9e}r:e(hUh}r;e(h]h]h]h]h]uh j*eh]re(hUh}r?e(h]h]h]h]h]uh j9eh]r@ejB)rAe}rBe(hUh}rCe(h]h]h]h]h]uh j=eh]rDej,)rEe}rFe(hUh}rGe(U anchornameU#id6Urefurijh]h]h]h]h]Uinternaluh jAeh]rHehXChangesrIerJe}rKe(hXChangesh jEeubah!j,ubah!jBubah!jv ubjS )rLe}rMe(hUh}rNe(h]h]h]h]h]uh j9eh]rOejB)rPe}rQe(hUh}rRe(h]h]h]h]h]uh jLeh]rSej,)rTe}rUe(hUh}rVe(U anchornameU#toolsUrefurijh]h]h]h]h]Uinternaluh jPeh]rWehXToolsrXerYe}rZe(hXToolsh jTeubah!j,ubah!jBubah!jv ubjS )r[e}r\e(hUh}r]e(h]h]h]h]h]uh j9eh]r^ejB)r_e}r`e(hUh}rae(h]h]h]h]h]uh j[eh]rbej,)rce}rde(hUh}ree(U anchornameU#usesUrefurijh]h]h]h]h]Uinternaluh j_eh]rfehXUsesrgerhe}rie(hXUsesh jceubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rje}rke(hUh}rle(h]h]h]h]h]uh j&eh]rmejB)rne}roe(hUh}rpe(h]h]h]h]h]uh jjeh]rqej,)rre}rse(hUh}rte(U anchornameU#doing-things-with-usersUrefurijh]h]h]h]h]Uinternaluh jneh]ruehXDoing Things With Usersrverwe}rxe(hXDoing Things With Usersh jreubah!j,ubah!jBubah!jv ubjS )rye}rze(hUh}r{e(h]h]h]h]h]uh j&eh]r|ejB)r}e}r~e(hUh}re(h]h]h]h]h]uh jyeh]rej,)re}re(hUh}re(U anchornameU#email-addressesUrefurijh]h]h]h]h]Uinternaluh j}eh]rehXEmail Addressesrere}re(hXEmail Addressesh jeubah!j,ubah!jBubah!jv ubjS )re}re(hUh}re(h]h]h]h]h]uh j&eh]rejB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameU#irc-nicknamesUrefurijh]h]h]h]h]Uinternaluh jeh]rehX IRC Nicknamesrere}re(hX IRC Nicknamesh jeubah!j,ubah!jBubah!jv ubjS )re}re(hUh}re(h]h]h]h]h]uh j&eh]rejB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameU#live-status-clientsUrefurijh]h]h]h]h]Uinternaluh jeh]rehXLive Status Clientsrere}re(hXLive Status Clientsh jeubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )re}re(hUh}re(h]h]h]h]h]uh jch]rejB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameU#build-propertiesUrefurijh]h]h]h]h]Uinternaluh jeh]rehXBuild Propertiesrere}re(hXBuild Propertiesh jeubah!j,ubah!jBubah!jv ubjS )re}re(hUh}re(h]h]h]h]h]uh jch]rejB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameU#multiple-codebase-buildsUrefurijh]h]h]h]h]Uinternaluh jeh]rehXMultiple-Codebase Buildsrere}re(hXMultiple-Codebase Buildsh jeubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )re}re(hUh}re(h]h]h]h]h]uh]rejS )re}re(hUh}re(h]h]h]h]h]uh jeh]re(jB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jeh]rehX Configurationrere}re(hjh jeubah!j,ubah!jBubjM )re}re(hUh}re(h]h]h]h]h]uh jeh]rej)re}re(hUh}re(UnumberedKUparentjU titlesonlyUglobh]h]h]h]h]Uentries]re(NjBreNjBreNjBreNjBreNjBreNjBreNjBreNjBreNjBreNjBreNjBreeUhiddenUmaxdepthKU includefiles]re(jBjBjBjBjBjBjBjBjBjBjBeU includehiddenuh jeh]h!jubah!j ubeh!jv ubah!j ubjjM )re}re(hUh}re(h]h]h]h]h]uh]rejS )re}re(hUh}re(h]h]h]h]h]uh jeh]re(jB)re}re(hUh}re(h]h]h]h]h]uh jeh]rej,)re}re(hUh}re(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jeh]rehX File Formatsrere}re(hjh jeubah!j,ubah!jBubjM )re}re(hUh}rf(h]h]h]h]h]uh jeh]rfjS )rf}rf(hUh}rf(h]h]h]h]h]uh jeh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]r fj,)r f}r f(hUh}r f(U anchornameU#log-file-formatUrefurijh]h]h]h]h]Uinternaluh jfh]r fhXLog File Formatrfrf}rf(hXLog File Formath j fubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubah!j ubjjM )rf}rf(hUh}rf(h]h]h]h]h]uh]rfjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rf(jB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jfh]r fhX BuildStepsr!fr"f}r#f(hjh jfubah!j,ubah!jBubjM )r$f}r%f(hUh}r&f(h]h]h]h]h]uh jfh]r'f(jS )r(f}r)f(hUh}r*f(h]h]h]h]h]uh j$fh]r+fjB)r,f}r-f(hUh}r.f(h]h]h]h]h]uh j(fh]r/fj,)r0f}r1f(hUh}r2f(U anchornameU #buildstepUrefurijh]h]h]h]h]Uinternaluh j,fh]r3fhX BuildStepr4fr5f}r6f(hX BuildSteph j0fubah!j,ubah!jBubah!jv ubjS )r7f}r8f(hUh}r9f(h]h]h]h]h]uh j$fh]r:fjB)r;f}rfj,)r?f}r@f(hUh}rAf(U anchornameU#loggingbuildstepUrefurijh]h]h]h]h]Uinternaluh j;fh]rBfhXLoggingBuildSteprCfrDf}rEf(hXLoggingBuildSteph j?fubah!j,ubah!jBubah!jv ubjS )rFf}rGf(hUh}rHf(h]h]h]h]h]uh j$fh]rIfjB)rJf}rKf(hUh}rLf(h]h]h]h]h]uh jFfh]rMfj,)rNf}rOf(hUh}rPf(U anchornameU #commandmixinUrefurijh]h]h]h]h]Uinternaluh jJfh]rQfhX CommandMixinrRfrSf}rTf(hX CommandMixinh jNfubah!j,ubah!jBubah!jv ubjS )rUf}rVf(hUh}rWf(h]h]h]h]h]uh j$fh]rXfjB)rYf}rZf(hUh}r[f(h]h]h]h]h]uh jUfh]r\fj,)r]f}r^f(hUh}r_f(U anchornameU #shellmixinUrefurijh]h]h]h]h]Uinternaluh jYfh]r`fhX ShellMixinrafrbf}rcf(hX ShellMixinh j]fubah!j,ubah!jBubah!jv ubjS )rdf}ref(hUh}rff(h]h]h]h]h]uh j$fh]rgfjB)rhf}rif(hUh}rjf(h]h]h]h]h]uh jdfh]rkfj,)rlf}rmf(hUh}rnf(U anchornameU #exceptionsUrefurijh]h]h]h]h]Uinternaluh jhfh]rofhX Exceptionsrpfrqf}rrf(hX Exceptionsh jlfubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )rsf}rtf(hUh}ruf(h]h]h]h]h]uh]rvfjS )rwf}rxf(hUh}ryf(h]h]h]h]h]uh jsfh]rzf(jB)r{f}r|f(hUh}r}f(h]h]h]h]h]uh jwfh]r~fj,)rf}rf(hUh}rf(U anchornameUUrefurijh]h]h]h]h]Uinternaluh j{fh]rfhXMaster-Slave APIrfrf}rf(hjh jfubah!j,ubah!jBubjM )rf}rf(hUh}rf(h]h]h]h]h]uh jwfh]rf(jS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU #connectionUrefurijh]h]h]h]h]Uinternaluh jfh]rfhX Connectionrfrf}rf(hX Connectionh jfubah!j,ubah!jBubah!jv ubjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rf(jB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU #build-slavesUrefurijh]h]h]h]h]Uinternaluh jfh]rfhX Build Slavesrfrf}rf(hX Build Slavesh jfubah!j,ubah!jBubjM )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rf(jS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU #bot-methodsUrefurijh]h]h]h]h]Uinternaluh jfh]rfhX Bot methodsrfrf}rf(hX Bot methodsh jfubah!j,ubah!jBubah!jv ubjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU#buildslave-methodsUrefurijh]h]h]h]h]Uinternaluh jfh]rfhXBuildSlave methodsrfrf}rf(hXBuildSlave methodsh jfubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU#setupUrefurijh]h]h]h]h]Uinternaluh jfh]rfhXSetuprfrf}rf(hXSetuph jfubah!j,ubah!jBubah!jv ubjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU#pingingUrefurijh]h]h]h]h]Uinternaluh jfh]rfhXPingingrfrf}rf(hXPingingh jfubah!j,ubah!jBubah!jv ubjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfjB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rf(hUh}rf(U anchornameU #buildingUrefurijh]h]h]h]h]Uinternaluh jfh]rfhXBuildingrfrf}rf(hXBuildingh jfubah!j,ubah!jBubah!jv ubjS )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rf(jB)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj,)rf}rg(hUh}rg(U anchornameU#slave-buildersUrefurijh]h]h]h]h]Uinternaluh jfh]rghXSlave Buildersrgrg}rg(hXSlave Buildersh jfubah!j,ubah!jBubjM )rg}rg(hUh}rg(h]h]h]h]h]uh jfh]r g(jS )r g}r g(hUh}r g(h]h]h]h]h]uh jgh]r gjB)rg}rg(hUh}rg(h]h]h]h]h]uh j gh]rgj,)rg}rg(hUh}rg(U anchornameU #slave-side-slavebuilder-methodsUrefurijh]h]h]h]h]Uinternaluh jgh]rghXSlave-Side SlaveBuilder Methodsrgrg}rg(hXSlave-Side SlaveBuilder Methodsh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]r gj,)r!g}r"g(hUh}r#g(U anchornameU!#master-side-slavebuilder-methodsUrefurijh]h]h]h]h]Uinternaluh jgh]r$ghX Master-side SlaveBuilder Methodsr%gr&g}r'g(hX Master-side SlaveBuilder Methodsh j!gubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )r(g}r)g(hUh}r*g(h]h]h]h]h]uh jfh]r+g(jB)r,g}r-g(hUh}r.g(h]h]h]h]h]uh j(gh]r/gj,)r0g}r1g(hUh}r2g(U anchornameU #commandsUrefurijh]h]h]h]h]Uinternaluh j,gh]r3ghXCommandsr4gr5g}r6g(hXCommandsh j0gubah!j,ubah!jBubjM )r7g}r8g(hUh}r9g(h]h]h]h]h]uh j(gh]r:gjS )r;g}rgjB)r?g}r@g(hUh}rAg(h]h]h]h]h]uh j;gh]rBgj,)rCg}rDg(hUh}rEg(U anchornameU"#master-side-remotecommand-methodsUrefurijh]h]h]h]h]Uinternaluh j?gh]rFghX!Master-Side RemoteCommand MethodsrGgrHg}rIg(hX!Master-Side RemoteCommand Methodsh jCgubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rJg}rKg(hUh}rLg(h]h]h]h]h]uh jfh]rMg(jB)rNg}rOg(hUh}rPg(h]h]h]h]h]uh jJgh]rQgj,)rRg}rSg(hUh}rTg(U anchornameU#updatesUrefurijh]h]h]h]h]Uinternaluh jNgh]rUghXUpdatesrVgrWg}rXg(hXUpdatesh jRgubah!j,ubah!jBubjM )rYg}rZg(hUh}r[g(h]h]h]h]h]uh jJgh]r\gjS )r]g}r^g(hUh}r_g(h]h]h]h]h]uh jYgh]r`g(jB)rag}rbg(hUh}rcg(h]h]h]h]h]uh j]gh]rdgj,)reg}rfg(hUh}rgg(U anchornameU#defined-commandsUrefurijh]h]h]h]h]Uinternaluh jagh]rhghXDefined Commandsrigrjg}rkg(hXDefined Commandsh jegubah!j,ubah!jBubjM )rlg}rmg(hUh}rng(h]h]h]h]h]uh j]gh]rog(jS )rpg}rqg(hUh}rrg(h]h]h]h]h]uh jlgh]rsgjB)rtg}rug(hUh}rvg(h]h]h]h]h]uh jpgh]rwgj,)rxg}ryg(hUh}rzg(U anchornameU#shellUrefurijh]h]h]h]h]Uinternaluh jtgh]r{ghXshellr|gr}g}r~g(hXshellh jxgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU #uploadfileUrefurijh]h]h]h]h]Uinternaluh jgh]rghX uploadFilergrg}rg(hX uploadFileh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU#uploaddirectoryUrefurijh]h]h]h]h]Uinternaluh jgh]rghXuploadDirectoryrgrg}rg(hXuploadDirectoryh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU #downloadfileUrefurijh]h]h]h]h]Uinternaluh jgh]rghX downloadFilergrg}rg(hX downloadFileh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU#mkdirUrefurijh]h]h]h]h]Uinternaluh jgh]rghXmkdirrgrg}rg(hXmkdirh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU#rmdirUrefurijh]h]h]h]h]Uinternaluh jgh]rghXrmdirrgrg}rg(hXrmdirh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU#cpdirUrefurijh]h]h]h]h]Uinternaluh jgh]rghXcpdirrgrg}rg(hXcpdirh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU#statUrefurijh]h]h]h]h]Uinternaluh jgh]rghXstatrgrg}rg(hXstath jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rg(hUh}rg(U anchornameU#globUrefurijh]h]h]h]h]Uinternaluh jgh]rghXglobrgrg}rg(hXglobh jgubah!j,ubah!jBubah!jv ubjS )rg}rg(hUh}rg(h]h]h]h]h]uh jlgh]rgjB)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj,)rg}rh(hUh}rh(U anchornameU#listdirUrefurijh]h]h]h]h]Uinternaluh jgh]rhhXlistdirrhrh}rh(hXlistdirh jgubah!j,ubah!jBubah!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh jlgh]r hjB)r h}r h(hUh}r h(h]h]h]h]h]uh jhh]r hj,)rh}rh(hUh}rh(U anchornameU#source-commandsUrefurijh]h]h]h]h]Uinternaluh j hh]rhhXSource Commandsrhrh}rh(hXSource Commandsh jhubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubeh!jv ubeh!j ubeh!jv ubah!j ubjjM )rh}rh(hUh}rh(h]h]h]h]h]uh]rhjS )rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rh(jB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]r hj,)r!h}r"h(hUh}r#h(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jhh]r$hhXChange Sourcesr%hr&h}r'h(hjh j!hubah!j,ubah!jBubjM )r(h}r)h(hUh}r*h(h]h]h]h]h]uh jhh]r+h(jS )r,h}r-h(hUh}r.h(h]h]h]h]h]uh j(hh]r/hjB)r0h}r1h(hUh}r2h(h]h]h]h]h]uh j,hh]r3hj,)r4h}r5h(hUh}r6h(U anchornameU#choosing-a-change-sourceUrefurijh]h]h]h]h]Uinternaluh j0hh]r7hhXChoosing a Change Sourcer8hr9h}r:h(hXChoosing a Change Sourceh j4hubah!j,ubah!jBubah!jv ubjS )r;h}rh(jB)r?h}r@h(hUh}rAh(h]h]h]h]h]uh j;hh]rBhj,)rCh}rDh(hUh}rEh(U anchornameU#configuring-change-sourcesUrefurijh]h]h]h]h]Uinternaluh j?hh]rFhhXConfiguring Change SourcesrGhrHh}rIh(hXConfiguring Change Sourcesh jChubah!j,ubah!jBubjM )rJh}rKh(hUh}rLh(h]h]h]h]h]uh j;hh]rMhjS )rNh}rOh(hUh}rPh(h]h]h]h]h]uh jJhh]rQhjB)rRh}rSh(hUh}rTh(h]h]h]h]h]uh jNhh]rUhj,)rVh}rWh(hUh}rXh(U anchornameU#repository-and-projectUrefurijh]h]h]h]h]Uinternaluh jRhh]rYhhXRepository and ProjectrZhr[h}r\h(hXRepository and Projecth jVhubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )r]h}r^h(hUh}r_h(h]h]h]h]h]uh j(hh]r`h(jB)rah}rbh(hUh}rch(h]h]h]h]h]uh j]hh]rdhj,)reh}rfh(hUh}rgh(U anchornameU#mail-parsing-changesourcesUrefurijh]h]h]h]h]Uinternaluh jahh]rhhhXMail-parsing ChangeSourcesrihrjh}rkh(hXMail-parsing ChangeSourcesh jehubah!j,ubah!jBubjM )rlh}rmh(hUh}rnh(h]h]h]h]h]uh j]hh]roh(jS )rph}rqh(hUh}rrh(h]h]h]h]h]uh jlhh]rshjB)rth}ruh(hUh}rvh(h]h]h]h]h]uh jphh]rwhj,)rxh}ryh(hUh}rzh(U anchornameU#subscribing-the-buildmasterUrefurijh]h]h]h]h]Uinternaluh jthh]r{hhXSubscribing the Buildmasterr|hr}h}r~h(hXSubscribing the Buildmasterh jxhubah!j,ubah!jBubah!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh jlhh]rhjB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU#using-maildirsUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXUsing Maildirsrhrh}rh(hXUsing Maildirsh jhubah!j,ubah!jBubah!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh jlhh]rhjB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU#parsing-email-change-messagesUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXParsing Email Change Messagesrhrh}rh(hXParsing Email Change Messagesh jhubah!j,ubah!jBubah!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh jlhh]rh(jB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU#cvsmaildirsourceUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXCVSMaildirSourcerhrh}rh(hXCVSMaildirSourceh jhubah!j,ubah!jBubjM )rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhjS )rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhjB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU.#configuration-of-cvs-and-buildbot-cvs-mail-pyUrefurijh]h]h]h]h]Uinternaluh jhh]rhhX-Configuration of CVS and buildbot_cvs_mail.pyrhrh}rh(hX-Configuration of CVS and buildbot_cvs_mail.pyh jhubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh jlhh]rhjB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU#svncommitemailmaildirsourceUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXSVNCommitEmailMaildirSourcerhrh}rh(hXSVNCommitEmailMaildirSourceh jhubah!j,ubah!jBubah!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh jlhh]rhjB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU#bzrlaunchpademailmaildirsourceUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXBzrLaunchpadEmailMaildirSourcerhrh}rh(hXBzrLaunchpadEmailMaildirSourceh jhubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubjS )rh}rh(hUh}rh(h]h]h]h]h]uh j(hh]rh(jB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU#pbchangesourceUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXPBChangeSourcerhrh}rh(hXPBChangeSourceh jhubah!j,ubah!jBubjM )rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhjS )rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhjB)rh}rh(hUh}rh(h]h]h]h]h]uh jhh]rhj,)rh}rh(hUh}rh(U anchornameU #bzr-hookUrefurijh]h]h]h]h]Uinternaluh jhh]rhhXBzr Hookrhrh}rh(hXBzr Hookh jhubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )rh}ri(hUh}ri(h]h]h]h]h]uh j(hh]ri(jB)ri}ri(hUh}ri(h]h]h]h]h]uh jhh]rij,)ri}ri(hUh}r i(U anchornameU #p4sourceUrefurijh]h]h]h]h]Uinternaluh jih]r ihXP4Sourcer ir i}r i(hXP4Sourceh jiubah!j,ubah!jBubjM )ri}ri(hUh}ri(h]h]h]h]h]uh jhh]rijS )ri}ri(hUh}ri(h]h]h]h]h]uh jih]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU#exampleUrefurijh]h]h]h]h]Uinternaluh jih]rihXExampleriri}r i(hXExampleh jiubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubjS )r!i}r"i(hUh}r#i(h]h]h]h]h]uh j(hh]r$ijB)r%i}r&i(hUh}r'i(h]h]h]h]h]uh j!ih]r(ij,)r)i}r*i(hUh}r+i(U anchornameU #bonsaipollerUrefurijh]h]h]h]h]Uinternaluh j%ih]r,ihX BonsaiPollerr-ir.i}r/i(hX BonsaiPollerh j)iubah!j,ubah!jBubah!jv ubjS )r0i}r1i(hUh}r2i(h]h]h]h]h]uh j(hh]r3ijB)r4i}r5i(hUh}r6i(h]h]h]h]h]uh j0ih]r7ij,)r8i}r9i(hUh}r:i(U anchornameU #svnpollerUrefurijh]h]h]h]h]Uinternaluh j4ih]r;ihX SVNPollerri(hX SVNPollerh j8iubah!j,ubah!jBubah!jv ubjS )r?i}r@i(hUh}rAi(h]h]h]h]h]uh j(hh]rBijB)rCi}rDi(hUh}rEi(h]h]h]h]h]uh j?ih]rFij,)rGi}rHi(hUh}rIi(U anchornameU #bzr-pollerUrefurijh]h]h]h]h]Uinternaluh jCih]rJihX Bzr PollerrKirLi}rMi(hX Bzr Pollerh jGiubah!j,ubah!jBubah!jv ubjS )rNi}rOi(hUh}rPi(h]h]h]h]h]uh j(hh]rQijB)rRi}rSi(hUh}rTi(h]h]h]h]h]uh jNih]rUij,)rVi}rWi(hUh}rXi(U anchornameU #gitpollerUrefurijh]h]h]h]h]Uinternaluh jRih]rYihX GitPollerrZir[i}r\i(hX GitPollerh jViubah!j,ubah!jBubah!jv ubjS )r]i}r^i(hUh}r_i(h]h]h]h]h]uh j(hh]r`ijB)rai}rbi(hUh}rci(h]h]h]h]h]uh j]ih]rdij,)rei}rfi(hUh}rgi(U anchornameU #hgpollerUrefurijh]h]h]h]h]Uinternaluh jaih]rhihXHgPollerriirji}rki(hXHgPollerh jeiubah!j,ubah!jBubah!jv ubjS )rli}rmi(hUh}rni(h]h]h]h]h]uh j(hh]roijB)rpi}rqi(hUh}rri(h]h]h]h]h]uh jlih]rsij,)rti}rui(hUh}rvi(U anchornameU#bitbucketpullrequestpollerUrefurijh]h]h]h]h]Uinternaluh jpih]rwihXBitbucketPullrequestPollerrxiryi}rzi(hXBitbucketPullrequestPollerh jtiubah!j,ubah!jBubah!jv ubjS )r{i}r|i(hUh}r}i(h]h]h]h]h]uh j(hh]r~ijB)ri}ri(hUh}ri(h]h]h]h]h]uh j{ih]rij,)ri}ri(hUh}ri(U anchornameU#gerritchangesourceUrefurijh]h]h]h]h]Uinternaluh jih]rihXGerritChangeSourceriri}ri(hXGerritChangeSourceh jiubah!j,ubah!jBubah!jv ubjS )ri}ri(hUh}ri(h]h]h]h]h]uh j(hh]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU #change-hooks-http-notificationsUrefurijh]h]h]h]h]Uinternaluh jih]rihX!Change Hooks (HTTP Notifications)riri}ri(hX!Change Hooks (HTTP Notifications)h jiubah!j,ubah!jBubah!jv ubjS )ri}ri(hUh}ri(h]h]h]h]h]uh j(hh]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU#googlecodeatompollerUrefurijh]h]h]h]h]Uinternaluh jih]rihXGoogleCodeAtomPollerriri}ri(hXGoogleCodeAtomPollerh jiubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )ri}ri(hUh}ri(h]h]h]h]h]uh]rijS )ri}ri(hUh}ri(h]h]h]h]h]uh jih]ri(jB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jih]rihX A Quick Tourriri}ri(hjh jiubah!j,ubah!jBubjM )ri}ri(hUh}ri(h]h]h]h]h]uh jih]ri(jS )ri}ri(hUh}ri(h]h]h]h]h]uh jih]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU#goalUrefurijh]h]h]h]h]Uinternaluh jih]rihXGoalriri}ri(hXGoalrih jiubah!j,ubah!jBubah!jv ubjS )ri}ri(hUh}ri(h]h]h]h]h]uh jih]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU#setting-project-name-and-urlUrefurijh]h]h]h]h]Uinternaluh jih]rihXSetting Project Name and URLriri}ri(hXSetting Project Name and URLrih jiubah!j,ubah!jBubah!jv ubjS )ri}ri(hUh}ri(h]h]h]h]h]uh jih]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU#configuration-errorsUrefurijh]h]h]h]h]Uinternaluh jih]rihXConfiguration Errorsriri}ri(hXConfiguration Errorsrih jiubah!j,ubah!jBubah!jv ubjS )ri}ri(hUh}ri(h]h]h]h]h]uh jih]rijB)ri}ri(hUh}ri(h]h]h]h]h]uh jih]rij,)ri}ri(hUh}ri(U anchornameU#your-first-buildUrefurijh]h]h]h]h]Uinternaluh jih]rihXYour First Buildriri}ri(hXYour First Buildrih jiubah!j,ubah!jBubah!jv ubjS )ri}rj(hUh}rj(h]h]h]h]h]uh jih]rjjB)rj}rj(hUh}rj(h]h]h]h]h]uh jih]rjj,)rj}rj(hUh}r j(U anchornameU#enabling-the-irc-botUrefurijh]h]h]h]h]Uinternaluh jjh]r jhXEnabling the IRC Botr jr j}r j(hXEnabling the IRC Botrjh jjubah!j,ubah!jBubah!jv ubjS )rj}rj(hUh}rj(h]h]h]h]h]uh jih]rjjB)rj}rj(hUh}rj(h]h]h]h]h]uh jjh]rjj,)rj}rj(hUh}rj(U anchornameU#setting-authorized-web-usersUrefurijh]h]h]h]h]Uinternaluh jjh]rjhXSetting Authorized Web Usersrjrj}rj(hXSetting Authorized Web Usersrjh jjubah!j,ubah!jBubah!jv ubjS )rj}r j(hUh}r!j(h]h]h]h]h]uh jih]r"jjB)r#j}r$j(hUh}r%j(h]h]h]h]h]uh jjh]r&jj,)r'j}r(j(hUh}r)j(U anchornameU#debugging-with-manholeUrefurijh]h]h]h]h]Uinternaluh j#jh]r*jhXDebugging with Manholer+jr,j}r-j(hXDebugging with Manholer.jh j'jubah!j,ubah!jBubah!jv ubjS )r/j}r0j(hUh}r1j(h]h]h]h]h]uh jih]r2jjB)r3j}r4j(hUh}r5j(h]h]h]h]h]uh j/jh]r6jj,)r7j}r8j(hUh}r9j(U anchornameU#adding-a-try-schedulerUrefurijh]h]h]h]h]Uinternaluh j3jh]r:jhXAdding a 'try' schedulerr;jrjh j7jubah!j,ubah!jBubah!jv ubeh!j ubeh!jv ubah!j ubjjM )r?j}r@j(hUh}rAj(h]h]h]h]h]uh]rBjjS )rCj}rDj(hUh}rEj(h]h]h]h]h]uh j?jh]rFj(jB)rGj}rHj(hUh}rIj(h]h]h]h]h]uh jCjh]rJjj,)rKj}rLj(hUh}rMj(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jGjh]rNjhXBuildSetSummaryNotifierMixinrOjrPj}rQj(hjh jKjubah!j,ubah!jBubjM )rRj}rSj(hUh}rTj(h]h]h]h]h]uh jCjh]rUjjS )rVj}rWj(hUh}rXj(h]h]h]h]h]uh jRjh]rYjjB)rZj}r[j(hUh}r\j(h]h]h]h]h]uh jVjh]r]jj,)r^j}r_j(hUh}r`j(U anchornameU#id1Urefurijh]h]h]h]h]Uinternaluh jZjh]rajhXBuildSetSummaryNotifierMixinrbjrcj}rdj(hXBuildSetSummaryNotifierMixinh j^jubah!j,ubah!jBubah!jv ubah!j ubeh!jv ubah!j ubuU indexentriesrej}rfj(h ]rgj((UsingleXBuildmaster Config; slavesjjtrhj(UsingleXslaves (Buildmaster Config)jjtrij(j+XProperties; from buildslaveUindex-0Utrjj(j+X"Build Slaves; limiting concurrencyUindex-1Utrkj(j+XBuildSlaves; latentUindex-2Utrlj(j+XAWS EC2Uindex-3rmjUtrnj(j+XBuildSlaves; AWS EC2jmjUtroj(j+XlibvirtUindex-4rpjUtrqj(j+XBuildSlaves; libvirtjpjUtrrjeh#]h,]rsj((j+X3RemoteCommand (class in buildbot.process.buildstep)jUtrtj(j+X;active (buildbot.process.buildstep.RemoteCommand attribute)jUtruj(j+X7run() (buildbot.process.buildstep.RemoteCommand method)jbUtrvj(j+X=interrupt() (buildbot.process.buildstep.RemoteCommand method)jQUtrwj(j+X;results() (buildbot.process.buildstep.RemoteCommand method)jwUtrxj(j+X;didFail() (buildbot.process.buildstep.RemoteCommand method)jfUtryj(j+XAremote_update() (buildbot.process.buildstep.RemoteCommand method)j9Utrzj(j+XCremote_complete() (buildbot.process.buildstep.RemoteCommand method)jUtr{j(j+X@remoteUpdate() (buildbot.process.buildstep.RemoteCommand method)j!Utr|j(j+XBremoteComplete() (buildbot.process.buildstep.RemoteCommand method)jrUtr}j(j+X9logs (buildbot.process.buildstep.RemoteCommand attribute)jsUtr~j(j+X7rc (buildbot.process.buildstep.RemoteCommand attribute)jUtrj(j+X;stdout (buildbot.process.buildstep.RemoteCommand attribute)j(Utrj(j+X:useLog() (buildbot.process.buildstep.RemoteCommand method)jUtrj(j+XAuseLogDelayed() (buildbot.process.buildstep.RemoteCommand method)jNUtrj(j+X=addStdout() (buildbot.process.buildstep.RemoteCommand method)jCUtrj(j+X=addStderr() (buildbot.process.buildstep.RemoteCommand method)jnUtrj(j+X=addHeader() (buildbot.process.buildstep.RemoteCommand method)jUtrj(j+X<addToLog() (buildbot.process.buildstep.RemoteCommand method)jUtrj(j+X8RemoteShellCommand (class in buildbot.process.buildstep)j,Utrjeh5]h>]hG]hP]rj((j+XProperties; IPropertiesUindex-0Utrj(j+X getProperty()jUtrj(j+X hasProperty()jUtrj(j+X setProperty()jUtrj(j+XgetProperties()jUtrjehY]hb]rj(j j j j jV jW j j j j ju&jv&j j j\j]jjjjjjjajbjjjjjAjBehk]ht]h}]h]h]rj((j+X PropertiesUindex-0Utrj(j+XProperties; Common PropertiesUindex-1Utrj(j+XProperties; got_revisionUindex-2Utrj(j+XProperties; buildernameUindex-3Utrj(j+XProperties; buildnumberUindex-4Utrj(j+XProperties; slavenameUindex-5Utrj(j+XProperties; schedulerUindex-6Utrj(j+XProperties; workdirUindex-7Utrj(j+XProperties; branchUindex-8Utrj(j+XProperties; PropertyUindex-9Utrj(j+XProperties; InterpolateUindex-10Utrj(j+XProperties; RendererUindex-11Utrj(j+XProperties; WithPropertiesUindex-12Utrj(j+Xunsupported format characterUindex-13Utrjeh]rj((UsingleXBuildmaster Config; dbjjtrj(UsingleXdb (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; db_urljjtrj(UsingleXdb_url (Buildmaster Config)jjtrj(UsingleX$Buildmaster Config; db_poll_intervaljjtrj(UsingleX%db_poll_interval (Buildmaster Config)jjtrj(j+XSQLiteUindex-0Utrj(j+XMySQLUindex-1Utrj(j+XPostgresUindex-2Utrj(UsingleXBuildmaster Config; multiMasterjjtrj(UsingleX multiMaster (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; buildbotURLjjtrj(UsingleX buildbotURL (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; titleURLjjtrj(UsingleXtitleURL (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; titlejjtrj(UsingleXtitle (Buildmaster Config)jjtrj(UsingleX'Buildmaster Config; logCompressionLimitjjtrj(UsingleX(logCompressionLimit (Buildmaster Config)jjtrj(UsingleX(Buildmaster Config; logCompressionMethodjjtrj(UsingleX)logCompressionMethod (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; logMaxSizejjtrj(UsingleXlogMaxSize (Buildmaster Config)jjtrj(UsingleX"Buildmaster Config; logMaxTailSizejjtrj(UsingleX#logMaxTailSize (Buildmaster Config)jjtrj(UsingleX!Buildmaster Config; changeHorizonjjtrj(UsingleX"changeHorizon (Buildmaster Config)jjtrj(UsingleX Buildmaster Config; buildHorizonjjtrj(UsingleX!buildHorizon (Buildmaster Config)jjtrj(UsingleX Buildmaster Config; eventHorizonjjtrj(UsingleX!eventHorizon (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; logHorizonjjtrj(UsingleXlogHorizon (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; cachesjjtrj(UsingleXcaches (Buildmaster Config)jjtrj(UsingleX#Buildmaster Config; changeCacheSizejjtrj(UsingleX$changeCacheSize (Buildmaster Config)jjtrj(UsingleX"Buildmaster Config; buildCacheSizejjtrj(UsingleX#buildCacheSize (Buildmaster Config)jjtrj(UsingleX!Buildmaster Config; mergeRequestsjjtrj(UsingleX"mergeRequests (Buildmaster Config)jjtrj(j+XBuilds; mergingUindex-3Utrj(j+XBuilders; priorityUindex-4Utrj(UsingleX&Buildmaster Config; prioritizeBuildersjjtrj(UsingleX'prioritizeBuilders (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; protocolsjjtrj(UsingleXprotocols (Buildmaster Config)jjtrj(j+XProperties; globalUindex-5Utrj(UsingleXBuildmaster Config; propertiesjjtrj(UsingleXproperties (Buildmaster Config)jjtrj(UsingleX!Buildmaster Config; debugPasswordjjtrj(UsingleX"debugPassword (Buildmaster Config)jjtrj(j+XManholeUindex-6Utrj(UsingleXBuildmaster Config; manholejjtrj(UsingleXmanhole (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; metricsjjtrj(UsingleXmetrics (Buildmaster Config)jjtrj(UsingleX!Buildmaster Config; user_managersjjtrj(UsingleX"user_managers (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; validationjjtrj(UsingleXvalidation (Buildmaster Config)jjtrj(UsingleXBuildmaster Config; revlinkjjtrj(UsingleXrevlink (Buildmaster Config)jjtrj(UsingleX%Buildmaster Config; codebaseGeneratorjjtrj(UsingleX&codebaseGenerator (Buildmaster Config)jjtrjeh]h]rj((j+X buildbot.status.results (module)Xmodule-buildbot.status.resultsUtrj(j+X+SUCCESS (in module buildbot.status.results)jkUtrj(j+X,WARNINGS (in module buildbot.status.results)j*Utrj(j+X+FAILURE (in module buildbot.status.results)jUtrj(j+X+SKIPPED (in module buildbot.status.results)jUtrj(j+X-EXCEPTION (in module buildbot.status.results)j Utrj(j+X)RETRY (in module buildbot.status.results)jUtrj(j+X+Results (in module buildbot.status.results)jUtrj(j+X2worst_status() (in module buildbot.status.results)jUtrjeh]h]h]rj((j+XProperties; IRenderableUindex-0Utrj(j+XgetRenderingFor()j}Utrjeh]h]h]rj((j+X&buildbot.schedulers.forceshed (module)X$module-buildbot.schedulers.forceshedUtrj(j+X6BaseParameter (class in buildbot.schedulers.forceshed)jUtrj(j+XDgetFromKwargs() (buildbot.schedulers.forceshed.BaseParameter method)jwUtrj(j+XGupdateFromKwargs() (buildbot.schedulers.forceshed.BaseParameter method)jcUtrj(j+X<name (buildbot.schedulers.forceshed.BaseParameter attribute)jUtrj(j+X=label (buildbot.schedulers.forceshed.BaseParameter attribute)jQUtrj(j+X?fullName() (buildbot.schedulers.forceshed.BaseParameter method)jeUtrj(j+X<type (buildbot.schedulers.forceshed.BaseParameter attribute)j2Utrj(j+X?default (buildbot.schedulers.forceshed.BaseParameter attribute)jUtrj(j+X@required (buildbot.schedulers.forceshed.BaseParameter attribute)jUtrj(j+X@multiple (buildbot.schedulers.forceshed.BaseParameter attribute)jUtrj(j+X=regex (buildbot.schedulers.forceshed.BaseParameter attribute)j)Utrj(j+XFparse_from_args() (buildbot.schedulers.forceshed.BaseParameter method)j>Utrj(j+XEparse_from_arg() (buildbot.schedulers.forceshed.BaseParameter method)jUtrjeh]h]h]rj((j+X Build FactoryUindex-0Utrj(j+X GNUAutoconfUindex-1rjUtrj(j+XBuild Factory; GNUAutoconfjjUtrk(j+X5buildbot.process.factory.GNUAutoconf (built-in class)jUtrk(j+XBasicBuildFactoryUindex-2rkUtrk(j+X Build Factory; BasicBuildFactoryjkUtrk(j+X;buildbot.process.factory.BasicBuildFactory (built-in class)jYUtrk(j+XBasicSVNUindex-3rkUtrk(j+XBuild Factory; BasicSVNjkUtrk(j+X2buildbot.process.factory.BasicSVN (built-in class)jUtr k(j+XQuickBuildFactoryUindex-4r kUtr k(j+X Build Factory; QuickBuildFactoryj kUtr k(j+X;buildbot.process.factory.QuickBuildFactory (built-in class)jUtr k(j+XCPANUindex-5rkUtrk(j+XBuild Factory; CPANjkUtrk(j+X.buildbot.process.factory.CPAN (built-in class)jUtrk(j+X DistutilsUindex-6rkUtrk(j+XBuild Factory; DistutilsjkUtrk(j+X3buildbot.process.factory.Distutils (built-in class)j3Utrk(j+XTrialUindex-7rkUtrk(j+XBuild Factory; TrialjkUtrk(j+X/buildbot.process.factory.Trial (built-in class)jOUtrk(j+X PYTHONPATHUindex-8rkUtrk(j+X environment variable; PYTHONPATHjkUtrkej]rk((j+Xbuildbot.util (module)Xmodule-buildbot.utilUtrk(j+X'naturalSort() (in module buildbot.util)jRUtrk(j+X*formatInterval() (in module buildbot.util)jUtr k(j+X(ComparableMixin (class in buildbot.util)jZUtr!k(j+X)safeTranslate() (in module buildbot.util)jUtr"k(j+X*epoch2datetime() (in module buildbot.util)jtUtr#k(j+X*datetime2epoch() (in module buildbot.util)jWUtr$k(j+XUTC (in module buildbot.util)jUtr%k(j+X$diffSets() (in module buildbot.util)jUtr&k(j+X$makeList() (in module buildbot.util)j<Utr'k(j+Xnow() (in module buildbot.util)jUtr(k(j+X#flatten() (in module buildbot.util)jUtr)k(j+X'none_or_str() (in module buildbot.util)jUtr*k(j+X$NotABranch (in module buildbot.util)j`Utr+k(j+X&in_reactor() (in module buildbot.util)jUtr,k(j+X&asyncSleep() (in module buildbot.util)jhUtr-k(j+Xbuildbot.util.lru (module)Xmodule-buildbot.util.lruUtr.k(j+X"hits (in module buildbot.util.lru)jUtr/k(j+X%refhits (in module buildbot.util.lru)jUtr0k(j+X$misses (in module buildbot.util.lru)jWUtr1k(j+X&max_size (in module buildbot.util.lru)jUtr2k(j+X#get() (in module buildbot.util.lru)j\Utr3k(j+X#put() (in module buildbot.util.lru)jUtr4k(j+X#inv() (in module buildbot.util.lru)jkUtr5k(j+X$buildbot.util.bbcollections (module)X"module-buildbot.util.bbcollectionsUtr6k(j+X%Python Enhancement Proposals; PEP 328Uindex-0Utr7k(j+X2defaultdict (class in buildbot.util.bbcollections)jYUtr8k(j+X0KeyedSets (class in buildbot.util.bbcollections)jUtr9k(j+Xbuildbot.util.eventual (module)Xmodule-buildbot.util.eventualUtr:k(j+X/eventually() (in module buildbot.util.eventual)jUtr;k(j+X3fireEventually() (in module buildbot.util.eventual)jUtrk(j+X+method() (in module buildbot.util.debounce)jlUtr?k(j+X+Debouncer (class in buildbot.util.debounce)jpUtr@k(j+X0stop() (buildbot.util.debounce.Debouncer method)j8UtrAk(j+X1start() (buildbot.util.debounce.Debouncer method)jKUtrBk(j+Xbuildbot.util.json (module)Xmodule-buildbot.util.jsonUtrCk(j+Xbuildbot.util.maildir (module)Xmodule-buildbot.util.maildirUtrDk(j+X/MaildirService (class in buildbot.util.maildir)jUtrEk(j+X:setBasedir() (buildbot.util.maildir.MaildirService method)jtUtrFk(j+X?messageReceived() (buildbot.util.maildir.MaildirService method)jUtrGk(j+X<moveToCurDir() (buildbot.util.maildir.MaildirService method)j=UtrHk(j+Xbuildbot.util.misc (module)Xmodule-buildbot.util.miscUtrIk(j+X/deferredLocked() (in module buildbot.util.misc)jFUtrJk(j+X2SerializedInvocation (class in buildbot.util.misc)j UtrKk(j+X!buildbot.util.netstrings (module)Xmodule-buildbot.util.netstringsUtrLk(j+X3NetstringParser (class in buildbot.util.netstrings)jUtrMk(j+X8feed() (buildbot.util.netstrings.NetstringParser method)jUtrNk(j+X<strings (buildbot.util.netstrings.NetstringParser attribute)j7UtrOk(j+Xbuildbot.util.sautils (module)Xmodule-buildbot.util.sautilsUtrPk(j+X1InsertFromSelect (class in buildbot.util.sautils)jUtrQk(j+X.sa_version() (in module buildbot.util.sautils)jUtrRk(j+Xbuildbot.util.state (module)Xmodule-buildbot.util.stateUtrSk(j+X)StateMixin (class in buildbot.util.state)jUtrTk(j+X/name (buildbot.util.state.StateMixin attribute)jUtrUk(j+X1master (buildbot.util.state.StateMixin attribute)jUtrVk(j+X2getState() (buildbot.util.state.StateMixin method)j-UtrWk(j+X2getState() (buildbot.util.state.StateMixin method)X'buildbot.util.state.StateMixin.getStateUtrXk(j+X"buildbot.util.identifiers (module)X module-buildbot.util.identifiersUtrYk(j+X4isIdentifier() (in module buildbot.util.identifiers)jBUtrZk(j+X7forceIdentifier() (in module buildbot.util.identifiers)jUtr[k(j+X;incrementIdentifier() (in module buildbot.util.identifiers)jUtr\kej ]j]j]r]k((j+XPATHUindex-0r^kUtr_k(j+Xenvironment variable; PATHj^kUtr`k(UpairrakX;buildslave-create-slave command line option; --no-logrotatejUtrbk(jakX5buildslave-create-slave command line option; --useptyjUtrck(jakX4buildslave-create-slave command line option; --umaskjUtrdk(jakX8buildslave-create-slave command line option; --keepalivejUtrek(jakX7buildslave-create-slave command line option; --maxdelayjUtrfk(jakX7buildslave-create-slave command line option; --log-sizejUtrgk(jakX8buildslave-create-slave command line option; --log-countjUtrhk(jakX=buildslave-create-slave command line option; --allow-shutdownjUtrik(j+XPATHUindex-1rjkUtrkk(j+Xenvironment variable; PATHjjkUtrlk(j+XPATHUindex-2rmkUtrnk(j+Xenvironment variable; PATHjmkUtrok(j+X PYTHONPATHUindex-3rpkUtrqk(j+X environment variable; PYTHONPATHjpkUtrrk(j+XHOMEUindex-4rskUtrtk(j+Xenvironment variable; HOMEjskUtruk(j+XPATHUindex-5rvkUtrwk(j+Xenvironment variable; PATHjvkUtrxk(j+X PYTHONPATHUindex-6rykUtrzk(j+X environment variable; PYTHONPATHjykUtr{k(j+X PYTHONPATHUindex-7r|kUtr}k(j+X environment variable; PYTHONPATHj|kUtr~kej(]j1]rk((UsingleXBuildmaster Config; schedulersjjtrk(UsingleXschedulers (Buildmaster Config)jjtrk(j+XProperties; from schedulerUindex-0Utrk(UsingleX!Schedulers; SingleBranchSchedulerjjtrk(UsingleXSingleBranchScheduler Schedulerjjtrk(UsingleXSchedulers; Schedulerjjtrk(UsingleXScheduler Schedulerjjtrk(UsingleXSchedulers; AnyBranchSchedulerjjtrk(UsingleXAnyBranchScheduler Schedulerjjtrk(UsingleXSchedulers; Dependentjjtrk(UsingleXDependent Schedulerjjtrk(UsingleXSchedulers; Periodicjjtrk(UsingleXPeriodic Schedulerjjtrk(UsingleXSchedulers; Nightlyjjtrk(UsingleXNightly Schedulerjjtrk(UsingleXSchedulers; Try_Jobdirjjtrk(UsingleXTry_Jobdir Schedulerjjtrk(UsingleXSchedulers; Try_Userpassjjtrk(UsingleXTry_Userpass Schedulerjjtrk(UsingleXSchedulers; Triggerablejjtrk(UsingleXTriggerable Schedulerjjtrk(j+XTriggersUindex-1Utrk(UsingleXSchedulers; NightlyTriggerablejjtrk(UsingleXNightlyTriggerable Schedulerjjtrk(j+X=buildbot.schedulers.timed.NightlyTriggerable (built-in class)jUtrk(UsingleXSchedulers; ForceSchedulerjjtrk(UsingleXForceScheduler Schedulerjjtrk(j+X Forced BuildsUindex-2Utrk(UsingleX!Schedulers; ChoiceStringParameterjjtrk(UsingleXChoiceStringParameter Schedulerjjtrk(UsingleX!Schedulers; InheritBuildParameterjjtrk(UsingleXInheritBuildParameter Schedulerjjtrk(UsingleX%Schedulers; BuildslaveChoiceParameterjjtrk(UsingleX#BuildslaveChoiceParameter Schedulerjjtrkej:]rk((j+Xbuildbot.config (module)Xmodule-buildbot.configUtrk(j+X'MasterConfig (class in buildbot.config)j~Utrk(j+X.title (buildbot.config.MasterConfig attribute)j|Utrk(j+X1titleURL (buildbot.config.MasterConfig attribute)jUtrk(j+X4buildbotURL (buildbot.config.MasterConfig attribute)jUtrk(j+X6changeHorizon (buildbot.config.MasterConfig attribute)jLUtrk(j+X5eventHorizon (buildbot.config.MasterConfig attribute)juUtrk(j+X3logHorizon (buildbot.config.MasterConfig attribute)jUtrk(j+X5buildHorizon (buildbot.config.MasterConfig attribute)jUtrk(j+X<logCompressionLimit (buildbot.config.MasterConfig attribute)j^Utrk(j+X=logCompressionMethod (buildbot.config.MasterConfig attribute)jMUtrk(j+X3logMaxSize (buildbot.config.MasterConfig attribute)jgUtrk(j+X7logMaxTailSize (buildbot.config.MasterConfig attribute)jUtrk(j+X3properties (buildbot.config.MasterConfig attribute)jPUtrk(j+X6mergeRequests (buildbot.config.MasterConfig attribute)j%Utrk(j+X;prioritizeBuilders (buildbot.config.MasterConfig attribute)jUtrk(j+X:codebaseGenerator (buildbot.config.MasterConfig attribute)jmUtrk(j+X2protocols (buildbot.config.MasterConfig attribute)jxUtrk(j+X4multiMaster (buildbot.config.MasterConfig attribute)jUtrk(j+X6debugPassword (buildbot.config.MasterConfig attribute)juUtrk(j+X0manhole (buildbot.config.MasterConfig attribute)jUtrk(j+X3validation (buildbot.config.MasterConfig attribute)jUtrk(j+X+db (buildbot.config.MasterConfig attribute)jUtrk(j+X0metrics (buildbot.config.MasterConfig attribute)jDUtrk(j+X/caches (buildbot.config.MasterConfig attribute)jyUtrk(j+X3schedulers (buildbot.config.MasterConfig attribute)jUtrk(j+X1builders (buildbot.config.MasterConfig attribute)jUtrk(j+X/slaves (buildbot.config.MasterConfig attribute)jUtrk(j+X7change_sources (buildbot.config.MasterConfig attribute)j/Utrk(j+X/status (buildbot.config.MasterConfig attribute)j\Utrk(j+X6user_managers (buildbot.config.MasterConfig attribute)jUtrk(j+X8loadConfig() (buildbot.config.MasterConfig class method)jvUtrk(j+X(BuilderConfig (class in buildbot.config)jUtrk(j+X.name (buildbot.config.BuilderConfig attribute)jUtrk(j+X1factory (buildbot.config.BuilderConfig attribute)jUtrk(j+X4slavenames (buildbot.config.BuilderConfig attribute)j Utrk(j+X2builddir (buildbot.config.BuilderConfig attribute)jUtrk(j+X7slavebuilddir (buildbot.config.BuilderConfig attribute)jiUtrk(j+X2category (buildbot.config.BuilderConfig attribute)jUtrk(j+X3nextSlave (buildbot.config.BuilderConfig attribute)jdUtrk(j+X3nextBuild (buildbot.config.BuilderConfig attribute)jzUtrk(j+X7canStartBuild (buildbot.config.BuilderConfig attribute)jUtrk(j+X/locks (buildbot.config.BuilderConfig attribute)jUtrk(j+X-env (buildbot.config.BuilderConfig attribute)jUtrk(j+X4properties (buildbot.config.BuilderConfig attribute)jUtrk(j+X7mergeRequests (buildbot.config.BuilderConfig attribute)jUtrk(j+X5description (buildbot.config.BuilderConfig attribute)jUtrk(j+X#error() (in module buildbot.config)jVUtrk(j+X ConfigErrorsjUtrk(j+X/errors (buildbot.config.ConfigErrors attribute)j?Utrk(j+X0addError() (buildbot.config.ConfigErrors method)j@Utrk(j+X5ReconfigurableServiceMixin (class in buildbot.config)jUtrk(j+XEreconfigService() (buildbot.config.ReconfigurableServiceMixin method)j|Utrk(j+X?priority (buildbot.config.ReconfigurableServiceMixin attribute)j_UtrkejC]jL]rk((UsingleXBuildmaster Config; statusjjtrk(UsingleXstatus (Buildmaster Config)jjtrk(UsingleXStatus Targets; WebStatusjjtrk(UsingleXWebStatus Status Targetjjtrk(j+X6buildbot.status.web.baseweb.WebStatus (built-in class)j#Utrk(UsingleXStatus Targets; MailNotifierjjtrk(UsingleXMailNotifier Status Targetjjtrk(j+Xemail; MailNotifierUindex-0Utrk(j+X2buildbot.status.mail.MailNotifier (built-in class)jUtrk(UsingleXStatus Targets; IRCjjtrk(UsingleXIRC Status Targetjjtrk(j+XIRCUindex-1Utrk(j+X*buildbot.status.words.IRC (built-in class)jUtrk(j+XProperties; from forced buildUindex-2Utrk(UsingleXStatus Targets; PBListenerjjtrk(UsingleXPBListener Status Targetjjtrk(j+X2buildbot.status.client.PBListener (built-in class)jlUtrk(UsingleXStatus Targets; StatusPushjjtrk(UsingleXStatusPush Status Targetjjtrk(j+X7buildbot.status.status_push.StatusPush (built-in class)jvUtrk(UsingleXStatus Targets; HttpStatusPushjjtrk(UsingleXHttpStatusPush Status Targetjjtrk(UsingleX Status Targets; GerritStatusPushjjtrk(UsingleXGerritStatusPush Status Targetjjtrk(j+X?buildbot.status.status_gerrit.GerritStatusPush (built-in class)jUtrk(UsingleXStatus Targets; GitHubStatusjjtrk(UsingleXGitHubStatus Status Targetjjtrk(j+X4buildbot.status.github.GitHubStatus (built-in class)jUtrkejU]rk(j.jw/j/j6j7j<j<j<j+j+j+j+ja,jb,j,j,ej^]jg]jp]rk((j+X"buildbot.db.buildrequests (module)X module-buildbot.db.buildrequestsUtrk(jakX%BuildRequests; DB Connector ComponentUindex-0Utrk(j+XAlreadyClaimedErrorjUtrk(j+XNotClaimedErrorj{Utrk(j+XDBuildRequestsConnectorComponent (class in buildbot.db.buildrequests)jUtrk(j+XbrdictUindex-1rkUtrk(j+XbridjkUtrk(j+XTgetBuildRequest() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrl(j+XUgetBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)j:Utrl(j+XWclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrl(j+XMySQL; limitationsUindex-2Utrl(j+XSQLite; limitationsUindex-3Utrl(j+XYreclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrl(j+XYunclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrl(j+XZcompleteBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrl(j+X[unclaimExpiredRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)j;Utrl(j+Xbuildbot.db.builds (module)Xmodule-buildbot.db.buildsUtr l(jakXBuilds; DB Connector ComponentUindex-4Utr l(j+X6BuildsConnectorComponent (class in buildbot.db.builds)jUtr l(j+XbdictUindex-5r lUtr l(j+Xbidj lUtrl(j+X?getBuild() (buildbot.db.builds.BuildsConnectorComponent method)j6Utrl(j+XJgetBuildsForRequest() (buildbot.db.builds.BuildsConnectorComponent method)jUtrl(j+X?addBuild() (buildbot.db.builds.BuildsConnectorComponent method)jUtrl(j+XCfinishBuilds() (buildbot.db.builds.BuildsConnectorComponent method)j'Utrl(j+Xbuildbot.db.buildsets (module)Xmodule-buildbot.db.buildsetsUtrl(jakX!Buildsets; DB Connector ComponentUindex-6Utrl(j+X<BuildsetsConnectorComponent (class in buildbot.db.buildsets)jNUtrl(j+XbsdictUindex-7rlUtrl(j+XbsidjlUtrl(j+XHaddBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrl(j+XMcompleteBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrl(j+XHgetBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrl(j+XIgetBuildsets() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrl(j+XRgetBuildsetProperties() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrl(j+X buildbot.db.buildslaves (module)Xmodule-buildbot.db.buildslavesUtrl(jakX#BuildSlaves; DB Connector ComponentUindex-8Utrl(j+X@BuildslavesConnectorComponent (class in buildbot.db.buildslaves)jUtr l(j+XOgetBuildslaves() (buildbot.db.buildslaves.BuildslavesConnectorComponent method)jUtr!l(j+XTgetBuildslaveByName() (buildbot.db.buildslaves.BuildslavesConnectorComponent method)j~Utr"l(j+XQupdateBuildslave() (buildbot.db.buildslaves.BuildslavesConnectorComponent method)jUtr#l(j+Xbuildbot.db.changes (module)Xmodule-buildbot.db.changesUtr$l(jakXChanges; DB Connector ComponentUindex-9Utr%l(j+X8ChangesConnectorComponent (class in buildbot.db.changes)jaUtr&l(j+XchdictUindex-10r'lUtr(l(j+Xchangeidj'lUtr)l(j+XBaddChange() (buildbot.db.changes.ChangesConnectorComponent method)jUtr*l(j+XBgetChange() (buildbot.db.changes.ChangesConnectorComponent method)jUtr+l(j+XFgetChangeUids() (buildbot.db.changes.ChangesConnectorComponent method)jUtr,l(j+XIgetRecentChanges() (buildbot.db.changes.ChangesConnectorComponent method)jUtr-l(j+XJgetLatestChangeid() (buildbot.db.changes.ChangesConnectorComponent method)jUtr.l(j+Xbuildbot.db.schedulers (module)Xmodule-buildbot.db.schedulersUtr/l(jakX"Schedulers; DB Connector ComponentUindex-11Utr0l(j+X>SchedulersConnectorComponent (class in buildbot.db.schedulers)jUtr1l(j+XobjectidUindex-12Utr2l(j+XNclassifyChanges() (buildbot.db.schedulers.SchedulersConnectorComponent method)jdUtr3l(j+XWgetChangeClassifications() (buildbot.db.schedulers.SchedulersConnectorComponent method)jUtr4l(j+X!buildbot.db.sourcestamps (module)Xmodule-buildbot.db.sourcestampsUtr5l(jakX$SourceStamps; DB Connector ComponentUindex-13Utr6l(j+XBSourceStampsConnectorComponent (class in buildbot.db.sourcestamps)jUtr7l(j+XssidUindex-14r8lUtr9l(j+Xssdictj8lUtr:l(j+XQaddSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)jUtr;l(j+XQgetSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)jUtrl(jakX'SourceStampSets; DB Connector ComponentUindex-15Utr?l(j+XHSourceStampSetsConnectorComponent (class in buildbot.db.sourcestampsets)jUtr@l(j+XZaddSourceStampSet() (buildbot.db.sourcestampsets.SourceStampSetsConnectorComponent method)jqUtrAl(j+Xbuildbot.db.state (module)Xmodule-buildbot.db.stateUtrBl(jakXState; DB Connector ComponentUindex-16UtrCl(j+X4StateConnectorComponent (class in buildbot.db.state)jxUtrDl(j+XobjectidUindex-17rElUtrFl(j+XobjdictjElUtrGl(j+X@getObjectId() (buildbot.db.state.StateConnectorComponent method)jUtrHl(j+X=getState() (buildbot.db.state.StateConnectorComponent method)jUtrIl(j+X=setState() (buildbot.db.state.StateConnectorComponent method)jUtrJl(j+Xbuildbot.db.users (module)Xmodule-buildbot.db.usersUtrKl(jakXUsers; DB Connector ComponentUindex-18UtrLl(j+X4UsersConnectorComponent (class in buildbot.db.users)jUUtrMl(j+XCfindUserByAttr() (buildbot.db.users.UsersConnectorComponent method)jUtrNl(j+X<getUser() (buildbot.db.users.UsersConnectorComponent method)jUtrOl(j+XFgetUserByUsername() (buildbot.db.users.UsersConnectorComponent method)jbUtrPl(j+X=getUsers() (buildbot.db.users.UsersConnectorComponent method)jUtrQl(j+X?updateUser() (buildbot.db.users.UsersConnectorComponent method)jUtrRl(j+X?removeUser() (buildbot.db.users.UsersConnectorComponent method)jUtrSl(j+XDidentifierToUid() (buildbot.db.users.UsersConnectorComponent method)jUtrTl(j+Xbuildbot.db.connector (module)Xmodule-buildbot.db.connectorUtrUl(j+X,DBConnector (class in buildbot.db.connector)jUtrVl(j+Xbuildbot.db.base (module)Xmodule-buildbot.db.baseUtrWl(j+X0DBConnectorComponent (class in buildbot.db.base)jUtrXl(j+X4db (buildbot.db.base.DBConnectorComponent attribute)jUtrYl(j+Xbuildbot.db.pool (module)Xmodule-buildbot.db.poolUtrZl(j+X(DBThreadPool (class in buildbot.db.pool)jUtr[l(j+X+do() (buildbot.db.pool.DBThreadPool method)j$Utr\l(j+X7do_with_engine() (buildbot.db.pool.DBThreadPool method)jUtr]l(j+Xbuildbot.db.model (module)Xmodule-buildbot.db.modelUtr^l(j+X"Model (class in buildbot.db.model)j_Utr_l(j+X,metadata (buildbot.db.model.Model attribute)jMUtr`l(j+X-is_current() (buildbot.db.model.Model method)jUtral(j+X*upgrade() (buildbot.db.model.Model method)jUtrbl(j+X%cached() (in module buildbot.db.base)jUtrcl(j+XMySQL; limitationsUindex-19Utrdl(j+XMySQL; limitationsUindex-20Utrel(j+XSQLite; limitationsUindex-21Utrfl(j+XMySQL; limitationsUindex-22Utrgl(j+XMySQL; limitationsUindex-23Utrhlejy]ril((UsingleXBuildmaster Config; buildersjjtrjl(UsingleXbuilders (Buildmaster Config)jjtrkl(j+XPATHUindex-0rllUtrml(j+Xenvironment variable; PATHjllUtrnl(j+XBuilds; mergingUindex-1Utrol(j+XProperties; builderUindex-2Utrpl(j+XBuilds; mergingUindex-3Utrql(j+XBuilds; priorityUindex-4Utrrlej]rsl((j+XBuildstep ParameterUindex-0Utrtl(j+X"Buildstep Parameter; haltOnFailureUindex-1Utrul(j+X$Buildstep Parameter; flunkOnWarningsUindex-2Utrvl(j+X#Buildstep Parameter; flunkOnFailureUindex-3Utrwl(j+X#Buildstep Parameter; warnOnWarningsUindex-4Utrxl(j+X"Buildstep Parameter; warnOnFailureUindex-5Utryl(j+XBuildstep Parameter; alwaysRunUindex-6Utrzl(j+X Buildstep Parameter; descriptionUindex-7Utr{l(j+X$Buildstep Parameter; descriptionDoneUindex-8Utr|l(j+X&Buildstep Parameter; descriptionSuffixUindex-9Utr}l(j+XBuildstep Parameter; doStepIfUindex-10Utr~l(j+XBuildstep Parameter; hideStepIfUindex-11Utrl(j+XBuildstep Parameter; locksUindex-12Utrl(j+Xbuildbot.steps.source (module)Xmodule-buildbot.steps.sourceUtrl(UsingleXBuild Steps; Mercurialj)j)trl(UsingleXMercurial Build Stepj)j)trl(j+XJbuildbot.steps.source.mercurial.Mercurial (class in buildbot.steps.source)jUtrl(UsingleXBuild Steps; Gitjjtrl(UsingleXGit Build Stepjjtrl(j+X>buildbot.steps.source.git.Git (class in buildbot.steps.source)jUtrl(UsingleXBuild Steps; SVNj"j"trl(UsingleXSVN Build Stepj"j"trl(j+X>buildbot.steps.source.svn.SVN (class in buildbot.steps.source)jUtrl(UsingleXBuild Steps; CVSjjtrl(UsingleXCVS Build Stepjjtrl(j+X>buildbot.steps.source.cvs.CVS (class in buildbot.steps.source)j{Utrl(UsingleXBuild Steps; Bzrj&j&trl(UsingleXBzr Build Stepj&j&trl(j+X>buildbot.steps.source.bzr.Bzr (class in buildbot.steps.source)jUtrl(UsingleXBuild Steps; P4j'j'trl(UsingleX P4 Build Stepj'j'trl(j+X<buildbot.steps.source.p4.P4 (class in buildbot.steps.source)jaUtrl(jakX#Gerrit integration; Repo Build StepUindex-13Utrl(UsingleXBuild Steps; Repojjtrl(UsingleXRepo Build Stepjjtrl(j+X@buildbot.steps.source.repo.Repo (class in buildbot.steps.source)jZUtrl(j+XWbuildbot.steps.source.repo.RepoDownloadsFromProperties (class in buildbot.steps.source)jSUtrl(j+XYbuildbot.steps.source.repo.RepoDownloadsFromChangeSource (class in buildbot.steps.source)jEUtrl(UsingleXBuild Steps; Gerritj,j,trl(UsingleXGerrit Build Stepj,j,trl(j+XDbuildbot.steps.source.gerrit.Gerrit (class in buildbot.steps.source)jhUtrl(UsingleXBuild Steps; Darcsj#j#trl(UsingleXDarcs Build Stepj#j#trl(j+XBbuildbot.steps.source.darcs.Darcs (class in buildbot.steps.source)jUtrl(UsingleXBuild Steps; MonotonejDjDtrl(UsingleXMonotone Build StepjDjDtrl(j+XCbuildbot.steps.source.mtn.Monotone (class in buildbot.steps.source)jUtrl(UsingleXBuild Steps; CVS (Slave-Side)j j trl(UsingleXCVS (Slave-Side) Build Stepj j trl(UsingleXBuild Steps; SVN (Slave-Side)jjtrl(UsingleXSVN (Slave-Side) Build Stepjjtrl(UsingleXBuild Steps; Darcs (Slave-Side)jjtrl(UsingleXDarcs (Slave-Side) Build Stepjjtrl(UsingleX#Build Steps; Mercurial (Slave-Side)j-j-trl(UsingleX!Mercurial (Slave-Side) Build Stepj-j-trl(UsingleXBuild Steps; Bzr (Slave-Side)jCjCtrl(UsingleXBzr (Slave-Side) Build StepjCjCtrl(UsingleXBuild Steps; P4 (Slave-Side)jjtrl(UsingleXP4 (Slave-Side) Build Stepjjtrl(UsingleXBuild Steps; Git (Slave-Side)jjtrl(UsingleXGit (Slave-Side) Build Stepjjtrl(jakX/Gerrit integration; Git (Slave-Side) Build StepUindex-14Utrl(UsingleXBuild Steps; BK (Slave-Side)j%j%trl(UsingleXBK (Slave-Side) Build Stepj%j%trl(UsingleXBuild Steps; Repo (Slave-Side)j;j;trl(UsingleXRepo (Slave-Side) Build Stepj;j;trl(j+X;buildbot.steps.source.Repo (class in buildbot.steps.source)jUtrl(jakX0Gerrit integration; Repo (Slave-Side) Build StepUindex-15Utrl(UsingleX"Build Steps; Monotone (Slave-Side)jjtrl(UsingleX Monotone (Slave-Side) Build Stepjjtrl(UsingleXBuild Steps; ShellCommandj?j?trl(UsingleXShellCommand Build Stepj?j?trl(j+XBbuildbot.steps.shell.ShellCommand (class in buildbot.steps.source)jUtrl(j+X PYTHONPATHUindex-16rlUtrl(j+X environment variable; PYTHONPATHjlUtrl(j+X PYTHONPATHUindex-17rlUtrl(j+X environment variable; PYTHONPATHjlUtrl(j+X PYTHONPATHUindex-18rlUtrl(j+X environment variable; PYTHONPATHjlUtrl(j+XPATHUindex-19rlUtrl(j+Xenvironment variable; PATHjlUtrl(UsingleXBuild Steps; Configurejjtrl(UsingleXConfigure Build Stepjjtrl(j+X?buildbot.steps.shell.Configure (class in buildbot.steps.source)j[Utrl(UsingleXBuild Steps; Compilej/j/trl(UsingleXCompile Build Stepj/j/trl(j+XProperties; warnings-countUindex-20Utrl(j+X Visual StudioUindex-21rlUtrl(j+X Visual C++jlUtrl(UsingleXBuild Steps; VC6jjtrl(UsingleXVC6 Build Stepjjtrl(UsingleXBuild Steps; VC7jjtrl(UsingleXVC7 Build Stepjjtrl(UsingleXBuild Steps; VC8jjtrl(UsingleXVC8 Build Stepjjtrl(UsingleXBuild Steps; VC9jjtrl(UsingleXVC9 Build Stepjjtrl(UsingleXBuild Steps; VC10j9j9trl(UsingleXVC10 Build Stepj9j9trl(UsingleXBuild Steps; VC11jjtrl(UsingleXVC11 Build Stepjjtrl(UsingleXBuild Steps; VC12j j trl(UsingleXVC12 Build Stepj j trl(UsingleXBuild Steps; VS2003jjtrl(UsingleXVS2003 Build Stepjjtrl(UsingleXBuild Steps; VS2005jjtrl(UsingleXVS2005 Build Stepjjtrl(UsingleXBuild Steps; VS2008jjtrl(UsingleXVS2008 Build Stepjjtrl(UsingleXBuild Steps; VS2010j2j2trl(UsingleXVS2010 Build Stepj2j2trl(UsingleXBuild Steps; VS2012j+j+trl(UsingleXVS2012 Build Stepj+j+trl(UsingleXBuild Steps; VS2013j.j.trl(UsingleXVS2013 Build Stepj.j.trl(UsingleXBuild Steps; VCExpress9jHjHtrl(UsingleXVCExpress9 Build StepjHjHtrl(UsingleXBuild Steps; MsBuild4j j trl(UsingleXMsBuild4 Build Stepj j trl(UsingleXBuild Steps; MsBuild12jjtrl(UsingleXMsBuild12 Build Stepjjtrl(j+XPATHUindex-22rlUtrl(j+Xenvironment variable; PATHjlUtrl(j+XINCLUDEUindex-23rlUtrl(j+Xenvironment variable; INCLUDEjlUtrl(j+XLIBUindex-24rlUtrl(j+Xenvironment variable; LIBjlUtrl(j+XPATHUindex-25rlUtrl(j+Xenvironment variable; PATHjlUtrl(UsingleXBuild Steps; Robocopyj$j$trl(UsingleXRobocopy Build Stepj$j$trl(j+X>buildbot.steps.mswin.Robocopy (class in buildbot.steps.source)jUtrm(UsingleXBuild Steps; Testjjtrm(UsingleXTest Build Stepjjtrm(UsingleXBuild Steps; TreeSizej*j*trm(UsingleXTreeSize Build Stepj*j*trm(j+XProperties; tree-size-KiBUindex-26Utrm(UsingleXBuild Steps; PerlModuleTestjIjItrm(UsingleXPerlModuleTest Build StepjIjItrm(UsingleXBuild Steps; MTRj(j(trm(UsingleXMTR Build Stepj(j(tr m(UsingleX Build Steps; SubunitShellCommandjjtr m(UsingleXSubunitShellCommand Build Stepjjtr m(j+XKbuildbot.steps.subunit.SubunitShellCommand (class in buildbot.steps.source)jUtr m(UsingleXBuild Steps; FileExistsjjtr m(UsingleXFileExists Build Stepjjtrm(UsingleXBuild Steps; CopyDirectoryjjtrm(UsingleXCopyDirectory Build Stepjjtrm(UsingleXBuild Steps; RemoveDirectoryj3j3trm(UsingleXRemoveDirectory Build Stepj3j3trm(UsingleXBuild Steps; MakeDirectoryjBjBtrm(UsingleXMakeDirectory Build StepjBjBtrm(UsingleXBuild Steps; BuildEPYDocj8j8trm(UsingleXBuildEPYDoc Build Stepj8j8trm(j+XBbuildbot.steps.python.BuildEPYDoc (class in buildbot.steps.source)jUtrm(UsingleXBuild Steps; PyFlakesjjtrm(UsingleXPyFlakes Build Stepjjtrm(j+X?buildbot.steps.python.PyFlakes (class in buildbot.steps.source)jUtrm(UsingleXBuild Steps; Sphinxjjtrm(UsingleXSphinx Build Stepjjtrm(j+X=buildbot.steps.python.Sphinx (class in buildbot.steps.source)j[Utrm(UsingleXBuild Steps; PyLintjjtrm(UsingleXPyLint Build Stepjjtrm(UsingleXBuild Steps; Trialj0j0tr m(UsingleXTrial Build Stepj0j0tr!m(j+XDbuildbot.steps.python_twisted.Trial (class in buildbot.steps.source)jUtr"m(j+X PYTHONPATHUindex-27r#mUtr$m(j+X environment variable; PYTHONPATHj#mUtr%m(UsingleXBuild Steps; RemovePYCsj4j4tr&m(UsingleXRemovePYCs Build Stepj4j4tr'm(j+XIbuildbot.steps.python_twisted.RemovePYCs (class in buildbot.steps.source)jUtr(m(j+X File TransferUindex-28Utr)m(UsingleXBuild Steps; FileUploadjjtr*m(UsingleXFileUpload Build Stepjjtr+m(UsingleXBuild Steps; FileDownloadjjtr,m(UsingleXFileDownload Build Stepjjtr-m(j+XCbuildbot.steps.transfer.FileUpload (class in buildbot.steps.source)jXUtr.m(j+XEbuildbot.steps.transfer.FileDownload (class in buildbot.steps.source)jPUtr/m(UsingleXBuild Steps; DirectoryUploadjjtr0m(UsingleXDirectoryUpload Build Stepjjtr1m(j+XHbuildbot.steps.transfer.DirectoryUpload (class in buildbot.steps.source)jUtr2m(UsingleXBuild Steps; MultipleFileUploadj7j7tr3m(UsingleXMultipleFileUpload Build Stepj7j7tr4m(j+XKbuildbot.steps.transfer.MultipleFileUpload (class in buildbot.steps.source)jiUtr5m(UsingleXBuild Steps; StringDownloadjjtr6m(UsingleXStringDownload Build Stepjjtr7m(UsingleXBuild Steps; JSONStringDownloadjjtr8m(UsingleXJSONStringDownload Build Stepjjtr9m(UsingleX#Build Steps; JSONPropertiesDownloadj!j!tr:m(UsingleX!JSONPropertiesDownload Build Stepj!j!tr;m(j+XGbuildbot.steps.transfer.StringDownload (class in buildbot.steps.source)j"Utrm(j+X"Properties; JSONPropertiesDownloadUindex-29Utr?m(UsingleXBuild Steps; MasterShellCommandjjtr@m(UsingleXMasterShellCommand Build StepjjtrAm(j+XIbuildbot.steps.master.MasterShellCommand (class in buildbot.steps.source)jqUtrBm(j+XPATHUindex-30rCmUtrDm(j+Xenvironment variable; PATHjCmUtrEm(UsingleXBuild Steps; LogRenderablej1j1trFm(UsingleXLogRenderable Build Stepj1j1trGm(j+XDbuildbot.steps.master.LogRenderable (class in buildbot.steps.source)jUtrHm(j+XProperties; from stepsUindex-31UtrIm(UsingleXBuild Steps; SetPropertyjEjEtrJm(UsingleXSetProperty Build StepjEjEtrKm(j+XBbuildbot.steps.master.SetProperty (class in buildbot.steps.source)jUtrLm(UsingleX#Build Steps; SetPropertyFromCommandj>j>trMm(UsingleX!SetPropertyFromCommand Build Stepj>j>trNm(j+XLbuildbot.steps.shell.SetPropertyFromCommand (class in buildbot.steps.source)jUtrOm(UsingleX!Build Steps; SetPropertiesFromEnvjjtrPm(UsingleXSetPropertiesFromEnv Build StepjjtrQm(j+XJbuildbot.steps.slave.SetPropertiesFromEnv (class in buildbot.steps.source)j]UtrRm(j+XTMPUindex-32rSmUtrTm(j+Xenvironment variable; TMPjSmUtrUm(UsingleXBuild Steps; SetSlaveInfojjtrVm(UsingleXSetSlaveInfo Build StepjjtrWm(j+XCbuildbot.steps.master.SetSlaveInfo (class in buildbot.steps.source)j UtrXm(j+X!Properties; triggering schedulersUindex-33UtrYm(UsingleXBuild Steps; TriggerjAjAtrZm(UsingleXTrigger Build StepjAjAtr[m(UsingleXBuild Steps; RpmBuildj<j<tr\m(UsingleXRpmBuild Build Stepj<j<tr]m(UsingleXBuild Steps; RpmLintjjtr^m(UsingleXRpmLint Build Stepjjtr_m(UsingleXBuild Steps; MockBuildSRPMj j tr`m(UsingleXMockBuildSRPM Build Stepj j tram(UsingleXBuild Steps; MockRebuildj5j5trbm(UsingleXMockRebuild Build Stepj5j5trcm(UsingleXBuild Steps; DebPbuilderj=j=trdm(UsingleXDebPbuilder Build Stepj=j=trem(UsingleXBuild Steps; DebCowbuilderjjtrfm(UsingleXDebCowbuilder Build Stepjjtrgm(UsingleXBuild Steps; DebLintianjjtrhm(UsingleXDebLintian Build Stepjjtrim(UsingleXBuild Steps; HLintj@j@trjm(UsingleXHLint Build Stepj@j@trkm(UsingleXBuild Steps; MaxQjjtrlm(UsingleXMaxQ Build Stepjjtrmm(j+X HTTP RequestsUindex-34Utrnm(UsingleXBuild Steps; HTTPStepjFjFtrom(UsingleXHTTPStep Build StepjFjFtrpm(UsingleXBuild Steps; POSTj6j6trqm(UsingleXPOST Build Stepj6j6trrm(UsingleXBuild Steps; GETjjtrsm(UsingleXGET Build Stepjjtrtm(UsingleXBuild Steps; PUTj:j:trum(UsingleXPUT Build Stepj:j:trvm(UsingleXBuild Steps; DELETEjGjGtrwm(UsingleXDELETE Build StepjGjGtrxm(UsingleXBuild Steps; HEADj j trym(UsingleXHEAD Build Stepj j trzm(UsingleXBuild Steps; OPTIONSj j tr{m(UsingleXOPTIONS Build Stepj j tr|mej]j]j]j]j]j]r}m(j+X PropertiesUindex-0Utr~maj]j]rm(j+X0buildbot.status.logfile.LogFile (built-in class)jUtrmaj]rm((j+X#buildbot.process.buildstep (module)X!module-buildbot.process.buildstepUtrm(j+X/BuildStep (class in buildbot.process.buildstep)jUtrm(j+X5name (buildbot.process.buildstep.BuildStep attribute)j+Utrm(j+X<description (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X@descriptionDone (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+XBdescriptionSuffix (buildbot.process.buildstep.BuildStep attribute)jsUtrm(j+X6locks (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X@progressMetrics (buildbot.process.buildstep.BuildStep attribute)j5Utrm(j+X<useProgress (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X9doStepIf (buildbot.process.buildstep.BuildStep attribute)j^Utrm(j+X;hideStepIf (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X>haltOnFailure (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X@flunkOnWarnings (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X?flunkOnFailure (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X?warnOnWarnings (buildbot.process.buildstep.BuildStep attribute)j Utrm(j+X>warnOnFailure (buildbot.process.buildstep.BuildStep attribute)j&Utrm(j+X:alwaysRun (buildbot.process.buildstep.BuildStep attribute)jRUtrm(j+X8setBuild() (buildbot.process.buildstep.BuildStep method)jeUtrm(j+X6build (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X=setBuildSlave() (buildbot.process.buildstep.BuildStep method)jTUtrm(j+X;buildslave (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+XAsetDefaultWorkdir() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X=setupProgress() (buildbot.process.buildstep.BuildStep method)jVUtrm(j+X9progress (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X9startStep() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X3run() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X5start() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X8finished() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X6failed() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X9interrupt() (buildbot.process.buildstep.BuildStep method)j0Utrm(j+X8stopped (buildbot.process.buildstep.BuildStep attribute)jUtrm(j+X=updateSummary() (buildbot.process.buildstep.BuildStep method)jmUtrm(j+XAgetCurrentSummary() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X@getResultSummary() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X8describe() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X<hasStatistic() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X<getStatistic() (buildbot.process.buildstep.BuildStep method)jAUtrm(j+X=getStatistics() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X<setStatistic() (buildbot.process.buildstep.BuildStep method)jUUtrm(j+X;setProgress() (buildbot.process.buildstep.BuildStep method)jSUtrm(j+X<slaveVersion() (buildbot.process.buildstep.BuildStep method)jUtrm(j+XGslaveVersionIsOlderThan() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X<getSlaveName() (buildbot.process.buildstep.BuildStep method)jGUtrm(j+X:runCommand() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X6addURL() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X6addLog() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X6getLog() (buildbot.process.buildstep.BuildStep method)j1Utrm(j+X>addCompleteLog() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X:addHTMLLog() (buildbot.process.buildstep.BuildStep method)jUtrm(j+X>addLogObserver() (buildbot.process.buildstep.BuildStep method)jjUtrm(j+X6LoggingBuildStep (class in buildbot.process.buildstep)jUtrm(j+X@logfiles (buildbot.process.buildstep.LoggingBuildStep attribute)jUtrm(j+XCstartCommand() (buildbot.process.buildstep.LoggingBuildStep method)j Utrm(j+XFcommandComplete() (buildbot.process.buildstep.LoggingBuildStep method)jUtrm(j+XDcreateSummary() (buildbot.process.buildstep.LoggingBuildStep method)jUtrm(j+XFevaluateCommand() (buildbot.process.buildstep.LoggingBuildStep method)jUtrm(j+X>getText() (buildbot.process.buildstep.LoggingBuildStep method)jjUtrm(j+X?getText2() (buildbot.process.buildstep.LoggingBuildStep method)jUtrm(j+XMbuildbot.process.buildstep.CommandMixin (class in buildbot.process.buildstep)joUtrm(j+XVrunRmdir() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)jUtrm(j+XVrunMkdir() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)jTUtrm(j+XXpathExists() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)jgUtrm(j+XRglob() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)jUtrm(j+XKbuildbot.process.buildstep.ShellMixin (class in buildbot.process.buildstep)jUtrm(j+XBuildStepFailedjUtrmej]j]rm((j+XChange SourcesUindex-0Utrm(UsingleX!Buildmaster Config; change_sourcejjtrm(UsingleX"change_source (Buildmaster Config)jjtrm(UsingleX Change Sources; CVSMaildirSourcejjtrm(UsingleXCVSMaildirSource Change Sourcejjtrm(j+X7buildbot.changes.mail.CVSMaildirSource (built-in class)j`Utrm(UsingleX+Change Sources; SVNCommitEmailMaildirSourcejjtrm(UsingleX)SVNCommitEmailMaildirSource Change Sourcejjtrm(j+XBbuildbot.changes.mail.SVNCommitEmailMaildirSource (built-in class)jUtrm(UsingleX.Change Sources; BzrLaunchpadEmailMaildirSourcejjtrm(UsingleX,BzrLaunchpadEmailMaildirSource Change Sourcejjtrm(j+XEbuildbot.changes.mail.BzrLaunchpadEmailMaildirSource (built-in class)jcUtrm(UsingleXChange Sources; PBChangeSourcejjtrm(UsingleXPBChangeSource Change Sourcejjtrm(j+X3buildbot.changes.pb.PBChangeSource (built-in class)jXUtrm(UsingleXChange Sources; P4Sourcejjtrm(UsingleXP4Source Change Sourcejjtrm(j+XP4PORTUindex-1rmUtrm(j+Xenvironment variable; P4PORTjmUtrm(j+XP4USERUindex-2rmUtrm(j+Xenvironment variable; P4USERjmUtrm(j+XP4PASSWDUindex-3rmUtrm(j+Xenvironment variable; P4PASSWDjmUtrm(UsingleXChange Sources; BonsaiPollerjjtrm(UsingleXBonsaiPoller Change Sourcejjtrm(UsingleXChange Sources; SVNPollerjjtrm(UsingleXSVNPoller Change Sourcejjtrm(j+X5buildbot.changes.svnpoller.SVNPoller (built-in class)jUtrm(j+XPATHUindex-4rmUtrm(j+Xenvironment variable; PATHjmUtrm(UsingleXChange Sources; BzrPollerjjtrm(UsingleXBzrPoller Change Sourcejjtrm(UsingleXChange Sources; GitPollerjjtrm(UsingleXGitPoller Change Sourcejjtrm(UsingleXChange Sources; HgPollerjjtrm(UsingleXHgPoller Change Sourcejjtrm(UsingleX*Change Sources; BitbucketPullrequestPollerjjtrm(UsingleX(BitbucketPullrequestPoller Change Sourcejjtrm(j+XFbuildbot.changes.bitbucket.BitbucketPullrequestPoller (built-in class)jUtrm(UsingleX"Change Sources; GerritChangeSourcejjtrm(UsingleX GerritChangeSource Change Sourcejjtrm(j+XGbuildbot.changes.gerritchangesource.GerritChangeSource (built-in class)jUtrm(j+X#Properties; from GerritChangeSourceUindex-5Utrm(UsingleXChange Sources; Change Hooksjjtrm(UsingleXChange Hooks Change Sourcejjtrm(UsingleX$Change Sources; GoogleCodeAtomPollerjjtrm(UsingleX"GoogleCodeAtomPoller Change Sourcejjtrmej]j]rm((j+X7summarySubscribe() (in module buildbot.status.buildset)jyUtrm(j+X9summaryUnsubscribe() (in module buildbot.status.buildset)jUtrm(j+X:sendBuildSetSummary() (in module buildbot.status.buildset)jUtrm(j+X+master (in module buildbot.status.buildset)jfUtrmeuUall_docsrm}rm(h GA5ih#GA5%h,GA5O'h5GA5Rh>GA5 k]hGGA5,hPGA5hYGA5hbGA5^7&hkGA5FhtGA5ih}GA5hGA5֛hGA5hGA5WhGA54hGA5/hGA5ͩhGA5LhGA5ZhGA52GhGA5.@hGA5ܛ_hGA5#hGA5hGA5ZjGA5G{j GA5!`jGA5V;jGA5'j(GA5˖j1GA5)j:GA52jCGA5K jLGA5FwOjUGA5j^GA5uyjgGA5jpGA5xjyGA5Qo*jGA5ǷjGA59qjGA5jGA5{jGA57ujGA5 jGA5y'=jGA5{jGA5!"jGA5jGA5+QjGA5YjGA5jGA5Iuj8}rm(j[j\jJKj`jOjrjsjyjUcsphinx.util.nodes WarningStream rm)rn}rn(U_rerncre _compile rnU+\((DEBUG|INFO|WARNING|ERROR|SEVERE)/[0-4]\)rnKRrnUwarnfuncrnNubj]hj>j?j|jnjfjguUfiles_to_rebuildrn}rn(jBh]r njaRr njBh]r n(j(j^eRr njh]r njaRrnjBh]rnjaRrnjBh]rnj aRrnjBh]rn(j(j^eRrnjh]rnjaRrnjBh]rnjaRrnjBh]rnhaRrnjBh]rnjaRrnjh]rnjaRrnjBh]rnjaRr njBh]r!nhGaRr"njBh]r#njaRr$njBh]r%njaRr&njBh]r'njaRr(njBh]r)nj aRr*njBh]r+nhGaRr,nj{Bh]r-nj aRr.njh]r/njaRr0njh]r1njaRr2njyBh]r3nj aRr4njBh]r5nhaRr6njBh]r7njaRr8nj~Bh]r9nj aRr:njBh]r;nhaRrnjBh]r?njaRr@njBh]rAnhaRrBnjBh]rCnjaRrDnj}Bh]rEnj aRrFnjBh]rGnj aRrHnjBh]rInj aRrJnjBh]rKnjaRrLnjBh]rMnjaRrNnjBh]rOnj(aRrPnjBh]rQnjaRrRnjBh]rSnj aRrTnjBh]rUnjaRrVnjBh]rWnjaRrXnjBh]rYnjaRrZnjzBh]r[nj aRr\njBh]r]nhGaRr^nj|Bh]r_nj aRr`njBh]ranj aRrbnjBh]rcnjaRrdnjBh]renjaRrfnjBh]rgnj aRrhnjh]rinjaRrjnjBh]rknj aRrlnjBh]rmnjaRrnnjBh]ronhGaRrpnjh]rqnjaRrrnuUtoc_secnumbersrsn}U_nitpick_ignorertnh]Rrunub.PK4D1Q 11'buildbot-v0.8.9/.doctrees/index.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xtable of contentsqNXindices and tablesqNX copyrightqNuUsubstitution_defsq }q Uparse_messagesq ]q Ucurrent_sourceq NU decorationqNUautofootnote_startqKUnameidsq}q(hUtable-of-contentsqhUindices-and-tablesqhU copyrightquUchildrenq]q(cdocutils.nodes comment q)q}q(U rawsourceqXh================================== BuildBot Documentation - |version| ==================================UparentqhUsourceqcdocutils.nodes reprunicode qXF/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/index.rstqq}q bUtagnameq!Ucommentq"U attributesq#}q$(U xml:spaceq%Upreserveq&Uidsq']Ubackrefsq(]Udupnamesq)]Uclassesq*]Unamesq+]uUlineq,KUdocumentq-hh]q.cdocutils.nodes Text q/Xh================================== BuildBot Documentation - |version| ==================================q0q1}q2(hUhhubaubcdocutils.nodes paragraph q3)q4}q5(hXBThis is the BuildBot documentation for Buildbot version |version|.q6hhhhh!U paragraphq7h#}q8(h)]h*]h(]h']h+]uh,Kh-hh]q9(h/X8This is the BuildBot documentation for Buildbot version q:q;}q<(hX8This is the BuildBot documentation for Buildbot version hh4ubh/X0.8.9q=q>}q?(hU0.8.9q@hNh,Nh-hhh4ubh/X.qA}qB(hX.hh4ubeubh3)qC}qD(hXFIf you are evaluating Buildbot and would like to get started quickly, start with the :doc:`Tutorial `. Regular users of Buildbot should consult the :doc:`Manual `, and those wishing to modify Buildbot directly will want to be familiar with the :doc:`Developer's Documentation `.hhhhh!h7h#}qE(h)]h*]h(]h']h+]uh,Kh-hh]qF(h/XUIf you are evaluating Buildbot and would like to get started quickly, start with the qGqH}qI(hXUIf you are evaluating Buildbot and would like to get started quickly, start with the hhCubcsphinx.addnodes pending_xref qJ)qK}qL(hX :doc:`Tutorial `qMhhChhh!U pending_xrefqNh#}qO(UreftypeXdocqPUrefwarnqQU reftargetqRXtutorial/indexU refdomainUh']h(]U refexplicith)]h*]h+]UrefdocqSXindexqTuh,Kh]qUcdocutils.nodes literal qV)qW}qX(hhMh#}qY(h)]h*]qZ(Uxrefq[hPeh(]h']h+]uhhKh]q\h/XTutorialq]q^}q_(hUhhWubah!Uliteralq`ubaubh/X0. Regular users of Buildbot should consult the qaqb}qc(hX0. Regular users of Buildbot should consult the hhCubhJ)qd}qe(hX:doc:`Manual `qfhhChhh!hNh#}qg(UreftypeXdocqhhQhRX manual/indexU refdomainUh']h(]U refexplicith)]h*]h+]hShTuh,Kh]qihV)qj}qk(hhfh#}ql(h)]h*]qm(h[hheh(]h']h+]uhhdh]qnh/XManualqoqp}qq(hUhhjubah!h`ubaubh/XR, and those wishing to modify Buildbot directly will want to be familiar with the qrqs}qt(hXR, and those wishing to modify Buildbot directly will want to be familiar with the hhCubhJ)qu}qv(hX2:doc:`Developer's Documentation `qwhhChhh!hNh#}qx(UreftypeXdocqyhQhRXdeveloper/indexU refdomainUh']h(]U refexplicith)]h*]h+]hShTuh,Kh]qzhV)q{}q|(hhwh#}q}(h)]h*]q~(h[hyeh(]h']h+]uhhuh]qh/XDeveloper's Documentationqq}q(hUhh{ubah!h`ubaubh/X.q}q(hX.hhCubeubcdocutils.nodes section q)q}q(hUhhhhh!Usectionqh#}q(h)]h*]h(]h']qhah+]qhauh,Kh-hh]q(cdocutils.nodes title q)q}q(hXTable Of Contentsqhhhhh!Utitleqh#}q(h)]h*]h(]h']h+]uh,Kh-hh]qh/XTable Of Contentsqq}q(hhhhubaubcdocutils.nodes compound q)q}q(hUhhhhh!Ucompoundqh#}q(h)]h*]qUtoctree-wrapperqah(]h']h+]uh,Nh-hh]qcsphinx.addnodes toctree q)q}q(hUhhhhh!Utoctreeqh#}q(UnumberedqKU includehiddenqhhTU titlesonlyqUglobqh']h(]h)]h*]h+]Uentriesq]q(NXtutorial/indexqqNX manual/indexqqNXdeveloper/indexqqNXrelnotes/indexqqeUhiddenqU includefilesq]q(hhhheUmaxdepthqKuh,Kh]ubaubh)q}q(hUhhhhh!hh#}q(h)]h*]h(]h']qhah+]qhauh,Kh-hh]q(h)q}q(hXIndices and Tablesqhhhhh!hh#}q(h)]h*]h(]h']h+]uh,Kh-hh]qh/XIndices and Tablesqq}q(hhhhubaubcdocutils.nodes bullet_list q)q}q(hUhhhhh!U bullet_listqh#}q(UbulletqX*h']h(]h)]h*]h+]uh,Kh-hh]q(cdocutils.nodes list_item q)q}q(hX:ref:`genindex`qhhhhh!U list_itemqh#}q(h)]h*]h(]h']h+]uh,Nh-hh]qh3)q}q(hhhhhhh!h7h#}q(h)]h*]h(]h']h+]uh,Kh]qhJ)q}q(hhhhhhh!hNh#}q(UreftypeXrefhQhRXgenindexU refdomainXstdqh']h(]U refexplicith)]h*]h+]hShTuh,Kh]qcdocutils.nodes emphasis q)q}q(hhh#}q(h)]h*]q(h[hXstd-refqeh(]h']h+]uhhh]qh/Xgenindexq⅁q}q(hUhhubah!Uemphasisqubaubaubaubh)q}q(hX:bb:index:`cfg`qhhhhh!hh#}q(h)]h*]h(]h']h+]uh,Nh-hh]qh3)q}q(hhhhhhh!h7h#}q(h)]h*]h(]h']h+]uh,Kh]qhJ)q}q(hhhhhhh!hNh#}q(UreftypeXindexhQhRXcfgU refdomainXbbqh']h(]U refexplicith)]h*]h+]hShTuh,Kh]qhV)q}q(hhh#}q(h)]h*]q(h[hXbb-indexqeh(]h']h+]uhhh]qh/Xcfgqq}q(hUhhubah!h`ubaubaubaubh)q}q(hX:bb:index:`sched`qhhhhh!hh#}r(h)]h*]h(]h']h+]uh,Nh-hh]rh3)r}r(hhhhhhh!h7h#}r(h)]h*]h(]h']h+]uh,Kh]rhJ)r}r(hhhjhhh!hNh#}r(UreftypeXindexhQhRXschedU refdomainXbbr h']h(]U refexplicith)]h*]h+]hShTuh,Kh]r hV)r }r (hhh#}r (h)]h*]r(h[j Xbb-indexreh(]h']h+]uhjh]rh/Xschedrr}r(hUhj ubah!h`ubaubaubaubh)r}r(hX:bb:index:`chsrc`rhhhhh!hh#}r(h)]h*]h(]h']h+]uh,Nh-hh]rh3)r}r(hjhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,Kh]rhJ)r}r(hjhjhhh!hNh#}r(UreftypeXindexhQhRXchsrcU refdomainXbbr h']h(]U refexplicith)]h*]h+]hShTuh,Kh]r!hV)r"}r#(hjh#}r$(h)]h*]r%(h[j Xbb-indexr&eh(]h']h+]uhjh]r'h/Xchsrcr(r)}r*(hUhj"ubah!h`ubaubaubaubh)r+}r,(hX:bb:index:`step`r-hhhhh!hh#}r.(h)]h*]h(]h']h+]uh,Nh-hh]r/h3)r0}r1(hj-hj+hhh!h7h#}r2(h)]h*]h(]h']h+]uh,Kh]r3hJ)r4}r5(hj-hj0hhh!hNh#}r6(UreftypeXindexhQhRXstepU refdomainXbbr7h']h(]U refexplicith)]h*]h+]hShTuh,Kh]r8hV)r9}r:(hj-h#}r;(h)]h*]r<(h[j7Xbb-indexr=eh(]h']h+]uhj4h]r>h/Xstepr?r@}rA(hUhj9ubah!h`ubaubaubaubh)rB}rC(hX:bb:index:`status`rDhhhhh!hh#}rE(h)]h*]h(]h']h+]uh,Nh-hh]rFh3)rG}rH(hjDhjBhhh!h7h#}rI(h)]h*]h(]h']h+]uh,K h]rJhJ)rK}rL(hjDhjGhhh!hNh#}rM(UreftypeXindexhQhRXstatusU refdomainXbbrNh']h(]U refexplicith)]h*]h+]hShTuh,K h]rOhV)rP}rQ(hjDh#}rR(h)]h*]rS(h[jNXbb-indexrTeh(]h']h+]uhjKh]rUh/XstatusrVrW}rX(hUhjPubah!h`ubaubaubaubh)rY}rZ(hX:bb:index:`cmdline`r[hhhhh!hh#}r\(h)]h*]h(]h']h+]uh,Nh-hh]r]h3)r^}r_(hj[hjYhhh!h7h#}r`(h)]h*]h(]h']h+]uh,K!h]rahJ)rb}rc(hj[hj^hhh!hNh#}rd(UreftypeXindexhQhRXcmdlineU refdomainXbbreh']h(]U refexplicith)]h*]h+]hShTuh,K!h]rfhV)rg}rh(hj[h#}ri(h)]h*]rj(h[jeXbb-indexrkeh(]h']h+]uhjbh]rlh/Xcmdlinermrn}ro(hUhjgubah!h`ubaubaubaubh)rp}rq(hX:ref:`modindex`rrhhhhh!hh#}rs(h)]h*]h(]h']h+]uh,Nh-hh]rth3)ru}rv(hjrhjphhh!h7h#}rw(h)]h*]h(]h']h+]uh,K"h]rxhJ)ry}rz(hjrhjuhhh!hNh#}r{(UreftypeXrefhQhRXmodindexU refdomainXstdr|h']h(]U refexplicith)]h*]h+]hShTuh,K"h]r}h)r~}r(hjrh#}r(h)]h*]r(h[j|Xstd-refreh(]h']h+]uhjyh]rh/Xmodindexrr}r(hUhj~ubah!hubaubaubaubh)r}r(hX:ref:`search` hhhhh!hh#}r(h)]h*]h(]h']h+]uh,Nh-hh]rh3)r}r(hX :ref:`search`rhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,K#h]rhJ)r}r(hjhjhhh!hNh#}r(UreftypeXrefhQhRXsearchU refdomainXstdrh']h(]U refexplicith)]h*]h+]hShTuh,K#h]rh)r}r(hjh#}r(h)]h*]r(h[jXstd-refreh(]h']h+]uhjh]rh/Xsearchrr}r(hUhjubah!hubaubaubaubeubeubh)r}r(hUhhhhh!hh#}r(h)]h*]h(]h']rhah+]rhauh,K&h-hh]r(h)r}r(hX Copyrightrhjhhh!hh#}r(h)]h*]h(]h']h+]uh,K&h-hh]rh/X Copyrightrr}r(hjhjubaubh3)r}r(hX'This documentation is part of Buildbot.rhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,K(h-hh]rh/X'This documentation is part of Buildbot.rr}r(hjhjubaubh3)r}r(hXBuildbot is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.rhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,K*h-hh]rh/XBuildbot is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.rr}r(hjhjubaubh3)r}r(hXThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.rhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,K,h-hh]rh/XThis program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.rr}r(hjhjubaubh3)r}r(hXYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.rhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,K/h-hh]rh/XYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.rr}r(hjhjubaubh3)r}r(hXCopyright Buildbot Team Membersrhjhhh!h7h#}r(h)]h*]h(]h']h+]uh,K1h-hh]rh/XCopyright Buildbot Team Membersrr}r(hjhjubaubeubeubehUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh-hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamr NUpep_file_url_templater Upep-%04dr Uexit_status_levelr KUconfigr NUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8r U_sourcer!UF/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/index.rstr"Ugettext_compactr#U generatorr$NUdump_internalsr%NU smart_quotesr&U pep_base_urlr'Uhttp://www.python.org/dev/peps/r(Usyntax_highlightr)Ulongr*Uinput_encoding_error_handlerr+jUauto_id_prefixr,Uidr-Udoctitle_xformr.Ustrip_elements_with_classesr/NU _config_filesr0]r1Ufile_insertion_enabledr2U raw_enabledr3KU dump_settingsr4NubUsymbol_footnote_startr5KUidsr6}r7(hhhhhjuUsubstitution_namesr8}r9h!h-h#}r:(h)]h']h(]Usourcehh*]h+]uU footnotesr;]r<Urefidsr=}r>ub.PK5D&.7dd:buildbot-v0.8.9/.doctrees/manual/cfg-changesources.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XpbchangesourceqXbzrlaunchpademailmaildirsourceqX4buildbot.changes.mail.BzrLaunchpadEmailMaildirSourceqXbitbucketpullrequestpollerq Xchange-hooks-http-notificationsq X bzr pollerq NXparsing email change messagesq NXgooglecodeatompollerq X svnpollerqX5buildbot.changes.bitbucket.BitbucketPullrequestPollerqUcontentsqNXhgpollerqX!change hooks (http notifications)qNXbzr-hookqX subversionqXbzr hookqNX-configuration of cvs and buildbot_cvs_mail.pyqNXsubscribing-the-buildmasterqXgerritchangesourceqX6buildbot.changes.gerritchangesource.GerritChangeSourceqXchoosing-a-change-sourceqXsvncommitemailmaildirsourceqXusing maildirsqNX$buildbot.changes.svnpoller.SVNPollerqXparsing-email-change-messagesqXmail-parsing-changesourcesqX bonsaipollerq X bzr-pollerq!Xgerrit stream-eventsq"Xrepository and projectq#NX1buildbot.changes.mail.SVNCommitEmailMaildirSourceq$Xperforceq%X"buildbot.changes.pb.PBChangeSourceq&Xchoosing a change sourceq'NXusing-maildirsq(Xcvsmaildirsourceq)Xmail-parsing changesourcesq*NXsubscribing the buildmasterq+NXp4sourceq,Xpull request rest apiq-X gitpollerq.Xconfiguring change sourcesq/NXchange sourcesq0NXchange-sourcesq1X&buildbot.changes.mail.CVSMaildirSourceq2Xexampleq3NuUsubstitution_defsq4}q5Uparse_messagesq6]q7(cdocutils.nodes system_message q8)q9}q:(U rawsourceq;UUparentq}q?(h;UU referencedq@Khh)r?}r@(h;UhQ}rA(hU]hV]hT]hS]hW]uh}r?(h;UhQ}r@(hU]hV]hT]hS]hW]uhh\]rHhlXGoogleCodeAtomPollerrIrJ}rK(h;XGoogleCodeAtomPollerrLh active. This section provides a description of all available rr}r(h;X> active. This section provides a description of all available h}r?(h;X7As a quick guide, here is a list of VC systems and the h polling process which examines the ViewCVS database directly)rr}r(h;X> polling process which examines the ViewCVS database directly)h}r?(h;X:bb:chsrc:`PBChangeSource`r@hh\]rIhlXPBChangeSourcerJrK}rL(h;Uh(h;UhQ}r?(hU]hV]hT]hS]hW]uh}r?(h;UhQ}r@(hS]hT]hU]hV]rAXfilerBaUrolejBhW]uhubahOjmubhlX0 run in a post-change-branch-tip or commit hook)rGrH}rI(h;X0 run in a post-change-branch-tip or commit hook)h(jgj9Xbb-chsrcr?ehT]hS]hW]uh`. Additionally, handlers for web-based notification (i.e. from GitHub) can be used with WebStatus' change_hook module. The interface is simple, so adding your own handlers (and sharing!) should be a breeze.h`rh(h;hhhEhHhOh]hQ}r (hU]hV]hT]hS]r U-configuration-of-cvs-and-buildbot-cvs-mail-pyr ahW]r hauhZMYh[hh\]r (he)r }r (h;X-Configuration of CVS and buildbot_cvs_mail.pyr h (h;j9 h hlXBzrLaunchpadEmailMaildirSourcer? r@ }rA (h;jMh (h;Uh }r? (h;XpThe password for the connection - defaults to ``changepw``. Do not use this default on a publicly exposed port!h ubjb)rE }rF (h;X ``changepw``hQ}rG (hU]hV]hT]hS]hW]uh h\]rH hlXchangepwrI rJ }rK (h;Uh ubeubahOjubeubjX)rO }rP (h;X``prefix`` The prefix to be found and stripped from filenames delivered over the connection, defaulting to ``None``. Any filenames which do not start with this prefix will be removed. If all the filenames in a given Change are removed, the that whole Change will be dropped. This string should probably end with a directory separator. This is useful for changes coming from version control systems that represent branches as parent directories within the repository (like SVN and Perforce). Use a prefix of ``trunk/`` or ``project/branches/foobranch/`` to only follow one branch and to get correct tree-relative filenames. Without a prefix, the :bb:chsrc:`PBChangeSource` will probably deliver Changes with filenames like :file:`trunk/foo.c` instead of just :file:`foo.c`. Of course this also depends upon the tool sending the Changes in (like :bb:cmdline:`buildbot sendchange `) and what filenames it is delivering: that tool may be filtering and stripping prefixes at the sending end. h`) and what filenames it is delivering: that tool may be filtering and stripping prefixes at the sending end.h`r h h|)r? }r@ (h;UhQ}rA (jpX*hS]hT]hU]hV]hW]uh`_ depot for changes. It accepts the following arguments:h(h;X periodically polls a h`_hQ}rA(UnameXPerforceUrefurirBXhttp://www.perforce.com/rChS]hT]hU]hV]hW]uhh@Kh}r?(h;Uheuhr?}r@(h;UhThe CVS root of the repository. Usually this is ``/cvsroot``.h`_ repository for new revisions, by running the ``svn log`` command in a subshell. It can watch a single branch or multiple branches.hr?}r@(h;X. is a ChangeSource which periodically polls a h`_hQ}rC(UnameX SubversionjBXhttp://subversion.tigris.org/rDhS]hT]hU]hV]hW]uhh@Kh(h;X3For directories, the relative pathname returned by h` for triggering particular builders. h` for triggering particular builders.h`rhr?}r@(h;X or h}r?(h;XThis controls the h(h;X ``project``hQ}r?(hU]hV]hT]hS]hW]uhr?}r@(h;Uhr?}r@(h;Uh(hU]hV]hT]hS]hW]uh``gitbin`` path to the Git binary, defaults to just ``'git'`` hr?}r@(h;Uh(h;XE``branch`` the desired branch to pull, will default to ``'default'`` h}r?(h;X:bb:chsrc:`HgPoller`r@hh\]rIhlXHgPollerrJrK}rL(h;UhA configuration for the Mercurial poller might look like this:rr}r(h;X>A configuration for the Mercurial poller might look like this:h}r?(h;X\ periodically polls Bitbucket for new or updated pull requests. It uses Bitbuckets powerful h}r?(h;X<Set the category to be used for the changes produced by the hh\]r(hlXlA callable which takes one parameter, the decoded Python object of the pull request JSON. If the it returns rr}r(h;XlA callable which takes one parameter, the decoded Python object of the pull request JSON. If the it returns hh)r?}r@(h;XAnyone who can create pull requests for the Bitbucket repository can initiate a change, potentially causing the buildmaster to run arbitrary code.rAh`_.h`_hQ}r(UnameXgerrit stream-eventsjBXKhttp://gerrit.googlecode.com/svn/documentation/2.2.1/cmd-stream-events.htmlrhS]hT]hU]hV]hW]uhh@Kh }r? (h;Uh!(h;XBranch of the Changer?!h"r?"}r@"(h;j;"h#(h;j9#h``event.submitter.name`` Submitter's name (merger responsible)h$jb)r?$}r@$(h;j;$hQ}rA$(hU]hV]rB$(jgj=$Xbb-chsrcrC$ehT]hS]hW]uh%(h;UhQ}r?%(hS]hT]hU]hV]r@%XsamprA%aUrolejA%hW]uh&}r?&(h;Uh(h(hj j eubhEhHhJ}r)h)j(shOh]hQ}r)(hU]r)Xcvsmaildirsourcer)ahV]hT]hS]r)(j"j(Uid7r)ehW]r)h)auhZMGh[hhb}r)(j(j(j"j(uh\]r)(he)r )}r )(h;j'hhEhHhOhihQ}r )(hS]hT]hU]hV]hW]hXj!uhZMGh[hh\]r )hlXCVSMaildirSourcer )r)}r)(h;j'hhENhOjhQ}r)(hS]hT]hU]hV]hW]Uentries]r)(jX7buildbot.changes.mail.CVSMaildirSource (built-in class)h2Utr)auhZNh[hh\]ubj )r)}r)(h;UhhENhOj hQ}r)(j j XpyhS]hT]hU]hV]hW]j Xclassr)j j)uhZNh[hh\]r)(j )r)}r)(h;X&buildbot.changes.mail.CVSMaildirSourcehhEhHhOhhQ}r:)(hU]hV]hT]hS]hW]uhZMKh[hh\]r;)(hlXThis parser works with the r<)r=)}r>)(h;XThis parser works with the hhEhHhOhhQ}rM)(hU]hV]hT]hS]hW]uhZMNh[hh\]rN)(hlXjThe script sends an email containing all the files submitted in one directory. It is invoked by using the rO)rP)}rQ)(h;XjThe script sends an email containing all the files submitted in one directory. It is invoked by using the hhEhHhOhhQ}r`)(hU]hV]hT]hS]hW]uhZMQh[hh\]ra)(hlXThe Buildbot's rb)rc)}rd)(h;XThe Buildbot's hhEhHhOjthQ}ry)(jvjwhS]hT]hU]hV]hW]uhZMUh[hh\]rz)hlXofrom buildbot.changes.mail import CVSMaildirSource c['change_source'] = CVSMaildirSource("/home/buildbot/Mail")r{)r|)}r})(h;UhDuplicate implicit target name: "svncommitemailmaildirsource".r)r)}r)(h;UhHyperlink target "choosing-a-change-source" is not referenced.r8*r9*}r:*(h;Uh*h)r?*}r@*(h;UhQ}rA*(hU]hV]hT]hS]hW]uh+(hU]hV]hT]hS]hW]uhHyperlink target "chsrc-GerritChangeSource" is not referenced.r+r+}r+(h;Uh,NU _config_filesr?,]Ufile_insertion_enabledr@,U raw_enabledrA,KU dump_settingsrB,NubUsymbol_footnote_startrC,KUidsrD,}rE,(j+ j jHj jFjBj3j/j jj j jjhj1jKjGhj jMjIhj%j5j jjt'hhAjjj<j?jjj j h&j2 jjhjF&jjj[j h2j)j$j$hjL j4jX$jQj[jjjrj jjj j j7 j jy'jt'j)h>j%j%jK&jF&jjj%hAh`hCjPjSj !j!j j#jj!j!j[jZj]hjwhjjjjN$jX$j j jkjuhYhCj j jGj$jjj jj(h>j j j j jjjjjjjjjjj|jujjjbj[hj jjjLjHjjj"h>jjjjuj+j1hyhqjjjjhjjjjjj~jjjjjjjjZjVjqjmj4j0jGjCh$j j!jjj j$j$j]$jX$hhhhhhhhhhhhuUsubstitution_namesrF,}rG,hOh[hQ}rH,(hU]hS]hT]UsourcehHhV]hW]uU footnotesrI,]rJ,UrefidsrK,}rL,(j+ ]rM,j. ajH]rN,j aj]rO,jaj4]rP,jT$ajG]rQ,j$ajQ]rR,jTaj]rS,jaj]rT,jaj ]rU,j ajr]rV,j aj]rW,jqaj]rX,jaj]rY,jaj]rZ,jaj(]r[,j(aj !]r\,j!aj]r],jah]r^,j%aj!]r_,jWaj$]r`,j$aj~]ra,jah]rb,jaj5]rc,j aj]rd,jaj]re,jq'ah]rf,jaj+]rg,j.aj]rh,jaj ]ri,j aj ]rj,j ah]rk,jC&aj]rl,jaj"]rm,j(aj[]rn,j ahY]ro,hMajN$]rp,jQ$ajk]rq,jnauub.PK6DK2buildbot-v0.8.9/.doctrees/manual/cfg-intro.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xtesting-the-config-fileqXtesting the config fileqNXpredefined-config-file-symbolsqXpredefined config file symbolsq NXconfig file formatq NXreconfig by debug clientq NXconfiguring buildbotq NXconfig-file-formatq Xloading the config fileqNX$reloading the config file (reconfig)qNXbasic python syntaxqNuUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUtesting-the-config-fileqhUid3qhUpredefined-config-file-symbolsqh Uid2qh Uid1qh Ureconfig-by-debug-clientqh Uconfiguring-buildbotq h Uconfig-file-formatq!hUloading-the-config-fileq"hU"reloading-the-config-file-reconfigq#hUbasic-python-syntaxq$uUchildrenq%]q&cdocutils.nodes section q')q(}q)(U rawsourceq*UUparentq+hUsourceq,cdocutils.nodes reprunicode q-XQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-intro.rstq.q/}q0bUtagnameq1Usectionq2U attributesq3}q4(Udupnamesq5]Uclassesq6]Ubackrefsq7]Uidsq8]q9h aUnamesq:]q;h auUlineq(cdocutils.nodes title q?)q@}qA(h*XConfiguring BuildbotqBh+h(h,h/h1UtitleqCh3}qD(h5]h6]h7]h8]h:]uh}r?(h*Uh3}r@(h8]h7]h5]h6]rAXfilerBaUrolejBh:]uh+j7h%]rChFX master.cfgrDrE}rF(h*X master.cfgh+j>ubah1hiubhFX+ file typically starts with something like:rGrH}rI(h*X+ file typically starts with something like:h+j7ubeubcdocutils.nodes literal_block rJ)rK}rL(h*XBuildmasterConfig = c = {}h+hh,h/h1U literal_blockrMh3}rN(hhh8]h7]h5]h6]h:]uhh=hh%]r(hFX,Python comments start with a hash character rr}r(h*X,Python comments start with a hash character h+jubh_)r}r(h*X``#``h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFX#r}r(h*Uh+jubah1hiubhFX, tuples are defined with rr}r(h*X, tuples are defined with h+jubh_)r}r(h*X``(parenthesis, pairs)``h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFX(parenthesis, pairs)rr}r(h*Uh+jubah1hiubhFX&, and lists (arrays) are defined with rr}r(h*X&, and lists (arrays) are defined with h+jubh_)r}r(h*X``[square, brackets]``h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFX[square, brackets]rr}r(h*Uh+jubah1hiubhFXW. Tuples and lists are mostly interchangeable. Dictionaries (data structures which map rr}r(h*XW. Tuples and lists are mostly interchangeable. Dictionaries (data structures which map h+jubhS)r}r(h*X*keys*h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFXkeysrr}r(h*Uh+jubah1h[ubhFX to rr}r(h*X to h+jubhS)r}r(h*X*values*h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFXvaluesrr}r(h*Uh+jubah1h[ubhFX!) are defined with curly braces: rr}r(h*X!) are defined with curly braces: h+jubh_)r}r(h*X$``{'key1': value1, 'key2': value2}``h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFX {'key1': value1, 'key2': value2}rr}r(h*Uh+jubah1hiubhFXK. Function calls (and object instantiation) can use named parameters, like rr}r(h*XK. Function calls (and object instantiation) can use named parameters, like h+jubh_)r}r(h*X&``w = html.Waterfall(http_port=8010)``h3}r(h5]h6]h7]h8]h:]uh+jh%]rhFX"w = html.Waterfall(http_port=8010)rr}r(h*Uh+jubah1hiubhFX.r}r(h*X.h+jubeubhJ)r}r(h*X7The config file starts with a series of ``import`` statements, which make various kinds of :class:`Step`\s and :class:`Status` targets available for later use. The main ``BuildmasterConfig`` dictionary is created, then it is populated with a variety of keys, described section-by-section in subsequent chapters.h+jh,h/h1hMh3}r(h5]h6]h7]h8]h:]uhhFXBuildmasterConfigr?r@}rA(h*Uh+j;ubah1hiubhFXy dictionary is created, then it is populated with a variety of keys, described section-by-section in subsequent chapters.rBrC}rD(h*Xy dictionary is created, then it is populated with a variety of keys, described section-by-section in subsequent chapters.h+jubeubh)rE}rF(h*X#.. _Predefined-Config-File-Symbols:h+jh,h/h1hh3}rG(h8]h7]h5]h6]h:]hhuh runner.run() File "/home/buildbot/master/buildbot/scripts/runner.py", line 1358, in run if not doCheckConfig(so): File "/home/buildbot/master/buildbot/scripts/runner.py", line 1079, in doCheckConfig return cl.load(quiet=quiet) File "/home/buildbot/master/buildbot/scripts/checkconfig.py", line 29, in load self.basedir, self.configFileName) --- --- File "/home/buildbot/master/buildbot/config.py", line 147, in loadConfig exec f in localDict exceptions.SyntaxError: invalid syntax (master.cfg, line 52) Configuration Errors: error while parsing config file: invalid syntax (master.cfg, line 52) (traceback in logfile)h+jh,h/h1jMh3}r(jjXnonehhh8]h7]h5]h6]h:]uh runner.run() File "/home/buildbot/master/buildbot/scripts/runner.py", line 1358, in run if not doCheckConfig(so): File "/home/buildbot/master/buildbot/scripts/runner.py", line 1079, in doCheckConfig return cl.load(quiet=quiet) File "/home/buildbot/master/buildbot/scripts/checkconfig.py", line 29, in load self.basedir, self.configFileName) --- --- File "/home/buildbot/master/buildbot/config.py", line 147, in loadConfig exec f in localDict exceptions.SyntaxError: invalid syntax (master.cfg, line 52) Configuration Errors: error while parsing config file: invalid syntax (master.cfg, line 52) (traceback in logfile)r r }r (h*Uh+jubaubeubh')r }r (h*Uh+h(h,h/h1h2h3}r(h5]h6]h7]h8]rh"ah:]rhauh}r?(h*XIf you are on the system hosting the buildmaster, you can send a ``SIGHUP`` signal to it: the :command:`buildbot` tool has a shortcut for this:h+j0h,h/h1hMh3}r@(h5]h6]h7]h8]h:]uhubh_)rE}rF(h*X ``SIGHUP``h3}rG(h5]h6]h7]h8]h:]uh+j>h%]rHhFXSIGHUPrIrJ}rK(h*Uh+jEubah1hiubhFX signal to it: the rLrM}rN(h*X signal to it: the h+j>ubhm)rO}rP(h*X:command:`buildbot`h3}rQ(h5]h6]rRhrah7]h8]h:]uh+j>h%]rShFXbuildbotrTrU}rV(h*Uh+jOubah1hwubhFX tool has a shortcut for this:rWrX}rY(h*X tool has a shortcut for this:h+j>ubeubjJ)rZ}r[(h*Xbuildbot reconfig BASEDIRh+j0h,h/h1jMh3}r\(jjXnonehhh8]h7]h5]h6]h:]uh(h*X:class:`Builder`r?h+j6h,h/h1hh3}r@(UreftypeXclasshhXBuilderU refdomainXpyrAh8]h7]U refexplicith5]h6]h:]hhhNhNuh` (:samp:`buildbot debugclient --master {HOST}:{PORT}`) has a :guilabel:`Reload .cfg` button which will also trigger a reload.h+jh,h/h1hMh3}r(h5]h6]h7]h8]h:]uh`rh+jh,h/h1hh3}r(UreftypeXcmdlinehhX debugclientU refdomainXbbrh8]h7]U refexplicith5]h6]h:]hhuhKUdump_transformsr?NU docinfo_xformr@KUwarning_streamrANUpep_file_url_templaterBUpep-%04drCUexit_status_levelrDKUconfigrENUstrict_visitorrFNUcloak_email_addressesrGUtrim_footnote_reference_spacerHUenvrINUdump_pseudo_xmlrJNUexpose_internalsrKNUsectsubtitle_xformrLU source_linkrMNUrfc_referencesrNNUoutput_encodingrOUutf-8rPU source_urlrQNUinput_encodingrRU utf-8-sigrSU_disable_configrTNU id_prefixrUUU tab_widthrVKUerror_encodingrWUUTF-8rXU_sourcerYUQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-intro.rstrZUgettext_compactr[U generatorr\NUdump_internalsr]NU smart_quotesr^U pep_base_urlr_Uhttp://www.python.org/dev/peps/r`Usyntax_highlightraUlongrbUinput_encoding_error_handlerrcj=Uauto_id_prefixrdUidreUdoctitle_xformrfUstrip_elements_with_classesrgNU _config_filesrh]Ufile_insertion_enabledriU raw_enabledrjKU dump_settingsrkNubUsymbol_footnote_startrlKUidsrm}rn(hjhjHhjhjHhjhhh"j h!hh h(h$jh#j0uUsubstitution_namesro}rph1h=h3}rq(h5]h8]h7]Usourceh/h6]h:]uU footnotesrr]rsUrefidsrt}ru(h]rvjah!]rwhah]rxjEauub.PK6DƎ1buildbot-v0.8.9/.doctrees/manual/concepts.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xconcepts-buildqXbuildersqNX buildsetsqNXemail addressesq NX build slavesq NXbuild propertiesq NXbuildsq NX irc nicknamesq NXtoolsqNXattributes-of-changesqXmultiple-codebase buildsqNX source-stampsqXgitqX(how-different-vc-systems-specify-sourcesqX attr-projectqXscheduling buildsqNXlive status clientsqNXcommentsqNX buildrequestsqNX subversionqX attr-filesqXconcepts-build-factoriesqXdoing-things-with-usersqX user objectsqNXconcepts-usersqXrevisionqNXfilesq NXprojectq!NX attr-codebaseq"Xusersq#NX repositoryq$NXmonotoneq%Xbuild-propertiesq&Xwhoq'NXmultiple-codebase-buildsq(Xscheduling-buildsq)Xperforceq*Xtree stabilityq+NXcodebaseq,NXattr-repositoryq-Xbuild factoriesq.NXusesq/NXchange propertiesq0NXversion-control-systemsq1X buildrequestq2Xbuildsetq3Xemail-addressesq4Xattr-whoq5Xdoing things with usersq6NX attr-revisionq7X(how different vc systems specify sourcesq8NXdarcsq9Xbranchesq:NXbzrq;X irc-nicknamesqXlive-status-clientsq?X source stampsq@NX user-objectsqAXversion control systemsqBNXconceptsqCNXconcepts-build-slavesqDX attr-commentsqEXchangesqFNuUsubstitution_defsqG}qHUparse_messagesqI]qJcdocutils.nodes system_message qK)qL}qM(U rawsourceqNUUparentqOcdocutils.nodes section qP)qQ}qR(hNUU referencedqSKhOhP)qT}qU(hNUhOhP)qV}qW(hNUhOhP)qX}qY(hNUhOhUsourceqZcdocutils.nodes reprunicode q[XP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/concepts.rstq\q]}q^bUtagnameq_Usectionq`U attributesqa}qb(Udupnamesqc]Uclassesqd]Ubackrefsqe]Uidsqf]qgUconceptsqhaUnamesqi]qjhCauUlineqkKUdocumentqlhUchildrenqm]qn(cdocutils.nodes title qo)qp}qq(hNXConceptsqrhOhXhZh]h_Utitleqsha}qt(hc]hd]he]hf]hi]uhkKhlhhm]qucdocutils.nodes Text qvXConceptsqwqx}qy(hNhrhOhpubaubcdocutils.nodes paragraph qz)q{}q|(hNXThis chapter defines some of the basic concepts that the Buildbot uses. You'll need to understand how the Buildbot sees the world to configure it properly.q}hOhXhZh]h_U paragraphq~ha}q(hc]hd]he]hf]hi]uhkKhlhhm]qhvXThis chapter defines some of the basic concepts that the Buildbot uses. You'll need to understand how the Buildbot sees the world to configure it properly.qq}q(hNh}hOh{ubaubcdocutils.nodes comment q)q}q(hNXindex: repositoryhOhXhZh]h_Ucommentqha}q(U xml:spaceqUpreserveqhf]he]hc]hd]hi]uhkKhlhhm]qhvXindex: repositoryqq}q(hNUhOhubaubh)q}q(hNXindex: codebasehOhXhZh]h_hha}q(hhhf]he]hc]hd]hi]uhkK hlhhm]qhvXindex: codebaseqq}q(hNUhOhubaubh)q}q(hNXindex: projecthOhXhZh]h_hha}q(hhhf]he]hc]hd]hi]uhkK hlhhm]qhvXindex: projectqq}q(hNUhOhubaubh)q}q(hNXindex: revisionhOhXhZh]h_hha}q(hhhf]he]hc]hd]hi]uhkK hlhhm]qhvXindex: revisionqq}q(hNUhOhubaubh)q}q(hNX index: branchhOhXhZh]h_hha}q(hhhf]he]hc]hd]hi]uhkK hlhhm]qhvX index: branchqq}q(hNUhOhubaubh)q}q(hNXindex: source stamphOhXhZh]h_hha}q(hhhf]he]hc]hd]hi]uhkKhlhhm]qhvXindex: source stampqq}q(hNUhOhubaubcdocutils.nodes target q)q}q(hNX.. _Source-Stamps:hOhXhZh]h_Utargetqha}q(hf]he]hc]hd]hi]UrefidqU source-stampsquhkKhlhhm]ubhP)q}q(hNUhOhXhZh]Uexpect_referenced_by_nameq}qhhsh_h`ha}q(hc]hd]he]hf]q(hUid1qehi]q(h@heuhkKhlhUexpect_referenced_by_idq}qhhshm]q(ho)q}q(hNX Source StampsqhOhhZh]h_hsha}q(hc]hd]he]hf]hi]uhkKhlhhm]qhvX Source StampsqɅq}q(hNhhOhubaubhz)q}q(hNXSource code comes from *repositories*, provided by version control systems. Repositories are generally identified by URLs, e.g., ``git://github.com/buildbot/buildbot.git``.hOhhZh]h_h~ha}q(hc]hd]he]hf]hi]uhkKhlhhm]q(hvXSource code comes from qЅq}q(hNXSource code comes from hOhubcdocutils.nodes emphasis q)q}q(hNX*repositories*ha}q(hc]hd]he]hf]hi]uhOhhm]qhvX repositoriesq؅q}q(hNUhOhubah_UemphasisqubhvX\, provided by version control systems. Repositories are generally identified by URLs, e.g., q܅q}q(hNX\, provided by version control systems. Repositories are generally identified by URLs, e.g., hOhubcdocutils.nodes literal q)q}q(hNX*``git://github.com/buildbot/buildbot.git``ha}q(hc]hd]he]hf]hi]uhOhhm]qhvX&git://github.com/buildbot/buildbot.gitq䅁q}q(hNUhOhubah_UliteralqubhvX.q}q(hNX.hOhubeubhz)q}q(hNXIn these days of distributed version control systems, the same *codebase* may appear in multiple repositories. For example, ``https://github.com/mozilla/mozilla-central`` and ``http://hg.mozilla.org/mozilla-release`` both contain the Firefox codebase, although not exactly the same code.hOhhZh]h_h~ha}q(hc]hd]he]hf]hi]uhkKhlhhm]q(hvX?In these days of distributed version control systems, the same qq}q(hNX?In these days of distributed version control systems, the same hOhubh)q}q(hNX *codebase*ha}q(hc]hd]he]hf]hi]uhOhhm]qhvXcodebaseqq}q(hNUhOhubah_hubhvX3 may appear in multiple repositories. For example, qq}q(hNX3 may appear in multiple repositories. For example, hOhubh)q}q(hNX.``https://github.com/mozilla/mozilla-central``ha}q(hc]hd]he]hf]hi]uhOhhm]qhvX*https://github.com/mozilla/mozilla-centralqr}r(hNUhOhubah_hubhvX and rr}r(hNX and hOhubh)r}r(hNX)``http://hg.mozilla.org/mozilla-release``ha}r(hc]hd]he]hf]hi]uhOhhm]rhvX%http://hg.mozilla.org/mozilla-releaser r }r (hNUhOjubah_hubhvXG both contain the Firefox codebase, although not exactly the same code.r r }r(hNXG both contain the Firefox codebase, although not exactly the same code.hOhubeubhz)r}r(hNXRMany *projects* are built from multiple codebases. For example, a company may build several applications based on the same core library. The "app" codebase and the "core" codebase are in separate repositories, but are compiled together and constitute a single project. Changes to either codebase should cause a rebuild of the application.hOhhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(hvXMany rr}r(hNXMany hOjubh)r}r(hNX *projects*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXprojectsrr}r(hNUhOjubah_hubhvXC are built from multiple codebases. For example, a company may build several applications based on the same core library. The "app" codebase and the "core" codebase are in separate repositories, but are compiled together and constitute a single project. Changes to either codebase should cause a rebuild of the application.rr}r(hNXC are built from multiple codebases. For example, a company may build several applications based on the same core library. The "app" codebase and the "core" codebase are in separate repositories, but are compiled together and constitute a single project. Changes to either codebase should cause a rebuild of the application.hOjubeubhz)r }r!(hNXMost version control systems define some sort of *revision* that can be used (sometimes in combination with a *branch*) to uniquely specify a particular version of the source code.r"hOhhZh]h_h~ha}r#(hc]hd]he]hf]hi]uhkKhlhhm]r$(hvX1Most version control systems define some sort of r%r&}r'(hNX1Most version control systems define some sort of hOj ubh)r(}r)(hNX *revision*ha}r*(hc]hd]he]hf]hi]uhOj hm]r+hvXrevisionr,r-}r.(hNUhOj(ubah_hubhvX3 that can be used (sometimes in combination with a r/r0}r1(hNX3 that can be used (sometimes in combination with a hOj ubh)r2}r3(hNX*branch*ha}r4(hc]hd]he]hf]hi]uhOj hm]r5hvXbranchr6r7}r8(hNUhOj2ubah_hubhvX>) to uniquely specify a particular version of the source code.r9r:}r;(hNX>) to uniquely specify a particular version of the source code.hOj ubeubhz)r<}r=(hNXTo build a project, Buildbot needs to know exactly which version of each codebase it should build. It uses a *source stamp* to do so for each codebase; the collection of sourcestamps required for a project is called a *source stamp set*.hOhhZh]h_h~ha}r>(hc]hd]he]hf]hi]uhkK!hlhhm]r?(hvXmTo build a project, Buildbot needs to know exactly which version of each codebase it should build. It uses a r@rA}rB(hNXmTo build a project, Buildbot needs to know exactly which version of each codebase it should build. It uses a hOj<ubh)rC}rD(hNX*source stamp*ha}rE(hc]hd]he]hf]hi]uhOj<hm]rFhvX source stamprGrH}rI(hNUhOjCubah_hubhvX_ to do so for each codebase; the collection of sourcestamps required for a project is called a rJrK}rL(hNX_ to do so for each codebase; the collection of sourcestamps required for a project is called a hOj<ubh)rM}rN(hNX*source stamp set*ha}rO(hc]hd]he]hf]hi]uhOj<hm]rPhvXsource stamp setrQrR}rS(hNUhOjMubah_hubhvX.rT}rU(hNX.hOj<ubeubh)rV}rW(hNX index: changehOhhZh]h_hha}rX(hhhf]he]hc]hd]hi]uhkK%hlhhm]rYhvX index: changerZr[}r\(hNUhOjVubaubh)r]}r^(hNX.. _Version-Control-Systems:hOhhZh]h_hha}r_(hf]he]hc]hd]hi]hUversion-control-systemsr`uhkK&hlhhm]ubeubhP)ra}rb(hNUhOhXhZh]h}rch1j]sh_h`ha}rd(hc]hd]he]hf]re(j`Uid2rfehi]rg(hBh1euhkK)hlhh}rhj`j]shm]ri(ho)rj}rk(hNXVersion Control SystemsrlhOjahZh]h_hsha}rm(hc]hd]he]hf]hi]uhkK)hlhhm]rnhvXVersion Control Systemsrorp}rq(hNjlhOjjubaubhz)rr}rs(hNX`Buildbot supports a significant number of version control systems, so it treats them abstractly.rthOjahZh]h_h~ha}ru(hc]hd]he]hf]hi]uhkK+hlhhm]rvhvX`Buildbot supports a significant number of version control systems, so it treats them abstractly.rwrx}ry(hNjthOjrubaubhz)rz}r{(hNXnFor purposes of deciding when to perform builds, Buildbot's change sources monitor repositories, and represent any updates to those repositories as *changes*. These change sources fall broadly into two categories: pollers which periodically check the repository for updates; and hooks, where the repository is configured to notify Buildbot whenever an update occurs.hOjahZh]h_h~ha}r|(hc]hd]he]hf]hi]uhkK-hlhhm]r}(hvXFor purposes of deciding when to perform builds, Buildbot's change sources monitor repositories, and represent any updates to those repositories as r~r}r(hNXFor purposes of deciding when to perform builds, Buildbot's change sources monitor repositories, and represent any updates to those repositories as hOjzubh)r}r(hNX *changes*ha}r(hc]hd]he]hf]hi]uhOjzhm]rhvXchangesrr}r(hNUhOjubah_hubhvX. These change sources fall broadly into two categories: pollers which periodically check the repository for updates; and hooks, where the repository is configured to notify Buildbot whenever an update occurs.rr}r(hNX. These change sources fall broadly into two categories: pollers which periodically check the repository for updates; and hooks, where the repository is configured to notify Buildbot whenever an update occurs.hOjzubeubhz)r}r(hNXThis concept does not map perfectly to every version control system. For example, for CVS Buildbot must guess that version updates made to multiple files within a short time represent a single change; for DVCS's like Git, Buildbot records a change when a commit is pushed to the monitored repository, not when it is initially committed. We assume that the :class:`Change`\s arrive at the master in the same order in which they are committed to the repository.hOjahZh]h_h~ha}r(hc]hd]he]hf]hi]uhkK0hlhhm]r(hvXdThis concept does not map perfectly to every version control system. For example, for CVS Buildbot must guess that version updates made to multiple files within a short time represent a single change; for DVCS's like Git, Buildbot records a change when a commit is pushed to the monitored repository, not when it is initially committed. We assume that the rr}r(hNXdThis concept does not map perfectly to every version control system. For example, for CVS Buildbot must guess that version updates made to multiple files within a short time represent a single change; for DVCS's like Git, Buildbot records a change when a commit is pushed to the monitored repository, not when it is initially committed. We assume that the hOjubcsphinx.addnodes pending_xref r)r}r(hNX:class:`Change`rhOjhZh]h_U pending_xrefrha}r(UreftypeXclassUrefwarnrU reftargetrXChangeU refdomainXpyrhf]he]U refexplicithc]hd]hi]UrefdocrXmanual/conceptsrUpy:classrNU py:modulerNuhkK0hm]rh)r}r(hNjha}r(hc]hd]r(UxrefrjXpy-classrehe]hf]hi]uhOjhm]rhvXChangerr}r(hNUhOjubah_hubaubhvXWs arrive at the master in the same order in which they are committed to the repository.rr}r(hNXX\s arrive at the master in the same order in which they are committed to the repository.hOjubeubhz)r}r(hNX*When it comes time to actually perform a build, a scheduler prepares a source stamp set, as described above, based on its configuration. When the build begins, one or more source steps use the information in the source stamp set to actually check out the source code, using the normal VCS commands.rhOjahZh]h_h~ha}r(hc]hd]he]hf]hi]uhkK4hlhhm]rhvX*When it comes time to actually perform a build, a scheduler prepares a source stamp set, as described above, based on its configuration. When the build begins, one or more source steps use the information in the source stamp set to actually check out the source code, using the normal VCS commands.rr}r(hNjhOjubaubhP)r}r(hNUhOjahZh]h_h`ha}r(hc]hd]he]hf]rUtree-stabilityrahi]rh+auhkK8hlhhm]r(ho)r}r(hNXTree StabilityrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkK8hlhhm]rhvXTree Stabilityrr}r(hNjhOjubaubhz)r}r(hNX Changes tend to arrive at a buildmaster in bursts. In many cases, these bursts of changes are meant to be taken together. For example, a developer may have pushed multiple commits to a DVCS that comprise the same new feature or bugfix. To avoid trying to build every change, Buildbot supports the notion of *tree stability*, by waiting for a burst of changes to finish before starting to schedule builds. This is implemented as a timer, with builds not scheduled until no changes have occurred for the duration of the timer.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkK:hlhhm]r(hvX3Changes tend to arrive at a buildmaster in bursts. In many cases, these bursts of changes are meant to be taken together. For example, a developer may have pushed multiple commits to a DVCS that comprise the same new feature or bugfix. To avoid trying to build every change, Buildbot supports the notion of rr}r(hNX3Changes tend to arrive at a buildmaster in bursts. In many cases, these bursts of changes are meant to be taken together. For example, a developer may have pushed multiple commits to a DVCS that comprise the same new feature or bugfix. To avoid trying to build every change, Buildbot supports the notion of hOjubh)r}r(hNX*tree stability*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXtree stabilityrr}r(hNUhOjubah_hubhvX, by waiting for a burst of changes to finish before starting to schedule builds. This is implemented as a timer, with builds not scheduled until no changes have occurred for the duration of the timer.rr}r(hNX, by waiting for a burst of changes to finish before starting to schedule builds. This is implemented as a timer, with builds not scheduled until no changes have occurred for the duration of the timer.hOjubeubh)r}r(hNX-.. _How-Different-VC-Systems-Specify-Sources:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hU(how-different-vc-systems-specify-sourcesruhkK@hlhhm]ubeubhP)r}r(hNUhOjahZh]h}rhjsh_h`ha}r(hc]hd]he]hf]r(jUid3rehi]r(h8heuhkKChlhh}rjjshm]r(ho)r}r(hNX(How Different VC Systems Specify SourcesrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkKChlhhm]rhvX(How Different VC Systems Specify Sourcesrr}r(hNjhOjubaubhz)r}r(hNX,For CVS, the static specifications are *repository* and *module*. In addition to those, each build uses a timestamp (or omits the timestamp to mean *the latest*) and *branch tag* (which defaults to ``HEAD``). These parameters collectively specify a set of sources from which a build may be performed.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKEhlhhm]r(hvX'For CVS, the static specifications are rr}r(hNX'For CVS, the static specifications are hOjubh)r}r(hNX *repository*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX repositoryrr}r(hNUhOjubah_hubhvX and rr}r(hNX and hOjubh)r}r(hNX*module*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXmodulerr}r(hNUhOjubah_hubhvXT. In addition to those, each build uses a timestamp (or omits the timestamp to mean rr}r(hNXT. In addition to those, each build uses a timestamp (or omits the timestamp to mean hOjubh)r}r(hNX *the latest*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX the latestr r }r (hNUhOjubah_hubhvX) and r r }r(hNX) and hOjubh)r}r(hNX *branch tag*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX branch tagrr}r(hNUhOjubah_hubhvX (which defaults to rr}r(hNX (which defaults to hOjubh)r}r(hNX``HEAD``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXHEADrr}r(hNUhOjubah_hubhvX^). These parameters collectively specify a set of sources from which a build may be performed.r r!}r"(hNX^). These parameters collectively specify a set of sources from which a build may be performed.hOjubeubhz)r#}r$(hNX`Subversion `_, combines the repository, module, and branch into a single *Subversion URL* parameter. Within that scope, source checkouts can be specified by a numeric *revision number* (a repository-wide monotonically-increasing marker, such that each transaction that changes the repository is indexed by a different revision number), or a revision timestamp. When branches are used, the repository and module form a static ``baseURL``, while each build has a *revision number* and a *branch* (which defaults to a statically-specified ``defaultBranch``). The ``baseURL`` and ``branch`` are simply concatenated together to derive the ``svnurl`` to use for the checkout.hOjhZh]h_h~ha}r%(hc]hd]he]hf]hi]uhkKKhlhhm]r&(cdocutils.nodes reference r')r(}r)(hNX,`Subversion `_ha}r*(UnameX SubversionUrefurir+Xhttp://subversion.tigris.orgr,hf]he]hc]hd]hi]uhOj#hm]r-hvX Subversionr.r/}r0(hNUhOj(ubah_U referencer1ubh)r2}r3(hNX hSKhOj#h_hha}r4(Urefurij,hf]r5U subversionr6ahe]hc]hd]hi]r7hauhm]ubhvX=, combines the repository, module, and branch into a single r8r9}r:(hNX=, combines the repository, module, and branch into a single hOj#ubh)r;}r<(hNX*Subversion URL*ha}r=(hc]hd]he]hf]hi]uhOj#hm]r>hvXSubversion URLr?r@}rA(hNUhOj;ubah_hubhvXN parameter. Within that scope, source checkouts can be specified by a numeric rBrC}rD(hNXN parameter. Within that scope, source checkouts can be specified by a numeric hOj#ubh)rE}rF(hNX*revision number*ha}rG(hc]hd]he]hf]hi]uhOj#hm]rHhvXrevision numberrIrJ}rK(hNUhOjEubah_hubhvX (a repository-wide monotonically-increasing marker, such that each transaction that changes the repository is indexed by a different revision number), or a revision timestamp. When branches are used, the repository and module form a static rLrM}rN(hNX (a repository-wide monotonically-increasing marker, such that each transaction that changes the repository is indexed by a different revision number), or a revision timestamp. When branches are used, the repository and module form a static hOj#ubh)rO}rP(hNX ``baseURL``ha}rQ(hc]hd]he]hf]hi]uhOj#hm]rRhvXbaseURLrSrT}rU(hNUhOjOubah_hubhvX, while each build has a rVrW}rX(hNX, while each build has a hOj#ubh)rY}rZ(hNX*revision number*ha}r[(hc]hd]he]hf]hi]uhOj#hm]r\hvXrevision numberr]r^}r_(hNUhOjYubah_hubhvX and a r`ra}rb(hNX and a hOj#ubh)rc}rd(hNX*branch*ha}re(hc]hd]he]hf]hi]uhOj#hm]rfhvXbranchrgrh}ri(hNUhOjcubah_hubhvX+ (which defaults to a statically-specified rjrk}rl(hNX+ (which defaults to a statically-specified hOj#ubh)rm}rn(hNX``defaultBranch``ha}ro(hc]hd]he]hf]hi]uhOj#hm]rphvX defaultBranchrqrr}rs(hNUhOjmubah_hubhvX). The rtru}rv(hNX). The hOj#ubh)rw}rx(hNX ``baseURL``ha}ry(hc]hd]he]hf]hi]uhOj#hm]rzhvXbaseURLr{r|}r}(hNUhOjwubah_hubhvX and r~r}r(hNX and hOj#ubh)r}r(hNX ``branch``ha}r(hc]hd]he]hf]hi]uhOj#hm]rhvXbranchrr}r(hNUhOjubah_hubhvX0 are simply concatenated together to derive the rr}r(hNX0 are simply concatenated together to derive the hOj#ubh)r}r(hNX ``svnurl``ha}r(hc]hd]he]hf]hi]uhOj#hm]rhvXsvnurlrr}r(hNUhOjubah_hubhvX to use for the checkout.rr}r(hNX to use for the checkout.hOj#ubeubhz)r}r(hNX2`Perforce `_ is similar. The server is specified through a ``P4PORT`` parameter. Module and branch are specified in a single depot path, and revisions are depot-wide. When branches are used, the ``p4base`` and ``defaultBranch`` are concatenated together to produce the depot path.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKXhlhhm]r(j')r}r(hNX&`Perforce `_ha}r(UnameXPerforcej+Xhttp://www.perforce.com/rhf]he]hc]hd]hi]uhOjhm]rhvXPerforcerr}r(hNUhOjubah_j1ubh)r}r(hNX hSKhOjh_hha}r(Urefurijhf]rUperforcerahe]hc]hd]hi]rh*auhm]ubhvX/ is similar. The server is specified through a rr}r(hNX/ is similar. The server is specified through a hOjubh)r}r(hNX ``P4PORT``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXP4PORTrr}r(hNUhOjubah_hubhvX~ parameter. Module and branch are specified in a single depot path, and revisions are depot-wide. When branches are used, the rr}r(hNX~ parameter. Module and branch are specified in a single depot path, and revisions are depot-wide. When branches are used, the hOjubh)r}r(hNX ``p4base``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXp4baserr}r(hNUhOjubah_hubhvX and rr}r(hNX and hOjubh)r}r(hNX``defaultBranch``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX defaultBranchrr}r(hNUhOjubah_hubhvX5 are concatenated together to produce the depot path.rr}r(hNX5 are concatenated together to produce the depot path.hOjubeubhz)r}r(hNX`Bzr `_ (which is a descendant of Arch/Bazaar, and is frequently referred to as "Bazaar") has the same sort of repository-vs-workspace model as Arch, but the repository data can either be stored inside the working directory or kept elsewhere (either on the same machine or on an entirely different machine). For the purposes of Buildbot (which never commits changes), the repository is specified with a URL and a revision number.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkK`hlhhm]r(j')r}r(hNX`Bzr `_ha}r(UnameXBzrj+Xhttp://bazaar-vcs.orgrhf]he]hc]hd]hi]uhOjhm]rhvXBzrrr}r(hNUhOjubah_j1ubh)r}r(hNX hSKhOjh_hha}r(Urefurijhf]rUbzrrahe]hc]hd]hi]rh;auhm]ubhvX (which is a descendant of Arch/Bazaar, and is frequently referred to as "Bazaar") has the same sort of repository-vs-workspace model as Arch, but the repository data can either be stored inside the working directory or kept elsewhere (either on the same machine or on an entirely different machine). For the purposes of Buildbot (which never commits changes), the repository is specified with a URL and a revision number.rr}r(hNX (which is a descendant of Arch/Bazaar, and is frequently referred to as "Bazaar") has the same sort of repository-vs-workspace model as Arch, but the repository data can either be stored inside the working directory or kept elsewhere (either on the same machine or on an entirely different machine). For the purposes of Buildbot (which never commits changes), the repository is specified with a URL and a revision number.hOjubeubhz)r}r(hNXThe most common way to obtain read-only access to a bzr tree is via HTTP, simply by making the repository visible through a web server like Apache. Bzr can also use FTP and SFTP servers, if the buildslave process has sufficient privileges to access them. Higher performance can be obtained by running a special Bazaar-specific server. None of these matter to the buildbot: the repository URL just has to match the kind of server being used. The ``repoURL`` argument provides the location of the repository.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhhlhhm]r(hvXThe most common way to obtain read-only access to a bzr tree is via HTTP, simply by making the repository visible through a web server like Apache. Bzr can also use FTP and SFTP servers, if the buildslave process has sufficient privileges to access them. Higher performance can be obtained by running a special Bazaar-specific server. None of these matter to the buildbot: the repository URL just has to match the kind of server being used. The rr}r(hNXThe most common way to obtain read-only access to a bzr tree is via HTTP, simply by making the repository visible through a web server like Apache. Bzr can also use FTP and SFTP servers, if the buildslave process has sufficient privileges to access them. Higher performance can be obtained by running a special Bazaar-specific server. None of these matter to the buildbot: the repository URL just has to match the kind of server being used. The hOjubh)r}r(hNX ``repoURL``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXrepoURLrr}r(hNUhOjubah_hubhvX2 argument provides the location of the repository.rr}r(hNX2 argument provides the location of the repository.hOjubeubhz)r}r(hNXBranches are expressed as subdirectories of the main central repository, which means that if branches are being used, the BZR step is given a ``baseURL`` and ``defaultBranch`` instead of getting the ``repoURL`` argument.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKqhlhhm]r(hvXBranches are expressed as subdirectories of the main central repository, which means that if branches are being used, the BZR step is given a rr}r(hNXBranches are expressed as subdirectories of the main central repository, which means that if branches are being used, the BZR step is given a hOjubh)r}r(hNX ``baseURL``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXbaseURLrr}r(hNUhOjubah_hubhvX and rr}r(hNX and hOjubh)r}r(hNX``defaultBranch``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX defaultBranchrr}r(hNUhOjubah_hubhvX instead of getting the rr}r(hNX instead of getting the hOjubh)r }r (hNX ``repoURL``ha}r (hc]hd]he]hf]hi]uhOjhm]r hvXrepoURLr r}r(hNUhOj ubah_hubhvX argument.rr}r(hNX argument.hOjubeubhz)r}r(hNXB`Darcs `_ doesn't really have the notion of a single master repository. Nor does it really have branches. In Darcs, each working directory is also a repository, and there are operations to push and pull patches from one of these ``repositories`` to another. For the Buildbot's purposes, all you need to do is specify the URL of a repository that you want to build from. The build slave will then pull the latest patches from that repository and build them. Multiple branches are implemented by using multiple repositories (possibly living on the same server).hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKwhlhhm]r(j')r}r(hNX`Darcs `_ha}r(UnameXDarcsj+Xhttp://darcs.net/rhf]he]hc]hd]hi]uhOjhm]rhvXDarcsrr}r(hNUhOjubah_j1ubh)r}r (hNX hSKhOjh_hha}r!(Urefurijhf]r"Udarcsr#ahe]hc]hd]hi]r$h9auhm]ubhvX doesn't really have the notion of a single master repository. Nor does it really have branches. In Darcs, each working directory is also a repository, and there are operations to push and pull patches from one of these r%r&}r'(hNX doesn't really have the notion of a single master repository. Nor does it really have branches. In Darcs, each working directory is also a repository, and there are operations to push and pull patches from one of these hOjubh)r(}r)(hNX``repositories``ha}r*(hc]hd]he]hf]hi]uhOjhm]r+hvX repositoriesr,r-}r.(hNUhOj(ubah_hubhvX: to another. For the Buildbot's purposes, all you need to do is specify the URL of a repository that you want to build from. The build slave will then pull the latest patches from that repository and build them. Multiple branches are implemented by using multiple repositories (possibly living on the same server).r/r0}r1(hNX: to another. For the Buildbot's purposes, all you need to do is specify the URL of a repository that you want to build from. The build slave will then pull the latest patches from that repository and build them. Multiple branches are implemented by using multiple repositories (possibly living on the same server).hOjubeubhz)r2}r3(hNXBuilders which use Darcs therefore have a static ``repourl`` which specifies the location of the repository. If branches are being used, the source Step is instead configured with a ``baseURL`` and a ``defaultBranch``, and the two strings are simply concatenated together to obtain the repository's URL. Each build then has a specific branch which replaces ``defaultBranch``, or just uses the default one. Instead of a revision number, each build can have a ``context``, which is a string that records all the patches that are present in a given tree (this is the output of ``darcs changes --context``, and is considerably less concise than, e.g. Subversion's revision number, but the patch-reordering flexibility of Darcs makes it impossible to provide a shorter useful specification).hOjhZh]h_h~ha}r4(hc]hd]he]hf]hi]uhkKhlhhm]r5(hvX1Builders which use Darcs therefore have a static r6r7}r8(hNX1Builders which use Darcs therefore have a static hOj2ubh)r9}r:(hNX ``repourl``ha}r;(hc]hd]he]hf]hi]uhOj2hm]r<hvXrepourlr=r>}r?(hNUhOj9ubah_hubhvXz which specifies the location of the repository. If branches are being used, the source Step is instead configured with a r@rA}rB(hNXz which specifies the location of the repository. If branches are being used, the source Step is instead configured with a hOj2ubh)rC}rD(hNX ``baseURL``ha}rE(hc]hd]he]hf]hi]uhOj2hm]rFhvXbaseURLrGrH}rI(hNUhOjCubah_hubhvX and a rJrK}rL(hNX and a hOj2ubh)rM}rN(hNX``defaultBranch``ha}rO(hc]hd]he]hf]hi]uhOj2hm]rPhvX defaultBranchrQrR}rS(hNUhOjMubah_hubhvX, and the two strings are simply concatenated together to obtain the repository's URL. Each build then has a specific branch which replaces rTrU}rV(hNX, and the two strings are simply concatenated together to obtain the repository's URL. Each build then has a specific branch which replaces hOj2ubh)rW}rX(hNX``defaultBranch``ha}rY(hc]hd]he]hf]hi]uhOj2hm]rZhvX defaultBranchr[r\}r](hNUhOjWubah_hubhvXT, or just uses the default one. Instead of a revision number, each build can have a r^r_}r`(hNXT, or just uses the default one. Instead of a revision number, each build can have a hOj2ubh)ra}rb(hNX ``context``ha}rc(hc]hd]he]hf]hi]uhOj2hm]rdhvXcontextrerf}rg(hNUhOjaubah_hubhvXi, which is a string that records all the patches that are present in a given tree (this is the output of rhri}rj(hNXi, which is a string that records all the patches that are present in a given tree (this is the output of hOj2ubh)rk}rl(hNX``darcs changes --context``ha}rm(hc]hd]he]hf]hi]uhOj2hm]rnhvXdarcs changes --contextrorp}rq(hNUhOjkubah_hubhvX, and is considerably less concise than, e.g. Subversion's revision number, but the patch-reordering flexibility of Darcs makes it impossible to provide a shorter useful specification).rrrs}rt(hNX, and is considerably less concise than, e.g. Subversion's revision number, but the patch-reordering flexibility of Darcs makes it impossible to provide a shorter useful specification).hOj2ubeubhz)ru}rv(hNX)`Mercurial `_ is like Darcs, in that each branch is stored in a separate repository. The ``repourl``, ``baseURL``, and ``defaultBranch`` arguments are all handled the same way as with Darcs. The *revision*, however, is the hash identifier returned by ``hg identify``.hOjhZh]h_h~ha}rw(hc]hd]he]hf]hi]uhkKhlhhm]rx(j')ry}rz(hNX+`Mercurial `_ha}r{(UnameX Mercurialj+Xhttp://selenic.com/mercurialr|hf]he]hc]hd]hi]uhOjuhm]r}hvX Mercurialr~r}r(hNUhOjyubah_j1ubh)r}r(hNX hSKhOjuh_hha}r(Urefurij|hf]rU mercurialrahe]hc]hd]hi]rh=auhm]ubhvXL is like Darcs, in that each branch is stored in a separate repository. The rr}r(hNXL is like Darcs, in that each branch is stored in a separate repository. The hOjuubh)r}r(hNX ``repourl``ha}r(hc]hd]he]hf]hi]uhOjuhm]rhvXrepourlrr}r(hNUhOjubah_hubhvX, rr}r(hNX, hOjuubh)r}r(hNX ``baseURL``ha}r(hc]hd]he]hf]hi]uhOjuhm]rhvXbaseURLrr}r(hNUhOjubah_hubhvX, and rr}r(hNX, and hOjuubh)r}r(hNX``defaultBranch``ha}r(hc]hd]he]hf]hi]uhOjuhm]rhvX defaultBranchrr}r(hNUhOjubah_hubhvX; arguments are all handled the same way as with Darcs. The rr}r(hNX; arguments are all handled the same way as with Darcs. The hOjuubh)r}r(hNX *revision*ha}r(hc]hd]he]hf]hi]uhOjuhm]rhvXrevisionrr}r(hNUhOjubah_hubhvX., however, is the hash identifier returned by rr}r(hNX., however, is the hash identifier returned by hOjuubh)r}r(hNX``hg identify``ha}r(hc]hd]he]hf]hi]uhOjuhm]rhvX hg identifyrr}r(hNUhOjubah_hubhvX.r}r(hNX.hOjuubeubhz)r}r(hNX'`Git `_ also follows a decentralized model, and each repository can have several branches and tags. The source Step is configured with a static ``repourl`` which specifies the location of the repository. In addition, an optional ``branch`` parameter can be specified to check out code from a specific branch instead of the default *master* branch. The *revision* is specified as a SHA1 hash as returned by e.g. ``git rev-parse``. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(j')r}r(hNX`Git `_ha}r(UnameXGitj+Xhttp://git.or.cz/rhf]he]hc]hd]hi]uhOjhm]rhvXGitrr}r(hNUhOjubah_j1ubh)r}r(hNX hSKhOjh_hha}r(Urefurijhf]rUgitrahe]hc]hd]hi]rhauhm]ubhvX also follows a decentralized model, and each repository can have several branches and tags. The source Step is configured with a static rr}r(hNX also follows a decentralized model, and each repository can have several branches and tags. The source Step is configured with a static hOjubh)r}r(hNX ``repourl``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXrepourlrr}r(hNUhOjubah_hubhvXJ which specifies the location of the repository. In addition, an optional rr}r(hNXJ which specifies the location of the repository. In addition, an optional hOjubh)r}r(hNX ``branch``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXbranchrr}r(hNUhOjubah_hubhvX\ parameter can be specified to check out code from a specific branch instead of the default rr}r(hNX\ parameter can be specified to check out code from a specific branch instead of the default hOjubh)r}r(hNX*master*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXmasterrr}r(hNUhOjubah_hubhvX branch. The rr}r(hNX branch. The hOjubh)r}r(hNX *revision*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXrevisionrr}r(hNUhOjubah_hubhvX1 is specified as a SHA1 hash as returned by e.g. rr}r(hNX1 is specified as a SHA1 hash as returned by e.g. hOjubh)r}r(hNX``git rev-parse``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX git rev-parserr}r(hNUhOjubah_hubhvXh. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.rr}r(hNXh. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.hOjubeubhz)r}r(hNX`Monotone `_ is another that follows a decentralized model where each repository can have several branches and tags. The source Step is configured with static ``repourl`` and ``branch`` parameters, which specifies the location of the repository and the branch to use. The *revision* is specified as a SHA1 hash as returned by e.g. ``mtn automate select w:``. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(j')r}r(hNX%`Monotone `_ha}r(UnameXMonotonej+Xhttp://www.monotone.ca/r hf]he]hc]hd]hi]uhOjhm]r hvXMonotoner r }r (hNUhOjubah_j1ubh)r}r(hNX hSKhOjh_hha}r(Urefurij hf]rUmonotonerahe]hc]hd]hi]rh%auhm]ubhvX is another that follows a decentralized model where each repository can have several branches and tags. The source Step is configured with static rr}r(hNX is another that follows a decentralized model where each repository can have several branches and tags. The source Step is configured with static hOjubh)r}r(hNX ``repourl``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXrepourlrr}r(hNUhOjubah_hubhvX and rr}r (hNX and hOjubh)r!}r"(hNX ``branch``ha}r#(hc]hd]he]hf]hi]uhOjhm]r$hvXbranchr%r&}r'(hNUhOj!ubah_hubhvXX parameters, which specifies the location of the repository and the branch to use. The r(r)}r*(hNXX parameters, which specifies the location of the repository and the branch to use. The hOjubh)r+}r,(hNX *revision*ha}r-(hc]hd]he]hf]hi]uhOjhm]r.hvXrevisionr/r0}r1(hNUhOj+ubah_hubhvX1 is specified as a SHA1 hash as returned by e.g. r2r3}r4(hNX1 is specified as a SHA1 hash as returned by e.g. hOjubh)r5}r6(hNX``mtn automate select w:``ha}r7(hc]hd]he]hf]hi]uhOjhm]r8hvXmtn automate select w:r9r:}r;(hNUhOj5ubah_hubhvXh. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.r<r=}r>(hNXh. No attempt is made to ensure that the specified revision is actually a subset of the specified branch.hOjubeubh)r?}r@(hNX index: changehOjhZh]h_hha}rA(hhhf]he]hc]hd]hi]uhkKhlhhm]rBhvX index: changerCrD}rE(hNUhOj?ubaubh)rF}rG(hNX.. _Attributes-of-Changes:hOjhZh]h_hha}rH(hf]he]hc]hd]hi]hUattributes-of-changesrIuhkKhlhhm]ubeubeubhP)rJ}rK(hNUhSKhOhXhZh]h}rLhjFsh_h`ha}rM(hc]rNXchangesrOahd]he]hf]rP(UchangesrQjIehi]rRhauhkKhlhh}rSjIjFshm]rT(ho)rU}rV(hNXChangesrWhOjJhZh]h_hsha}rX(hc]hd]he]hf]hi]uhkKhlhhm]rYhvXChangesrZr[}r\(hNjWhOjUubaubh)r]}r^(hNX .. _Attr-Who:hOjJhZh]h_hha}r_(hf]he]hc]hd]hi]hUattr-whor`uhkKhlhhm]ubhP)ra}rb(hNUhOjJhZh]h}rch5j]sh_h`ha}rd(hc]hd]he]hf]re(Uwhorfj`ehi]rg(h'h5euhkKhlhh}rhj`j]shm]ri(ho)rj}rk(hNXWhorlhOjahZh]h_hsha}rm(hc]hd]he]hf]hi]uhkKhlhhm]rnhvXWhororp}rq(hNjlhOjjubaubhz)rr}rs(hNXEach :class:`Change` has a :attr:`who` attribute, which specifies which developer is responsible for the change. This is a string which comes from a namespace controlled by the VC repository. Frequently this means it is a username on the host which runs the repository, but not all VC systems require this. Each :class:`StatusNotifier` will map the :attr:`who` attribute into something appropriate for their particular means of communication: an email address, an IRC handle, etc.hOjahZh]h_h~ha}rt(hc]hd]he]hf]hi]uhkKhlhhm]ru(hvXEach rvrw}rx(hNXEach hOjrubj)ry}rz(hNX:class:`Change`r{hOjrhZh]h_jha}r|(UreftypeXclassjjXChangeU refdomainXpyr}hf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]r~h)r}r(hNj{ha}r(hc]hd]r(jj}Xpy-classrehe]hf]hi]uhOjyhm]rhvXChangerr}r(hNUhOjubah_hubaubhvX has a rr}r(hNX has a hOjrubj)r}r(hNX :attr:`who`rhOjrhZh]h_jha}r(UreftypeXattrjjXwhoU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubaubhvX attribute, which specifies which developer is responsible for the change. This is a string which comes from a namespace controlled by the VC repository. Frequently this means it is a username on the host which runs the repository, but not all VC systems require this. Each rr}r(hNX attribute, which specifies which developer is responsible for the change. This is a string which comes from a namespace controlled by the VC repository. Frequently this means it is a username on the host which runs the repository, but not all VC systems require this. Each hOjrubj)r}r(hNX:class:`StatusNotifier`rhOjrhZh]h_jha}r(UreftypeXclassjjXStatusNotifierU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXStatusNotifierrr}r(hNUhOjubah_hubaubhvX will map the rr}r(hNX will map the hOjrubj)r}r(hNX :attr:`who`rhOjrhZh]h_jha}r(UreftypeXattrjjXwhoU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubaubhvXx attribute into something appropriate for their particular means of communication: an email address, an IRC handle, etc.rr}r(hNXx attribute into something appropriate for their particular means of communication: an email address, an IRC handle, etc.hOjrubeubhz)r}r(hNX This ``who`` attribute is also parsed and stored into Buildbot's database (see :ref:`User-Objects`). Currently, only ``who`` attributes in Changes from ``git`` repositories are translated into user objects, but in the future all incoming Changes will have their ``who`` parsed and stored.hOjahZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(hvXThis rr}r(hNXThis hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvXC attribute is also parsed and stored into Buildbot's database (see rr}r(hNXC attribute is also parsed and stored into Buildbot's database (see hOjubj)r}r(hNX:ref:`User-Objects`rhOjhZh]h_jha}r(UreftypeXrefjjX user-objectsU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkKhm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX User-Objectsrr}r(hNUhOjubah_hubaubhvX). Currently, only rr}r(hNX). Currently, only hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX attributes in Changes from rr}r(hNX attributes in Changes from hOjubh)r}r(hNX``git``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXgitrr}r(hNUhOjubah_hubhvXg repositories are translated into user objects, but in the future all incoming Changes will have their rr}r(hNXg repositories are translated into user objects, but in the future all incoming Changes will have their hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX parsed and stored.rr}r(hNX parsed and stored.hOjubeubh)r}r(hNX.. _Attr-Files:hOjahZh]h_hha}r(hf]he]hc]hd]hi]hU attr-filesruhkKhlhhm]ubeubhP)r}r(hNUhOjJhZh]h}rhjsh_h`ha}r (hc]hd]he]hf]r (Ufilesr jehi]r (h heuhkKhlhh}r jjshm]r(ho)r}r(hNXFilesrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkKhlhhm]rhvXFilesrr}r(hNjhOjubaubhz)r}r(hNXIt also has a list of :attr:`files`, which are just the tree-relative filenames of any files that were added, deleted, or modified for this :class:`Change`. These filenames are used by the :func:`fileIsImportant` function (in the :class:`Scheduler`) to decide whether it is worth triggering a new build or not, e.g. the function could use the following function to only run a build if a C file were checked in::hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(hvXIt also has a list of rr}r(hNXIt also has a list of hOjubj)r}r(hNX :attr:`files`r hOjhZh]h_jha}r!(UreftypeXattrjjXfilesU refdomainXpyr"hf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]r#h)r$}r%(hNj ha}r&(hc]hd]r'(jj"Xpy-attrr(ehe]hf]hi]uhOjhm]r)hvXfilesr*r+}r,(hNUhOj$ubah_hubaubhvXi, which are just the tree-relative filenames of any files that were added, deleted, or modified for this r-r.}r/(hNXi, which are just the tree-relative filenames of any files that were added, deleted, or modified for this hOjubj)r0}r1(hNX:class:`Change`r2hOjhZh]h_jha}r3(UreftypeXclassjjXChangeU refdomainXpyr4hf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]r5h)r6}r7(hNj2ha}r8(hc]hd]r9(jj4Xpy-classr:ehe]hf]hi]uhOj0hm]r;hvXChanger<r=}r>(hNUhOj6ubah_hubaubhvX". These filenames are used by the r?r@}rA(hNX". These filenames are used by the hOjubj)rB}rC(hNX:func:`fileIsImportant`rDhOjhZh]h_jha}rE(UreftypeXfuncjjXfileIsImportantU refdomainXpyrFhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rGh)rH}rI(hNjDha}rJ(hc]hd]rK(jjFXpy-funcrLehe]hf]hi]uhOjBhm]rMhvXfileIsImportantrNrO}rP(hNUhOjHubah_hubaubhvX function (in the rQrR}rS(hNX function (in the hOjubj)rT}rU(hNX:class:`Scheduler`rVhOjhZh]h_jha}rW(UreftypeXclassjjX SchedulerU refdomainXpyrXhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rYh)rZ}r[(hNjVha}r\(hc]hd]r](jjXXpy-classr^ehe]hf]hi]uhOjThm]r_hvX Schedulerr`ra}rb(hNUhOjZubah_hubaubhvX) to decide whether it is worth triggering a new build or not, e.g. the function could use the following function to only run a build if a C file were checked in:rcrd}re(hNX) to decide whether it is worth triggering a new build or not, e.g. the function could use the following function to only run a build if a C file were checked in:hOjubeubcdocutils.nodes literal_block rf)rg}rh(hNXdef has_C_files(change): for name in change.files: if name.endswith(".c"): return True return FalsehOjhZh]h_U literal_blockriha}rj(hhhf]he]hc]hd]hi]uhkKhlhhm]rkhvXdef has_C_files(change): for name in change.files: if name.endswith(".c"): return True return Falserlrm}rn(hNUhOjgubaubhz)ro}rp(hNXCertain :class:`BuildStep`\s can also use the list of changed files to run a more targeted series of tests, e.g. the ``python_twisted.Trial`` step can run just the unit tests that provide coverage for the modified .py files instead of running the full test suite.hOjhZh]h_h~ha}rq(hc]hd]he]hf]hi]uhkKhlhhm]rr(hvXCertain rsrt}ru(hNXCertain hOjoubj)rv}rw(hNX:class:`BuildStep`rxhOjohZh]h_jha}ry(UreftypeXclassjjX BuildStepU refdomainXpyrzhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]r{h)r|}r}(hNjxha}r~(hc]hd]r(jjzXpy-classrehe]hf]hi]uhOjvhm]rhvX BuildSteprr}r(hNUhOj|ubah_hubaubhvXZs can also use the list of changed files to run a more targeted series of tests, e.g. the rr}r(hNX[\s can also use the list of changed files to run a more targeted series of tests, e.g. the hOjoubh)r}r(hNX``python_twisted.Trial``ha}r(hc]hd]he]hf]hi]uhOjohm]rhvXpython_twisted.Trialrr}r(hNUhOjubah_hubhvXz step can run just the unit tests that provide coverage for the modified .py files instead of running the full test suite.rr}r(hNXz step can run just the unit tests that provide coverage for the modified .py files instead of running the full test suite.hOjoubeubh)r}r(hNX.. _Attr-Comments:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hU attr-commentsruhkKhlhhm]ubeubhP)r}r(hNUhOjJhZh]h}rhEjsh_h`ha}r(hc]hd]he]hf]r(Ucommentsrjehi]r(hhEeuhkKhlhh}rjjshm]r(ho)r}r(hNXCommentsrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkKhlhhm]rhvXCommentsrr}r(hNjhOjubaubhz)r}r(hNXdThe Change also has a :attr:`comments` attribute, which is a string containing any checkin comments.rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(hvXThe Change also has a rr}r(hNXThe Change also has a hOjubj)r}r(hNX:attr:`comments`rhOjhZh]h_jha}r(UreftypeXattrjjXcommentsU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXcommentsrr}r(hNUhOjubah_hubaubhvX> attribute, which is a string containing any checkin comments.rr}r(hNX> attribute, which is a string containing any checkin comments.hOjubeubh)r}r(hNX.. _Attr-Project:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hU attr-projectruhkKhlhhm]ubeubhP)r}r(hNUhOjJhZh]h}rhjsh_h`ha}r(hc]hd]he]hf]r(Uprojectrjehi]r(h!heuhkKhlhh}rjjshm]r(ho)r}r(hNXProjectrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkKhlhhm]rhvXProjectrr}r(hNjhOjubaubhz)r}r(hNXsThe :attr:`project` attribute of a change or source stamp describes the project to which it corresponds, as a short human-readable string. This is useful in cases where multiple independent projects are built on the same buildmaster. In such cases, it can be used to control which builds are scheduled for a given commit, and to limit status displays to only one project.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]r(hvXThe rr}r(hNXThe hOjubj)r}r(hNX:attr:`project`rhOjhZh]h_jha}r(UreftypeXattrjjXprojectU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkKhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXprojectrr}r(hNUhOjubah_hubaubhvX` attribute of a change or source stamp describes the project to which it corresponds, as a short human-readable string. This is useful in cases where multiple independent projects are built on the same buildmaster. In such cases, it can be used to control which builds are scheduled for a given commit, and to limit status displays to only one project.rr}r(hNX` attribute of a change or source stamp describes the project to which it corresponds, as a short human-readable string. This is useful in cases where multiple independent projects are built on the same buildmaster. In such cases, it can be used to control which builds are scheduled for a given commit, and to limit status displays to only one project.hOjubeubh)r}r(hNX.. _Attr-Repository:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hUattr-repositoryruhkKhlhhm]ubeubhP)r}r(hNUhOjJhZh]h}rh-jsh_h`ha}r(hc]hd]he]hf]r(U repositoryrjehi]r(h$h-euhkKhlhh}rjjshm]r(ho)r}r(hNX RepositoryrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkKhlhhm]rhvX Repositoryrr}r(hNjhOjubaubhz)r}r(hNXThis attribute specifies the repository in which this change occurred. In the case of DVCS's, this information may be required to check out the committed source code. However, using the repository from a change has security risks: if Buildbot is configured to blindly trust this information, then it may easily be tricked into building arbitrary source code, potentially compromising the buildslaves and the integrity of subsequent builds.rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkKhlhhm]rhvXThis attribute specifies the repository in which this change occurred. In the case of DVCS's, this information may be required to check out the committed source code. However, using the repository from a change has security risks: if Buildbot is configured to blindly trust this information, then it may easily be tricked into building arbitrary source code, potentially compromising the buildslaves and the integrity of subsequent builds.r r }r (hNjhOjubaubh)r }r (hNX.. _Attr-Codebase:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hU attr-codebaseruhkKhlhhm]ubeubhP)r}r(hNUhOjJhZh]h}rh"j sh_h`ha}r(hc]hd]he]hf]r(Ucodebaserjehi]r(h,h"euhkKhlhh}rjj shm]r(ho)r}r(hNXCodebaserhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkKhlhhm]rhvXCodebaserr}r (hNjhOjubaubhz)r!}r"(hNXdThis attribute specifies the codebase to which this change was made. As described :ref:`above `, multiple repositories may contain the same codebase. A change's codebase is usually determined by the :bb:cfg:`codebaseGenerator` configuration. By default the codebase is ''; this value is used automatically for single-codebase configurations.hOjhZh]h_h~ha}r#(hc]hd]he]hf]hi]uhkKhlhhm]r$(hvXRThis attribute specifies the codebase to which this change was made. As described r%r&}r'(hNXRThis attribute specifies the codebase to which this change was made. As described hOj!ubj)r(}r)(hNX:ref:`above `r*hOj!hZh]h_jha}r+(UreftypeXrefjjX source-stampsU refdomainXstdr,hf]he]U refexplicithc]hd]hi]jjuhkKhm]r-h)r.}r/(hNj*ha}r0(hc]hd]r1(jj,Xstd-refr2ehe]hf]hi]uhOj(hm]r3hvXabover4r5}r6(hNUhOj.ubah_hubaubhvXh, multiple repositories may contain the same codebase. A change's codebase is usually determined by the r7r8}r9(hNXh, multiple repositories may contain the same codebase. A change's codebase is usually determined by the hOj!ubj)r:}r;(hNX:bb:cfg:`codebaseGenerator`r<hOj!hZh]h_jha}r=(UreftypeXcfgjjXcodebaseGeneratorU refdomainXbbr>hf]he]U refexplicithc]hd]hi]jjuhkKhm]r?h)r@}rA(hNj<ha}rB(hc]hd]rC(jj>Xbb-cfgrDehe]hf]hi]uhOj:hm]rEhvXcodebaseGeneratorrFrG}rH(hNUhOj@ubah_hubaubhvXs configuration. By default the codebase is ''; this value is used automatically for single-codebase configurations.rIrJ}rK(hNXs configuration. By default the codebase is ''; this value is used automatically for single-codebase configurations.hOj!ubeubh)rL}rM(hNX.. _Attr-Revision:hOjhZh]h_hha}rN(hf]he]hc]hd]hi]hU attr-revisionrOuhkKhlhhm]ubeubhP)rP}rQ(hNUhOjJhZh]h}rRh7jLsh_h`ha}rS(hc]hd]he]hf]rT(UrevisionrUjOehi]rV(hh7euhkKhlhh}rWjOjLshm]rX(ho)rY}rZ(hNXRevisionr[hOjPhZh]h_hsha}r\(hc]hd]he]hf]hi]uhkKhlhhm]r]hvXRevisionr^r_}r`(hNj[hOjYubaubhz)ra}rb(hNXXEach Change can have a :attr:`revision` attribute, which describes how to get a tree with a specific state: a tree which includes this Change (and all that came before it) but none that come after it. If this information is unavailable, the :attr:`revision` attribute will be ``None``. These revisions are provided by the :class:`ChangeSource`.hOjPhZh]h_h~ha}rc(hc]hd]he]hf]hi]uhkMhlhhm]rd(hvXEach Change can have a rerf}rg(hNXEach Change can have a hOjaubj)rh}ri(hNX:attr:`revision`rjhOjahZh]h_jha}rk(UreftypeXattrjjXrevisionU refdomainXpyrlhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rmh)rn}ro(hNjjha}rp(hc]hd]rq(jjlXpy-attrrrehe]hf]hi]uhOjhhm]rshvXrevisionrtru}rv(hNUhOjnubah_hubaubhvX attribute, which describes how to get a tree with a specific state: a tree which includes this Change (and all that came before it) but none that come after it. If this information is unavailable, the rwrx}ry(hNX attribute, which describes how to get a tree with a specific state: a tree which includes this Change (and all that came before it) but none that come after it. If this information is unavailable, the hOjaubj)rz}r{(hNX:attr:`revision`r|hOjahZh]h_jha}r}(UreftypeXattrjjXrevisionU refdomainXpyr~hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNj|ha}r(hc]hd]r(jj~Xpy-attrrehe]hf]hi]uhOjzhm]rhvXrevisionrr}r(hNUhOjubah_hubaubhvX attribute will be rr}r(hNX attribute will be hOjaubh)r}r(hNX``None``ha}r(hc]hd]he]hf]hi]uhOjahm]rhvXNonerr}r(hNUhOjubah_hubhvX&. These revisions are provided by the rr}r(hNX&. These revisions are provided by the hOjaubj)r}r(hNX:class:`ChangeSource`rhOjahZh]h_jha}r(UreftypeXclassjjX ChangeSourceU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX ChangeSourcerr}r(hNUhOjubah_hubaubhvX.r}r(hNX.hOjaubeubhz)r}r(hNXRevisions are always strings.rhOjPhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXRevisions are always strings.rr}r(hNjhOjubaubcdocutils.nodes definition_list r)r}r(hNUhOjPhZh]h_Udefinition_listrha}r(hc]hd]he]hf]hi]uhkNhlhhm]r(cdocutils.nodes definition_list_item r)r}r(hNXE`CVS` :attr:`revision` is the seconds since the epoch as an integer. hOjhZh]h_Udefinition_list_itemrha}r(hc]hd]he]hf]hi]uhkM hm]r(cdocutils.nodes term r)r}r(hNX`CVS`rhOjhZh]h_Utermrha}r(hc]hd]he]hf]hi]uhkM hm]rcdocutils.nodes title_reference r)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXCVSrr}r(hNUhOjubah_Utitle_referencerubaubcdocutils.nodes definition r)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX>:attr:`revision` is the seconds since the epoch as an integer.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM hm]r(j)r}r(hNX:attr:`revision`rhOjhZh]h_jha}r(UreftypeXattrjjXrevisionU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM hm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXrevisionrr}r(hNUhOjubah_hubaubhvX. is the seconds since the epoch as an integer.rr}r(hNX. is the seconds since the epoch as an integer.hOjubeubah_U definitionrubeubj)r}r(hNX.`SVN` :attr:`revision` is the revision number hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM hlhhm]r(j)r}r(hNX`SVN`rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM hm]rj)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXSVNrr}r(hNUhOjubah_jubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX':attr:`revision` is the revision numberhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM hm]r(j)r}r(hNX:attr:`revision`rhOjhZh]h_jha}r(UreftypeXattrjjXrevisionU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM hm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrr ehe]hf]hi]uhOjhm]r hvXrevisionr r }r (hNUhOjubah_hubaubhvX is the revision numberrr}r(hNX is the revision numberhOjubeubah_jubeubj)r}r(hNX]`Darcs` :attr:`revision` is a large string, the output of :command:`darcs changes --context` hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(j)r}r(hNX`Darcs`rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMhm]rj)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXDarcsrr}r (hNUhOjubah_jubaubj)r!}r"(hNUha}r#(hc]hd]he]hf]hi]uhOjhm]r$hz)r%}r&(hNXT:attr:`revision` is a large string, the output of :command:`darcs changes --context`hOj!hZh]h_h~ha}r'(hc]hd]he]hf]hi]uhkMhm]r((j)r)}r*(hNX:attr:`revision`r+hOj%hZh]h_jha}r,(UreftypeXattrjjXrevisionU refdomainXpyr-hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r.h)r/}r0(hNj+ha}r1(hc]hd]r2(jj-Xpy-attrr3ehe]hf]hi]uhOj)hm]r4hvXrevisionr5r6}r7(hNUhOj/ubah_hubaubhvX" is a large string, the output of r8r9}r:(hNX" is a large string, the output of hOj%ubcdocutils.nodes strong r;)r<}r=(hNX":command:`darcs changes --context`ha}r>(hc]hd]r?Ucommandr@ahe]hf]hi]uhOj%hm]rAhvXdarcs changes --contextrBrC}rD(hNUhOj<ubah_UstrongrEubeubah_jubeubj)rF}rG(hNXa`Mercurial` :attr:`revision` is a short string (a hash ID), the output of :command:`hg identify` hOjhZh]h_jha}rH(hc]hd]he]hf]hi]uhkMhlhhm]rI(j)rJ}rK(hNX `Mercurial`rLhOjFhZh]h_jha}rM(hc]hd]he]hf]hi]uhkMhm]rNj)rO}rP(hNjLha}rQ(hc]hd]he]hf]hi]uhOjJhm]rRhvX MercurialrSrT}rU(hNUhOjOubah_jubaubj)rV}rW(hNUha}rX(hc]hd]he]hf]hi]uhOjFhm]rYhz)rZ}r[(hNXT:attr:`revision` is a short string (a hash ID), the output of :command:`hg identify`hOjVhZh]h_h~ha}r\(hc]hd]he]hf]hi]uhkMhm]r](j)r^}r_(hNX:attr:`revision`r`hOjZhZh]h_jha}ra(UreftypeXattrjjXrevisionU refdomainXpyrbhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rch)rd}re(hNj`ha}rf(hc]hd]rg(jjbXpy-attrrhehe]hf]hi]uhOj^hm]rihvXrevisionrjrk}rl(hNUhOjdubah_hubaubhvX. is a short string (a hash ID), the output of rmrn}ro(hNX. is a short string (a hash ID), the output of hOjZubj;)rp}rq(hNX:command:`hg identify`ha}rr(hc]hd]rsj@ahe]hf]hi]uhOjZhm]rthvX hg identifyrurv}rw(hNUhOjpubah_jEubeubah_jubeubj)rx}ry(hNX0`P4` :attr:`revision` is the transaction number hOjhZh]h_jha}rz(hc]hd]he]hf]hi]uhkMhlhhm]r{(j)r|}r}(hNX`P4`r~hOjxhZh]h_jha}r(hc]hd]he]hf]hi]uhkMhm]rj)r}r(hNj~ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvXP4rr}r(hNUhOjubah_jubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjxhm]rhz)r}r(hNX*:attr:`revision` is the transaction numberhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhm]r(j)r}r(hNX:attr:`revision`rhOjhZh]h_jha}r(UreftypeXattrjjXrevisionU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXrevisionrr}r(hNUhOjubah_hubaubhvX is the transaction numberrr}r(hNX is the transaction numberhOjubeubah_jubeubj)r}r(hNXe`Git` :attr:`revision` is a short string (a SHA1 hash), the output of e.g. :command:`git rev-parse` hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(j)r}r(hNX`Git`rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMhm]rj)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXGitrr}r(hNUhOjubah_jubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX]:attr:`revision` is a short string (a SHA1 hash), the output of e.g. :command:`git rev-parse`hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhm]r(j)r}r(hNX:attr:`revision`rhOjhZh]h_jha}r(UreftypeXattrjjXrevisionU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXrevisionrr}r(hNUhOjubah_hubaubhvX5 is a short string (a SHA1 hash), the output of e.g. rr}r(hNX5 is a short string (a SHA1 hash), the output of e.g. hOjubj;)r}r(hNX:command:`git rev-parse`ha}r(hc]hd]rj@ahe]hf]hi]uhOjhm]rhvX git rev-parserr}r(hNUhOjubah_jEubeubah_jubeubeubeubhP)r}r(hNUhOjJhZh]h_h`ha}r(hc]hd]he]hf]rUbranchesrahi]rh:auhkMhlhhm]r(ho)r}r(hNXBranchesrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXBranchesrr}r(hNjhOjubaubhz)r}r(hNXThe Change might also have a :attr:`branch` attribute. This indicates that all of the Change's files are in the same named branch. The Schedulers get to decide whether the branch should be built or not.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM hlhhm]r(hvXThe Change might also have a rr}r(hNXThe Change might also have a hOjubj)r}r(hNX:attr:`branch`rhOjhZh]h_jha}r(UreftypeXattrjjXbranchU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM hm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXbranchrr}r(hNUhOjubah_hubaubhvX attribute. This indicates that all of the Change's files are in the same named branch. The Schedulers get to decide whether the branch should be built or not.rr}r(hNX attribute. This indicates that all of the Change's files are in the same named branch. The Schedulers get to decide whether the branch should be built or not.hOjubeubhz)r}r(hNXFor VC systems like CVS, Git and Monotone the :attr:`branch` name is unrelated to the filename. (that is, the branch name and the filename inhabit unrelated namespaces). For SVN, branches are expressed as subdirectories of the repository, so the file's ``svnurl`` is a combination of some base URL, the branch name, and the filename within the branch. (In a sense, the branch name and the filename inhabit the same namespace). Darcs branches are subdirectories of a base URL just like SVN. Mercurial branches are the same as Darcs.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM$hlhhm]r(hvX/For VC systems like CVS, Git and Monotone the rr}r(hNX/For VC systems like CVS, Git and Monotone the hOjubj)r}r(hNX:attr:`branch`rhOjhZh]h_jha}r(UreftypeXattrjjXbranchU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM$hm]rh)r }r (hNjha}r (hc]hd]r (jjXpy-attrr ehe]hf]hi]uhOjhm]rhvXbranchrr}r(hNUhOj ubah_hubaubhvX name is unrelated to the filename. (that is, the branch name and the filename inhabit unrelated namespaces). For SVN, branches are expressed as subdirectories of the repository, so the file's rr}r(hNX name is unrelated to the filename. (that is, the branch name and the filename inhabit unrelated namespaces). For SVN, branches are expressed as subdirectories of the repository, so the file's hOjubh)r}r(hNX ``svnurl``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXsvnurlrr}r(hNUhOjubah_hubhvX  is a combination of some base URL, the branch name, and the filename within the branch. (In a sense, the branch name and the filename inhabit the same namespace). Darcs branches are subdirectories of a base URL just like SVN. Mercurial branches are the same as Darcs.rr}r(hNX  is a combination of some base URL, the branch name, and the filename within the branch. (In a sense, the branch name and the filename inhabit the same namespace). Darcs branches are subdirectories of a base URL just like SVN. Mercurial branches are the same as Darcs.hOjubeubj)r}r (hNUhOjhZh]h_jha}r!(hc]hd]he]hf]hi]uhkNhlhhm]r"(j)r#}r$(hNX6`CVS` branch='warner-newfeature', files=['src/foo.c'] hOjhZh]h_jha}r%(hc]hd]he]hf]hi]uhkM/hm]r&(j)r'}r((hNX`CVS`r)hOj#hZh]h_jha}r*(hc]hd]he]hf]hi]uhkM/hm]r+j)r,}r-(hNj)ha}r.(hc]hd]he]hf]hi]uhOj'hm]r/hvXCVSr0r1}r2(hNUhOj,ubah_jubaubj)r3}r4(hNUha}r5(hc]hd]he]hf]hi]uhOj#hm]r6hz)r7}r8(hNX/branch='warner-newfeature', files=['src/foo.c']r9hOj3hZh]h_h~ha}r:(hc]hd]he]hf]hi]uhkM/hm]r;hvX/branch='warner-newfeature', files=['src/foo.c']r<r=}r>(hNj9hOj7ubaubah_jubeubj)r?}r@(hNX?`SVN` branch='branches/warner-newfeature', files=['src/foo.c'] hOjhZh]h_jha}rA(hc]hd]he]hf]hi]uhkM2hlhhm]rB(j)rC}rD(hNX`SVN`rEhOj?hZh]h_jha}rF(hc]hd]he]hf]hi]uhkM2hm]rGj)rH}rI(hNjEha}rJ(hc]hd]he]hf]hi]uhOjChm]rKhvXSVNrLrM}rN(hNUhOjHubah_jubaubj)rO}rP(hNUha}rQ(hc]hd]he]hf]hi]uhOj?hm]rRhz)rS}rT(hNX8branch='branches/warner-newfeature', files=['src/foo.c']rUhOjOhZh]h_h~ha}rV(hc]hd]he]hf]hi]uhkM2hm]rWhvX8branch='branches/warner-newfeature', files=['src/foo.c']rXrY}rZ(hNjUhOjSubaubah_jubeubj)r[}r\(hNX8`Darcs` branch='warner-newfeature', files=['src/foo.c'] hOjhZh]h_jha}r](hc]hd]he]hf]hi]uhkM5hlhhm]r^(j)r_}r`(hNX`Darcs`rahOj[hZh]h_jha}rb(hc]hd]he]hf]hi]uhkM5hm]rcj)rd}re(hNjaha}rf(hc]hd]he]hf]hi]uhOj_hm]rghvXDarcsrhri}rj(hNUhOjdubah_jubaubj)rk}rl(hNUha}rm(hc]hd]he]hf]hi]uhOj[hm]rnhz)ro}rp(hNX/branch='warner-newfeature', files=['src/foo.c']rqhOjkhZh]h_h~ha}rr(hc]hd]he]hf]hi]uhkM5hm]rshvX/branch='warner-newfeature', files=['src/foo.c']rtru}rv(hNjqhOjoubaubah_jubeubj)rw}rx(hNX<`Mercurial` branch='warner-newfeature', files=['src/foo.c'] hOjhZh]h_jha}ry(hc]hd]he]hf]hi]uhkM8hlhhm]rz(j)r{}r|(hNX `Mercurial`r}hOjwhZh]h_jha}r~(hc]hd]he]hf]hi]uhkM8hm]rj)r}r(hNj}ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX Mercurialrr}r(hNUhOjubah_jubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjwhm]rhz)r}r(hNX/branch='warner-newfeature', files=['src/foo.c']rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM8hm]rhvX/branch='warner-newfeature', files=['src/foo.c']rr}r(hNjhOjubaubah_jubeubj)r}r(hNX6`Git` branch='warner-newfeature', files=['src/foo.c'] hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM;hlhhm]r(j)r}r(hNX`Git`rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM;hm]rj)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXGitrr}r(hNUhOjubah_jubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX/branch='warner-newfeature', files=['src/foo.c']rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM;hm]rhvX/branch='warner-newfeature', files=['src/foo.c']rr}r(hNjhOjubaubah_jubeubj)r}r(hNX;`Monotone` branch='warner-newfeature', files=['src/foo.c'] hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM>hlhhm]r(j)r}r(hNX `Monotone`rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM>hm]rj)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXMonotonerr}r(hNUhOjubah_jubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX/branch='warner-newfeature', files=['src/foo.c']rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM>hm]rhvX/branch='warner-newfeature', files=['src/foo.c']rr}r(hNjhOjubaubah_jubeubeubeubhP)r}r(hNUhOjJhZh]h_h`ha}r(hc]hd]he]hf]rUchange-propertiesrahi]rh0auhkMAhlhhm]r(ho)r}r(hNXChange PropertiesrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkMAhlhhm]rhvXChange Propertiesrr}r(hNjhOjubaubhz)r}r(hNXA Change may have one or more properties attached to it, usually specified through the Force Build form or :bb:cmdline:`sendchange`. Properties are discussed in detail in the :ref:`Build-Properties` section.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMChlhhm]r(hvXkA Change may have one or more properties attached to it, usually specified through the Force Build form or rr}r(hNXkA Change may have one or more properties attached to it, usually specified through the Force Build form or hOjubj)r}r(hNX:bb:cmdline:`sendchange`rhOjhZh]h_jha}r(UreftypeXcmdlinejjX sendchangeU refdomainXbbrhf]he]U refexplicithc]hd]hi]jjuhkMChm]rh)r}r(hNjha}r(hc]hd]r(jjX bb-cmdlinerehe]hf]hi]uhOjhm]rhvX sendchangerr}r(hNUhOjubah_hubaubhvX,. Properties are discussed in detail in the rr}r(hNX,. Properties are discussed in detail in the hOjubj)r}r(hNX:ref:`Build-Properties`rhOjhZh]h_jha}r(UreftypeXrefjjXbuild-propertiesU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkMChm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvXBuild-Propertiesrr }r (hNUhOjubah_hubaubhvX section.r r }r (hNX section.hOjubeubh)r }r (hNX.. _Scheduling-Builds:hOjhZh]h_hha}r (hf]he]hc]hd]hi]hUscheduling-buildsr uhkMGhlhhm]ubeubeubhP)r }r (hNUhOhXhZh]h}r h)j sh_h`ha}r (hc]hd]he]hf]r (j Uid4r ehi]r (hh)euhkMJhlhh}r j j shm]r (ho)r }r (hNXScheduling Buildsr hOj hZh]h_hsha}r (hc]hd]he]hf]hi]uhkMJhlhhm]r hvXScheduling Buildsr r }r (hNj hOj ubaubhz)r }r (hNXHEach Buildmaster has a set of :class:`Scheduler` objects, each of which gets a copy of every incoming :class:`Change`. The Schedulers are responsible for deciding when :class:`Build`\s should be run. Some Buildbot installations might have a single :class:`Scheduler`, while others may have several, each for a different purpose.hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMLhlhhm]r (hvXEach Buildmaster has a set of r r }r (hNXEach Buildmaster has a set of hOj ubj)r! }r" (hNX:class:`Scheduler`r# hOj hZh]h_jha}r$ (UreftypeXclassjjX SchedulerU refdomainXpyr% hf]he]U refexplicithc]hd]hi]jjjNjNuhkMLhm]r& h)r' }r( (hNj# ha}r) (hc]hd]r* (jj% Xpy-classr+ ehe]hf]hi]uhOj! hm]r, hvX Schedulerr- r. }r/ (hNUhOj' ubah_hubaubhvX6 objects, each of which gets a copy of every incoming r0 r1 }r2 (hNX6 objects, each of which gets a copy of every incoming hOj ubj)r3 }r4 (hNX:class:`Change`r5 hOj hZh]h_jha}r6 (UreftypeXclassjjXChangeU refdomainXpyr7 hf]he]U refexplicithc]hd]hi]jjjNjNuhkMLhm]r8 h)r9 }r: (hNj5 ha}r; (hc]hd]r< (jj7 Xpy-classr= ehe]hf]hi]uhOj3 hm]r> hvXChanger? r@ }rA (hNUhOj9 ubah_hubaubhvX3. The Schedulers are responsible for deciding when rB rC }rD (hNX3. The Schedulers are responsible for deciding when hOj ubj)rE }rF (hNX:class:`Build`rG hOj hZh]h_jha}rH (UreftypeXclassjjXBuildU refdomainXpyrI hf]he]U refexplicithc]hd]hi]jjjNjNuhkMLhm]rJ h)rK }rL (hNjG ha}rM (hc]hd]rN (jjI Xpy-classrO ehe]hf]hi]uhOjE hm]rP hvXBuildrQ rR }rS (hNUhOjK ubah_hubaubhvXAs should be run. Some Buildbot installations might have a single rT rU }rV (hNXB\s should be run. Some Buildbot installations might have a single hOj ubj)rW }rX (hNX:class:`Scheduler`rY hOj hZh]h_jha}rZ (UreftypeXclassjjX SchedulerU refdomainXpyr[ hf]he]U refexplicithc]hd]hi]jjjNjNuhkMLhm]r\ h)r] }r^ (hNjY ha}r_ (hc]hd]r` (jj[ Xpy-classra ehe]hf]hi]uhOjW hm]rb hvX Schedulerrc rd }re (hNUhOj] ubah_hubaubhvX>, while others may have several, each for a different purpose.rf rg }rh (hNX>, while others may have several, each for a different purpose.hOj ubeubhz)ri }rj (hNXYFor example, a *quick* scheduler might exist to give immediate feedback to developers, hoping to catch obvious problems in the code that can be detected quickly. These typically do not run the full test suite, nor do they run on a wide variety of platforms. They also usually do a VC update rather than performing a brand-new checkout each time.hOj hZh]h_h~ha}rk (hc]hd]he]hf]hi]uhkMRhlhhm]rl (hvXFor example, a rm rn }ro (hNXFor example, a hOji ubh)rp }rq (hNX*quick*ha}rr (hc]hd]he]hf]hi]uhOji hm]rs hvXquickrt ru }rv (hNUhOjp ubah_hubhvXC scheduler might exist to give immediate feedback to developers, hoping to catch obvious problems in the code that can be detected quickly. These typically do not run the full test suite, nor do they run on a wide variety of platforms. They also usually do a VC update rather than performing a brand-new checkout each time.rw rx }ry (hNXC scheduler might exist to give immediate feedback to developers, hoping to catch obvious problems in the code that can be detected quickly. These typically do not run the full test suite, nor do they run on a wide variety of platforms. They also usually do a VC update rather than performing a brand-new checkout each time.hOji ubeubhz)rz }r{ (hNX>A separate *full* scheduler might run more comprehensive tests, to catch more subtle problems. configured to run after the quick scheduler, to give developers time to commit fixes to bugs caught by the quick scheduler before running the comprehensive tests. This scheduler would also feed multiple :class:`Builder`\s.hOj hZh]h_h~ha}r| (hc]hd]he]hf]hi]uhkMYhlhhm]r} (hvX A separate r~ r }r (hNX A separate hOjz ubh)r }r (hNX*full*ha}r (hc]hd]he]hf]hi]uhOjz hm]r hvXfullr r }r (hNUhOj ubah_hubhvX scheduler might run more comprehensive tests, to catch more subtle problems. configured to run after the quick scheduler, to give developers time to commit fixes to bugs caught by the quick scheduler before running the comprehensive tests. This scheduler would also feed multiple r r }r (hNX scheduler might run more comprehensive tests, to catch more subtle problems. configured to run after the quick scheduler, to give developers time to commit fixes to bugs caught by the quick scheduler before running the comprehensive tests. This scheduler would also feed multiple hOjz ubj)r }r (hNX:class:`Builder`r hOjz hZh]h_jha}r (UreftypeXclassjjXBuilderU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMYhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuilderr r }r (hNUhOj ubah_hubaubhvXs.r r }r (hNX\s.hOjz ubeubhz)r }r (hNXMany schedulers can be configured to wait a while after seeing a source-code change - this is the *tree stable timer*. The timer allows multiple commits to be "batched" together. This is particularly useful in distributed version control systems, where a developer may push a long sequence of changes all at once. To save resources, it's often desirable only to test the most recent change.hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkM`hlhhm]r (hvXbMany schedulers can be configured to wait a while after seeing a source-code change - this is the r r }r (hNXbMany schedulers can be configured to wait a while after seeing a source-code change - this is the hOj ubh)r }r (hNX*tree stable timer*ha}r (hc]hd]he]hf]hi]uhOj hm]r hvXtree stable timerr r }r (hNUhOj ubah_hubhvX. The timer allows multiple commits to be "batched" together. This is particularly useful in distributed version control systems, where a developer may push a long sequence of changes all at once. To save resources, it's often desirable only to test the most recent change.r r }r (hNX. The timer allows multiple commits to be "batched" together. This is particularly useful in distributed version control systems, where a developer may push a long sequence of changes all at once. To save resources, it's often desirable only to test the most recent change.hOj ubeubhz)r }r (hNXSchedulers can also filter out the changes they are interested in, based on a number of criteria. For example, a scheduler that only builds documentation might skip any changes that do not affect the documentation. Schedulers can also filter on the branch to which a commit was made.r hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMghlhhm]r hvXSchedulers can also filter out the changes they are interested in, based on a number of criteria. For example, a scheduler that only builds documentation might skip any changes that do not affect the documentation. Schedulers can also filter on the branch to which a commit was made.r r }r (hNj hOj ubaubhz)r }r (hNXThere is some support for configuring dependencies between builds - for example, you may want to build packages only for revisions which pass all of the unit tests. This support is under active development in Buildbot, and is referred to as "build coordination".r hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMlhlhhm]r hvXThere is some support for configuring dependencies between builds - for example, you may want to build packages only for revisions which pass all of the unit tests. This support is under active development in Buildbot, and is referred to as "build coordination".r r }r (hNj hOj ubaubhz)r }r (hNXPeriodic builds (those which are run every N seconds rather than after new Changes arrive) are triggered by a special :class:`Periodic` Scheduler subclass.hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMqhlhhm]r (hvXvPeriodic builds (those which are run every N seconds rather than after new Changes arrive) are triggered by a special r r }r (hNXvPeriodic builds (those which are run every N seconds rather than after new Changes arrive) are triggered by a special hOj ubj)r }r (hNX:class:`Periodic`r hOj hZh]h_jha}r (UreftypeXclassjjXPeriodicU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMqhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXPeriodicr r }r (hNUhOj ubah_hubaubhvX Scheduler subclass.r r }r (hNX Scheduler subclass.hOj ubeubhz)r }r (hNXEach Scheduler creates and submits :class:`BuildSet` objects to the :class:`BuildMaster`, which is then responsible for making sure the individual :class:`BuildRequests` are delivered to the target :class:`Builder`\s.hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMuhlhhm]r (hvX#Each Scheduler creates and submits r r }r (hNX#Each Scheduler creates and submits hOj ubj)r }r (hNX:class:`BuildSet`r hOj hZh]h_jha}r (UreftypeXclassjjXBuildSetU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMuhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildSetr r }r (hNUhOj ubah_hubaubhvX objects to the r r }r (hNX objects to the hOj ubj)r }r (hNX:class:`BuildMaster`r hOj hZh]h_jha}r (UreftypeXclassjjX BuildMasterU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMuhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvX BuildMasterr r }r (hNUhOj ubah_hubaubhvX;, which is then responsible for making sure the individual r r }r (hNX;, which is then responsible for making sure the individual hOj ubj)r }r (hNX:class:`BuildRequests`r hOj hZh]h_jha}r (UreftypeXclassjjX BuildRequestsU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMuhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvX BuildRequestsr r }r (hNUhOj ubah_hubaubhvX are delivered to the target r r }r (hNX are delivered to the target hOj ubj)r }r (hNX:class:`Builder`r hOj hZh]h_jha}r (UreftypeXclassjjXBuilderU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMuhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuilderr r! }r" (hNUhOj ubah_hubaubhvXs.r# r$ }r% (hNX\s.hOj ubeubhz)r& }r' (hNX:class:`Scheduler` instances are activated by placing them in the ``c['schedulers']`` list in the buildmaster config file. Each :class:`Scheduler` has a unique name.hOj hZh]h_h~ha}r( (hc]hd]he]hf]hi]uhkMzhlhhm]r) (j)r* }r+ (hNX:class:`Scheduler`r, hOj& hZh]h_jha}r- (UreftypeXclassjjX SchedulerU refdomainXpyr. hf]he]U refexplicithc]hd]hi]jjjNjNuhkMzhm]r/ h)r0 }r1 (hNj, ha}r2 (hc]hd]r3 (jj. Xpy-classr4 ehe]hf]hi]uhOj* hm]r5 hvX Schedulerr6 r7 }r8 (hNUhOj0 ubah_hubaubhvX0 instances are activated by placing them in the r9 r: }r; (hNX0 instances are activated by placing them in the hOj& ubh)r< }r= (hNX``c['schedulers']``ha}r> (hc]hd]he]hf]hi]uhOj& hm]r? hvXc['schedulers']r@ rA }rB (hNUhOj< ubah_hubhvX+ list in the buildmaster config file. Each rC rD }rE (hNX+ list in the buildmaster config file. Each hOj& ubj)rF }rG (hNX:class:`Scheduler`rH hOj& hZh]h_jha}rI (UreftypeXclassjjX SchedulerU refdomainXpyrJ hf]he]U refexplicithc]hd]hi]jjjNjNuhkMzhm]rK h)rL }rM (hNjH ha}rN (hc]hd]rO (jjJ Xpy-classrP ehe]hf]hi]uhOjF hm]rQ hvX SchedulerrR rS }rT (hNUhOjL ubah_hubaubhvX has a unique name.rU rV }rW (hNX has a unique name.hOj& ubeubh)rX }rY (hNX .. _BuildSet:hOj hZh]h_hha}rZ (hf]he]hc]hd]hi]hUbuildsetr[ uhkM~hlhhm]ubeubhP)r\ }r] (hNUhOhXhZh]h}r^ h3jX sh_h`ha}r_ (hc]hd]he]hf]r` (U buildsetsra j[ ehi]rb (hh3euhkMhlhh}rc j[ jX shm]rd (ho)re }rf (hNX BuildSetsrg hOj\ hZh]h_hsha}rh (hc]hd]he]hf]hi]uhkMhlhhm]ri hvX BuildSetsrj rk }rl (hNjg hOje ubaubhz)rm }rn (hNXYA :class:`BuildSet` is the name given to a set of :class:`Build`\s that all compile/test the same version of the tree on multiple :class:`Builder`\s. In general, all these component :class:`Build`\s will perform the same sequence of :class:`Step`\s, using the same source code, but on different platforms or against a different set of libraries.hOj\ hZh]h_h~ha}ro (hc]hd]he]hf]hi]uhkMhlhhm]rp (hvXA rq rr }rs (hNXA hOjm ubj)rt }ru (hNX:class:`BuildSet`rv hOjm hZh]h_jha}rw (UreftypeXclassjjXBuildSetU refdomainXpyrx hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]ry h)rz }r{ (hNjv ha}r| (hc]hd]r} (jjx Xpy-classr~ ehe]hf]hi]uhOjt hm]r hvXBuildSetr r }r (hNUhOjz ubah_hubaubhvX is the name given to a set of r r }r (hNX is the name given to a set of hOjm ubj)r }r (hNX:class:`Build`r hOjm hZh]h_jha}r (UreftypeXclassjjXBuildU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildr r }r (hNUhOj ubah_hubaubhvXAs that all compile/test the same version of the tree on multiple r r }r (hNXB\s that all compile/test the same version of the tree on multiple hOjm ubj)r }r (hNX:class:`Builder`r hOjm hZh]h_jha}r (UreftypeXclassjjXBuilderU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuilderr r }r (hNUhOj ubah_hubaubhvX#s. In general, all these component r r }r (hNX$\s. In general, all these component hOjm ubj)r }r (hNX:class:`Build`r hOjm hZh]h_jha}r (UreftypeXclassjjXBuildU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildr r }r (hNUhOj ubah_hubaubhvX$s will perform the same sequence of r r }r (hNX%\s will perform the same sequence of hOjm ubj)r }r (hNX :class:`Step`r hOjm hZh]h_jha}r (UreftypeXclassjjXStepU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXStepr r }r (hNUhOj ubah_hubaubhvXbs, using the same source code, but on different platforms or against a different set of libraries.r r }r (hNXc\s, using the same source code, but on different platforms or against a different set of libraries.hOjm ubeubhz)r }r (hNXThe :class:`BuildSet` is tracked as a single unit, which fails if any of the component :class:`Build`\s have failed, and therefore can succeed only if *all* of the component :class:`Build`\s have succeeded. There are two kinds of status notification messages that can be emitted for a :class:`BuildSet`: the ``firstFailure`` type (which fires as soon as we know the :class:`BuildSet` will fail), and the ``Finished`` type (which fires once the :class:`BuildSet` has completely finished, regardless of whether the overall set passed or failed).hOj\ hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMhlhhm]r (hvXThe r r }r (hNXThe hOj ubj)r }r (hNX:class:`BuildSet`r hOj hZh]h_jha}r (UreftypeXclassjjXBuildSetU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildSetr r }r (hNUhOj ubah_hubaubhvXB is tracked as a single unit, which fails if any of the component r r }r (hNXB is tracked as a single unit, which fails if any of the component hOj ubj)r }r (hNX:class:`Build`r hOj hZh]h_jha}r (UreftypeXclassjjXBuildU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildr r }r (hNUhOj ubah_hubaubhvX1s have failed, and therefore can succeed only if r r }r (hNX2\s have failed, and therefore can succeed only if hOj ubh)r }r (hNX*all*ha}r (hc]hd]he]hf]hi]uhOj hm]r hvXallr r }r (hNUhOj ubah_hubhvX of the component r r }r (hNX of the component hOj ubj)r }r (hNX:class:`Build`r hOj hZh]h_jha}r (UreftypeXclassjjXBuildU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildr r }r (hNUhOj ubah_hubaubhvX`s have succeeded. There are two kinds of status notification messages that can be emitted for a r r }r (hNXa\s have succeeded. There are two kinds of status notification messages that can be emitted for a hOj ubj)r }r (hNX:class:`BuildSet`r hOj hZh]h_jha}r (UreftypeXclassjjXBuildSetU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuildSetr! r" }r# (hNUhOj ubah_hubaubhvX: the r$ r% }r& (hNX: the hOj ubh)r' }r( (hNX``firstFailure``ha}r) (hc]hd]he]hf]hi]uhOj hm]r* hvX firstFailurer+ r, }r- (hNUhOj' ubah_hubhvX* type (which fires as soon as we know the r. r/ }r0 (hNX* type (which fires as soon as we know the hOj ubj)r1 }r2 (hNX:class:`BuildSet`r3 hOj hZh]h_jha}r4 (UreftypeXclassjjXBuildSetU refdomainXpyr5 hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r6 h)r7 }r8 (hNj3 ha}r9 (hc]hd]r: (jj5 Xpy-classr; ehe]hf]hi]uhOj1 hm]r< hvXBuildSetr= r> }r? (hNUhOj7 ubah_hubaubhvX will fail), and the r@ rA }rB (hNX will fail), and the hOj ubh)rC }rD (hNX ``Finished``ha}rE (hc]hd]he]hf]hi]uhOj hm]rF hvXFinishedrG rH }rI (hNUhOjC ubah_hubhvX type (which fires once the rJ rK }rL (hNX type (which fires once the hOj ubj)rM }rN (hNX:class:`BuildSet`rO hOj hZh]h_jha}rP (UreftypeXclassjjXBuildSetU refdomainXpyrQ hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rR h)rS }rT (hNjO ha}rU (hc]hd]rV (jjQ Xpy-classrW ehe]hf]hi]uhOjM hm]rX hvXBuildSetrY rZ }r[ (hNUhOjS ubah_hubaubhvXR has completely finished, regardless of whether the overall set passed or failed).r\ r] }r^ (hNXR has completely finished, regardless of whether the overall set passed or failed).hOj ubeubhz)r_ }r` (hNXWA :class:`BuildSet` is created with set of one or more *source stamp* tuples of ``(branch, revision, changes, patch)``, some of which may be ``None``, and a list of :class:`Builder`\s on which it is to be run. They are then given to the BuildMaster, which is responsible for creating a separate :class:`BuildRequest` for each :class:`Builder`.hOj\ hZh]h_h~ha}ra (hc]hd]he]hf]hi]uhkMhlhhm]rb (hvXA rc rd }re (hNXA hOj_ ubj)rf }rg (hNX:class:`BuildSet`rh hOj_ hZh]h_jha}ri (UreftypeXclassjjXBuildSetU refdomainXpyrj hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rk h)rl }rm (hNjh ha}rn (hc]hd]ro (jjj Xpy-classrp ehe]hf]hi]uhOjf hm]rq hvXBuildSetrr rs }rt (hNUhOjl ubah_hubaubhvX$ is created with set of one or more ru rv }rw (hNX$ is created with set of one or more hOj_ ubh)rx }ry (hNX*source stamp*ha}rz (hc]hd]he]hf]hi]uhOj_ hm]r{ hvX source stampr| r} }r~ (hNUhOjx ubah_hubhvX tuples of r r }r (hNX tuples of hOj_ ubh)r }r (hNX&``(branch, revision, changes, patch)``ha}r (hc]hd]he]hf]hi]uhOj_ hm]r hvX"(branch, revision, changes, patch)r r }r (hNUhOj ubah_hubhvX, some of which may be r r }r (hNX, some of which may be hOj_ ubh)r }r (hNX``None``ha}r (hc]hd]he]hf]hi]uhOj_ hm]r hvXNoner r }r (hNUhOj ubah_hubhvX, and a list of r r }r (hNX, and a list of hOj_ ubj)r }r (hNX:class:`Builder`r hOj_ hZh]h_jha}r (UreftypeXclassjjXBuilderU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuilderr r }r (hNUhOj ubah_hubaubhvXqs on which it is to be run. They are then given to the BuildMaster, which is responsible for creating a separate r r }r (hNXr\s on which it is to be run. They are then given to the BuildMaster, which is responsible for creating a separate hOj_ ubj)r }r (hNX:class:`BuildRequest`r hOj_ hZh]h_jha}r (UreftypeXclassjjX BuildRequestU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvX BuildRequestr r }r (hNUhOj ubah_hubaubhvX for each r r }r (hNX for each hOj_ ubj)r }r (hNX:class:`Builder`r hOj_ hZh]h_jha}r (UreftypeXclassjjXBuilderU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXBuilderr r }r (hNUhOj ubah_hubaubhvX.r }r (hNX.hOj_ ubeubhz)r }r (hNXFThere are a couple of different likely values for the ``SourceStamp``:hOj\ hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMhlhhm]r (hvX6There are a couple of different likely values for the r r }r (hNX6There are a couple of different likely values for the hOj ubh)r }r (hNX``SourceStamp``ha}r (hc]hd]he]hf]hi]uhOj hm]r hvX SourceStampr r }r (hNUhOj ubah_hubhvX:r }r (hNX:hOj ubeubj)r }r (hNUhOj\ hZh]h_jha}r (hc]hd]he]hf]hi]uhkNhlhhm]r (j)r }r (hNX3:samp:`(revision=None, changes={CHANGES}, patch=None)` This is a :class:`SourceStamp` used when a series of :class:`Change`\s have triggered a build. The VC step will attempt to check out a tree that contains *CHANGES* (and any changes that occurred before *CHANGES*, but not any that occurred after them.) hOj hZh]h_jha}r (hc]hd]he]hf]hi]uhkMhm]r (j)r }r (hNX6:samp:`(revision=None, changes={CHANGES}, patch=None)`r hOj hZh]h_jha}r (hc]hd]he]hf]hi]uhkMhm]r h)r }r (hNUha}r (hf]he]hc]hd]r Xsampr aUrolej hi]uhOj hm]r (hvX(revision=None, changes=r r }r (hNX(revision=None, changes=hOj ubh)r }r (hNXCHANGESha}r (hc]hd]he]hf]hi]uhOj hm]r hvXCHANGESr r }r (hNUhOj ubah_hubhvX , patch=None)r r }r (hNX , patch=None)hOj ubeh_hubaubj)r }r (hNUha}r (hc]hd]he]hf]hi]uhOj hm]r hz)r }r (hNXThis is a :class:`SourceStamp` used when a series of :class:`Change`\s have triggered a build. The VC step will attempt to check out a tree that contains *CHANGES* (and any changes that occurred before *CHANGES*, but not any that occurred after them.)hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMhm]r (hvX This is a r r }r (hNX This is a hOj ubj)r }r (hNX:class:`SourceStamp`r hOj hZh]h_jha}r (UreftypeXclassjjX SourceStampU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvX SourceStampr r }r (hNUhOj ubah_hubaubhvX used when a series of r r }r (hNX used when a series of hOj ubj)r }r (hNX:class:`Change`r hOj hZh]h_jha}r (UreftypeXclassjjXChangeU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r! (jj Xpy-classr" ehe]hf]hi]uhOj hm]r# hvXChanger$ r% }r& (hNUhOj ubah_hubaubhvXUs have triggered a build. The VC step will attempt to check out a tree that contains r' r( }r) (hNXV\s have triggered a build. The VC step will attempt to check out a tree that contains hOj ubh)r* }r+ (hNX *CHANGES*ha}r, (hc]hd]he]hf]hi]uhOj hm]r- hvXCHANGESr. r/ }r0 (hNUhOj* ubah_hubhvX' (and any changes that occurred before r1 r2 }r3 (hNX' (and any changes that occurred before hOj ubh)r4 }r5 (hNX *CHANGES*ha}r6 (hc]hd]he]hf]hi]uhOj hm]r7 hvXCHANGESr8 r9 }r: (hNUhOj4 ubah_hubhvX(, but not any that occurred after them.)r; r< }r= (hNX(, but not any that occurred after them.)hOj ubeubah_jubeubj)r> }r? (hNX:samp:`(revision=None, changes=None, patch=None)` This builds the most recent code on the default branch. This is the sort of :class:`SourceStamp` that would be used on a :class:`Build` that was triggered by a user request, or a :class:`Periodic` scheduler. It is also possible to configure the VC Source Step to always check out the latest sources rather than paying attention to the :class:`Change`\s in the :class:`SourceStamp`, which will result in same behavior as this. hOj hZh]h_jha}r@ (hc]hd]he]hf]hi]uhkMhlhhm]rA (j)rB }rC (hNX1:samp:`(revision=None, changes=None, patch=None)`rD hOj> hZh]h_jha}rE (hc]hd]he]hf]hi]uhkMhm]rF h)rG }rH (hNUha}rI (hf]he]hc]hd]rJ XsamprK aUrolejK hi]uhOjB hm]rL hvX)(revision=None, changes=None, patch=None)rM rN }rO (hNX)(revision=None, changes=None, patch=None)hOjG ubah_hubaubj)rP }rQ (hNUha}rR (hc]hd]he]hf]hi]uhOj> hm]rS hz)rT }rU (hNXThis builds the most recent code on the default branch. This is the sort of :class:`SourceStamp` that would be used on a :class:`Build` that was triggered by a user request, or a :class:`Periodic` scheduler. It is also possible to configure the VC Source Step to always check out the latest sources rather than paying attention to the :class:`Change`\s in the :class:`SourceStamp`, which will result in same behavior as this.hOjP hZh]h_h~ha}rV (hc]hd]he]hf]hi]uhkMhm]rW (hvXLThis builds the most recent code on the default branch. This is the sort of rX rY }rZ (hNXLThis builds the most recent code on the default branch. This is the sort of hOjT ubj)r[ }r\ (hNX:class:`SourceStamp`r] hOjT hZh]h_jha}r^ (UreftypeXclassjjX SourceStampU refdomainXpyr_ hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r` h)ra }rb (hNj] ha}rc (hc]hd]rd (jj_ Xpy-classre ehe]hf]hi]uhOj[ hm]rf hvX SourceStamprg rh }ri (hNUhOja ubah_hubaubhvX that would be used on a rj rk }rl (hNX that would be used on a hOjT ubj)rm }rn (hNX:class:`Build`ro hOjT hZh]h_jha}rp (UreftypeXclassjjXBuildU refdomainXpyrq hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rr h)rs }rt (hNjo ha}ru (hc]hd]rv (jjq Xpy-classrw ehe]hf]hi]uhOjm hm]rx hvXBuildry rz }r{ (hNUhOjs ubah_hubaubhvX, that was triggered by a user request, or a r| r} }r~ (hNX, that was triggered by a user request, or a hOjT ubj)r }r (hNX:class:`Periodic`r hOjT hZh]h_jha}r (UreftypeXclassjjXPeriodicU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXPeriodicr r }r (hNUhOj ubah_hubaubhvX scheduler. It is also possible to configure the VC Source Step to always check out the latest sources rather than paying attention to the r r }r (hNX scheduler. It is also possible to configure the VC Source Step to always check out the latest sources rather than paying attention to the hOjT ubj)r }r (hNX:class:`Change`r hOjT hZh]h_jha}r (UreftypeXclassjjXChangeU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXChanger r }r (hNUhOj ubah_hubaubhvX s in the r r }r (hNX \s in the hOjT ubj)r }r (hNX:class:`SourceStamp`r hOjT hZh]h_jha}r (UreftypeXclassjjX SourceStampU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvX SourceStampr r }r (hNUhOj ubah_hubaubhvX-, which will result in same behavior as this.r r }r (hNX-, which will result in same behavior as this.hOjT ubeubah_jubeubj)r }r (hNX:samp:`(branch={BRANCH}, revision=None, changes=None, patch=None)` This builds the most recent code on the given *BRANCH*. Again, this is generally triggered by a user request or :class:`Periodic` build. hOj hZh]h_jha}r (hc]hd]he]hf]hi]uhkMhlhhm]r (j)r }r (hNXB:samp:`(branch={BRANCH}, revision=None, changes=None, patch=None)`r hOj hZh]h_jha}r (hc]hd]he]hf]hi]uhkMhm]r h)r }r (hNUha}r (hf]he]hc]hd]r Xsampr aUrolej hi]uhOj hm]r (hvX(branch=r r }r (hNX(branch=hOj ubh)r }r (hNXBRANCHha}r (hc]hd]he]hf]hi]uhOj hm]r hvXBRANCHr r }r (hNUhOj ubah_hubhvX*, revision=None, changes=None, patch=None)r r }r (hNX*, revision=None, changes=None, patch=None)hOj ubeh_hubaubj)r }r (hNUha}r (hc]hd]he]hf]hi]uhOj hm]r hz)r }r (hNXThis builds the most recent code on the given *BRANCH*. Again, this is generally triggered by a user request or :class:`Periodic` build.hOj hZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMhm]r (hvX.This builds the most recent code on the given r r }r (hNX.This builds the most recent code on the given hOj ubh)r }r (hNX*BRANCH*ha}r (hc]hd]he]hf]hi]uhOj hm]r hvXBRANCHr r }r (hNUhOj ubah_hubhvX:. Again, this is generally triggered by a user request or r r }r (hNX:. Again, this is generally triggered by a user request or hOj ubj)r }r (hNX:class:`Periodic`r hOj hZh]h_jha}r (UreftypeXclassjjXPeriodicU refdomainXpyr hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r }r (hNj ha}r (hc]hd]r (jj Xpy-classr ehe]hf]hi]uhOj hm]r hvXPeriodicr r }r (hNUhOj ubah_hubaubhvX build.r r }r (hNX build.hOj ubeubah_jubeubj)r }r (hNX:samp:`(revision={REV}, changes=None, patch=({LEVEL}, {DIFF}, {SUBDIR_ROOT}))` This checks out the tree at the given revision *REV*, then applies a patch (using ``patch -pLEVEL (hNX*REV*ha}r? (hc]hd]he]hf]hi]uhOj6 hm]r@ hvXREVrA rB }rC (hNUhOj= ubah_hubhvX, then applies a patch (using rD rE }rF (hNX, then applies a patch (using hOj6 ubh)rG }rH (hNX``patch -pLEVEL }r?(hNX:class:`BuildRequest`r@hOj hZh]h_jha}rA(UreftypeXclassjjX BuildRequestU refdomainXpyrBhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rCh)rD}rE(hNj@ha}rF(hc]hd]rG(jjBXpy-classrHehe]hf]hi]uhOj>hm]rIhvX BuildRequestrJrK}rL(hNUhOjDubah_hubaubhvXPs are prioritized from oldest to newest, so when a buildslave becomes free, the rMrN}rO(hNXQ\s are prioritized from oldest to newest, so when a buildslave becomes free, the hOj ubj)rP}rQ(hNX:class:`Builder`rRhOj hZh]h_jha}rS(UreftypeXclassjjXBuilderU refdomainXpyrThf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rUh)rV}rW(hNjRha}rX(hc]hd]rY(jjTXpy-classrZehe]hf]hi]uhOjPhm]r[hvXBuilderr\r]}r^(hNUhOjVubah_hubaubhvX with the oldest r_r`}ra(hNX with the oldest hOj ubj)rb}rc(hNX:class:`BuildRequest`rdhOj hZh]h_jha}re(UreftypeXclassjjX BuildRequestU refdomainXpyrfhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rgh)rh}ri(hNjdha}rj(hc]hd]rk(jjfXpy-classrlehe]hf]hi]uhOjbhm]rmhvX BuildRequestrnro}rp(hNUhOjhubah_hubaubhvX is run.rqrr}rs(hNX is run.hOj ubeubhz)rt}ru(hNXThe :class:`BuildRequest` contains one :class:`SourceStamp` specification per codebase. The actual process of running the build (the series of :class:`Step`\s that will be executed) is implemented by the :class:`Build` object. In the future this might be changed, to have the :class:`Build` define *what* gets built, and a separate :class:`BuildProcess` (provided by the Builder) to define *how* it gets built.hOj hZh]h_h~ha}rv(hc]hd]he]hf]hi]uhkMhlhhm]rw(hvXThe rxry}rz(hNXThe hOjtubj)r{}r|(hNX:class:`BuildRequest`r}hOjthZh]h_jha}r~(UreftypeXclassjjX BuildRequestU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNj}ha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOj{hm]rhvX BuildRequestrr}r(hNUhOjubah_hubaubhvX contains one rr}r(hNX contains one hOjtubj)r}r(hNX:class:`SourceStamp`rhOjthZh]h_jha}r(UreftypeXclassjjX SourceStampU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX SourceStamprr}r(hNUhOjubah_hubaubhvXT specification per codebase. The actual process of running the build (the series of rr}r(hNXT specification per codebase. The actual process of running the build (the series of hOjtubj)r}r(hNX :class:`Step`rhOjthZh]h_jha}r(UreftypeXclassjjXStepU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXSteprr}r(hNUhOjubah_hubaubhvX/s that will be executed) is implemented by the rr}r(hNX0\s that will be executed) is implemented by the hOjtubj)r}r(hNX:class:`Build`rhOjthZh]h_jha}r(UreftypeXclassjjXBuildU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuildrr}r(hNUhOjubah_hubaubhvX: object. In the future this might be changed, to have the rr}r(hNX: object. In the future this might be changed, to have the hOjtubj)r}r(hNX:class:`Build`rhOjthZh]h_jha}r(UreftypeXclassjjXBuildU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuildrr}r(hNUhOjubah_hubaubhvX define rr}r(hNX define hOjtubh)r}r(hNX*what*ha}r(hc]hd]he]hf]hi]uhOjthm]rhvXwhatrr}r(hNUhOjubah_hubhvX gets built, and a separate rr}r(hNX gets built, and a separate hOjtubj)r}r(hNX:class:`BuildProcess`rhOjthZh]h_jha}r(UreftypeXclassjjX BuildProcessU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX BuildProcessrr}r(hNUhOjubah_hubaubhvX% (provided by the Builder) to define rr}r(hNX% (provided by the Builder) to define hOjtubh)r}r(hNX*how*ha}r(hc]hd]he]hf]hi]uhOjthm]rhvXhowrr}r(hNUhOjubah_hubhvX it gets built.rr}r(hNX it gets built.hOjtubeubhz)r}r(hNXThe :class:`BuildRequest` may be mergeable with other compatible :class:`BuildRequest`\s. Builds that are triggered by incoming :class:`Change`\s will generally be mergeable. Builds that are triggered by user requests are generally not, unless they are multiple requests to build the *latest sources* of the same branch. A merge of buildrequests is performed per codebase, thus on changes having the same codebase.hOj hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXThe rr}r(hNXThe hOjubj)r}r(hNX:class:`BuildRequest`rhOjhZh]h_jha}r(UreftypeXclassjjX BuildRequestU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r (hNjha}r (hc]hd]r (jjXpy-classr ehe]hf]hi]uhOjhm]r hvX BuildRequestrr}r(hNUhOjubah_hubaubhvX( may be mergeable with other compatible rr}r(hNX( may be mergeable with other compatible hOjubj)r}r(hNX:class:`BuildRequest`rhOjhZh]h_jha}r(UreftypeXclassjjX BuildRequestU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX BuildRequestr r!}r"(hNUhOjubah_hubaubhvX)s. Builds that are triggered by incoming r#r$}r%(hNX*\s. Builds that are triggered by incoming hOjubj)r&}r'(hNX:class:`Change`r(hOjhZh]h_jha}r)(UreftypeXclassjjXChangeU refdomainXpyr*hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r+h)r,}r-(hNj(ha}r.(hc]hd]r/(jj*Xpy-classr0ehe]hf]hi]uhOj&hm]r1hvXChanger2r3}r4(hNUhOj,ubah_hubaubhvXs will generally be mergeable. Builds that are triggered by user requests are generally not, unless they are multiple requests to build the r5r6}r7(hNX\s will generally be mergeable. Builds that are triggered by user requests are generally not, unless they are multiple requests to build the hOjubh)r8}r9(hNX*latest sources*ha}r:(hc]hd]he]hf]hi]uhOjhm]r;hvXlatest sourcesr<r=}r>(hNUhOj8ubah_hubhvXr of the same branch. A merge of buildrequests is performed per codebase, thus on changes having the same codebase.r?r@}rA(hNXr of the same branch. A merge of buildrequests is performed per codebase, thus on changes having the same codebase.hOjubeubh)rB}rC(hNX .. _Builder:hOj hZh]h_hha}rD(hf]he]hc]hd]hi]hUbuilderrEuhkMhlhhm]ubeubhP)rF}rG(hNUhOhXhZh]h}rHh>jBsh_h`ha}rI(hc]hd]he]hf]rJ(UbuildersrKjEehi]rL(hh>euhkMhlhh}rMjEjBshm]rN(ho)rO}rP(hNXBuildersrQhOjFhZh]h_hsha}rR(hc]hd]he]hf]hi]uhkMhlhhm]rShvXBuildersrTrU}rV(hNjQhOjOubaubhz)rW}rX(hNXThe Buildmaster runs a collection of :class:`Builder`\s, each of which handles a single type of build (e.g. full versus quick), on one or more build slaves. :class:`Builder`\s serve as a kind of queue for a particular type of build. Each :class:`Builder` gets a separate column in the waterfall display. In general, each :class:`Builder` runs independently (although various kinds of interlocks can cause one :class:`Builder` to have an effect on another).hOjFhZh]h_h~ha}rY(hc]hd]he]hf]hi]uhkMhlhhm]rZ(hvX%The Buildmaster runs a collection of r[r\}r](hNX%The Buildmaster runs a collection of hOjWubj)r^}r_(hNX:class:`Builder`r`hOjWhZh]h_jha}ra(UreftypeXclassjjXBuilderU refdomainXpyrbhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rch)rd}re(hNj`ha}rf(hc]hd]rg(jjbXpy-classrhehe]hf]hi]uhOj^hm]rihvXBuilderrjrk}rl(hNUhOjdubah_hubaubhvXis, each of which handles a single type of build (e.g. full versus quick), on one or more build slaves. rmrn}ro(hNXj\s, each of which handles a single type of build (e.g. full versus quick), on one or more build slaves. hOjWubj)rp}rq(hNX:class:`Builder`rrhOjWhZh]h_jha}rs(UreftypeXclassjjXBuilderU refdomainXpyrthf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]ruh)rv}rw(hNjrha}rx(hc]hd]ry(jjtXpy-classrzehe]hf]hi]uhOjphm]r{hvXBuilderr|r}}r~(hNUhOjvubah_hubaubhvXAs serve as a kind of queue for a particular type of build. Each rr}r(hNXB\s serve as a kind of queue for a particular type of build. Each hOjWubj)r}r(hNX:class:`Builder`rhOjWhZh]h_jha}r(UreftypeXclassjjXBuilderU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvXC gets a separate column in the waterfall display. In general, each rr}r(hNXC gets a separate column in the waterfall display. In general, each hOjWubj)r}r(hNX:class:`Builder`rhOjWhZh]h_jha}r(UreftypeXclassjjXBuilderU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvXH runs independently (although various kinds of interlocks can cause one rr}r(hNXH runs independently (although various kinds of interlocks can cause one hOjWubj)r}r(hNX:class:`Builder`rhOjWhZh]h_jha}r(UreftypeXclassjjXBuilderU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvX to have an effect on another).rr}r(hNX to have an effect on another).hOjWubeubhz)r}r(hNXzEach builder is a long-lived object which controls a sequence of :class:`Build`\s. Each :class:`Builder` is created when the config file is first parsed, and lives forever (or rather until it is removed from the config file). It mediates the connections to the buildslaves that do all the work, and is responsible for creating the :class:`Build` objects - :ref:`Concepts-Build`.hOjFhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXAEach builder is a long-lived object which controls a sequence of rr}r(hNXAEach builder is a long-lived object which controls a sequence of hOjubj)r}r(hNX:class:`Build`rhOjhZh]h_jha}r(UreftypeXclassjjXBuildU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuildrr}r(hNUhOjubah_hubaubhvXs. Each rr}r(hNX \s. Each hOjubj)r}r(hNX:class:`Builder`rhOjhZh]h_jha}r(UreftypeXclassjjXBuilderU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvX is created when the config file is first parsed, and lives forever (or rather until it is removed from the config file). It mediates the connections to the buildslaves that do all the work, and is responsible for creating the rr}r(hNX is created when the config file is first parsed, and lives forever (or rather until it is removed from the config file). It mediates the connections to the buildslaves that do all the work, and is responsible for creating the hOjubj)r}r(hNX:class:`Build`rhOjhZh]h_jha}r(UreftypeXclassjjXBuildU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuildrr}r(hNUhOjubah_hubaubhvX objects - rr}r(hNX objects - hOjubj)r}r(hNX:ref:`Concepts-Build`rhOjhZh]h_jha}r(UreftypeXrefjjXconcepts-buildU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvXConcepts-Buildrr}r(hNUhOjubah_hubaubhvX.r}r(hNX.hOjubeubhz)r}r(hNXEach builder gets a unique name, and the path name of a directory where it gets to do all its work (there is a buildmaster-side directory for keeping status information, as well as a buildslave-side directory where the actual checkout/compile/test commands are executed).rhOjFhZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMhlhhm]r hvXEach builder gets a unique name, and the path name of a directory where it gets to do all its work (there is a buildmaster-side directory for keeping status information, as well as a buildslave-side directory where the actual checkout/compile/test commands are executed).r r }r (hNjhOjubaubh)r}r(hNX.. _Concepts-Build-Factories:hOjFhZh]h_hha}r(hf]he]hc]hd]hi]hUconcepts-build-factoriesruhkMhlhhm]ubeubhP)r}r(hNUhOhXhZh]h}rhjsh_h`ha}r(hc]hd]he]hf]r(Ubuild-factoriesrjehi]r(h.heuhkMhlhh}rjjshm]r(ho)r}r(hNXBuild FactoriesrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXBuild Factoriesr r!}r"(hNjhOjubaubhz)r#}r$(hNX.A builder also has a :class:`BuildFactory`, which is responsible for creating new :class:`Build` instances: because the :class:`Build` instance is what actually performs each build, choosing the :class:`BuildFactory` is the way to specify what happens each time a build is done (:ref:`Concepts-Build`).hOjhZh]h_h~ha}r%(hc]hd]he]hf]hi]uhkMhlhhm]r&(hvXA builder also has a r'r(}r)(hNXA builder also has a hOj#ubj)r*}r+(hNX:class:`BuildFactory`r,hOj#hZh]h_jha}r-(UreftypeXclassjjX BuildFactoryU refdomainXpyr.hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r/h)r0}r1(hNj,ha}r2(hc]hd]r3(jj.Xpy-classr4ehe]hf]hi]uhOj*hm]r5hvX BuildFactoryr6r7}r8(hNUhOj0ubah_hubaubhvX(, which is responsible for creating new r9r:}r;(hNX(, which is responsible for creating new hOj#ubj)r<}r=(hNX:class:`Build`r>hOj#hZh]h_jha}r?(UreftypeXclassjjXBuildU refdomainXpyr@hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rAh)rB}rC(hNj>ha}rD(hc]hd]rE(jj@Xpy-classrFehe]hf]hi]uhOj<hm]rGhvXBuildrHrI}rJ(hNUhOjBubah_hubaubhvX instances: because the rKrL}rM(hNX instances: because the hOj#ubj)rN}rO(hNX:class:`Build`rPhOj#hZh]h_jha}rQ(UreftypeXclassjjXBuildU refdomainXpyrRhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rSh)rT}rU(hNjPha}rV(hc]hd]rW(jjRXpy-classrXehe]hf]hi]uhOjNhm]rYhvXBuildrZr[}r\(hNUhOjTubah_hubaubhvX= instance is what actually performs each build, choosing the r]r^}r_(hNX= instance is what actually performs each build, choosing the hOj#ubj)r`}ra(hNX:class:`BuildFactory`rbhOj#hZh]h_jha}rc(UreftypeXclassjjX BuildFactoryU refdomainXpyrdhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]reh)rf}rg(hNjbha}rh(hc]hd]ri(jjdXpy-classrjehe]hf]hi]uhOj`hm]rkhvX BuildFactoryrlrm}rn(hNUhOjfubah_hubaubhvX? is the way to specify what happens each time a build is done (rorp}rq(hNX? is the way to specify what happens each time a build is done (hOj#ubj)rr}rs(hNX:ref:`Concepts-Build`rthOj#hZh]h_jha}ru(UreftypeXrefjjXconcepts-buildU refdomainXstdrvhf]he]U refexplicithc]hd]hi]jjuhkMhm]rwh)rx}ry(hNjtha}rz(hc]hd]r{(jjvXstd-refr|ehe]hf]hi]uhOjrhm]r}hvXConcepts-Buildr~r}r(hNUhOjxubah_hubaubhvX).rr}r(hNX).hOj#ubeubh)r}r(hNX.. _Concepts-Build-Slaves:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hUconcepts-build-slavesruhkMhlhhm]ubeubhP)r}r(hNUhOhXhZh]h}rhDjsh_h`ha}r(hc]hd]he]hf]r(U build-slavesrjehi]r(h hDeuhkMhlhh}rjjshm]r(ho)r}r(hNX Build SlavesrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvX Build Slavesrr}r(hNjhOjubaubhz)r}r(hNXEach builder is associated with one of more :class:`BuildSlave`\s. A builder which is used to perform Mac OS X builds (as opposed to Linux or Solaris builds) should naturally be associated with a Mac buildslave.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvX,Each builder is associated with one of more rr}r(hNX,Each builder is associated with one of more hOjubj)r}r(hNX:class:`BuildSlave`rhOjhZh]h_jha}r(UreftypeXclassjjX BuildSlaveU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX BuildSlaverr}r(hNUhOjubah_hubaubhvXs. A builder which is used to perform Mac OS X builds (as opposed to Linux or Solaris builds) should naturally be associated with a Mac buildslave.rr}r(hNX\s. A builder which is used to perform Mac OS X builds (as opposed to Linux or Solaris builds) should naturally be associated with a Mac buildslave.hOjubeubhz)r}r(hNXyIf multiple buildslaves are available for any given builder, you will have some measure of redundancy: in case one slave goes offline, the others can still keep the :class:`Builder` working. In addition, multiple buildslaves will allow multiple simultaneous builds for the same :class:`Builder`, which might be useful if you have a lot of forced or ``try`` builds taking place.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXIf multiple buildslaves are available for any given builder, you will have some measure of redundancy: in case one slave goes offline, the others can still keep the rr}r(hNXIf multiple buildslaves are available for any given builder, you will have some measure of redundancy: in case one slave goes offline, the others can still keep the hOjubj)r}r(hNX:class:`Builder`rhOjhZh]h_jha}r(UreftypeXclassjjXBuilderU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvXa working. In addition, multiple buildslaves will allow multiple simultaneous builds for the same rr}r(hNXa working. In addition, multiple buildslaves will allow multiple simultaneous builds for the same hOjubj)r}r(hNX:class:`Builder`rhOjhZh]h_jha}r(UreftypeXclassjjXBuilderU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvX7, which might be useful if you have a lot of forced or rr}r(hNX7, which might be useful if you have a lot of forced or hOjubh)r}r(hNX``try``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXtryrr}r(hNUhOjubah_hubhvX builds taking place.rr}r(hNX builds taking place.hOjubeubhz)r}r(hNXIf you use this feature, it is important to make sure that the buildslaves are all, in fact, capable of running the given build. The slave hosts should be configured similarly, otherwise you will spend a lot of time trying (unsuccessfully) to reproduce a failure that only occurs on some of the buildslaves and not the others. Different platforms, operating systems, versions of major programs or libraries, all these things mean you should use separate Builders.rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXIf you use this feature, it is important to make sure that the buildslaves are all, in fact, capable of running the given build. The slave hosts should be configured similarly, otherwise you will spend a lot of time trying (unsuccessfully) to reproduce a failure that only occurs on some of the buildslaves and not the others. Different platforms, operating systems, versions of major programs or libraries, all these things mean you should use separate Builders.rr}r(hNjhOjubaubh)r}r(hNX.. _Concepts-Build:hOjhZh]h_hha}r(hf]he]hc]hd]hi]hUconcepts-buildruhkM hlhhm]ubeubhP)r}r(hNUhOhXhZh]h}rhjsh_h`ha}r(hc]hd]he]hf]r(Ubuildsrjehi]r(h heuhkMhlhh}rjjshm]r(ho)r}r(hNXBuildsrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXBuildsrr}r(hNjhOjubaubhz)r}r(hNXA build is a single compile or test run of a particular version of the source code, and is comprised of a series of steps. It is ultimately up to you what constitutes a build, but for compiled software it is generally the checkout, configure, make, and make check sequence. For interpreted projects like Python modules, a build is generally a checkout followed by an invocation of the bundled test suite.rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXA build is a single compile or test run of a particular version of the source code, and is comprised of a series of steps. It is ultimately up to you what constitutes a build, but for compiled software it is generally the checkout, configure, make, and make check sequence. For interpreted projects like Python modules, a build is generally a checkout followed by an invocation of the bundled test suite.r r }r (hNjhOjubaubhz)r }r (hNXA :class:`BuildFactory` describes the steps a build will perform. The builder which starts a build uses its configured build factory to determine the build's steps.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXA rr}r(hNXA hOj ubj)r}r(hNX:class:`BuildFactory`rhOj hZh]h_jha}r(UreftypeXclassjjX BuildFactoryU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX BuildFactoryrr }r!(hNUhOjubah_hubaubhvX describes the steps a build will perform. The builder which starts a build uses its configured build factory to determine the build's steps.r"r#}r$(hNX describes the steps a build will perform. The builder which starts a build uses its configured build factory to determine the build's steps.hOj ubeubh)r%}r&(hNX.. _Concepts-Users:hOjhZh]h_hha}r'(hf]he]hc]hd]hi]hUconcepts-usersr(uhkMhlhhm]ubeubhVhP)r)}r*(hNUhOhXhZh]h}r+h&h)r,}r-(hNX.. _Build-Properties:hOhP)r.}r/(hNUhOhVhZh]h}r0h?h)r1}r2(hNX.. _Live-Status-Clients:hOhP)r3}r4(hNUhOhVhZh]h}r5h(hNUhOhVhZh]h}r?hh)r@}rA(hNX.. _Doing-Things-With-Users:hOhP)rB}rC(hNUhOhThZh]h_h`ha}rD(hc]hd]he]hf]rEUusesrFahi]rGh/auhkMkhlhhm]rH(ho)rI}rJ(hNXUsesrKhOjBhZh]h_hsha}rL(hc]hd]he]hf]hi]uhkMkhlhhm]rMhvXUsesrNrO}rP(hNjKhOjIubaubhz)rQ}rR(hNXCorrelating the various bits and pieces that Buildbot views as users also means that one attribute of a user can be translated into another. This provides a more complete view of users throughout Buildbot.rShOjBhZh]h_h~ha}rT(hc]hd]he]hf]hi]uhkMmhlhhm]rUhvXCorrelating the various bits and pieces that Buildbot views as users also means that one attribute of a user can be translated into another. This provides a more complete view of users throughout Buildbot.rVrW}rX(hNjShOjQubaubhz)rY}rZ(hNXOne such use is being able to find email addresses based on a set of Builds to notify users through the ``MailNotifier``. This process is explained more clearly in :ref:`Email-Addresses`.hOjBhZh]h_h~ha}r[(hc]hd]he]hf]hi]uhkMqhlhhm]r\(hvXhOne such use is being able to find email addresses based on a set of Builds to notify users through the r]r^}r_(hNXhOne such use is being able to find email addresses based on a set of Builds to notify users through the hOjYubh)r`}ra(hNX``MailNotifier``ha}rb(hc]hd]he]hf]hi]uhOjYhm]rchvX MailNotifierrdre}rf(hNUhOj`ubah_hubhvX,. This process is explained more clearly in rgrh}ri(hNX,. This process is explained more clearly in hOjYubj)rj}rk(hNX:ref:`Email-Addresses`rlhOjYhZh]h_jha}rm(UreftypeXrefjjXemail-addressesU refdomainXstdrnhf]he]U refexplicithc]hd]hi]jjuhkMqhm]roh)rp}rq(hNjlha}rr(hc]hd]rs(jjnXstd-refrtehe]hf]hi]uhOjjhm]ruhvXEmail-Addressesrvrw}rx(hNUhOjpubah_hubaubhvX.ry}rz(hNX.hOjYubeubhz)r{}r|(hNXUAnother way to utilize `User Objects` is through `UsersAuth` for web authentication (see :bb:status:`WebStatus`). To use `UsersAuth`, you need to set a `bb_username` and `bb_password` via the ``buildbot user`` command line tool to check against. The password will be encrypted before storing in the database along with other user attributes.hOjBhZh]h_h~ha}r}(hc]hd]he]hf]hi]uhkMuhlhhm]r~(hvXAnother way to utilize rr}r(hNXAnother way to utilize hOj{ubj)r}r(hNX`User Objects`ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX User Objectsrr}r(hNUhOjubah_jubhvX is through rr}r(hNX is through hOj{ubj)r}r(hNX `UsersAuth`ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX UsersAuthrr}r(hNUhOjubah_jubhvX for web authentication (see rr}r(hNX for web authentication (see hOj{ubj)r}r(hNX:bb:status:`WebStatus`rhOj{hZh]h_jha}r(UreftypeXstatusjjX WebStatusU refdomainXbbrhf]he]U refexplicithc]hd]hi]jjuhkMuhm]rh)r}r(hNjha}r(hc]hd]r(jjX bb-statusrehe]hf]hi]uhOjhm]rhvX WebStatusrr}r(hNUhOjubah_hubaubhvX ). To use rr}r(hNX ). To use hOj{ubj)r}r(hNX `UsersAuth`ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX UsersAuthrr}r(hNUhOjubah_jubhvX, you need to set a rr}r(hNX, you need to set a hOj{ubj)r}r(hNX `bb_username`ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX bb_usernamerr}r(hNUhOjubah_jubhvX and rr}r(hNX and hOj{ubj)r}r(hNX `bb_password`ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX bb_passwordrr}r(hNUhOjubah_jubhvX via the rr}r(hNX via the hOj{ubh)r}r(hNX``buildbot user``ha}r(hc]hd]he]hf]hi]uhOj{hm]rhvX buildbot userrr}r(hNUhOjubah_hubhvX command line tool to check against. The password will be encrypted before storing in the database along with other user attributes.rr}r(hNX command line tool to check against. The password will be encrypted before storing in the database along with other user attributes.hOj{ubeubj@eubhZh]h_hha}r(hf]he]hc]hd]hi]hUdoing-things-with-usersruhkM{hlhhm]ubsh_h`ha}r(hc]hd]he]hf]r(jUid7rehi]r(h6heuhkM~hlhh}rjj@shm]r(ho)r}r(hNXDoing Things With UsersrhOj=hZh]h_hsha}r(hc]hd]he]hf]hi]uhkM~hlhhm]rhvXDoing Things With Usersrr}r(hNjhOjubaubhz)r}r(hNXEach change has a single user who is responsible for it. Most builds have a set of changes: the build generally represents the first time these changes have been built and tested by the Buildbot. The build has a *blamelist* that is the union of the users responsible for all the build's changes. If the build was created by a :ref:`Try-Schedulers` this list will include the submitter of the try job, if known.hOj=hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXEach change has a single user who is responsible for it. Most builds have a set of changes: the build generally represents the first time these changes have been built and tested by the Buildbot. The build has a rr}r(hNXEach change has a single user who is responsible for it. Most builds have a set of changes: the build generally represents the first time these changes have been built and tested by the Buildbot. The build has a hOjubh)r}r(hNX *blamelist*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX blamelistrr}r(hNUhOjubah_hubhvXg that is the union of the users responsible for all the build's changes. If the build was created by a rr}r(hNXg that is the union of the users responsible for all the build's changes. If the build was created by a hOjubj)r}r(hNX:ref:`Try-Schedulers`rhOjhZh]h_jha}r(UreftypeXrefjjXtry-schedulersU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvXTry-Schedulersrr}r(hNUhOjubah_hubaubhvX? this list will include the submitter of the try job, if known.rr}r(hNX? this list will include the submitter of the try job, if known.hOjubeubhz)r}r(hNXThe build provides a list of users who are interested in the build -- the *interested users*. Usually this is equal to the blamelist, but may also be expanded, e.g., to include the current build sherrif or a module's maintainer.hOj=hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXJThe build provides a list of users who are interested in the build -- the rr}r (hNXJThe build provides a list of users who are interested in the build -- the hOjubh)r }r (hNX*interested users*ha}r (hc]hd]he]hf]hi]uhOjhm]r hvXinterested usersrr}r(hNUhOj ubah_hubhvX. Usually this is equal to the blamelist, but may also be expanded, e.g., to include the current build sherrif or a module's maintainer.rr}r(hNX. Usually this is equal to the blamelist, but may also be expanded, e.g., to include the current build sherrif or a module's maintainer.hOjubeubhz)r}r(hNXWIf desired, the buildbot can notify the interested users until the problem is resolved.rhOj=hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXWIf desired, the buildbot can notify the interested users until the problem is resolved.rr}r(hNjhOjubaubj;eubhZh]h_hha}r(hf]he]hc]hd]hi]hUemail-addressesruhkMhlhhm]ubsh_h`ha}r(hc]hd]he]hf]r(jUid8r ehi]r!(h h4euhkMhlhh}r"jj;shm]r#(ho)r$}r%(hNXEmail Addressesr&hOj8hZh]h_hsha}r'(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXEmail Addressesr)r*}r+(hNj&hOj$ubaubhz)r,}r-(hNXZThe :bb:status:`MailNotifier` is a status target which can send email about the results of each build. It accepts a static list of email addresses to which each message should be delivered, but it can also be configured to send mail to the :class:`Build`\'s Interested Users. To do this, it needs a way to convert User names into email addresses.hOj8hZh]h_h~ha}r.(hc]hd]he]hf]hi]uhkMhlhhm]r/(hvXThe r0r1}r2(hNXThe hOj,ubj)r3}r4(hNX:bb:status:`MailNotifier`r5hOj,hZh]h_jha}r6(UreftypeXstatusjjX MailNotifierU refdomainXbbr7hf]he]U refexplicithc]hd]hi]jjuhkMhm]r8h)r9}r:(hNj5ha}r;(hc]hd]r<(jj7X bb-statusr=ehe]hf]hi]uhOj3hm]r>hvX MailNotifierr?r@}rA(hNUhOj9ubah_hubaubhvX is a status target which can send email about the results of each build. It accepts a static list of email addresses to which each message should be delivered, but it can also be configured to send mail to the rBrC}rD(hNX is a status target which can send email about the results of each build. It accepts a static list of email addresses to which each message should be delivered, but it can also be configured to send mail to the hOj,ubj)rE}rF(hNX:class:`Build`rGhOj,hZh]h_jha}rH(UreftypeXclassjjXBuildU refdomainXpyrIhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rJh)rK}rL(hNjGha}rM(hc]hd]rN(jjIXpy-classrOehe]hf]hi]uhOjEhm]rPhvXBuildrQrR}rS(hNUhOjKubah_hubaubhvX['s Interested Users. To do this, it needs a way to convert User names into email addresses.rTrU}rV(hNX\\'s Interested Users. To do this, it needs a way to convert User names into email addresses.hOj,ubeubhz)rW}rX(hNXLFor many VC systems, the User Name is actually an account name on the system which hosts the repository. As such, turning the name into an email address is a simple matter of appending ``@repositoryhost.com``. Some projects use other kinds of mappings (for example the preferred email address may be at ``project.org`` despite the repository host being named ``cvs.project.org``), and some VC systems have full separation between the concept of a user and that of an account on the repository host (like Perforce). Some systems (like Git) put a full contact email address in every change.hOj8hZh]h_h~ha}rY(hc]hd]he]hf]hi]uhkMhlhhm]rZ(hvXFor many VC systems, the User Name is actually an account name on the system which hosts the repository. As such, turning the name into an email address is a simple matter of appending r[r\}r](hNXFor many VC systems, the User Name is actually an account name on the system which hosts the repository. As such, turning the name into an email address is a simple matter of appending hOjWubh)r^}r_(hNX``@repositoryhost.com``ha}r`(hc]hd]he]hf]hi]uhOjWhm]rahvX@repositoryhost.comrbrc}rd(hNUhOj^ubah_hubhvX_. Some projects use other kinds of mappings (for example the preferred email address may be at rerf}rg(hNX_. Some projects use other kinds of mappings (for example the preferred email address may be at hOjWubh)rh}ri(hNX``project.org``ha}rj(hc]hd]he]hf]hi]uhOjWhm]rkhvX project.orgrlrm}rn(hNUhOjhubah_hubhvX) despite the repository host being named rorp}rq(hNX) despite the repository host being named hOjWubh)rr}rs(hNX``cvs.project.org``ha}rt(hc]hd]he]hf]hi]uhOjWhm]ruhvXcvs.project.orgrvrw}rx(hNUhOjrubah_hubhvX), and some VC systems have full separation between the concept of a user and that of an account on the repository host (like Perforce). Some systems (like Git) put a full contact email address in every change.ryrz}r{(hNX), and some VC systems have full separation between the concept of a user and that of an account on the repository host (like Perforce). Some systems (like Git) put a full contact email address in every change.hOjWubeubhz)r|}r}(hNX4To convert these names to addresses, the :class:`MailNotifier` uses an :class:`EmailLookup` object. This provides a :meth:`getAddress` method which accepts a name and (eventually) returns an address. The default :class:`MailNotifier` module provides an :class:`EmailLookup` which simply appends a static string, configurable when the notifier is created. To create more complex behaviors (perhaps using an LDAP lookup, or using ``finger`` on a central host to determine a preferred address for the developer), provide a different object as the ``lookup`` argument.hOj8hZh]h_h~ha}r~(hc]hd]he]hf]hi]uhkMhlhhm]r(hvX)To convert these names to addresses, the rr}r(hNX)To convert these names to addresses, the hOj|ubj)r}r(hNX:class:`MailNotifier`rhOj|hZh]h_jha}r(UreftypeXclassjjX MailNotifierU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX MailNotifierrr}r(hNUhOjubah_hubaubhvX uses an rr}r(hNX uses an hOj|ubj)r}r(hNX:class:`EmailLookup`rhOj|hZh]h_jha}r(UreftypeXclassjjX EmailLookupU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX EmailLookuprr}r(hNUhOjubah_hubaubhvX object. This provides a rr}r(hNX object. This provides a hOj|ubj)r}r(hNX:meth:`getAddress`rhOj|hZh]h_jha}r(UreftypeXmethjjX getAddressU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-methrehe]hf]hi]uhOjhm]rhvX getAddressrr}r(hNUhOjubah_hubaubhvXN method which accepts a name and (eventually) returns an address. The default rr}r(hNXN method which accepts a name and (eventually) returns an address. The default hOj|ubj)r}r(hNX:class:`MailNotifier`rhOj|hZh]h_jha}r(UreftypeXclassjjX MailNotifierU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX MailNotifierrr}r(hNUhOjubah_hubaubhvX module provides an rr}r(hNX module provides an hOj|ubj)r}r(hNX:class:`EmailLookup`rhOj|hZh]h_jha}r(UreftypeXclassjjX EmailLookupU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX EmailLookuprr}r(hNUhOjubah_hubaubhvX which simply appends a static string, configurable when the notifier is created. To create more complex behaviors (perhaps using an LDAP lookup, or using rr}r(hNX which simply appends a static string, configurable when the notifier is created. To create more complex behaviors (perhaps using an LDAP lookup, or using hOj|ubh)r}r(hNX ``finger``ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvXfingerrr}r(hNUhOjubah_hubhvXj on a central host to determine a preferred address for the developer), provide a different object as the rr}r(hNXj on a central host to determine a preferred address for the developer), provide a different object as the hOj|ubh)r}r(hNX ``lookup``ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvXlookuprr}r(hNUhOjubah_hubhvX argument.rr}r(hNX argument.hOj|ubeubhz)r}r(hNXIf an EmailLookup object isn't given to the MailNotifier, the MailNotifier will try to find emails through :ref:`User-Objects`. This will work the same as if an EmailLookup object was used if every user in the Build's Interested Users list has an email in the database for them. If a user whose change led to a Build doesn't have an email attribute, that user will not receive an email. If ``extraRecipients`` is given, those users are still sent mail when the EmailLookup object is not specified.hOj8hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXkIf an EmailLookup object isn't given to the MailNotifier, the MailNotifier will try to find emails through rr}r(hNXkIf an EmailLookup object isn't given to the MailNotifier, the MailNotifier will try to find emails through hOjubj)r}r(hNX:ref:`User-Objects`rhOjhZh]h_jha}r(UreftypeXrefjjX user-objectsU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX User-Objectsrr}r(hNUhOjubah_hubaubhvX. This will work the same as if an EmailLookup object was used if every user in the Build's Interested Users list has an email in the database for them. If a user whose change led to a Build doesn't have an email attribute, that user will not receive an email. If rr}r (hNX. This will work the same as if an EmailLookup object was used if every user in the Build's Interested Users list has an email in the database for them. If a user whose change led to a Build doesn't have an email attribute, that user will not receive an email. If hOjubh)r }r (hNX``extraRecipients``ha}r (hc]hd]he]hf]hi]uhOjhm]r hvXextraRecipientsrr}r(hNUhOj ubah_hubhvXX is given, those users are still sent mail when the EmailLookup object is not specified.rr}r(hNXX is given, those users are still sent mail when the EmailLookup object is not specified.hOjubeubhz)r}r(hNXIn the future, when the Problem mechanism has been set up, the Buildbot will need to send mail to arbitrary Users. It will do this by locating a :class:`MailNotifier`\-like object among all the buildmaster's status targets, and asking it to send messages to various Users. This means the User-to-address mapping only has to be set up once, in your :class:`MailNotifier`, and every email message the buildbot emits will take advantage of it.hOj8hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXIn the future, when the Problem mechanism has been set up, the Buildbot will need to send mail to arbitrary Users. It will do this by locating a rr}r(hNXIn the future, when the Problem mechanism has been set up, the Buildbot will need to send mail to arbitrary Users. It will do this by locating a hOjubj)r}r(hNX:class:`MailNotifier`rhOjhZh]h_jha}r(UreftypeXclassjjX MailNotifierU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r h)r!}r"(hNjha}r#(hc]hd]r$(jjXpy-classr%ehe]hf]hi]uhOjhm]r&hvX MailNotifierr'r(}r)(hNUhOj!ubah_hubaubhvX-like object among all the buildmaster's status targets, and asking it to send messages to various Users. This means the User-to-address mapping only has to be set up once, in your r*r+}r,(hNX\-like object among all the buildmaster's status targets, and asking it to send messages to various Users. This means the User-to-address mapping only has to be set up once, in your hOjubj)r-}r.(hNX:class:`MailNotifier`r/hOjhZh]h_jha}r0(UreftypeXclassjjX MailNotifierU refdomainXpyr1hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r2h)r3}r4(hNj/ha}r5(hc]hd]r6(jj1Xpy-classr7ehe]hf]hi]uhOj-hm]r8hvX MailNotifierr9r:}r;(hNUhOj3ubah_hubaubhvXG, and every email message the buildbot emits will take advantage of it.r<r=}r>(hNXG, and every email message the buildbot emits will take advantage of it.hOjubeubj6eubhZh]h_hha}r?(hf]he]hc]hd]hi]hU irc-nicknamesr@uhkMhlhhm]ubsh_h`ha}rA(hc]hd]he]hf]rB(j@Uid9rCehi]rD(h hhvX^Properties form a simple kind of variable in a build. Some properties are set when the build starts, and properties can be changed as a build progresses -- properties set or changed in one step may be accessed in subsequent steps. Property values can be numbers, strings, lists, or dictionaries - basically, anything that can be represented in JSON.r?r@}rA(hNj<hOj:ubaubhz)rB}rC(hNXpProperties are very flexible, and can be used to implement all manner of functionality. Here are some examples:rDhOj)hZh]h_h~ha}rE(hc]hd]he]hf]hi]uhkMhlhhm]rFhvXpProperties are very flexible, and can be used to implement all manner of functionality. Here are some examples:rGrH}rI(hNjDhOjBubaubhz)rJ}rK(hNXMost Source steps record the revision that they checked out in the ``got_revision`` property. A later step could use this property to specify the name of a fully-built tarball, dropped in an easily-accessible directory for later testing.hOj)hZh]h_h~ha}rL(hc]hd]he]hf]hi]uhkMhlhhm]rM(hvXCMost Source steps record the revision that they checked out in the rNrO}rP(hNXCMost Source steps record the revision that they checked out in the hOjJubh)rQ}rR(hNX``got_revision``ha}rS(hc]hd]he]hf]hi]uhOjJhm]rThvX got_revisionrUrV}rW(hNUhOjQubah_hubhvX property. A later step could use this property to specify the name of a fully-built tarball, dropped in an easily-accessible directory for later testing.rXrY}rZ(hNX property. A later step could use this property to specify the name of a fully-built tarball, dropped in an easily-accessible directory for later testing.hOjJubeubcdocutils.nodes note r[)r\}r](hNXhIn builds with more than one codebase, the ``got_revision`` property is a dictionary, keyed by codebase.r^hOj)hZh]h_Unoter_ha}r`(hc]hd]he]hf]hi]uhkNhlhhm]rahz)rb}rc(hNj^hOj\hZh]h_h~ha}rd(hc]hd]he]hf]hi]uhkMhm]re(hvX+In builds with more than one codebase, the rfrg}rh(hNX+In builds with more than one codebase, the hOjbubh)ri}rj(hNX``got_revision``ha}rk(hc]hd]he]hf]hi]uhOjbhm]rlhvX got_revisionrmrn}ro(hNUhOjiubah_hubhvX- property is a dictionary, keyed by codebase.rprq}rr(hNX- property is a dictionary, keyed by codebase.hOjbubeubaubhz)rs}rt(hNXDSome projects want to perform nightly builds as well as building in response to committed changes. Such a project would run two schedulers, both pointing to the same set of builders, but could provide an ``is_nightly`` property so that steps can distinguish the nightly builds, perhaps to run more resource-intensive tests.hOj)hZh]h_h~ha}ru(hc]hd]he]hf]hi]uhkMhlhhm]rv(hvXSome projects want to perform nightly builds as well as building in response to committed changes. Such a project would run two schedulers, both pointing to the same set of builders, but could provide an rwrx}ry(hNXSome projects want to perform nightly builds as well as building in response to committed changes. Such a project would run two schedulers, both pointing to the same set of builders, but could provide an hOjsubh)rz}r{(hNX``is_nightly``ha}r|(hc]hd]he]hf]hi]uhOjshm]r}hvX is_nightlyr~r}r(hNUhOjzubah_hubhvXi property so that steps can distinguish the nightly builds, perhaps to run more resource-intensive tests.rr}r(hNXi property so that steps can distinguish the nightly builds, perhaps to run more resource-intensive tests.hOjsubeubhz)r}r(hNXSome projects have different build processes on different systems. Rather than create a build factory for each slave, the steps can use buildslave properties to identify the unique aspects of each slave and adapt the build process dynamically.rhOj)hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXSome projects have different build processes on different systems. Rather than create a build factory for each slave, the steps can use buildslave properties to identify the unique aspects of each slave and adapt the build process dynamically.rr}r(hNjhOjubaubh)r}r(hNX.. _Multiple-Codebase-Builds:hOj)hZh]h_hha}r(hf]he]hc]hd]hi]hUmultiple-codebase-buildsruhkMhlhhm]ubeubhP)r}r(hNUhOhXhZh]h}rh(jsh_h`ha}r(hc]hd]he]hf]r(jUid12rehi]r(hh(euhkM hlhh}rjjshm]r(ho)r}r(hNXMultiple-Codebase BuildsrhOjhZh]h_hsha}r(hc]hd]he]hf]hi]uhkM hlhhm]rhvXMultiple-Codebase Buildsrr}r(hNjhOjubaubhz)r}r(hNX What if an end-product is composed of code from several codebases? Changes may arrive from different repositories within the tree-stable-timer period. Buildbot will not only use the source-trees that contain changes but also needs the remaining source-trees to build the complete product.rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM hlhhm]rhvX What if an end-product is composed of code from several codebases? Changes may arrive from different repositories within the tree-stable-timer period. Buildbot will not only use the source-trees that contain changes but also needs the remaining source-trees to build the complete product.rr}r(hNjhOjubaubhz)r}r(hNXFor this reason a :ref:`Scheduler` can be configured to base a build on a set of several source-trees that can (partly) be overridden by the information from incoming :class:`Change`\s.rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXFor this reason a rr}r(hNXFor this reason a hOjubj)r}r(hNX#:ref:`Scheduler`rhOjhZh]h_jha}r(UreftypeXrefjjXscheduling-buildsU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX Schedulerrr}r(hNUhOjubah_hubaubhvX can be configured to base a build on a set of several source-trees that can (partly) be overridden by the information from incoming rr}r(hNX can be configured to base a build on a set of several source-trees that can (partly) be overridden by the information from incoming hOjubj)r}r(hNX:class:`Change`rhOjhZh]h_jha}r(UreftypeXclassjjXChangeU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXChangerr}r(hNUhOjubah_hubaubhvXs.rr}r(hNX\s.hOjubeubhz)r}r(hNXAs described :ref:`above `, the source for each codebase is identified by a source stamp, containing its repository, branch and revision. A full build set will specify a source stamp set describing the source to use for each codebase.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvX As described rr}r(hNX As described hOjubj)r}r(hNX:ref:`above `rhOjhZh]h_jha}r(UreftypeXrefjjX source-stampsU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvXaboverr}r(hNUhOjubah_hubaubhvX, the source for each codebase is identified by a source stamp, containing its repository, branch and revision. A full build set will specify a source stamp set describing the source to use for each codebase.rr}r(hNX, the source for each codebase is identified by a source stamp, containing its repository, branch and revision. A full build set will specify a source stamp set describing the source to use for each codebase.hOjubeubhz)r}r(hNXpConfiguring all of this takes a coordinated approach. A complete multiple repository configuration consists of:rhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXpConfiguring all of this takes a coordinated approach. A complete multiple repository configuration consists of:rr}r(hNjhOjubaubcdocutils.nodes block_quote r)r}r(hNUhOjhZNh_U block_quoterha}r(hc]hd]he]hf]hi]uhkNhlhhm]rcdocutils.nodes bullet_list r)r}r(hNUha}r(UbulletrX-hf]he]hc]hd]hi]uhOjhm]r(cdocutils.nodes list_item r)r}r(hNX a *codebase generator* Every relevant change arriving from a VC must contain a codebase. This is done by a :bb:cfg:`codebaseGenerator` that is defined in the configuration. Most generators examine the repository of a change to determine its codebase, using project-specific rules. ha}r(hc]hd]he]hf]hi]uhOjhm]r(hz)r}r(hNXa *codebase generator*hOjhZh]h_h~ha}r (hc]hd]he]hf]hi]uhkMhm]r (hvXa r r }r (hNXa hOjubh)r}r(hNX*codebase generator*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXcodebase generatorrr}r(hNUhOjubah_hubeubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNXEvery relevant change arriving from a VC must contain a codebase. This is done by a :bb:cfg:`codebaseGenerator` that is defined in the configuration. Most generators examine the repository of a change to determine its codebase, using project-specific rules.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhm]r(hvXTEvery relevant change arriving from a VC must contain a codebase. This is done by a rr}r(hNXTEvery relevant change arriving from a VC must contain a codebase. This is done by a hOjubj)r }r!(hNX:bb:cfg:`codebaseGenerator`r"hOjhZh]h_jha}r#(UreftypeXcfgjjXcodebaseGeneratorU refdomainXbbr$hf]he]U refexplicithc]hd]hi]jjuhkMhm]r%h)r&}r'(hNj"ha}r((hc]hd]r)(jj$Xbb-cfgr*ehe]hf]hi]uhOj hm]r+hvXcodebaseGeneratorr,r-}r.(hNUhOj&ubah_hubaubhvX that is defined in the configuration. Most generators examine the repository of a change to determine its codebase, using project-specific rules.r/r0}r1(hNX that is defined in the configuration. Most generators examine the repository of a change to determine its codebase, using project-specific rules.hOjubeubah_jubeh_U list_itemr2ubj)r3}r4(hNXsome *schedulers* Each :bb:cfg:`scheduler` has to be configured with a set of all required ``codebases`` to build a product. These codebases indicate the set of required source-trees. In order for the scheduler to be able to produce a complete set for each build, the configuration can give a default repository, branch, and revision for each codebase. When a scheduler must generate a source stamp for a codebase that has received no changes, it applies these default values. ha}r5(hc]hd]he]hf]hi]uhOjhm]r6(hz)r7}r8(hNXsome *schedulers*hOj3hZh]h_h~ha}r9(hc]hd]he]hf]hi]uhkMhm]r:(hvXsome r;r<}r=(hNXsome hOj7ubh)r>}r?(hNX *schedulers*ha}r@(hc]hd]he]hf]hi]uhOj7hm]rAhvX schedulersrBrC}rD(hNUhOj>ubah_hubeubj)rE}rF(hNUha}rG(hc]hd]he]hf]hi]uhOj3hm]rHhz)rI}rJ(hNXEach :bb:cfg:`scheduler` has to be configured with a set of all required ``codebases`` to build a product. These codebases indicate the set of required source-trees. In order for the scheduler to be able to produce a complete set for each build, the configuration can give a default repository, branch, and revision for each codebase. When a scheduler must generate a source stamp for a codebase that has received no changes, it applies these default values.hOjEhZh]h_h~ha}rK(hc]hd]he]hf]hi]uhkMhm]rL(hvXEach rMrN}rO(hNXEach hOjIubj)rP}rQ(hNX:bb:cfg:`scheduler`rRhOjIhZh]h_jha}rS(UreftypeXcfgjjX schedulersU refdomainXbbrThf]he]U refexplicithc]hd]hi]jjuhkMhm]rUh)rV}rW(hNjRha}rX(hc]hd]rY(jjTXbb-cfgrZehe]hf]hi]uhOjPhm]r[hvX schedulerr\r]}r^(hNUhOjVubah_hubaubhvX1 has to be configured with a set of all required r_r`}ra(hNX1 has to be configured with a set of all required hOjIubh)rb}rc(hNX ``codebases``ha}rd(hc]hd]he]hf]hi]uhOjIhm]rehvX codebasesrfrg}rh(hNUhOjbubah_hubhvXt to build a product. These codebases indicate the set of required source-trees. In order for the scheduler to be able to produce a complete set for each build, the configuration can give a default repository, branch, and revision for each codebase. When a scheduler must generate a source stamp for a codebase that has received no changes, it applies these default values.rirj}rk(hNXt to build a product. These codebases indicate the set of required source-trees. In order for the scheduler to be able to produce a complete set for each build, the configuration can give a default repository, branch, and revision for each codebase. When a scheduler must generate a source stamp for a codebase that has received no changes, it applies these default values.hOjIubeubah_jubeh_j2ubj)rl}rm(hNXmultiple *source steps* - one for each codebase A :ref:`Builder`'s build factory must include a :ref:`source step` for each codebase. Each of the source steps has a ``codebase`` attribute which is used to select an appropriate source stamp from the source stamp set for a build. This information comes from the arrived changes or from the scheduler's configured default values. .. note:: Each :ref:`source step` has to have its own ``workdir`` set in order for the checkout to be done for each codebase in its own directory. .. note:: Ensure you specify the codebase within your source step's Interpolate() calls (ex. ``http://.../svn/%(src:codebase:branch)s)``. See :ref:`Interpolate` for details. ha}rn(hc]hd]he]hf]hi]uhOjhm]ro(hz)rp}rq(hNX/multiple *source steps* - one for each codebaserrhOjlhZh]h_h~ha}rs(hc]hd]he]hf]hi]uhkM$hm]rt(hvX multiple rurv}rw(hNX multiple hOjpubh)rx}ry(hNX*source steps*ha}rz(hc]hd]he]hf]hi]uhOjphm]r{hvX source stepsr|r}}r~(hNUhOjxubah_hubhvX - one for each codebaserr}r(hNX - one for each codebasehOjpubeubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjlhm]r(hz)r}r(hNXZA :ref:`Builder`'s build factory must include a :ref:`source step` for each codebase. Each of the source steps has a ``codebase`` attribute which is used to select an appropriate source stamp from the source stamp set for a build. This information comes from the arrived changes or from the scheduler's configured default values.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM&hm]r(hvXA rr}r(hNXA hOjubj)r}r(hNX:ref:`Builder`rhOjhZh]h_jha}r(UreftypeXrefjjXbuilderU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkM&hm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvXBuilderrr}r(hNUhOjubah_hubaubhvX 's build factory must include a rr}r(hNX 's build factory must include a hOjubj)r}r(hNX#:ref:`source step`rhOjhZh]h_jha}r(UreftypeXrefjjXsource-checkoutU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkM&hm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX source steprr}r(hNUhOjubah_hubaubhvX3 for each codebase. Each of the source steps has a rr}r(hNX3 for each codebase. Each of the source steps has a hOjubh)r}r(hNX ``codebase``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXcodebaserr}r(hNUhOjubah_hubhvX attribute which is used to select an appropriate source stamp from the source stamp set for a build. This information comes from the arrived changes or from the scheduler's configured default values.rr}r(hNX attribute which is used to select an appropriate source stamp from the source stamp set for a build. This information comes from the arrived changes or from the scheduler's configured default values.hOjubeubj[)r}r(hNXEach :ref:`source step` has to have its own ``workdir`` set in order for the checkout to be done for each codebase in its own directory.rha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNjhOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM,hm]r(hvXEach rr}r(hNXEach hOjubj)r}r(hNX#:ref:`source step`rhOjhZh]h_jha}r(UreftypeXrefjjXsource-checkoutU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkM,hm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX source steprr}r(hNUhOjubah_hubaubhvX has to have its own rr}r(hNX has to have its own hOjubh)r}r(hNX ``workdir``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXworkdirrr}r(hNUhOjubah_hubhvXQ set in order for the checkout to be done for each codebase in its own directory.rr}r(hNXQ set in order for the checkout to be done for each codebase in its own directory.hOjubeubah_j_ubj[)r}r(hNXEnsure you specify the codebase within your source step's Interpolate() calls (ex. ``http://.../svn/%(src:codebase:branch)s)``. See :ref:`Interpolate` for details.ha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNXEnsure you specify the codebase within your source step's Interpolate() calls (ex. ``http://.../svn/%(src:codebase:branch)s)``. See :ref:`Interpolate` for details.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM0hm]r(hvXSEnsure you specify the codebase within your source step's Interpolate() calls (ex. rr}r(hNXSEnsure you specify the codebase within your source step's Interpolate() calls (ex. hOjubh)r}r(hNX+``http://.../svn/%(src:codebase:branch)s)``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX'http://.../svn/%(src:codebase:branch)s)rr}r(hNUhOjubah_hubhvX. See rr}r(hNX. See hOjubj)r}r(hNX:ref:`Interpolate`rhOjhZh]h_jha}r(UreftypeXrefjjX interpolateU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkM0hm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX Interpolaterr}r(hNUhOjubah_hubaubhvX for details.rr}r (hNX for details.hOjubeubah_j_ubeh_jubeh_j2ubeh_U bullet_listr ubaubcdocutils.nodes warning r )r }r (hNXDefining a :bb:cfg:`codebaseGenerator` that returns non-empty (not ``''``) codebases will change the behavior of all the schedulers.rhOjhZh]h_Uwarningrha}r(hc]hd]he]hf]hi]uhkNhlhhm]rhz)r}r(hNjhOj hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM5hm]r(hvX Defining a rr}r(hNX Defining a hOjubj)r}r(hNX:bb:cfg:`codebaseGenerator`rhOjhZh]h_jha}r(UreftypeXcfgjjXcodebaseGeneratorU refdomainXbbrhf]he]U refexplicithc]hd]hi]jjuhkM5hm]rh)r}r (hNjha}r!(hc]hd]r"(jjXbb-cfgr#ehe]hf]hi]uhOjhm]r$hvXcodebaseGeneratorr%r&}r'(hNUhOjubah_hubaubhvX that returns non-empty (not r(r)}r*(hNX that returns non-empty (not hOjubh)r+}r,(hNX``''``ha}r-(hc]hd]he]hf]hi]uhOjhm]r.hvX''r/r0}r1(hNUhOj+ubah_hubhvX;) codebases will change the behavior of all the schedulers.r2r3}r4(hNX;) codebases will change the behavior of all the schedulers.hOjubeubaubeubeubhZh]h}r5hj%sh_h`ha}r6(hc]hd]he]hf]r7(Uusersr8j(ehi]r9(h#heuhkMhlhh}r:j(j%shm]r;(ho)r<}r=(hNXUsersr>hOhVhZh]h_hsha}r?(hc]hd]he]hf]hi]uhkMhlhhm]r@hvXUsersrArB}rC(hNj>hOj<ubaubhz)rD}rE(hNXBuildbot has a somewhat limited awareness of *users*. It assumes the world consists of a set of developers, each of whom can be described by a couple of simple attributes. These developers make changes to the source code, causing builds which may succeed or fail.hOhVhZh]h_h~ha}rF(hc]hd]he]hf]hi]uhkM hlhhm]rG(hvX-Buildbot has a somewhat limited awareness of rHrI}rJ(hNX-Buildbot has a somewhat limited awareness of hOjDubh)rK}rL(hNX*users*ha}rM(hc]hd]he]hf]hi]uhOjDhm]rNhvXusersrOrP}rQ(hNUhOjKubah_hubhvX. It assumes the world consists of a set of developers, each of whom can be described by a couple of simple attributes. These developers make changes to the source code, causing builds which may succeed or fail.rRrS}rT(hNX. It assumes the world consists of a set of developers, each of whom can be described by a couple of simple attributes. These developers make changes to the source code, causing builds which may succeed or fail.hOjDubeubhz)rU}rV(hNXUsers also may have different levels of authorization when issuing Buildbot commands, such as forcing a build from the web interface or from an IRC channel (see :bb:status:`WebStatus` and :bb:status:`IRC`).hOhVhZh]h_h~ha}rW(hc]hd]he]hf]hi]uhkM%hlhhm]rX(hvXUsers also may have different levels of authorization when issuing Buildbot commands, such as forcing a build from the web interface or from an IRC channel (see rYrZ}r[(hNXUsers also may have different levels of authorization when issuing Buildbot commands, such as forcing a build from the web interface or from an IRC channel (see hOjUubj)r\}r](hNX:bb:status:`WebStatus`r^hOjUhZh]h_jha}r_(UreftypeXstatusjjX WebStatusU refdomainXbbr`hf]he]U refexplicithc]hd]hi]jjuhkM%hm]rah)rb}rc(hNj^ha}rd(hc]hd]re(jj`X bb-statusrfehe]hf]hi]uhOj\hm]rghvX WebStatusrhri}rj(hNUhOjbubah_hubaubhvX and rkrl}rm(hNX and hOjUubj)rn}ro(hNX:bb:status:`IRC`rphOjUhZh]h_jha}rq(UreftypeXstatusjjXIRCU refdomainXbbrrhf]he]U refexplicithc]hd]hi]jjuhkM%hm]rsh)rt}ru(hNjpha}rv(hc]hd]rw(jjrX bb-statusrxehe]hf]hi]uhOjnhm]ryhvXIRCrzr{}r|(hNUhOjtubah_hubaubhvX).r}r~}r(hNX).hOjUubeubhz)r}r(hNXXEach developer is primarily known through the source control system. Each :class:`Change` object that arrives is tagged with a :attr:`who` field that typically gives the account name (on the repository machine) of the user responsible for that change. This string is displayed on the HTML status pages and in each :class:`Build`\'s *blamelist*.hOhVhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM)hlhhm]r(hvXJEach developer is primarily known through the source control system. Each rr}r(hNXJEach developer is primarily known through the source control system. Each hOjubj)r}r(hNX:class:`Change`rhOjhZh]h_jha}r(UreftypeXclassjjXChangeU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM)hm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXChangerr}r(hNUhOjubah_hubaubhvX& object that arrives is tagged with a rr}r(hNX& object that arrives is tagged with a hOjubj)r}r(hNX :attr:`who`rhOjhZh]h_jha}r(UreftypeXattrjjXwhoU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM)hm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-attrrehe]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubaubhvX field that typically gives the account name (on the repository machine) of the user responsible for that change. This string is displayed on the HTML status pages and in each rr}r(hNX field that typically gives the account name (on the repository machine) of the user responsible for that change. This string is displayed on the HTML status pages and in each hOjubj)r}r(hNX:class:`Build`rhOjhZh]h_jha}r(UreftypeXclassjjXBuildU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkM)hm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXBuildrr}r(hNUhOjubah_hubaubhvX's rr}r(hNX\'s hOjubh)r}r(hNX *blamelist*ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX blamelistrr}r(hNUhOjubah_hubhvX.r}r(hNX.hOjubeubhz)r}r(hNX(To do more with the User than just refer to them, this username needs to be mapped into an address of some sort. The responsibility for this mapping is left up to the status module which needs the address. In the future, the responsibility for managing users will be transferred to User Objects.rhOhVhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM/hlhhm]rhvX(To do more with the User than just refer to them, this username needs to be mapped into an address of some sort. The responsibility for this mapping is left up to the status module which needs the address. In the future, the responsibility for managing users will be transferred to User Objects.rr}r(hNjhOjubaubhz)r}r(hNXThe ``who`` fields in ``git`` Changes are used to create :ref:`User-Objects`, which allows for more control and flexibility in how Buildbot manages users.hOhVhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM4hlhhm]r(hvXThe rr}r(hNXThe hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX fields in rr}r(hNX fields in hOjubh)r}r(hNX``git``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXgitrr}r(hNUhOjubah_hubhvX Changes are used to create rr}r(hNX Changes are used to create hOjubj)r}r(hNX:ref:`User-Objects`rhOjhZh]h_jha}r(UreftypeXrefjjX user-objectsU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkM4hm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]rhvX User-Objectsrr}r(hNUhOjubah_hubaubhvXN, which allows for more control and flexibility in how Buildbot manages users.rr}r(hNXN, which allows for more control and flexibility in how Buildbot manages users.hOjubeubh)r}r(hNX.. _User-Objects:hOhVhZh]h_hha}r(hf]he]hc]hd]hi]hU user-objectsruhkM7hlhhm]ubhTj=j8j3j.eubhZh]h}rhAjsh_h`ha}r(hc]hd]he]hf]r(jUid5rehi]r(hhAeuhkM:hlhh}rjjshm]r(ho)r}r(hNX User ObjectsrhOhThZh]h_hsha}r (hc]hd]he]hf]hi]uhkM:hlhhm]r hvX User Objectsr r }r (hNjhOjubaubhz)r}r(hNXUser Objects allow Buildbot to better manage users throughout its various interactions with users (see :ref:`Change-Sources` and :ref:`Status-Targets`). The User Objects are stored in the Buildbot database and correlate the various attributes that a user might have: irc, Git, etc.hOhThZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM<hlhhm]r(hvXgUser Objects allow Buildbot to better manage users throughout its various interactions with users (see rr}r(hNXgUser Objects allow Buildbot to better manage users throughout its various interactions with users (see hOjubj)r}r(hNX:ref:`Change-Sources`rhOjhZh]h_jha}r(UreftypeXrefjjXchange-sourcesU refdomainXstdrhf]he]U refexplicithc]hd]hi]jjuhkM<hm]rh)r}r(hNjha}r(hc]hd]r(jjXstd-refrehe]hf]hi]uhOjhm]r hvXChange-Sourcesr!r"}r#(hNUhOjubah_hubaubhvX and r$r%}r&(hNX and hOjubj)r'}r((hNX:ref:`Status-Targets`r)hOjhZh]h_jha}r*(UreftypeXrefjjXstatus-targetsU refdomainXstdr+hf]he]U refexplicithc]hd]hi]jjuhkM<hm]r,h)r-}r.(hNj)ha}r/(hc]hd]r0(jj+Xstd-refr1ehe]hf]hi]uhOj'hm]r2hvXStatus-Targetsr3r4}r5(hNUhOj-ubah_hubaubhvX). The User Objects are stored in the Buildbot database and correlate the various attributes that a user might have: irc, Git, etc.r6r7}r8(hNX). The User Objects are stored in the Buildbot database and correlate the various attributes that a user might have: irc, Git, etc.hOjubeubhQhP)r9}r:(hNUhOhThZh]h_h`ha}r;(hc]hd]he]hf]r<Utoolsr=ahi]r>hauhkMahlhhm]r?(ho)r@}rA(hNXToolsrBhOj9hZh]h_hsha}rC(hc]hd]he]hf]hi]uhkMahlhhm]rDhvXToolsrErF}rG(hNjBhOj@ubaubhz)rH}rI(hNXFor managing users manually, use the ``buildbot user`` command, which allows you to add, remove, update, and show various attributes of users in the Buildbot database (see :ref:`Command-line-Tool`).hOj9hZh]h_h~ha}rJ(hc]hd]he]hf]hi]uhkMchlhhm]rK(hvX%For managing users manually, use the rLrM}rN(hNX%For managing users manually, use the hOjHubh)rO}rP(hNX``buildbot user``ha}rQ(hc]hd]he]hf]hi]uhOjHhm]rRhvX buildbot userrSrT}rU(hNUhOjOubah_hubhvXv command, which allows you to add, remove, update, and show various attributes of users in the Buildbot database (see rVrW}rX(hNXv command, which allows you to add, remove, update, and show various attributes of users in the Buildbot database (see hOjHubj)rY}rZ(hNX:ref:`Command-line-Tool`r[hOjHhZh]h_jha}r\(UreftypeXrefjjXcommand-line-toolU refdomainXstdr]hf]he]U refexplicithc]hd]hi]jjuhkMchm]r^h)r_}r`(hNj[ha}ra(hc]hd]rb(jj]Xstd-refrcehe]hf]hi]uhOjYhm]rdhvXCommand-line-Toolrerf}rg(hNUhOj_ubah_hubaubhvX).rhri}rj(hNX).hOjHubeubhz)rk}rl(hNXsTo show all of the users in the database in a more pretty manner, use the users page in the :bb:Status:`WebStatus`.hOj9hZh]h_h~ha}rm(hc]hd]he]hf]hi]uhkMghlhhm]rn(hvX\To show all of the users in the database in a more pretty manner, use the users page in the rorp}rq(hNX\To show all of the users in the database in a more pretty manner, use the users page in the hOjkubj)rr}rs(hNX:bb:Status:`WebStatus`rthOjkhZh]h_jha}ru(UreftypeXstatusjjX WebStatusU refdomainXbbrvhf]he]U refexplicithc]hd]hi]jjuhkMghm]rwh)rx}ry(hNjtha}rz(hc]hd]r{(jjvX bb-statusr|ehe]hf]hi]uhOjrhm]r}hvX WebStatusr~r}r(hNUhOjxubah_hubaubhvX.r}r(hNX.hOjkubeubeubjBeubhZh]h_h`ha}r(hc]rjOahd]he]hf]rUid6rahi]uhkMBhlhhm]r(ho)r}r(hNXChangesrhOhQhZh]h_hsha}r(hc]hd]he]hf]hi]uhkMBhlhhm]rhvXChangesrr}r(hNjhOjubaubhz)r}r(hNXIncoming Changes all have a ``who`` attribute attached to them that specifies which developer is responsible for that Change. When a Change is first rendered, the ``who`` attribute is parsed and added to the database if it doesn't exist or checked against an existing user. The ``who`` attribute is formatted in different ways depending on the version control system that the Change came from.hOhQhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMDhlhhm]r(hvXIncoming Changes all have a rr}r(hNXIncoming Changes all have a hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX attribute attached to them that specifies which developer is responsible for that Change. When a Change is first rendered, the rr}r(hNX attribute attached to them that specifies which developer is responsible for that Change. When a Change is first rendered, the hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvXl attribute is parsed and added to the database if it doesn't exist or checked against an existing user. The rr}r(hNXl attribute is parsed and added to the database if it doesn't exist or checked against an existing user. The hOjubh)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvXl attribute is formatted in different ways depending on the version control system that the Change came from.rr}r(hNXl attribute is formatted in different ways depending on the version control system that the Change came from.hOjubeubj)r}r(hNUhOhQhZh]h_jha}r(hc]hd]he]hf]hi]uhkNhlhhm]r(j)r}r(hNX@``git`` ``who`` attributes take the form ``Full Name ``. hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMLhm]r(j)r}r(hNX``git``rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMLhm]rh)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXgitrr}r(hNUhOjubah_hubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX7``who`` attributes take the form ``Full Name ``.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMLhm]r(h)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX attributes take the form rr}r(hNX attributes take the form hOjubh)r}r(hNX``Full Name ``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXFull Name rr}r(hNUhOjubah_hubhvX.r}r(hNX.hOjubeubah_jubeubj)r}r(hNX9``svn`` ``who`` attributes are of the form ``Username``. hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMOhlhhm]r(j)r}r(hNX``svn``rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMOhm]rh)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXsvnrr}r(hNUhOjubah_hubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNX0``who`` attributes are of the form ``Username``.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMOhm]r(h)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX attributes are of the form rr}r(hNX attributes are of the form hOjubh)r}r(hNX ``Username``ha}r(hc]hd]he]hf]hi]uhOjhm]r hvXUsernamer r }r (hNUhOjubah_hubhvX.r }r(hNX.hOjubeubah_jubeubj)r}r(hNX``hg`` ``who`` attributes are free-form strings, but usually adhere to similar conventions as ``git`` attributes (``Full Name ``). hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMShlhhm]r(j)r}r(hNX``hg``rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMShm]rh)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXhgrr}r(hNUhOjubah_hubaubj)r}r (hNUha}r!(hc]hd]he]hf]hi]uhOjhm]r"hz)r#}r$(hNX``who`` attributes are free-form strings, but usually adhere to similar conventions as ``git`` attributes (``Full Name ``).hOjhZh]h_h~ha}r%(hc]hd]he]hf]hi]uhkMRhm]r&(h)r'}r((hNX``who``ha}r)(hc]hd]he]hf]hi]uhOj#hm]r*hvXwhor+r,}r-(hNUhOj'ubah_hubhvXP attributes are free-form strings, but usually adhere to similar conventions as r.r/}r0(hNXP attributes are free-form strings, but usually adhere to similar conventions as hOj#ubh)r1}r2(hNX``git``ha}r3(hc]hd]he]hf]hi]uhOj#hm]r4hvXgitr5r6}r7(hNUhOj1ubah_hubhvX attributes (r8r9}r:(hNX attributes (hOj#ubh)r;}r<(hNX``Full Name ``ha}r=(hc]hd]he]hf]hi]uhOj#hm]r>hvXFull Name r?r@}rA(hNUhOj;ubah_hubhvX).rBrC}rD(hNX).hOj#ubeubah_jubeubj)rE}rF(hNX9``cvs`` ``who`` attributes are of the form ``Username``. hOjhZh]h_jha}rG(hc]hd]he]hf]hi]uhkMVhlhhm]rH(j)rI}rJ(hNX``cvs``rKhOjEhZh]h_jha}rL(hc]hd]he]hf]hi]uhkMVhm]rMh)rN}rO(hNjKha}rP(hc]hd]he]hf]hi]uhOjIhm]rQhvXcvsrRrS}rT(hNUhOjNubah_hubaubj)rU}rV(hNUha}rW(hc]hd]he]hf]hi]uhOjEhm]rXhz)rY}rZ(hNX0``who`` attributes are of the form ``Username``.hOjUhZh]h_h~ha}r[(hc]hd]he]hf]hi]uhkMVhm]r\(h)r]}r^(hNX``who``ha}r_(hc]hd]he]hf]hi]uhOjYhm]r`hvXwhorarb}rc(hNUhOj]ubah_hubhvX attributes are of the form rdre}rf(hNX attributes are of the form hOjYubh)rg}rh(hNX ``Username``ha}ri(hc]hd]he]hf]hi]uhOjYhm]rjhvXUsernamerkrl}rm(hNUhOjgubah_hubhvX.rn}ro(hNX.hOjYubeubah_jubeubj)rp}rq(hNXp``darcs`` ``who`` attributes contain an ``Email`` and may also include a ``Full Name`` like ``git`` attributes. hOjhZh]h_jha}rr(hc]hd]he]hf]hi]uhkMZhlhhm]rs(j)rt}ru(hNX ``darcs``rvhOjphZh]h_jha}rw(hc]hd]he]hf]hi]uhkMZhm]rxh)ry}rz(hNjvha}r{(hc]hd]he]hf]hi]uhOjthm]r|hvXdarcsr}r~}r(hNUhOjyubah_hubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjphm]rhz)r}r(hNXe``who`` attributes contain an ``Email`` and may also include a ``Full Name`` like ``git`` attributes.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMYhm]r(h)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX attributes contain an rr}r(hNX attributes contain an hOjubh)r}r(hNX ``Email``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXEmailrr}r(hNUhOjubah_hubhvX and may also include a rr}r(hNX and may also include a hOjubh)r}r(hNX ``Full Name``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX Full Namerr}r(hNUhOjubah_hubhvX like rr}r(hNX like hOjubh)r}r(hNX``git``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXgitrr}r(hNUhOjubah_hubhvX attributes.rr}r(hNX attributes.hOjubeubah_jubeubj)r}r(hNX``bzr`` ``who`` attributes are free-form strings like ``hg``, and can include a ``Username``, ``Email``, and/or ``Full Name``. hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM^hlhhm]r(j)r}r(hNX``bzr``rhOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkM^hm]rh)r}r(hNjha}r(hc]hd]he]hf]hi]uhOjhm]rhvXbzrrr}r(hNUhOjubah_hubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)r}r(hNXv``who`` attributes are free-form strings like ``hg``, and can include a ``Username``, ``Email``, and/or ``Full Name``.hOjhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM]hm]r(h)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXwhorr}r(hNUhOjubah_hubhvX' attributes are free-form strings like rr}r(hNX' attributes are free-form strings like hOjubh)r}r(hNX``hg``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXhgrr}r(hNUhOjubah_hubhvX, and can include a rr}r(hNX, and can include a hOjubh)r}r(hNX ``Username``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXUsernamerr}r(hNUhOjubah_hubhvX, rr}r(hNX, hOjubh)r}r(hNX ``Email``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvXEmailrr}r(hNUhOjubah_hubhvX , and/or rr}r(hNX , and/or hOjubh)r}r(hNX ``Full Name``ha}r(hc]hd]he]hf]hi]uhOjhm]rhvX Full Namerr}r(hNUhOjubah_hubhvX.r}r(hNX.hOjubeubah_jubeubeubeubhZh]h_Usystem_messagerha}r(hc]UlevelKhf]he]rjaUsourceh]hd]hi]UlineMBUtypeUINFOruhkMBhlhhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOhLhm]rhvX*Duplicate implicit target name: "changes".rr}r(hNUhOjubah_h~ubaubaUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r (hjhjKhja h j h jh jh jh jChj=hjIhjhhhjhjhjhj hjhjhj hj6hjhjhjhjhj(hjUh j h!jh"jh#j8h$jh%jh&jh'jfh(jh)j h*jh+jh,jh-jh.jh/jFh0jh1j`h2j h3j[ h4jh5j`h6jh7jOh8jh9j#h:jh;jhjEh?jh@hhAjhBjfhChhhDjhEjhFNuhm]r hXahNUU transformerr NU footnote_refsr }r Urefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhlhU current_linerNUtransform_messagesr]r(hK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rhz)r}r (hNUha}r!(hc]hd]he]hf]hi]uhOjhm]r"hvX3Hyperlink target "source-stamps" is not referenced.r#r$}r%(hNUhOjubah_h~ubah_jubhK)r&}r'(hNUha}r((hc]UlevelKhf]he]Usourceh]hd]hi]UlineK&Utypejuhm]r)hz)r*}r+(hNUha}r,(hc]hd]he]hf]hi]uhOj&hm]r-hvX=Hyperlink target "version-control-systems" is not referenced.r.r/}r0(hNUhOj*ubah_h~ubah_jubhK)r1}r2(hNUha}r3(hc]UlevelKhf]he]Usourceh]hd]hi]UlineK@Utypejuhm]r4hz)r5}r6(hNUha}r7(hc]hd]he]hf]hi]uhOj1hm]r8hvXNHyperlink target "how-different-vc-systems-specify-sources" is not referenced.r9r:}r;(hNUhOj5ubah_h~ubah_jubhK)r<}r=(hNUha}r>(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]r?hz)r@}rA(hNUha}rB(hc]hd]he]hf]hi]uhOj<hm]rChvX;Hyperlink target "attributes-of-changes" is not referenced.rDrE}rF(hNUhOj@ubah_h~ubah_jubhK)rG}rH(hNUha}rI(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rJhz)rK}rL(hNUha}rM(hc]hd]he]hf]hi]uhOjGhm]rNhvX.Hyperlink target "attr-who" is not referenced.rOrP}rQ(hNUhOjKubah_h~ubah_jubhK)rR}rS(hNUha}rT(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rUhz)rV}rW(hNUha}rX(hc]hd]he]hf]hi]uhOjRhm]rYhvX0Hyperlink target "attr-files" is not referenced.rZr[}r\(hNUhOjVubah_h~ubah_jubhK)r]}r^(hNUha}r_(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]r`hz)ra}rb(hNUha}rc(hc]hd]he]hf]hi]uhOj]hm]rdhvX3Hyperlink target "attr-comments" is not referenced.rerf}rg(hNUhOjaubah_h~ubah_jubhK)rh}ri(hNUha}rj(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rkhz)rl}rm(hNUha}rn(hc]hd]he]hf]hi]uhOjhhm]rohvX2Hyperlink target "attr-project" is not referenced.rprq}rr(hNUhOjlubah_h~ubah_jubhK)rs}rt(hNUha}ru(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rvhz)rw}rx(hNUha}ry(hc]hd]he]hf]hi]uhOjshm]rzhvX5Hyperlink target "attr-repository" is not referenced.r{r|}r}(hNUhOjwubah_h~ubah_jubhK)r~}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOj~hm]rhvX3Hyperlink target "attr-codebase" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX3Hyperlink target "attr-revision" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMGUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX7Hyperlink target "scheduling-builds" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineM~Utypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX.Hyperlink target "buildset" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX2Hyperlink target "buildrequest" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX-Hyperlink target "builder" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX>Hyperlink target "concepts-build-factories" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX;Hyperlink target "concepts-build-slaves" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineM Utypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX4Hyperlink target "concepts-build" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX4Hyperlink target "concepts-users" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineM7Utypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX2Hyperlink target "user-objects" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineM{Utypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX=Hyperlink target "doing-things-with-users" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]r hvX5Hyperlink target "email-addresses" is not referenced.r r }r (hNUhOjubah_h~ubah_jubhK)r }r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOj hm]rhvX3Hyperlink target "irc-nicknames" is not referenced.rr}r(hNUhOjubah_h~ubah_jubhK)r}r(hNUha}r(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]rhz)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhvX9Hyperlink target "live-status-clients" is not referenced.r r!}r"(hNUhOjubah_h~ubah_jubhK)r#}r$(hNUha}r%(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]r&hz)r'}r((hNUha}r)(hc]hd]he]hf]hi]uhOj#hm]r*hvX-Hyperlink target "index-0" is not referenced.r+r,}r-(hNUhOj'ubah_h~ubah_jubhK)r.}r/(hNUha}r0(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]r1hz)r2}r3(hNUha}r4(hc]hd]he]hf]hi]uhOj.hm]r5hvX6Hyperlink target "build-properties" is not referenced.r6r7}r8(hNUhOj2ubah_h~ubah_jubhK)r9}r:(hNUha}r;(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]r<hz)r=}r>(hNUha}r?(hc]hd]he]hf]hi]uhOj9hm]r@hvX>Hyperlink target "multiple-codebase-builds" is not referenced.rArB}rC(hNUhOj=ubah_h~ubah_jubeUreporterrDNUid_startrEK U autofootnotesrF]rGU citation_refsrH}rIUindirect_targetsrJ]rKUsettingsrL(cdocutils.frontend Values rMorN}rO(Ufootnote_backlinksrPKUrecord_dependenciesrQNU rfc_base_urlrRUhttp://tools.ietf.org/html/rSU tracebackrTUpep_referencesrUNUstrip_commentsrVNU toc_backlinksrWUentryrXU language_coderYUenrZU datestampr[NU report_levelr\KU _destinationr]NU halt_levelr^KU strip_classesr_NhsNUerror_encoding_error_handlerr`UbackslashreplaceraUdebugrbNUembed_stylesheetrcUoutput_encoding_error_handlerrdUstrictreU sectnum_xformrfKUdump_transformsrgNU docinfo_xformrhKUwarning_streamriNUpep_file_url_templaterjUpep-%04drkUexit_status_levelrlKUconfigrmNUstrict_visitorrnNUcloak_email_addressesroUtrim_footnote_reference_spacerpUenvrqNUdump_pseudo_xmlrrNUexpose_internalsrsNUsectsubtitle_xformrtU source_linkruNUrfc_referencesrvNUoutput_encodingrwUutf-8rxU source_urlryNUinput_encodingrzU utf-8-sigr{U_disable_configr|NU id_prefixr}UU tab_widthr~KUerror_encodingrUUTF-8rU_sourcerUP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/concepts.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjeUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jj.jKjFja j\ jjjjj j j=j9jIjJhhjjjjjjj j8jCj3jhQjj=j j jhTjfjajjjjhhj6j2jj)jjjj)jjjjjjjjj(hVjUjPj jjjj8hVjjjjjj)jfjaj j jjjjjjjjjFjBjjj`jaj j j[ j\ jj8j`jajOjPjjj#jjjjjj@j3jjjEjFjj.jjjhTjj=hhhXjjjjjQjJuUsubstitution_namesr}rh_hlha}r(hc]hf]he]Usourceh]hd]hi]uU footnotesr]rUrefidsr}r(j]rjajI]rjFah]rhaj]rjaj]rjaj]rjaj]rjaj]rjaj]rjaj]rj aj]rj,aj ]rj aj]rjaj]rjaj`]rj]aj ]rj aj[ ]rjX aj]rj;aj`]rj]ajO]rjLaj@]rj6ajE]rjBaj]rj1aj(]rj%aj]rj@aj]rjaj]rjauub.PK6DmH<H<:buildbot-v0.8.9/.doctrees/manual/cfg-statustargets.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xurl-decorating optionsqNXgitorious hookqNX change-hooksqX%buildbot.status.web.baseweb.WebStatusq X githubstatusq NXdisplay-specific optionsq NXstatus targetsq NUcontentsq NU1Xgoogle code hookqNX pyopensslqXbitbucket hookqNXirc botqNX change hooksqNXauthenticationqNU2Xlogging configurationqNXhttpstatuspushqNX pblistenerqNXstatus-targetsqX authorizationqX webstatusqNX"webstatus configuration parametersqNXmailnotifier argumentsqNXchangecommentlinkqNXbuildbot.status.words.IRCqX github hookqNXgerritstatuspushqNX,http-based authentication by frontend serverq NX:github - profile - applications - register new applicationq!X&buildbot.status.status_push.StatusPushq"Xhttp connectionq#NX configurationq$NXprojectsq%NXbuildbot web resourcesq&NX!buildbot.status.mail.MailNotifierq'X#buildbot.status.github.GitHubStatusq(X poller hookq)NX.buildbot.status.status_gerrit.GerritStatusPushq*X documentationq+X repositoriesq,NX!buildbot.status.client.PBListenerq-X statuspushq.NX gitlab hookq/NXgithub status apiq0X mailnotifierq1NXrevlinkq2NuUsubstitution_defsq3}q4Uparse_messagesq5]q6cdocutils.nodes system_message q7)q8}q9(U rawsourceq:UUparentq;cdocutils.nodes section q<)q=}q>(h:UU referencedq?Kh;h<)q@}qA(h:Uh;h<)qB}qC(h:Uh;h<)qD}qE(h:Uh;hUsourceqFcdocutils.nodes reprunicode qGXY/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-statustargets.rstqHqI}qJbUexpect_referenced_by_nameqK}qLhcdocutils.nodes target qM)qN}qO(h:X.. _Status-Targets:h;hhFhIhK}UtagnameqPUtargetqQU attributesqR}qS(UidsqT]UbackrefsqU]UdupnamesqV]UclassesqW]UnamesqX]UrefidqYUstatus-targetsqZuUlineq[KUdocumentq\hUexpect_referenced_by_idq]}q^X cfg-statusq_hM)q`}qa(h:Uh;hhFhIhPhQhR}qb(hT]hU]hV]hW]hX]hYh_uh[Kh\hUchildrenqc]ubshc]ubshPUsectionqdhR}qe(hV]hW]hU]hT]qf(hZh_Uid1qgehX]qh(h heuh[Kh\hh]}qi(h_h`hZhNuhc]qj(cdocutils.nodes title qk)ql}qm(h:XStatus Targetsqnh;hDhFhIhPUtitleqohR}qp(hV]hW]hU]hT]hX]uh[Kh\hhc]qqcdocutils.nodes Text qrXStatus Targetsqsqt}qu(h:hnh;hlubaubcdocutils.nodes topic qv)qw}qx(h:Uh;hDhFhIhPUtopicqyhR}qz(hV]hW]q{(Ucontentsq|Ulocalq}ehU]hT]q~UcontentsqahX]qh auh[K h\hhc]qcdocutils.nodes bullet_list q)q}q(h:Uh;hwhFNhPU bullet_listqhR}q(hV]hW]hU]hT]hX]uh[Nh\hhc]q(cdocutils.nodes list_item q)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]q(cdocutils.nodes paragraph q)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qcdocutils.nodes reference q)q}q(h:UhR}q(hT]qUid8qahU]hV]hW]hX]UrefidU webstatusquh;hhc]qhrX WebStatusqq}q(h:X WebStatusqh;hubahPU referencequbahPU paragraphqubh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]q(h)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hT]qUid9qahU]hV]hW]hX]UrefidU configurationquh;hhc]qhrX Configurationqq}q(h:X Configurationqh;hubahPhubahPhubahPU list_itemqubh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hT]qUid10qahU]hV]hW]hX]UrefidUbuildbot-web-resourcesquh;hhc]qhrXBuildbot Web ResourcesqDžq}q(h:XBuildbot Web Resourcesqh;hubahPhubahPhubahPhubh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hT]qUid11qahU]hV]hW]hX]UrefidU"webstatus-configuration-parametersquh;hhc]qhrX"WebStatus Configuration Parametersqڅq}q(h:X"WebStatus Configuration Parametersqh;hubahPhubahPhubahPhubh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hT]qUid12qahU]hV]hW]hX]UrefidU change-hooksquh;hhc]qhrX Change Hooksq텁q}q(h:X Change Hooksqh;hubahPhubahPhubahPhubehPhubehPhubh)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]q(h)q}q(h:UhR}q(hV]hW]hU]hT]hX]uh;hhc]qh)q}q(h:UhR}q(hT]qUid13qahU]hV]hW]hX]UrefidU mailnotifierquh;hhc]qhrX MailNotifierrr}r(h:X MailNotifierrh;hubahPhubahPhubh)r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;hhc]rh)r}r (h:UhR}r (hV]hW]hU]hT]hX]uh;jhc]r h)r }r (h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:UhR}r(hT]rUid14rahU]hV]hW]hX]UrefidUmailnotifier-argumentsruh;j hc]rhrXMailNotifier argumentsrr}r(h:XMailNotifier argumentsrh;jubahPhubahPhubahPhubahPhubehPhubh)r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;hhc]rh)r}r (h:UhR}r!(hV]hW]hU]hT]hX]uh;jhc]r"h)r#}r$(h:UhR}r%(hT]r&Uid15r'ahU]hV]hW]hX]UrefidUirc-botr(uh;jhc]r)hrXIRC Botr*r+}r,(h:XIRC Botr-h;j#ubahPhubahPhubahPhubh)r.}r/(h:UhR}r0(hV]hW]hU]hT]hX]uh;hhc]r1h)r2}r3(h:UhR}r4(hV]hW]hU]hT]hX]uh;j.hc]r5h)r6}r7(h:UhR}r8(hT]r9Uid16r:ahU]hV]hW]hX]UrefidU pblistenerr;uh;j2hc]r<hrX PBListenerr=r>}r?(h:X PBListenerr@h;j6ubahPhubahPhubahPhubh)rA}rB(h:UhR}rC(hV]hW]hU]hT]hX]uh;hhc]rDh)rE}rF(h:UhR}rG(hV]hW]hU]hT]hX]uh;jAhc]rHh)rI}rJ(h:UhR}rK(hT]rLUid17rMahU]hV]hW]hX]UrefidU statuspushrNuh;jEhc]rOhrX StatusPushrPrQ}rR(h:X StatusPushrSh;jIubahPhubahPhubahPhubh)rT}rU(h:UhR}rV(hV]hW]hU]hT]hX]uh;hhc]rWh)rX}rY(h:UhR}rZ(hV]hW]hU]hT]hX]uh;jThc]r[h)r\}r](h:UhR}r^(hT]r_Uid18r`ahU]hV]hW]hX]UrefidUhttpstatuspushrauh;jXhc]rbhrXHttpStatusPushrcrd}re(h:XHttpStatusPushrfh;j\ubahPhubahPhubahPhubh)rg}rh(h:UhR}ri(hV]hW]hU]hT]hX]uh;hhc]rjh)rk}rl(h:UhR}rm(hV]hW]hU]hT]hX]uh;jghc]rnh)ro}rp(h:UhR}rq(hT]rrUid19rsahU]hV]hW]hX]UrefidUgerritstatuspushrtuh;jkhc]ruhrXGerritStatusPushrvrw}rx(h:XGerritStatusPushryh;joubahPhubahPhubahPhubh)rz}r{(h:UhR}r|(hV]hW]hU]hT]hX]uh;hhc]r}h)r~}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jzhc]rh)r}r(h:UhR}r(hT]rUid20rahU]hV]hW]hX]UrefidU githubstatusruh;j~hc]rhrX GitHubStatusrr}r(h:X GitHubStatusrh;jubahPhubahPhubahPhubeubaubh)r}r(h:XThe Buildmaster has a variety of ways to present build status to various users. Each such delivery method is a `Status Target` object in the configuration's :bb:cfg:`status` list. To add status targets, you just append more objects to this list::h;hDhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[K h\hhc]r(hrXoThe Buildmaster has a variety of ways to present build status to various users. Each such delivery method is a rr}r(h:XoThe Buildmaster has a variety of ways to present build status to various users. Each such delivery method is a h;jubcdocutils.nodes title_reference r)r}r(h:X`Status Target`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX Status Targetrr}r(h:Uh;jubahPUtitle_referencerubhrX object in the configuration's rr}r(h:X object in the configuration's h;jubcsphinx.addnodes pending_xref r)r}r(h:X:bb:cfg:`status`rh;jhFhIhPU pending_xrefrhR}r(UreftypeXcfgUrefwarnrU reftargetrXstatusU refdomainXbbrhT]hU]U refexplicithV]hW]hX]UrefdocrXmanual/cfg-statustargetsruh[K hc]rcdocutils.nodes literal r)r}r(h:jhR}r(hV]hW]r(UxrefrjXbb-cfgrehU]hT]hX]uh;jhc]rhrXstatusrr}r(h:Uh;jubahPUliteralrubaubhrXH list. To add status targets, you just append more objects to this list:rr}r(h:XH list. To add status targets, you just append more objects to this list:h;jubeubcdocutils.nodes literal_block r)r}r(h:Xzc['status'] = [] from buildbot.status import html c['status'].append(html.Waterfall(http_port=8010)) from buildbot.status import mail m = mail.MailNotifier(fromaddr="buildbot@localhost", extraRecipients=["builds@lists.example.com"], sendToInterestedUsers=False) c['status'].append(m) from buildbot.status import words c['status'].append(words.IRC(host="irc.example.com", nick="bb", channels=[{"channel": "#example1"}, {"channel": "#example2", "password": "somesecretpassword"}]))h;hDhFhIhPU literal_blockrhR}r(U xml:spacerUpreserverhT]hU]hV]hW]hX]uh[Kh\hhc]rhrXzc['status'] = [] from buildbot.status import html c['status'].append(html.Waterfall(http_port=8010)) from buildbot.status import mail m = mail.MailNotifier(fromaddr="buildbot@localhost", extraRecipients=["builds@lists.example.com"], sendToInterestedUsers=False) c['status'].append(m) from buildbot.status import words c['status'].append(words.IRC(host="irc.example.com", nick="bb", channels=[{"channel": "#example1"}, {"channel": "#example2", "password": "somesecretpassword"}]))rr}r(h:Uh;jubaubh)r}r(h:XMost status delivery objects take a ``categories=`` argument, which can contain a list of `category` names: in this case, it will only show status for Builders that are in one of the named categories.h;hDhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[K"h\hhc]r(hrX$Most status delivery objects take a rr}r(h:X$Most status delivery objects take a h;jubj)r}r(h:X``categories=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX categories=rr}r(h:Uh;jubahPjubhrX' argument, which can contain a list of rr}r(h:X' argument, which can contain a list of h;jubj)r}r(h:X `category`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXcategoryrr}r(h:Uh;jubahPjubhrXd names: in this case, it will only show status for Builders that are in one of the named categories.rr}r(h:Xd names: in this case, it will only show status for Builders that are in one of the named categories.h;jubeubcdocutils.nodes note r)r}r(h:X8Implementation Note Each of these objects should be a :class:`service.MultiService` which will be attached to the BuildMaster object when the configuration is processed. They should use ``self.parent.getStatus()`` to get access to the top-level :class:`IStatus` object, either inside :meth:`startService` or later. They may call :meth:`status.subscribe()` in :meth:`startService` to receive notifications of builder events, in which case they must define :meth:`builderAdded` and related methods. See the docstrings in :file:`buildbot/interfaces.py` for full details.h;hDhFhIhPUnoterhR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]r(h)r}r(h:XImplementation Noterh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[K&hc]rhrXImplementation Noterr}r(h:jh;jubaubh)r}r(h:X#Each of these objects should be a :class:`service.MultiService` which will be attached to the BuildMaster object when the configuration is processed. They should use ``self.parent.getStatus()`` to get access to the top-level :class:`IStatus` object, either inside :meth:`startService` or later. They may call :meth:`status.subscribe()` in :meth:`startService` to receive notifications of builder events, in which case they must define :meth:`builderAdded` and related methods. See the docstrings in :file:`buildbot/interfaces.py` for full details.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[K(hc]r(hrX"Each of these objects should be a rr}r(h:X"Each of these objects should be a h;jubj)r}r(h:X:class:`service.MultiService`rh;jhFhIhPjhR}r(UreftypeXclassjjXservice.MultiServiceU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjUpy:classrNU py:modulerNuh[K(hc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXservice.MultiServicerr}r(h:Uh;jubahPjubaubhrXg which will be attached to the BuildMaster object when the configuration is processed. They should use rr}r (h:Xg which will be attached to the BuildMaster object when the configuration is processed. They should use h;jubj)r }r (h:X``self.parent.getStatus()``hR}r (hV]hW]hU]hT]hX]uh;jhc]r hrXself.parent.getStatus()rr}r(h:Uh;j ubahPjubhrX to get access to the top-level rr}r(h:X to get access to the top-level h;jubj)r}r(h:X:class:`IStatus`rh;jhFhIhPjhR}r(UreftypeXclassjjXIStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[K(hc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXIStatusr r!}r"(h:Uh;jubahPjubaubhrX object, either inside r#r$}r%(h:X object, either inside h;jubj)r&}r'(h:X:meth:`startService`r(h;jhFhIhPjhR}r)(UreftypeXmethjjX startServiceU refdomainXpyr*hT]hU]U refexplicithV]hW]hX]jjjNjNuh[K(hc]r+j)r,}r-(h:j(hR}r.(hV]hW]r/(jj*Xpy-methr0ehU]hT]hX]uh;j&hc]r1hrX startServicer2r3}r4(h:Uh;j,ubahPjubaubhrX or later. They may call r5r6}r7(h:X or later. They may call h;jubj)r8}r9(h:X:meth:`status.subscribe()`r:h;jhFhIhPjhR}r;(UreftypeXmethjjXstatus.subscribeU refdomainXpyr<hT]hU]U refexplicithV]hW]hX]jjjNjNuh[K(hc]r=j)r>}r?(h:j:hR}r@(hV]hW]rA(jj<Xpy-methrBehU]hT]hX]uh;j8hc]rChrXstatus.subscriberDrE}rF(h:Uh;j>ubahPjubaubhrX in rGrH}rI(h:X in h;jubj)rJ}rK(h:X:meth:`startService`rLh;jhFhIhPjhR}rM(UreftypeXmethjjX startServiceU refdomainXpyrNhT]hU]U refexplicithV]hW]hX]jjjNjNuh[K(hc]rOj)rP}rQ(h:jLhR}rR(hV]hW]rS(jjNXpy-methrTehU]hT]hX]uh;jJhc]rUhrX startServicerVrW}rX(h:Uh;jPubahPjubaubhrXL to receive notifications of builder events, in which case they must define rYrZ}r[(h:XL to receive notifications of builder events, in which case they must define h;jubj)r\}r](h:X:meth:`builderAdded`r^h;jhFhIhPjhR}r_(UreftypeXmethjjX builderAddedU refdomainXpyr`hT]hU]U refexplicithV]hW]hX]jjjNjNuh[K(hc]raj)rb}rc(h:j^hR}rd(hV]hW]re(jj`Xpy-methrfehU]hT]hX]uh;j\hc]rghrX builderAddedrhri}rj(h:Uh;jbubahPjubaubhrX, and related methods. See the docstrings in rkrl}rm(h:X, and related methods. See the docstrings in h;jubj)rn}ro(h:UhR}rp(hT]hU]hV]hW]rqXfilerraUrolejrhX]uh;jhc]rshrXbuildbot/interfaces.pyrtru}rv(h:Xbuildbot/interfaces.pyh;jnubahPjubhrX for full details.rwrx}ry(h:X for full details.h;jubeubeubh)rz}r{(h:XThe remainder of this section describes each built-in status target. A full list of status targets is available in the :bb:index:`status`.h;hDhFhIhPhhR}r|(hV]hW]hU]hT]hX]uh[K0h\hhc]r}(hrXxThe remainder of this section describes each built-in status target. A full list of status targets is available in the r~r}r(h:XxThe remainder of this section describes each built-in status target. A full list of status targets is available in the h;jzubj)r}r(h:X:bb:index:`status`rh;jzhFhIhPjhR}r(UreftypeXindexjjXstatusU refdomainXbbrhT]hU]U refexplicithV]hW]hX]jjuh[K0hc]rj)r}r(h:jhR}r(hV]hW]r(jjXbb-indexrehU]hT]hX]uh;jhc]rhrXstatusrr}r(h:Uh;jubahPjubaubhrX.r}r(h:X.h;jzubeubcsphinx.addnodes index r)r}r(h:Uh;hDhFhIhPUindexrhR}r(hT]hU]hV]hW]hX]Uentries]r((UsingleXStatus Targets; WebStatusXstatus-WebStatusrjtr(UsingleXWebStatus Status Targetjjtreuh[K4h\hhc]ubhM)r}r(h:Uh;hDhFhIhPhQhR}r(hT]hU]hV]hW]hX]hYjuh[K4h\hhc]ubhBh<)r}r(h:Uh;hDhFhIhK}hPhdhR}r(hV]hW]hU]hT]r(hUindex-0rehX]rh1auh[Mh\hh]}rjhM)r}r(h:Uh;h<)r}r(h:Uh;h<)r}r(h:Uh;hBhFhIhK}rhhM)r}r(h:X.. _Change-Hooks:h;h<)r}r(h:Uh;h@hFhIhPhdhR}r(hV]hW]hU]hT]rUdisplay-specific-optionsrahX]rh auh[Mh\hhc]r(hk)r}r(h:XDisplay-Specific Optionsrh;jhFhIhPhohR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXDisplay-Specific Optionsrr}r(h:jh;jubaubh)r}r(h:XtThe ``order_console_by_time`` option affects the rendering of the console; see the description of the console above.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X``order_console_by_time``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXorder_console_by_timerr}r(h:Uh;jubahPjubhrXW option affects the rendering of the console; see the description of the console above.rr}r(h:XW option affects the rendering of the console; see the description of the console above.h;jubeubh)r}r(h:XThe ``numbuilds`` option determines the number of builds that most status displays will show. It can usually be overriden in the URL, e.g., ``?numbuilds=13``.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X ``numbuilds``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX numbuildsrr}r(h:Uh;jubahPjubhrX| option determines the number of builds that most status displays will show. It can usually be overriden in the URL, e.g., rr}r(h:X| option determines the number of builds that most status displays will show. It can usually be overriden in the URL, e.g., h;jubj)r}r(h:X``?numbuilds=13``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX ?numbuilds=13rr}r(h:Uh;jubahPjubhrX.r}r(h:X.h;jubeubh)r}r(h:XThe ``num_events`` option gives the default number of events that the waterfall will display. The ``num_events_max`` gives the maximum number of events displayed, even if the web browser requests more.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X``num_events``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX num_eventsrr}r(h:Uh;jubahPjubhrXQ option gives the default number of events that the waterfall will display. The rr}r(h:XQ option gives the default number of events that the waterfall will display. The h;jubj)r}r(h:X``num_events_max``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXnum_events_maxrr}r(h:Uh;jubahPjubhrXU gives the maximum number of events displayed, even if the web browser requests more.rr}r(h:XU gives the maximum number of events displayed, even if the web browser requests more.h;jubeubjeubhFhIhPhQhR}r(hT]hU]hV]hW]hX]hYhuh[Mh\hhc]ubshPhdhR}r(hV]hW]hU]hT]r(hUid5rehX]r(hheuh[Mh\hh]}rhjshc]r (hk)r }r (h:hh;jhFhIhPhohR}r (hT]hU]hV]hW]hX]hYhuh[Mh\hhc]r hrX Change Hooksrr}r(h:hh;j ubaubh)r}r(h:XThe ``/change_hook`` url is a magic URL which will accept HTTP requests and translate them into changes for buildbot. Implementations (such as a trivial json-based endpoint and a GitHub implementation) can be found in :bb:src:`master/buildbot/status/web/hooks`. The format of the url is :samp:`/change_hook/{DIALECT}` where DIALECT is a package within the hooks directory. Change_hook is disabled by default and each DIALECT has to be enabled separately, for security reasonsh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X``/change_hook``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX /change_hookrr}r(h:Uh;jubahPjubhrX url is a magic URL which will accept HTTP requests and translate them into changes for buildbot. Implementations (such as a trivial json-based endpoint and a GitHub implementation) can be found in rr }r!(h:X url is a magic URL which will accept HTTP requests and translate them into changes for buildbot. Implementations (such as a trivial json-based endpoint and a GitHub implementation) can be found in h;jubh)r"}r#(h:UhR}r$(Ureftitler%X master/buildbot/status/web/hooksr&Urefurir'XQhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/status/web/hookshT]hU]hV]hW]hX]uh;jhc]r(j)r)}r*(h:j&hR}r+(hV]hW]hU]hT]hX]uh;j"hc]r,hrX master/buildbot/status/web/hooksr-r.}r/(h:Uh;j)ubahPjubahPhubhrX. The format of the url is r0r1}r2(h:X. The format of the url is h;jubj)r3}r4(h:UhR}r5(hT]hU]hV]hW]r6Xsampr7aUrolej7hX]uh;jhc]r8(hrX /change_hook/r9r:}r;(h:X /change_hook/h;j3ubcdocutils.nodes emphasis r<)r=}r>(h:XDIALECThR}r?(hV]hW]hU]hT]hX]uh;j3hc]r@hrXDIALECTrArB}rC(h:Uh;j=ubahPUemphasisrDubehPjubhrX where DIALECT is a package within the hooks directory. Change_hook is disabled by default and each DIALECT has to be enabled separately, for security reasonsrErF}rG(h:X where DIALECT is a package within the hooks directory. Change_hook is disabled by default and each DIALECT has to be enabled separately, for security reasonsh;jubeubh)rH}rI(h:XTAn example WebStatus configuration line which enables change_hook and two DIALECTS::rJh;jhFhIhPhhR}rK(hV]hW]hU]hT]hX]uh[Mh\hhc]rLhrXSAn example WebStatus configuration line which enables change_hook and two DIALECTS:rMrN}rO(h:XSAn example WebStatus configuration line which enables change_hook and two DIALECTS:h;jHubaubj)rP}rQ(h:Xc['status'].append(html.WebStatus(http_port=8010,allowForce=True, change_hook_dialects={ 'base': True, 'somehook': {'option1':True, 'option2':False}}))h;jhFhIhPjhR}rR(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rShrXc['status'].append(html.WebStatus(http_port=8010,allowForce=True, change_hook_dialects={ 'base': True, 'somehook': {'option1':True, 'option2':False}}))rTrU}rV(h:Uh;jPubaubh)rW}rX(h:XWithin the WebStatus arguments, the ``change_hook`` key enables/disables the module and ``change_hook_dialects`` whitelists DIALECTs where the keys are the module names and the values are optional arguments which will be passed to the hooks.h;jhFhIhPhhR}rY(hV]hW]hU]hT]hX]uh[Mh\hhc]rZ(hrX$Within the WebStatus arguments, the r[r\}r](h:X$Within the WebStatus arguments, the h;jWubj)r^}r_(h:X``change_hook``hR}r`(hV]hW]hU]hT]hX]uh;jWhc]rahrX change_hookrbrc}rd(h:Uh;j^ubahPjubhrX% key enables/disables the module and rerf}rg(h:X% key enables/disables the module and h;jWubj)rh}ri(h:X``change_hook_dialects``hR}rj(hV]hW]hU]hT]hX]uh;jWhc]rkhrXchange_hook_dialectsrlrm}rn(h:Uh;jhubahPjubhrX whitelists DIALECTs where the keys are the module names and the values are optional arguments which will be passed to the hooks.rorp}rq(h:X whitelists DIALECTs where the keys are the module names and the values are optional arguments which will be passed to the hooks.h;jWubeubh)rr}rs(h:XThe :file:`post_build_request.py` script in :file:`master/contrib` allows for the submission of an arbitrary change request. Run :command:`post_build_request.py --help` for more information. The ``base`` dialect must be enabled for this to work.h;jhFhIhPhhR}rt(hV]hW]hU]hT]hX]uh[Mh\hhc]ru(hrXThe rvrw}rx(h:XThe h;jrubj)ry}rz(h:UhR}r{(hT]hU]hV]hW]r|Xfiler}aUrolej}hX]uh;jrhc]r~hrXpost_build_request.pyrr}r(h:Xpost_build_request.pyh;jyubahPjubhrX script in rr}r(h:X script in h;jrubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jrhc]rhrXmaster/contribrr}r(h:Xmaster/contribh;jubahPjubhrX? allows for the submission of an arbitrary change request. Run rr}r(h:X? allows for the submission of an arbitrary change request. Run h;jrubcdocutils.nodes strong r)r}r(h:X':command:`post_build_request.py --help`hR}r(hV]hW]rUcommandrahU]hT]hX]uh;jrhc]rhrXpost_build_request.py --helprr}r(h:Uh;jubahPUstrongrubhrX for more information. The rr}r(h:X for more information. The h;jrubj)r}r(h:X``base``hR}r(hV]hW]hU]hT]hX]uh;jrhc]rhrXbaserr}r(h:Uh;jubahPjubhrX* dialect must be enabled for this to work.rr}r(h:X* dialect must be enabled for this to work.h;jrubeubh<)r}r(h:Uh;jhFhIhPhdhR}r(hV]hW]hU]hT]rU github-hookrahX]rhauh[Mh\hhc]r(hk)r}r(h:X GitHub hookrh;jhFhIhPhohR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrX GitHub hookrr}r(h:jh;jubaubh)r}r(h:X2The GitHub hook is simple and takes no options. ::rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrX/The GitHub hook is simple and takes no options.rr}r(h:X/The GitHub hook is simple and takes no options.h;jubaubj)r}r(h:Xdc['status'].append(html.WebStatus(..., change_hook_dialects={ 'github' : True }))h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrXdc['status'].append(html.WebStatus(..., change_hook_dialects={ 'github' : True }))rr}r(h:Uh;jubaubh)r}r(h:XWith this set up, add a Post-Receive URL for the project in the GitHub administrative interface, pointing to ``/change_hook/github`` relative to the root of the web status. For example, if the grid URL is ``http://builds.mycompany.com/bbot/grid``, then point GitHub to ``http://builds.mycompany.com/bbot/change_hook/github``. To specify a project associated to the repository, append ``?project=name`` to the URL.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXmWith this set up, add a Post-Receive URL for the project in the GitHub administrative interface, pointing to rr}r(h:XmWith this set up, add a Post-Receive URL for the project in the GitHub administrative interface, pointing to h;jubj)r}r(h:X``/change_hook/github``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX/change_hook/githubrr}r(h:Uh;jubahPjubhrXJ relative to the root of the web status. For example, if the grid URL is rr}r(h:XJ relative to the root of the web status. For example, if the grid URL is h;jubj)r}r(h:X)``http://builds.mycompany.com/bbot/grid``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX%http://builds.mycompany.com/bbot/gridrr}r(h:Uh;jubahPjubhrX, then point GitHub to rr}r(h:X, then point GitHub to h;jubj)r}r(h:X7``http://builds.mycompany.com/bbot/change_hook/github``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX3http://builds.mycompany.com/bbot/change_hook/githubrr}r(h:Uh;jubahPjubhrX<. To specify a project associated to the repository, append rr}r(h:X<. To specify a project associated to the repository, append h;jubj)r}r(h:X``?project=name``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX ?project=namerr}r(h:Uh;jubahPjubhrX to the URL.rr}r(h:X to the URL.h;jubeubh)r}r(h:XNote that there is a standalone HTTP server available for receiving GitHub notifications, as well: :file:`contrib/github_buildbot.py`. This script may be useful in cases where you cannot expose the WebStatus for public consumption.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXcNote that there is a standalone HTTP server available for receiving GitHub notifications, as well: rr}r(h:XcNote that there is a standalone HTTP server available for receiving GitHub notifications, as well: h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrXcontrib/github_buildbot.pyrr}r(h:Xcontrib/github_buildbot.pyh;jubahPjubhrXc. This script may be useful in cases where you cannot expose the WebStatus for public consumption.rr}r(h:Xc. This script may be useful in cases where you cannot expose the WebStatus for public consumption.h;jubeubcdocutils.nodes warning r )r }r (h:XThe incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from GitHub, potentially causing the buildmaster to run arbitrary code.h;jhFhIhPUwarningr hR}r (hV]hW]hU]hT]hX]uh[Nh\hhc]rh)r}r(h:XThe incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from GitHub, potentially causing the buildmaster to run arbitrary code.rh;j hFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXThe incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from GitHub, potentially causing the buildmaster to run arbitrary code.rr}r(h:jh;jubaubaubh)r}r(h:XXTo protect URL against unauthorized access you should use ``change_hook_auth`` option ::rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX:To protect URL against unauthorized access you should use rr}r(h:X:To protect URL against unauthorized access you should use h;jubj)r}r (h:X``change_hook_auth``hR}r!(hV]hW]hU]hT]hX]uh;jhc]r"hrXchange_hook_authr#r$}r%(h:Uh;jubahPjubhrX optionr&r'}r((h:X optionh;jubeubj)r)}r*(h:Xvc['status'].append(html.WebStatus(..., change_hook_auth=["file:changehook.passwd"]))h;jhFhIhPjhR}r+(jjhT]hU]hV]hW]hX]uh[Mh\hhc]r,hrXvc['status'].append(html.WebStatus(..., change_hook_auth=["file:changehook.passwd"]))r-r.}r/(h:Uh;j)ubaubh)r0}r1(h:X'And create a file ``changehook.passwd``r2h;jhFhIhPhhR}r3(hV]hW]hU]hT]hX]uh[Mh\hhc]r4(hrXAnd create a file r5r6}r7(h:XAnd create a file h;j0ubj)r8}r9(h:X``changehook.passwd``hR}r:(hV]hW]hU]hT]hX]uh;j0hc]r;hrXchangehook.passwdr<r=}r>(h:Uh;j8ubahPjubeubj)r?}r@(h:X user:passwordh;jhFhIhPjhR}rA(UlinenosrBUlanguagerCXnonejjhT]hU]hV]hW]hX]uh[Mh\hhc]rDhrX user:passwordrErF}rG(h:Uh;j?ubaubh)rH}rI(h:XThen, create a GitHub service hook (see https://help.github.com/articles/post-receive-hooks) with a WebHook URL like ``http://user:password@builds.mycompany.com/bbot/change_hook/github``.rJh;jhFhIhPhhR}rK(hV]hW]hU]hT]hX]uh[Mh\hhc]rL(hrX(Then, create a GitHub service hook (see rMrN}rO(h:X(Then, create a GitHub service hook (see h;jHubh)rP}rQ(h:X3https://help.github.com/articles/post-receive-hooksrRhR}rS(UrefurijRhT]hU]hV]hW]hX]uh;jHhc]rThrX3https://help.github.com/articles/post-receive-hooksrUrV}rW(h:Uh;jPubahPhubhrX) with a WebHook URL like rXrY}rZ(h:X) with a WebHook URL like h;jHubj)r[}r\(h:XE``http://user:password@builds.mycompany.com/bbot/change_hook/github``hR}r](hV]hW]hU]hT]hX]uh;jHhc]r^hrXAhttp://user:password@builds.mycompany.com/bbot/change_hook/githubr_r`}ra(h:Uh;j[ubahPjubhrX.rb}rc(h:X.h;jHubeubh)rd}re(h:XSee the `documentation `_ for twisted cred for more option to pass to ``change_hook_auth``.rfh;jhFhIhPhhR}rg(hV]hW]hU]hT]hX]uh[Mh\hhc]rh(hrXSee the rirj}rk(h:XSee the h;jdubh)rl}rm(h:XS`documentation `_hR}rn(Unameh+j'X@https://twistedmatrix.com/documents/current/core/howto/cred.htmlrohT]hU]hV]hW]hX]uh;jdhc]rphrX documentationrqrr}rs(h:Uh;jlubahPhubhM)rt}ru(h:XC h?Kh;jdhPhQhR}rv(UrefurijohT]rwU documentationrxahU]hV]hW]hX]ryh+auhc]ubhrX- for twisted cred for more option to pass to rzr{}r|(h:X- for twisted cred for more option to pass to h;jdubj)r}}r~(h:X``change_hook_auth``hR}r(hV]hW]hU]hT]hX]uh;jdhc]rhrXchange_hook_authrr}r(h:Uh;j}ubahPjubhrX.r}r(h:X.h;jdubeubh)r}r(h:XJNote that not using ``change_hook_auth`` can expose you to security risks.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[M h\hhc]r(hrXNote that not using rr}r(h:XNote that not using h;jubj)r}r(h:X``change_hook_auth``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXchange_hook_authrr}r(h:Uh;jubahPjubhrX" can expose you to security risks.rr}r(h:X" can expose you to security risks.h;jubeubeubh<)r}r(h:Uh;jhFhIhPhdhR}r(hV]hW]hU]hT]rUbitbucket-hookrahX]rhauh[M h\hhc]r(hk)r}r(h:XBitBucket hookrh;jhFhIhPhohR}r(hV]hW]hU]hT]hX]uh[M h\hhc]rhrXBitBucket hookrr}r(h:jh;jubaubh)r}r(h:XNThe BitBucket hook is as simple as GitHub one and it also takes no options. ::rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXKThe BitBucket hook is as simple as GitHub one and it also takes no options.rr}r(h:XKThe BitBucket hook is as simple as GitHub one and it also takes no options.h;jubaubj)r}r(h:Xgc['status'].append(html.WebStatus(..., change_hook_dialects={ 'bitbucket' : True }))h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrXgc['status'].append(html.WebStatus(..., change_hook_dialects={ 'bitbucket' : True }))rr}r(h:Uh;jubaubh)r}r(h:XsWhen this is setup you should add a `POST` service pointing to ``/change_hook/bitbucket`` relative to the root of the web status. For example, it the grid URL is ``http://builds.mycompany.com/bbot/grid``, then point BitBucket to ``http://builds.mycompany.com/change_hook/bitbucket``. To specify a project associated to the repository, append ``?project=name`` to the URL.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX$When this is setup you should add a rr}r(h:X$When this is setup you should add a h;jubj)r}r(h:X`POST`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXPOSTrr}r(h:Uh;jubahPjubhrX service pointing to rr}r(h:X service pointing to h;jubj)r}r(h:X``/change_hook/bitbucket``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX/change_hook/bitbucketrr}r(h:Uh;jubahPjubhrXI relative to the root of the web status. For example, it the grid URL is rr}r(h:XI relative to the root of the web status. For example, it the grid URL is h;jubj)r}r(h:X)``http://builds.mycompany.com/bbot/grid``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX%http://builds.mycompany.com/bbot/gridrr}r(h:Uh;jubahPjubhrX, then point BitBucket to rr}r(h:X, then point BitBucket to h;jubj)r}r(h:X5``http://builds.mycompany.com/change_hook/bitbucket``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX1http://builds.mycompany.com/change_hook/bitbucketrr}r(h:Uh;jubahPjubhrX<. To specify a project associated to the repository, append rr}r(h:X<. To specify a project associated to the repository, append h;jubj)r}r(h:X``?project=name``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX ?project=namerr}r(h:Uh;jubahPjubhrX to the URL.rr}r(h:X to the URL.h;jubeubh)r}r(h:XNote that there is a satandalone HTTP server available for receiving BitBucket notifications, as well: :file:`contrib/bitbucket_buildbot.py`. This script may be useful in cases where you cannot expose the WebStatus for public consumption.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXgNote that there is a satandalone HTTP server available for receiving BitBucket notifications, as well: rr}r(h:XgNote that there is a satandalone HTTP server available for receiving BitBucket notifications, as well: h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrXcontrib/bitbucket_buildbot.pyrr}r(h:Xcontrib/bitbucket_buildbot.pyh;jubahPjubhrXb. This script may be useful in cases where you cannot expose the WebStatus for public consumption.rr}r(h:Xb. This script may be useful in cases where you cannot expose the WebStatus for public consumption.h;jubeubj )r}r(h:XAs in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from BitBucket, potentially causing the buildmaster to run arbitrary code.h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]rh)r}r(h:XAs in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from BitBucket, potentially causing the buildmaster to run arbitrary code.rh;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrXAs in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from BitBucket, potentially causing the buildmaster to run arbitrary code.r r }r (h:jh;jubaubaubh)r}r(h:XYTo protect URL against unauthorized access you should use ``change_hook_auth`` option. ::rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[M$h\hhc]r(hrX:To protect URL against unauthorized access you should use rr}r(h:X:To protect URL against unauthorized access you should use h;jubj)r}r(h:X``change_hook_auth``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXchange_hook_authrr}r(h:Uh;jubahPjubhrX option.rr}r(h:X option.h;jubeubj)r }r!(h:Xvc['status'].append(html.WebStatus(..., change_hook_auth=["file:changehook.passwd"]))h;jhFhIhPjhR}r"(jjhT]hU]hV]hW]hX]uh[M&h\hhc]r#hrXvc['status'].append(html.WebStatus(..., change_hook_auth=["file:changehook.passwd"]))r$r%}r&(h:Uh;j ubaubh)r'}r((h:XThen, create a BitBucket service hook (see https://confluence.atlassian.com/display/BITBUCKET/POST+Service+Management) with a WebHook URL like ``http://user:password@builds.mycompany.com/bbot/change_hook/bitbucket``.r)h;jhFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[M)h\hhc]r+(hrX+Then, create a BitBucket service hook (see r,r-}r.(h:X+Then, create a BitBucket service hook (see h;j'ubh)r/}r0(h:XJhttps://confluence.atlassian.com/display/BITBUCKET/POST+Service+Managementr1hR}r2(Urefurij1hT]hU]hV]hW]hX]uh;j'hc]r3hrXJhttps://confluence.atlassian.com/display/BITBUCKET/POST+Service+Managementr4r5}r6(h:Uh;j/ubahPhubhrX) with a WebHook URL like r7r8}r9(h:X) with a WebHook URL like h;j'ubj)r:}r;(h:XH``http://user:password@builds.mycompany.com/bbot/change_hook/bitbucket``hR}r<(hV]hW]hU]hT]hX]uh;j'hc]r=hrXDhttp://user:password@builds.mycompany.com/bbot/change_hook/bitbucketr>r?}r@(h:Uh;j:ubahPjubhrX.rA}rB(h:X.h;j'ubeubh)rC}rD(h:XUNote that as before, not using ``change_hook_auth`` can expose you to security risks.rEh;jhFhIhPhhR}rF(hV]hW]hU]hT]hX]uh[M+h\hhc]rG(hrXNote that as before, not using rHrI}rJ(h:XNote that as before, not using h;jCubj)rK}rL(h:X``change_hook_auth``hR}rM(hV]hW]hU]hT]hX]uh;jChc]rNhrXchange_hook_authrOrP}rQ(h:Uh;jKubahPjubhrX" can expose you to security risks.rRrS}rT(h:X" can expose you to security risks.h;jCubeubeubh<)rU}rV(h:Uh;jhFhIhPhdhR}rW(hV]hW]hU]hT]rXUgoogle-code-hookrYahX]rZhauh[M.h\hhc]r[(hk)r\}r](h:XGoogle Code hookr^h;jUhFhIhPhohR}r_(hV]hW]hU]hT]hX]uh[M.h\hhc]r`hrXGoogle Code hookrarb}rc(h:j^h;j\ubaubh)rd}re(h:XThe Google Code hook is quite similar to the GitHub Hook. It has one option for the "Post-Commit Authentication Key" used to check if the request is legitimate::h;jUhFhIhPhhR}rf(hV]hW]hU]hT]hX]uh[M0h\hhc]rghrXThe Google Code hook is quite similar to the GitHub Hook. It has one option for the "Post-Commit Authentication Key" used to check if the request is legitimate:rhri}rj(h:XThe Google Code hook is quite similar to the GitHub Hook. It has one option for the "Post-Commit Authentication Key" used to check if the request is legitimate:h;jdubaubj)rk}rl(h:X{c['status'].append(html.WebStatus( # ... change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX'}} ))h;jUhFhIhPjhR}rm(jjhT]hU]hV]hW]hX]uh[M4h\hhc]rnhrX{c['status'].append(html.WebStatus( # ... change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX'}} ))rorp}rq(h:Uh;jkubaubh)rr}rs(h:XThis will add a "Post-Commit URL" for the project in the Google Code administrative interface, pointing to ``/change_hook/googlecode`` relative to the root of the web status.h;jUhFhIhPhhR}rt(hV]hW]hU]hT]hX]uh[M9h\hhc]ru(hrXkThis will add a "Post-Commit URL" for the project in the Google Code administrative interface, pointing to rvrw}rx(h:XkThis will add a "Post-Commit URL" for the project in the Google Code administrative interface, pointing to h;jrubj)ry}rz(h:X``/change_hook/googlecode``hR}r{(hV]hW]hU]hT]hX]uh;jrhc]r|hrX/change_hook/googlecoder}r~}r(h:Uh;jyubahPjubhrX( relative to the root of the web status.rr}r(h:X( relative to the root of the web status.h;jrubeubh)r}r(h:XAlternatively, you can use the :ref:`GoogleCodeAtomPoller` :class:`ChangeSource` that periodically poll the Google Code commit feed for changes.h;jUhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[M=h\hhc]r(hrXAlternatively, you can use the rr}r(h:XAlternatively, you can use the h;jubj)r}r(h:X:ref:`GoogleCodeAtomPoller`rh;jhFhIhPjhR}r(UreftypeXrefjjXgooglecodeatompollerU refdomainXstdrhT]hU]U refexplicithV]hW]hX]jjuh[M=hc]rj<)r}r(h:jhR}r(hV]hW]r(jjXstd-refrehU]hT]hX]uh;jhc]rhrXGoogleCodeAtomPollerrr}r(h:Uh;jubahPjDubaubhrX r}r(h:X h;jubj)r}r(h:X:class:`ChangeSource`rh;jhFhIhPjhR}r(UreftypeXclassjjX ChangeSourceU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[M=hc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX ChangeSourcerr}r(h:Uh;jubahPjubaubhrX@ that periodically poll the Google Code commit feed for changes.rr}r(h:X@ that periodically poll the Google Code commit feed for changes.h;jubeubj)r}r(h:XGoogle Code doesn't send the branch on which the changes were made. So, the hook always returns ``'default'`` as the branch, you can override it with the ``'branch'`` option:: change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX', 'branch': 'master'}}h;jUhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]r(h)r}r(h:XGoogle Code doesn't send the branch on which the changes were made. So, the hook always returns ``'default'`` as the branch, you can override it with the ``'branch'`` option::h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MBhc]r(hrX`Google Code doesn't send the branch on which the changes were made. So, the hook always returns rr}r(h:X`Google Code doesn't send the branch on which the changes were made. So, the hook always returns h;jubj)r}r(h:X ``'default'``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX 'default'rr}r(h:Uh;jubahPjubhrX- as the branch, you can override it with the rr}r(h:X- as the branch, you can override it with the h;jubj)r}r(h:X ``'branch'``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX'branch'rr}r(h:Uh;jubahPjubhrX option:rr}r(h:X option:h;jubeubj)r}r(h:X[change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX', 'branch': 'master'}}h;jhPjhR}r(jjhT]hU]hV]hW]hX]uh[MFhc]rhrX[change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX', 'branch': 'master'}}rr}r(h:Uh;jubaubeubeubh<)r}r(h:Uh;jhFhIhPhdhR}r(hV]hW]hU]hT]rU poller-hookrahX]rh)auh[MIh\hhc]r(hk)r}r(h:X Poller hookrh;jhFhIhPhohR}r(hV]hW]hU]hT]hX]uh[MIh\hhc]rhrX Poller hookrr}r(h:jh;jubaubh)r}r(h:X-The poller hook allows you to use GET or POST requests to trigger polling. One advantage of this is your buildbot instance can poll at launch (using the pollAtLaunch flag) to get changes that happened while it was down, but then you can still use a commit hook to get fast notification of new changes.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MKh\hhc]rhrX-The poller hook allows you to use GET or POST requests to trigger polling. One advantage of this is your buildbot instance can poll at launch (using the pollAtLaunch flag) to get changes that happened while it was down, but then you can still use a commit hook to get fast notification of new changes.rr}r(h:jh;jubaubh)r}r(h:X0Suppose you have a poller configured like this::rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MQh\hhc]rhrX/Suppose you have a poller configured like this:rr}r(h:X/Suppose you have a poller configured like this:h;jubaubj)r}r(h:Xc['change_source'] = SVNPoller( svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/amanda", split_file=split_file_branches, pollInterval=24*60*60, pollAtLaunch=True)h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[MSh\hhc]rhrXc['change_source'] = SVNPoller( svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/amanda", split_file=split_file_branches, pollInterval=24*60*60, pollAtLaunch=True)rr}r(h:Uh;jubaubh)r}r(h:X6And you configure your WebStatus to enable this hook::rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MYh\hhc]rhrX5And you configure your WebStatus to enable this hook:rr}r(h:X5And you configure your WebStatus to enable this hook:h;jubaubj)r}r(h:XYc['status'].append(html.WebStatus( # ... change_hook_dialects={'poller': True} ))h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[M[h\hhc]rhrXYc['status'].append(html.WebStatus( # ... change_hook_dialects={'poller': True} ))rr}r(h:Uh;jubaubh)r}r (h:XThen you will be able to trigger a poll of the SVN repository by poking the ``/change_hook/poller`` URL from a commit hook like this:h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M`h\hhc]r (hrXLThen you will be able to trigger a poll of the SVN repository by poking the r r }r(h:XLThen you will be able to trigger a poll of the SVN repository by poking the h;jubj)r}r(h:X``/change_hook/poller``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX/change_hook/pollerrr}r(h:Uh;jubahPjubhrX" URL from a commit hook like this:rr}r(h:X" URL from a commit hook like this:h;jubeubj)r}r(h:Xwcurl -s -F poller=https://amanda.svn.sourceforge.net/svnroot/amanda/amanda \ http://yourbuildbot/change_hook/pollerh;jhFhIhPjhR}r(jBjCXbashjjhT]hU]hV]hW]hX]uh[Mch\hhc]rhrXwcurl -s -F poller=https://amanda.svn.sourceforge.net/svnroot/amanda/amanda \ http://yourbuildbot/change_hook/pollerrr}r(h:Uh;jubaubh)r }r!(h:XgIf no ``poller`` argument is provided then the hook will trigger polling of all polling change sources.h;jhFhIhPhhR}r"(hV]hW]hU]hT]hX]uh[Mhh\hhc]r#(hrXIf no r$r%}r&(h:XIf no h;j ubj)r'}r((h:X ``poller``hR}r)(hV]hW]hU]hT]hX]uh;j hc]r*hrXpollerr+r,}r-(h:Uh;j'ubahPjubhrXW argument is provided then the hook will trigger polling of all polling change sources.r.r/}r0(h:XW argument is provided then the hook will trigger polling of all polling change sources.h;j ubeubh)r1}r2(h:XWYou can restrict which pollers the webhook has access to using the ``allowed`` option::h;jhFhIhPhhR}r3(hV]hW]hU]hT]hX]uh[Mkh\hhc]r4(hrXCYou can restrict which pollers the webhook has access to using the r5r6}r7(h:XCYou can restrict which pollers the webhook has access to using the h;j1ubj)r8}r9(h:X ``allowed``hR}r:(hV]hW]hU]hT]hX]uh;j1hc]r;hrXallowedr<r=}r>(h:Uh;j8ubahPjubhrX option:r?r@}rA(h:X option:h;j1ubeubj)rB}rC(h:Xc['status'].append(html.WebStatus( # ... change_hook_dialects={'poller': {'allowed': ['https://amanda.svn.sourceforge.net/svnroot/amanda/amanda']}} ))h;jhFhIhPjhR}rD(jjhT]hU]hV]hW]hX]uh[Mnh\hhc]rEhrXc['status'].append(html.WebStatus( # ... change_hook_dialects={'poller': {'allowed': ['https://amanda.svn.sourceforge.net/svnroot/amanda/amanda']}} ))rFrG}rH(h:Uh;jBubaubeubh<)rI}rJ(h:Uh;jhFhIhPhdhR}rK(hV]hW]hU]hT]rLU gitlab-hookrMahX]rNh/auh[Mth\hhc]rO(hk)rP}rQ(h:X GitLab hookrRh;jIhFhIhPhohR}rS(hV]hW]hU]hT]hX]uh[Mth\hhc]rThrX GitLab hookrUrV}rW(h:jRh;jPubaubh)rX}rY(h:XKThe GitLab hook is as simple as GitHub one and it also takes no options. ::rZh;jIhFhIhPhhR}r[(hV]hW]hU]hT]hX]uh[Mvh\hhc]r\hrXHThe GitLab hook is as simple as GitHub one and it also takes no options.r]r^}r_(h:XHThe GitLab hook is as simple as GitHub one and it also takes no options.h;jXubaubj)r`}ra(h:X\c['status'].append(html.WebStatus( # ... change_hook_dialects={ 'gitlab' : True } ))h;jIhFhIhPjhR}rb(jjhT]hU]hV]hW]hX]uh[Mxh\hhc]rchrX\c['status'].append(html.WebStatus( # ... change_hook_dialects={ 'gitlab' : True } ))rdre}rf(h:Uh;j`ubaubh)rg}rh(h:XWhen this is setup you should add a `POST` service pointing to ``/change_hook/gitlab`` relative to the root of the web status. For example, it the grid URL is ``http://builds.mycompany.com/bbot/grid``, then point GitLab to ``http://builds.mycompany.com/change_hook/gitlab``. The project and/or codebase can also be passed in the URL by appending ``?project=name`` or ``?codebase=foo`` to the URL. These parameters will be passed along to the scheduler.h;jIhFhIhPhhR}ri(hV]hW]hU]hT]hX]uh[M}h\hhc]rj(hrX$When this is setup you should add a rkrl}rm(h:X$When this is setup you should add a h;jgubj)rn}ro(h:X`POST`hR}rp(hV]hW]hU]hT]hX]uh;jghc]rqhrXPOSTrrrs}rt(h:Uh;jnubahPjubhrX service pointing to rurv}rw(h:X service pointing to h;jgubj)rx}ry(h:X``/change_hook/gitlab``hR}rz(hV]hW]hU]hT]hX]uh;jghc]r{hrX/change_hook/gitlabr|r}}r~(h:Uh;jxubahPjubhrXI relative to the root of the web status. For example, it the grid URL is rr}r(h:XI relative to the root of the web status. For example, it the grid URL is h;jgubj)r}r(h:X)``http://builds.mycompany.com/bbot/grid``hR}r(hV]hW]hU]hT]hX]uh;jghc]rhrX%http://builds.mycompany.com/bbot/gridrr}r(h:Uh;jubahPjubhrX, then point GitLab to rr}r(h:X, then point GitLab to h;jgubj)r}r(h:X2``http://builds.mycompany.com/change_hook/gitlab``hR}r(hV]hW]hU]hT]hX]uh;jghc]rhrX.http://builds.mycompany.com/change_hook/gitlabrr}r(h:Uh;jubahPjubhrXI. The project and/or codebase can also be passed in the URL by appending rr}r(h:XI. The project and/or codebase can also be passed in the URL by appending h;jgubj)r}r(h:X``?project=name``hR}r(hV]hW]hU]hT]hX]uh;jghc]rhrX ?project=namerr}r(h:Uh;jubahPjubhrX or rr}r(h:X or h;jgubj)r}r(h:X``?codebase=foo``hR}r(hV]hW]hU]hT]hX]uh;jghc]rhrX ?codebase=foorr}r(h:Uh;jubahPjubhrXD to the URL. These parameters will be passed along to the scheduler.rr}r(h:XD to the URL. These parameters will be passed along to the scheduler.h;jgubeubj )r}r(h:XAs in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from your GitLab server, potentially causing the buildmaster to run arbitrary code.h;jIhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]rh)r}r(h:XAs in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from your GitLab server, potentially causing the buildmaster to run arbitrary code.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXAs in the previous case, the incoming HTTP requests for this hook are not authenticated bu default. Anyone who can access the web status can "fake" a request from your GitLab server, potentially causing the buildmaster to run arbitrary code.rr}r(h:jh;jubaubaubh)r}r(h:XYTo protect URL against unauthorized access you should use ``change_hook_auth`` option. ::rh;jIhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX:To protect URL against unauthorized access you should use rr}r(h:X:To protect URL against unauthorized access you should use h;jubj)r}r(h:X``change_hook_auth``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXchange_hook_authrr}r(h:Uh;jubahPjubhrX option.rr}r(h:X option.h;jubeubj)r}r(h:X_c['status'].append(html.WebStatus( # ... change_hook_auth=["file:changehook.passwd"] ))h;jIhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrX_c['status'].append(html.WebStatus( # ... change_hook_auth=["file:changehook.passwd"] ))rr}r(h:Uh;jubaubh)r}r(h:XThen, create a GitLab service hook (see https://your.gitlab.server/help/web_hooks) with a WebHook URL like ``http://user:password@builds.mycompany.com/bbot/change_hook/gitlab``.rh;jIhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX(Then, create a GitLab service hook (see rr}r(h:X(Then, create a GitLab service hook (see h;jubh)r}r(h:X)https://your.gitlab.server/help/web_hooksrhR}r(UrefurijhT]hU]hV]hW]hX]uh;jhc]rhrX)https://your.gitlab.server/help/web_hooksrr}r(h:Uh;jubahPhubhrX) with a WebHook URL like rr}r(h:X) with a WebHook URL like h;jubj)r}r(h:XE``http://user:password@builds.mycompany.com/bbot/change_hook/gitlab``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXAhttp://user:password@builds.mycompany.com/bbot/change_hook/gitlabrr}r(h:Uh;jubahPjubhrX.r}r(h:X.h;jubeubh)r}r(h:XUNote that as before, not using ``change_hook_auth`` can expose you to security risks.rh;jIhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXNote that as before, not using rr}r(h:XNote that as before, not using h;jubj)r}r(h:X``change_hook_auth``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXchange_hook_authrr}r(h:Uh;jubahPjubhrX" can expose you to security risks.rr}r(h:X" can expose you to security risks.h;jubeubeubjeubhFhIhPhdhR}r(hV]hW]hU]hT]rUgitorious-hookrahX]rhauh[Mh\hhc]r(hk)r}r(h:XGitorious Hookrh;jhFhIhPhohR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXGitorious Hookrr}r (h:jh;jubaubh)r }r (h:XNThe Gitorious hook is as simple as GitHub one and it also takes no options. ::r h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXKThe Gitorious hook is as simple as GitHub one and it also takes no options.rr}r(h:XKThe Gitorious hook is as simple as GitHub one and it also takes no options.h;j ubaubj)r}r(h:X\c['status'].append(html.WebStatus( # ... change_hook_dialects={'gitorious': True} ))h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrX\c['status'].append(html.WebStatus( # ... change_hook_dialects={'gitorious': True} ))rr}r(h:Uh;jubaubh)r}r(h:XWhen this is setup you should add a `POST` service pointing to ``/change_hook/gitorious`` relative to the root of the web status. For example, it the grid URL is ``http://builds.mycompany.com/bbot/grid``, then point Gitorious to ``http://builds.mycompany.com/change_hook/gitorious``.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX$When this is setup you should add a rr}r(h:X$When this is setup you should add a h;jubj)r }r!(h:X`POST`hR}r"(hV]hW]hU]hT]hX]uh;jhc]r#hrXPOSTr$r%}r&(h:Uh;j ubahPjubhrX service pointing to r'r(}r)(h:X service pointing to h;jubj)r*}r+(h:X``/change_hook/gitorious``hR}r,(hV]hW]hU]hT]hX]uh;jhc]r-hrX/change_hook/gitoriousr.r/}r0(h:Uh;j*ubahPjubhrXI relative to the root of the web status. For example, it the grid URL is r1r2}r3(h:XI relative to the root of the web status. For example, it the grid URL is h;jubj)r4}r5(h:X)``http://builds.mycompany.com/bbot/grid``hR}r6(hV]hW]hU]hT]hX]uh;jhc]r7hrX%http://builds.mycompany.com/bbot/gridr8r9}r:(h:Uh;j4ubahPjubhrX, then point Gitorious to r;r<}r=(h:X, then point Gitorious to h;jubj)r>}r?(h:X5``http://builds.mycompany.com/change_hook/gitorious``hR}r@(hV]hW]hU]hT]hX]uh;jhc]rAhrX1http://builds.mycompany.com/change_hook/gitoriousrBrC}rD(h:Uh;j>ubahPjubhrX.rE}rF(h:X.h;jubeubj )rG}rH(h:XAs in the previous case, the incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from your Gitorious server, potentially causing the buildmaster to run arbitrary code.h;jhFhIhPj hR}rI(hV]hW]hU]hT]hX]uh[Nh\hhc]rJh)rK}rL(h:XAs in the previous case, the incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from your Gitorious server, potentially causing the buildmaster to run arbitrary code.rMh;jGhFhIhPhhR}rN(hV]hW]hU]hT]hX]uh[Mhc]rOhrXAs in the previous case, the incoming HTTP requests for this hook are not authenticated by default. Anyone who can access the web status can "fake" a request from your Gitorious server, potentially causing the buildmaster to run arbitrary code.rPrQ}rR(h:jMh;jKubaubaubh)rS}rT(h:XYTo protect URL against unauthorized access you should use ``change_hook_auth`` option. ::rUh;jhFhIhPhhR}rV(hV]hW]hU]hT]hX]uh[Mh\hhc]rW(hrX:To protect URL against unauthorized access you should use rXrY}rZ(h:X:To protect URL against unauthorized access you should use h;jSubj)r[}r\(h:X``change_hook_auth``hR}r](hV]hW]hU]hT]hX]uh;jShc]r^hrXchange_hook_authr_r`}ra(h:Uh;j[ubahPjubhrX option.rbrc}rd(h:X option.h;jSubeubj)re}rf(h:X_c['status'].append(html.WebStatus( # ... change_hook_auth=["file:changehook.passwd"] ))h;jhFhIhPjhR}rg(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhhrX_c['status'].append(html.WebStatus( # ... change_hook_auth=["file:changehook.passwd"] ))rirj}rk(h:Uh;jeubaubh)rl}rm(h:XThen, create a Gitorious web hook (see http://gitorious.org/gitorious/pages/WebHooks) with a WebHook URL like ``http://user:password@builds.mycompany.com/bbot/change_hook/gitorious``.rnh;jhFhIhPhhR}ro(hV]hW]hU]hT]hX]uh[Mh\hhc]rp(hrX'Then, create a Gitorious web hook (see rqrr}rs(h:X'Then, create a Gitorious web hook (see h;jlubh)rt}ru(h:X-http://gitorious.org/gitorious/pages/WebHooksrvhR}rw(UrefurijvhT]hU]hV]hW]hX]uh;jlhc]rxhrX-http://gitorious.org/gitorious/pages/WebHooksryrz}r{(h:Uh;jtubahPhubhrX) with a WebHook URL like r|r}}r~(h:X) with a WebHook URL like h;jlubj)r}r(h:XH``http://user:password@builds.mycompany.com/bbot/change_hook/gitorious``hR}r(hV]hW]hU]hT]hX]uh;jlhc]rhrXDhttp://user:password@builds.mycompany.com/bbot/change_hook/gitoriousrr}r(h:Uh;jubahPjubhrX.r}r(h:X.h;jlubeubh)r}r(h:XUNote that as before, not using ``change_hook_auth`` can expose you to security risks.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXNote that as before, not using rr}r(h:XNote that as before, not using h;jubj)r}r(h:X``change_hook_auth``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXchange_hook_authrr}r(h:Uh;jubahPjubhrX" can expose you to security risks.rr}r(h:X" can expose you to security risks.h;jubeubj)r}r(h:XWeb hooks are only available for local Gitorious installations, since this feature is not offered as part of Gitorious.org yet.h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]rh)r}r(h:XWeb hooks are only available for local Gitorious installations, since this feature is not offered as part of Gitorious.org yet.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXWeb hooks are only available for local Gitorious installations, since this feature is not offered as part of Gitorious.org yet.rr}r(h:jh;jubaubaubj)r}r(h:Uh;jhFhIhPjhR}r(hT]hU]hV]hW]hX]Uentries]r((UsingleXStatus Targets; MailNotifierXstatus-MailNotifierrjtr(UsingleXMailNotifier Status Targetjjtreuh[Mh\hhc]ubhM)r}r(h:Uh;jhFhIhPhQhR}r(hV]hW]hU]hT]rjahX]uh[Mh\hhc]ubj)r}r(h:Uh;jhFhIhPjhR}r(hT]hU]hV]hW]hX]Uentriesr]r(UsinglerXemail; MailNotifierjUtraUinlineruh[Mh\hhc]ubjeubhFhIhPhQhR}r(hT]hU]hV]hW]hX]hYjuh[Mh\hhc]ubshc]r(hk)r}r(h:jh;jhFhIhPhohR}r(hT]hU]hV]hW]hX]hYhuh[Mh\hhc]rhrX MailNotifierrr}r(h:jh;jubaubj)r}r(h:Uh;jhFNhPjhR}r(hT]hU]hV]hW]hX]Uentries]r(jX2buildbot.status.mail.MailNotifier (built-in class)h'Utrauh[Nh\hhc]ubcsphinx.addnodes desc r)r}r(h:Uh;jhFNhPUdescrhR}r(UnoindexrUdomainrXpyhT]hU]hV]hW]hX]UobjtyperXclassrUdesctyperjuh[Nh\hhc]r(csphinx.addnodes desc_signature r)r}r(h:X!buildbot.status.mail.MailNotifierh;jhFhIhPUdesc_signaturerhR}r(hT]rh'aUmodulerNhU]hV]hW]hX]rh'aUfullnamerh'UclassrXbuildbot.status.mailUfirstruh[Mh\hhc]r(csphinx.addnodes desc_annotation r)r}r(h:Xclass h;jhFhIhPUdesc_annotationrhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXclass rr}r(h:Uh;jubaubcsphinx.addnodes desc_addname r)r}r(h:Xbuildbot.status.mail.h;jhFhIhPU desc_addnamerhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXbuildbot.status.mail.rr}r(h:Uh;jubaubcsphinx.addnodes desc_name r)r}r(h:X MailNotifierh;jhFhIhPU desc_namerhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrX MailNotifierrr}r(h:Uh;jubaubeubcsphinx.addnodes desc_content r)r}r(h:Uh;jhFhIhPU desc_contentrhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]ubeubh)r}r(h:X The buildbot can also send email when builds finish. The most common use of this is to tell developers when their change has caused the build to fail. It is also quite common to send a message to a mailing list (usually named `builds` or similar) about every build.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe buildbot can also send email when builds finish. The most common use of this is to tell developers when their change has caused the build to fail. It is also quite common to send a message to a mailing list (usually named rr}r(h:XThe buildbot can also send email when builds finish. The most common use of this is to tell developers when their change has caused the build to fail. It is also quite common to send a message to a mailing list (usually named h;jubj)r}r(h:X`builds`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbuildsr r }r (h:Uh;jubahPjubhrX or similar) about every build.r r }r(h:X or similar) about every build.h;jubeubh)r}r(h:XThe :class:`MailNotifier` status target is used to accomplish this. You configure it by specifying who mail should be sent to, under what circumstances mail should be sent, and how to deliver the mail. It can be configured to only send out mail for certain builders, and only send messages when the build fails, or when the builder transitions from success to failure. It can also be configured to include various build logs in each message.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X:class:`MailNotifier`rh;jhFhIhPjhR}r(UreftypeXclassjjX MailNotifierU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classr ehU]hT]hX]uh;jhc]r!hrX MailNotifierr"r#}r$(h:Uh;jubahPjubaubhrX status target is used to accomplish this. You configure it by specifying who mail should be sent to, under what circumstances mail should be sent, and how to deliver the mail. It can be configured to only send out mail for certain builders, and only send messages when the build fails, or when the builder transitions from success to failure. It can also be configured to include various build logs in each message.r%r&}r'(h:X status target is used to accomplish this. You configure it by specifying who mail should be sent to, under what circumstances mail should be sent, and how to deliver the mail. It can be configured to only send out mail for certain builders, and only send messages when the build fails, or when the builder transitions from success to failure. It can also be configured to include various build logs in each message.h;jubeubh)r(}r)(h:XIf a proper lookup function is configured, the message will be sent to the "interested users" list (:ref:`Doing-Things-With-Users`), which includes all developers who made changes in the build. By default, however, Buildbot does not know how to construct an email addressed based on the information from the version control system. See the ``lookup`` argument, below, for more information.h;jhFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mh\hhc]r+(hrXdIf a proper lookup function is configured, the message will be sent to the "interested users" list (r,r-}r.(h:XdIf a proper lookup function is configured, the message will be sent to the "interested users" list (h;j(ubj)r/}r0(h:X:ref:`Doing-Things-With-Users`r1h;j(hFhIhPjhR}r2(UreftypeXrefjjXdoing-things-with-usersU refdomainXstdr3hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r4j<)r5}r6(h:j1hR}r7(hV]hW]r8(jj3Xstd-refr9ehU]hT]hX]uh;j/hc]r:hrXDoing-Things-With-Usersr;r<}r=(h:Uh;j5ubahPjDubaubhrX), which includes all developers who made changes in the build. By default, however, Buildbot does not know how to construct an email addressed based on the information from the version control system. See the r>r?}r@(h:X), which includes all developers who made changes in the build. By default, however, Buildbot does not know how to construct an email addressed based on the information from the version control system. See the h;j(ubj)rA}rB(h:X ``lookup``hR}rC(hV]hW]hU]hT]hX]uh;j(hc]rDhrXlookuprErF}rG(h:Uh;jAubahPjubhrX' argument, below, for more information.rHrI}rJ(h:X' argument, below, for more information.h;j(ubeubh)rK}rL(h:XYou can add additional, statically-configured, recipients with the ``extraRecipients`` argument. You can also add interested users by setting the ``owners`` build property to a list of users in the scheduler constructor (:ref:`Configuring-Schedulers`).h;jhFhIhPhhR}rM(hV]hW]hU]hT]hX]uh[Mh\hhc]rN(hrXCYou can add additional, statically-configured, recipients with the rOrP}rQ(h:XCYou can add additional, statically-configured, recipients with the h;jKubj)rR}rS(h:X``extraRecipients``hR}rT(hV]hW]hU]hT]hX]uh;jKhc]rUhrXextraRecipientsrVrW}rX(h:Uh;jRubahPjubhrX= argument. You can also add interested users by setting the rYrZ}r[(h:X= argument. You can also add interested users by setting the h;jKubj)r\}r](h:X ``owners``hR}r^(hV]hW]hU]hT]hX]uh;jKhc]r_hrXownersr`ra}rb(h:Uh;j\ubahPjubhrXA build property to a list of users in the scheduler constructor (rcrd}re(h:XA build property to a list of users in the scheduler constructor (h;jKubj)rf}rg(h:X:ref:`Configuring-Schedulers`rhh;jKhFhIhPjhR}ri(UreftypeXrefjjXconfiguring-schedulersU refdomainXstdrjhT]hU]U refexplicithV]hW]hX]jjuh[Mhc]rkj<)rl}rm(h:jhhR}rn(hV]hW]ro(jjjXstd-refrpehU]hT]hX]uh;jfhc]rqhrXConfiguring-Schedulersrrrs}rt(h:Uh;jlubahPjDubaubhrX).rurv}rw(h:X).h;jKubeubh)rx}ry(h:XEach :class:`MailNotifier` sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple :class:`MailNotifier`\s.h;jhFhIhPhhR}rz(hV]hW]hU]hT]hX]uh[Mh\hhc]r{(hrXEach r|r}}r~(h:XEach h;jxubj)r}r(h:X:class:`MailNotifier`rh;jxhFhIhPjhR}r(UreftypeXclassjjX MailNotifierU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX MailNotifierrr}r(h:Uh;jubahPjubaubhrXq sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple rr}r(h:Xq sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple h;jxubj)r}r(h:X:class:`MailNotifier`rh;jxhFhIhPjhR}r(UreftypeXclassjjX MailNotifierU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX MailNotifierrr}r(h:Uh;jubahPjubaubhrXs.rr}r(h:X\s.h;jxubeubh)r}r(h:XThe following simple example will send an email upon the completion of each build, to just those developers whose :class:`Change`\s were included in the build. The email contains a description of the :class:`Build`, its results, and URLs where more information can be obtained. ::h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXrThe following simple example will send an email upon the completion of each build, to just those developers whose rr}r(h:XrThe following simple example will send an email upon the completion of each build, to just those developers whose h;jubj)r}r(h:X:class:`Change`rh;jhFhIhPjhR}r(UreftypeXclassjjXChangeU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXChangerr}r(h:Uh;jubahPjubaubhrXFs were included in the build. The email contains a description of the rr}r(h:XG\s were included in the build. The email contains a description of the h;jubj)r}r(h:X:class:`Build`rh;jhFhIhPjhR}r(UreftypeXclassjjXBuildU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXBuildrr}r(h:Uh;jubahPjubaubhrX?, its results, and URLs where more information can be obtained.rr}r(h:X?, its results, and URLs where more information can be obtained.h;jubeubj)r}r(h:Xfrom buildbot.status.mail import MailNotifier mn = MailNotifier(fromaddr="buildbot@example.org", lookup="example.org") c['status'].append(mn)h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrXfrom buildbot.status.mail import MailNotifier mn = MailNotifier(fromaddr="buildbot@example.org", lookup="example.org") c['status'].append(mn)rr}r(h:Uh;jubaubh)r}r(h:X-To get a simple one-message-per-build (say, for a mailing list), use the following form instead. This form does not send mail to individual developers (and thus does not need the ``lookup=`` argument, explained below), instead it only ever sends mail to the `extra recipients` named in the arguments::h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXTo get a simple one-message-per-build (say, for a mailing list), use the following form instead. This form does not send mail to individual developers (and thus does not need the rr}r(h:XTo get a simple one-message-per-build (say, for a mailing list), use the following form instead. This form does not send mail to individual developers (and thus does not need the h;jubj)r}r(h:X ``lookup=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXlookup=rr}r(h:Uh;jubahPjubhrXD argument, explained below), instead it only ever sends mail to the rr}r(h:XD argument, explained below), instead it only ever sends mail to the h;jubj)r}r(h:X`extra recipients`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXextra recipientsrr}r(h:Uh;jubahPjubhrX named in the arguments:rr}r(h:X named in the arguments:h;jubeubj)r}r(h:Xmn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, extraRecipients=['listaddr@example.org'])h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrXmn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, extraRecipients=['listaddr@example.org'])rr}r(h:Uh;jubaubh)r}r(h:XIf your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying ``smtpUser`` and ``smptPassword``::h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXsIf your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying rr}r(h:XsIf your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying h;jubj)r}r(h:X ``smtpUser``hR}r (hV]hW]hU]hT]hX]uh;jhc]r hrXsmtpUserr r }r (h:Uh;jubahPjubhrX and r r }r (h:X and h;jubj)r }r (h:X``smptPassword``hR}r (hV]hW]hU]hT]hX]uh;jhc]r hrX smptPasswordr r }r (h:Uh;j ubahPjubhrX:r }r (h:X:h;jubeubj)r }r (h:Xmn = MailNotifier(fromaddr="myuser@gmail.com", sendToInterestedUsers=False, extraRecipients=["listaddr@example.org"], relayhost="smtp.gmail.com", smtpPort=587, smtpUser="myuser@gmail.com", smtpPassword="mypassword")h;jhFhIhPjhR}r (jjhT]hU]hV]hW]hX]uh[Mh\hhc]r hrXmn = MailNotifier(fromaddr="myuser@gmail.com", sendToInterestedUsers=False, extraRecipients=["listaddr@example.org"], relayhost="smtp.gmail.com", smtpPort=587, smtpUser="myuser@gmail.com", smtpPassword="mypassword")r r }r (h:Uh;j ubaubh)r }r (h:XYIf you want to require Transport Layer Security (TLS), then you can also set ``useTls``::h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (hrXMIf you want to require Transport Layer Security (TLS), then you can also set r r }r (h:XMIf you want to require Transport Layer Security (TLS), then you can also set h;j ubj)r }r (h:X ``useTls``hR}r! (hV]hW]hU]hT]hX]uh;j hc]r" hrXuseTlsr# r$ }r% (h:Uh;j ubahPjubhrX:r& }r' (h:X:h;j ubeubj)r( }r) (h:X,mn = MailNotifier(fromaddr="myuser@gmail.com", sendToInterestedUsers=False, extraRecipients=["listaddr@example.org"], useTls=True, relayhost="smtp.gmail.com", smtpPort=587, smtpUser="myuser@gmail.com", smtpPassword="mypassword")h;jhFhIhPjhR}r* (jjhT]hU]hV]hW]hX]uh[Mh\hhc]r+ hrX,mn = MailNotifier(fromaddr="myuser@gmail.com", sendToInterestedUsers=False, extraRecipients=["listaddr@example.org"], useTls=True, relayhost="smtp.gmail.com", smtpPort=587, smtpUser="myuser@gmail.com", smtpPassword="mypassword")r, r- }r. (h:Uh;j( ubaubj)r/ }r0 (h:XIf you see ``twisted.mail.smtp.TLSRequiredError`` exceptions in the log while using TLS, this can be due *either* to the server not supporting TLS or to a missing `PyOpenSSL`_ package on the buildmaster system.h;jhFhIhPjhR}r1 (hV]hW]hU]hT]hX]uh[Nh\hhc]r2 h)r3 }r4 (h:XIf you see ``twisted.mail.smtp.TLSRequiredError`` exceptions in the log while using TLS, this can be due *either* to the server not supporting TLS or to a missing `PyOpenSSL`_ package on the buildmaster system.h;j/ hFhIhPhhR}r5 (hV]hW]hU]hT]hX]uh[M hc]r6 (hrX If you see r7 r8 }r9 (h:X If you see h;j3 ubj)r: }r; (h:X&``twisted.mail.smtp.TLSRequiredError``hR}r< (hV]hW]hU]hT]hX]uh;j3 hc]r= hrX"twisted.mail.smtp.TLSRequiredErrorr> r? }r@ (h:Uh;j: ubahPjubhrX8 exceptions in the log while using TLS, this can be due rA rB }rC (h:X8 exceptions in the log while using TLS, this can be due h;j3 ubj<)rD }rE (h:X*either*hR}rF (hV]hW]hU]hT]hX]uh;j3 hc]rG hrXeitherrH rI }rJ (h:Uh;jD ubahPjDubhrX2 to the server not supporting TLS or to a missing rK rL }rM (h:X2 to the server not supporting TLS or to a missing h;j3 ubh)rN }rO (h:X `PyOpenSSL`_UresolvedrP Kh;j3 hPhhR}rQ (UnameX PyOpenSSLj'X!http://pyopenssl.sourceforge.net/rR hT]hU]hV]hW]hX]uhc]rS hrX PyOpenSSLrT rU }rV (h:Uh;jN ubaubhrX# package on the buildmaster system.rW rX }rY (h:X# package on the buildmaster system.h;j3 ubeubaubh)rZ }r[ (h:X In some cases it is desirable to have different information then what is provided in a standard MailNotifier message. For this purpose MailNotifier provides the argument ``messageFormatter`` (a function) which allows for the creation of messages with unique content.h;jhFhIhPhhR}r\ (hV]hW]hU]hT]hX]uh[Mh\hhc]r] (hrXIn some cases it is desirable to have different information then what is provided in a standard MailNotifier message. For this purpose MailNotifier provides the argument r^ r_ }r` (h:XIn some cases it is desirable to have different information then what is provided in a standard MailNotifier message. For this purpose MailNotifier provides the argument h;jZ ubj)ra }rb (h:X``messageFormatter``hR}rc (hV]hW]hU]hT]hX]uh;jZ hc]rd hrXmessageFormatterre rf }rg (h:Uh;ja ubahPjubhrXL (a function) which allows for the creation of messages with unique content.rh ri }rj (h:XL (a function) which allows for the creation of messages with unique content.h;jZ ubeubh)rk }rl (h:XOFor example, if only short emails are desired (e.g., for delivery to phones) ::rm h;jhFhIhPhhR}rn (hV]hW]hU]hT]hX]uh[Mh\hhc]ro hrXLFor example, if only short emails are desired (e.g., for delivery to phones)rp rq }rr (h:XLFor example, if only short emails are desired (e.g., for delivery to phones)h;jk ubaubj)rs }rt (h:Xfrom buildbot.status.builder import Results def messageFormatter(mode, name, build, results, master_status): result = Results[results] text = list() text.append("STATUS: %s" % result.title()) return { 'body' : "\n".join(text), 'type' : 'plain' } mn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, mode=('problem',), extraRecipients=['listaddr@example.org'], messageFormatter=messageFormatter)h;jhFhIhPjhR}ru (jjhT]hU]hV]hW]hX]uh[Mh\hhc]rv hrXfrom buildbot.status.builder import Results def messageFormatter(mode, name, build, results, master_status): result = Results[results] text = list() text.append("STATUS: %s" % result.title()) return { 'body' : "\n".join(text), 'type' : 'plain' } mn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, mode=('problem',), extraRecipients=['listaddr@example.org'], messageFormatter=messageFormatter)rw rx }ry (h:Uh;js ubaubh)rz }r{ (h:XAnother example of a function delivering a customized html email containing the last 80 log lines of logs of the last build step is given below::h;jhFhIhPhhR}r| (hV]hW]hU]hT]hX]uh[M&h\hhc]r} hrXAnother example of a function delivering a customized html email containing the last 80 log lines of logs of the last build step is given below:r~ r }r (h:XAnother example of a function delivering a customized html email containing the last 80 log lines of logs of the last build step is given below:h;jz ubaubj)r }r (h:Xfrom buildbot.status.builder import Results import cgi, datetime def html_message_formatter(mode, name, build, results, master_status): """Provide a customized message to Buildbot's MailNotifier. The last 80 lines of the log are provided as well as the changes relevant to the build. Message content is formatted as html. """ result = Results[results] limit_lines = 80 text = list() text.append(u'

Build status: %s

' % result.upper()) text.append(u'') text.append(u"" % build.getSlavename()) if master_status.getURLForThing(build): text.append(u'' % (master_status.getURLForThing(build), master_status.getURLForThing(build)) ) text.append(u'' % build.getReason()) source = u"" for ss in build.getSourceStamps(): if ss.codebase: source += u'%s: ' % ss.codebase if ss.branch: source += u"[branch %s] " % ss.branch if ss.revision: source += ss.revision else: source += u"HEAD" if ss.patch: source += u" (plus patch)" if ss.patch_info: # add patch comment source += u" (%s)" % ss.patch_info[1] text.append(u"" % source) text.append(u"" % ",".join(build.getResponsibleUsers())) text.append(u'
Buildslave for this Build:%s
Complete logs for all build steps:%s
Build Reason:%s
Build Source Stamp:%s
Blamelist:%s
') if ss.changes: text.append(u'

Recent Changes:

') for c in ss.changes: cd = c.asDict() when = datetime.datetime.fromtimestamp(cd['when'] ).ctime() text.append(u'') text.append(u'' % cd['repository'] ) text.append(u'' % cd['project'] ) text.append(u'' % when) text.append(u'' % cd['who'] ) text.append(u'' % cd['comments'] ) text.append(u'
Repository:%s
Project:%s
Time:%s
Changed by:%s
Comments:%s
') files = cd['files'] if files: text.append(u'') for file in files: text.append(u'' % file['name'] ) text.append(u'
Files
%s:
') text.append(u'
') # get log for last step logs = build.getLogs() # logs within a step are in reverse order. Search back until we find stdio for log in reversed(logs): if log.getName() == 'stdio': break name = "%s.%s" % (log.getStep().getName(), log.getName()) status, dummy = log.getStep().getResults() content = log.getText().splitlines() # Note: can be VERY LARGE url = u'%s/steps/%s/logs/%s' % (master_status.getURLForThing(build), log.getStep().getName(), log.getName()) text.append(u'Detailed log of last build step: %s' % (url, url)) text.append(u'
') text.append(u'

Last %d lines of "%s"

' % (limit_lines, name)) unilist = list() for line in content[len(content)-limit_lines:]: unilist.append(cgi.escape(unicode(line,'utf-8'))) text.append(u'
')
        text.extend(unilist)
        text.append(u'
') text.append(u'

') text.append(u'-The Buildbot') return { 'body': u"\n".join(text), 'type': 'html' } mn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, mode=('failing',), extraRecipients=['listaddr@example.org'], messageFormatter=html_message_formatter)h;jhFhIhPjhR}r (jjhT]hU]hV]hW]hX]uh[M*h\hhc]r hrXfrom buildbot.status.builder import Results import cgi, datetime def html_message_formatter(mode, name, build, results, master_status): """Provide a customized message to Buildbot's MailNotifier. The last 80 lines of the log are provided as well as the changes relevant to the build. Message content is formatted as html. """ result = Results[results] limit_lines = 80 text = list() text.append(u'

Build status: %s

' % result.upper()) text.append(u'') text.append(u"" % build.getSlavename()) if master_status.getURLForThing(build): text.append(u'' % (master_status.getURLForThing(build), master_status.getURLForThing(build)) ) text.append(u'' % build.getReason()) source = u"" for ss in build.getSourceStamps(): if ss.codebase: source += u'%s: ' % ss.codebase if ss.branch: source += u"[branch %s] " % ss.branch if ss.revision: source += ss.revision else: source += u"HEAD" if ss.patch: source += u" (plus patch)" if ss.patch_info: # add patch comment source += u" (%s)" % ss.patch_info[1] text.append(u"" % source) text.append(u"" % ",".join(build.getResponsibleUsers())) text.append(u'
Buildslave for this Build:%s
Complete logs for all build steps:%s
Build Reason:%s
Build Source Stamp:%s
Blamelist:%s
') if ss.changes: text.append(u'

Recent Changes:

') for c in ss.changes: cd = c.asDict() when = datetime.datetime.fromtimestamp(cd['when'] ).ctime() text.append(u'') text.append(u'' % cd['repository'] ) text.append(u'' % cd['project'] ) text.append(u'' % when) text.append(u'' % cd['who'] ) text.append(u'' % cd['comments'] ) text.append(u'
Repository:%s
Project:%s
Time:%s
Changed by:%s
Comments:%s
') files = cd['files'] if files: text.append(u'') for file in files: text.append(u'' % file['name'] ) text.append(u'
Files
%s:
') text.append(u'
') # get log for last step logs = build.getLogs() # logs within a step are in reverse order. Search back until we find stdio for log in reversed(logs): if log.getName() == 'stdio': break name = "%s.%s" % (log.getStep().getName(), log.getName()) status, dummy = log.getStep().getResults() content = log.getText().splitlines() # Note: can be VERY LARGE url = u'%s/steps/%s/logs/%s' % (master_status.getURLForThing(build), log.getStep().getName(), log.getName()) text.append(u'Detailed log of last build step: %s' % (url, url)) text.append(u'
') text.append(u'

Last %d lines of "%s"

' % (limit_lines, name)) unilist = list() for line in content[len(content)-limit_lines:]: unilist.append(cgi.escape(unicode(line,'utf-8'))) text.append(u'
')
        text.extend(unilist)
        text.append(u'
') text.append(u'

') text.append(u'-The Buildbot') return { 'body': u"\n".join(text), 'type': 'html' } mn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, mode=('failing',), extraRecipients=['listaddr@example.org'], messageFormatter=html_message_formatter)r r }r (h:Uh;j ubaubh<)r }r (h:Uh;jhFhIhPhdhR}r (hV]hW]hU]hT]r jahX]r hauh[Mh\hhc]r (hk)r }r (h:jh;j hFhIhPhohR}r (hT]hU]hV]hW]hX]hYjuh[Mh\hhc]r hrXMailNotifier argumentsr r }r (h:jh;j ubaubcdocutils.nodes definition_list r )r }r (h:Uh;j hFhIhPUdefinition_listr hR}r (hV]hW]hU]hT]hX]uh[Nh\hhc]r (cdocutils.nodes definition_list_item r )r }r (h:X@``fromaddr`` The email address to be used in the 'From' header. h;j hFhIhPUdefinition_list_itemr hR}r (hV]hW]hU]hT]hX]uh[Mhc]r (cdocutils.nodes term r )r }r (h:X ``fromaddr``r h;j hFhIhPUtermr hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXfromaddrr r }r (h:Uh;j ubahPjubaubcdocutils.nodes definition r )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X2The email address to be used in the 'From' header.r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrX2The email address to be used in the 'From' header.r r }r (h:j h;j ubaubahPU definitionr ubeubj )r }r (h:X``sendToInterestedUsers`` (boolean). If ``True`` (the default), send mail to all of the Interested Users. If ``False``, only send mail to the ``extraRecipients`` list. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X``sendToInterestedUsers``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXsendToInterestedUsersr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X(boolean). If ``True`` (the default), send mail to all of the Interested Users. If ``False``, only send mail to the ``extraRecipients`` list.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX(boolean). If r r }r (h:X(boolean). If h;j ubj)r }r (h:X``True``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXTruer r }r (h:Uh;j ubahPjubhrX= (the default), send mail to all of the Interested Users. If r r }r (h:X= (the default), send mail to all of the Interested Users. If h;j ubj)r }r (h:X ``False``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXFalser r }r (h:Uh;j ubahPjubhrX, only send mail to the r r }r (h:X, only send mail to the h;j ubj)r }r (h:X``extraRecipients``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXextraRecipientsr r }r (h:Uh;j ubahPjubhrX list.r r }r (h:X list.h;j ubeubahPj ubeubj )r }r (h:XX``extraRecipients`` (list of strings). A list of email addresses to which messages should be sent (in addition to the InterestedUsers list, which includes any developers who made :class:`Change`\s that went into this build). It is a good idea to create a small mailing list and deliver to that, then let subscribers come and go as they please. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X``extraRecipients``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXextraRecipientsr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:XC(list of strings). A list of email addresses to which messages should be sent (in addition to the InterestedUsers list, which includes any developers who made :class:`Change`\s that went into this build). It is a good idea to create a small mailing list and deliver to that, then let subscribers come and go as they please.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX(list of strings). A list of email addresses to which messages should be sent (in addition to the InterestedUsers list, which includes any developers who made r r }r (h:X(list of strings). A list of email addresses to which messages should be sent (in addition to the InterestedUsers list, which includes any developers who made h;j ubj)r }r (h:X:class:`Change`r h;j hFhIhPjhR}r (UreftypeXclassjjXChangeU refdomainXpyr hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r j)r }r (h:j hR}r (hV]hW]r (jj Xpy-classr ehU]hT]hX]uh;j hc]r hrXChanger r }r (h:Uh;j ubahPjubaubhrXs that went into this build). It is a good idea to create a small mailing list and deliver to that, then let subscribers come and go as they please.r r! }r" (h:X\s that went into this build). It is a good idea to create a small mailing list and deliver to that, then let subscribers come and go as they please.h;j ubeubahPj ubeubj )r# }r$ (h:X``subject`` (string). A string to be used as the subject line of the message. ``%(builder)s`` will be replaced with the name of the builder which provoked the message. h;j hFhIhPj hR}r% (hV]hW]hU]hT]hX]uh[Mh\hhc]r& (j )r' }r( (h:X ``subject``r) h;j# hFhIhPj hR}r* (hV]hW]hU]hT]hX]uh[Mhc]r+ j)r, }r- (h:j) hR}r. (hV]hW]hU]hT]hX]uh;j' hc]r/ hrXsubjectr0 r1 }r2 (h:Uh;j, ubahPjubaubj )r3 }r4 (h:UhR}r5 (hV]hW]hU]hT]hX]uh;j# hc]r6 h)r7 }r8 (h:X(string). A string to be used as the subject line of the message. ``%(builder)s`` will be replaced with the name of the builder which provoked the message.h;j3 hFhIhPhhR}r9 (hV]hW]hU]hT]hX]uh[Mhc]r: (hrXB(string). A string to be used as the subject line of the message. r; r< }r= (h:XB(string). A string to be used as the subject line of the message. h;j7 ubj)r> }r? (h:X``%(builder)s``hR}r@ (hV]hW]hU]hT]hX]uh;j7 hc]rA hrX %(builder)srB rC }rD (h:Uh;j> ubahPjubhrXJ will be replaced with the name of the builder which provoked the message.rE rF }rG (h:XJ will be replaced with the name of the builder which provoked the message.h;j7 ubeubahPj ubeubj )rH }rI (h:XJ``mode`` Mode is a list of strings; however there are two strings which can be used as shortcuts instead of the full lists. The possible shortcuts are: ``all`` Always send mail about builds. Equivalent to (``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``). ``warnings`` Equivalent to (``warnings``, ``failing``). (list of strings). A combination of: ``change`` Send mail about builds which change status. ``failing`` Send mail about builds which fail. ``passing`` Send mail about builds which succeed. ``problem`` Send mail about a build which failed when the previous build has passed. ``warnings`` Send mail about builds which generate warnings. ``exception`` Send mail about builds which generate exceptions. Defaults to (``failing``, ``passing``, ``warnings``). h;j hFhIhPj hR}rJ (hV]hW]hU]hT]hX]uh[Mh\hhc]rK (j )rL }rM (h:X``mode``rN h;jH hFhIhPj hR}rO (hV]hW]hU]hT]hX]uh[Mhc]rP j)rQ }rR (h:jN hR}rS (hV]hW]hU]hT]hX]uh;jL hc]rT hrXmoderU rV }rW (h:Uh;jQ ubahPjubaubj )rX }rY (h:UhR}rZ (hV]hW]hU]hT]hX]uh;jH hc]r[ (h)r\ }r] (h:XMode is a list of strings; however there are two strings which can be used as shortcuts instead of the full lists. The possible shortcuts are:r^ h;jX hFhIhPhhR}r_ (hV]hW]hU]hT]hX]uh[Mhc]r` hrXMode is a list of strings; however there are two strings which can be used as shortcuts instead of the full lists. The possible shortcuts are:ra rb }rc (h:j^ h;j\ ubaubj )rd }re (h:UhR}rf (hV]hW]hU]hT]hX]uh;jX hc]rg (j )rh }ri (h:X``all`` Always send mail about builds. Equivalent to (``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``). h;jd hFhIhPj hR}rj (hV]hW]hU]hT]hX]uh[Mhc]rk (j )rl }rm (h:X``all``rn h;jh hFhIhPj hR}ro (hV]hW]hU]hT]hX]uh[Mhc]rp j)rq }rr (h:jn hR}rs (hV]hW]hU]hT]hX]uh;jl hc]rt hrXallru rv }rw (h:Uh;jq ubahPjubaubj )rx }ry (h:UhR}rz (hV]hW]hU]hT]hX]uh;jh hc]r{ h)r| }r} (h:X~Always send mail about builds. Equivalent to (``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``).h;jx hFhIhPhhR}r~ (hV]hW]hU]hT]hX]uh[Mhc]r (hrX.Always send mail about builds. Equivalent to (r r }r (h:X.Always send mail about builds. Equivalent to (h;j| ubj)r }r (h:X ``change``hR}r (hV]hW]hU]hT]hX]uh;j| hc]r hrXchanger r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j| ubj)r }r (h:X ``failing``hR}r (hV]hW]hU]hT]hX]uh;j| hc]r hrXfailingr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j| ubj)r }r (h:X ``passing``hR}r (hV]hW]hU]hT]hX]uh;j| hc]r hrXpassingr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j| ubj)r }r (h:X ``problem``hR}r (hV]hW]hU]hT]hX]uh;j| hc]r hrXproblemr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j| ubj)r }r (h:X ``warnings``hR}r (hV]hW]hU]hT]hX]uh;j| hc]r hrXwarningsr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j| ubj)r }r (h:X ``exception``hR}r (hV]hW]hU]hT]hX]uh;j| hc]r hrX exceptionr r }r (h:Uh;j ubahPjubhrX).r r }r (h:X).h;j| ubeubahPj ubeubj )r }r (h:X8``warnings`` Equivalent to (``warnings``, ``failing``). h;jd hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r (j )r }r (h:X ``warnings``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXwarningsr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X*Equivalent to (``warnings``, ``failing``).h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrXEquivalent to (r r }r (h:XEquivalent to (h;j ubj)r }r (h:X ``warnings``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXwarningsr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j ubj)r }r (h:X ``failing``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXfailingr r }r (h:Uh;j ubahPjubhrX).r r }r (h:X).h;j ubeubahPj ubeubehPj ubh)r }r (h:X$(list of strings). A combination of:r h;jX hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrX$(list of strings). A combination of:r r }r (h:j h;j ubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;jX hc]r (j )r }r (h:X7``change`` Send mail about builds which change status. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r (j )r }r (h:X ``change``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXchanger r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X+Send mail about builds which change status.r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrX+Send mail about builds which change status.r r }r (h:j h;j ubaubahPj ubeubj )r }r (h:X/``failing`` Send mail about builds which fail. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r (j )r }r (h:X ``failing``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r! (hV]hW]hU]hT]hX]uh;j hc]r" hrXfailingr# r$ }r% (h:Uh;j ubahPjubaubj )r& }r' (h:UhR}r( (hV]hW]hU]hT]hX]uh;j hc]r) h)r* }r+ (h:X"Send mail about builds which fail.r, h;j& hFhIhPhhR}r- (hV]hW]hU]hT]hX]uh[Mhc]r. hrX"Send mail about builds which fail.r/ r0 }r1 (h:j, h;j* ubaubahPj ubeubj )r2 }r3 (h:X2``passing`` Send mail about builds which succeed. h;j hFhIhPj hR}r4 (hV]hW]hU]hT]hX]uh[Mhc]r5 (j )r6 }r7 (h:X ``passing``r8 h;j2 hFhIhPj hR}r9 (hV]hW]hU]hT]hX]uh[Mhc]r: j)r; }r< (h:j8 hR}r= (hV]hW]hU]hT]hX]uh;j6 hc]r> hrXpassingr? r@ }rA (h:Uh;j; ubahPjubaubj )rB }rC (h:UhR}rD (hV]hW]hU]hT]hX]uh;j2 hc]rE h)rF }rG (h:X%Send mail about builds which succeed.rH h;jB hFhIhPhhR}rI (hV]hW]hU]hT]hX]uh[Mhc]rJ hrX%Send mail about builds which succeed.rK rL }rM (h:jH h;jF ubaubahPj ubeubj )rN }rO (h:XU``problem`` Send mail about a build which failed when the previous build has passed. h;j hFhIhPj hR}rP (hV]hW]hU]hT]hX]uh[Mhc]rQ (j )rR }rS (h:X ``problem``rT h;jN hFhIhPj hR}rU (hV]hW]hU]hT]hX]uh[Mhc]rV j)rW }rX (h:jT hR}rY (hV]hW]hU]hT]hX]uh;jR hc]rZ hrXproblemr[ r\ }r] (h:Uh;jW ubahPjubaubj )r^ }r_ (h:UhR}r` (hV]hW]hU]hT]hX]uh;jN hc]ra h)rb }rc (h:XHSend mail about a build which failed when the previous build has passed.rd h;j^ hFhIhPhhR}re (hV]hW]hU]hT]hX]uh[Mhc]rf hrXHSend mail about a build which failed when the previous build has passed.rg rh }ri (h:jd h;jb ubaubahPj ubeubj )rj }rk (h:X=``warnings`` Send mail about builds which generate warnings. h;j hFhIhPj hR}rl (hV]hW]hU]hT]hX]uh[Mhc]rm (j )rn }ro (h:X ``warnings``rp h;jj hFhIhPj hR}rq (hV]hW]hU]hT]hX]uh[Mhc]rr j)rs }rt (h:jp hR}ru (hV]hW]hU]hT]hX]uh;jn hc]rv hrXwarningsrw rx }ry (h:Uh;js ubahPjubaubj )rz }r{ (h:UhR}r| (hV]hW]hU]hT]hX]uh;jj hc]r} h)r~ }r (h:X/Send mail about builds which generate warnings.r h;jz hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrX/Send mail about builds which generate warnings.r r }r (h:j h;j~ ubaubahPj ubeubj )r }r (h:X@``exception`` Send mail about builds which generate exceptions. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r (j )r }r (h:X ``exception``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX exceptionr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X1Send mail about builds which generate exceptions.r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrX1Send mail about builds which generate exceptions.r r }r (h:j h;j ubaubahPj ubeubehPj ubh)r }r (h:X5Defaults to (``failing``, ``passing``, ``warnings``).h;jX hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX Defaults to (r r }r (h:X Defaults to (h;j ubj)r }r (h:X ``failing``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXfailingr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j ubj)r }r (h:X ``passing``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXpassingr r }r (h:Uh;j ubahPjubhrX, r r }r (h:X, h;j ubj)r }r (h:X ``warnings``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXwarningsr r }r (h:Uh;j ubahPjubhrX).r r }r (h:X).h;j ubeubehPj ubeubj )r }r (h:X``builders`` (list of strings). A list of builder names for which mail should be sent. Defaults to ``None`` (send mail for all builds). Use either builders or categories, but not both. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X ``builders``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXbuildersr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X(list of strings). A list of builder names for which mail should be sent. Defaults to ``None`` (send mail for all builds). Use either builders or categories, but not both.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrXV(list of strings). A list of builder names for which mail should be sent. Defaults to r r }r (h:XV(list of strings). A list of builder names for which mail should be sent. Defaults to h;j ubj)r }r (h:X``None``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXNoner r }r (h:Uh;j ubahPjubhrXM (send mail for all builds). Use either builders or categories, but not both.r r }r (h:XM (send mail for all builds). Use either builders or categories, but not both.h;j ubeubahPj ubeubj )r }r (h:X``categories`` (list of strings). A list of category names to serve status information for. Defaults to ``None`` (all categories). Use either builders or categories, but not both. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X``categories``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX categoriesr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X(list of strings). A list of category names to serve status information for. Defaults to ``None`` (all categories). Use either builders or categories, but not both.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrXY(list of strings). A list of category names to serve status information for. Defaults to r r }r (h:XY(list of strings). A list of category names to serve status information for. Defaults to h;j ubj)r }r (h:X``None``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXNoner r }r (h:Uh;j ubahPjubhrXC (all categories). Use either builders or categories, but not both.r r }r (h:XC (all categories). Use either builders or categories, but not both.h;j ubeubahPj ubeubj )r }r (h:X``addLogs`` (boolean). If ``True``, include all build logs as attachments to the messages. These can be quite large. This can also be set to a list of log names, to send a subset of the logs. Defaults to ``False``. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X ``addLogs``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXaddLogsr r }r (h:Uh;j ubahPjubaubj )r! }r" (h:UhR}r# (hV]hW]hU]hT]hX]uh;j hc]r$ h)r% }r& (h:X(boolean). If ``True``, include all build logs as attachments to the messages. These can be quite large. This can also be set to a list of log names, to send a subset of the logs. Defaults to ``False``.h;j! hFhIhPhhR}r' (hV]hW]hU]hT]hX]uh[Mhc]r( (hrX(boolean). If r) r* }r+ (h:X(boolean). If h;j% ubj)r, }r- (h:X``True``hR}r. (hV]hW]hU]hT]hX]uh;j% hc]r/ hrXTruer0 r1 }r2 (h:Uh;j, ubahPjubhrX, include all build logs as attachments to the messages. These can be quite large. This can also be set to a list of log names, to send a subset of the logs. Defaults to r3 r4 }r5 (h:X, include all build logs as attachments to the messages. These can be quite large. This can also be set to a list of log names, to send a subset of the logs. Defaults to h;j% ubj)r6 }r7 (h:X ``False``hR}r8 (hV]hW]hU]hT]hX]uh;j% hc]r9 hrXFalser: r; }r< (h:Uh;j6 ubahPjubhrX.r= }r> (h:X.h;j% ubeubahPj ubeubj )r? }r@ (h:X``addPatch`` (boolean). If ``True``, include the patch content if a patch was present. Patches are usually used on a :class:`Try` server. Defaults to ``True``. h;j hFhIhPj hR}rA (hV]hW]hU]hT]hX]uh[Mh\hhc]rB (j )rC }rD (h:X ``addPatch``rE h;j? hFhIhPj hR}rF (hV]hW]hU]hT]hX]uh[Mhc]rG j)rH }rI (h:jE hR}rJ (hV]hW]hU]hT]hX]uh;jC hc]rK hrXaddPatchrL rM }rN (h:Uh;jH ubahPjubaubj )rO }rP (h:UhR}rQ (hV]hW]hU]hT]hX]uh;j? hc]rR h)rS }rT (h:X(boolean). If ``True``, include the patch content if a patch was present. Patches are usually used on a :class:`Try` server. Defaults to ``True``.h;jO hFhIhPhhR}rU (hV]hW]hU]hT]hX]uh[Mhc]rV (hrX(boolean). If rW rX }rY (h:X(boolean). If h;jS ubj)rZ }r[ (h:X``True``hR}r\ (hV]hW]hU]hT]hX]uh;jS hc]r] hrXTruer^ r_ }r` (h:Uh;jZ ubahPjubhrXR, include the patch content if a patch was present. Patches are usually used on a ra rb }rc (h:XR, include the patch content if a patch was present. Patches are usually used on a h;jS ubj)rd }re (h:X :class:`Try`rf h;jS hFhIhPjhR}rg (UreftypeXclassjjXTryU refdomainXpyrh hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]ri j)rj }rk (h:jf hR}rl (hV]hW]rm (jjh Xpy-classrn ehU]hT]hX]uh;jd hc]ro hrXTryrp rq }rr (h:Uh;jj ubahPjubaubhrX server. Defaults to rs rt }ru (h:X server. Defaults to h;jS ubj)rv }rw (h:X``True``hR}rx (hV]hW]hU]hT]hX]uh;jS hc]ry hrXTruerz r{ }r| (h:Uh;jv ubahPjubhrX.r} }r~ (h:X.h;jS ubeubahPj ubeubj )r }r (h:X``buildSetSummary`` (boolean). If ``True``, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to ``False``. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X``buildSetSummary``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXbuildSetSummaryr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X(boolean). If ``True``, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to ``False``.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX(boolean). If r r }r (h:X(boolean). If h;j ubj)r }r (h:X``True``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXTruer r }r (h:Uh;j ubahPjubhrX, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to r r }r (h:X, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to h;j ubj)r }r (h:X ``False``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXFalser r }r (h:Uh;j ubahPjubhrX.r }r (h:X.h;j ubeubahPj ubeubj )r }r (h:Xo``relayhost`` (string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost' h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X ``relayhost``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX relayhostr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X`(string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost'r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrX`(string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost'r r }r (h:j h;j ubaubahPj ubeubj )r }r (h:X]``smtpPort`` (int). The port that will be used on outbound SMTP connections. Defaults to 25. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X ``smtpPort``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXsmtpPortr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:XO(int). The port that will be used on outbound SMTP connections. Defaults to 25.r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrXO(int). The port that will be used on outbound SMTP connections. Defaults to 25.r r }r (h:j h;j ubaubahPj ubeubj )r }r (h:X``useTls`` (boolean). When this argument is ``True`` (default is ``False``) ``MailNotifier`` sends emails using TLS and authenticates with the ``relayhost``. When using TLS the arguments ``smtpUser`` and ``smtpPassword`` must also be specified. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X ``useTls``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXuseTlsr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:X(boolean). When this argument is ``True`` (default is ``False``) ``MailNotifier`` sends emails using TLS and authenticates with the ``relayhost``. When using TLS the arguments ``smtpUser`` and ``smtpPassword`` must also be specified.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX!(boolean). When this argument is r r }r (h:X!(boolean). When this argument is h;j ubj)r }r (h:X``True``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXTruer r }r (h:Uh;j ubahPjubhrX (default is r r }r (h:X (default is h;j ubj)r }r (h:X ``False``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXFalser r }r (h:Uh;j ubahPjubhrX) r r }r (h:X) h;j ubj)r }r (h:X``MailNotifier``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX MailNotifierr r }r (h:Uh;j ubahPjubhrX3 sends emails using TLS and authenticates with the r r }r (h:X3 sends emails using TLS and authenticates with the h;j ubj)r }r (h:X ``relayhost``hR}r (hV]hW]hU]hT]hX]uh;j hc]r! hrX relayhostr" r# }r$ (h:Uh;j ubahPjubhrX. When using TLS the arguments r% r& }r' (h:X. When using TLS the arguments h;j ubj)r( }r) (h:X ``smtpUser``hR}r* (hV]hW]hU]hT]hX]uh;j hc]r+ hrXsmtpUserr, r- }r. (h:Uh;j( ubahPjubhrX and r/ r0 }r1 (h:X and h;j ubj)r2 }r3 (h:X``smtpPassword``hR}r4 (hV]hW]hU]hT]hX]uh;j hc]r5 hrX smtpPasswordr6 r7 }r8 (h:Uh;j2 ubahPjubhrX must also be specified.r9 r: }r; (h:X must also be specified.h;j ubeubahPj ubeubj )r< }r= (h:XX``smtpUser`` (string). The user name to use when authenticating with the ``relayhost``. h;j hFhIhPj hR}r> (hV]hW]hU]hT]hX]uh[Mh\hhc]r? (j )r@ }rA (h:X ``smtpUser``rB h;j< hFhIhPj hR}rC (hV]hW]hU]hT]hX]uh[Mhc]rD j)rE }rF (h:jB hR}rG (hV]hW]hU]hT]hX]uh;j@ hc]rH hrXsmtpUserrI rJ }rK (h:Uh;jE ubahPjubaubj )rL }rM (h:UhR}rN (hV]hW]hU]hT]hX]uh;j< hc]rO h)rP }rQ (h:XJ(string). The user name to use when authenticating with the ``relayhost``.h;jL hFhIhPhhR}rR (hV]hW]hU]hT]hX]uh[Mhc]rS (hrX<(string). The user name to use when authenticating with the rT rU }rV (h:X<(string). The user name to use when authenticating with the h;jP ubj)rW }rX (h:X ``relayhost``hR}rY (hV]hW]hU]hT]hX]uh;jP hc]rZ hrX relayhostr[ r\ }r] (h:Uh;jW ubahPjubhrX.r^ }r_ (h:X.h;jP ubeubahPj ubeubj )r` }ra (h:Xf``smtpPassword`` (string). The password that will be used when authenticating with the ``relayhost``. h;j hFhIhPj hR}rb (hV]hW]hU]hT]hX]uh[Mh\hhc]rc (j )rd }re (h:X``smtpPassword``rf h;j` hFhIhPj hR}rg (hV]hW]hU]hT]hX]uh[Mhc]rh j)ri }rj (h:jf hR}rk (hV]hW]hU]hT]hX]uh;jd hc]rl hrX smtpPasswordrm rn }ro (h:Uh;ji ubahPjubaubj )rp }rq (h:UhR}rr (hV]hW]hU]hT]hX]uh;j` hc]rs h)rt }ru (h:XT(string). The password that will be used when authenticating with the ``relayhost``.h;jp hFhIhPhhR}rv (hV]hW]hU]hT]hX]uh[Mhc]rw (hrXF(string). The password that will be used when authenticating with the rx ry }rz (h:XF(string). The password that will be used when authenticating with the h;jt ubj)r{ }r| (h:X ``relayhost``hR}r} (hV]hW]hU]hT]hX]uh;jt hc]r~ hrX relayhostr r }r (h:Uh;j{ ubahPjubhrX.r }r (h:X.h;jt ubeubahPj ubeubj )r }r (h:X``lookup`` (implementor of :class:`IEmailLookup`). Object which provides :class:`IEmailLookup`, which is responsible for mapping User names (which come from the VC system) into valid email addresses. If the argument is not provided, the ``MailNotifier`` will attempt to build the ``sendToInterestedUsers`` from the authors of the Changes that led to the Build via :ref:`User-Objects`. If the author of one of the Build's Changes has an email address stored, it will added to the recipients list. With this method, ``owners`` are still added to the recipients. Note that, in the current implementation of user objects, email addresses are not stored; as a result, unless you have specifically added email addresses to the user database, this functionality is unlikely to actually send any emails. Most of the time you can use a simple Domain instance. As a shortcut, you can pass as string: this will be treated as if you had provided ``Domain(str)``. For example, ``lookup='twistedmatrix.com'`` will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See :file:`buildbot/status/mail.py` for more details. Regardless of the setting of ``lookup``, ``MailNotifier`` will also send mail to addresses in the ``extraRecipients`` list. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r (j )r }r (h:X ``lookup``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXlookupr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r (h)r }r (h:X(implementor of :class:`IEmailLookup`). Object which provides :class:`IEmailLookup`, which is responsible for mapping User names (which come from the VC system) into valid email addresses.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX(implementor of r r }r (h:X(implementor of h;j ubj)r }r (h:X:class:`IEmailLookup`r h;j hFhIhPjhR}r (UreftypeXclassjjX IEmailLookupU refdomainXpyr hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r j)r }r (h:j hR}r (hV]hW]r (jj Xpy-classr ehU]hT]hX]uh;j hc]r hrX IEmailLookupr r }r (h:Uh;j ubahPjubaubhrX). Object which provides r r }r (h:X). Object which provides h;j ubj)r }r (h:X:class:`IEmailLookup`r h;j hFhIhPjhR}r (UreftypeXclassjjX IEmailLookupU refdomainXpyr hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r j)r }r (h:j hR}r (hV]hW]r (jj Xpy-classr ehU]hT]hX]uh;j hc]r hrX IEmailLookupr r }r (h:Uh;j ubahPjubaubhrXi, which is responsible for mapping User names (which come from the VC system) into valid email addresses.r r }r (h:Xi, which is responsible for mapping User names (which come from the VC system) into valid email addresses.h;j ubeubh)r }r (h:XUIf the argument is not provided, the ``MailNotifier`` will attempt to build the ``sendToInterestedUsers`` from the authors of the Changes that led to the Build via :ref:`User-Objects`. If the author of one of the Build's Changes has an email address stored, it will added to the recipients list. With this method, ``owners`` are still added to the recipients. Note that, in the current implementation of user objects, email addresses are not stored; as a result, unless you have specifically added email addresses to the user database, this functionality is unlikely to actually send any emails.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrX%If the argument is not provided, the r r }r (h:X%If the argument is not provided, the h;j ubj)r }r (h:X``MailNotifier``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX MailNotifierr r }r (h:Uh;j ubahPjubhrX will attempt to build the r r }r (h:X will attempt to build the h;j ubj)r }r (h:X``sendToInterestedUsers``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXsendToInterestedUsersr r }r (h:Uh;j ubahPjubhrX; from the authors of the Changes that led to the Build via r r }r (h:X; from the authors of the Changes that led to the Build via h;j ubj)r }r (h:X:ref:`User-Objects`r h;j hFhIhPjhR}r (UreftypeXrefjjX user-objectsU refdomainXstdr hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r j<)r }r (h:j hR}r (hV]hW]r (jj Xstd-refr ehU]hT]hX]uh;j hc]r hrX User-Objectsr r }r (h:Uh;j ubahPjDubaubhrX. If the author of one of the Build's Changes has an email address stored, it will added to the recipients list. With this method, r r }r (h:X. If the author of one of the Build's Changes has an email address stored, it will added to the recipients list. With this method, h;j ubj)r }r (h:X ``owners``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXownersr r }r (h:Uh;j ubahPjubhrX are still added to the recipients. Note that, in the current implementation of user objects, email addresses are not stored; as a result, unless you have specifically added email addresses to the user database, this functionality is unlikely to actually send any emails.r r }r (h:X are still added to the recipients. Note that, in the current implementation of user objects, email addresses are not stored; as a result, unless you have specifically added email addresses to the user database, this functionality is unlikely to actually send any emails.h;j ubeubh)r }r (h:XjMost of the time you can use a simple Domain instance. As a shortcut, you can pass as string: this will be treated as if you had provided ``Domain(str)``. For example, ``lookup='twistedmatrix.com'`` will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See :file:`buildbot/status/mail.py` for more details.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r (hrXMost of the time you can use a simple Domain instance. As a shortcut, you can pass as string: this will be treated as if you had provided r r }r(h:XMost of the time you can use a simple Domain instance. As a shortcut, you can pass as string: this will be treated as if you had provided h;j ubj)r}r(h:X``Domain(str)``hR}r(hV]hW]hU]hT]hX]uh;j hc]rhrX Domain(str)rr}r(h:Uh;jubahPjubhrX. For example, rr }r (h:X. For example, h;j ubj)r }r (h:X``lookup='twistedmatrix.com'``hR}r (hV]hW]hU]hT]hX]uh;j hc]rhrXlookup='twistedmatrix.com'rr}r(h:Uh;j ubahPjubhrXs will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See rr}r(h:Xs will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See h;j ubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;j hc]rhrXbuildbot/status/mail.pyrr}r(h:Xbuildbot/status/mail.pyh;jubahPjubhrX for more details.rr}r (h:X for more details.h;j ubeubh)r!}r"(h:X{Regardless of the setting of ``lookup``, ``MailNotifier`` will also send mail to addresses in the ``extraRecipients`` list.h;j hFhIhPhhR}r#(hV]hW]hU]hT]hX]uh[Mhc]r$(hrXRegardless of the setting of r%r&}r'(h:XRegardless of the setting of h;j!ubj)r(}r)(h:X ``lookup``hR}r*(hV]hW]hU]hT]hX]uh;j!hc]r+hrXlookupr,r-}r.(h:Uh;j(ubahPjubhrX, r/r0}r1(h:X, h;j!ubj)r2}r3(h:X``MailNotifier``hR}r4(hV]hW]hU]hT]hX]uh;j!hc]r5hrX MailNotifierr6r7}r8(h:Uh;j2ubahPjubhrX) will also send mail to addresses in the r9r:}r;(h:X) will also send mail to addresses in the h;j!ubj)r<}r=(h:X``extraRecipients``hR}r>(hV]hW]hU]hT]hX]uh;j!hc]r?hrXextraRecipientsr@rA}rB(h:Uh;j<ubahPjubhrX list.rCrD}rE(h:X list.h;j!ubeubehPj ubeubj )rF}rG(h:XT``messageFormatter`` This is a optional function that can be used to generate a custom mail message. A :func:`messageFormatter` function takes the mail mode (``mode``), builder name (``name``), the build status (``build``), the result code (``results``), and the BuildMaster status (``master_status``). It returns a dictionary. The ``body`` key gives a string that is the complete text of the message. The ``type`` key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The ``subject`` key is optional, but gives the subject for the email. h;j hFhIhPj hR}rH(hV]hW]hU]hT]hX]uh[Mh\hhc]rI(j )rJ}rK(h:X``messageFormatter``rLh;jFhFhIhPj hR}rM(hV]hW]hU]hT]hX]uh[Mhc]rNj)rO}rP(h:jLhR}rQ(hV]hW]hU]hT]hX]uh;jJhc]rRhrXmessageFormatterrSrT}rU(h:Uh;jOubahPjubaubj )rV}rW(h:UhR}rX(hV]hW]hU]hT]hX]uh;jFhc]rYh)rZ}r[(h:X>This is a optional function that can be used to generate a custom mail message. A :func:`messageFormatter` function takes the mail mode (``mode``), builder name (``name``), the build status (``build``), the result code (``results``), and the BuildMaster status (``master_status``). It returns a dictionary. The ``body`` key gives a string that is the complete text of the message. The ``type`` key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The ``subject`` key is optional, but gives the subject for the email.h;jVhFhIhPhhR}r\(hV]hW]hU]hT]hX]uh[M hc]r](hrXRThis is a optional function that can be used to generate a custom mail message. A r^r_}r`(h:XRThis is a optional function that can be used to generate a custom mail message. A h;jZubj)ra}rb(h:X:func:`messageFormatter`rch;jZhFhIhPjhR}rd(UreftypeXfuncjjXmessageFormatterU refdomainXpyrehT]hU]U refexplicithV]hW]hX]jjjNjNuh[M hc]rfj)rg}rh(h:jchR}ri(hV]hW]rj(jjeXpy-funcrkehU]hT]hX]uh;jahc]rlhrXmessageFormatterrmrn}ro(h:Uh;jgubahPjubaubhrX function takes the mail mode (rprq}rr(h:X function takes the mail mode (h;jZubj)rs}rt(h:X``mode``hR}ru(hV]hW]hU]hT]hX]uh;jZhc]rvhrXmoderwrx}ry(h:Uh;jsubahPjubhrX), builder name (rzr{}r|(h:X), builder name (h;jZubj)r}}r~(h:X``name``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrXnamerr}r(h:Uh;j}ubahPjubhrX), the build status (rr}r(h:X), the build status (h;jZubj)r}r(h:X ``build``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrXbuildrr}r(h:Uh;jubahPjubhrX), the result code (rr}r(h:X), the result code (h;jZubj)r}r(h:X ``results``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrXresultsrr}r(h:Uh;jubahPjubhrX), and the BuildMaster status (rr}r(h:X), and the BuildMaster status (h;jZubj)r}r(h:X``master_status``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrX master_statusrr}r(h:Uh;jubahPjubhrX!). It returns a dictionary. The rr}r(h:X!). It returns a dictionary. The h;jZubj)r}r(h:X``body``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrXbodyrr}r(h:Uh;jubahPjubhrXB key gives a string that is the complete text of the message. The rr}r(h:XB key gives a string that is the complete text of the message. The h;jZubj)r}r(h:X``type``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrXtyperr}r(h:Uh;jubahPjubhrXs key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The rr}r(h:Xs key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The h;jZubj)r}r(h:X ``subject``hR}r(hV]hW]hU]hT]hX]uh;jZhc]rhrXsubjectrr}r(h:Uh;jubahPjubhrX6 key is optional, but gives the subject for the email.rr}r(h:X6 key is optional, but gives the subject for the email.h;jZubeubahPj ubeubj )r}r(h:X``extraHeaders`` (dictionary) A dictionary containing key/value pairs of extra headers to add to sent e-mails. Both the keys and the values may be a `Interpolate` instance. h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X``extraHeaders``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX extraHeadersrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X(dictionary) A dictionary containing key/value pairs of extra headers to add to sent e-mails. Both the keys and the values may be a `Interpolate` instance.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]r(hrX(dictionary) A dictionary containing key/value pairs of extra headers to add to sent e-mails. Both the keys and the values may be a rr}r(h:X(dictionary) A dictionary containing key/value pairs of extra headers to add to sent e-mails. Both the keys and the values may be a h;jubj)r}r(h:X `Interpolate`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX Interpolaterr}r(h:Uh;jubahPjubhrX instance.rr}r(h:X instance.h;jubeubahPj ubeubj )r}r(h:Xx``previousBuildGetter`` An optional function to calculate the previous build to the one at hand. A :func:`previousBuildGetter` takes a :class:`BuildStatus` and returns a :class:`BuildStatus`. This function is useful when builders don't process their requests in order of arrival (chronologically) and therefore the order of completion of builds does not reflect the order in which changes (and their respective requests) arrived into the system. In such scenarios, status transitions in the chronological sequence of builds within a builder might not reflect the actual status transition in the topological sequence of changes in the tree. What's more, the latest build (the build at hand) might not always be for the most recent request so it might not make sense to send a "change" or "problem" email about it. Returning None from this function will prevent such emails from going out. h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M"h\hhc]r(j )r}r(h:X``previousBuildGetter``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M"hc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXpreviousBuildGetterrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X_An optional function to calculate the previous build to the one at hand. A :func:`previousBuildGetter` takes a :class:`BuildStatus` and returns a :class:`BuildStatus`. This function is useful when builders don't process their requests in order of arrival (chronologically) and therefore the order of completion of builds does not reflect the order in which changes (and their respective requests) arrived into the system. In such scenarios, status transitions in the chronological sequence of builds within a builder might not reflect the actual status transition in the topological sequence of changes in the tree. What's more, the latest build (the build at hand) might not always be for the most recent request so it might not make sense to send a "change" or "problem" email about it. Returning None from this function will prevent such emails from going out.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]r(hrXKAn optional function to calculate the previous build to the one at hand. A rr}r(h:XKAn optional function to calculate the previous build to the one at hand. A h;jubj)r}r(h:X:func:`previousBuildGetter`rh;jhFhIhPjhR}r(UreftypeXfuncjjXpreviousBuildGetterU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r }r (h:jhR}r (hV]hW]r (jjXpy-funcr ehU]hT]hX]uh;jhc]rhrXpreviousBuildGetterrr}r(h:Uh;j ubahPjubaubhrX takes a rr}r(h:X takes a h;jubj)r}r(h:X:class:`BuildStatus`rh;jhFhIhPjhR}r(UreftypeXclassjjX BuildStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]r hrX BuildStatusr!r"}r#(h:Uh;jubahPjubaubhrX and returns a r$r%}r&(h:X and returns a h;jubj)r'}r((h:X:class:`BuildStatus`r)h;jhFhIhPjhR}r*(UreftypeXclassjjX BuildStatusU refdomainXpyr+hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r,j)r-}r.(h:j)hR}r/(hV]hW]r0(jj+Xpy-classr1ehU]hT]hX]uh;j'hc]r2hrX BuildStatusr3r4}r5(h:Uh;j-ubahPjubaubhrX. This function is useful when builders don't process their requests in order of arrival (chronologically) and therefore the order of completion of builds does not reflect the order in which changes (and their respective requests) arrived into the system. In such scenarios, status transitions in the chronological sequence of builds within a builder might not reflect the actual status transition in the topological sequence of changes in the tree. What's more, the latest build (the build at hand) might not always be for the most recent request so it might not make sense to send a "change" or "problem" email about it. Returning None from this function will prevent such emails from going out.r6r7}r8(h:X. This function is useful when builders don't process their requests in order of arrival (chronologically) and therefore the order of completion of builds does not reflect the order in which changes (and their respective requests) arrived into the system. In such scenarios, status transitions in the chronological sequence of builds within a builder might not reflect the actual status transition in the topological sequence of changes in the tree. What's more, the latest build (the build at hand) might not always be for the most recent request so it might not make sense to send a "change" or "problem" email about it. Returning None from this function will prevent such emails from going out.h;jubeubahPj ubeubeubh)r9}r:(h:XAs a help to those writing :func:`messageFormatter` functions, the following table describes how to get some useful pieces of information from the various status objects:h;j hFhIhPhhR}r;(hV]hW]hU]hT]hX]uh[M$h\hhc]r<(hrXAs a help to those writing r=r>}r?(h:XAs a help to those writing h;j9ubj)r@}rA(h:X:func:`messageFormatter`rBh;j9hFhIhPjhR}rC(UreftypeXfuncjjXmessageFormatterU refdomainXpyrDhT]hU]U refexplicithV]hW]hX]jjjNjNuh[M$hc]rEj)rF}rG(h:jBhR}rH(hV]hW]rI(jjDXpy-funcrJehU]hT]hX]uh;j@hc]rKhrXmessageFormatterrLrM}rN(h:Uh;jFubahPjubaubhrXw functions, the following table describes how to get some useful pieces of information from the various status objects:rOrP}rQ(h:Xw functions, the following table describes how to get some useful pieces of information from the various status objects:h;j9ubeubj )rR}rS(h:Uh;j hFhIhPj hR}rT(hV]hW]hU]hT]hX]uh[Nh\hhc]rU(j )rV}rW(h:X7Name of the builder that generated this event ``name`` h;jRhFhIhPj hR}rX(hV]hW]hU]hT]hX]uh[M)hc]rY(j )rZ}r[(h:X-Name of the builder that generated this eventr\h;jVhFhIhPj hR}r](hV]hW]hU]hT]hX]uh[M)hc]r^hrX-Name of the builder that generated this eventr_r`}ra(h:j\h;jZubaubj )rb}rc(h:UhR}rd(hV]hW]hU]hT]hX]uh;jVhc]reh)rf}rg(h:X``name``rhh;jbhFhIhPhhR}ri(hV]hW]hU]hT]hX]uh[M)hc]rjj)rk}rl(h:jhhR}rm(hV]hW]hU]hT]hX]uh;jfhc]rnhrXnamerorp}rq(h:Uh;jkubahPjubaubahPj ubeubj )rr}rs(h:X:Title of the buildmaster :meth:`master_status.getTitle()` h;jRhFhIhPj hR}rt(hV]hW]hU]hT]hX]uh[M,h\hhc]ru(j )rv}rw(h:XTitle of the buildmasterrxh;jrhFhIhPj hR}ry(hV]hW]hU]hT]hX]uh[M,hc]rzhrXTitle of the buildmasterr{r|}r}(h:jxh;jvubaubj )r~}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jrhc]rh)r}r(h:X :meth:`master_status.getTitle()`rh;j~hFhIhPhhR}r(hV]hW]hU]hT]hX]uh[M,hc]rj)r}r(h:jh;jhFhIhPjhR}r(UreftypeXmethjjXmaster_status.getTitleU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[M,hc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-methrehU]hT]hX]uh;jhc]rhrXmaster_status.getTitlerr}r(h:Uh;jubahPjubaubaubahPj ubeubj )r}r(h:XMailNotifier mode ``mode`` (a combination of ``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``, ``all``) h;jRhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M0h\hhc]r(j )r}r(h:XMailNotifier moderh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M0hc]rhrXMailNotifier moderr}r(h:jh;jubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rj )r}r(h:Xt``mode`` (a combination of ``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``, ``all``) h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M0hc]r(j )r}r(h:X[``mode`` (a combination of ``change``, ``failing``, ``passing``, ``problem``, ``warnings``,h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M0hc]r(j)r}r(h:X``mode``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXmoderr}r(h:Uh;jubahPjubhrX (a combination of rr}r(h:X (a combination of h;jubj)r}r(h:X ``change``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXchangerr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X ``failing``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXfailingrr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X ``passing``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXpassingrr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X ``problem``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXproblemrr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X ``warnings``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXwarningsrr}r(h:Uh;jubahPjubhrX,r}r(h:X,h;jubeubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X``exception``, ``all``)h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[M0hc]r(j)r}r(h:X ``exception``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX exceptionrr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X``all``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXallrr}r(h:Uh;jubahPjubhrX)r}r(h:X)h;jubeubahPj ubeubahPj ubahPj ubeubeubh)r}r(h:XBuilder result as a string ::r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M2h\hhc]r hrXBuilder result as a stringr r }r(h:XBuilder result as a stringh;jubaubj)r}r(h:Xfrom buildbot.status.builder import Results result_str = Results[results] # one of 'success', 'warnings', 'failure', 'skipped', or 'exception'h;j hFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[M4h\hhc]rhrXfrom buildbot.status.builder import Results result_str = Results[results] # one of 'success', 'warnings', 'failure', 'skipped', or 'exception'rr}r(h:Uh;jubaubj )r}r(h:Uh;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]r(j )r}r(h:X:URL to build page ``master_status.getURLForThing(build)`` h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[M9hc]r(j )r}r(h:XURL to build pager h;jhFhIhPj hR}r!(hV]hW]hU]hT]hX]uh[M9hc]r"hrXURL to build pager#r$}r%(h:j h;jubaubj )r&}r'(h:UhR}r((hV]hW]hU]hT]hX]uh;jhc]r)h)r*}r+(h:X'``master_status.getURLForThing(build)``r,h;j&hFhIhPhhR}r-(hV]hW]hU]hT]hX]uh[M9hc]r.j)r/}r0(h:j,hR}r1(hV]hW]hU]hT]hX]uh;j*hc]r2hrX#master_status.getURLForThing(build)r3r4}r5(h:Uh;j/ubahPjubaubahPj ubeubj )r6}r7(h:X>URL to buildbot main page. ``master_status.getBuildbotURL()`` h;jhFhIhPj hR}r8(hV]hW]hU]hT]hX]uh[M<h\hhc]r9(j )r:}r;(h:XURL to buildbot main page.r<h;j6hFhIhPj hR}r=(hV]hW]hU]hT]hX]uh[M<hc]r>hrXURL to buildbot main page.r?r@}rA(h:j<h;j:ubaubj )rB}rC(h:UhR}rD(hV]hW]hU]hT]hX]uh;j6hc]rEh)rF}rG(h:X"``master_status.getBuildbotURL()``rHh;jBhFhIhPhhR}rI(hV]hW]hU]hT]hX]uh[M<hc]rJj)rK}rL(h:jHhR}rM(hV]hW]hU]hT]hX]uh;jFhc]rNhrXmaster_status.getBuildbotURL()rOrP}rQ(h:Uh;jKubahPjubaubahPj ubeubj )rR}rS(h:XBuild text ``build.getText()`` h;jhFhIhPj hR}rT(hV]hW]hU]hT]hX]uh[M?h\hhc]rU(j )rV}rW(h:X Build textrXh;jRhFhIhPj hR}rY(hV]hW]hU]hT]hX]uh[M?hc]rZhrX Build textr[r\}r](h:jXh;jVubaubj )r^}r_(h:UhR}r`(hV]hW]hU]hT]hX]uh;jRhc]rah)rb}rc(h:X``build.getText()``rdh;j^hFhIhPhhR}re(hV]hW]hU]hT]hX]uh[M?hc]rfj)rg}rh(h:jdhR}ri(hV]hW]hU]hT]hX]uh;jbhc]rjhrXbuild.getText()rkrl}rm(h:Uh;jgubahPjubaubahPj ubeubj )rn}ro(h:X_Mapping of property names to values ``build.getProperties()`` (a :class:`Properties` instance) h;jhFhIhPj hR}rp(hV]hW]hU]hT]hX]uh[MBh\hhc]rq(j )rr}rs(h:X#Mapping of property names to valuesrth;jnhFhIhPj hR}ru(hV]hW]hU]hT]hX]uh[MBhc]rvhrX#Mapping of property names to valuesrwrx}ry(h:jth;jrubaubj )rz}r{(h:UhR}r|(hV]hW]hU]hT]hX]uh;jnhc]r}h)r~}r(h:X:``build.getProperties()`` (a :class:`Properties` instance)h;jzhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MBhc]r(j)r}r(h:X``build.getProperties()``hR}r(hV]hW]hU]hT]hX]uh;j~hc]rhrXbuild.getProperties()rr}r(h:Uh;jubahPjubhrX (a rr}r(h:X (a h;j~ubj)r}r(h:X:class:`Properties`rh;j~hFhIhPjhR}r(UreftypeXclassjjX PropertiesU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[MBhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX Propertiesrr}r(h:Uh;jubahPjubaubhrX instance)rr}r(h:X instance)h;j~ubeubahPj ubeubj )r}r(h:X$Slave name ``build.getSlavename()`` h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[MEh\hhc]r(j )r}r(h:X Slave namerh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[MEhc]rhrX Slave namerr}r(h:jh;jubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X``build.getSlavename()``rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MEhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbuild.getSlavename()rr}r(h:Uh;jubahPjubaubahPj ubeubj )r}r(h:X9Build reason (from a forced build) ``build.getReason()`` h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[MHh\hhc]r(j )r}r(h:X"Build reason (from a forced build)rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[MHhc]rhrX"Build reason (from a forced build)rr}r(h:jh;jubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X``build.getReason()``rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MHhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbuild.getReason()rr}r(h:Uh;jubahPjubaubahPj ubeubj )r}r(h:X:List of responsible users ``build.getResponsibleUsers()`` h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[MKh\hhc]r(j )r}r(h:XList of responsible usersrh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[MKhc]rhrXList of responsible usersrr}r(h:jh;jubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X``build.getResponsibleUsers()``rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MKhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbuild.getResponsibleUsers()rr}r(h:Uh;jubahPjubaubahPj ubeubeubh)r}r(h:X5Source information (only valid if ss is not ``None``)rh;j hFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MMh\hhc]r(hrX,Source information (only valid if ss is not rr}r(h:X,Source information (only valid if ss is not h;jubj)r}r(h:X``None``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXNonerr}r(h:Uh;jubahPjubhrX)r}r(h:X)h;jubeubcdocutils.nodes block_quote r)r}r(h:Uh;j hFhIhPU block_quoterhR}r(hV]hW]hU]hT]hX]uh[Nh\hhc]r(h)r }r (h:X#A build has a set of sourcestamps::r h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[MOhc]r hrX"A build has a set of sourcestamps:rr}r(h:X"A build has a set of sourcestamps:h;j ubaubj)r}r(h:Xfor ss in build.getSourceStamp(): branch = ss.branch revision = ss.revision patch = ss.patch changes = ss.changes # listh;jhPjhR}r(jjhT]hU]hV]hW]hX]uh[MQhc]rhrXfor ss in build.getSourceStamp(): branch = ss.branch revision = ss.revision patch = ss.patch changes = ss.changes # listrr}r(h:Uh;jubaubh)r}r(h:X5A change object has the following useful information:rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MWhc]rhrX5A change object has the following useful information:rr}r(h:jh;jubaubj )r }r!(h:UhR}r"(hV]hW]hU]hT]hX]uh;jhc]r#(j )r$}r%(h:X#``who`` (str) who made this change h;j hFhIhPj hR}r&(hV]hW]hU]hT]hX]uh[MZhc]r'(j )r(}r)(h:X``who``r*h;j$hFhIhPj hR}r+(hV]hW]hU]hT]hX]uh[MZhc]r,j)r-}r.(h:j*hR}r/(hV]hW]hU]hT]hX]uh;j(hc]r0hrXwhor1r2}r3(h:Uh;j-ubahPjubaubj )r4}r5(h:UhR}r6(hV]hW]hU]hT]hX]uh;j$hc]r7h)r8}r9(h:X(str) who made this changer:h;j4hFhIhPhhR}r;(hV]hW]hU]hT]hX]uh[MZhc]r<hrX(str) who made this changer=r>}r?(h:j:h;j8ubaubahPj ubeubj )r@}rA(h:X3``revision`` (str) what VC revision is this change h;j hFhIhPj hR}rB(hV]hW]hU]hT]hX]uh[M]hc]rC(j )rD}rE(h:X ``revision``rFh;j@hFhIhPj hR}rG(hV]hW]hU]hT]hX]uh[M]hc]rHj)rI}rJ(h:jFhR}rK(hV]hW]hU]hT]hX]uh;jDhc]rLhrXrevisionrMrN}rO(h:Uh;jIubahPjubaubj )rP}rQ(h:UhR}rR(hV]hW]hU]hT]hX]uh;j@hc]rSh)rT}rU(h:X%(str) what VC revision is this changerVh;jPhFhIhPhhR}rW(hV]hW]hU]hT]hX]uh[M]hc]rXhrX%(str) what VC revision is this changerYrZ}r[(h:jVh;jTubaubahPj ubeubj )r\}r](h:X6``branch`` (str) on what branch did this change occur h;j hFhIhPj hR}r^(hV]hW]hU]hT]hX]uh[M`hc]r_(j )r`}ra(h:X ``branch``rbh;j\hFhIhPj hR}rc(hV]hW]hU]hT]hX]uh[M`hc]rdj)re}rf(h:jbhR}rg(hV]hW]hU]hT]hX]uh;j`hc]rhhrXbranchrirj}rk(h:Uh;jeubahPjubaubj )rl}rm(h:UhR}rn(hV]hW]hU]hT]hX]uh;j\hc]roh)rp}rq(h:X*(str) on what branch did this change occurrrh;jlhFhIhPhhR}rs(hV]hW]hU]hT]hX]uh[M`hc]rthrX*(str) on what branch did this change occurrurv}rw(h:jrh;jpubaubahPj ubeubj )rx}ry(h:X*``when`` (str) when did this change occur h;j hFhIhPj hR}rz(hV]hW]hU]hT]hX]uh[Mchc]r{(j )r|}r}(h:X``when``r~h;jxhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mchc]rj)r}r(h:j~hR}r(hV]hW]hU]hT]hX]uh;j|hc]rhrXwhenrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jxhc]rh)r}r(h:X (str) when did this change occurrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mchc]rhrX (str) when did this change occurrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X@``files`` (list of str) what files were affected in this change h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mfhc]r(j )r}r(h:X ``files``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mfhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXfilesrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X5(list of str) what files were affected in this changerh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mfhc]rhrX5(list of str) what files were affected in this changerr}r(h:jh;jubaubahPj ubeubj )r}r(h:X3``comments`` (str) comments reguarding the change. h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mihc]r(j )r}r(h:X ``comments``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mihc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXcommentsrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X%(str) comments reguarding the change.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mihc]rhrX%(str) comments reguarding the change.rr}r(h:jh;jubaubahPj ubeubehPj ubh)r}r(h:XThe ``Change`` methods :meth:`asText` and :meth:`asDict` can be used to format the information above. :meth:`asText` returns a list of strings and :meth:`asDict` returns a dictionary suitable for html/mail rendering.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mkhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X ``Change``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXChangerr}r(h:Uh;jubahPjubhrX methods rr}r(h:X methods h;jubj)r}r(h:X:meth:`asText`rh;jhFhIhPjhR}r(UreftypeXmethjjXasTextU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mkhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-methrehU]hT]hX]uh;jhc]rhrXasTextrr}r(h:Uh;jubahPjubaubhrX and rr}r(h:X and h;jubj)r}r(h:X:meth:`asDict`rh;jhFhIhPjhR}r(UreftypeXmethjjXasDictU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mkhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-methrehU]hT]hX]uh;jhc]rhrXasDictrr}r(h:Uh;jubahPjubaubhrX/ can be used to format the information above. rr}r(h:X/ can be used to format the information above. h;jubj)r}r(h:X:meth:`asText`rh;jhFhIhPjhR}r(UreftypeXmethjjXasTextU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mkhc]rj)r}r(h:jhR}r (hV]hW]r (jjXpy-methr ehU]hT]hX]uh;jhc]r hrXasTextr r}r(h:Uh;jubahPjubaubhrX returns a list of strings and rr}r(h:X returns a list of strings and h;jubj)r}r(h:X:meth:`asDict`rh;jhFhIhPjhR}r(UreftypeXmethjjXasDictU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mkhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-methrehU]hT]hX]uh;jhc]rhrXasDictrr }r!(h:Uh;jubahPjubaubhrX7 returns a dictionary suitable for html/mail rendering.r"r#}r$(h:X7 returns a dictionary suitable for html/mail rendering.h;jubeubeubh)r%}r&(h:XLog information ::r'h;j hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[Moh\hhc]r)hrXLog informationr*r+}r,(h:XLog informationh;j%ubaubj)r-}r.(h:Xlogs = list() for log in build.getLogs(): log_name = "%s.%s" % (log.getStep().getName(), log.getName()) log_status, dummy = log.getStep().getResults() log_body = log.getText().splitlines() # Note: can be VERY LARGE log_url = '%s/steps/%s/logs/%s' % (master_status.getURLForThing(build), log.getStep().getName(), log.getName()) logs.append((log_name, log_url, log_body, log_status))h;j hFhIhPjhR}r/(jjhT]hU]hV]hW]hX]uh[Mqh\hhc]r0hrXlogs = list() for log in build.getLogs(): log_name = "%s.%s" % (log.getStep().getName(), log.getName()) log_status, dummy = log.getStep().getResults() log_body = log.getText().splitlines() # Note: can be VERY LARGE log_url = '%s/steps/%s/logs/%s' % (master_status.getURLForThing(build), log.getStep().getName(), log.getName()) logs.append((log_name, log_url, log_body, log_status))r1r2}r3(h:Uh;j-ubaubj)r4}r5(h:Uh;j hFhIhPjhR}r6(hT]hU]hV]hW]hX]Uentries]r7((UsingleXStatus Targets; IRCX status-IRCr8j8tr9(UsingleXIRC Status Targetj8j8tr:euh[M|h\hhc]ubhM)r;}r<(h:Uh;j hFhIhPhQhR}r=(hV]hW]hU]hT]r>j8ahX]uh[M|h\hhc]ubj)r?}r@(h:Uh;j hFhIhPjhR}rA(hT]hU]hV]hW]hX]j]rB(jXIRCUindex-1rCUtrDajuh[M}h\hhc]ubhM)rE}rF(h:Uh;j hFhIhPhQhR}rG(hT]hU]hV]hW]hX]hYjCuh[M~h\hhc]ubeubeubh<)rH}rI(h:Uh;hDhFhIhK}hPhdhR}rJ(hV]hW]hU]hT]rK(j(jCehX]rLhauh[Mh\hh]}rMjCjEshc]rN(hk)rO}rP(h:j-h;jHhFhIhPhohR}rQ(hT]hU]hV]hW]hX]hYj'uh[Mh\hhc]rRhrXIRC BotrSrT}rU(h:j-h;jOubaubj)rV}rW(h:Uh;jHhFNhPjhR}rX(hT]hU]hV]hW]hX]Uentries]rY(jX*buildbot.status.words.IRC (built-in class)hUtrZauh[Nh\hhc]ubj)r[}r\(h:Uh;jHhFNhPjhR}r](jjXpyhT]hU]hV]hW]hX]jXclassr^jj^uh[Nh\hhc]r_(j)r`}ra(h:Xbuildbot.status.words.IRCh;j[hFhIhPjhR}rb(hT]rchajNhU]hV]hW]hX]rdhajhjXbuildbot.status.wordsjuh[Mh\hhc]re(j)rf}rg(h:Xclass h;j`hFhIhPjhR}rh(hV]hW]hU]hT]hX]uh[Mh\hhc]rihrXclass rjrk}rl(h:Uh;jfubaubj)rm}rn(h:Xbuildbot.status.words.h;j`hFhIhPjhR}ro(hV]hW]hU]hT]hX]uh[Mh\hhc]rphrXbuildbot.status.words.rqrr}rs(h:Uh;jmubaubj)rt}ru(h:XIRCh;j`hFhIhPjhR}rv(hV]hW]hU]hT]hX]uh[Mh\hhc]rwhrXIRCrxry}rz(h:Uh;jtubaubeubj)r{}r|(h:Uh;j[hFhIhPjhR}r}(hV]hW]hU]hT]hX]uh[Mh\hhc]ubeubh)r~}r(h:XThe :class:`buildbot.status.words.IRC` status target creates an IRC bot which will attach to certain channels and be available for status queries. It can also be asked to announce builds as they occur, or be told to shut up. ::h;jHhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThe rr}r(h:XThe h;j~ubj)r}r(h:X":class:`buildbot.status.words.IRC`rh;j~hFhIhPjhR}r(UreftypeXclassjjXbuildbot.status.words.IRCU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXbuildbot.status.words.IRCrr}r(h:Uh;jubahPjubaubhrX status target creates an IRC bot which will attach to certain channels and be available for status queries. It can also be asked to announce builds as they occur, or be told to shut up.rr}r(h:X status target creates an IRC bot which will attach to certain channels and be available for status queries. It can also be asked to announce builds as they occur, or be told to shut up.h;j~ubeubj)r}r(h:Xfrom buildbot.status import words irc = words.IRC("irc.example.org", "botnickname", useColors=False, channels=[{"channel": "#example1"}, {"channel": "#example2", "password": "somesecretpassword"}], password="mysecretnickservpassword", notify_events={ 'exception': 1, 'successToFailure': 1, 'failureToSuccess': 1, }) c['status'].append(irc)h;jHhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrXfrom buildbot.status import words irc = words.IRC("irc.example.org", "botnickname", useColors=False, channels=[{"channel": "#example1"}, {"channel": "#example2", "password": "somesecretpassword"}], password="mysecretnickservpassword", notify_events={ 'exception': 1, 'successToFailure': 1, 'failureToSuccess': 1, }) c['status'].append(irc)rr}r(h:Uh;jubaubh)r}r(h:XTake a look at the docstring for :class:`words.IRC` for more details on configuring this service. Note that the ``useSSL`` option requires `PyOpenSSL`_. The ``password`` argument, if provided, will be sent to Nickserv to claim the nickname: some IRC servers will not allow clients to send private messages until they have logged in with a password. We can also specify a different ``port`` number. Default value is 6667.h;jHhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX!Take a look at the docstring for rr}r(h:X!Take a look at the docstring for h;jubj)r}r(h:X:class:`words.IRC`rh;jhFhIhPjhR}r(UreftypeXclassjjX words.IRCU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX words.IRCrr}r(h:Uh;jubahPjubaubhrX= for more details on configuring this service. Note that the rr}r(h:X= for more details on configuring this service. Note that the h;jubj)r}r(h:X ``useSSL``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXuseSSLrr}r(h:Uh;jubahPjubhrX option requires rr}r(h:X option requires h;jubh)r}r(h:X `PyOpenSSL`_jP Kh;jhPhhR}r(UnameX PyOpenSSLj'jR hT]hU]hV]hW]hX]uhc]rhrX PyOpenSSLrr}r(h:Uh;jubaubhrX. The rr}r(h:X. The h;jubj)r}r(h:X ``password``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXpasswordrr}r(h:Uh;jubahPjubhrX argument, if provided, will be sent to Nickserv to claim the nickname: some IRC servers will not allow clients to send private messages until they have logged in with a password. We can also specify a different rr}r(h:X argument, if provided, will be sent to Nickserv to claim the nickname: some IRC servers will not allow clients to send private messages until they have logged in with a password. We can also specify a different h;jubj)r}r(h:X``port``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXportrr}r(h:Uh;jubahPjubhrX number. Default value is 6667.rr}r(h:X number. Default value is 6667.h;jubeubh)r}r(h:XTo use the service, you address messages at the buildbot, either normally (``botnickname: status``) or with private messages (``/msg botnickname status``). The buildbot will respond in kind.h;jHhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXKTo use the service, you address messages at the buildbot, either normally (rr}r(h:XKTo use the service, you address messages at the buildbot, either normally (h;jubj)r}r(h:X``botnickname: status``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbotnickname: statusrr}r(h:Uh;jubahPjubhrX) or with private messages (rr}r(h:X) or with private messages (h;jubj)r}r(h:X``/msg botnickname status``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX/msg botnickname statusrr}r(h:Uh;jubahPjubhrX%). The buildbot will respond in kind.rr}r(h:X%). The buildbot will respond in kind.h;jubeubh)r}r(h:XThe bot will add color to some of its messages. This is enabled by default, you might turn it off with ``useColors=False`` argument to words.IRC().h;jHhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXgThe bot will add color to some of its messages. This is enabled by default, you might turn it off with rr}r(h:XgThe bot will add color to some of its messages. This is enabled by default, you might turn it off with h;jubj)r}r(h:X``useColors=False``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXuseColors=Falserr}r(h:Uh;jubahPjubhrX argument to words.IRC().rr }r (h:X argument to words.IRC().h;jubeubh)r }r (h:XIf you issue a command that is currently not available, the buildbot will respond with an error message. If the ``noticeOnChannel=True`` option was used, error messages will be sent as channel notices instead of messaging. The default value is ``noticeOnChannel=False``.h;jHhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXpIf you issue a command that is currently not available, the buildbot will respond with an error message. If the rr}r(h:XpIf you issue a command that is currently not available, the buildbot will respond with an error message. If the h;j ubj)r}r(h:X``noticeOnChannel=True``hR}r(hV]hW]hU]hT]hX]uh;j hc]rhrXnoticeOnChannel=Truerr}r(h:Uh;jubahPjubhrXl option was used, error messages will be sent as channel notices instead of messaging. The default value is rr}r(h:Xl option was used, error messages will be sent as channel notices instead of messaging. The default value is h;j ubj)r}r(h:X``noticeOnChannel=False``hR}r(hV]hW]hU]hT]hX]uh;j hc]rhrXnoticeOnChannel=Falser r!}r"(h:Uh;jubahPjubhrX.r#}r$(h:X.h;j ubeubh)r%}r&(h:X)Some of the commands currently available:r'h;jHhFhIhPhhR}r((hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrX)Some of the commands currently available:r*r+}r,(h:j'h;j%ubaubj )r-}r.(h:Uh;jHhFhIhPj hR}r/(hV]hW]hU]hT]hX]uh[Nh\hhc]r0(j )r1}r2(h:X9``list builders`` Emit a list of all configured builders h;j-hFhIhPj hR}r3(hV]hW]hU]hT]hX]uh[Mhc]r4(j )r5}r6(h:X``list builders``r7h;j1hFhIhPj hR}r8(hV]hW]hU]hT]hX]uh[Mhc]r9j)r:}r;(h:j7hR}r<(hV]hW]hU]hT]hX]uh;j5hc]r=hrX list buildersr>r?}r@(h:Uh;j:ubahPjubaubj )rA}rB(h:UhR}rC(hV]hW]hU]hT]hX]uh;j1hc]rDh)rE}rF(h:X&Emit a list of all configured buildersrGh;jAhFhIhPhhR}rH(hV]hW]hU]hT]hX]uh[Mhc]rIhrX&Emit a list of all configured buildersrJrK}rL(h:jGh;jEubaubahPj ubeubj )rM}rN(h:X`:samp:`status {BUILDER}` Announce the status of a specific Builder: what it is doing right now. h;j-hFhIhPj hR}rO(hV]hW]hU]hT]hX]uh[Mh\hhc]rP(j )rQ}rR(h:X:samp:`status {BUILDER}`rSh;jMhFhIhPj hR}rT(hV]hW]hU]hT]hX]uh[Mhc]rUj)rV}rW(h:UhR}rX(hT]hU]hV]hW]rYXsamprZaUrolejZhX]uh;jQhc]r[(hrXstatus r\r]}r^(h:Xstatus h;jVubj<)r_}r`(h:XBUILDERhR}ra(hV]hW]hU]hT]hX]uh;jVhc]rbhrXBUILDERrcrd}re(h:Uh;j_ubahPjDubehPjubaubj )rf}rg(h:UhR}rh(hV]hW]hU]hT]hX]uh;jMhc]rih)rj}rk(h:XFAnnounce the status of a specific Builder: what it is doing right now.rlh;jfhFhIhPhhR}rm(hV]hW]hU]hT]hX]uh[Mhc]rnhrXFAnnounce the status of a specific Builder: what it is doing right now.rorp}rq(h:jlh;jjubaubahPj ubeubj )rr}rs(h:X3``status all`` Announce the status of all Builders h;j-hFhIhPj hR}rt(hV]hW]hU]hT]hX]uh[Mh\hhc]ru(j )rv}rw(h:X``status all``rxh;jrhFhIhPj hR}ry(hV]hW]hU]hT]hX]uh[Mhc]rzj)r{}r|(h:jxhR}r}(hV]hW]hU]hT]hX]uh;jvhc]r~hrX status allrr}r(h:Uh;j{ubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jrhc]rh)r}r(h:X#Announce the status of all Buildersrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrX#Announce the status of all Buildersrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X:samp:`watch {BUILDER}` If the given :class:`Builder` is currently running, wait until the :class:`Build` is finished and then announce the results. h;j-hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X:samp:`watch {BUILDER}`rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrXwatch rr}r(h:Xwatch h;jubj<)r}r(h:XBUILDERhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXBUILDERrr}r(h:Uh;jubahPjDubehPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X|If the given :class:`Builder` is currently running, wait until the :class:`Build` is finished and then announce the results.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]r(hrX If the given rr}r(h:X If the given h;jubj)r}r(h:X:class:`Builder`rh;jhFhIhPjhR}r(UreftypeXclassjjXBuilderU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXBuilderrr}r(h:Uh;jubahPjubaubhrX& is currently running, wait until the rr}r(h:X& is currently running, wait until the h;jubj)r}r(h:X:class:`Build`rh;jhFhIhPjhR}r(UreftypeXclassjjXBuildU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXBuildrr}r(h:Uh;jubahPjubaubhrX+ is finished and then announce the results.rr}r(h:X+ is finished and then announce the results.h;jubeubahPj ubeubj )r}r(h:Xb:samp:`last {BUILDER}` Return the results of the last build to run on the given :class:`Builder`. h;j-hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X:samp:`last {BUILDER}`rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrXlast rr}r(h:Xlast h;jubj<)r}r(h:XBUILDERhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXBUILDERrr}r(h:Uh;jubahPjDubehPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XJReturn the results of the last build to run on the given :class:`Builder`.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]r(hrX9Return the results of the last build to run on the given rr}r(h:X9Return the results of the last build to run on the given h;jubj)r}r(h:X:class:`Builder`rh;jhFhIhPjhR}r(UreftypeXclassjjXBuilderU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXBuilderrr}r(h:Uh;jubahPjubaubhrX.r }r (h:X.h;jubeubahPj ubeubj )r }r (h:X2:samp:`join {CHANNEL}` Join the given IRC channel h;j-hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X:samp:`join {CHANNEL}`rh;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrXjoin rr}r(h:Xjoin h;jubj<)r}r(h:XCHANNELhR}r(hV]hW]hU]hT]hX]uh;jhc]r hrXCHANNELr!r"}r#(h:Uh;jubahPjDubehPjubaubj )r$}r%(h:UhR}r&(hV]hW]hU]hT]hX]uh;j hc]r'h)r(}r)(h:XJoin the given IRC channelr*h;j$hFhIhPhhR}r+(hV]hW]hU]hT]hX]uh[Mhc]r,hrXJoin the given IRC channelr-r.}r/(h:j*h;j(ubaubahPj ubeubj )r0}r1(h:X4:samp:`leave {CHANNEL}` Leave the given IRC channel h;j-hFhIhPj hR}r2(hV]hW]hU]hT]hX]uh[Mh\hhc]r3(j )r4}r5(h:X:samp:`leave {CHANNEL}`r6h;j0hFhIhPj hR}r7(hV]hW]hU]hT]hX]uh[Mhc]r8j)r9}r:(h:UhR}r;(hT]hU]hV]hW]r<Xsampr=aUrolej=hX]uh;j4hc]r>(hrXleave r?r@}rA(h:Xleave h;j9ubj<)rB}rC(h:XCHANNELhR}rD(hV]hW]hU]hT]hX]uh;j9hc]rEhrXCHANNELrFrG}rH(h:Uh;jBubahPjDubehPjubaubj )rI}rJ(h:UhR}rK(hV]hW]hU]hT]hX]uh;j0hc]rLh)rM}rN(h:XLeave the given IRC channelrOh;jIhFhIhPhhR}rP(hV]hW]hU]hT]hX]uh[Mhc]rQhrXLeave the given IRC channelrRrS}rT(h:jOh;jMubaubahPj ubeubj )rU}rV(h:X:samp:`notify on|off|list {EVENT}` Report events relating to builds. If the command is issued as a private message, then the report will be sent back as a private message to the user who issued the command. Otherwise, the report will be sent to the channel. Available events to be notified are: ``started`` A build has started ``finished`` A build has finished ``success`` A build finished successfully ``failure`` A build failed ``exception`` A build generated and exception ``xToY`` The previous build was x, but this one is Y, where x and Y are each one of success, warnings, failure, exception (except Y is capitalized). For example: ``successToFailure`` will notify if the previous build was successful, but this one failed h;j-hFhIhPj hR}rW(hV]hW]hU]hT]hX]uh[Mh\hhc]rX(j )rY}rZ(h:X":samp:`notify on|off|list {EVENT}`r[h;jUhFhIhPj hR}r\(hV]hW]hU]hT]hX]uh[Mhc]r]j)r^}r_(h:UhR}r`(hT]hU]hV]hW]raXsamprbaUrolejbhX]uh;jYhc]rc(hrXnotify on|off|list rdre}rf(h:Xnotify on|off|list h;j^ubj<)rg}rh(h:XEVENThR}ri(hV]hW]hU]hT]hX]uh;j^hc]rjhrXEVENTrkrl}rm(h:Uh;jgubahPjDubehPjubaubj )rn}ro(h:UhR}rp(hV]hW]hU]hT]hX]uh;jUhc]rq(h)rr}rs(h:XReport events relating to builds. If the command is issued as a private message, then the report will be sent back as a private message to the user who issued the command. Otherwise, the report will be sent to the channel. Available events to be notified are:rth;jnhFhIhPhhR}ru(hV]hW]hU]hT]hX]uh[Mhc]rvhrXReport events relating to builds. If the command is issued as a private message, then the report will be sent back as a private message to the user who issued the command. Otherwise, the report will be sent to the channel. Available events to be notified are:rwrx}ry(h:jth;jrubaubj )rz}r{(h:UhR}r|(hV]hW]hU]hT]hX]uh;jnhc]r}(j )r~}r(h:X ``started`` A build has started h;jzhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``started``rh;j~hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXstartedrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;j~hc]rh)r}r(h:XA build has startedrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXA build has startedrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X"``finished`` A build has finished h;jzhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``finished``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXfinishedrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XA build has finishedrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXA build has finishedrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X*``success`` A build finished successfully h;jzhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``success``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXsuccessrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XA build finished successfullyrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXA build finished successfullyrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X``failure`` A build failed h;jzhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``failure``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXfailurerr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XA build failedrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXA build failedrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X.``exception`` A build generated and exception h;jzhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``exception``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX exceptionrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XA build generated and exceptionrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXA build generated and exceptionrr}r (h:jh;jubaubahPj ubeubj )r }r (h:X``xToY`` The previous build was x, but this one is Y, where x and Y are each one of success, warnings, failure, exception (except Y is capitalized). For example: ``successToFailure`` will notify if the previous build was successful, but this one failed h;jzhFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Mhc]r (j )r}r(h:X``xToY``rh;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXxToYrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;j hc]rh)r}r(h:XThe previous build was x, but this one is Y, where x and Y are each one of success, warnings, failure, exception (except Y is capitalized). For example: ``successToFailure`` will notify if the previous build was successful, but this one failedh;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r!(hrXThe previous build was x, but this one is Y, where x and Y are each one of success, warnings, failure, exception (except Y is capitalized). For example: r"r#}r$(h:XThe previous build was x, but this one is Y, where x and Y are each one of success, warnings, failure, exception (except Y is capitalized). For example: h;jubj)r%}r&(h:X``successToFailure``hR}r'(hV]hW]hU]hT]hX]uh;jhc]r(hrXsuccessToFailurer)r*}r+(h:Uh;j%ubahPjubhrXF will notify if the previous build was successful, but this one failedr,r-}r.(h:XF will notify if the previous build was successful, but this one failedh;jubeubahPj ubeubehPj ubehPj ubeubj )r/}r0(h:Xi:samp:`help {COMMAND}` Describe a command. Use :command:`help commands` to get a list of known commands. h;j-hFhIhPj hR}r1(hV]hW]hU]hT]hX]uh[Mh\hhc]r2(j )r3}r4(h:X:samp:`help {COMMAND}`r5h;j/hFhIhPj hR}r6(hV]hW]hU]hT]hX]uh[Mhc]r7j)r8}r9(h:UhR}r:(hT]hU]hV]hW]r;Xsampr<aUrolej<hX]uh;j3hc]r=(hrXhelp r>r?}r@(h:Xhelp h;j8ubj<)rA}rB(h:XCOMMANDhR}rC(hV]hW]hU]hT]hX]uh;j8hc]rDhrXCOMMANDrErF}rG(h:Uh;jAubahPjDubehPjubaubj )rH}rI(h:UhR}rJ(hV]hW]hU]hT]hX]uh;j/hc]rKh)rL}rM(h:XQDescribe a command. Use :command:`help commands` to get a list of known commands.h;jHhFhIhPhhR}rN(hV]hW]hU]hT]hX]uh[Mhc]rO(hrXDescribe a command. Use rPrQ}rR(h:XDescribe a command. Use h;jLubj)rS}rT(h:X:command:`help commands`hR}rU(hV]hW]rVjahU]hT]hX]uh;jLhc]rWhrX help commandsrXrY}rZ(h:Uh;jSubahPjubhrX! to get a list of known commands.r[r\}r](h:X! to get a list of known commands.h;jLubeubahPj ubeubj )r^}r_(h:X@:samp:`shutdown {ARG}` Control the shutdown process of the buildbot master. Available arguments are: ``check`` Check if the buildbot master is running or shutting down ``start`` Start clean shutdown ``stop`` Stop clean shutdown ``now`` Shutdown immediately without waiting for the builders to finish h;j-hFhIhPj hR}r`(hV]hW]hU]hT]hX]uh[Mh\hhc]ra(j )rb}rc(h:X:samp:`shutdown {ARG}`rdh;j^hFhIhPj hR}re(hV]hW]hU]hT]hX]uh[Mhc]rfj)rg}rh(h:UhR}ri(hT]hU]hV]hW]rjXsamprkaUrolejkhX]uh;jbhc]rl(hrX shutdown rmrn}ro(h:X shutdown h;jgubj<)rp}rq(h:XARGhR}rr(hV]hW]hU]hT]hX]uh;jghc]rshrXARGrtru}rv(h:Uh;jpubahPjDubehPjubaubj )rw}rx(h:UhR}ry(hV]hW]hU]hT]hX]uh;j^hc]rz(h)r{}r|(h:XMControl the shutdown process of the buildbot master. Available arguments are:r}h;jwhFhIhPhhR}r~(hV]hW]hU]hT]hX]uh[Mhc]rhrXMControl the shutdown process of the buildbot master. Available arguments are:rr}r(h:j}h;j{ubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jwhc]r(j )r}r(h:XC``check`` Check if the buildbot master is running or shutting down h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``check``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXcheckrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X8Check if the buildbot master is running or shutting downrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrX8Check if the buildbot master is running or shutting downrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X``start`` Start clean shutdown h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X ``start``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXstartrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XStart clean shutdownrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXStart clean shutdownrr}r(h:jh;jubaubahPj ubeubj )r}r(h:X``stop`` Stop clean shutdown h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X``stop``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXstoprr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:XStop clean shutdownrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrXStop clean shutdownrr}r(h:jh;jubaubahPj ubeubj )r}r(h:XH``now`` Shutdown immediately without waiting for the builders to finish h;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]r(j )r}r(h:X``now``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXnowrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]rh)r}r(h:X?Shutdown immediately without waiting for the builders to finishrh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrX?Shutdown immediately without waiting for the builders to finishrr}r(h:jh;jubaubahPj ubeubehPj ubehPj ubeubj )r}r(h:X9``source`` Announce the URL of the Buildbot's home page. h;j-hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X ``source``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXsourcerr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r (hV]hW]hU]hT]hX]uh;jhc]r h)r }r (h:X-Announce the URL of the Buildbot's home page.r h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]rhrX-Announce the URL of the Buildbot's home page.rr}r(h:j h;j ubaubahPj ubeubj )r}r(h:X3``version`` Announce the version of this Buildbot. h;j-hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X ``version``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXversionr r!}r"(h:Uh;jubahPjubaubj )r#}r$(h:UhR}r%(hV]hW]hU]hT]hX]uh;jhc]r&h)r'}r((h:X&Announce the version of this Buildbot.r)h;j#hFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mhc]r+hrX&Announce the version of this Buildbot.r,r-}r.(h:j)h;j'ubaubahPj ubeubeubh)r/}r0(h:XgAdditionally, the config file may specify default notification options as shown in the example earlier.r1h;jHhFhIhPhhR}r2(hV]hW]hU]hT]hX]uh[Mh\hhc]r3hrXgAdditionally, the config file may specify default notification options as shown in the example earlier.r4r5}r6(h:j1h;j/ubaubh)r7}r8(h:XWIf the ``allowForce=True`` option was used, some additional commands will be available:h;jHhFhIhPhhR}r9(hV]hW]hU]hT]hX]uh[Mh\hhc]r:(hrXIf the r;r<}r=(h:XIf the h;j7ubj)r>}r?(h:X``allowForce=True``hR}r@(hV]hW]hU]hT]hX]uh;j7hc]rAhrXallowForce=TruerBrC}rD(h:Uh;j>ubahPjubhrX= option was used, some additional commands will be available:rErF}rG(h:X= option was used, some additional commands will be available:h;j7ubeubj)rH}rI(h:Uh;jHhFhIhPjhR}rJ(hT]hU]hV]hW]hX]j]rK(jXProperties; from forced buildUindex-2rLUtrMajuh[Mh\hhc]ubhM)rN}rO(h:Uh;jHhFhIhPhQhR}rP(hT]hU]hV]hW]hX]hYjLuh[Mh\hhc]ubj )rQ}rR(h:Uh;jHhFhIhK}hPj hR}rS(hV]hW]hU]hT]rTjLahX]uh[Nh\hh]}rUjLjNshc]rV(j )rW}rX(h:X5:samp:`force build [--branch={BRANCH}] [--revision={REVISION}] [--props=PROP1=VAL1,PROP2=VAL2...] {BUILDER} {REASON}` Tell the given :class:`Builder` to start a build of the latest code. The user requesting the build and *REASON* are recorded in the :class:`Build` status. The buildbot will announce the build's status when it finishes.The user can specify a branch and/or revision with the optional parameters :samp:`--branch={BRANCH}` and :samp:`--revision={REVISION}`. The user can also give a list of properties with :samp:`--props={PROP1=VAL1,PROP2=VAL2..}`. h;jQhFhIhPj hR}rY(hV]hW]hU]hT]hX]uh[Mhc]rZ(j )r[}r\(h:Xu:samp:`force build [--branch={BRANCH}] [--revision={REVISION}] [--props=PROP1=VAL1,PROP2=VAL2...] {BUILDER} {REASON}`r]h;jWhFhIhPj hR}r^(hV]hW]hU]hT]hX]uh[Mhc]r_j)r`}ra(h:UhR}rb(hT]hU]hV]hW]rcXsamprdaUrolejdhX]uh;j[hc]re(hrXforce build [--branch=rfrg}rh(h:Xforce build [--branch=h;j`ubj<)ri}rj(h:XBRANCHhR}rk(hV]hW]hU]hT]hX]uh;j`hc]rlhrXBRANCHrmrn}ro(h:Uh;jiubahPjDubhrX] [--revision=rprq}rr(h:X] [--revision=h;j`ubj<)rs}rt(h:XREVISIONhR}ru(hV]hW]hU]hT]hX]uh;j`hc]rvhrXREVISIONrwrx}ry(h:Uh;jsubahPjDubhrX%] [--props=PROP1=VAL1,PROP2=VAL2...] rzr{}r|(h:X%] [--props=PROP1=VAL1,PROP2=VAL2...] h;j`ubj<)r}}r~(h:XBUILDERhR}r(hV]hW]hU]hT]hX]uh;j`hc]rhrXBUILDERrr}r(h:Uh;j}ubahPjDubhrX r}r(h:X h;j`ubj<)r}r(h:XREASONhR}r(hV]hW]hU]hT]hX]uh;j`hc]rhrXREASONrr}r(h:Uh;jubahPjDubehPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jWhc]rh)r}r(h:XTell the given :class:`Builder` to start a build of the latest code. The user requesting the build and *REASON* are recorded in the :class:`Build` status. The buildbot will announce the build's status when it finishes.The user can specify a branch and/or revision with the optional parameters :samp:`--branch={BRANCH}` and :samp:`--revision={REVISION}`. The user can also give a list of properties with :samp:`--props={PROP1=VAL1,PROP2=VAL2..}`.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mhc]r(hrXTell the given rr}r(h:XTell the given h;jubj)r}r(h:X:class:`Builder`rh;jhFhIhPjhR}r(UreftypeXclassjjXBuilderU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXBuilderrr}r(h:Uh;jubahPjubaubhrXH to start a build of the latest code. The user requesting the build and rr}r(h:XH to start a build of the latest code. The user requesting the build and h;jubj<)r}r(h:X*REASON*hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXREASONrr}r(h:Uh;jubahPjDubhrX are recorded in the rr}r(h:X are recorded in the h;jubj)r}r(h:X:class:`Build`rh;jhFhIhPjhR}r(UreftypeXclassjjXBuildU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXBuildrr}r(h:Uh;jubahPjubaubhrX status. The buildbot will announce the build's status when it finishes.The user can specify a branch and/or revision with the optional parameters rr}r(h:X status. The buildbot will announce the build's status when it finishes.The user can specify a branch and/or revision with the optional parameters h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrX --branch=rr}r(h:X --branch=h;jubj<)r}r(h:XBRANCHhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXBRANCHrr}r(h:Uh;jubahPjDubehPjubhrX and rr}r(h:X and h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrX --revision=rr}r(h:X --revision=h;jubj<)r}r(h:XREVISIONhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXREVISIONrr}r(h:Uh;jubahPjDubehPjubhrX3. The user can also give a list of properties with rr}r(h:X3. The user can also give a list of properties with h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrX--props=rr}r(h:X--props=h;jubj<)r}r(h:XPROP1=VAL1,PROP2=VAL2..hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXPROP1=VAL1,PROP2=VAL2..rr}r(h:Uh;jubahPjDubehPjubhrX.r}r(h:X.h;jubeubahPj ubeubj )r}r(h:Xv:samp:`stop build {BUILDER} {REASON}` Terminate any running build in the given :class:`Builder`. *REASON* will be added to the build status to explain why it was stopped. You might use this if you committed a bug, corrected it right away, and don't want to wait for the first build (which is destined to fail) to complete before starting the second (hopefully fixed) build. h;jQhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X%:samp:`stop build {BUILDER} {REASON}`rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:UhR}r (hT]hU]hV]hW]r Xsampr aUrolej hX]uh;jhc]r (hrX stop build r r}r(h:X stop build h;jubj<)r}r(h:XBUILDERhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXBUILDERrr}r(h:Uh;jubahPjDubhrX r}r(h:X h;jubj<)r}r(h:XREASONhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXREASONrr}r(h:Uh;jubahPjDubehPjubaubj )r }r!(h:UhR}r"(hV]hW]hU]hT]hX]uh;jhc]r#h)r$}r%(h:XOTerminate any running build in the given :class:`Builder`. *REASON* will be added to the build status to explain why it was stopped. You might use this if you committed a bug, corrected it right away, and don't want to wait for the first build (which is destined to fail) to complete before starting the second (hopefully fixed) build.h;j hFhIhPhhR}r&(hV]hW]hU]hT]hX]uh[M hc]r'(hrX)Terminate any running build in the given r(r)}r*(h:X)Terminate any running build in the given h;j$ubj)r+}r,(h:X:class:`Builder`r-h;j$hFhIhPjhR}r.(UreftypeXclassjjXBuilderU refdomainXpyr/hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M hc]r0j)r1}r2(h:j-hR}r3(hV]hW]r4(jj/Xpy-classr5ehU]hT]hX]uh;j+hc]r6hrXBuilderr7r8}r9(h:Uh;j1ubahPjubaubhrX. r:r;}r<(h:X. h;j$ubj<)r=}r>(h:X*REASON*hR}r?(hV]hW]hU]hT]hX]uh;j$hc]r@hrXREASONrArB}rC(h:Uh;j=ubahPjDubhrX  will be added to the build status to explain why it was stopped. You might use this if you committed a bug, corrected it right away, and don't want to wait for the first build (which is destined to fail) to complete before starting the second (hopefully fixed) build.rDrE}rF(h:X  will be added to the build status to explain why it was stopped. You might use this if you committed a bug, corrected it right away, and don't want to wait for the first build (which is destined to fail) to complete before starting the second (hopefully fixed) build.h;j$ubeubahPj ubeubeubh)rG}rH(h:XIf the `categories` is set to a category of builders (see the categories option in :ref:`Builder-Configuration`) changes related to only that category of builders will be sent to the channel.h;jHhFhIhPhhR}rI(hV]hW]hU]hT]hX]uh[Mh\hhc]rJ(hrXIf the rKrL}rM(h:XIf the h;jGubj)rN}rO(h:X `categories`hR}rP(hV]hW]hU]hT]hX]uh;jGhc]rQhrX categoriesrRrS}rT(h:Uh;jNubahPjubhrX@ is set to a category of builders (see the categories option in rUrV}rW(h:X@ is set to a category of builders (see the categories option in h;jGubj)rX}rY(h:X:ref:`Builder-Configuration`rZh;jGhFhIhPjhR}r[(UreftypeXrefjjXbuilder-configurationU refdomainXstdr\hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r]j<)r^}r_(h:jZhR}r`(hV]hW]ra(jj\Xstd-refrbehU]hT]hX]uh;jXhc]rchrXBuilder-Configurationrdre}rf(h:Uh;j^ubahPjDubaubhrXP) changes related to only that category of builders will be sent to the channel.rgrh}ri(h:XP) changes related to only that category of builders will be sent to the channel.h;jGubeubh)rj}rk(h:XIf the `useRevisions` option is set to `True`, the IRC bot will send status messages that replace the build number with a list of revisions that are contained in that build. So instead of seeing `build #253 of ...`, you would see something like `build containing revisions [a87b2c4]`. Revisions that are stored as hashes are shortened to 7 characters in length, as multiple revisions can be contained in one build and may exceed the IRC message length limit.h;jHhFhIhPhhR}rl(hV]hW]hU]hT]hX]uh[Mh\hhc]rm(hrXIf the rnro}rp(h:XIf the h;jjubj)rq}rr(h:X`useRevisions`hR}rs(hV]hW]hU]hT]hX]uh;jjhc]rthrX useRevisionsrurv}rw(h:Uh;jqubahPjubhrX option is set to rxry}rz(h:X option is set to h;jjubj)r{}r|(h:X`True`hR}r}(hV]hW]hU]hT]hX]uh;jjhc]r~hrXTruerr}r(h:Uh;j{ubahPjubhrX, the IRC bot will send status messages that replace the build number with a list of revisions that are contained in that build. So instead of seeing rr}r(h:X, the IRC bot will send status messages that replace the build number with a list of revisions that are contained in that build. So instead of seeing h;jjubj)r}r(h:X`build #253 of ...`hR}r(hV]hW]hU]hT]hX]uh;jjhc]rhrXbuild #253 of ...rr}r(h:Uh;jubahPjubhrX, you would see something like rr}r(h:X, you would see something like h;jjubj)r}r(h:X&`build containing revisions [a87b2c4]`hR}r(hV]hW]hU]hT]hX]uh;jjhc]rhrX$build containing revisions [a87b2c4]rr}r(h:Uh;jubahPjubhrX. Revisions that are stored as hashes are shortened to 7 characters in length, as multiple revisions can be contained in one build and may exceed the IRC message length limit.rr}r(h:X. Revisions that are stored as hashes are shortened to 7 characters in length, as multiple revisions can be contained in one build and may exceed the IRC message length limit.h;jjubeubh)r}r(h:XCTwo additional arguments can be set to control how fast the IRC bot tries to reconnect when it encounters connection issues. ``lostDelay`` is the number of of seconds the bot will wait to reconnect when the connection is lost, where as ``failedDelay`` is the number of seconds until the bot tries to reconnect when the connection failed. ``lostDelay`` defaults to a random number between 1 and 5, while ``failedDelay`` defaults to a random one between 45 and 60. Setting random defaults like this means multiple IRC bots are less likely to deny each other by flooding the server.h;jHhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX}Two additional arguments can be set to control how fast the IRC bot tries to reconnect when it encounters connection issues. rr}r(h:X}Two additional arguments can be set to control how fast the IRC bot tries to reconnect when it encounters connection issues. h;jubj)r}r(h:X ``lostDelay``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX lostDelayrr}r(h:Uh;jubahPjubhrXb is the number of of seconds the bot will wait to reconnect when the connection is lost, where as rr}r(h:Xb is the number of of seconds the bot will wait to reconnect when the connection is lost, where as h;jubj)r}r(h:X``failedDelay``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX failedDelayrr}r(h:Uh;jubahPjubhrXW is the number of seconds until the bot tries to reconnect when the connection failed. rr}r(h:XW is the number of seconds until the bot tries to reconnect when the connection failed. h;jubj)r}r(h:X ``lostDelay``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX lostDelayrr}r(h:Uh;jubahPjubhrX4 defaults to a random number between 1 and 5, while rr}r(h:X4 defaults to a random number between 1 and 5, while h;jubj)r}r(h:X``failedDelay``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX failedDelayrr}r(h:Uh;jubahPjubhrX defaults to a random one between 45 and 60. Setting random defaults like this means multiple IRC bots are less likely to deny each other by flooding the server.rr}r(h:X defaults to a random one between 45 and 60. Setting random defaults like this means multiple IRC bots are less likely to deny each other by flooding the server.h;jubeubj)r}r(h:Uh;jHhFhIhPjhR}r(hT]hU]hV]hW]hX]Uentries]r((UsingleXStatus Targets; PBListenerXstatus-PBListenerrjtr(UsingleXPBListener Status Targetjjtreuh[M%h\hhc]ubhM)r}r(h:Uh;jHhFhIhPhQhR}r(hT]hU]hV]hW]hX]hYjuh[M%h\hhc]ubeubh<)r}r(h:Uh;hDhFhIhK}hPhdhR}r(hV]hW]hU]hT]r(j;jehX]rhauh[M'h\hh]}rjjshc]r(hk)r}r(h:j@h;jhFhIhPhohR}r(hT]hU]hV]hW]hX]hYj:uh[M'h\hhc]rhrX PBListenerrr}r(h:j@h;jubaubcdocutils.nodes comment r)r}r(h:X@cindex PBListenerh;jhFhIhPUcommentrhR}r(jjhT]hU]hV]hW]hX]uh[M)h\hhc]rhrX@cindex PBListenerrr}r(h:Uh;jubaubj)r}r(h:Uh;jhFNhPjhR}r(hT]hU]hV]hW]hX]Uentries]r(jX2buildbot.status.client.PBListener (built-in class)h-Utrauh[Nh\hhc]ubj)r}r(h:Uh;jhFNhPjhR}r(jjXpyhT]hU]hV]hW]hX]jXclassrjjuh[Nh\hhc]r(j)r}r(h:X!buildbot.status.client.PBListenerh;jhFhIhPjhR}r(hT]rh-ajNhU]hV]hW]hX]rh-ajh-jXbuildbot.status.clientjuh[M+h\hhc]r(j)r}r(h:Xclass h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[M+h\hhc]rhrXclass rr}r(h:Uh;jubaubj)r}r(h:Xbuildbot.status.client.h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[M+h\hhc]rhrXbuildbot.status.client.rr}r(h:Uh;jubaubj)r}r(h:X PBListenerh;jhFhIhPjhR}r (hV]hW]hU]hT]hX]uh[M+h\hhc]r hrX PBListenerr r }r (h:Uh;jubaubeubj)r}r(h:Uh;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[M+h\hhc]ubeubj)r}r(h:Ximport buildbot.status.client pbl = buildbot.status.client.PBListener(port=int, user=str, passwd=str) c['status'].append(pbl)h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[M.h\hhc]rhrXimport buildbot.status.client pbl = buildbot.status.client.PBListener(port=int, user=str, passwd=str) c['status'].append(pbl)rr}r(h:Uh;jubaubh)r}r(h:X"This sets up a PB listener on the given TCP port, to which a PB-based status client can connect and retrieve status information. :command:`buildbot statusgui` (:bb:cmdline:`statusgui`) is an example of such a status client. The ``port`` argument can also be a strports specification string.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[M3h\hhc]r(hrXThis sets up a PB listener on the given TCP port, to which a PB-based status client can connect and retrieve status information. rr}r(h:XThis sets up a PB listener on the given TCP port, to which a PB-based status client can connect and retrieve status information. h;jubj)r}r (h:X:command:`buildbot statusgui`hR}r!(hV]hW]r"jahU]hT]hX]uh;jhc]r#hrXbuildbot statusguir$r%}r&(h:Uh;jubahPjubhrX (r'r(}r)(h:X (h;jubj)r*}r+(h:X:bb:cmdline:`statusgui`r,h;jhFhIhPjhR}r-(UreftypeXcmdlinejjX statusguiU refdomainXbbr.hT]hU]U refexplicithV]hW]hX]jjuh[M3hc]r/j)r0}r1(h:j,hR}r2(hV]hW]r3(jj.X bb-cmdliner4ehU]hT]hX]uh;j*hc]r5hrX statusguir6r7}r8(h:Uh;j0ubahPjubaubhrX-) is an example of such a status client. The r9r:}r;(h:X-) is an example of such a status client. The h;jubj)r<}r=(h:X``port``hR}r>(hV]hW]hU]hT]hX]uh;jhc]r?hrXportr@rA}rB(h:Uh;j<ubahPjubhrX6 argument can also be a strports specification string.rCrD}rE(h:X6 argument can also be a strports specification string.h;jubeubj)rF}rG(h:Uh;jhFhIhPjhR}rH(hT]hU]hV]hW]hX]Uentries]rI((UsingleXStatus Targets; StatusPushXstatus-StatusPushrJjJtrK(UsingleXStatusPush Status TargetjJjJtrLeuh[M:h\hhc]ubhM)rM}rN(h:Uh;jhFhIhPhQhR}rO(hT]hU]hV]hW]hX]hYjJuh[M:h\hhc]ubeubh<)rP}rQ(h:Uh;hDhFhIhK}hPhdhR}rR(hV]hW]hU]hT]rS(jNjJehX]rTh.auh[M<h\hh]}rUjJjMshc]rV(hk)rW}rX(h:jSh;jPhFhIhPhohR}rY(hT]hU]hV]hW]hX]hYjMuh[M<h\hhc]rZhrX StatusPushr[r\}r](h:jSh;jWubaubj)r^}r_(h:X@cindex StatusPushh;jPhFhIhPjhR}r`(jjhT]hU]hV]hW]hX]uh[M>h\hhc]rahrX@cindex StatusPushrbrc}rd(h:Uh;j^ubaubj)re}rf(h:Uh;jPhFNhPjhR}rg(hT]hU]hV]hW]hX]Uentries]rh(jX7buildbot.status.status_push.StatusPush (built-in class)h"Utriauh[Nh\hhc]ubj)rj}rk(h:Uh;jPhFNhPjhR}rl(jjXpyhT]hU]hV]hW]hX]jXclassrmjjmuh[Nh\hhc]rn(j)ro}rp(h:X&buildbot.status.status_push.StatusPushh;jjhFhIhPjhR}rq(hT]rrh"ajNhU]hV]hW]hX]rsh"ajh"jXbuildbot.status.status_pushjuh[M@h\hhc]rt(j)ru}rv(h:Xclass h;johFhIhPjhR}rw(hV]hW]hU]hT]hX]uh[M@h\hhc]rxhrXclass ryrz}r{(h:Uh;juubaubj)r|}r}(h:Xbuildbot.status.status_push.h;johFhIhPjhR}r~(hV]hW]hU]hT]hX]uh[M@h\hhc]rhrXbuildbot.status.status_push.rr}r(h:Uh;j|ubaubj)r}r(h:X StatusPushh;johFhIhPjhR}r(hV]hW]hU]hT]hX]uh[M@h\hhc]rhrX StatusPushrr}r(h:Uh;jubaubeubj)r}r(h:Uh;jjhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[M@h\hhc]ubeubj)r}r(h:XFdef Process(self): print str(self.queue.popChunk()) self.queueNextServerPush() import buildbot.status.status_push sp = buildbot.status.status_push.StatusPush(serverPushCb=Process, bufferDelay=0.5, retryDelay=5) c['status'].append(sp)h;jPhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[MCh\hhc]rhrXFdef Process(self): print str(self.queue.popChunk()) self.queueNextServerPush() import buildbot.status.status_push sp = buildbot.status.status_push.StatusPush(serverPushCb=Process, bufferDelay=0.5, retryDelay=5) c['status'].append(sp)rr}r(h:Uh;jubaubh)r}r(h:X1:class:`StatusPush` batches events normally processed and sends it to the :func:`serverPushCb` callback every ``bufferDelay`` seconds. The callback should pop items from the queue and then queue the next callback. If no items were popped from ``self.queue``, ``retryDelay`` seconds will be waited instead.h;jPhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[MMh\hhc]r(j)r}r(h:X:class:`StatusPush`rh;jhFhIhPjhR}r(UreftypeXclassjjX StatusPushU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[MMhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX StatusPushrr}r(h:Uh;jubahPjubaubhrX7 batches events normally processed and sends it to the rr}r(h:X7 batches events normally processed and sends it to the h;jubj)r}r(h:X:func:`serverPushCb`rh;jhFhIhPjhR}r(UreftypeXfuncjjX serverPushCbU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[MMhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-funcrehU]hT]hX]uh;jhc]rhrX serverPushCbrr}r(h:Uh;jubahPjubaubhrX callback every rr}r(h:X callback every h;jubj)r}r(h:X``bufferDelay``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX bufferDelayrr}r(h:Uh;jubahPjubhrXv seconds. The callback should pop items from the queue and then queue the next callback. If no items were popped from rr}r(h:Xv seconds. The callback should pop items from the queue and then queue the next callback. If no items were popped from h;jubj)r}r(h:X``self.queue``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX self.queuerr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X``retryDelay``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX retryDelayrr}r(h:Uh;jubahPjubhrX seconds will be waited instead.rr}r(h:X seconds will be waited instead.h;jubeubj)r}r(h:Uh;jPhFhIhPjhR}r(hT]hU]hV]hW]hX]Uentries]r((UsingleXStatus Targets; HttpStatusPushXstatus-HttpStatusPushrjtr(UsingleXHttpStatusPush Status Targetjjtreuh[MTh\hhc]ubhM)r}r(h:Uh;jPhFhIhPhQhR}r(hT]hU]hV]hW]hX]hYjuh[MTh\hhc]ubeubh<)r}r(h:Uh;hDhFhIhK}hPhdhR}r(hV]hW]hU]hT]r(jajehX]rhauh[MVh\hh]}rjjshc]r(hk)r}r(h:jfh;jhFhIhPhohR}r(hT]hU]hV]hW]hX]hYj`uh[MVh\hhc]rhrXHttpStatusPushrr}r(h:jfh;jubaubj)r}r(h:X@cindex HttpStatusPushh;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[MXh\hhc]rhrX@cindex HttpStatusPushrr}r(h:Uh;jubaubj)r}r(h:X3@stindex buildbot.status.status_push.HttpStatusPushh;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[MZh\hhc]rhrX3@stindex buildbot.status.status_push.HttpStatusPushrr}r(h:Uh;jubaubj)r}r(h:Ximport buildbot.status.status_push sp = buildbot.status.status_push.HttpStatusPush( serverUrl="http://example.com/submit") c['status'].append(sp)h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[M]h\hhc]rhrXimport buildbot.status.status_push sp = buildbot.status.status_push.HttpStatusPush( serverUrl="http://example.com/submit") c['status'].append(sp)rr}r(h:Uh;jubaubh)r}r(h:X:class:`HttpStatusPush` builds on :class:`StatusPush` and sends HTTP requests to ``serverUrl``, with all the items json-encoded. It is useful to create a status front end outside of buildbot for better scalability.h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mbh\hhc]r (j)r }r (h:X:class:`HttpStatusPush`r h;jhFhIhPjhR}r(UreftypeXclassjjXHttpStatusPushU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mbhc]rj)r}r(h:j hR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;j hc]rhrXHttpStatusPushrr}r(h:Uh;jubahPjubaubhrX builds on rr}r(h:X builds on h;jubj)r}r(h:X:class:`StatusPush`rh;jhFhIhPjhR}r (UreftypeXclassjjX StatusPushU refdomainXpyr!hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mbhc]r"j)r#}r$(h:jhR}r%(hV]hW]r&(jj!Xpy-classr'ehU]hT]hX]uh;jhc]r(hrX StatusPushr)r*}r+(h:Uh;j#ubahPjubaubhrX and sends HTTP requests to r,r-}r.(h:X and sends HTTP requests to h;jubj)r/}r0(h:X ``serverUrl``hR}r1(hV]hW]hU]hT]hX]uh;jhc]r2hrX serverUrlr3r4}r5(h:Uh;j/ubahPjubhrXx, with all the items json-encoded. It is useful to create a status front end outside of buildbot for better scalability.r6r7}r8(h:Xx, with all the items json-encoded. It is useful to create a status front end outside of buildbot for better scalability.h;jubeubj)r9}r:(h:Uh;jhFhIhPjhR}r;(hT]hU]hV]hW]hX]Uentries]r<((UsingleX Status Targets; GerritStatusPushXstatus-GerritStatusPushr=j=tr>(UsingleXGerritStatusPush Status Targetj=j=tr?euh[Mgh\hhc]ubhM)r@}rA(h:Uh;jhFhIhPhQhR}rB(hT]hU]hV]hW]hX]hYj=uh[Mgh\hhc]ubeubh<)rC}rD(h:Uh;hDhFhIhK}hPhdhR}rE(hV]hW]hU]hT]rF(jtj=ehX]rGhauh[Mih\hh]}rHj=j@shc]rI(hk)rJ}rK(h:jyh;jChFhIhPhohR}rL(hT]hU]hV]hW]hX]hYjsuh[Mih\hhc]rMhrXGerritStatusPushrNrO}rP(h:jyh;jJubaubj)rQ}rR(h:Uh;jChFNhPjhR}rS(hT]hU]hV]hW]hX]Uentries]rT(jX?buildbot.status.status_gerrit.GerritStatusPush (built-in class)h*UtrUauh[Nh\hhc]ubj)rV}rW(h:Uh;jChFNhPjhR}rX(jjXpyhT]hU]hV]hW]hX]jXclassrYjjYuh[Nh\hhc]rZ(j)r[}r\(h:X.buildbot.status.status_gerrit.GerritStatusPushh;jVhFhIhPjhR}r](hT]r^h*ajNhU]hV]hW]hX]r_h*ajh*jXbuildbot.status.status_gerritjuh[Mlh\hhc]r`(j)ra}rb(h:Xclass h;j[hFhIhPjhR}rc(hV]hW]hU]hT]hX]uh[Mlh\hhc]rdhrXclass rerf}rg(h:Uh;jaubaubj)rh}ri(h:Xbuildbot.status.status_gerrit.h;j[hFhIhPjhR}rj(hV]hW]hU]hT]hX]uh[Mlh\hhc]rkhrXbuildbot.status.status_gerrit.rlrm}rn(h:Uh;jhubaubj)ro}rp(h:XGerritStatusPushh;j[hFhIhPjhR}rq(hV]hW]hU]hT]hX]uh[Mlh\hhc]rrhrXGerritStatusPushrsrt}ru(h:Uh;joubaubeubj)rv}rw(h:Uh;jVhFhIhPjhR}rx(hV]hW]hU]hT]hX]uh[Mlh\hhc]ubeubj)ry}rz(h:Xfrom buildbot.status.status_gerrit import GerritStatusPush from buildbot.status.builder import Results, SUCCESS, RETRY def gerritReviewCB(builderName, build, result, status, arg): if result == RETRY: return None, 0, 0 message = "Buildbot finished compiling your patchset\n" message += "on configuration: %s\n" % builderName message += "The result is: %s\n" % Results[result].upper() if arg: message += "\nFor more details visit:\n" message += status.getURLForThing(build) + "\n" # message, verified, reviewed return message, (result == SUCCESS or -1), 0 def gerritStartCB(builderName, build, arg): message = "Buildbot started compiling your patchset\n" message += "on configuration: %s\n" % builderName return message def gerritSummaryCB(buildInfoList, results, status, arg): success = False failure = False msgs = [] for buildInfo in buildInfoList: msg = "Builder %(name)s %(resultText)s (%(text)s)" % buildInfo link = buildInfo.get('url', None) if link: msg += " - " + link else: msg += "." msgs.append(msg) if buildInfo['result'] == SUCCESS: success = True else: failure = True msg = '\n\n'.join(msgs) if success and not failure: verified = 1 else: verified = -1 reviewed = 0 return (msg, verified, reviewed) c['buildbotURL'] = 'http://buildbot.example.com/' c['status'].append(GerritStatusPush('127.0.0.1', 'buildbot', reviewCB=gerritReviewCB, reviewArg=c['buildbotURL'], startCB=gerritStartCB, startArg=c['buildbotURL'], summaryCB=gerritSummaryCB, summaryArg=c['buildbotURL']))h;jChFhIhPjhR}r{(jjhT]hU]hV]hW]hX]uh[Moh\hhc]r|hrXfrom buildbot.status.status_gerrit import GerritStatusPush from buildbot.status.builder import Results, SUCCESS, RETRY def gerritReviewCB(builderName, build, result, status, arg): if result == RETRY: return None, 0, 0 message = "Buildbot finished compiling your patchset\n" message += "on configuration: %s\n" % builderName message += "The result is: %s\n" % Results[result].upper() if arg: message += "\nFor more details visit:\n" message += status.getURLForThing(build) + "\n" # message, verified, reviewed return message, (result == SUCCESS or -1), 0 def gerritStartCB(builderName, build, arg): message = "Buildbot started compiling your patchset\n" message += "on configuration: %s\n" % builderName return message def gerritSummaryCB(buildInfoList, results, status, arg): success = False failure = False msgs = [] for buildInfo in buildInfoList: msg = "Builder %(name)s %(resultText)s (%(text)s)" % buildInfo link = buildInfo.get('url', None) if link: msg += " - " + link else: msg += "." msgs.append(msg) if buildInfo['result'] == SUCCESS: success = True else: failure = True msg = '\n\n'.join(msgs) if success and not failure: verified = 1 else: verified = -1 reviewed = 0 return (msg, verified, reviewed) c['buildbotURL'] = 'http://buildbot.example.com/' c['status'].append(GerritStatusPush('127.0.0.1', 'buildbot', reviewCB=gerritReviewCB, reviewArg=c['buildbotURL'], startCB=gerritStartCB, startArg=c['buildbotURL'], summaryCB=gerritSummaryCB, summaryArg=c['buildbotURL']))r}r~}r(h:Uh;jyubaubh)r}r(h:XGerritStatusPush sends review of the :class:`Change` back to the Gerrit server, optionally also sending a message when a build is started. GerritStatusPush can send a separate review for each build that completes, or a single review summarizing the results for all of the builds. By default, a single summary review is sent; that is, a default summaryCB is provided, but no reviewCB or startCB.h;jChFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrX%GerritStatusPush sends review of the rr}r(h:X%GerritStatusPush sends review of the h;jubj)r}r(h:X:class:`Change`rh;jhFhIhPjhR}r(UreftypeXclassjjXChangeU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXChangerr}r(h:Uh;jubahPjubaubhrXV back to the Gerrit server, optionally also sending a message when a build is started. GerritStatusPush can send a separate review for each build that completes, or a single review summarizing the results for all of the builds. By default, a single summary review is sent; that is, a default summaryCB is provided, but no reviewCB or startCB.rr}r(h:XV back to the Gerrit server, optionally also sending a message when a build is started. GerritStatusPush can send a separate review for each build that completes, or a single review summarizing the results for all of the builds. By default, a single summary review is sent; that is, a default summaryCB is provided, but no reviewCB or startCB.h;jubeubh)r}r(h:X``reviewCB``, if specified, determines the message and score to give when sending a review for each separate build. It should return a tuple of (message, verified, reviewed).h;jChFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j)r}r(h:X ``reviewCB``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXreviewCBrr}r(h:Uh;jubahPjubhrX, if specified, determines the message and score to give when sending a review for each separate build. It should return a tuple of (message, verified, reviewed).rr}r(h:X, if specified, determines the message and score to give when sending a review for each separate build. It should return a tuple of (message, verified, reviewed).h;jubeubh)r}r(h:XIf ``startCB`` is specified, it should return a message. This message will be sent to the Gerrit server when each build is started.h;jChFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXIf rr}r(h:XIf h;jubj)r}r(h:X ``startCB``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXstartCBrr}r(h:Uh;jubahPjubhrXu is specified, it should return a message. This message will be sent to the Gerrit server when each build is started.rr}r(h:Xu is specified, it should return a message. This message will be sent to the Gerrit server when each build is started.h;jubeubh)r}r(h:X``summaryCB``, if specified, determines the message and score to give when sending a single review summarizing all of the builds. It should return a tuple of (message, verified, reviewed).h;jChFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j)r}r(h:X ``summaryCB``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX summaryCBrr}r(h:Uh;jubahPjubhrX, if specified, determines the message and score to give when sending a single review summarizing all of the builds. It should return a tuple of (message, verified, reviewed).rr}r(h:X, if specified, determines the message and score to give when sending a single review summarizing all of the builds. It should return a tuple of (message, verified, reviewed).h;jubeubj)r}r(h:Uh;jChFhIhPjhR}r(hT]hU]hV]hW]hX]Uentries]r((UsingleXStatus Targets; GitHubStatusXstatus-GitHubStatusrjtr(UsingleXGitHubStatus Status Targetjjtreuh[Mh\hhc]ubhM)r}r(h:Uh;jChFhIhPhQhR}r(hT]hU]hV]hW]hX]hYjuh[Mh\hhc]ubeubh<)r}r(h:Uh;hDhFhIhK}hPhdhR}r(hV]hW]hU]hT]r(jjehX]rh auh[Mh\hh]}rjjshc]r(hk)r}r(h:jh;jhFhIhPhohR}r(hT]hU]hV]hW]hX]hYjuh[Mh\hhc]rhrX GitHubStatusrr}r(h:jh;jubaubj)r}r(h:X@cindex GitHubStatush;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrX@cindex GitHubStatusrr}r(h:Uh;jubaubj)r}r(h:Uh;jhFNhPjhR}r(hT]hU]hV]hW]hX]Uentries]r(jX4buildbot.status.github.GitHubStatus (built-in class)h(Utrauh[Nh\hhc]ubj)r}r(h:Uh;jhFNhPjhR}r(jjXpyhT]hU]hV]hW]hX]jXclassrjjuh[Nh\hhc]r(j)r}r(h:X#buildbot.status.github.GitHubStatush;jhFhIhPjhR}r(hT]rh(ajNhU]hV]hW]hX]rh(ajh(jXbuildbot.status.githubjuh[Mh\hhc]r(j)r}r(h:Xclass h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXclass rr}r(h:Uh;jubaubj)r}r(h:Xbuildbot.status.github.h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrXbuildbot.status.github.rr}r(h:Uh;jubaubj)r}r(h:X GitHubStatush;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]rhrX GitHubStatusrr}r (h:Uh;jubaubeubj)r }r (h:Uh;jhFhIhPjhR}r (hV]hW]hU]hT]hX]uh[Mh\hhc]ubeubj)r }r(h:Xfrom buildbot.status.github import GitHubStatus repoOwner = Interpolate("%(prop:github_repo_owner)s") repoName = Interpolate("%(prop:github_repo_name)s") sha = Interpolate("%(src::revision)s") gs = GitHubStatus(token='githubAPIToken', repoOwner=repoOwner, repoName=repoName, sha=sha, startDescription='Build started.', endDescription='Build done.', ) buildbot_bbtools = BuilderConfig( name='builder-name', slavenames=['slave1'], factory=BuilderFactory(), properties={ "github_repo_owner": "buildbot", "github_repo_name": "bbtools", }, ) c['builders'].append(buildbot_bbtools) c['status'].append(gs)h;jhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rhrXfrom buildbot.status.github import GitHubStatus repoOwner = Interpolate("%(prop:github_repo_owner)s") repoName = Interpolate("%(prop:github_repo_name)s") sha = Interpolate("%(src::revision)s") gs = GitHubStatus(token='githubAPIToken', repoOwner=repoOwner, repoName=repoName, sha=sha, startDescription='Build started.', endDescription='Build done.', ) buildbot_bbtools = BuilderConfig( name='builder-name', slavenames=['slave1'], factory=BuilderFactory(), properties={ "github_repo_owner": "buildbot", "github_repo_name": "bbtools", }, ) c['builders'].append(buildbot_bbtools) c['status'].append(gs)rr}r(h:Uh;j ubaubh)r}r(h:Xz:class:`GitHubStatus` publishes a build status using `GitHub Status API `_.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j)r}r(h:X:class:`GitHubStatus`rh;jhFhIhPjhR}r(UreftypeXclassjjX GitHubStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r (hV]hW]r!(jjXpy-classr"ehU]hT]hX]uh;jhc]r#hrX GitHubStatusr$r%}r&(h:Uh;jubahPjubaubhrX publishes a build status using r'r(}r)(h:X publishes a build status using h;jubh)r*}r+(h:XD`GitHub Status API `_hR}r,(UnameXGitHub Status APIj'X-http://developer.github.com/v3/repos/statusesr-hT]hU]hV]hW]hX]uh;jhc]r.hrXGitHub Status APIr/r0}r1(h:Uh;j*ubahPhubhM)r2}r3(h:X0 h?Kh;jhPhQhR}r4(Urefurij-hT]r5Ugithub-status-apir6ahU]hV]hW]hX]r7h0auhc]ubhrX.r8}r9(h:X.h;jubeubh)r:}r;(h:XlIt requires `txgithub ` package to allow interaction with GitHub API.h;jhFhIhPhhR}r<(hV]hW]hU]hT]hX]uh[Mh\hhc]r=(hrX It requires r>r?}r@(h:X It requires h;j:ubj)rA}rB(h:X2`txgithub `hR}rC(hV]hW]hU]hT]hX]uh;j:hc]rDhrX0txgithub rErF}rG(h:Uh;jAubahPjubhrX. package to allow interaction with GitHub API.rHrI}rJ(h:X. package to allow interaction with GitHub API.h;j:ubeubh)rK}rL(h:XTIt is configured with at least a GitHub API token, repoOwner and repoName arguments.rMh;jhFhIhPhhR}rN(hV]hW]hU]hT]hX]uh[Mh\hhc]rOhrXTIt is configured with at least a GitHub API token, repoOwner and repoName arguments.rPrQ}rR(h:jMh;jKubaubh)rS}rT(h:XYou can create a token from you own `GitHub - Profile - Applications - Register new application `_ or use an external tool to generate one.h;jhFhIhPhhR}rU(hV]hW]hU]hT]hX]uh[Mh\hhc]rV(hrX$You can create a token from you own rWrX}rY(h:X$You can create a token from you own h;jSubh)rZ}r[(h:Xh`GitHub - Profile - Applications - Register new application `_hR}r\(UnameX:GitHub - Profile - Applications - Register new applicationj'X(https://github.com/settings/applicationsr]hT]hU]hV]hW]hX]uh;jShc]r^hrX:GitHub - Profile - Applications - Register new applicationr_r`}ra(h:Uh;jZubahPhubhM)rb}rc(h:X+ h?Kh;jShPhQhR}rd(Urefurij]hT]reU4github-profile-applications-register-new-applicationrfahU]hV]hW]hX]rgh!auhc]ubhrX) or use an external tool to generate one.rhri}rj(h:X) or use an external tool to generate one.h;jSubeubh)rk}rl(h:X2`repoOwner`, `repoName` are used to inform the plugin where to send status for build. This allow using a single :class:`GitHubStatus` for multiple projects. `repoOwner`, `repoName` can be passes as a static `string` (for single project) or :class:`Interpolate` for dynamic substitution in multiple project.h;jhFhIhPhhR}rm(hV]hW]hU]hT]hX]uh[Mh\hhc]rn(j)ro}rp(h:X `repoOwner`hR}rq(hV]hW]hU]hT]hX]uh;jkhc]rrhrX repoOwnerrsrt}ru(h:Uh;joubahPjubhrX, rvrw}rx(h:X, h;jkubj)ry}rz(h:X `repoName`hR}r{(hV]hW]hU]hT]hX]uh;jkhc]r|hrXrepoNamer}r~}r(h:Uh;jyubahPjubhrXY are used to inform the plugin where to send status for build. This allow using a single rr}r(h:XY are used to inform the plugin where to send status for build. This allow using a single h;jkubj)r}r(h:X:class:`GitHubStatus`rh;jkhFhIhPjhR}r(UreftypeXclassjjX GitHubStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX GitHubStatusrr}r(h:Uh;jubahPjubaubhrX for multiple projects. rr}r(h:X for multiple projects. h;jkubj)r}r(h:X `repoOwner`hR}r(hV]hW]hU]hT]hX]uh;jkhc]rhrX repoOwnerrr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jkubj)r}r(h:X `repoName`hR}r(hV]hW]hU]hT]hX]uh;jkhc]rhrXrepoNamerr}r(h:Uh;jubahPjubhrX can be passes as a static rr}r(h:X can be passes as a static h;jkubj)r}r(h:X`string`hR}r(hV]hW]hU]hT]hX]uh;jkhc]rhrXstringrr}r(h:Uh;jubahPjubhrX (for single project) or rr}r(h:X (for single project) or h;jkubj)r}r(h:X:class:`Interpolate`rh;jkhFhIhPjhR}r(UreftypeXclassjjX InterpolateU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX Interpolaterr}r(h:Uh;jubahPjubaubhrX. for dynamic substitution in multiple project.rr}r(h:X. for dynamic substitution in multiple project.h;jkubeubh)r}r(h:X`sha` argument is use to define the commit SHA for which to send the status. By default `sha` is defined as: `%(src::revision)s`.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j)r}r(h:X`sha`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXsharr}r(h:Uh;jubahPjubhrXS argument is use to define the commit SHA for which to send the status. By default rr}r(h:XS argument is use to define the commit SHA for which to send the status. By default h;jubj)r}r(h:X`sha`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXsharr}r(h:Uh;jubahPjubhrX is defined as: rr}r(h:X is defined as: h;jubj)r}r(h:X`%(src::revision)s`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX%(src::revision)srr}r(h:Uh;jubahPjubhrX.r}r(h:X.h;jubeubh)r}r(h:XIn case any of `repoOwner`, `repoName` or `sha` returns `None`, `False` or empty string, the plugin will skip sending the status.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXIn case any of rr}r(h:XIn case any of h;jubj)r}r(h:X `repoOwner`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX repoOwnerrr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X `repoName`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXrepoNamerr}r(h:Uh;jubahPjubhrX or rr}r(h:X or h;jubj)r}r(h:X`sha`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXsharr}r(h:Uh;jubahPjubhrX returns rr }r (h:X returns h;jubj)r }r (h:X`None`hR}r (hV]hW]hU]hT]hX]uh;jhc]rhrXNonerr}r(h:Uh;j ubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X`False`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXFalserr}r(h:Uh;jubahPjubhrX: or empty string, the plugin will skip sending the status.rr}r(h:X: or empty string, the plugin will skip sending the status.h;jubeubh)r}r (h:XYou can define custom start and end build messages using the `startDescription` and `endDescription` optional interpolation arguments.h;jhFhIhPhhR}r!(hV]hW]hU]hT]hX]uh[Mh\hhc]r"(hrX=You can define custom start and end build messages using the r#r$}r%(h:X=You can define custom start and end build messages using the h;jubj)r&}r'(h:X`startDescription`hR}r((hV]hW]hU]hT]hX]uh;jhc]r)hrXstartDescriptionr*r+}r,(h:Uh;j&ubahPjubhrX and r-r.}r/(h:X and h;jubj)r0}r1(h:X`endDescription`hR}r2(hV]hW]hU]hT]hX]uh;jhc]r3hrXendDescriptionr4r5}r6(h:Uh;j0ubahPjubhrX" optional interpolation arguments.r7r8}r9(h:X" optional interpolation arguments.h;jubeubcdocutils.nodes footnote r:)r;}r<(h:XOApparently this is the same way http://buildd.debian.org displays build status h;jhFhIhPUfootnoter=hR}r>(Uautor?KhT]r@Uid6rAahU]rBUid2rCahV]hW]hX]rDU1auh[Mh\hhc]rE(cdocutils.nodes label rF)rG}rH(h:Uh;j;hFNhPUlabelrIhR}rJ(hV]hW]hU]hT]hX]uh[Nh\hhc]rKhrX1rL}rM(h:Uh;jGubaubh)rN}rO(h:XNApparently this is the same way http://buildd.debian.org displays build statush;j;hFhIhPhhR}rP(hV]hW]hU]hT]hX]uh[Mhc]rQ(hrX Apparently this is the same way rRrS}rT(h:X Apparently this is the same way h;jNubh)rU}rV(h:Xhttp://buildd.debian.orgrWhR}rX(UrefurijWhT]hU]hV]hW]hX]uh;jNhc]rYhrXhttp://buildd.debian.orgrZr[}r\(h:Uh;jUubahPhubhrX displays build statusr]r^}r_(h:X displays build statush;jNubeubeubj:)r`}ra(h:XIt may even be possible to provide SSL access by using a specification like ``"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"``, but this is completely untested h;jhFhIhPj=hR}rb(j?KhT]rcUid7rdahU]reUid3rfahV]hW]hX]rgU2auh[Mh\hhc]rh(jF)ri}rj(h:Uh;j`hFNhPjIhR}rk(hV]hW]hU]hT]hX]uh[Nh\hhc]rlhrX2rm}rn(h:Uh;jiubaubh)ro}rp(h:XIt may even be possible to provide SSL access by using a specification like ``"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"``, but this is completely untestedh;j`hFhIhPhhR}rq(hV]hW]hU]hT]hX]uh[Mhc]rr(hrXLIt may even be possible to provide SSL access by using a specification like rsrt}ru(h:XLIt may even be possible to provide SSL access by using a specification like h;joubj)rv}rw(h:X5``"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"``hR}rx(hV]hW]hU]hT]hX]uh;johc]ryhrX1"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"rzr{}r|(h:Uh;jvubahPjubhrX!, but this is completely untestedr}r~}r(h:X!, but this is completely untestedh;joubeubeubhM)r}r(h:X0.. _PyOpenSSL: http://pyopenssl.sourceforge.net/h?Kh;jhFhIhPhQhR}r(j'jR hT]rU pyopensslrahU]hV]hW]hX]rhauh[Mh\hhc]ubeubeubhFhIhK}hPhdhR}r(hV]hW]hU]hT]r(hjehX]rhauh[K6h\hh]}rjjshc]r(hk)r}r(h:hh;hBhFhIhPhohR}r(hT]hU]hV]hW]hX]hYhuh[K6h\hhc]rhrX WebStatusrr}r(h:hh;jubaubj)r}r(h:Uh;hBhFNhPjhR}r(hT]hU]hV]hW]hX]Uentries]r(jX6buildbot.status.web.baseweb.WebStatus (built-in class)h Utrauh[Nh\hhc]ubj)r}r(h:Uh;hBhFNhPjhR}r(jjXpyhT]hU]hV]hW]hX]jXclassrjjuh[Nh\hhc]r(j)r}r(h:X%buildbot.status.web.baseweb.WebStatush;jhFhIhPjhR}r(hT]rh ajNhU]hV]hW]hX]rh ajh jXbuildbot.status.web.basewebjuh[K9h\hhc]r(j)r}r(h:Xclass h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[K9h\hhc]rhrXclass rr}r(h:Uh;jubaubj)r}r(h:Xbuildbot.status.web.baseweb.h;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[K9h\hhc]rhrXbuildbot.status.web.baseweb.rr}r(h:Uh;jubaubj)r}r(h:X WebStatush;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[K9h\hhc]rhrX WebStatusrr}r(h:Uh;jubaubeubj)r}r(h:Uh;jhFhIhPjhR}r(hV]hW]hU]hT]hX]uh[K9h\hhc]ubeubh)r}r(h:XThe :class:`buildbot.status.html.WebStatus` status target runs a small web server inside the buildmaster. You can point a browser at this web server and retrieve information about every build the buildbot knows about, as well as find out what the buildbot is currently working on.h;hBhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[K:h\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X':class:`buildbot.status.html.WebStatus`rh;jhFhIhPjhR}r(UreftypeXclassjjXbuildbot.status.html.WebStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[K:hc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrXbuildbot.status.html.WebStatusrr}r(h:Uh;jubahPjubaubhrX status target runs a small web server inside the buildmaster. You can point a browser at this web server and retrieve information about every build the buildbot knows about, as well as find out what the buildbot is currently working on.rr}r(h:X status target runs a small web server inside the buildmaster. You can point a browser at this web server and retrieve information about every build the buildbot knows about, as well as find out what the buildbot is currently working on.h;jubeubh)r}r(h:XThe first page you will see is the *Welcome Page*, which contains links to all the other useful pages. By default, this page is served from the :file:`status/web/templates/root.html` file in buildbot's library area.h;hBhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[K?h\hhc]r(hrX#The first page you will see is the rr}r(h:X#The first page you will see is the h;jubj<)r}r(h:X*Welcome Page*hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX Welcome Pagerr}r(h:Uh;jubahPjDubhrX_, which contains links to all the other useful pages. By default, this page is served from the rr}r(h:X_, which contains links to all the other useful pages. By default, this page is served from the h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrXstatus/web/templates/root.htmlrr}r(h:Xstatus/web/templates/root.htmlh;jubahPjubhrX! file in buildbot's library area.rr}r(h:X! file in buildbot's library area.h;jubeubh)r}r(h:XOne of the most complex resource provided by :class:`WebStatus` is the *Waterfall Display*, which shows a time-based chart of events. This somewhat-busy display provides detailed information about all steps of all recent builds, and provides hyperlinks to look at individual build logs and source changes. By simply reloading this page on a regular basis, you will see a complete description of everything the buildbot is currently working on.h;hBhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[KCh\hhc]r(hrX-One of the most complex resource provided by rr}r(h:X-One of the most complex resource provided by h;jubj)r}r(h:X:class:`WebStatus`rh;jhFhIhPjhR}r(UreftypeXclassjjX WebStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[KChc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX WebStatusrr}r(h:Uh;jubahPjubaubhrX is the rr}r(h:X is the h;jubj<)r }r (h:X*Waterfall Display*hR}r (hV]hW]hU]hT]hX]uh;jhc]r hrXWaterfall Displayr r}r(h:Uh;j ubahPjDubhrXa, which shows a time-based chart of events. This somewhat-busy display provides detailed information about all steps of all recent builds, and provides hyperlinks to look at individual build logs and source changes. By simply reloading this page on a regular basis, you will see a complete description of everything the buildbot is currently working on.rr}r(h:Xa, which shows a time-based chart of events. This somewhat-busy display provides detailed information about all steps of all recent builds, and provides hyperlinks to look at individual build logs and source changes. By simply reloading this page on a regular basis, you will see a complete description of everything the buildbot is currently working on.h;jubeubh)r}r(h:XA similar, but more developer-oriented display is the `Grid` display. This arranges builds by :class:`SourceStamp` (horizontal axis) and builder (vertical axis), and can provide quick information as to which revisions are passing or failing on which builders.h;hBhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[KJh\hhc]r(hrX6A similar, but more developer-oriented display is the rr}r(h:X6A similar, but more developer-oriented display is the h;jubj)r}r(h:X`Grid`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXGridrr}r (h:Uh;jubahPjubhrX# display. This arranges builds by r!r"}r#(h:X# display. This arranges builds by h;jubj)r$}r%(h:X:class:`SourceStamp`r&h;jhFhIhPjhR}r'(UreftypeXclassjjX SourceStampU refdomainXpyr(hT]hU]U refexplicithV]hW]hX]jjjNjNuh[KJhc]r)j)r*}r+(h:j&hR}r,(hV]hW]r-(jj(Xpy-classr.ehU]hT]hX]uh;j$hc]r/hrX SourceStampr0r1}r2(h:Uh;j*ubahPjubaubhrX (horizontal axis) and builder (vertical axis), and can provide quick information as to which revisions are passing or failing on which builders.r3r4}r5(h:X (horizontal axis) and builder (vertical axis), and can provide quick information as to which revisions are passing or failing on which builders.h;jubeubh)r6}r7(h:XThere are also pages with more specialized information. For example, there is a page which shows the last 20 builds performed by the buildbot, one line each. Each line is a link to detailed information about that build. By adding query arguments to the URL used to reach this page, you can narrow the display to builds that involved certain branches, or which ran on certain :class:`Builder`\s. These pages are described in great detail below.h;hBhFhIhPhhR}r8(hV]hW]hU]hT]hX]uh[KOh\hhc]r9(hrXwThere are also pages with more specialized information. For example, there is a page which shows the last 20 builds performed by the buildbot, one line each. Each line is a link to detailed information about that build. By adding query arguments to the URL used to reach this page, you can narrow the display to builds that involved certain branches, or which ran on certain r:r;}r<(h:XwThere are also pages with more specialized information. For example, there is a page which shows the last 20 builds performed by the buildbot, one line each. Each line is a link to detailed information about that build. By adding query arguments to the URL used to reach this page, you can narrow the display to builds that involved certain branches, or which ran on certain h;j6ubj)r=}r>(h:X:class:`Builder`r?h;j6hFhIhPjhR}r@(UreftypeXclassjjXBuilderU refdomainXpyrAhT]hU]U refexplicithV]hW]hX]jjjNjNuh[KOhc]rBj)rC}rD(h:j?hR}rE(hV]hW]rF(jjAXpy-classrGehU]hT]hX]uh;j=hc]rHhrXBuilderrIrJ}rK(h:Uh;jCubahPjubaubhrX3s. These pages are described in great detail below.rLrM}rN(h:X4\s. These pages are described in great detail below.h;j6ubeubh<)rO}rP(h:Uh;hBhFhIhPhdhR}rQ(hV]hW]hU]hT]rRhahX]rSh$auh[KXh\hhc]rT(hk)rU}rV(h:hh;jOhFhIhPhohR}rW(hT]hU]hV]hW]hX]hYhuh[KXh\hhc]rXhrX ConfigurationrYrZ}r[(h:hh;jUubaubh)r\}r](h:X6The simplest possible configuration for WebStatus is::r^h;jOhFhIhPhhR}r_(hV]hW]hU]hT]hX]uh[KZh\hhc]r`hrX5The simplest possible configuration for WebStatus is:rarb}rc(h:X5The simplest possible configuration for WebStatus is:h;j\ubaubj)rd}re(h:XNfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(8080))h;jOhFhIhPjhR}rf(jjhT]hU]hV]hW]hX]uh[K\h\hhc]rghrXNfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(8080))rhri}rj(h:Uh;jdubaubh)rk}rl(h:X9Buildbot uses a templating system for the web interface. The source of these templates can be found in the :file:`status/web/templates/` directory in buildbot's library area. You can override these templates by creating alternate versions in a :file:`templates/` directory within the buildmaster's base directory.h;jOhFhIhPhhR}rm(hV]hW]hU]hT]hX]uh[K_h\hhc]rn(hrXkBuildbot uses a templating system for the web interface. The source of these templates can be found in the rorp}rq(h:XkBuildbot uses a templating system for the web interface. The source of these templates can be found in the h;jkubj)rr}rs(h:UhR}rt(hT]hU]hV]hW]ruXfilervaUrolejvhX]uh;jkhc]rwhrXstatus/web/templates/rxry}rz(h:Xstatus/web/templates/h;jrubahPjubhrXl directory in buildbot's library area. You can override these templates by creating alternate versions in a r{r|}r}(h:Xl directory in buildbot's library area. You can override these templates by creating alternate versions in a h;jkubj)r~}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jkhc]rhrX templates/rr}r(h:X templates/h;j~ubahPjubhrX3 directory within the buildmaster's base directory.rr}r(h:X3 directory within the buildmaster's base directory.h;jkubeubh)r}r(h:XNIf that isn't enough you can also provide additional Jinja2 template loaders::rh;jOhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Keh\hhc]rhrXMIf that isn't enough you can also provide additional Jinja2 template loaders:rr}r(h:XMIf that isn't enough you can also provide additional Jinja2 template loaders:h;jubaubj)r}r(h:Ximport jinja2 myloaders = [ jinja2.FileSystemLoader("/tmp/mypath"), ] c['status'].append(html.WebStatus( # ... jinja_loaders = myloaders, ))h;jOhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Kgh\hhc]rhrXimport jinja2 myloaders = [ jinja2.FileSystemLoader("/tmp/mypath"), ] c['status'].append(html.WebStatus( # ... jinja_loaders = myloaders, ))rr}r(h:Uh;jubaubh)r}r(h:XThe first time a buildmaster is created, the :file:`public_html/` directory is populated with some sample files, which you will probably want to customize for your own project. These files are all static: the buildbot does not modify them in any way as it serves them to HTTP clients.h;jOhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kqh\hhc]r(hrX-The first time a buildmaster is created, the rr}r(h:X-The first time a buildmaster is created, the h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX public_html/rr}r(h:X public_html/h;jubahPjubhrX directory is populated with some sample files, which you will probably want to customize for your own project. These files are all static: the buildbot does not modify them in any way as it serves them to HTTP clients.rr}r(h:X directory is populated with some sample files, which you will probably want to customize for your own project. These files are all static: the buildbot does not modify them in any way as it serves them to HTTP clients.h;jubeubh)r}r(h:XZTemplates in :file:`templates/` take precedence over static files in :file:`public_html/`.h;jOhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kwh\hhc]r(hrX Templates in rr}r(h:X Templates in h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX templates/rr}r(h:X templates/h;jubahPjubhrX& take precedence over static files in rr}r(h:X& take precedence over static files in h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX public_html/rr}r(h:X public_html/h;jubahPjubhrX.r}r(h:X.h;jubeubh)r}r(h:XThe initial :file:`robots.txt` file has Disallow lines for all of the dynamically-generated buildbot pages, to discourage web spiders and search engines from consuming a lot of CPU time as they crawl through the entire history of your buildbot. If you are running the buildbot behind a reverse proxy, you'll probably need to put the :file:`robots.txt` file somewhere else (at the top level of the parent web server), and replace the URL prefixes in it with more suitable values.h;jOhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kzh\hhc]r(hrX The initial rr}r(h:X The initial h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX robots.txtrr}r(h:X robots.txth;jubahPjubhrX/ file has Disallow lines for all of the dynamically-generated buildbot pages, to discourage web spiders and search engines from consuming a lot of CPU time as they crawl through the entire history of your buildbot. If you are running the buildbot behind a reverse proxy, you'll probably need to put the rr}r(h:X/ file has Disallow lines for all of the dynamically-generated buildbot pages, to discourage web spiders and search engines from consuming a lot of CPU time as they crawl through the entire history of your buildbot. If you are running the buildbot behind a reverse proxy, you'll probably need to put the h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX robots.txtrr}r(h:X robots.txth;jubahPjubhrX file somewhere else (at the top level of the parent web server), and replace the URL prefixes in it with more suitable values.rr}r(h:X file somewhere else (at the top level of the parent web server), and replace the URL prefixes in it with more suitable values.h;jubeubh)r}r(h:X|If you would like to use an alternative root directory, add the ``public_html=`` option to the :class:`WebStatus` creation::h;jOhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kh\hhc]r(hrX@If you would like to use an alternative root directory, add the rr}r(h:X@If you would like to use an alternative root directory, add the h;jubj)r}r(h:X``public_html=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX public_html=rr}r(h:Uh;jubahPjubhrX option to the rr}r(h:X option to the h;jubj)r}r(h:X:class:`WebStatus`rh;jhFhIhPjhR}r(UreftypeXclassjjX WebStatusU refdomainXpyrhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Khc]rj)r}r(h:jhR}r(hV]hW]r(jjXpy-classrehU]hT]hX]uh;jhc]rhrX WebStatusrr}r(h:Uh;jubahPjubaubhrX creation:r r }r (h:X creation:h;jubeubj)r }r (h:XDc['status'].append(WebStatus(8080, public_html="/var/www/buildbot"))h;jOhFhIhPjhR}r(jjhT]hU]hV]hW]hX]uh[Kh\hhc]rhrXDc['status'].append(WebStatus(8080, public_html="/var/www/buildbot"))rr}r(h:Uh;j ubaubh)r}r(h:XIn addition, if you are familiar with twisted.web *Resource Trees*, you can write code to add additional pages at places inside this web space. Just use :meth:`webstatus.putChild` to place these resources.h;jOhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kh\hhc]r(hrX2In addition, if you are familiar with twisted.web rr}r(h:X2In addition, if you are familiar with twisted.web h;jubj<)r}r(h:X*Resource Trees*hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXResource Treesrr}r (h:Uh;jubahPjDubhrXW, you can write code to add additional pages at places inside this web space. Just use r!r"}r#(h:XW, you can write code to add additional pages at places inside this web space. Just use h;jubj)r$}r%(h:X:meth:`webstatus.putChild`r&h;jhFhIhPjhR}r'(UreftypeXmethjjXwebstatus.putChildU refdomainXpyr(hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Khc]r)j)r*}r+(h:j&hR}r,(hV]hW]r-(jj(Xpy-methr.ehU]hT]hX]uh;j$hc]r/hrXwebstatus.putChildr0r1}r2(h:Uh;j*ubahPjubaubhrX to place these resources.r3r4}r5(h:X to place these resources.h;jubeubh)r6}r7(h:XSThe following section describes the special URLs and the status views they provide.r8h;jOhFhIhPhhR}r9(hV]hW]hU]hT]hX]uh[Kh\hhc]r:hrXSThe following section describes the special URLs and the status views they provide.r;r<}r=(h:j8h;j6ubaubeubh<)r>}r?(h:Uh;hBhFhIhPhdhR}r@(hV]hW]hU]hT]rAhahX]rBh&auh[Kh\hhc]rC(hk)rD}rE(h:hh;j>hFhIhPhohR}rF(hT]hU]hV]hW]hX]hYhuh[Kh\hhc]rGhrXBuildbot Web ResourcesrHrI}rJ(h:hh;jDubaubh)rK}rL(h:XCertain URLs are `magic`, and the pages they serve are created by code in various classes in the :file:`buildbot.status.web` package instead of being read from disk. The most common way to access these pages is for the buildmaster admin to write or modify the :file:`index.html` page to contain links to them. Of course other project web pages can contain links to these buildbot pages as well.h;j>hFhIhPhhR}rM(hV]hW]hU]hT]hX]uh[Kh\hhc]rN(hrXCertain URLs are rOrP}rQ(h:XCertain URLs are h;jKubj)rR}rS(h:X`magic`hR}rT(hV]hW]hU]hT]hX]uh;jKhc]rUhrXmagicrVrW}rX(h:Uh;jRubahPjubhrXI, and the pages they serve are created by code in various classes in the rYrZ}r[(h:XI, and the pages they serve are created by code in various classes in the h;jKubj)r\}r](h:UhR}r^(hT]hU]hV]hW]r_Xfiler`aUrolej`hX]uh;jKhc]rahrXbuildbot.status.webrbrc}rd(h:Xbuildbot.status.webh;j\ubahPjubhrX package instead of being read from disk. The most common way to access these pages is for the buildmaster admin to write or modify the rerf}rg(h:X package instead of being read from disk. The most common way to access these pages is for the buildmaster admin to write or modify the h;jKubj)rh}ri(h:UhR}rj(hT]hU]hV]hW]rkXfilerlaUrolejlhX]uh;jKhc]rmhrX index.htmlrnro}rp(h:X index.htmlh;jhubahPjubhrXt page to contain links to them. Of course other project web pages can contain links to these buildbot pages as well.rqrr}rs(h:Xt page to contain links to them. Of course other project web pages can contain links to these buildbot pages as well.h;jKubeubh)rt}ru(h:X;Many pages can be modified by adding query arguments to the URL. For example, a page which shows the results of the most recent build normally does this for all builders at once. But by appending ``?builder=i386`` to the end of the URL, the page will show only the results for the `i386` builder. When used in this way, you can add multiple ``builder=`` arguments to see multiple builders. Remembering that URL query arguments are separated *from each other* with ampersands, a URL that ends in ``?builder=i386&builder=ppc`` would show builds for just those two Builders.h;j>hFhIhPhhR}rv(hV]hW]hU]hT]hX]uh[Kh\hhc]rw(hrXMany pages can be modified by adding query arguments to the URL. For example, a page which shows the results of the most recent build normally does this for all builders at once. But by appending rxry}rz(h:XMany pages can be modified by adding query arguments to the URL. For example, a page which shows the results of the most recent build normally does this for all builders at once. But by appending h;jtubj)r{}r|(h:X``?builder=i386``hR}r}(hV]hW]hU]hT]hX]uh;jthc]r~hrX ?builder=i386rr}r(h:Uh;j{ubahPjubhrXD to the end of the URL, the page will show only the results for the rr}r(h:XD to the end of the URL, the page will show only the results for the h;jtubj)r}r(h:X`i386`hR}r(hV]hW]hU]hT]hX]uh;jthc]rhrXi386rr}r(h:Uh;jubahPjubhrX6 builder. When used in this way, you can add multiple rr}r(h:X6 builder. When used in this way, you can add multiple h;jtubj)r}r(h:X ``builder=``hR}r(hV]hW]hU]hT]hX]uh;jthc]rhrXbuilder=rr}r(h:Uh;jubahPjubhrXX arguments to see multiple builders. Remembering that URL query arguments are separated rr}r(h:XX arguments to see multiple builders. Remembering that URL query arguments are separated h;jtubj<)r}r(h:X*from each other*hR}r(hV]hW]hU]hT]hX]uh;jthc]rhrXfrom each otherrr}r(h:Uh;jubahPjDubhrX% with ampersands, a URL that ends in rr}r(h:X% with ampersands, a URL that ends in h;jtubj)r}r(h:X``?builder=i386&builder=ppc``hR}r(hV]hW]hU]hT]hX]uh;jthc]rhrX?builder=i386&builder=ppcrr}r(h:Uh;jubahPjubhrX/ would show builds for just those two Builders.rr}r(h:X/ would show builds for just those two Builders.h;jtubeubh)r}r(h:X"The ``branch=`` query argument can be used on some pages. This filters the information displayed by that page down to only the builds or changes which involved the given branch. Use ``branch=trunk`` to reference the trunk: if you aren't intentionally using branches, you're probably using trunk. Multiple ``branch=`` arguments can be used to examine multiple branches at once (so appending ``?branch=foo&branch=bar`` to the URL will show builds involving either branch). No ``branch=`` arguments means to show builds and changes for all branches.h;j>hFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kh\hhc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X ``branch=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbranch=rr}r(h:Uh;jubahPjubhrX query argument can be used on some pages. This filters the information displayed by that page down to only the builds or changes which involved the given branch. Use rr}r(h:X query argument can be used on some pages. This filters the information displayed by that page down to only the builds or changes which involved the given branch. Use h;jubj)r}r(h:X``branch=trunk``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX branch=trunkrr}r(h:Uh;jubahPjubhrXk to reference the trunk: if you aren't intentionally using branches, you're probably using trunk. Multiple rr}r(h:Xk to reference the trunk: if you aren't intentionally using branches, you're probably using trunk. Multiple h;jubj)r}r(h:X ``branch=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbranch=rr}r(h:Uh;jubahPjubhrXJ arguments can be used to examine multiple branches at once (so appending rr}r(h:XJ arguments can be used to examine multiple branches at once (so appending h;jubj)r}r(h:X``?branch=foo&branch=bar``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX?branch=foo&branch=barrr}r(h:Uh;jubahPjubhrX: to the URL will show builds involving either branch). No rr}r(h:X: to the URL will show builds involving either branch). No h;jubj)r}r(h:X ``branch=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbranch=rr}r(h:Uh;jubahPjubhrX= arguments means to show builds and changes for all branches.rr}r(h:X= arguments means to show builds and changes for all branches.h;jubeubh)r}r(h:XSome pages may include the Builder name or the build number in the main part of the URL itself. For example, a page that describes Build #7 of the `i386` builder would live at :file:`/builders/i386/builds/7`.h;j>hFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kh\hhc]r(hrXSome pages may include the Builder name or the build number in the main part of the URL itself. For example, a page that describes Build #7 of the rr}r(h:XSome pages may include the Builder name or the build number in the main part of the URL itself. For example, a page that describes Build #7 of the h;jubj)r}r(h:X`i386`hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXi386rr}r(h:Uh;jubahPjubhrX builder would live at rr}r(h:X builder would live at h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX/builders/i386/builds/7rr}r(h:X/builders/i386/builds/7h;jubahPjubhrX.r}r(h:X.h;jubeubh)r}r(h:X]The table below lists all of the internal pages and the URLs that can be used to access them.rh;j>hFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Kh\hhc]rhrX]The table below lists all of the internal pages and the URLs that can be used to access them.rr}r (h:jh;jubaubj )r }r (h:Uh;j>hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[Nh\hhc]r (j )r}r(h:Xh``/waterfall`` This provides a chronologically-oriented display of the activity of all builders. It is the same display used by the Waterfall display. By adding one or more ``builder=`` query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more ``branch=`` query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more ``category=`` query arguments to the URL will limit the display to Builders that were defined with one of the given categories. A ``show_events=true`` query argument causes the display to include non-:class:`Build` events, like slaves attaching and detaching, as well as reconfiguration events. ``show_events=false`` hides these events. The default is to show them. By adding the ``failures_only=true`` query argument, the Waterfall is restricted to only showing information about the builders that are currently failing. A builder is considered failing if the last finished build was not successful, a step in the current build(s) is failing, or if the builder is offline. The ``last_time=``, ``first_time=``, and ``show_time=`` arguments will control what interval of time is displayed. The default is to show the latest events, but these can be used to look at earlier periods in history. The ``num_events=`` argument also provides a limit on the size of the displayed page. The Waterfall has references to resources many of the other portions of the URL space: :file:`/builders` for access to individual builds, :file:`/changes` for access to information about source code changes, etc. h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Khc]r(j )r}r(h:X``/waterfall``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Khc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX /waterfallrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r (hV]hW]hU]hT]hX]uh;jhc]r!(h)r"}r#(h:XThis provides a chronologically-oriented display of the activity of all builders. It is the same display used by the Waterfall display.r$h;jhFhIhPhhR}r%(hV]hW]hU]hT]hX]uh[Khc]r&hrXThis provides a chronologically-oriented display of the activity of all builders. It is the same display used by the Waterfall display.r'r(}r)(h:j$h;j"ubaubh)r*}r+(h:XBy adding one or more ``builder=`` query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more ``branch=`` query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more ``category=`` query arguments to the URL will limit the display to Builders that were defined with one of the given categories.h;jhFhIhPhhR}r,(hV]hW]hU]hT]hX]uh[Khc]r-(hrXBy adding one or more r.r/}r0(h:XBy adding one or more h;j*ubj)r1}r2(h:X ``builder=``hR}r3(hV]hW]hU]hT]hX]uh;j*hc]r4hrXbuilder=r5r6}r7(h:Uh;j1ubahPjubhrXz query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more r8r9}r:(h:Xz query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more h;j*ubj)r;}r<(h:X ``branch=``hR}r=(hV]hW]hU]hT]hX]uh;j*hc]r>hrXbranch=r?r@}rA(h:Uh;j;ubahPjubhrX} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more rBrC}rD(h:X} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more h;j*ubj)rE}rF(h:X ``category=``hR}rG(hV]hW]hU]hT]hX]uh;j*hc]rHhrX category=rIrJ}rK(h:Uh;jEubahPjubhrXr query arguments to the URL will limit the display to Builders that were defined with one of the given categories.rLrM}rN(h:Xr query arguments to the URL will limit the display to Builders that were defined with one of the given categories.h;j*ubeubh)rO}rP(h:XA ``show_events=true`` query argument causes the display to include non-:class:`Build` events, like slaves attaching and detaching, as well as reconfiguration events. ``show_events=false`` hides these events. The default is to show them.h;jhFhIhPhhR}rQ(hV]hW]hU]hT]hX]uh[Khc]rR(hrXA rSrT}rU(h:XA h;jOubj)rV}rW(h:X``show_events=true``hR}rX(hV]hW]hU]hT]hX]uh;jOhc]rYhrXshow_events=truerZr[}r\(h:Uh;jVubahPjubhrX2 query argument causes the display to include non-r]r^}r_(h:X2 query argument causes the display to include non-h;jOubj)r`}ra(h:X:class:`Build`rbh;jOhFhIhPjhR}rc(UreftypeXclassjjXBuildU refdomainXpyrdhT]hU]U refexplicithV]hW]hX]jjjNjNuh[Khc]rej)rf}rg(h:jbhR}rh(hV]hW]ri(jjdXpy-classrjehU]hT]hX]uh;j`hc]rkhrXBuildrlrm}rn(h:Uh;jfubahPjubaubhrXQ events, like slaves attaching and detaching, as well as reconfiguration events. rorp}rq(h:XQ events, like slaves attaching and detaching, as well as reconfiguration events. h;jOubj)rr}rs(h:X``show_events=false``hR}rt(hV]hW]hU]hT]hX]uh;jOhc]ruhrXshow_events=falservrw}rx(h:Uh;jrubahPjubhrX1 hides these events. The default is to show them.ryrz}r{(h:X1 hides these events. The default is to show them.h;jOubeubh)r|}r}(h:X3By adding the ``failures_only=true`` query argument, the Waterfall is restricted to only showing information about the builders that are currently failing. A builder is considered failing if the last finished build was not successful, a step in the current build(s) is failing, or if the builder is offline.h;jhFhIhPhhR}r~(hV]hW]hU]hT]hX]uh[Khc]r(hrXBy adding the rr}r(h:XBy adding the h;j|ubj)r}r(h:X``failures_only=true``hR}r(hV]hW]hU]hT]hX]uh;j|hc]rhrXfailures_only=truerr}r(h:Uh;jubahPjubhrX query argument, the Waterfall is restricted to only showing information about the builders that are currently failing. A builder is considered failing if the last finished build was not successful, a step in the current build(s) is failing, or if the builder is offline.rr}r(h:X query argument, the Waterfall is restricted to only showing information about the builders that are currently failing. A builder is considered failing if the last finished build was not successful, a step in the current build(s) is failing, or if the builder is offline.h;j|ubeubh)r}r(h:X0The ``last_time=``, ``first_time=``, and ``show_time=`` arguments will control what interval of time is displayed. The default is to show the latest events, but these can be used to look at earlier periods in history. The ``num_events=`` argument also provides a limit on the size of the displayed page.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]r(hrXThe rr}r(h:XThe h;jubj)r}r(h:X``last_time=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX last_time=rr}r(h:Uh;jubahPjubhrX, rr}r(h:X, h;jubj)r}r(h:X``first_time=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX first_time=rr}r(h:Uh;jubahPjubhrX, and rr}r(h:X, and h;jubj)r}r(h:X``show_time=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX show_time=rr}r(h:Uh;jubahPjubhrX arguments will control what interval of time is displayed. The default is to show the latest events, but these can be used to look at earlier periods in history. The rr}r(h:X arguments will control what interval of time is displayed. The default is to show the latest events, but these can be used to look at earlier periods in history. The h;jubj)r}r(h:X``num_events=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX num_events=rr}r(h:Uh;jubahPjubhrXB argument also provides a limit on the size of the displayed page.rr}r(h:XB argument also provides a limit on the size of the displayed page.h;jubeubh)r}r(h:XThe Waterfall has references to resources many of the other portions of the URL space: :file:`/builders` for access to individual builds, :file:`/changes` for access to information about source code changes, etc.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]r(hrXWThe Waterfall has references to resources many of the other portions of the URL space: rr}r(h:XWThe Waterfall has references to resources many of the other portions of the URL space: h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX /buildersrr}r(h:X /buildersh;jubahPjubhrX" for access to individual builds, rr}r(h:X" for access to individual builds, h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXfileraUrolejhX]uh;jhc]rhrX/changesrr}r(h:X/changesh;jubahPjubhrX: for access to information about source code changes, etc.rr}r(h:X: for access to information about source code changes, etc.h;jubeubehPj ubeubj )r}r(h:X``/grid`` This provides a chronologically oriented display of builders, by revision. The builders are listed down the left side of the page, and the revisions are listed across the top. By adding one or more ``category=`` arguments the grid will be restricted to revisions in those categories. A :samp:`width={N}` argument will limit the number of revisions shown to *N*, defaulting to 5. A :samp:`branch={BRANCHNAME}` argument will limit the grid to revisions on branch *BRANCHNAME*. h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Kh\hhc]r(j )r}r(h:X ``/grid``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Khc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX/gridrr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]r(h)r}r(h:XThis provides a chronologically oriented display of builders, by revision. The builders are listed down the left side of the page, and the revisions are listed across the top.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]rhrXThis provides a chronologically oriented display of builders, by revision. The builders are listed down the left side of the page, and the revisions are listed across the top.rr}r(h:jh;jubaubh)r}r(h:XkBy adding one or more ``category=`` arguments the grid will be restricted to revisions in those categories.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]r(hrXBy adding one or more rr}r(h:XBy adding one or more h;jubj)r}r(h:X ``category=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX category=rr}r(h:Uh;jubahPjubhrXH arguments the grid will be restricted to revisions in those categories.rr}r(h:XH arguments the grid will be restricted to revisions in those categories.h;jubeubh)r}r (h:X^A :samp:`width={N}` argument will limit the number of revisions shown to *N*, defaulting to 5.h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Khc]r (hrXA r r }r(h:XA h;jubj)r}r(h:UhR}r(hT]hU]hV]hW]rXsampraUrolejhX]uh;jhc]r(hrXwidth=rr}r(h:Xwidth=h;jubj<)r}r(h:XNhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXNr}r(h:Uh;jubahPjDubehPjubhrX6 argument will limit the number of revisions shown to rr}r (h:X6 argument will limit the number of revisions shown to h;jubj<)r!}r"(h:X*N*hR}r#(hV]hW]hU]hT]hX]uh;jhc]r$hrXNr%}r&(h:Uh;j!ubahPjDubhrX, defaulting to 5.r'r(}r)(h:X, defaulting to 5.h;jubeubh)r*}r+(h:X_A :samp:`branch={BRANCHNAME}` argument will limit the grid to revisions on branch *BRANCHNAME*.h;jhFhIhPhhR}r,(hV]hW]hU]hT]hX]uh[Khc]r-(hrXA r.r/}r0(h:XA h;j*ubj)r1}r2(h:UhR}r3(hT]hU]hV]hW]r4Xsampr5aUrolej5hX]uh;j*hc]r6(hrXbranch=r7r8}r9(h:Xbranch=h;j1ubj<)r:}r;(h:X BRANCHNAMEhR}r<(hV]hW]hU]hT]hX]uh;j1hc]r=hrX BRANCHNAMEr>r?}r@(h:Uh;j:ubahPjDubehPjubhrX5 argument will limit the grid to revisions on branch rArB}rC(h:X5 argument will limit the grid to revisions on branch h;j*ubj<)rD}rE(h:X *BRANCHNAME*hR}rF(hV]hW]hU]hT]hX]uh;j*hc]rGhrX BRANCHNAMErHrI}rJ(h:Uh;jDubahPjDubhrX.rK}rL(h:X.h;j*ubeubehPj ubeubj )rM}rN(h:X(``/tgrid`` The Transposed Grid is similar to the standard grid, but, as the name implies, transposes the grid: the revisions are listed down the left side of the page, and the build hosts are listed across the top. It accepts the same query arguments. The exception being that instead of ``width`` the argument is named ``length``. This page also has a ``rev_order=`` query argument that lets you change in what order revisions are shown. Valid values are ``asc`` (ascending, oldest revision first) and ``desc`` (descending, newest revision first). h;j hFhIhPj hR}rO(hV]hW]hU]hT]hX]uh[Kh\hhc]rP(j )rQ}rR(h:X ``/tgrid``rSh;jMhFhIhPj hR}rT(hV]hW]hU]hT]hX]uh[Khc]rUj)rV}rW(h:jShR}rX(hV]hW]hU]hT]hX]uh;jQhc]rYhrX/tgridrZr[}r\(h:Uh;jVubahPjubaubj )r]}r^(h:UhR}r_(hV]hW]hU]hT]hX]uh;jMhc]r`(h)ra}rb(h:XAThe Transposed Grid is similar to the standard grid, but, as the name implies, transposes the grid: the revisions are listed down the left side of the page, and the build hosts are listed across the top. It accepts the same query arguments. The exception being that instead of ``width`` the argument is named ``length``.h;j]hFhIhPhhR}rc(hV]hW]hU]hT]hX]uh[Khc]rd(hrXThe Transposed Grid is similar to the standard grid, but, as the name implies, transposes the grid: the revisions are listed down the left side of the page, and the build hosts are listed across the top. It accepts the same query arguments. The exception being that instead of rerf}rg(h:XThe Transposed Grid is similar to the standard grid, but, as the name implies, transposes the grid: the revisions are listed down the left side of the page, and the build hosts are listed across the top. It accepts the same query arguments. The exception being that instead of h;jaubj)rh}ri(h:X ``width``hR}rj(hV]hW]hU]hT]hX]uh;jahc]rkhrXwidthrlrm}rn(h:Uh;jhubahPjubhrX the argument is named rorp}rq(h:X the argument is named h;jaubj)rr}rs(h:X ``length``hR}rt(hV]hW]hU]hT]hX]uh;jahc]ruhrXlengthrvrw}rx(h:Uh;jrubahPjubhrX.ry}rz(h:X.h;jaubeubh)r{}r|(h:XThis page also has a ``rev_order=`` query argument that lets you change in what order revisions are shown. Valid values are ``asc`` (ascending, oldest revision first) and ``desc`` (descending, newest revision first).h;j]hFhIhPhhR}r}(hV]hW]hU]hT]hX]uh[Khc]r~(hrXThis page also has a rr}r(h:XThis page also has a h;j{ubj)r}r(h:X``rev_order=``hR}r(hV]hW]hU]hT]hX]uh;j{hc]rhrX rev_order=rr}r(h:Uh;jubahPjubhrXY query argument that lets you change in what order revisions are shown. Valid values are rr}r(h:XY query argument that lets you change in what order revisions are shown. Valid values are h;j{ubj)r}r(h:X``asc``hR}r(hV]hW]hU]hT]hX]uh;j{hc]rhrXascrr}r(h:Uh;jubahPjubhrX( (ascending, oldest revision first) and rr}r(h:X( (ascending, oldest revision first) and h;j{ubj)r}r(h:X``desc``hR}r(hV]hW]hU]hT]hX]uh;j{hc]rhrXdescrr}r(h:Uh;jubahPjubhrX% (descending, newest revision first).rr}r(h:X% (descending, newest revision first).h;j{ubeubehPj ubeubj )r}r(h:XQ ``/console`` EXPERIMENTAL: This provides a developer-oriented display of the last changes and how they affected the builders. It allows a developer to quickly see the status of each builder for the first build including his or her change. A green box means that the change succeeded for all the steps for a given builder. A red box means that the changed introduced a new regression on a builder. An orange box means that at least one of the tests failed, but it was also failing in the previous build, so it is not possible to see if there were any regressions from this change. Finally a yellow box means that the test is in progress. By adding one or more ``builder=`` query arguments, the Console view is restricted to only showing information about the given Builders. Adding a ``repository=`` argument will limit display to a given repository. By adding one or more ``branch=`` query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more ``category=`` query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the ``project=`` query argument, it's possible to restrict the view to changes from the given project. With the ``codebase=`` query argument, it's possible to restrict the view to changes for the given codebase. By adding one or more ``name=`` query arguments to the URL, the console view is restricted to only showing changes made by the given users. NOTE: To use this page, your :file:`buildbot.css` file in :file:`public_html` must be the one found in :bb:src:`master/buildbot/status/web/files/default.css`. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file. The console view is still in development. At this moment by default the view sorts revisions lexically, which can lead to odd behavior with non-integer revisions (e.g., Git), or with integer revisions of different length (e.g., 999 and 1000). It also has some issues with displaying multiple branches at the same time. If you do have multiple branches, you should use the ``branch=`` query argument. The ``order_console_by_time`` option may help sorting revisions, although it depends on the date being set correctly in each commit:: w = html.WebStatus(http_port=8080, order_console_by_time=True) h;j hFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mh\hhc]r(j )r}r(h:X ``/console``rh;jhFhIhPj hR}r(hV]hW]hU]hT]hX]uh[Mhc]rj)r}r(h:jhR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX/consolerr}r(h:Uh;jubahPjubaubj )r}r(h:UhR}r(hV]hW]hU]hT]hX]uh;jhc]r(h)r}r(h:XpEXPERIMENTAL: This provides a developer-oriented display of the last changes and how they affected the builders.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]rhrXpEXPERIMENTAL: This provides a developer-oriented display of the last changes and how they affected the builders.rr}r(h:jh;jubaubh)r}r(h:XIt allows a developer to quickly see the status of each builder for the first build including his or her change. A green box means that the change succeeded for all the steps for a given builder. A red box means that the changed introduced a new regression on a builder. An orange box means that at least one of the tests failed, but it was also failing in the previous build, so it is not possible to see if there were any regressions from this change. Finally a yellow box means that the test is in progress.rh;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]rhrXIt allows a developer to quickly see the status of each builder for the first build including his or her change. A green box means that the change succeeded for all the steps for a given builder. A red box means that the changed introduced a new regression on a builder. An orange box means that at least one of the tests failed, but it was also failing in the previous build, so it is not possible to see if there were any regressions from this change. Finally a yellow box means that the test is in progress.rr}r(h:jh;jubaubh)r}r(h:XBy adding one or more ``builder=`` query arguments, the Console view is restricted to only showing information about the given Builders. Adding a ``repository=`` argument will limit display to a given repository. By adding one or more ``branch=`` query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more ``category=`` query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the ``project=`` query argument, it's possible to restrict the view to changes from the given project. With the ``codebase=`` query argument, it's possible to restrict the view to changes for the given codebase.h;jhFhIhPhhR}r(hV]hW]hU]hT]hX]uh[Khc]r(hrXBy adding one or more rr}r(h:XBy adding one or more h;jubj)r}r(h:X ``builder=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbuilder=rr}r(h:Uh;jubahPjubhrXp query arguments, the Console view is restricted to only showing information about the given Builders. Adding a rr}r(h:Xp query arguments, the Console view is restricted to only showing information about the given Builders. Adding a h;jubj)r}r(h:X``repository=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX repository=rr}r(h:Uh;jubahPjubhrXJ argument will limit display to a given repository. By adding one or more rr}r(h:XJ argument will limit display to a given repository. By adding one or more h;jubj)r}r(h:X ``branch=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXbranch=rr}r(h:Uh;jubahPjubhrX} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more rr}r(h:X} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more h;jubj)r}r(h:X ``category=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrX category=rr}r(h:Uh;jubahPjubhrX} query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the rr}r(h:X} query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the h;jubj)r}r(h:X ``project=``hR}r(hV]hW]hU]hT]hX]uh;jhc]rhrXproject=rr}r(h:Uh;jubahPjubhrXa query argument, it's possible to restrict the view to changes from the given project. With the rr}r(h:Xa query argument, it's possible to restrict the view to changes from the given project. With the h;jubj)r}r(h:X ``codebase=``hR}r(hV]hW]hU]hT]hX]uh;jhc]r hrX codebase=r r }r (h:Uh;jubahPjubhrXV query argument, it's possible to restrict the view to changes for the given codebase.r r }r (h:XV query argument, it's possible to restrict the view to changes for the given codebase.h;jubeubh)r }r (h:XBy adding one or more ``name=`` query arguments to the URL, the console view is restricted to only showing changes made by the given users.h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M hc]r (hrXBy adding one or more r r }r (h:XBy adding one or more h;j ubj)r }r (h:X ``name=``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXname=r r }r (h:Uh;j ubahPjubhrXl query arguments to the URL, the console view is restricted to only showing changes made by the given users.r r }r (h:Xl query arguments to the URL, the console view is restricted to only showing changes made by the given users.h;j ubeubh)r }r (h:XNOTE: To use this page, your :file:`buildbot.css` file in :file:`public_html` must be the one found in :bb:src:`master/buildbot/status/web/files/default.css`. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file.h;jhFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M hc]r (hrXNOTE: To use this page, your r r }r (h:XNOTE: To use this page, your h;j ubj)r }r (h:UhR}r! (hT]hU]hV]hW]r" Xfiler# aUrolej# hX]uh;j hc]r$ hrX buildbot.cssr% r& }r' (h:X buildbot.cssh;j ubahPjubhrX file in r( r) }r* (h:X file in h;j ubj)r+ }r, (h:UhR}r- (hT]hU]hV]hW]r. Xfiler/ aUrolej/ hX]uh;j hc]r0 hrX public_htmlr1 r2 }r3 (h:X public_htmlh;j+ ubahPjubhrX must be the one found in r4 r5 }r6 (h:X must be the one found in h;j ubh)r7 }r8 (h:UhR}r9 (j%X,master/buildbot/status/web/files/default.cssr: j'X]https://github.com/buildbot/buildbot/blob/master/master/buildbot/status/web/files/default.csshT]hU]hV]hW]hX]uh;j hc]r; j)r< }r= (h:j: hR}r> (hV]hW]hU]hT]hX]uh;j7 hc]r? hrX,master/buildbot/status/web/files/default.cssr@ rA }rB (h:Uh;j< ubahPjubahPhubhrX|. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file.rC rD }rE (h:X|. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file.h;j ubeubh)rF }rG (h:XThe console view is still in development. At this moment by default the view sorts revisions lexically, which can lead to odd behavior with non-integer revisions (e.g., Git), or with integer revisions of different length (e.g., 999 and 1000). It also has some issues with displaying multiple branches at the same time. If you do have multiple branches, you should use the ``branch=`` query argument. The ``order_console_by_time`` option may help sorting revisions, although it depends on the date being set correctly in each commit::h;jhFhIhPhhR}rH (hV]hW]hU]hT]hX]uh[Mhc]rI (hrXtThe console view is still in development. At this moment by default the view sorts revisions lexically, which can lead to odd behavior with non-integer revisions (e.g., Git), or with integer revisions of different length (e.g., 999 and 1000). It also has some issues with displaying multiple branches at the same time. If you do have multiple branches, you should use the rJ rK }rL (h:XtThe console view is still in development. At this moment by default the view sorts revisions lexically, which can lead to odd behavior with non-integer revisions (e.g., Git), or with integer revisions of different length (e.g., 999 and 1000). It also has some issues with displaying multiple branches at the same time. If you do have multiple branches, you should use the h;jF ubj)rM }rN (h:X ``branch=``hR}rO (hV]hW]hU]hT]hX]uh;jF hc]rP hrXbranch=rQ rR }rS (h:Uh;jM ubahPjubhrX query argument. The rT rU }rV (h:X query argument. The h;jF ubj)rW }rX (h:X``order_console_by_time``hR}rY (hV]hW]hU]hT]hX]uh;jF hc]rZ hrXorder_console_by_timer[ r\ }r] (h:Uh;jW ubahPjubhrXg option may help sorting revisions, although it depends on the date being set correctly in each commit:r^ r_ }r` (h:Xg option may help sorting revisions, although it depends on the date being set correctly in each commit:h;jF ubeubj)ra }rb (h:X>w = html.WebStatus(http_port=8080, order_console_by_time=True)h;jhPjhR}rc (jjhT]hU]hV]hW]hX]uh[Mhc]rd hrX>w = html.WebStatus(http_port=8080, order_console_by_time=True)re rf }rg (h:Uh;ja ubaubehPj ubeubj )rh }ri (h:X``/rss`` This provides a rss feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output. h;j hFhIhPj hR}rj (hV]hW]hU]hT]hX]uh[M!h\hhc]rk (j )rl }rm (h:X``/rss``rn h;jh hFhIhPj hR}ro (hV]hW]hU]hT]hX]uh[M!hc]rp j)rq }rr (h:jn hR}rs (hV]hW]hU]hT]hX]uh;jl hc]rt hrX/rssru rv }rw (h:Uh;jq ubahPjubaubj )rx }ry (h:UhR}rz (hV]hW]hU]hT]hX]uh;jh hc]r{ h)r| }r} (h:XThis provides a rss feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.r~ h;jx hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[Mhc]r hrXThis provides a rss feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.r r }r (h:j~ h;j| ubaubahPj ubeubj )r }r (h:X``/atom`` This provides an atom feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M&h\hhc]r (j )r }r (h:X ``/atom``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M&hc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX/atomr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:XThis provides an atom feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M$hc]r hrXThis provides an atom feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.r r }r (h:j h;j ubaubahPj ubeubj )r }r (h:X``/json`` This view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See ``/json/help`` for detailed interactive documentation of the output formats for this view. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M,h\hhc]r (j )r }r (h:X ``/json``r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M,hc]r j)r }r (h:j hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX/jsonr r }r (h:Uh;j ubahPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:XThis view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See ``/json/help`` for detailed interactive documentation of the output formats for this view.h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M)hc]r (hrXThis view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See r r }r (h:XThis view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See h;j ubj)r }r (h:X``/json/help``hR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX /json/helpr r }r (h:Uh;j ubahPjubhrXL for detailed interactive documentation of the output formats for this view.r r }r (h:XL for detailed interactive documentation of the output formats for this view.h;j ubeubahPj ubeubj )r }r (h:X:samp:`/buildstatus?builder=${BUILDERNAME}&number=${BUILDNUM}` This displays a waterfall-like chronologically-oriented view of all the steps for a given build number on a given builder. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M0h\hhc]r (j )r }r (h:X>:samp:`/buildstatus?builder=${BUILDERNAME}&number=${BUILDNUM}`r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M0hc]r j)r }r (h:UhR}r (hT]hU]hV]hW]r Xsampr aUrolej hX]uh;j hc]r (hrX/buildstatus?builder=$r r }r (h:X/buildstatus?builder=$h;j ubj<)r }r (h:X BUILDERNAMEhR}r (hV]hW]hU]hT]hX]uh;j hc]r hrX BUILDERNAMEr r }r (h:Uh;j ubahPjDubhrX &number=$r r }r (h:X &number=$h;j ubj<)r }r (h:XBUILDNUMhR}r (hV]hW]hU]hT]hX]uh;j hc]r hrXBUILDNUMr r }r (h:Uh;j ubahPjDubehPjubaubj )r }r (h:UhR}r (hV]hW]hU]hT]hX]uh;j hc]r h)r }r (h:XzThis displays a waterfall-like chronologically-oriented view of all the steps for a given build number on a given builder.r h;j hFhIhPhhR}r (hV]hW]hU]hT]hX]uh[M/hc]r hrXzThis displays a waterfall-like chronologically-oriented view of all the steps for a given build number on a given builder.r r }r (h:j h;j ubaubahPj ubeubj )r }r (h:X:samp:`/builders/${BUILDERNAME}` This describes the given :class:`Builder` and provides buttons to force a build. A ``numbuilds=`` argument will control how many build lines are displayed (5 by default). This page also accepts property filters of the form ``property.${PROPERTYNAME}=${PROPERTVALUE}``. When used, only builds and build requests which have properties with matching string representations will be shown. h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M8h\hhc]r (j )r }r (h:X :samp:`/builders/${BUILDERNAME}`r h;j hFhIhPj hR}r (hV]hW]hU]hT]hX]uh[M8hc]r j)r }r (h:UhR}r (hT]hU]hV]hW]r!Xsampr!aUrolej!hX]uh;j hc]r!(hrX /builders/$r!r!}r!(h:X /builders/$h;j ubj<)r!}r!(h:X BUILDERNAMEhR}r!(hV]hW]hU]hT]hX]uh;j hc]r !hrX BUILDERNAMEr !r !}r !(h:Uh;j!ubahPjDubehPjubaubj )r !}r!(h:UhR}r!(hV]hW]hU]hT]hX]uh;j hc]r!h)r!}r!(h:XThis describes the given :class:`Builder` and provides buttons to force a build. A ``numbuilds=`` argument will control how many build lines are displayed (5 by default). This page also accepts property filters of the form ``property.${PROPERTYNAME}=${PROPERTVALUE}``. When used, only builds and build requests which have properties with matching string representations will be shown.h;j !hFhIhPhhR}r!(hV]hW]hU]hT]hX]uh[M3hc]r!(hrXThis describes the given r!r!}r!(h:XThis describes the given h;j!ubj)r!}r!(h:X:class:`Builder`r!h;j!hFhIhPjhR}r!(UreftypeXclassjjXBuilderU refdomainXpyr!hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M3hc]r!j)r!}r!(h:j!hR}r !(hV]hW]r!!(jj!Xpy-classr"!ehU]hT]hX]uh;j!hc]r#!hrXBuilderr$!r%!}r&!(h:Uh;j!ubahPjubaubhrX+ and provides buttons to force a build. A r'!r(!}r)!(h:X+ and provides buttons to force a build. A h;j!ubj)r*!}r+!(h:X``numbuilds=``hR}r,!(hV]hW]hU]hT]hX]uh;j!hc]r-!hrX numbuilds=r.!r/!}r0!(h:Uh;j*!ubahPjubhrX argument will control how many build lines are displayed (5 by default). This page also accepts property filters of the form r1!r2!}r3!(h:X argument will control how many build lines are displayed (5 by default). This page also accepts property filters of the form h;j!ubj)r4!}r5!(h:X,``property.${PROPERTYNAME}=${PROPERTVALUE}``hR}r6!(hV]hW]hU]hT]hX]uh;j!hc]r7!hrX(property.${PROPERTYNAME}=${PROPERTVALUE}r8!r9!}r:!(h:Uh;j4!ubahPjubhrXv. When used, only builds and build requests which have properties with matching string representations will be shown.r;!r!}r?!(h:XU:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}` This describes a specific Build. h;j hFhIhPj hR}r@!(hV]hW]hU]hT]hX]uh[M;h\hhc]rA!(j )rB!}rC!(h:X3:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}`rD!h;j>!hFhIhPj hR}rE!(hV]hW]hU]hT]hX]uh[M;hc]rF!j)rG!}rH!(h:UhR}rI!(hT]hU]hV]hW]rJ!XsamprK!aUrolejK!hX]uh;jB!hc]rL!(hrX /builders/$rM!rN!}rO!(h:X /builders/$h;jG!ubj<)rP!}rQ!(h:X BUILDERNAMEhR}rR!(hV]hW]hU]hT]hX]uh;jG!hc]rS!hrX BUILDERNAMErT!rU!}rV!(h:Uh;jP!ubahPjDubhrX /builds/$rW!rX!}rY!(h:X /builds/$h;jG!ubj<)rZ!}r[!(h:XBUILDNUMhR}r\!(hV]hW]hU]hT]hX]uh;jG!hc]r]!hrXBUILDNUMr^!r_!}r`!(h:Uh;jZ!ubahPjDubehPjubaubj )ra!}rb!(h:UhR}rc!(hV]hW]hU]hT]hX]uh;j>!hc]rd!h)re!}rf!(h:X This describes a specific Build.rg!h;ja!hFhIhPhhR}rh!(hV]hW]hU]hT]hX]uh[M;hc]ri!hrX This describes a specific Build.rj!rk!}rl!(h:jg!h;je!ubaubahPj ubeubj )rm!}rn!(h:Xk:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}` This describes a specific BuildStep. h;j hFhIhPj hR}ro!(hV]hW]hU]hT]hX]uh[M>h\hhc]rp!(j )rq!}rr!(h:XE:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}`rs!h;jm!hFhIhPj hR}rt!(hV]hW]hU]hT]hX]uh[M>hc]ru!j)rv!}rw!(h:UhR}rx!(hT]hU]hV]hW]ry!Xsamprz!aUrolejz!hX]uh;jq!hc]r{!(hrX /builders/$r|!r}!}r~!(h:X /builders/$h;jv!ubj<)r!}r!(h:X BUILDERNAMEhR}r!(hV]hW]hU]hT]hX]uh;jv!hc]r!hrX BUILDERNAMEr!r!}r!(h:Uh;j!ubahPjDubhrX /builds/$r!r!}r!(h:X /builds/$h;jv!ubj<)r!}r!(h:XBUILDNUMhR}r!(hV]hW]hU]hT]hX]uh;jv!hc]r!hrXBUILDNUMr!r!}r!(h:Uh;j!ubahPjDubhrX/steps/$r!r!}r!(h:X/steps/$h;jv!ubj<)r!}r!(h:XSTEPNAMEhR}r!(hV]hW]hU]hT]hX]uh;jv!hc]r!hrXSTEPNAMEr!r!}r!(h:Uh;j!ubahPjDubehPjubaubj )r!}r!(h:UhR}r!(hV]hW]hU]hT]hX]uh;jm!hc]r!h)r!}r!(h:X$This describes a specific BuildStep.r!h;j!hFhIhPhhR}r!(hV]hW]hU]hT]hX]uh[M>hc]r!hrX$This describes a specific BuildStep.r!r!}r!(h:j!h;j!ubaubahPj ubeubj )r!}r!(h:X:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}` This provides an HTML representation of a specific logfile. h;j hFhIhPj hR}r!(hV]hW]hU]hT]hX]uh[MAh\hhc]r!(j )r!}r!(h:XU:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}`r!h;j!hFhIhPj hR}r!(hV]hW]hU]hT]hX]uh[MAhc]r!j)r!}r!(h:UhR}r!(hT]hU]hV]hW]r!Xsampr!aUrolej!hX]uh;j!hc]r!(hrX /builders/$r!r!}r!(h:X /builders/$h;j!ubj<)r!}r!(h:X BUILDERNAMEhR}r!(hV]hW]hU]hT]hX]uh;j!hc]r!hrX BUILDERNAMEr!r!}r!(h:Uh;j!ubahPjDubhrX /builds/$r!r!}r!(h:X /builds/$h;j!ubj<)r!}r!(h:XBUILDNUMhR}r!(hV]hW]hU]hT]hX]uh;j!hc]r!hrXBUILDNUMr!r!}r!(h:Uh;j!ubahPjDubhrX/steps/$r!r!}r!(h:X/steps/$h;j!ubj<)r!}r!(h:XSTEPNAMEhR}r!(hV]hW]hU]hT]hX]uh;j!hc]r!hrXSTEPNAMEr!r!}r!(h:Uh;j!ubahPjDubhrX/logs/$r!r!}r!(h:X/logs/$h;j!ubj<)r!}r!(h:XLOGNAMEhR}r!(hV]hW]hU]hT]hX]uh;j!hc]r!hrXLOGNAMEr!r!}r!(h:Uh;j!ubahPjDubehPjubaubj )r!}r!(h:UhR}r!(hV]hW]hU]hT]hX]uh;j!hc]r!h)r!}r!(h:X;This provides an HTML representation of a specific logfile.r!h;j!hFhIhPhhR}r!(hV]hW]hU]hT]hX]uh[MAhc]r!hrX;This provides an HTML representation of a specific logfile.r!r!}r!(h:j!h;j!ubaubahPj ubeubj )r!}r!(h:X:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}/text` This returns the logfile as plain text, without any HTML coloring markup. It also removes the `headers`, which are the lines that describe what command was run and what the environment variable settings were like. This maybe be useful for saving to disk and feeding to tools like :command:`grep`. h;j hFhIhPj hR}r!(hV]hW]hU]hT]hX]uh[MHh\hhc]r!(j )r!}r!(h:XZ:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}/text`r!h;j!hFhIhPj hR}r!(hV]hW]hU]hT]hX]uh[MHhc]r!j)r!}r!(h:UhR}r!(hT]hU]hV]hW]r!Xsampr!aUrolej!hX]uh;j!hc]r!(hrX /builders/$r!r!}r!(h:X /builders/$h;j!ubj<)r!}r!(h:X BUILDERNAMEhR}r!(hV]hW]hU]hT]hX]uh;j!hc]r!hrX BUILDERNAMEr!r"}r"(h:Uh;j!ubahPjDubhrX /builds/$r"r"}r"(h:X /builds/$h;j!ubj<)r"}r"(h:XBUILDNUMhR}r"(hV]hW]hU]hT]hX]uh;j!hc]r"hrXBUILDNUMr "r "}r "(h:Uh;j"ubahPjDubhrX/steps/$r "r "}r"(h:X/steps/$h;j!ubj<)r"}r"(h:XSTEPNAMEhR}r"(hV]hW]hU]hT]hX]uh;j!hc]r"hrXSTEPNAMEr"r"}r"(h:Uh;j"ubahPjDubhrX/logs/$r"r"}r"(h:X/logs/$h;j!ubj<)r"}r"(h:XLOGNAMEhR}r"(hV]hW]hU]hT]hX]uh;j!hc]r"hrXLOGNAMEr"r"}r"(h:Uh;j"ubahPjDubhrX/textr "r!"}r""(h:X/texth;j!ubehPjubaubj )r#"}r$"(h:UhR}r%"(hV]hW]hU]hT]hX]uh;j!hc]r&"h)r'"}r("(h:X(This returns the logfile as plain text, without any HTML coloring markup. It also removes the `headers`, which are the lines that describe what command was run and what the environment variable settings were like. This maybe be useful for saving to disk and feeding to tools like :command:`grep`.h;j#"hFhIhPhhR}r)"(hV]hW]hU]hT]hX]uh[MDhc]r*"(hrX^This returns the logfile as plain text, without any HTML coloring markup. It also removes the r+"r,"}r-"(h:X^This returns the logfile as plain text, without any HTML coloring markup. It also removes the h;j'"ubj)r."}r/"(h:X `headers`hR}r0"(hV]hW]hU]hT]hX]uh;j'"hc]r1"hrXheadersr2"r3"}r4"(h:Uh;j."ubahPjubhrX, which are the lines that describe what command was run and what the environment variable settings were like. This maybe be useful for saving to disk and feeding to tools like r5"r6"}r7"(h:X, which are the lines that describe what command was run and what the environment variable settings were like. This maybe be useful for saving to disk and feeding to tools like h;j'"ubj)r8"}r9"(h:X:command:`grep`hR}r:"(hV]hW]r;"jahU]hT]hX]uh;j'"hc]r<"hrXgrepr="r>"}r?"(h:Uh;j8"ubahPjubhrX.r@"}rA"(h:X.h;j'"ubeubahPj ubeubj )rB"}rC"(h:Xp``/changes`` This provides a brief description of the :class:`ChangeSource` in use (see :ref:`Change-Sources`). h;j hFhIhPj hR}rD"(hV]hW]hU]hT]hX]uh[MLh\hhc]rE"(j )rF"}rG"(h:X ``/changes``rH"h;jB"hFhIhPj hR}rI"(hV]hW]hU]hT]hX]uh[MLhc]rJ"j)rK"}rL"(h:jH"hR}rM"(hV]hW]hU]hT]hX]uh;jF"hc]rN"hrX/changesrO"rP"}rQ"(h:Uh;jK"ubahPjubaubj )rR"}rS"(h:UhR}rT"(hV]hW]hU]hT]hX]uh;jB"hc]rU"h)rV"}rW"(h:XbThis provides a brief description of the :class:`ChangeSource` in use (see :ref:`Change-Sources`).h;jR"hFhIhPhhR}rX"(hV]hW]hU]hT]hX]uh[MKhc]rY"(hrX)This provides a brief description of the rZ"r["}r\"(h:X)This provides a brief description of the h;jV"ubj)r]"}r^"(h:X:class:`ChangeSource`r_"h;jV"hFhIhPjhR}r`"(UreftypeXclassjjX ChangeSourceU refdomainXpyra"hT]hU]U refexplicithV]hW]hX]jjjNjNuh[MKhc]rb"j)rc"}rd"(h:j_"hR}re"(hV]hW]rf"(jja"Xpy-classrg"ehU]hT]hX]uh;j]"hc]rh"hrX ChangeSourceri"rj"}rk"(h:Uh;jc"ubahPjubaubhrX in use (see rl"rm"}rn"(h:X in use (see h;jV"ubj)ro"}rp"(h:X:ref:`Change-Sources`rq"h;jV"hFhIhPjhR}rr"(UreftypeXrefjjXchange-sourcesU refdomainXstdrs"hT]hU]U refexplicithV]hW]hX]jjuh[MKhc]rt"j<)ru"}rv"(h:jq"hR}rw"(hV]hW]rx"(jjs"Xstd-refry"ehU]hT]hX]uh;jo"hc]rz"hrXChange-Sourcesr{"r|"}r}"(h:Uh;ju"ubahPjDubaubhrX).r~"r"}r"(h:X).h;jV"ubeubahPj ubeubj )r"}r"(h:X:samp:`/changes/{NN}` This shows detailed information about the numbered :class:`Change`: who was the author, what files were changed, what revision number was represented, etc. h;j hFhIhPj hR}r"(hV]hW]hU]hT]hX]uh[MQh\hhc]r"(j )r"}r"(h:X:samp:`/changes/{NN}`r"h;j"hFhIhPj hR}r"(hV]hW]hU]hT]hX]uh[MQhc]r"j)r"}r"(h:UhR}r"(hT]hU]hV]hW]r"Xsampr"aUrolej"hX]uh;j"hc]r"(hrX /changes/r"r"}r"(h:X /changes/h;j"ubj<)r"}r"(h:XNNhR}r"(hV]hW]hU]hT]hX]uh;j"hc]r"hrXNNr"r"}r"(h:Uh;j"ubahPjDubehPjubaubj )r"}r"(h:UhR}r"(hV]hW]hU]hT]hX]uh;j"hc]r"h)r"}r"(h:XThis shows detailed information about the numbered :class:`Change`: who was the author, what files were changed, what revision number was represented, etc.h;j"hFhIhPhhR}r"(hV]hW]hU]hT]hX]uh[MOhc]r"(hrX3This shows detailed information about the numbered r"r"}r"(h:X3This shows detailed information about the numbered h;j"ubj)r"}r"(h:X:class:`Change`r"h;j"hFhIhPjhR}r"(UreftypeXclassjjXChangeU refdomainXpyr"hT]hU]U refexplicithV]hW]hX]jjjNjNuh[MOhc]r"j)r"}r"(h:j"hR}r"(hV]hW]r"(jj"Xpy-classr"ehU]hT]hX]uh;j"hc]r"hrXChanger"r"}r"(h:Uh;j"ubahPjubaubhrXY: who was the author, what files were changed, what revision number was represented, etc.r"r"}r"(h:XY: who was the author, what files were changed, what revision number was represented, etc.h;j"ubeubahPj ubeubj )r"}r"(h:Xq``/buildslaves`` This summarizes each :class:`BuildSlave`, including which `Builder`\s are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself. A ``no_builders=1`` URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders. h;j hFhIhPj hR}r"(hV]hW]hU]hT]hX]uh[MYh\hhc]r"(j )r"}r"(h:X``/buildslaves``r"h;j"hFhIhPj hR}r"(hV]hW]hU]hT]hX]uh[MYhc]r"j)r"}r"(h:j"hR}r"(hV]hW]hU]hT]hX]uh;j"hc]r"hrX /buildslavesr"r"}r"(h:Uh;j"ubahPjubaubj )r"}r"(h:UhR}r"(hV]hW]hU]hT]hX]uh;j"hc]r"(h)r"}r"(h:XThis summarizes each :class:`BuildSlave`, including which `Builder`\s are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself.h;j"hFhIhPhhR}r"(hV]hW]hU]hT]hX]uh[MThc]r"(hrXThis summarizes each r"r"}r"(h:XThis summarizes each h;j"ubj)r"}r"(h:X:class:`BuildSlave`r"h;j"hFhIhPjhR}r"(UreftypeXclassjjX BuildSlaveU refdomainXpyr"hT]hU]U refexplicithV]hW]hX]jjjNjNuh[MThc]r"j)r"}r"(h:j"hR}r"(hV]hW]r"(jj"Xpy-classr"ehU]hT]hX]uh;j"hc]r"hrX BuildSlaver"r"}r"(h:Uh;j"ubahPjubaubhrX, including which r"r"}r"(h:X, including which h;j"ubj)r"}r"(h:X `Builder`hR}r"(hV]hW]hU]hT]hX]uh;j"hc]r"hrXBuilderr"r"}r"(h:Uh;j"ubahPjubhrXs are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself.r"r"}r"(h:X\s are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself.h;j"ubeubh)r"}r"(h:XA ``no_builders=1`` URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.h;j"hFhIhPhhR}r"(hV]hW]hU]hT]hX]uh[MXhc]r"(hrXA r"r"}r"(h:XA h;j"ubj)r"}r"(h:X``no_builders=1``hR}r"(hV]hW]hU]hT]hX]uh;j"hc]r"hrX no_builders=1r"r"}r"(h:Uh;j"ubahPjubhrXz URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.r"r"}r"(h:Xz URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.h;j"ubeubehPj ubeubj )r"}r#(h:Xy``/one_line_per_build`` This page shows one line of text for each build, merging information from all :class:`Builder`\s [#]_. Each line specifies the name of the Builder, the number of the :class:`Build`, what revision it used, and a summary of the results. Successful builds are in green, while failing builds are in red. The date and time of the build are added to the right-hand edge of the line. The lines are ordered by build finish timestamp. One or more ``builder=`` or ``branch=`` arguments can be used to restrict the list. In addition, a ``numbuilds=`` argument will control how many lines are displayed (20 by default). h;j hFhIhPj hR}r#(hV]hW]hU]hT]hX]uh[Mfh\hhc]r#(j )r#}r#(h:X``/one_line_per_build``r#h;j"hFhIhPj hR}r#(hV]hW]hU]hT]hX]uh[Mfhc]r#j)r#}r #(h:j#hR}r #(hV]hW]hU]hT]hX]uh;j#hc]r #hrX/one_line_per_buildr #r #}r#(h:Uh;j#ubahPjubaubj )r#}r#(h:UhR}r#(hV]hW]hU]hT]hX]uh;j"hc]r#(h)r#}r#(h:XThis page shows one line of text for each build, merging information from all :class:`Builder`\s [#]_. Each line specifies the name of the Builder, the number of the :class:`Build`, what revision it used, and a summary of the results. Successful builds are in green, while failing builds are in red. The date and time of the build are added to the right-hand edge of the line. The lines are ordered by build finish timestamp.h;j#hFhIhPhhR}r#(hV]hW]hU]hT]hX]uh[M\hc]r#(hrXNThis page shows one line of text for each build, merging information from all r#r#}r#(h:XNThis page shows one line of text for each build, merging information from all h;j#ubj)r#}r#(h:X:class:`Builder`r#h;j#hFhIhPjhR}r#(UreftypeXclassjjXBuilderU refdomainXpyr#hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M\hc]r#j)r #}r!#(h:j#hR}r"#(hV]hW]r##(jj#Xpy-classr$#ehU]hT]hX]uh;j#hc]r%#hrXBuilderr&#r'#}r(#(h:Uh;j #ubahPjubaubhrXs r)#r*#}r+#(h:X\s h;j#ubcdocutils.nodes footnote_reference r,#)r-#}r.#(h:X[#]_jP Kh;j#hPUfootnote_referencer/#hR}r0#(j?KhT]r1#jCahU]hV]hW]hX]hYjAuhc]r2#hrX1r3#}r4#(h:Uh;j-#ubaubhrXA. Each line specifies the name of the Builder, the number of the r5#r6#}r7#(h:XA. Each line specifies the name of the Builder, the number of the h;j#ubj)r8#}r9#(h:X:class:`Build`r:#h;j#hFhIhPjhR}r;#(UreftypeXclassjjXBuildU refdomainXpyr<#hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M\hc]r=#j)r>#}r?#(h:j:#hR}r@#(hV]hW]rA#(jj<#Xpy-classrB#ehU]hT]hX]uh;j8#hc]rC#hrXBuildrD#rE#}rF#(h:Uh;j>#ubahPjubaubhrX, what revision it used, and a summary of the results. Successful builds are in green, while failing builds are in red. The date and time of the build are added to the right-hand edge of the line. The lines are ordered by build finish timestamp.rG#rH#}rI#(h:X, what revision it used, and a summary of the results. Successful builds are in green, while failing builds are in red. The date and time of the build are added to the right-hand edge of the line. The lines are ordered by build finish timestamp.h;j#ubeubh)rJ#}rK#(h:XOne or more ``builder=`` or ``branch=`` arguments can be used to restrict the list. In addition, a ``numbuilds=`` argument will control how many lines are displayed (20 by default).h;j#hFhIhPhhR}rL#(hV]hW]hU]hT]hX]uh[Mdhc]rM#(hrX One or more rN#rO#}rP#(h:X One or more h;jJ#ubj)rQ#}rR#(h:X ``builder=``hR}rS#(hV]hW]hU]hT]hX]uh;jJ#hc]rT#hrXbuilder=rU#rV#}rW#(h:Uh;jQ#ubahPjubhrX or rX#rY#}rZ#(h:X or h;jJ#ubj)r[#}r\#(h:X ``branch=``hR}r]#(hV]hW]hU]hT]hX]uh;jJ#hc]r^#hrXbranch=r_#r`#}ra#(h:Uh;j[#ubahPjubhrX< arguments can be used to restrict the list. In addition, a rb#rc#}rd#(h:X< arguments can be used to restrict the list. In addition, a h;jJ#ubj)re#}rf#(h:X``numbuilds=``hR}rg#(hV]hW]hU]hT]hX]uh;jJ#hc]rh#hrX numbuilds=ri#rj#}rk#(h:Uh;je#ubahPjubhrXD argument will control how many lines are displayed (20 by default).rl#rm#}rn#(h:XD argument will control how many lines are displayed (20 by default).h;jJ#ubeubehPj ubeubj )ro#}rp#(h:X``/builders`` This page shows a small table, with one box for each :class:`Builder`, containing the results of the most recent :class:`Build`. It does not show the individual steps, or the current status. This is a simple summary of buildbot status: if this page is green, then all tests are passing. As with ``/one_line_per_build``, this page will also honor ``builder=`` and ``branch=`` arguments. h;j hFhIhPj hR}rq#(hV]hW]hU]hT]hX]uh[Moh\hhc]rr#(j )rs#}rt#(h:X ``/builders``ru#h;jo#hFhIhPj hR}rv#(hV]hW]hU]hT]hX]uh[Mohc]rw#j)rx#}ry#(h:ju#hR}rz#(hV]hW]hU]hT]hX]uh;js#hc]r{#hrX /buildersr|#r}#}r~#(h:Uh;jx#ubahPjubaubj )r#}r#(h:UhR}r#(hV]hW]hU]hT]hX]uh;jo#hc]r#(h)r#}r#(h:XThis page shows a small table, with one box for each :class:`Builder`, containing the results of the most recent :class:`Build`. It does not show the individual steps, or the current status. This is a simple summary of buildbot status: if this page is green, then all tests are passing.h;j#hFhIhPhhR}r#(hV]hW]hU]hT]hX]uh[Mihc]r#(hrX5This page shows a small table, with one box for each r#r#}r#(h:X5This page shows a small table, with one box for each h;j#ubj)r#}r#(h:X:class:`Builder`r#h;j#hFhIhPjhR}r#(UreftypeXclassjjXBuilderU refdomainXpyr#hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mihc]r#j)r#}r#(h:j#hR}r#(hV]hW]r#(jj#Xpy-classr#ehU]hT]hX]uh;j#hc]r#hrXBuilderr#r#}r#(h:Uh;j#ubahPjubaubhrX,, containing the results of the most recent r#r#}r#(h:X,, containing the results of the most recent h;j#ubj)r#}r#(h:X:class:`Build`r#h;j#hFhIhPjhR}r#(UreftypeXclassjjXBuildU refdomainXpyr#hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mihc]r#j)r#}r#(h:j#hR}r#(hV]hW]r#(jj#Xpy-classr#ehU]hT]hX]uh;j#hc]r#hrXBuildr#r#}r#(h:Uh;j#ubahPjubaubhrX. It does not show the individual steps, or the current status. This is a simple summary of buildbot status: if this page is green, then all tests are passing.r#r#}r#(h:X. It does not show the individual steps, or the current status. This is a simple summary of buildbot status: if this page is green, then all tests are passing.h;j#ubeubh)r#}r#(h:XbAs with ``/one_line_per_build``, this page will also honor ``builder=`` and ``branch=`` arguments.h;j#hFhIhPhhR}r#(hV]hW]hU]hT]hX]uh[Mnhc]r#(hrXAs with r#r#}r#(h:XAs with h;j#ubj)r#}r#(h:X``/one_line_per_build``hR}r#(hV]hW]hU]hT]hX]uh;j#hc]r#hrX/one_line_per_buildr#r#}r#(h:Uh;j#ubahPjubhrX, this page will also honor r#r#}r#(h:X, this page will also honor h;j#ubj)r#}r#(h:X ``builder=``hR}r#(hV]hW]hU]hT]hX]uh;j#hc]r#hrXbuilder=r#r#}r#(h:Uh;j#ubahPjubhrX and r#r#}r#(h:X and h;j#ubj)r#}r#(h:X ``branch=``hR}r#(hV]hW]hU]hT]hX]uh;j#hc]r#hrXbranch=r#r#}r#(h:Uh;j#ubahPjubhrX arguments.r#r#}r#(h:X arguments.h;j#ubeubehPj ubeubj )r#}r#(h:X``/png`` This view produces an image in png format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view. h;j hFhIhPj hR}r#(hV]hW]hU]hT]hX]uh[Mrh\hhc]r#(j )r#}r#(h:X``/png``r#h;j#hFhIhPj hR}r#(hV]hW]hU]hT]hX]uh[Mrhc]r#j)r#}r#(h:j#hR}r#(hV]hW]hU]hT]hX]uh;j#hc]r#hrX/pngr#r#}r#(h:Uh;j#ubahPjubaubj )r#}r#(h:UhR}r#(hV]hW]hU]hT]hX]uh;j#hc]r#h)r#}r#(h:XThis view produces an image in png format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view.r#h;j#hFhIhPhhR}r#(hV]hW]hU]hT]hX]uh[Mrhc]r#hrXThis view produces an image in png format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view.r#r#}r#(h:j#h;j#ubaubahPj ubeubj )r#}r#(h:X{:samp:`/png?builder=${BUILDERNAME}&number=$BUILDNUM&size=large` This generate a large png image reporting the status of the given $BUILDNUM for the given builder $BUILDERNAME. The sizes are `small`, `normal` and `large` if no size is given the `normal` size is returned, if no $BUILDNUM is given the last build is returned. For example: .. image:: ../_images/success_normal.png h;j hFhIhPj hR}r#(hV]hW]hU]hT]hX]uh[Mwh\hhc]r#(j )r#}r#(h:X?:samp:`/png?builder=${BUILDERNAME}&number=$BUILDNUM&size=large`r#h;j#hFhIhPj hR}r#(hV]hW]hU]hT]hX]uh[Mwhc]r#j)r#}r#(h:UhR}r#(hT]hU]hV]hW]r#Xsampr#aUrolej#hX]uh;j#hc]r#(hrX/png?builder=$r#r#}r$(h:X/png?builder=$h;j#ubj<)r$}r$(h:X BUILDERNAMEhR}r$(hV]hW]hU]hT]hX]uh;j#hc]r$hrX BUILDERNAMEr$r$}r$(h:Uh;j$ubahPjDubhrX&number=$BUILDNUM&size=larger$r $}r $(h:X&number=$BUILDNUM&size=largeh;j#ubehPjubaubj )r $}r $(h:UhR}r $(hV]hW]hU]hT]hX]uh;j#hc]r$(h)r$}r$(h:XThis generate a large png image reporting the status of the given $BUILDNUM for the given builder $BUILDERNAME. The sizes are `small`, `normal` and `large` if no size is given the `normal` size is returned, if no $BUILDNUM is given the last build is returned. For example:h;j $hFhIhPhhR}r$(hV]hW]hU]hT]hX]uh[Muhc]r$(hrX~This generate a large png image reporting the status of the given $BUILDNUM for the given builder $BUILDERNAME. The sizes are r$r$}r$(h:X~This generate a large png image reporting the status of the given $BUILDNUM for the given builder $BUILDERNAME. The sizes are h;j$ubj)r$}r$(h:X`small`hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrXsmallr$r$}r$(h:Uh;j$ubahPjubhrX, r$r$}r$(h:X, h;j$ubj)r $}r!$(h:X`normal`hR}r"$(hV]hW]hU]hT]hX]uh;j$hc]r#$hrXnormalr$$r%$}r&$(h:Uh;j $ubahPjubhrX and r'$r($}r)$(h:X and h;j$ubj)r*$}r+$(h:X`large`hR}r,$(hV]hW]hU]hT]hX]uh;j$hc]r-$hrXlarger.$r/$}r0$(h:Uh;j*$ubahPjubhrX if no size is given the r1$r2$}r3$(h:X if no size is given the h;j$ubj)r4$}r5$(h:X`normal`hR}r6$(hV]hW]hU]hT]hX]uh;j$hc]r7$hrXnormalr8$r9$}r:$(h:Uh;j4$ubahPjubhrXT size is returned, if no $BUILDNUM is given the last build is returned. For example:r;$r<$}r=$(h:XT size is returned, if no $BUILDNUM is given the last build is returned. For example:h;j$ubeubcdocutils.nodes image r>$)r?$}r@$(h:X).. image:: ../_images/success_normal.png hR}rA$(UuriX$manual/../_images/success_normal.pngrB$hT]hU]hV]hW]U candidatesrC$}rD$U*jB$shX]uh;j $hc]hPUimagerE$ubehPj ubeubj )rF$}rG$(h:X::samp:`/png?builder=${BUILDERNAME}&revision=$REVHASH&size=large` This generate a large png image reporting the status of the build of the given $REVHASH for the given builder $BUILDERNAME. If both number and revision are specified revision will be ignored. $REVHASH must be the full length hash not the short one. h;j hFhIhPj hR}rH$(hV]hW]hU]hT]hX]uh[Mzh\hhc]rI$(j )rJ$}rK$(h:X@:samp:`/png?builder=${BUILDERNAME}&revision=$REVHASH&size=large`rL$h;jF$hFhIhPj hR}rM$(hV]hW]hU]hT]hX]uh[Mzhc]rN$j)rO$}rP$(h:UhR}rQ$(hT]hU]hV]hW]rR$XsamprS$aUrolejS$hX]uh;jJ$hc]rT$(hrX/png?builder=$rU$rV$}rW$(h:X/png?builder=$h;jO$ubj<)rX$}rY$(h:X BUILDERNAMEhR}rZ$(hV]hW]hU]hT]hX]uh;jO$hc]r[$hrX BUILDERNAMEr\$r]$}r^$(h:Uh;jX$ubahPjDubhrX&revision=$REVHASH&size=larger_$r`$}ra$(h:X&revision=$REVHASH&size=largeh;jO$ubehPjubaubj )rb$}rc$(h:UhR}rd$(hV]hW]hU]hT]hX]uh;jF$hc]re$h)rf$}rg$(h:XThis generate a large png image reporting the status of the build of the given $REVHASH for the given builder $BUILDERNAME. If both number and revision are specified revision will be ignored. $REVHASH must be the full length hash not the short one.rh$h;jb$hFhIhPhhR}ri$(hV]hW]hU]hT]hX]uh[Mzhc]rj$hrXThis generate a large png image reporting the status of the build of the given $REVHASH for the given builder $BUILDERNAME. If both number and revision are specified revision will be ignored. $REVHASH must be the full length hash not the short one.rk$rl$}rm$(h:jh$h;jf$ubaubahPj ubeubeubj)rn$}ro$(h:XBuildbot stores old build details in pickle files so it's a good idea to enable cache if you are planning to actively search build statuses by revision.h;j>hFhIhPjhR}rp$(hV]hW]hU]hT]hX]uh[Nh\hhc]rq$h)rr$}rs$(h:XBuildbot stores old build details in pickle files so it's a good idea to enable cache if you are planning to actively search build statuses by revision.rt$h;jn$hFhIhPhhR}ru$(hV]hW]hU]hT]hX]uh[M~hc]rv$hrXBuildbot stores old build details in pickle files so it's a good idea to enable cache if you are planning to actively search build statuses by revision.rw$rx$}ry$(h:jt$h;jr$ubaubaubj )rz$}r{$(h:Uh;j>hFhIhPj hR}r|$(hV]hW]hU]hT]hX]uh[Nh\hhc]r}$(j )r~$}r$(h:X.``/users`` This page exists for authentication reasons when checking ``showUsersPage``. It'll redirect to ``/authfail`` on ``False``, ``/users/table`` on ``True``, and give a username/password login prompt on ``'auth'``. Passing or failing results redirect to the same pages as ``False`` and ``True``. h;jz$hFhIhPj hR}r$(hV]hW]hU]hT]hX]uh[Mhc]r$(j )r$}r$(h:X ``/users``r$h;j~$hFhIhPj hR}r$(hV]hW]hU]hT]hX]uh[Mhc]r$j)r$}r$(h:j$hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrX/usersr$r$}r$(h:Uh;j$ubahPjubaubj )r$}r$(h:UhR}r$(hV]hW]hU]hT]hX]uh;j~$hc]r$h)r$}r$(h:X"This page exists for authentication reasons when checking ``showUsersPage``. It'll redirect to ``/authfail`` on ``False``, ``/users/table`` on ``True``, and give a username/password login prompt on ``'auth'``. Passing or failing results redirect to the same pages as ``False`` and ``True``.h;j$hFhIhPhhR}r$(hV]hW]hU]hT]hX]uh[Mhc]r$(hrX:This page exists for authentication reasons when checking r$r$}r$(h:X:This page exists for authentication reasons when checking h;j$ubj)r$}r$(h:X``showUsersPage``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrX showUsersPager$r$}r$(h:Uh;j$ubahPjubhrX. It'll redirect to r$r$}r$(h:X. It'll redirect to h;j$ubj)r$}r$(h:X ``/authfail``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrX /authfailr$r$}r$(h:Uh;j$ubahPjubhrX on r$r$}r$(h:X on h;j$ubj)r$}r$(h:X ``False``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrXFalser$r$}r$(h:Uh;j$ubahPjubhrX, r$r$}r$(h:X, h;j$ubj)r$}r$(h:X``/users/table``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrX /users/tabler$r$}r$(h:Uh;j$ubahPjubhrX on r$r$}r$(h:X on h;j$ubj)r$}r$(h:X``True``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrXTruer$r$}r$(h:Uh;j$ubahPjubhrX/, and give a username/password login prompt on r$r$}r$(h:X/, and give a username/password login prompt on h;j$ubj)r$}r$(h:X ``'auth'``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrX'auth'r$r$}r$(h:Uh;j$ubahPjubhrX;. Passing or failing results redirect to the same pages as r$r$}r$(h:X;. Passing or failing results redirect to the same pages as h;j$ubj)r$}r$(h:X ``False``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrXFalser$r$}r$(h:Uh;j$ubahPjubhrX and r$r$}r$(h:X and h;j$ubj)r$}r$(h:X``True``hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrXTruer$r$}r$(h:Uh;j$ubahPjubhrX.r$}r$(h:X.h;j$ubeubahPj ubeubj )r$}r$(h:X``/users/table`` This page shows a table containing users that are stored in the database. It has columns for their respective ``uid`` and ``identifier`` values, with the ``uid`` values being clickable for more detailed information relating to a user. h;jz$hFhIhPj hR}r$(hV]hW]hU]hT]hX]uh[Mh\hhc]r$(j )r$}r$(h:X``/users/table``r$h;j$hFhIhPj hR}r$(hV]hW]hU]hT]hX]uh[Mhc]r$j)r$}r$(h:j$hR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$hrX /users/tabler$r$}r$(h:Uh;j$ubahPjubaubj )r$}r$(h:UhR}r$(hV]hW]hU]hT]hX]uh;j$hc]r$h)r$}r$(h:XThis page shows a table containing users that are stored in the database. It has columns for their respective ``uid`` and ``identifier`` values, with the ``uid`` values being clickable for more detailed information relating to a user.h;j$hFhIhPhhR}r$(hV]hW]hU]hT]hX]uh[Mhc]r$(hrXnThis page shows a table containing users that are stored in the database. It has columns for their respective r%r%}r%(h:XnThis page shows a table containing users that are stored in the database. It has columns for their respective h;j$ubj)r%}r%(h:X``uid``hR}r%(hV]hW]hU]hT]hX]uh;j$hc]r%hrXuidr%r%}r %(h:Uh;j%ubahPjubhrX and r %r %}r %(h:X and h;j$ubj)r %}r%(h:X``identifier``hR}r%(hV]hW]hU]hT]hX]uh;j$hc]r%hrX identifierr%r%}r%(h:Uh;j %ubahPjubhrX values, with the r%r%}r%(h:X values, with the h;j$ubj)r%}r%(h:X``uid``hR}r%(hV]hW]hU]hT]hX]uh;j$hc]r%hrXuidr%r%}r%(h:Uh;j%ubahPjubhrXI values being clickable for more detailed information relating to a user.r%r%}r %(h:XI values being clickable for more detailed information relating to a user.h;j$ubeubahPj ubeubj )r!%}r"%(h:Xy``/users/table/{NN}`` Shows all the attributes stored in the database relating to the user with uid ``{NN}`` in a table. h;jz$hFhIhPj hR}r#%(hV]hW]hU]hT]hX]uh[Mh\hhc]r$%(j )r%%}r&%(h:X``/users/table/{NN}``r'%h;j!%hFhIhPj hR}r(%(hV]hW]hU]hT]hX]uh[Mhc]r)%j)r*%}r+%(h:j'%hR}r,%(hV]hW]hU]hT]hX]uh;j%%hc]r-%hrX/users/table/{NN}r.%r/%}r0%(h:Uh;j*%ubahPjubaubj )r1%}r2%(h:UhR}r3%(hV]hW]hU]hT]hX]uh;j!%hc]r4%h)r5%}r6%(h:XbShows all the attributes stored in the database relating to the user with uid ``{NN}`` in a table.h;j1%hFhIhPhhR}r7%(hV]hW]hU]hT]hX]uh[Mhc]r8%(hrXNShows all the attributes stored in the database relating to the user with uid r9%r:%}r;%(h:XNShows all the attributes stored in the database relating to the user with uid h;j5%ubj)r<%}r=%(h:X``{NN}``hR}r>%(hV]hW]hU]hT]hX]uh;j5%hc]r?%hrX{NN}r@%rA%}rB%(h:Uh;j<%ubahPjubhrX in a table.rC%rD%}rE%(h:X in a table.h;j5%ubeubahPj ubeubj )rF%}rG%(h:X``/about`` This page gives a brief summary of the Buildbot itself: software version, versions of some libraries that the Buildbot depends upon, etc. It also contains a link to the buildbot.net home page. h;jz$hFhIhPj hR}rH%(hV]hW]hU]hT]hX]uh[Mh\hhc]rI%(j )rJ%}rK%(h:X ``/about``rL%h;jF%hFhIhPj hR}rM%(hV]hW]hU]hT]hX]uh[Mhc]rN%j)rO%}rP%(h:jL%hR}rQ%(hV]hW]hU]hT]hX]uh;jJ%hc]rR%hrX/aboutrS%rT%}rU%(h:Uh;jO%ubahPjubaubj )rV%}rW%(h:UhR}rX%(hV]hW]hU]hT]hX]uh;jF%hc]rY%h)rZ%}r[%(h:XThis page gives a brief summary of the Buildbot itself: software version, versions of some libraries that the Buildbot depends upon, etc. It also contains a link to the buildbot.net home page.r\%h;jV%hFhIhPhhR}r]%(hV]hW]hU]hT]hX]uh[Mhc]r^%hrXThis page gives a brief summary of the Buildbot itself: software version, versions of some libraries that the Buildbot depends upon, etc. It also contains a link to the buildbot.net home page.r_%r`%}ra%(h:j\%h;jZ%ubaubahPj ubeubeubh)rb%}rc%(h:XmThere are also a set of web-status resources that are intended for use by other programs, rather than humans.rd%h;j>hFhIhPhhR}re%(hV]hW]hU]hT]hX]uh[Mh\hhc]rf%hrXmThere are also a set of web-status resources that are intended for use by other programs, rather than humans.rg%rh%}ri%(h:jd%h;jb%ubaubj )rj%}rk%(h:Uh;j>hFhIhPj hR}rl%(hV]hW]hU]hT]hX]uh[Nh\hhc]rm%j )rn%}ro%(h:X``/change_hook`` This provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See :ref:`Change-Hooks` for more details. h;jj%hFhIhPj hR}rp%(hV]hW]hU]hT]hX]uh[Mhc]rq%(j )rr%}rs%(h:X``/change_hook``rt%h;jn%hFhIhPj hR}ru%(hV]hW]hU]hT]hX]uh[Mhc]rv%j)rw%}rx%(h:jt%hR}ry%(hV]hW]hU]hT]hX]uh;jr%hc]rz%hrX /change_hookr{%r|%}r}%(h:Uh;jw%ubahPjubaubj )r~%}r%(h:UhR}r%(hV]hW]hU]hT]hX]uh;jn%hc]r%h)r%}r%(h:XThis provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See :ref:`Change-Hooks` for more details.h;j~%hFhIhPhhR}r%(hV]hW]hU]hT]hX]uh[Mhc]r%(hrXThis provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See r%r%}r%(h:XThis provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See h;j%ubj)r%}r%(h:X:ref:`Change-Hooks`r%h;j%hFhIhPjhR}r%(UreftypeXrefjjX change-hooksU refdomainXstdr%hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r%j<)r%}r%(h:j%hR}r%(hV]hW]r%(jj%Xstd-refr%ehU]hT]hX]uh;j%hc]r%hrX Change-Hooksr%r%}r%(h:Uh;j%ubahPjDubaubhrX for more details.r%r%}r%(h:X for more details.h;j%ubeubahPj ubeubaubeubh@jeubhFhIhPhdhR}r%(hV]hW]hU]hT]r%hahX]r%hauh[Mh\hhc]r%(hk)r%}r%(h:hh;h@hFhIhPhohR}r%(hT]hU]hV]hW]hX]hYhuh[Mh\hhc]r%hrX"WebStatus Configuration Parametersr%r%}r%(h:hh;j%ubaubh<)r%}r%(h:Uh;h@hFhIhPhdhR}r%(hV]hW]hU]hT]r%Uhttp-connectionr%ahX]r%h#auh[Mh\hhc]r%(hk)r%}r%(h:XHTTP Connectionr%h;j%hFhIhPhohR}r%(hV]hW]hU]hT]hX]uh[Mh\hhc]r%hrXHTTP Connectionr%r%}r%(h:j%h;j%ubaubh)r%}r%(h:XThe most common way to run a :class:`WebStatus` is on a regular TCP port. To do this, just pass in the TCP port number when you create the :class:`WebStatus` instance; this is called the ``http_port`` argument::h;j%hFhIhPhhR}r%(hV]hW]hU]hT]hX]uh[Mh\hhc]r%(hrXThe most common way to run a r%r%}r%(h:XThe most common way to run a h;j%ubj)r%}r%(h:X:class:`WebStatus`r%h;j%hFhIhPjhR}r%(UreftypeXclassjjX WebStatusU refdomainXpyr%hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r%j)r%}r%(h:j%hR}r%(hV]hW]r%(jj%Xpy-classr%ehU]hT]hX]uh;j%hc]r%hrX WebStatusr%r%}r%(h:Uh;j%ubahPjubaubhrX\ is on a regular TCP port. To do this, just pass in the TCP port number when you create the r%r%}r%(h:X\ is on a regular TCP port. To do this, just pass in the TCP port number when you create the h;j%ubj)r%}r%(h:X:class:`WebStatus`r%h;j%hFhIhPjhR}r%(UreftypeXclassjjX WebStatusU refdomainXpyr%hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r%j)r%}r%(h:j%hR}r%(hV]hW]r%(jj%Xpy-classr%ehU]hT]hX]uh;j%hc]r%hrX WebStatusr%r%}r%(h:Uh;j%ubahPjubaubhrX instance; this is called the r%r%}r%(h:X instance; this is called the h;j%ubj)r%}r%(h:X ``http_port``hR}r%(hV]hW]hU]hT]hX]uh;j%hc]r%hrX http_portr%r%}r%(h:Uh;j%ubahPjubhrX argument:r%r%}r%(h:X argument:h;j%ubeubj)r%}r%(h:XXfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(http_port=8080))h;j%hFhIhPjhR}r%(jjhT]hU]hV]hW]hX]uh[Mh\hhc]r%hrXXfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(http_port=8080))r%r%}r%(h:Uh;j%ubaubh)r%}r%(h:X>The ``http_port`` argument is actually a `strports specification` for the port that the web server should listen on. This can be a simple port number, or a string like ``http_port="tcp:8080:interface=127.0.0.1"`` (to limit connections to the loopback interface, and therefore to clients running on the same host) [#]_.h;j%hFhIhPhhR}r%(hV]hW]hU]hT]hX]uh[Mh\hhc]r%(hrXThe r%r%}r%(h:XThe h;j%ubj)r%}r%(h:X ``http_port``hR}r%(hV]hW]hU]hT]hX]uh;j%hc]r%hrX http_portr%r%}r%(h:Uh;j%ubahPjubhrX argument is actually a r%r&}r&(h:X argument is actually a h;j%ubj)r&}r&(h:X`strports specification`hR}r&(hV]hW]hU]hT]hX]uh;j%hc]r&hrXstrports specificationr&r&}r&(h:Uh;j&ubahPjubhrXg for the port that the web server should listen on. This can be a simple port number, or a string like r &r &}r &(h:Xg for the port that the web server should listen on. This can be a simple port number, or a string like h;j%ubj)r &}r &(h:X,``http_port="tcp:8080:interface=127.0.0.1"``hR}r&(hV]hW]hU]hT]hX]uh;j%hc]r&hrX(http_port="tcp:8080:interface=127.0.0.1"r&r&}r&(h:Uh;j &ubahPjubhrXe (to limit connections to the loopback interface, and therefore to clients running on the same host) r&r&}r&(h:Xe (to limit connections to the loopback interface, and therefore to clients running on the same host) h;j%ubj,#)r&}r&(h:X[#]_jP Kh;j%hPj/#hR}r&(j?KhT]r&jfahU]hV]hW]hX]hYjduhc]r&hrX2r&}r&(h:Uh;j&ubaubhrX.r&}r&(h:X.h;j%ubeubh)r&}r &(h:XIf instead (or in addition) you provide the ``distrib_port`` argument, a twisted.web distributed server will be started either on a TCP port (if ``distrib_port`` is like ``"tcp:12345"``) or more likely on a UNIX socket (if ``distrib_port`` is like ``"unix:/path/to/socket"``).h;j%hFhIhPhhR}r!&(hV]hW]hU]hT]hX]uh[Mh\hhc]r"&(hrX,If instead (or in addition) you provide the r#&r$&}r%&(h:X,If instead (or in addition) you provide the h;j&ubj)r&&}r'&(h:X``distrib_port``hR}r(&(hV]hW]hU]hT]hX]uh;j&hc]r)&hrX distrib_portr*&r+&}r,&(h:Uh;j&&ubahPjubhrXU argument, a twisted.web distributed server will be started either on a TCP port (if r-&r.&}r/&(h:XU argument, a twisted.web distributed server will be started either on a TCP port (if h;j&ubj)r0&}r1&(h:X``distrib_port``hR}r2&(hV]hW]hU]hT]hX]uh;j&hc]r3&hrX distrib_portr4&r5&}r6&(h:Uh;j0&ubahPjubhrX is like r7&r8&}r9&(h:X is like h;j&ubj)r:&}r;&(h:X``"tcp:12345"``hR}r<&(hV]hW]hU]hT]hX]uh;j&hc]r=&hrX "tcp:12345"r>&r?&}r@&(h:Uh;j:&ubahPjubhrX&) or more likely on a UNIX socket (if rA&rB&}rC&(h:X&) or more likely on a UNIX socket (if h;j&ubj)rD&}rE&(h:X``distrib_port``hR}rF&(hV]hW]hU]hT]hX]uh;j&hc]rG&hrX distrib_portrH&rI&}rJ&(h:Uh;jD&ubahPjubhrX is like rK&rL&}rM&(h:X is like h;j&ubj)rN&}rO&(h:X``"unix:/path/to/socket"``hR}rP&(hV]hW]hU]hT]hX]uh;j&hc]rQ&hrX"unix:/path/to/socket"rR&rS&}rT&(h:Uh;jN&ubahPjubhrX).rU&rV&}rW&(h:X).h;j&ubeubh)rX&}rY&(h:X\The ``public_html`` option gives the path to a regular directory of HTML files that will be displayed alongside the various built-in URLs buildbot supplies. This is most often used to supply CSS files (:file:`/buildbot.css`) and a top-level navigational file (:file:`/index.html`), but can also serve any other files required - even build results!h;j%hFhIhPhhR}rZ&(hV]hW]hU]hT]hX]uh[Mh\hhc]r[&(hrXThe r\&r]&}r^&(h:XThe h;jX&ubj)r_&}r`&(h:X``public_html``hR}ra&(hV]hW]hU]hT]hX]uh;jX&hc]rb&hrX public_htmlrc&rd&}re&(h:Uh;j_&ubahPjubhrX option gives the path to a regular directory of HTML files that will be displayed alongside the various built-in URLs buildbot supplies. This is most often used to supply CSS files (rf&rg&}rh&(h:X option gives the path to a regular directory of HTML files that will be displayed alongside the various built-in URLs buildbot supplies. This is most often used to supply CSS files (h;jX&ubj)ri&}rj&(h:UhR}rk&(hT]hU]hV]hW]rl&Xfilerm&aUrolejm&hX]uh;jX&hc]rn&hrX /buildbot.cssro&rp&}rq&(h:X /buildbot.cssh;ji&ubahPjubhrX%) and a top-level navigational file (rr&rs&}rt&(h:X%) and a top-level navigational file (h;jX&ubj)ru&}rv&(h:UhR}rw&(hT]hU]hV]hW]rx&Xfilery&aUrolejy&hX]uh;jX&hc]rz&hrX /index.htmlr{&r|&}r}&(h:X /index.htmlh;ju&ubahPjubhrXD), but can also serve any other files required - even build results!r~&r&}r&(h:XD), but can also serve any other files required - even build results!h;jX&ubeubhM)r&}r&(h:X.. _Authorization:h;j%hFhIhPhQhR}r&(hT]hU]hV]hW]hX]hYU authorizationr&uh[Mh\hhc]ubeubh=h<)r&}r&(h:Uh;h@hFhIhPhdhR}r&(hV]hW]hU]hT]r&Uauthenticationr&ahX]r&hauh[Mh\hhc]r&(hk)r&}r&(h:XAuthenticationr&h;j&hFhIhPhohR}r&(hV]hW]hU]hT]hX]uh[Mh\hhc]r&hrXAuthenticationr&r&}r&(h:j&h;j&ubaubh)r&}r&(h:X&If you do not wish to allow strangers to perform actions, but do want developers to have such access, you will need to add some authentication support. Pass an instance of :class:`status.web.auth.IAuth` as a ``auth`` keyword argument to :class:`Authz`, and specify the action as ``"auth"``. ::h;j&hFhIhPhhR}r&(hV]hW]hU]hT]hX]uh[Mh\hhc]r&(hrXIf you do not wish to allow strangers to perform actions, but do want developers to have such access, you will need to add some authentication support. Pass an instance of r&r&}r&(h:XIf you do not wish to allow strangers to perform actions, but do want developers to have such access, you will need to add some authentication support. Pass an instance of h;j&ubj)r&}r&(h:X:class:`status.web.auth.IAuth`r&h;j&hFhIhPjhR}r&(UreftypeXclassjjXstatus.web.auth.IAuthU refdomainXpyr&hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r&j)r&}r&(h:j&hR}r&(hV]hW]r&(jj&Xpy-classr&ehU]hT]hX]uh;j&hc]r&hrXstatus.web.auth.IAuthr&r&}r&(h:Uh;j&ubahPjubaubhrX as a r&r&}r&(h:X as a h;j&ubj)r&}r&(h:X``auth``hR}r&(hV]hW]hU]hT]hX]uh;j&hc]r&hrXauthr&r&}r&(h:Uh;j&ubahPjubhrX keyword argument to r&r&}r&(h:X keyword argument to h;j&ubj)r&}r&(h:X:class:`Authz`r&h;j&hFhIhPjhR}r&(UreftypeXclassjjXAuthzU refdomainXpyr&hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r&j)r&}r&(h:j&hR}r&(hV]hW]r&(jj&Xpy-classr&ehU]hT]hX]uh;j&hc]r&hrXAuthzr&r&}r&(h:Uh;j&ubahPjubaubhrX, and specify the action as r&r&}r&(h:X, and specify the action as h;j&ubj)r&}r&(h:X ``"auth"``hR}r&(hV]hW]hU]hT]hX]uh;j&hc]r&hrX"auth"r&r&}r&(h:Uh;j&ubahPjubhrX.r&}r&(h:X.h;j&ubeubj)r&}r&(h:X*from buildbot.status.html import WebStatus from buildbot.status.web.authz import Authz from buildbot.status.web.auth import BasicAuth users = [('bob', 'secret-pass'), ('jill', 'super-pass')] authz = Authz(auth=BasicAuth(users), forceBuild='auth', # only authenticated users pingBuilder=True, # but anyone can do this ) c['status'].append(WebStatus(http_port=8080, authz=authz)) # or from buildbot.status.web.auth import HTPasswdAuth auth = (HTPasswdAuth('/path/to/htpasswd')) # or from buildbot.status.web.auth import UsersAuth auth = UsersAuth()h;j&hFhIhPjhR}r&(jjhT]hU]hV]hW]hX]uh[M h\hhc]r&hrX*from buildbot.status.html import WebStatus from buildbot.status.web.authz import Authz from buildbot.status.web.auth import BasicAuth users = [('bob', 'secret-pass'), ('jill', 'super-pass')] authz = Authz(auth=BasicAuth(users), forceBuild='auth', # only authenticated users pingBuilder=True, # but anyone can do this ) c['status'].append(WebStatus(http_port=8080, authz=authz)) # or from buildbot.status.web.auth import HTPasswdAuth auth = (HTPasswdAuth('/path/to/htpasswd')) # or from buildbot.status.web.auth import UsersAuth auth = UsersAuth()r&r&}r&(h:Uh;j&ubaubh)r&}r&(h:XThe class :class:`BasicAuth` implements a basic authentication mechanism using a list of user/password tuples provided from the configuration file. The class `HTPasswdAuth` implements an authentication against an :file:`.htpasswd` file. The `HTPasswdAprAuth` a subclass of `HTPasswdAuth` use libaprutil for authenticating. This adds support for apr1/md5 and sha1 password hashes but requires libaprutil at runtime. The :class:`UsersAuth` works with :ref:`User-Objects` to check for valid user credentials.h;j&hFhIhPhhR}r&(hV]hW]hU]hT]hX]uh[Mh\hhc]r&(hrX The class r&r&}r&(h:X The class h;j&ubj)r&}r&(h:X:class:`BasicAuth`r&h;j&hFhIhPjhR}r&(UreftypeXclassjjX BasicAuthU refdomainXpyr&hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r&j)r&}r&(h:j&hR}r&(hV]hW]r&(jj&Xpy-classr&ehU]hT]hX]uh;j&hc]r&hrX BasicAuthr&r&}r&(h:Uh;j&ubahPjubaubhrX implements a basic authentication mechanism using a list of user/password tuples provided from the configuration file. The class r&r&}r&(h:X implements a basic authentication mechanism using a list of user/password tuples provided from the configuration file. The class h;j&ubj)r&}r&(h:X`HTPasswdAuth`hR}r&(hV]hW]hU]hT]hX]uh;j&hc]r&hrX HTPasswdAuthr&r&}r&(h:Uh;j&ubahPjubhrX) implements an authentication against an r&r&}r&(h:X) implements an authentication against an h;j&ubj)r&}r&(h:UhR}r&(hT]hU]hV]hW]r&Xfiler'aUrolej'hX]uh;j&hc]r'hrX .htpasswdr'r'}r'(h:X .htpasswdh;j&ubahPjubhrX file. The r'r'}r'(h:X file. The h;j&ubj)r'}r '(h:X`HTPasswdAprAuth`hR}r '(hV]hW]hU]hT]hX]uh;j&hc]r 'hrXHTPasswdAprAuthr 'r '}r'(h:Uh;j'ubahPjubhrX a subclass of r'r'}r'(h:X a subclass of h;j&ubj)r'}r'(h:X`HTPasswdAuth`hR}r'(hV]hW]hU]hT]hX]uh;j&hc]r'hrX HTPasswdAuthr'r'}r'(h:Uh;j'ubahPjubhrX use libaprutil for authenticating. This adds support for apr1/md5 and sha1 password hashes but requires libaprutil at runtime. The r'r'}r'(h:X use libaprutil for authenticating. This adds support for apr1/md5 and sha1 password hashes but requires libaprutil at runtime. The h;j&ubj)r'}r'(h:X:class:`UsersAuth`r'h;j&hFhIhPjhR}r'(UreftypeXclassjjX UsersAuthU refdomainXpyr 'hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r!'j)r"'}r#'(h:j'hR}r$'(hV]hW]r%'(jj 'Xpy-classr&'ehU]hT]hX]uh;j'hc]r''hrX UsersAuthr('r)'}r*'(h:Uh;j"'ubahPjubaubhrX works with r+'r,'}r-'(h:X works with h;j&ubj)r.'}r/'(h:X:ref:`User-Objects`r0'h;j&hFhIhPjhR}r1'(UreftypeXrefjjX user-objectsU refdomainXstdr2'hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r3'j<)r4'}r5'(h:j0'hR}r6'(hV]hW]r7'(jj2'Xstd-refr8'ehU]hT]hX]uh;j.'hc]r9'hrX User-Objectsr:'r;'}r<'(h:Uh;j4'ubahPjDubaubhrX% to check for valid user credentials.r='r>'}r?'(h:X% to check for valid user credentials.h;j&ubeubh)r@'}rA'(h:XIf you need still-more flexibility, pass a function for the authentication action. That function will be called with an authenticated username and some action-specific arguments, and should return true if the action is authorized. ::h;j&hFhIhPhhR}rB'(hV]hW]hU]hT]hX]uh[M%h\hhc]rC'hrXIf you need still-more flexibility, pass a function for the authentication action. That function will be called with an authenticated username and some action-specific arguments, and should return true if the action is authorized.rD'rE'}rF'(h:XIf you need still-more flexibility, pass a function for the authentication action. That function will be called with an authenticated username and some action-specific arguments, and should return true if the action is authorized.h;j@'ubaubj)rG'}rH'(h:Xldef canForceBuild(username, builder_status): if builder_status.getName() == 'smoketest': return True # any authenticated user can run smoketest elif username == 'releng': return True # releng can force whatever they want else: return False # otherwise, no way. authz = Authz(auth=BasicAuth(users), forceBuild=canForceBuild)h;j&hFhIhPjhR}rI'(jjhT]hU]hV]hW]hX]uh[M)h\hhc]rJ'hrXldef canForceBuild(username, builder_status): if builder_status.getName() == 'smoketest': return True # any authenticated user can run smoketest elif username == 'releng': return True # releng can force whatever they want else: return False # otherwise, no way. authz = Authz(auth=BasicAuth(users), forceBuild=canForceBuild)rK'rL'}rM'(h:Uh;jG'ubaubh)rN'}rO'(h:XThe ``forceBuild`` and ``pingBuilder`` actions both supply a :class:`BuilderStatus` object. The ``stopBuild`` action supplies a :class:`BuildStatus` object. The ``cancelPendingBuild`` action supplies a :class:`BuildRequest`. The remainder do not supply any extra arguments.h;j&hFhIhPhhR}rP'(hV]hW]hU]hT]hX]uh[M4h\hhc]rQ'(hrXThe rR'rS'}rT'(h:XThe h;jN'ubj)rU'}rV'(h:X``forceBuild``hR}rW'(hV]hW]hU]hT]hX]uh;jN'hc]rX'hrX forceBuildrY'rZ'}r['(h:Uh;jU'ubahPjubhrX and r\'r]'}r^'(h:X and h;jN'ubj)r_'}r`'(h:X``pingBuilder``hR}ra'(hV]hW]hU]hT]hX]uh;jN'hc]rb'hrX pingBuilderrc'rd'}re'(h:Uh;j_'ubahPjubhrX actions both supply a rf'rg'}rh'(h:X actions both supply a h;jN'ubj)ri'}rj'(h:X:class:`BuilderStatus`rk'h;jN'hFhIhPjhR}rl'(UreftypeXclassjjX BuilderStatusU refdomainXpyrm'hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M4hc]rn'j)ro'}rp'(h:jk'hR}rq'(hV]hW]rr'(jjm'Xpy-classrs'ehU]hT]hX]uh;ji'hc]rt'hrX BuilderStatusru'rv'}rw'(h:Uh;jo'ubahPjubaubhrX object. The rx'ry'}rz'(h:X object. The h;jN'ubj)r{'}r|'(h:X ``stopBuild``hR}r}'(hV]hW]hU]hT]hX]uh;jN'hc]r~'hrX stopBuildr'r'}r'(h:Uh;j{'ubahPjubhrX action supplies a r'r'}r'(h:X action supplies a h;jN'ubj)r'}r'(h:X:class:`BuildStatus`r'h;jN'hFhIhPjhR}r'(UreftypeXclassjjX BuildStatusU refdomainXpyr'hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M4hc]r'j)r'}r'(h:j'hR}r'(hV]hW]r'(jj'Xpy-classr'ehU]hT]hX]uh;j'hc]r'hrX BuildStatusr'r'}r'(h:Uh;j'ubahPjubaubhrX object. The r'r'}r'(h:X object. The h;jN'ubj)r'}r'(h:X``cancelPendingBuild``hR}r'(hV]hW]hU]hT]hX]uh;jN'hc]r'hrXcancelPendingBuildr'r'}r'(h:Uh;j'ubahPjubhrX action supplies a r'r'}r'(h:X action supplies a h;jN'ubj)r'}r'(h:X:class:`BuildRequest`r'h;jN'hFhIhPjhR}r'(UreftypeXclassjjX BuildRequestU refdomainXpyr'hT]hU]U refexplicithV]hW]hX]jjjNjNuh[M4hc]r'j)r'}r'(h:j'hR}r'(hV]hW]r'(jj'Xpy-classr'ehU]hT]hX]uh;j'hc]r'hrX BuildRequestr'r'}r'(h:Uh;j'ubahPjubaubhrX3. The remainder do not supply any extra arguments.r'r'}r'(h:X3. The remainder do not supply any extra arguments.h;jN'ubeubeubh<)r'}r'(h:Uh;h@hFhIhPhdhR}r'(hV]hW]hU]hT]r'U,http-based-authentication-by-frontend-serverr'ahX]r'h auh[M:h\hhc]r'(hk)r'}r'(h:X,HTTP-based authentication by frontend serverr'h;j'hFhIhPhohR}r'(hV]hW]hU]hT]hX]uh[M:h\hhc]r'hrX,HTTP-based authentication by frontend serverr'r'}r'(h:j'h;j'ubaubh)r'}r'(h:X&In case if WebStatus is served through reverse proxy that supports HTTP-based authentication (like apache, lighttpd), it's possible to to tell WebStatus to trust web server and get username from request headers. This allows displaying correct usernames in build reason, interrupt messages, etc.r'h;j'hFhIhPhhR}r'(hV]hW]hU]hT]hX]uh[M<h\hhc]r'hrX&In case if WebStatus is served through reverse proxy that supports HTTP-based authentication (like apache, lighttpd), it's possible to to tell WebStatus to trust web server and get username from request headers. This allows displaying correct usernames in build reason, interrupt messages, etc.r'r'}r'(h:j'h;j'ubaubh)r'}r'(h:XHJust set ``useHttpHeader`` to ``True`` in :class:`Authz` constructor. ::r'h;j'hFhIhPhhR}r'(hV]hW]hU]hT]hX]uh[MAh\hhc]r'(hrX Just set r'r'}r'(h:X Just set h;j'ubj)r'}r'(h:X``useHttpHeader``hR}r'(hV]hW]hU]hT]hX]uh;j'hc]r'hrX useHttpHeaderr'r'}r'(h:Uh;j'ubahPjubhrX to r'r'}r'(h:X to h;j'ubj)r'}r'(h:X``True``hR}r'(hV]hW]hU]hT]hX]uh;j'hc]r'hrXTruer'r'}r'(h:Uh;j'ubahPjubhrX in r'r'}r'(h:X in h;j'ubj)r'}r'(h:X:class:`Authz`r'h;j'hFhIhPjhR}r'(UreftypeXclassjjXAuthzU refdomainXpyr'hT]hU]U refexplicithV]hW]hX]jjjNjNuh[MAhc]r'j)r'}r'(h:j'hR}r'(hV]hW]r'(jj'Xpy-classr'ehU]hT]hX]uh;j'hc]r'hrXAuthzr'r'}r'(h:Uh;j'ubahPjubaubhrX constructor.r'r'}r'(h:X constructor.h;j'ubeubj)r'}r'(h:XTauthz = Authz(useHttpHeader=True) # WebStatus secured by web frontend with HTTP authh;j'hFhIhPjhR}r'(jjhT]hU]hV]hW]hX]uh[MCh\hhc]r'hrXTauthz = Authz(useHttpHeader=True) # WebStatus secured by web frontend with HTTP authr'r'}r'(h:Uh;j'ubaubh)r'}r((h:XPlease note that WebStatus can decode password for HTTP Basic requests only (for Digest authentication it's just impossible). Custom :class:`status.web.auth.IAuth` subclasses may just ignore password at all since it's already validated by web server.h;j'hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[MEh\hhc]r((hrXPlease note that WebStatus can decode password for HTTP Basic requests only (for Digest authentication it's just impossible). Custom r(r(}r((h:XPlease note that WebStatus can decode password for HTTP Basic requests only (for Digest authentication it's just impossible). Custom h;j'ubj)r(}r((h:X:class:`status.web.auth.IAuth`r(h;j'hFhIhPjhR}r ((UreftypeXclassjjXstatus.web.auth.IAuthU refdomainXpyr (hT]hU]U refexplicithV]hW]hX]jjjNjNuh[MEhc]r (j)r (}r ((h:j(hR}r((hV]hW]r((jj (Xpy-classr(ehU]hT]hX]uh;j(hc]r(hrXstatus.web.auth.IAuthr(r(}r((h:Uh;j (ubahPjubaubhrXW subclasses may just ignore password at all since it's already validated by web server.r(r(}r((h:XW subclasses may just ignore password at all since it's already validated by web server.h;j'ubeubh)r(}r((h:XyAdministrator must make sure that it's impossible to get access to WebStatus using other way than through frontend. Usually this means that WebStatus should listen for incoming connections only on localhost (or on some firewall-protected port). Frontend must require HTTP authentication to access WebStatus pages (using any source for credentials, such as htpasswd, PAM, LDAP).r(h;j'hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[MIh\hhc]r(hrXyAdministrator must make sure that it's impossible to get access to WebStatus using other way than through frontend. Usually this means that WebStatus should listen for incoming connections only on localhost (or on some firewall-protected port). Frontend must require HTTP authentication to access WebStatus pages (using any source for credentials, such as htpasswd, PAM, LDAP).r(r(}r((h:j(h;j(ubaubh)r (}r!((h:XIf you allow unauthenticated access through frontend as well, it's possible to specify a ``httpLoginUrl`` which will be rendered on the WebStatus for unauthenticated users as a link named Login. ::h;j'hFhIhPhhR}r"((hV]hW]hU]hT]hX]uh[MOh\hhc]r#((hrXYIf you allow unauthenticated access through frontend as well, it's possible to specify a r$(r%(}r&((h:XYIf you allow unauthenticated access through frontend as well, it's possible to specify a h;j (ubj)r'(}r(((h:X``httpLoginUrl``hR}r)((hV]hW]hU]hT]hX]uh;j (hc]r*(hrX httpLoginUrlr+(r,(}r-((h:Uh;j'(ubahPjubhrXY which will be rendered on the WebStatus for unauthenticated users as a link named Login.r.(r/(}r0((h:XY which will be rendered on the WebStatus for unauthenticated users as a link named Login.h;j (ubeubj)r1(}r2((h:XHauthz = Authz(useHttpHeader=True, httpLoginUrl='https://buildbot/login')h;j'hFhIhPjhR}r3((jjhT]hU]hV]hW]hX]uh[MSh\hhc]r4(hrXHauthz = Authz(useHttpHeader=True, httpLoginUrl='https://buildbot/login')r5(r6(}r7((h:Uh;j1(ubaubh)r8(}r9((h:X\A configuration example with Apache HTTPD as reverse proxy could look like the following. ::h;j'hFhIhPhhR}r:((hV]hW]hU]hT]hX]uh[MUh\hhc]r;(hrXYA configuration example with Apache HTTPD as reverse proxy could look like the following.r<(r=(}r>((h:XYA configuration example with Apache HTTPD as reverse proxy could look like the following.h;j8(ubaubj)r?(}r@((h:Xauthz = Authz( useHttpHeader=True, httpLoginUrl='https://buildbot/login', auth = HTPasswdAprAuth('/var/www/htpasswd'), forceBuild = 'auth')h;j'hFhIhPjhR}rA((jjhT]hU]hV]hW]hX]uh[MXh\hhc]rB(hrXauthz = Authz( useHttpHeader=True, httpLoginUrl='https://buildbot/login', auth = HTPasswdAprAuth('/var/www/htpasswd'), forceBuild = 'auth')rC(rD(}rE((h:Uh;j?(ubaubh)rF(}rG((h:X#Corresponding Apache configuration.rH(h;j'hFhIhPhhR}rI((hV]hW]hU]hT]hX]uh[M^h\hhc]rJ(hrX#Corresponding Apache configuration.rK(rL(}rM((h:jH(h;jF(ubaubj)rN(}rO((h:XProxyPass / http://127.0.0.1:8010/ AuthType Basic AuthName "Buildbot" AuthUserFile /var/www/htpasswd Require valid-user RewriteEngine on RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/(.*)$ RewriteRule ^.*$ https://%1/%2 [R,L] h;j'hFhIhPjhR}rP((jBjCXapachejjhT]hU]hV]hW]hX]uh[M`h\hhc]rQ(hrXProxyPass / http://127.0.0.1:8010/ AuthType Basic AuthName "Buildbot" AuthUserFile /var/www/htpasswd Require valid-user RewriteEngine on RewriteCond %{HTTP_REFERER} ^https?://([^/]+)/(.*)$ RewriteRule ^.*$ https://%1/%2 [R,L] rR(rS(}rT((h:Uh;jN(ubaubeubh<)rU(}rV((h:Uh;h@hFhIhPhdhR}rW((hV]hW]hU]hT]rX(Ulogging-configurationrY(ahX]rZ(hauh[Mph\hhc]r[((hk)r\(}r]((h:XLogging configurationr^(h;jU(hFhIhPhohR}r_((hV]hW]hU]hT]hX]uh[Mph\hhc]r`(hrXLogging configurationra(rb(}rc((h:j^(h;j\(ubaubh)rd(}re((h:XUThe `WebStatus` uses a separate log file (:file:`http.log`) to avoid clutter buildbot's default log (:file:`twistd.log`) with request/response messages. This log is also, by default, rotated in the same way as the twistd.log file, but you can also customize the rotation logic with the following parameters if you need a different behaviour.h;jU(hFhIhPhhR}rf((hV]hW]hU]hT]hX]uh[Mrh\hhc]rg((hrXThe rh(ri(}rj((h:XThe h;jd(ubj)rk(}rl((h:X `WebStatus`hR}rm((hV]hW]hU]hT]hX]uh;jd(hc]rn(hrX WebStatusro(rp(}rq((h:Uh;jk(ubahPjubhrX uses a separate log file (rr(rs(}rt((h:X uses a separate log file (h;jd(ubj)ru(}rv((h:UhR}rw((hT]hU]hV]hW]rx(Xfilery(aUrolejy(hX]uh;jd(hc]rz(hrXhttp.logr{(r|(}r}((h:Xhttp.logh;ju(ubahPjubhrX+) to avoid clutter buildbot's default log (r~(r(}r((h:X+) to avoid clutter buildbot's default log (h;jd(ubj)r(}r((h:UhR}r((hT]hU]hV]hW]r(Xfiler(aUrolej(hX]uh;jd(hc]r(hrX twistd.logr(r(}r((h:X twistd.logh;j(ubahPjubhrX) with request/response messages. This log is also, by default, rotated in the same way as the twistd.log file, but you can also customize the rotation logic with the following parameters if you need a different behaviour.r(r(}r((h:X) with request/response messages. This log is also, by default, rotated in the same way as the twistd.log file, but you can also customize the rotation logic with the following parameters if you need a different behaviour.h;jd(ubeubj )r(}r((h:Uh;jU(hFhIhPj hR}r((hV]hW]hU]hT]hX]uh[Nh\hhc]r((j )r(}r((h:XS``rotateLength`` An integer defining the file size at which log files are rotated. h;j(hFhIhPj hR}r((hV]hW]hU]hT]hX]uh[Myhc]r((j )r(}r((h:X``rotateLength``r(h;j(hFhIhPj hR}r((hV]hW]hU]hT]hX]uh[Myhc]r(j)r(}r((h:j(hR}r((hV]hW]hU]hT]hX]uh;j(hc]r(hrX rotateLengthr(r(}r((h:Uh;j(ubahPjubaubj )r(}r((h:UhR}r((hV]hW]hU]hT]hX]uh;j(hc]r(h)r(}r((h:XAAn integer defining the file size at which log files are rotated.r(h;j(hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[Myhc]r(hrXAAn integer defining the file size at which log files are rotated.r(r(}r((h:j(h;j(ubaubahPj ubeubj )r(}r((h:XA``maxRotatedFiles`` The maximum number of old log files to keep. h;j(hFhIhPj hR}r((hV]hW]hU]hT]hX]uh[M|h\hhc]r((j )r(}r((h:X``maxRotatedFiles``r(h;j(hFhIhPj hR}r((hV]hW]hU]hT]hX]uh[M|hc]r(j)r(}r((h:j(hR}r((hV]hW]hU]hT]hX]uh;j(hc]r(hrXmaxRotatedFilesr(r(}r((h:Uh;j(ubahPjubaubj )r(}r((h:UhR}r((hV]hW]hU]hT]hX]uh;j(hc]r(h)r(}r((h:X,The maximum number of old log files to keep.r(h;j(hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[M|hc]r(hrX,The maximum number of old log files to keep.r(r(}r((h:j(h;j(ubaubahPj ubeubeubeubh<)r(}r((h:Uh;h@hFhIhPhdhR}r((hV]hW]hU]hT]r(Uurl-decorating-optionsr(ahX]r(hauh[Mh\hhc]r((hk)r(}r((h:XURL-decorating optionsr(h;j(hFhIhPhohR}r((hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXURL-decorating optionsr(r(}r((h:j(h;j(ubaubh)r(}r((h:XThese arguments adds an URL link to various places in the WebStatus, such as revisions, repositories, projects and, optionally, ticket/bug references in change comments.r(h;j(hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXThese arguments adds an URL link to various places in the WebStatus, such as revisions, repositories, projects and, optionally, ticket/bug references in change comments.r(r(}r((h:j(h;j(ubaubh<)r(}r((h:Uh;j(hFhIhPhdhR}r((hV]hW]hU]hT]r(Urevlinkr(ahX]r(h2auh[Mh\hhc]r((hk)r(}r((h:Xrevlinkr(h;j(hFhIhPhohR}r((hV]hW]hU]hT]hX]uh[Mh\hhc]r(hrXrevlinkr(r(}r((h:j(h;j(ubaubh)r(}r((h:XThe ``revlink`` argument on :class:`WebStatus` is deprecated in favour of the global :bb:cfg:`revlink` option. Only use this if you need to generate different URLs for different web status instances.h;j(hFhIhPhhR}r((hV]hW]hU]hT]hX]uh[Mh\hhc]r((hrXThe r(r(}r((h:XThe h;j(ubj)r(}r((h:X ``revlink``hR}r((hV]hW]hU]hT]hX]uh;j(hc]r(hrXrevlinkr(r(}r((h:Uh;j(ubahPjubhrX argument on r(r(}r((h:X argument on h;j(ubj)r)}r)(h:X:class:`WebStatus`r)h;j(hFhIhPjhR}r)(UreftypeXclassjjX WebStatusU refdomainXpyr)hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r)j)r)}r)(h:j)hR}r)(hV]hW]r )(jj)Xpy-classr )ehU]hT]hX]uh;j)hc]r )hrX WebStatusr )r )}r)(h:Uh;j)ubahPjubaubhrX' is deprecated in favour of the global r)r)}r)(h:X' is deprecated in favour of the global h;j(ubj)r)}r)(h:X:bb:cfg:`revlink`r)h;j(hFhIhPjhR}r)(UreftypeXcfgjjXrevlinkU refdomainXbbr)hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r)j)r)}r)(h:j)hR}r)(hV]hW]r)(jj)Xbb-cfgr)ehU]hT]hX]uh;j)hc]r)hrXrevlinkr)r)}r )(h:Uh;j)ubahPjubaubhrXa option. Only use this if you need to generate different URLs for different web status instances.r!)r")}r#)(h:Xa option. Only use this if you need to generate different URLs for different web status instances.h;j(ubeubh)r$)}r%)(h:XIn addition to a callable like :bb:cfg:`revlink`, this argument accepts a format string or a dict mapping a string (repository name) to format strings.h;j(hFhIhPhhR}r&)(hV]hW]hU]hT]hX]uh[Mh\hhc]r')(hrXIn addition to a callable like r()r))}r*)(h:XIn addition to a callable like h;j$)ubj)r+)}r,)(h:X:bb:cfg:`revlink`r-)h;j$)hFhIhPjhR}r.)(UreftypeXcfgjjXrevlinkU refdomainXbbr/)hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r0)j)r1)}r2)(h:j-)hR}r3)(hV]hW]r4)(jj/)Xbb-cfgr5)ehU]hT]hX]uh;j+)hc]r6)hrXrevlinkr7)r8)}r9)(h:Uh;j1)ubahPjubaubhrXg, this argument accepts a format string or a dict mapping a string (repository name) to format strings.r:)r;)}r<)(h:Xg, this argument accepts a format string or a dict mapping a string (repository name) to format strings.h;j$)ubeubh)r=)}r>)(h:XpThe format string should use ``%s`` to insert the revision id in the url. For example, for Buildbot on GitHub::h;j(hFhIhPhhR}r?)(hV]hW]hU]hT]hX]uh[Mh\hhc]r@)(hrXThe format string should use rA)rB)}rC)(h:XThe format string should use h;j=)ubj)rD)}rE)(h:X``%s``hR}rF)(hV]hW]hU]hT]hX]uh;j=)hc]rG)hrX%srH)rI)}rJ)(h:Uh;jD)ubahPjubhrXL to insert the revision id in the url. For example, for Buildbot on GitHub:rK)rL)}rM)(h:XL to insert the revision id in the url. For example, for Buildbot on GitHub:h;j=)ubeubj)rN)}rO)(h:X5revlink='http://github.com/buildbot/buildbot/tree/%s'h;j(hFhIhPjhR}rP)(jjhT]hU]hV]hW]hX]uh[Mh\hhc]rQ)hrX5revlink='http://github.com/buildbot/buildbot/tree/%s'rR)rS)}rT)(h:Uh;jN)ubaubh)rU)}rV)(h:XMThe revision ID will be URL encoded before inserted in the replacement stringrW)h;j(hFhIhPhhR}rX)(hV]hW]hU]hT]hX]uh[Mh\hhc]rY)hrXMThe revision ID will be URL encoded before inserted in the replacement stringrZ)r[)}r\)(h:jW)h;jU)ubaubeubh<)r])}r^)(h:Uh;j(hFhIhPhdhR}r_)(hV]hW]hU]hT]r`)Uchangecommentlinkra)ahX]rb)hauh[Mh\hhc]rc)(hk)rd)}re)(h:Xchangecommentlinkrf)h;j])hFhIhPhohR}rg)(hV]hW]hU]hT]hX]uh[Mh\hhc]rh)hrXchangecommentlinkri)rj)}rk)(h:jf)h;jd)ubaubh)rl)}rm)(h:XnThe ``changecommentlink`` argument can be used to create links to ticket-ids from change comments (i.e. #123).h;j])hFhIhPhhR}rn)(hV]hW]hU]hT]hX]uh[Mh\hhc]ro)(hrXThe rp)rq)}rr)(h:XThe h;jl)ubj)rs)}rt)(h:X``changecommentlink``hR}ru)(hV]hW]hU]hT]hX]uh;jl)hc]rv)hrXchangecommentlinkrw)rx)}ry)(h:Uh;js)ubahPjubhrXU argument can be used to create links to ticket-ids from change comments (i.e. #123).rz)r{)}r|)(h:XU argument can be used to create links to ticket-ids from change comments (i.e. #123).h;jl)ubeubh)r})}r~)(h:XThe argument can either be a tuple of three strings, a dictionary mapping strings (project names) to tuples or a callable taking a changetext (a :class:`jinja2.Markup` instance) and a project name, returning a the same change text with additional links/html tags added to it.h;j])hFhIhPhhR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)(hrXThe argument can either be a tuple of three strings, a dictionary mapping strings (project names) to tuples or a callable taking a changetext (a r)r)}r)(h:XThe argument can either be a tuple of three strings, a dictionary mapping strings (project names) to tuples or a callable taking a changetext (a h;j})ubj)r)}r)(h:X:class:`jinja2.Markup`r)h;j})hFhIhPjhR}r)(UreftypeXclassjjX jinja2.MarkupU refdomainXpyr)hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r)j)r)}r)(h:j)hR}r)(hV]hW]r)(jj)Xpy-classr)ehU]hT]hX]uh;j)hc]r)hrX jinja2.Markupr)r)}r)(h:Uh;j)ubahPjubaubhrXl instance) and a project name, returning a the same change text with additional links/html tags added to it.r)r)}r)(h:Xl instance) and a project name, returning a the same change text with additional links/html tags added to it.h;j})ubeubh)r)}r)(h:XIf the tuple is used, it should contain three strings where the first element is a regex that searches for strings (with match groups), the second is a replace-string that, when substituted with ``\1`` etc, yields the URL and the third is the title attribute of the link. (The ```` is added by the system.) So, for Trac tickets (#42, etc): ``changecommentlink(r"#(\d+)", r"http://buildbot.net/trac/ticket/\1", r"Ticket \g<0>")`` .h;j])hFhIhPhhR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)(hrXIf the tuple is used, it should contain three strings where the first element is a regex that searches for strings (with match groups), the second is a replace-string that, when substituted with r)r)}r)(h:XIf the tuple is used, it should contain three strings where the first element is a regex that searches for strings (with match groups), the second is a replace-string that, when substituted with h;j)ubj)r)}r)(h:X``\1``hR}r)(hV]hW]hU]hT]hX]uh;j)hc]r)hrX\1r)r)}r)(h:Uh;j)ubahPjubhrXL etc, yields the URL and the third is the title attribute of the link. (The r)r)}r)(h:XL etc, yields the URL and the third is the title attribute of the link. (The h;j)ubj)r)}r)(h:X````hR}r)(hV]hW]hU]hT]hX]uh;j)hc]r)hrXr)r)}r)(h:Uh;j)ubahPjubhrX; is added by the system.) So, for Trac tickets (#42, etc): r)r)}r)(h:X; is added by the system.) So, for Trac tickets (#42, etc): h;j)ubj)r)}r)(h:XX``changecommentlink(r"#(\d+)", r"http://buildbot.net/trac/ticket/\1", r"Ticket \g<0>")``hR}r)(hV]hW]hU]hT]hX]uh;j)hc]r)hrXTchangecommentlink(r"#(\d+)", r"http://buildbot.net/trac/ticket/\1", r"Ticket \g<0>")r)r)}r)(h:Uh;j)ubahPjubhrX .r)r)}r)(h:X .h;j)ubeubeubh<)r)}r)(h:Uh;j(hFhIhPhdhR}r)(hV]hW]hU]hT]r)Uprojectsr)ahX]r)h%auh[Mh\hhc]r)(hk)r)}r)(h:Xprojectsr)h;j)hFhIhPhohR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrXprojectsr)r)}r)(h:j)h;j)ubaubh)r)}r)(h:X~A dictionary from strings to strings, mapping project names to URLs, or a callable taking a project name and returning an URL.r)h;j)hFhIhPhhR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrX~A dictionary from strings to strings, mapping project names to URLs, or a callable taking a project name and returning an URL.r)r)}r)(h:j)h;j)ubaubeubh<)r)}r)(h:Uh;j(hFhIhPhdhR}r)(hV]hW]hU]hT]r)U repositoriesr)ahX]r)h,auh[Mh\hhc]r)(hk)r)}r)(h:X repositoriesr)h;j)hFhIhPhohR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrX repositoriesr)r)}r)(h:j)h;j)ubaubh)r)}r)(h:XQSame as the projects arg above, a dict or callable mapping project names to URLs.r)h;j)hFhIhPhhR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrXQSame as the projects arg above, a dict or callable mapping project names to URLs.r)r)}r)(h:j)h;j)ubaubeubeubjeubhFhIhK}r)hj&shPhdhR}r)(hV]r)X authorizationr)ahW]hU]hT]r)(j&Uid4r)ehX]r)hauh[Mh\hh]}r)j&j&shc]r)(hk)r)}r)(h:X Authorizationr)h;h=hFhIhPhohR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrX Authorizationr)r)}r)(h:j)h;j)ubaubh)r)}r)(h:XBThe buildbot web status is, by default, read-only. It displays lots of information, but users are not allowed to affect the operation of the buildmaster. However, there are a number of supported activities that can be enabled, and Buildbot can also perform rudimentary username/password authentication. The actions are:r)h;h=hFhIhPhhR}r)(hV]hW]hU]hT]hX]uh[Mh\hhc]r)hrXBThe buildbot web status is, by default, read-only. It displays lots of information, but users are not allowed to affect the operation of the buildmaster. However, there are a number of supported activities that can be enabled, and Buildbot can also perform rudimentary username/password authentication. The actions are:r)r*}r*(h:j)h;j)ubaubj )r*}r*(h:Uh;h=hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Nh\hhc]r*(j )r*}r*(h:X"``view`` view buildbot web status h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mhc]r *(j )r *}r *(h:X``view``r *h;j*hFhIhPj hR}r *(hV]hW]hU]hT]hX]uh[Mhc]r*j)r*}r*(h:j *hR}r*(hV]hW]hU]hT]hX]uh;j *hc]r*hrXviewr*r*}r*(h:Uh;j*ubahPjubaubj )r*}r*(h:UhR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*h)r*}r*(h:Xview buildbot web statusr*h;j*hFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*hrXview buildbot web statusr*r *}r!*(h:j*h;j*ubaubahPj ubeubj )r"*}r#*(h:Xo``forceBuild`` force a particular builder to begin building, optionally with a specific revision, branch, etc. h;j*hFhIhPj hR}r$*(hV]hW]hU]hT]hX]uh[Mh\hhc]r%*(j )r&*}r'*(h:X``forceBuild``r(*h;j"*hFhIhPj hR}r)*(hV]hW]hU]hT]hX]uh[Mhc]r**j)r+*}r,*(h:j(*hR}r-*(hV]hW]hU]hT]hX]uh;j&*hc]r.*hrX forceBuildr/*r0*}r1*(h:Uh;j+*ubahPjubaubj )r2*}r3*(h:UhR}r4*(hV]hW]hU]hT]hX]uh;j"*hc]r5*h)r6*}r7*(h:X_force a particular builder to begin building, optionally with a specific revision, branch, etc.r8*h;j2*hFhIhPhhR}r9*(hV]hW]hU]hT]hX]uh[Mhc]r:*hrX_force a particular builder to begin building, optionally with a specific revision, branch, etc.r;*r<*}r=*(h:j8*h;j6*ubaubahPj ubeubj )r>*}r?*(h:X:``forceAllBuilds`` force *all* builders to start building h;j*hFhIhPj hR}r@*(hV]hW]hU]hT]hX]uh[Mh\hhc]rA*(j )rB*}rC*(h:X``forceAllBuilds``rD*h;j>*hFhIhPj hR}rE*(hV]hW]hU]hT]hX]uh[Mhc]rF*j)rG*}rH*(h:jD*hR}rI*(hV]hW]hU]hT]hX]uh;jB*hc]rJ*hrXforceAllBuildsrK*rL*}rM*(h:Uh;jG*ubahPjubaubj )rN*}rO*(h:UhR}rP*(hV]hW]hU]hT]hX]uh;j>*hc]rQ*h)rR*}rS*(h:X&force *all* builders to start buildingh;jN*hFhIhPhhR}rT*(hV]hW]hU]hT]hX]uh[Mhc]rU*(hrXforce rV*rW*}rX*(h:Xforce h;jR*ubj<)rY*}rZ*(h:X*all*hR}r[*(hV]hW]hU]hT]hX]uh;jR*hc]r\*hrXallr]*r^*}r_*(h:Uh;jY*ubahPjDubhrX builders to start buildingr`*ra*}rb*(h:X builders to start buildingh;jR*ubeubahPj ubeubj )rc*}rd*(h:XL``pingBuilder`` "ping" a builder's buildslaves to check that they are alive h;j*hFhIhPj hR}re*(hV]hW]hU]hT]hX]uh[Mh\hhc]rf*(j )rg*}rh*(h:X``pingBuilder``ri*h;jc*hFhIhPj hR}rj*(hV]hW]hU]hT]hX]uh[Mhc]rk*j)rl*}rm*(h:ji*hR}rn*(hV]hW]hU]hT]hX]uh;jg*hc]ro*hrX pingBuilderrp*rq*}rr*(h:Uh;jl*ubahPjubaubj )rs*}rt*(h:UhR}ru*(hV]hW]hU]hT]hX]uh;jc*hc]rv*h)rw*}rx*(h:X;"ping" a builder's buildslaves to check that they are alivery*h;js*hFhIhPhhR}rz*(hV]hW]hU]hT]hX]uh[Mhc]r{*hrX;"ping" a builder's buildslaves to check that they are aliver|*r}*}r~*(h:jy*h;jw*ubaubahPj ubeubj )r*}r*(h:X]``gracefulShutdown`` gracefully shut down a slave when it is finished with its current build h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mh\hhc]r*(j )r*}r*(h:X``gracefulShutdown``r*h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*j)r*}r*(h:j*hR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*hrXgracefulShutdownr*r*}r*(h:Uh;j*ubahPjubaubj )r*}r*(h:UhR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*h)r*}r*(h:XGgracefully shut down a slave when it is finished with its current buildr*h;j*hFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*hrXGgracefully shut down a slave when it is finished with its current buildr*r*}r*(h:j*h;j*ubaubahPj ubeubj )r*}r*(h:X>``pauseSlave`` temporarily stop running new builds on a slave h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mh\hhc]r*(j )r*}r*(h:X``pauseSlave``r*h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*j)r*}r*(h:j*hR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*hrX pauseSlaver*r*}r*(h:Uh;j*ubahPjubaubj )r*}r*(h:UhR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*h)r*}r*(h:X.temporarily stop running new builds on a slaver*h;j*hFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*hrX.temporarily stop running new builds on a slaver*r*}r*(h:j*h;j*ubaubahPj ubeubj )r*}r*(h:X#``stopBuild`` stop a running build h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mh\hhc]r*(j )r*}r*(h:X ``stopBuild``r*h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*j)r*}r*(h:j*hR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*hrX stopBuildr*r*}r*(h:Uh;j*ubahPjubaubj )r*}r*(h:UhR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*h)r*}r*(h:Xstop a running buildr*h;j*hFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*hrXstop a running buildr*r*}r*(h:j*h;j*ubaubahPj ubeubj )r*}r*(h:X*``stopAllBuilds`` stop all running builds h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mh\hhc]r*(j )r*}r*(h:X``stopAllBuilds``r*h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*j)r*}r*(h:j*hR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*hrX stopAllBuildsr*r*}r*(h:Uh;j*ubahPjubaubj )r*}r*(h:UhR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*h)r*}r*(h:Xstop all running buildsr*h;j*hFhIhPhhR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*hrXstop all running buildsr*r*}r*(h:j*h;j*ubaubahPj ubeubj )r*}r*(h:X?``cancelPendingBuild`` cancel a build that has not yet started h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mh\hhc]r*(j )r*}r*(h:X``cancelPendingBuild``r*h;j*hFhIhPj hR}r*(hV]hW]hU]hT]hX]uh[Mhc]r*j)r*}r*(h:j*hR}r*(hV]hW]hU]hT]hX]uh;j*hc]r*hrXcancelPendingBuildr*r*}r*(h:Uh;j*ubahPjubaubj )r*}r+(h:UhR}r+(hV]hW]hU]hT]hX]uh;j*hc]r+h)r+}r+(h:X'cancel a build that has not yet startedr+h;j*hFhIhPhhR}r+(hV]hW]hU]hT]hX]uh[Mhc]r+hrX'cancel a build that has not yet startedr+r +}r +(h:j+h;j+ubaubahPj ubeubj )r +}r +(h:X\``cancelAllPendingBuilds`` cancel all or selected subset of builds that has not yet started h;j*hFhIhPj hR}r +(hV]hW]hU]hT]hX]uh[Mh\hhc]r+(j )r+}r+(h:X``cancelAllPendingBuilds``r+h;j +hFhIhPj hR}r+(hV]hW]hU]hT]hX]uh[Mhc]r+j)r+}r+(h:j+hR}r+(hV]hW]hU]hT]hX]uh;j+hc]r+hrXcancelAllPendingBuildsr+r+}r+(h:Uh;j+ubahPjubaubj )r+}r+(h:UhR}r+(hV]hW]hU]hT]hX]uh;j +hc]r+h)r+}r +(h:X@cancel all or selected subset of builds that has not yet startedr!+h;j+hFhIhPhhR}r"+(hV]hW]hU]hT]hX]uh[Mhc]r#+hrX@cancel all or selected subset of builds that has not yet startedr$+r%+}r&+(h:j!+h;j+ubaubahPj ubeubj )r'+}r(+(h:X@``stopChange`` cancel builds that include a given change number h;j*hFhIhPj hR}r)+(hV]hW]hU]hT]hX]uh[Mh\hhc]r*+(j )r++}r,+(h:X``stopChange``r-+h;j'+hFhIhPj hR}r.+(hV]hW]hU]hT]hX]uh[Mhc]r/+j)r0+}r1+(h:j-+hR}r2+(hV]hW]hU]hT]hX]uh;j++hc]r3+hrX stopChanger4+r5+}r6+(h:Uh;j0+ubahPjubaubj )r7+}r8+(h:UhR}r9+(hV]hW]hU]hT]hX]uh;j'+hc]r:+h)r;+}r<+(h:X0cancel builds that include a given change numberr=+h;j7+hFhIhPhhR}r>+(hV]hW]hU]hT]hX]uh[Mhc]r?+hrX0cancel builds that include a given change numberr@+rA+}rB+(h:j=+h;j;+ubaubahPj ubeubj )rC+}rD+(h:XO``cleanShutdown`` shut down the master gracefully, without interrupting builds h;j*hFhIhPj hR}rE+(hV]hW]hU]hT]hX]uh[Mh\hhc]rF+(j )rG+}rH+(h:X``cleanShutdown``rI+h;jC+hFhIhPj hR}rJ+(hV]hW]hU]hT]hX]uh[Mhc]rK+j)rL+}rM+(h:jI+hR}rN+(hV]hW]hU]hT]hX]uh;jG+hc]rO+hrX cleanShutdownrP+rQ+}rR+(h:Uh;jL+ubahPjubaubj )rS+}rT+(h:UhR}rU+(hV]hW]hU]hT]hX]uh;jC+hc]rV+h)rW+}rX+(h:X<shut down the master gracefully, without interrupting buildsrY+h;jS+hFhIhPhhR}rZ+(hV]hW]hU]hT]hX]uh[Mhc]r[+hrX<shut down the master gracefully, without interrupting buildsr\+r]+}r^+(h:jY+h;jW+ubaubahPj ubeubj )r_+}r`+(h:X[``showUsersPage`` access to page displaying users in the database, see :ref:`User-Objects` h;j*hFhIhPj hR}ra+(hV]hW]hU]hT]hX]uh[Mh\hhc]rb+(j )rc+}rd+(h:X``showUsersPage``re+h;j_+hFhIhPj hR}rf+(hV]hW]hU]hT]hX]uh[Mhc]rg+j)rh+}ri+(h:je+hR}rj+(hV]hW]hU]hT]hX]uh;jc+hc]rk+hrX showUsersPagerl+rm+}rn+(h:Uh;jh+ubahPjubaubj )ro+}rp+(h:UhR}rq+(hV]hW]hU]hT]hX]uh;j_+hc]rr+h)rs+}rt+(h:XHaccess to page displaying users in the database, see :ref:`User-Objects`h;jo+hFhIhPhhR}ru+(hV]hW]hU]hT]hX]uh[Mhc]rv+(hrX5access to page displaying users in the database, see rw+rx+}ry+(h:X5access to page displaying users in the database, see h;js+ubj)rz+}r{+(h:X:ref:`User-Objects`r|+h;js+hFhIhPjhR}r}+(UreftypeXrefjjX user-objectsU refdomainXstdr~+hT]hU]U refexplicithV]hW]hX]jjuh[Mhc]r+j<)r+}r+(h:j|+hR}r+(hV]hW]r+(jj~+Xstd-refr+ehU]hT]hX]uh;jz+hc]r+hrX User-Objectsr+r+}r+(h:Uh;j+ubahPjDubaubeubahPj ubeubeubh)r+}r+(h:XFor each of these actions, you can configure buildbot to never allow the action, always allow the action, allow the action to any authenticated user, or check with a function of your creation to determine whether the action is OK (see below).r+h;h=hFhIhPhhR}r+(hV]hW]hU]hT]hX]uh[Mh\hhc]r+hrXFor each of these actions, you can configure buildbot to never allow the action, always allow the action, allow the action to any authenticated user, or check with a function of your creation to determine whether the action is OK (see below).r+r+}r+(h:j+h;j+ubaubh)r+}r+(h:X6This is all configured with the :class:`Authz` class::r+h;h=hFhIhPhhR}r+(hV]hW]hU]hT]hX]uh[Mh\hhc]r+(hrX This is all configured with the r+r+}r+(h:X This is all configured with the h;j+ubj)r+}r+(h:X:class:`Authz`r+h;j+hFhIhPjhR}r+(UreftypeXclassjjXAuthzU refdomainXpyr+hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r+j)r+}r+(h:j+hR}r+(hV]hW]r+(jj+Xpy-classr+ehU]hT]hX]uh;j+hc]r+hrXAuthzr+r+}r+(h:Uh;j+ubahPjubaubhrX class:r+r+}r+(h:X class:h;j+ubeubj)r+}r+(h:Xfrom buildbot.status.html import WebStatus from buildbot.status.web.authz import Authz authz = Authz( forceBuild=True, stopBuild=True) c['status'].append(WebStatus(http_port=8080, authz=authz))h;h=hFhIhPjhR}r+(jjhT]hU]hV]hW]hX]uh[Mh\hhc]r+hrXfrom buildbot.status.html import WebStatus from buildbot.status.web.authz import Authz authz = Authz( forceBuild=True, stopBuild=True) c['status'].append(WebStatus(http_port=8080, authz=authz))r+r+}r+(h:Uh;j+ubaubh)r+}r+(h:XEach of the actions listed above is an option to :class:`Authz`. You can specify ``False`` (the default) to prohibit that action or ``True`` to enable it. Or you can specify a callable. Each such callable will take a username as its first argument. The remaining arguments vary depending on the type of authorization request. For ``forceBuild``, the second argument is the builder status.h;h=hFhIhPhhR}r+(hV]hW]hU]hT]hX]uh[Mh\hhc]r+(hrX1Each of the actions listed above is an option to r+r+}r+(h:X1Each of the actions listed above is an option to h;j+ubj)r+}r+(h:X:class:`Authz`r+h;j+hFhIhPjhR}r+(UreftypeXclassjjXAuthzU refdomainXpyr+hT]hU]U refexplicithV]hW]hX]jjjNjNuh[Mhc]r+j)r+}r+(h:j+hR}r+(hV]hW]r+(jj+Xpy-classr+ehU]hT]hX]uh;j+hc]r+hrXAuthzr+r+}r+(h:Uh;j+ubahPjubaubhrX. You can specify r+r+}r+(h:X. You can specify h;j+ubj)r+}r+(h:X ``False``hR}r+(hV]hW]hU]hT]hX]uh;j+hc]r+hrXFalser+r+}r+(h:Uh;j+ubahPjubhrX* (the default) to prohibit that action or r+r+}r+(h:X* (the default) to prohibit that action or h;j+ubj)r+}r+(h:X``True``hR}r+(hV]hW]hU]hT]hX]uh;j+hc]r+hrXTruer+r+}r+(h:Uh;j+ubahPjubhrX to enable it. Or you can specify a callable. Each such callable will take a username as its first argument. The remaining arguments vary depending on the type of authorization request. For r+r+}r+(h:X to enable it. Or you can specify a callable. Each such callable will take a username as its first argument. The remaining arguments vary depending on the type of authorization request. For h;j+ubj)r+}r+(h:X``forceBuild``hR}r+(hV]hW]hU]hT]hX]uh;j+hc]r+hrX forceBuildr+r+}r+(h:Uh;j+ubahPjubhrX,, the second argument is the builder status.r+r+}r+(h:X,, the second argument is the builder status.h;j+ubeubeubhFhIhPUsystem_messager+hR}r+(hV]UlevelKhT]hU]r+j)aUsourcehIhW]hX]UlineMUtypeUINFOr+uh[Mh\hhc]r+h)r+}r+(h:UhR}r+(hV]hW]hU]hT]hX]uh;h8hc]r+hrX0Duplicate implicit target name: "authorization".r+r+}r+(h:Uh;j+ubahPhubaubaUcurrent_sourcer+NU decorationr+NUautofootnote_startr+KUnameidsr+}r+(hj(hjhhh h h jh jh hgh hU1jAhjYhjhjhj(hjhj&U2jdhjY(hjahj;hhZhj&hhhhhjhja)hhhjhjth j'h!jfh"h"h#j%h$hh%j)h&hh'h'h(h(h)jh*h*h+jxh,j)h-h-h.jNh/jMh0j6h1hh2j(uhc]r+(j)r+}r+(h:Uh;hhFhIhPjhR}r+(hT]hU]hV]hW]hX]Uentries]r+((UsingleXBuildmaster Config; statush_h_tr+(UsingleXstatus (Buildmaster Config)h_h_tr,euh[Kh\hhc]ubh`hNhDeh:UU transformerr,NU footnote_refsr,}r,Urefnamesr,}r,X pyopenssl]r,(jN jesUsymbol_footnotesr,]r,Uautofootnote_refsr ,]r ,(j-#j&eUsymbol_footnote_refsr ,]r ,U citationsr ,]r,h\hU current_liner,NUtransform_messagesr,]r,(h7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineKUtypej+uhc]r,h)r,}r,(h:UhR}r,(hV]hW]hU]hT]hX]uh;j,hc]r,hrX0Hyperlink target "cfg-status" is not referenced.r,r,}r,(h:Uh;j,ubahPhubahPj+ubh7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineKUtypej+uhc]r ,h)r!,}r",(h:UhR}r#,(hV]hW]hU]hT]hX]uh;j,hc]r$,hrX4Hyperlink target "status-targets" is not referenced.r%,r&,}r',(h:Uh;j!,ubahPhubahPj+ubh7)r(,}r),(h:UhR}r*,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineK4Utypej+uhc]r+,h)r,,}r-,(h:UhR}r.,(hV]hW]hU]hT]hX]uh;j(,hc]r/,hrX6Hyperlink target "status-WebStatus" is not referenced.r0,r1,}r2,(h:Uh;j,,ubahPhubahPj+ubh7)r3,}r4,(h:UhR}r5,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMUtypej+uhc]r6,h)r7,}r8,(h:UhR}r9,(hV]hW]hU]hT]hX]uh;j3,hc]r:,hrX3Hyperlink target "authorization" is not referenced.r;,r<,}r=,(h:Uh;j7,ubahPhubahPj+ubh7)r>,}r?,(h:UhR}r@,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMUtypej+uhc]rA,h)rB,}rC,(h:UhR}rD,(hV]hW]hU]hT]hX]uh;j>,hc]rE,hrX2Hyperlink target "change-hooks" is not referenced.rF,rG,}rH,(h:Uh;jB,ubahPhubahPj+ubh7)rI,}rJ,(h:UhR}rK,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMUtypej+uhc]rL,h)rM,}rN,(h:UhR}rO,(hV]hW]hU]hT]hX]uh;jI,hc]rP,hrX9Hyperlink target "status-MailNotifier" is not referenced.rQ,rR,}rS,(h:Uh;jM,ubahPhubahPj+ubh7)rT,}rU,(h:UhR}rV,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMUtypej+uhc]rW,h)rX,}rY,(h:UhR}rZ,(hV]hW]hU]hT]hX]uh;jT,hc]r[,hrX-Hyperlink target "index-0" is not referenced.r\,r],}r^,(h:Uh;jX,ubahPhubahPj+ubh7)r_,}r`,(h:UhR}ra,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineM|Utypej+uhc]rb,h)rc,}rd,(h:UhR}re,(hV]hW]hU]hT]hX]uh;j_,hc]rf,hrX0Hyperlink target "status-IRC" is not referenced.rg,rh,}ri,(h:Uh;jc,ubahPhubahPj+ubh7)rj,}rk,(h:UhR}rl,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineM~Utypej+uhc]rm,h)rn,}ro,(h:UhR}rp,(hV]hW]hU]hT]hX]uh;jj,hc]rq,hrX-Hyperlink target "index-1" is not referenced.rr,rs,}rt,(h:Uh;jn,ubahPhubahPj+ubh7)ru,}rv,(h:UhR}rw,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMUtypej+uhc]rx,h)ry,}rz,(h:UhR}r{,(hV]hW]hU]hT]hX]uh;ju,hc]r|,hrX-Hyperlink target "index-2" is not referenced.r},r~,}r,(h:Uh;jy,ubahPhubahPj+ubh7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineM%Utypej+uhc]r,h)r,}r,(h:UhR}r,(hV]hW]hU]hT]hX]uh;j,hc]r,hrX7Hyperlink target "status-PBListener" is not referenced.r,r,}r,(h:Uh;j,ubahPhubahPj+ubh7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineM:Utypej+uhc]r,h)r,}r,(h:UhR}r,(hV]hW]hU]hT]hX]uh;j,hc]r,hrX7Hyperlink target "status-StatusPush" is not referenced.r,r,}r,(h:Uh;j,ubahPhubahPj+ubh7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMTUtypej+uhc]r,h)r,}r,(h:UhR}r,(hV]hW]hU]hT]hX]uh;j,hc]r,hrX;Hyperlink target "status-HttpStatusPush" is not referenced.r,r,}r,(h:Uh;j,ubahPhubahPj+ubh7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMgUtypej+uhc]r,h)r,}r,(h:UhR}r,(hV]hW]hU]hT]hX]uh;j,hc]r,hrX=Hyperlink target "status-GerritStatusPush" is not referenced.r,r,}r,(h:Uh;j,ubahPhubahPj+ubh7)r,}r,(h:UhR}r,(hV]UlevelKhT]hU]UsourcehIhW]hX]UlineMUtypej+uhc]r,h)r,}r,(h:UhR}r,(hV]hW]hU]hT]hX]uh;j,hc]r,hrX9Hyperlink target "status-GitHubStatus" is not referenced.r,r,}r,(h:Uh;j,ubahPhubahPj+ubeUreporterr,NUid_startr,KU autofootnotesr,]r,(j;j`eU citation_refsr,}r,Uindirect_targetsr,]r,Usettingsr,(cdocutils.frontend Values r,or,}r,(Ufootnote_backlinksr,KUrecord_dependenciesr,NU rfc_base_urlr,Uhttp://tools.ietf.org/html/r,U tracebackr,Upep_referencesr,NUstrip_commentsr,NU toc_backlinksr,Uentryr,U language_coder,Uenr,U datestampr,NU report_levelr,KU _destinationr,NU halt_levelr,KU strip_classesr,NhoNUerror_encoding_error_handlerr,Ubackslashreplacer,Udebugr,NUembed_stylesheetr,Uoutput_encoding_error_handlerr,Ustrictr,U sectnum_xformr,KUdump_transformsr,NU docinfo_xformr,KUwarning_streamr,NUpep_file_url_templater,Upep-%04dr,Uexit_status_levelr,KUconfigr,NUstrict_visitorr,NUcloak_email_addressesr,Utrim_footnote_reference_spacer,Uenvr,NUdump_pseudo_xmlr,NUexpose_internalsr,NUsectsubtitle_xformr,U source_linkr,NUrfc_referencesr,NUoutput_encodingr,Uutf-8r,U source_urlr,NUinput_encodingr,U utf-8-sigr,U_disable_configr,NU id_prefixr,UU tab_widthr,KUerror_encodingr,UUTF-8r,U_sourcer,UY/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-statustargets.rstr,Ugettext_compactr,U generatorr,NUdump_internalsr,NU smart_quotesr,U pep_base_urlr,Uhttp://www.python.org/dev/peps/r,Usyntax_highlightr,Ulongr,Uinput_encoding_error_handlerr,j,Uauto_id_prefixr,Uidr-Udoctitle_xformr-Ustrip_elements_with_classesr-NU _config_filesr-]Ufile_insertion_enabledr-U raw_enabledr-KU dump_settingsr-NubUsymbol_footnote_startr-KUidsr-}r -(jJjPj6j2hjjhBjjh jjMjIj'j'jjhhwjYjUj(j(hhjfjbjAj;jdj`j)h=jjjCj-#jfj&hghDjjjjj&j&h_hDjjjCjHjLjQjMjIjajj;jja)j])j&h=j=jChhBj(jHj:j6j8j;hhj%j%hj`jtjCjjhhjjh"joj`j\jjh'jhhhjOh-jj)j)hhjjjjjj jjhj>h(jjY(jU(jNjPh*j[jxjtj)j)jsjohZhDhh@jjjjj'j#jjhjj(j(hhuUsubstitution_namesr -}r -hPh\hR}r -(hV]hT]hU]UsourcehIhW]hX]uU footnotesr -]r-Urefidsr-}r-(jJ]r-jMah]r-jajA]r-j-#aj]r-jaj]r-jaj]r-jah_]r-h`aj]r-jajC]r-jEajL]r-jNajd]r-j&aj]r-jahZ]r-hNaj&]r-j&aj=]r-j@auub.PK6DS 7buildbot-v0.8.9/.doctrees/manual/cfg-schedulers.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XstringparameterqNXtry-schedulersqXnightly-schedulerqXnightlytriggerable schedulerq NXfixedparameterq NXdependent-schedulerq Xforcescheduler schedulerq NXcodebaseparameterq NUcontentsqNX schedulersqXtriggerable schedulerqNXchange filtersqNXforcesched parametersqNXbuildslavechoiceparameterqNXconfiguring-schedulersqXconfiguring schedulersqNXscheduler-singlebranchschedulerqXchoicestringparameterqNX authorizationqNXforcescheduler-parametersqXanybranchschedulerqXinheritbuildparameterqNXusernameparameterqNX,buildbot.schedulers.timed.NightlyTriggerableqX textparameterqNXperiodic-schedulerqXperiodic schedulerq NX intparameterq!NXbooleanparameterq"NXchange-filtersq#Xnightly schedulerq$NXsinglebranchschedulerq%NXdependent schedulerq&NXtry schedulersq'NXanypropertyparameterq(NXtriggerable-schedulerq)uUsubstitution_defsq*}q+Uparse_messagesq,]q-(cdocutils.nodes system_message q.)q/}q0(U rawsourceq1UUparentq2cdocutils.nodes section q3)q4}q5(h1UU referencedq6Kh2hUsourceq7cdocutils.nodes reprunicode q8XV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-schedulers.rstq9q:}q;bUexpect_referenced_by_nameq<}q=hcdocutils.nodes target q>)q?}q@(h1X.. _Schedulers:h2hh7h:UtagnameqAUtargetqBU attributesqC}qD(UidsqE]UbackrefsqF]UdupnamesqG]UclassesqH]UnamesqI]UrefidqJU schedulersqKuUlineqLKUdocumentqMhUchildrenqN]ubshAUsectionqOhC}qP(hG]qQX schedulersqRahH]hF]hE]qS(hKUid1qTehI]qUhauhLKhMhUexpect_referenced_by_idqV}qWhKh?shN]qX(cdocutils.nodes title qY)qZ}q[(h1X Schedulersq\h2h4h7h:hAUtitleq]hC}q^(hG]hH]hF]hE]hI]uhLKhMhhN]q_cdocutils.nodes Text q`X Schedulersqaqb}qc(h1h\h2hZubaubcdocutils.nodes topic qd)qe}qf(h1Uh2h4h7h:hAUtopicqghC}qh(hG]hH]qi(UcontentsqjUlocalqkehF]hE]qlUcontentsqmahI]qnhauhLK hMhhN]qocdocutils.nodes bullet_list qp)qq}qr(h1Uh2heh7NhAU bullet_listqshC}qt(hG]hH]hF]hE]hI]uhLNhMhhN]qu(cdocutils.nodes list_item qv)qw}qx(h1UhC}qy(hG]hH]hF]hE]hI]uh2hqhN]qzcdocutils.nodes paragraph q{)q|}q}(h1UhC}q~(hG]hH]hF]hE]hI]uh2hwhN]qcdocutils.nodes reference q)q}q(h1UhC}q(hE]qUid10qahF]hG]hH]hI]UrefidUconfiguring-schedulersquh2h|hN]qh`XConfiguring Schedulersqq}q(h1XConfiguring Schedulersqh2hubahAU referencequbahAU paragraphqubahAU list_itemqubhv)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hqhN]qh{)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hhN]qh)q}q(h1UhC}q(hE]qUid11qahF]hG]hH]hI]UrefidUchange-filtersquh2hhN]qh`XChange Filtersqq}q(h1XChange Filtersqh2hubahAhubahAhubahAhubhv)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hqhN]qh{)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hhN]qh)q}q(h1UhC}q(hE]qUid12qahF]hG]hH]hI]UrefidUsinglebranchschedulerquh2hhN]qh`XSingleBranchSchedulerqq}q(h1XSingleBranchSchedulerqh2hubahAhubahAhubahAhubhv)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hqhN]qh{)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hhN]qh)q}q(h1UhC}q(hE]qUid13qahF]hG]hH]hI]UrefidUanybranchschedulerquh2hhN]qh`XAnyBranchSchedulerqąq}q(h1XAnyBranchSchedulerqh2hubahAhubahAhubahAhubhv)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hqhN]qh{)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hhN]qh)q}q(h1UhC}q(hE]qUid14qahF]hG]hH]hI]UrefidUdependent-schedulerquh2hhN]qh`XDependent Schedulerqׅq}q(h1XDependent Schedulerqh2hubahAhubahAhubahAhubhv)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hqhN]qh{)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hhN]qh)q}q(h1UhC}q(hE]qUid15qahF]hG]hH]hI]UrefidUperiodic-schedulerquh2hhN]qh`XPeriodic Schedulerqꅁq}q(h1XPeriodic Schedulerqh2hubahAhubahAhubahAhubhv)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hqhN]qh{)q}q(h1UhC}q(hG]hH]hF]hE]hI]uh2hhN]qh)q}q(h1UhC}q(hE]qUid16qahF]hG]hH]hI]UrefidUnightly-schedulerquh2hhN]qh`XNightly Schedulerqq}q(h1XNightly Schedulerrh2hubahAhubahAhubahAhubhv)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2hqhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh)r }r (h1UhC}r (hE]r Uid17r ahF]hG]hH]hI]UrefidUtry-schedulersruh2jhN]rh`XTry Schedulersrr}r(h1XTry Schedulersrh2j ubahAhubahAhubahAhubhv)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2hqhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh)r}r(h1UhC}r(hE]rUid18r ahF]hG]hH]hI]UrefidUtriggerable-schedulerr!uh2jhN]r"h`XTriggerable Schedulerr#r$}r%(h1XTriggerable Schedulerr&h2jubahAhubahAhubahAhubhv)r'}r((h1UhC}r)(hG]hH]hF]hE]hI]uh2hqhN]r*h{)r+}r,(h1UhC}r-(hG]hH]hF]hE]hI]uh2j'hN]r.h)r/}r0(h1UhC}r1(hE]r2Uid19r3ahF]hG]hH]hI]UrefidUnightlytriggerable-schedulerr4uh2j+hN]r5h`XNightlyTriggerable Schedulerr6r7}r8(h1XNightlyTriggerable Schedulerr9h2j/ubahAhubahAhubahAhubhv)r:}r;(h1UhC}r<(hG]hH]hF]hE]hI]uh2hqhN]r=h{)r>}r?(h1UhC}r@(hG]hH]hF]hE]hI]uh2j:hN]rAh)rB}rC(h1UhC}rD(hE]rEUid20rFahF]hG]hH]hI]UrefidUforcescheduler-schedulerrGuh2j>hN]rHh`XForceScheduler SchedulerrIrJ}rK(h1XForceScheduler SchedulerrLh2jBubahAhubahAhubahAhubeubaubh{)rM}rN(h1X=Schedulers are responsible for initiating builds on builders.rOh2h4h7h:hAhhC}rP(hG]hH]hF]hE]hI]uhLK hMhhN]rQh`X=Schedulers are responsible for initiating builds on builders.rRrS}rT(h1jOh2jMubaubh{)rU}rV(h1XSome schedulers listen for changes from ChangeSources and generate build sets in response to these changes. Others generate build sets without changes, based on other events in the buildmaster.rWh2h4h7h:hAhhC}rX(hG]hH]hF]hE]hI]uhLK hMhhN]rYh`XSome schedulers listen for changes from ChangeSources and generate build sets in response to these changes. Others generate build sets without changes, based on other events in the buildmaster.rZr[}r\(h1jWh2jUubaubh>)r]}r^(h1X.. _Configuring-Schedulers:h2h4h7h:hAhBhC}r_(hE]hF]hG]hH]hI]hJhuhLKhMhhN]ubh3)r`}ra(h1Uh2h4h7h:h<}rbhj]shAhOhC}rc(hG]hH]hF]hE]rd(hUid2reehI]rf(hheuhLKhMhhV}rghj]shN]rh(hY)ri}rj(h1hh2j`h7h:hAh]hC}rk(hE]hF]hG]hH]hI]hJhuhLKhMhhN]rlh`XConfiguring Schedulersrmrn}ro(h1hh2jiubaubcsphinx.addnodes index rp)rq}rr(h1Uh2j`h7h:hAUindexrshC}rt(hE]hF]hG]hH]hI]Uentries]ru((UsingleXBuildmaster Config; schedulersXcfg-schedulersrvjvtrw(UsingleXschedulers (Buildmaster Config)jvjvtrxeuhLKhMhhN]ubh>)ry}rz(h1Uh2j`h7h:hAhBhC}r{(hE]hF]hG]hH]hI]hJjvuhLKhMhhN]ubh{)r|}r}(h1XoThe :bb:cfg:`schedulers` configuration parameter gives a list of Scheduler instances, each of which causes builds to be started on a particular set of Builders. The two basic Scheduler classes you are likely to start with are :class:`SingleBranchScheduler` and :class:`Periodic`, but you can write a customized subclass to implement more complicated build scheduling.h2j`h7h:h<}hAhhC}r~(hG]hH]hF]hE]rjvahI]uhLKhMhhV}rjvjyshN]r(h`XThe rr}r(h1XThe h2j|ubcsphinx.addnodes pending_xref r)r}r(h1X:bb:cfg:`schedulers`rh2j|h7h:hAU pending_xrefrhC}r(UreftypeXcfgUrefwarnrU reftargetrX schedulersU refdomainXbbrhE]hF]U refexplicithG]hH]hI]UrefdocrXmanual/cfg-schedulersruhLKhN]rcdocutils.nodes literal r)r}r(h1jhC}r(hG]hH]r(UxrefrjXbb-cfgrehF]hE]hI]uh2jhN]rh`X schedulersrr}r(h1Uh2jubahAUliteralrubaubh`X configuration parameter gives a list of Scheduler instances, each of which causes builds to be started on a particular set of Builders. The two basic Scheduler classes you are likely to start with are rr}r(h1X configuration parameter gives a list of Scheduler instances, each of which causes builds to be started on a particular set of Builders. The two basic Scheduler classes you are likely to start with are h2j|ubj)r}r(h1X:class:`SingleBranchScheduler`rh2j|h7h:hAjhC}r(UreftypeXclassjjXSingleBranchSchedulerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjUpy:classrNU py:modulerNuhLKhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`XSingleBranchSchedulerrr}r(h1Uh2jubahAjubaubh`X and rr}r(h1X and h2j|ubj)r}r(h1X:class:`Periodic`rh2j|h7h:hAjhC}r(UreftypeXclassjjXPeriodicU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`XPeriodicrr}r(h1Uh2jubahAjubaubh`XY, but you can write a customized subclass to implement more complicated build scheduling.rr}r(h1XY, but you can write a customized subclass to implement more complicated build scheduling.h2j|ubeubh{)r}r(h1XnScheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion::h2j`h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]rh`XmScheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion:rr}r(h1XmScheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion:h2jubaubcdocutils.nodes literal_block r)r}r(h1XHsched = SingleBranchScheduler(name="quick", builderNames=['lin', 'win'])h2j`h7h:hAU literal_blockrhC}r(U xml:spacerUpreserverhE]hF]hG]hH]hI]uhLK!hMhhN]rh`XHsched = SingleBranchScheduler(name="quick", builderNames=['lin', 'win'])rr}r(h1Uh2jubaubh{)r}r(h1XfThere are several common arguments for schedulers, although not all are available with all schedulers.rh2j`h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLK#hMhhN]rh`XfThere are several common arguments for schedulers, although not all are available with all schedulers.rr}r(h1jh2jubaubcdocutils.nodes definition_list r)r}r(h1Uh2j`h7h:hAUdefinition_listrhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(cdocutils.nodes definition_list_item r)r}r(h1X``name`` Each Scheduler must have a unique name. This is used in status displays, and is also available in the build property ``scheduler``. h2jh7h:hAUdefinition_list_itemrhC}r(hG]hH]hF]hE]hI]uhLK(hN]r(cdocutils.nodes term r)r}r(h1X``name``rh2jh7h:hAUtermrhC}r(hG]hH]hF]hE]hI]uhLK(hN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xnamerr}r(h1Uh2jubahAjubaubcdocutils.nodes definition r)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1XEach Scheduler must have a unique name. This is used in status displays, and is also available in the build property ``scheduler``.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLK'hN]r(h`XuEach Scheduler must have a unique name. This is used in status displays, and is also available in the build property rr}r(h1XuEach Scheduler must have a unique name. This is used in status displays, and is also available in the build property h2jubj)r}r(h1X ``scheduler``hC}r(hG]hH]hF]hE]hI]uh2jhN]r h`X schedulerr r }r (h1Uh2jubahAjubh`X.r }r(h1X.h2jubeubahAU definitionrubeubj)r}r(h1Xz``builderNames`` This is the set of builders which this scheduler should trigger, specified as a list of names (strings). h2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLK,hMhhN]r(j)r}r(h1X``builderNames``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLK,hN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X builderNamesrr}r(h1Uh2jubahAjubaubj)r }r!(h1UhC}r"(hG]hH]hF]hE]hI]uh2jhN]r#h{)r$}r%(h1XhThis is the set of builders which this scheduler should trigger, specified as a list of names (strings).r&h2j h7h:hAhhC}r'(hG]hH]hF]hE]hI]uhLK+hN]r(h`XhThis is the set of builders which this scheduler should trigger, specified as a list of names (strings).r)r*}r+(h1j&h2j$ubaubahAjubeubeubjp)r,}r-(h1Uh2j`h7h:hAjshC}r.(hE]hF]hG]hH]hI]Uentriesr/]r0(Usingler1XProperties; from schedulerUindex-0r2Utr3aUinliner4uhLK.hMhhN]ubh>)r5}r6(h1Uh2j`h7h:hAhBhC}r7(hE]hF]hG]hH]hI]hJj2uhLK/hMhhN]ubj)r8}r9(h1Uh2j`h7Nh<}hAjhC}r:(hG]hH]hF]hE]r;j2ahI]uhLNhMhhV}r<j2j5shN]r=(j)r>}r?(h1X``properties`` This is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The ``owner`` property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (:ref:`Doing-Things-With-Users`) for each triggered build. For example .. code-block:: python sched = Scheduler(..., properties = { 'owner' : [ 'zorro@company.com', 'silver@company.com' ] }) h2j8h7h:hAjhC}r@(hG]hH]hF]hE]hI]uhLK:hN]rA(j)rB}rC(h1X``properties``rDh2j>h7h:hAjhC}rE(hG]hH]hF]hE]hI]uhLK:hN]rFj)rG}rH(h1jDhC}rI(hG]hH]hF]hE]hI]uh2jBhN]rJh`X propertiesrKrL}rM(h1Uh2jGubahAjubaubj)rN}rO(h1UhC}rP(hG]hH]hF]hE]hI]uh2j>hN]rQ(h{)rR}rS(h1X6This is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The ``owner`` property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (:ref:`Doing-Things-With-Users`) for each triggered build. For exampleh2jNh7h:hAhhC}rT(hG]hH]hF]hE]hI]uhLK1hN]rU(h`XrThis is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The rVrW}rX(h1XrThis is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The h2jRubj)rY}rZ(h1X ``owner``hC}r[(hG]hH]hF]hE]hI]uh2jRhN]r\h`Xownerr]r^}r_(h1Uh2jYubahAjubh`Xv property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (r`ra}rb(h1Xv property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (h2jRubj)rc}rd(h1X:ref:`Doing-Things-With-Users`reh2jRh7h:hAjhC}rf(UreftypeXrefjjXdoing-things-with-usersU refdomainXstdrghE]hF]U refexplicithG]hH]hI]jjuhLK1hN]rhcdocutils.nodes emphasis ri)rj}rk(h1jehC}rl(hG]hH]rm(jjgXstd-refrnehF]hE]hI]uh2jchN]roh`XDoing-Things-With-Usersrprq}rr(h1Uh2jjubahAUemphasisrsubaubh`X') for each triggered build. For examplertru}rv(h1X') for each triggered build. For exampleh2jRubeubj)rw}rx(h1Xdsched = Scheduler(..., properties = { 'owner' : [ 'zorro@company.com', 'silver@company.com' ] })h2jNh7h:hAjhC}ry(UlinenosrzUlanguager{XpythonjjhE]hF]hG]hH]hI]uhLK7hN]r|h`Xdsched = Scheduler(..., properties = { 'owner' : [ 'zorro@company.com', 'silver@company.com' ] })r}r~}r(h1Uh2jwubaubehAjubeubj)r}r(h1X9``fileIsImportant`` A callable which takes one argument, a Change instance, and returns ``True`` if the change is worth building, and ``False`` if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important. h2j8h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKAhMhhN]r(j)r}r(h1X``fileIsImportant``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKAhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XfileIsImportantrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X$A callable which takes one argument, a Change instance, and returns ``True`` if the change is worth building, and ``False`` if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLK=hN]r(h`XDA callable which takes one argument, a Change instance, and returns rr}r(h1XDA callable which takes one argument, a Change instance, and returns h2jubj)r}r(h1X``True``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XTruerr}r(h1Uh2jubahAjubh`X& if the change is worth building, and rr}r(h1X& if the change is worth building, and h2jubj)r}r(h1X ``False``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XFalserr}r(h1Uh2jubahAjubh`X if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.rr}r(h1X if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.h2jubeubahAjubeubj)r}r(h1X``change_filter`` The change filter that will determine which changes are recognized by this scheduler; :ref:`Change-Filters`. Note that this is different from ``fileIsImportant``: if the change filter filters out a Change, then it is completely ignored by the scheduler. If a Change is allowed by the change filter, but is deemed unimportant, then it will not cause builds to start, but will be remembered and shown in status displays. h2j8h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKJhMhhN]r(j)r}r(h1X``change_filter``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKJhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X change_filterrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1XThe change filter that will determine which changes are recognized by this scheduler; :ref:`Change-Filters`. Note that this is different from ``fileIsImportant``: if the change filter filters out a Change, then it is completely ignored by the scheduler. If a Change is allowed by the change filter, but is deemed unimportant, then it will not cause builds to start, but will be remembered and shown in status displays.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKDhN]r(h`XVThe change filter that will determine which changes are recognized by this scheduler; rr}r(h1XVThe change filter that will determine which changes are recognized by this scheduler; h2jubj)r}r(h1X:ref:`Change-Filters`rh2jh7h:hAjhC}r(UreftypeXrefjjXchange-filtersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLKDhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`XChange-Filtersrr}r(h1Uh2jubahAjsubaubh`X$. Note that this is different from rr}r(h1X$. Note that this is different from h2jubj)r}r(h1X``fileIsImportant``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XfileIsImportantrr}r(h1Uh2jubahAjubh`X: if the change filter filters out a Change, then it is completely ignored by the scheduler. If a Change is allowed by the change filter, but is deemed unimportant, then it will not cause builds to start, but will be remembered and shown in status displays.rr}r(h1X: if the change filter filters out a Change, then it is completely ignored by the scheduler. If a Change is allowed by the change filter, but is deemed unimportant, then it will not cause builds to start, but will be remembered and shown in status displays.h2jubeubahAjubeubj)r}r(h1X``codebases`` When the scheduler processes data from more than 1 repository at the same time then a corresponding codebase definition should be passed for each repository. A codebase definition is a dictionary with one or more of the following keys: repository, branch, revision. The codebase definitions have also to be passed as dictionary. .. code-block:: python codebases = {'codebase1': {'repository':'....', 'branch':'default', 'revision': None}, 'codebase2': {'repository':'....'} } .. IMPORTANT:: ``codebases`` behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in ``codebases``. By default ``codebases`` is set to ``{'':{}}`` which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler. Buildsteps can have a reference to one of the codebases. The step will only get information (revision, branch etc.) that is related to that codebase. When a scheduler is triggered by new changes, these changes (having a codebase) will be incorporated by the new build. The buildsteps referencing to the codebases that have changes get information about those changes. The buildstep that references to a codebase that does not have changes in the build get the information from the codebases definition as configured in the scheduler. h2j8h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKghMhhN]r(j)r}r(h1X ``codebases``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKghN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X codebasesrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]r(h{)r}r(h1XHWhen the scheduler processes data from more than 1 repository at the same time then a corresponding codebase definition should be passed for each repository. A codebase definition is a dictionary with one or more of the following keys: repository, branch, revision. The codebase definitions have also to be passed as dictionary.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKMhN]rh`XHWhen the scheduler processes data from more than 1 repository at the same time then a corresponding codebase definition should be passed for each repository. A codebase definition is a dictionary with one or more of the following keys: repository, branch, revision. The codebase definitions have also to be passed as dictionary.rr}r(h1jh2jubaubj)r}r(h1Xcodebases = {'codebase1': {'repository':'....', 'branch':'default', 'revision': None}, 'codebase2': {'repository':'....'} }h2jh7h:hAjhC}r(jzj{XpythonjjhE]hF]hG]hH]hI]uhLKShN]rh`Xcodebases = {'codebase1': {'repository':'....', 'branch':'default', 'revision': None}, 'codebase2': {'repository':'....'} }rr}r(h1Uh2jubaubcdocutils.nodes important r )r }r (h1X4``codebases`` behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in ``codebases``. By default ``codebases`` is set to ``{'':{}}`` which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.hC}r (hG]hH]hF]hE]hI]uh2jhN]r h{)r}r(h1X4``codebases`` behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in ``codebases``. By default ``codebases`` is set to ``{'':{}}`` which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.h2j h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKZhN]r(j)r}r(h1X ``codebases``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X codebasesrr}r(h1Uh2jubahAjubh`X{ behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in rr}r(h1X{ behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in h2jubj)r}r(h1X ``codebases``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X codebasesr r!}r"(h1Uh2jubahAjubh`X . By default r#r$}r%(h1X . By default h2jubj)r&}r'(h1X ``codebases``hC}r((hG]hH]hF]hE]hI]uh2jhN]r)h`X codebasesr*r+}r,(h1Uh2j&ubahAjubh`X is set to r-r.}r/(h1X is set to h2jubj)r0}r1(h1X ``{'':{}}``hC}r2(hG]hH]hF]hE]hI]uh2jhN]r3h`X{'':{}}r4r5}r6(h1Uh2j0ubahAjubh`Xo which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.r7r8}r9(h1Xo which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.h2jubeubahAU importantr:ubh{)r;}r<(h1XBuildsteps can have a reference to one of the codebases. The step will only get information (revision, branch etc.) that is related to that codebase. When a scheduler is triggered by new changes, these changes (having a codebase) will be incorporated by the new build. The buildsteps referencing to the codebases that have changes get information about those changes. The buildstep that references to a codebase that does not have changes in the build get the information from the codebases definition as configured in the scheduler.r=h2jh7h:hAhhC}r>(hG]hH]hF]hE]hI]uhLK`hN]r?h`XBuildsteps can have a reference to one of the codebases. The step will only get information (revision, branch etc.) that is related to that codebase. When a scheduler is triggered by new changes, these changes (having a codebase) will be incorporated by the new build. The buildsteps referencing to the codebases that have changes get information about those changes. The buildstep that references to a codebase that does not have changes in the build get the information from the codebases definition as configured in the scheduler.r@rA}rB(h1j=h2j;ubaubehAjubeubj)rC}rD(h1X@``onlyImportant`` A boolean that, when ``True``, only adds important changes to the buildset as specified in the ``fileIsImportant`` callable. This means that unimportant changes are ignored the same way a ``change_filter`` filters changes. This defaults to ``False`` and only applies when ``fileIsImportant`` is given. h2j8h7h:hAjhC}rE(hG]hH]hF]hE]hI]uhLKohMhhN]rF(j)rG}rH(h1X``onlyImportant``rIh2jCh7h:hAjhC}rJ(hG]hH]hF]hE]hI]uhLKohN]rKj)rL}rM(h1jIhC}rN(hG]hH]hF]hE]hI]uh2jGhN]rOh`X onlyImportantrPrQ}rR(h1Uh2jLubahAjubaubj)rS}rT(h1UhC}rU(hG]hH]hF]hE]hI]uh2jChN]rVh{)rW}rX(h1X-A boolean that, when ``True``, only adds important changes to the buildset as specified in the ``fileIsImportant`` callable. This means that unimportant changes are ignored the same way a ``change_filter`` filters changes. This defaults to ``False`` and only applies when ``fileIsImportant`` is given.h2jSh7h:hAhhC}rY(hG]hH]hF]hE]hI]uhLKjhN]rZ(h`XA boolean that, when r[r\}r](h1XA boolean that, when h2jWubj)r^}r_(h1X``True``hC}r`(hG]hH]hF]hE]hI]uh2jWhN]rah`XTruerbrc}rd(h1Uh2j^ubahAjubh`XB, only adds important changes to the buildset as specified in the rerf}rg(h1XB, only adds important changes to the buildset as specified in the h2jWubj)rh}ri(h1X``fileIsImportant``hC}rj(hG]hH]hF]hE]hI]uh2jWhN]rkh`XfileIsImportantrlrm}rn(h1Uh2jhubahAjubh`XJ callable. This means that unimportant changes are ignored the same way a rorp}rq(h1XJ callable. This means that unimportant changes are ignored the same way a h2jWubj)rr}rs(h1X``change_filter``hC}rt(hG]hH]hF]hE]hI]uh2jWhN]ruh`X change_filterrvrw}rx(h1Uh2jrubahAjubh`X# filters changes. This defaults to ryrz}r{(h1X# filters changes. This defaults to h2jWubj)r|}r}(h1X ``False``hC}r~(hG]hH]hF]hE]hI]uh2jWhN]rh`XFalserr}r(h1Uh2j|ubahAjubh`X and only applies when rr}r(h1X and only applies when h2jWubj)r}r(h1X``fileIsImportant``hC}r(hG]hH]hF]hE]hI]uh2jWhN]rh`XfileIsImportantrr}r(h1Uh2jubahAjubh`X is given.rr}r(h1X is given.h2jWubeubahAjubeubj)r}r(h1XM``reason`` A string that will be used as the reason for the triggered build. h2j8h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKrhMhhN]r(j)r}r(h1X ``reason``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKrhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xreasonrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1XAA string that will be used as the reason for the triggered build.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKrhN]rh`XAA string that will be used as the reason for the triggered build.rr}r(h1jh2jubaubahAjubeubj)r}r(h1X+``createAbsoluteSourceStamps`` This option only has effect when using multiple codebases. When ``True``, it uses the last seen revision for each codebase that does not have a change. When ``False``, the default value, codebases without changes will use the revision from the ``codebases`` argument. h2j8h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKxhMhhN]r(j)r}r(h1X``createAbsoluteSourceStamps``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKxhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XcreateAbsoluteSourceStampsrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X This option only has effect when using multiple codebases. When ``True``, it uses the last seen revision for each codebase that does not have a change. When ``False``, the default value, codebases without changes will use the revision from the ``codebases`` argument.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKuhN]r(h`X@This option only has effect when using multiple codebases. When rr}r(h1X@This option only has effect when using multiple codebases. When h2jubj)r}r(h1X``True``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XTruerr}r(h1Uh2jubahAjubh`XU, it uses the last seen revision for each codebase that does not have a change. When rr}r(h1XU, it uses the last seen revision for each codebase that does not have a change. When h2jubj)r}r(h1X ``False``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XFalserr}r(h1Uh2jubahAjubh`XN, the default value, codebases without changes will use the revision from the rr}r(h1XN, the default value, codebases without changes will use the revision from the h2jubj)r}r(h1X ``codebases``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X codebasesrr}r(h1Uh2jubahAjubh`X argument.rr}r(h1X argument.h2jubeubahAjubeubeubh{)r}r(h1XThe remaining subsections represent a catalog of the available Scheduler types. All these Schedulers are defined in modules under :mod:`buildbot.schedulers`, and the docstrings there are the best source of documentation on the arguments taken by each one.h2j`h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKzhMhhN]r(h`XThe remaining subsections represent a catalog of the available Scheduler types. All these Schedulers are defined in modules under rr}r(h1XThe remaining subsections represent a catalog of the available Scheduler types. All these Schedulers are defined in modules under h2jubj)r}r(h1X:mod:`buildbot.schedulers`rh2jh7h:hAjhC}r(UreftypeXmodjjXbuildbot.schedulersU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKzhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-modrehF]hE]hI]uh2jhN]rh`Xbuildbot.schedulersrr}r(h1Uh2jubahAjubaubh`Xc, and the docstrings there are the best source of documentation on the arguments taken by each one.rr}r(h1Xc, and the docstrings there are the best source of documentation on the arguments taken by each one.h2jubeubh>)r}r(h1X.. _Change-Filters:h2j`h7h:hAhBhC}r(hE]hF]hG]hH]hI]hJhuhLKhMhhN]ubeubh3)r}r(h1Uh2h4h7h:h<}rh#jshAhOhC}r(hG]hH]hF]hE]r(hUid3rehI]r(hh#euhLKhMhhV}rhjshN]r (hY)r }r (h1hh2jh7h:hAh]hC}r (hE]hF]hG]hH]hI]hJhuhLKhMhhN]r h`XChange Filtersrr}r(h1hh2j ubaubh{)r}r(h1XSeveral schedulers perform filtering on an incoming set of changes. The filter can most generically be specified as a :class:`ChangeFilter`. Set up a :class:`ChangeFilter` like this::h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h`XwSeveral schedulers perform filtering on an incoming set of changes. The filter can most generically be specified as a rr}r(h1XwSeveral schedulers perform filtering on an incoming set of changes. The filter can most generically be specified as a h2jubj)r}r(h1X:class:`ChangeFilter`rh2jh7h:hAjhC}r(UreftypeXclassjjX ChangeFilterU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rj)r}r(h1jhC}r (hG]hH]r!(jjXpy-classr"ehF]hE]hI]uh2jhN]r#h`X ChangeFilterr$r%}r&(h1Uh2jubahAjubaubh`X . Set up a r'r(}r)(h1X . Set up a h2jubj)r*}r+(h1X:class:`ChangeFilter`r,h2jh7h:hAjhC}r-(UreftypeXclassjjX ChangeFilterU refdomainXpyr.hE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]r/j)r0}r1(h1j,hC}r2(hG]hH]r3(jj.Xpy-classr4ehF]hE]hI]uh2j*hN]r5h`X ChangeFilterr6r7}r8(h1Uh2j0ubahAjubaubh`X like this:r9r:}r;(h1X like this:h2jubeubj)r<}r=(h1Xfrom buildbot.changes.filter import ChangeFilter my_filter = ChangeFilter( project_re="^baseproduct/.*", branch="devel")h2jh7h:hAjhC}r>(jjhE]hF]hG]hH]hI]uhLKhMhhN]r?h`Xfrom buildbot.changes.filter import ChangeFilter my_filter = ChangeFilter( project_re="^baseproduct/.*", branch="devel")r@rA}rB(h1Uh2j<ubaubh{)rC}rD(h1XEand then add it to a scheduler with the ``change_filter`` parameter::rEh2jh7h:hAhhC}rF(hG]hH]hF]hE]hI]uhLKhMhhN]rG(h`X(and then add it to a scheduler with the rHrI}rJ(h1X(and then add it to a scheduler with the h2jCubj)rK}rL(h1X``change_filter``hC}rM(hG]hH]hF]hE]hI]uh2jChN]rNh`X change_filterrOrP}rQ(h1Uh2jKubahAjubh`X parameter:rRrS}rT(h1X parameter:h2jCubeubj)rU}rV(h1X:sch = SomeSchedulerClass(..., change_filter=my_filter)h2jh7h:hAjhC}rW(jjhE]hF]hG]hH]hI]uhLKhMhhN]rXh`X:sch = SomeSchedulerClass(..., change_filter=my_filter)rYrZ}r[(h1Uh2jUubaubh{)r\}r](h1X=There are five attributes of changes on which you can filter:r^h2jh7h:hAhhC}r_(hG]hH]hF]hE]hI]uhLKhMhhN]r`h`X=There are five attributes of changes on which you can filter:rarb}rc(h1j^h2j\ubaubj)rd}re(h1Uh2jh7h:hAjhC}rf(hG]hH]hF]hE]hI]uhLNhMhhN]rg(j)rh}ri(h1X@``project`` the project string, as defined by the ChangeSource. h2jdh7h:hAjhC}rj(hG]hH]hF]hE]hI]uhLKhN]rk(j)rl}rm(h1X ``project``rnh2jhh7h:hAjhC}ro(hG]hH]hF]hE]hI]uhLKhN]rpj)rq}rr(h1jnhC}rs(hG]hH]hF]hE]hI]uh2jlhN]rth`Xprojectrurv}rw(h1Uh2jqubahAjubaubj)rx}ry(h1UhC}rz(hG]hH]hF]hE]hI]uh2jhhN]r{h{)r|}r}(h1X3the project string, as defined by the ChangeSource.r~h2jxh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X3the project string, as defined by the ChangeSource.rr}r(h1j~h2j|ubaubahAjubeubj)r}r(h1X=``repository`` the repository in which this change occurred. h2jdh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(j)r}r(h1X``repository``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X repositoryrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X-the repository in which this change occurred.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X-the repository in which this change occurred.rr}r(h1jh2jubaubahAjubeubj)r}r(h1Xr``branch`` the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by ``None``. h2jdh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(j)r}r(h1X ``branch``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xbranchrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1Xfthe branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by ``None``.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]r(h`X]the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by rr}r(h1X]the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by h2jubj)r}r(h1X``None``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XNonerr}r(h1Uh2jubahAjubh`X.r}r(h1X.h2jubeubahAjubeubj)r}r(h1XA``category`` the category, again as defined by the ChangeSource. h2jdh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(j)r}r(h1X ``category``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xcategoryrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X3the category, again as defined by the ChangeSource.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X3the category, again as defined by the ChangeSource.rr}r(h1jh2jubaubahAjubeubj)r}r(h1X$``codebase`` the change's codebase. h2jdh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(j)r}r(h1X ``codebase``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xcodebaserr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1Xthe change's codebase.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`Xthe change's codebase.rr}r(h1jh2jubaubahAjubeubeubh{)r}r(h1XFFor each attribute, the filter can look for a single, specific value::rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]rh`XEFor each attribute, the filter can look for a single, specific value:rr}r(h1XEFor each attribute, the filter can look for a single, specific value:h2jubaubj)r}r(h1X/my_filter = ChangeFilter(project = 'myproject')h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLKhMhhN]rh`X/my_filter = ChangeFilter(project = 'myproject')rr }r (h1Uh2jubaubh{)r }r (h1X"or accept any of a set of values::r h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]rh`X!or accept any of a set of values:rr}r(h1X!or accept any of a set of values:h2j ubaubj)r}r(h1X@my_filter = ChangeFilter(project = ['myproject', 'jimsproject'])h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLKhMhhN]rh`X@my_filter = ChangeFilter(project = ['myproject', 'jimsproject'])rr}r(h1Uh2jubaubh{)r}r(h1XQor apply a regular expression, using the attribute name with a "``_re``" suffix::h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h`X@or apply a regular expression, using the attribute name with a "rr}r (h1X@or apply a regular expression, using the attribute name with a "h2jubj)r!}r"(h1X``_re``hC}r#(hG]hH]hF]hE]hI]uh2jhN]r$h`X_rer%r&}r'(h1Uh2j!ubahAjubh`X " suffix:r(r)}r*(h1X " suffix:h2jubeubj)r+}r,(h1Xmy_filter = ChangeFilter(category_re = '.*deve.*') # or, to use regular expression flags: import re my_filter = ChangeFilter(category_re = re.compile('.*deve.*', re.I))h2jh7h:hAjhC}r-(jjhE]hF]hG]hH]hI]uhLKhMhhN]r.h`Xmy_filter = ChangeFilter(category_re = '.*deve.*') # or, to use regular expression flags: import re my_filter = ChangeFilter(category_re = re.compile('.*deve.*', re.I))r/r0}r1(h1Uh2j+ubaubh{)r2}r3(h1X[For anything more complicated, define a Python function to recognize the strings you want::h2jh7h:hAhhC}r4(hG]hH]hF]hE]hI]uhLKhMhhN]r5h`XZFor anything more complicated, define a Python function to recognize the strings you want:r6r7}r8(h1XZFor anything more complicated, define a Python function to recognize the strings you want:h2j2ubaubj)r9}r:(h1Xdef my_branch_fn(branch): return branch in branches_to_build and branch not in branches_to_ignore my_filter = ChangeFilter(branch_fn = my_branch_fn)h2jh7h:hAjhC}r;(jjhE]hF]hG]hH]hI]uhLKhMhhN]r<h`Xdef my_branch_fn(branch): return branch in branches_to_build and branch not in branches_to_ignore my_filter = ChangeFilter(branch_fn = my_branch_fn)r=r>}r?(h1Uh2j9ubaubh{)r@}rA(h1XThe special argument ``filter_fn`` can be used to specify a function that is given the entire Change object, and returns a boolean.h2jh7h:hAhhC}rB(hG]hH]hF]hE]hI]uhLKhMhhN]rC(h`XThe special argument rDrE}rF(h1XThe special argument h2j@ubj)rG}rH(h1X ``filter_fn``hC}rI(hG]hH]hF]hE]hI]uh2j@hN]rJh`X filter_fnrKrL}rM(h1Uh2jGubahAjubh`Xa can be used to specify a function that is given the entire Change object, and returns a boolean.rNrO}rP(h1Xa can be used to specify a function that is given the entire Change object, and returns a boolean.h2j@ubeubh{)rQ}rR(h1X-The entire set of allowed arguments, then, isrSh2jh7h:hAhhC}rT(hG]hH]hF]hE]hI]uhLKhMhhN]rUh`X-The entire set of allowed arguments, then, isrVrW}rX(h1jSh2jQubaubcdocutils.nodes table rY)rZ}r[(h1Uh2jh7h:hAUtabler\hC}r](hG]hH]hF]hE]hI]uhLNhMhhN]r^cdocutils.nodes tgroup r_)r`}ra(h1UhC}rb(hE]hF]hG]hH]hI]UcolsKuh2jZhN]rc(cdocutils.nodes colspec rd)re}rf(h1UhC}rg(hE]hF]hG]hH]hI]UcolwidthK uh2j`hN]hAUcolspecrhubjd)ri}rj(h1UhC}rk(hE]hF]hG]hH]hI]UcolwidthKuh2j`hN]hAjhubjd)rl}rm(h1UhC}rn(hE]hF]hG]hH]hI]UcolwidthKuh2j`hN]hAjhubcdocutils.nodes tbody ro)rp}rq(h1UhC}rr(hG]hH]hF]hE]hI]uh2j`hN]rs(cdocutils.nodes row rt)ru}rv(h1UhC}rw(hG]hH]hF]hE]hI]uh2jphN]rx(cdocutils.nodes entry ry)rz}r{(h1UhC}r|(hG]hH]hF]hE]hI]uh2juhN]r}h{)r~}r(h1Xprojectrh2jzh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`Xprojectrr}r(h1jh2j~ubaubahAUentryrubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2juhN]rh{)r}r(h1X project_rerh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X project_rerr}r(h1jh2jubaubahAjubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2juhN]rh{)r}r(h1X project_fnrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X project_fnrr}r(h1jh2jubaubahAjubehAUrowrubjt)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jphN]r(jy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X repositoryrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X repositoryrr}r(h1jh2jubaubahAjubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X repository_rerh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X repository_rerr}r(h1jh2jubaubahAjubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X repository_fnrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X repository_fnrr}r(h1jh2jubaubahAjubehAjubjt)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jphN]r(jy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1Xbranchrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`Xbranchrr}r(h1jh2jubaubahAjubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X branch_rerh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X branch_rerr}r(h1jh2jubaubahAjubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X branch_fnrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X branch_fnrr}r(h1jh2jubaubahAjubehAjubjt)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jphN]r(jy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1Xcategoryrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`Xcategoryrr}r(h1jh2jubaubahAjubjy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X category_rerh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X category_rer r }r (h1jh2jubaubahAjubjy)r }r (h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X category_fnrh2j h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`X category_fnrr}r(h1jh2jubaubahAjubehAjubjt)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jphN]r(jy)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r }r!(h1Xcodebaser"h2jh7h:hAhhC}r#(hG]hH]hF]hE]hI]uhLKhN]r$h`Xcodebaser%r&}r'(h1j"h2j ubaubahAjubjy)r(}r)(h1UhC}r*(hG]hH]hF]hE]hI]uh2jhN]r+h{)r,}r-(h1X codebase_rer.h2j(h7h:hAhhC}r/(hG]hH]hF]hE]hI]uhLKhN]r0h`X codebase_rer1r2}r3(h1j.h2j,ubaubahAjubjy)r4}r5(h1UhC}r6(hG]hH]hF]hE]hI]uh2jhN]r7h{)r8}r9(h1X codebase_fnr:h2j4h7h:hAhhC}r;(hG]hH]hF]hE]hI]uhLKhN]r<h`X codebase_fnr=r>}r?(h1j:h2j8ubaubahAjubehAjubjt)r@}rA(h1UhC}rB(hG]hH]hF]hE]hI]uh2jphN]rCjy)rD}rE(h1UhC}rF(hE]UmorecolsKhF]hG]hH]hI]uh2j@hN]rGh{)rH}rI(h1X filter_fnrJh2jDh7h:hAhhC}rK(hG]hH]hF]hE]hI]uhLKhN]rLh`X filter_fnrMrN}rO(h1jJh2jHubaubahAjubahAjubehAUtbodyrPubehAUtgrouprQubaubh{)rR}rS(h1XA Change passes the filter only if *all* arguments are satisfied. If no filter object is given to a scheduler, then all changes will be built (subject to any other restrictions the scheduler enforces).h2jh7h:hAhhC}rT(hG]hH]hF]hE]hI]uhLKhMhhN]rU(h`X#A Change passes the filter only if rVrW}rX(h1X#A Change passes the filter only if h2jRubji)rY}rZ(h1X*all*hC}r[(hG]hH]hF]hE]hI]uh2jRhN]r\h`Xallr]r^}r_(h1Uh2jYubahAjsubh`X arguments are satisfied. If no filter object is given to a scheduler, then all changes will be built (subject to any other restrictions the scheduler enforces).r`ra}rb(h1X arguments are satisfied. If no filter object is given to a scheduler, then all changes will be built (subject to any other restrictions the scheduler enforces).h2jRubeubjp)rc}rd(h1Uh2jh7h:hAjshC}re(hE]hF]hG]hH]hI]Uentries]rf((UsingleX!Schedulers; SingleBranchSchedulerXsched-SingleBranchSchedulerrgjgtrh(UsingleXSingleBranchScheduler SchedulerjgjgtrieuhLKhMhhN]ubh>)rj}rk(h1Uh2jh7h:hAhBhC}rl(hG]hH]hF]hE]rmjgahI]uhLKhMhhN]ubjp)rn}ro(h1Uh2jh7h:hAjshC}rp(hE]hF]hG]hH]hI]Uentries]rq((UsingleXSchedulers; SchedulerXsched-Schedulerrrjrtrs(UsingleXScheduler SchedulerjrjrtrteuhLKhMhhN]ubh>)ru}rv(h1Uh2jh7h:hAhBhC}rw(hE]hF]hG]hH]hI]hJjruhLKhMhhN]ubh>)rx}ry(h1X$.. _Scheduler-SingleBranchScheduler:h2jh7h:h<}hAhBhC}rz(hE]hF]hG]hH]hI]hJUscheduler-singlebranchschedulerr{uhLKhMhhV}r|jrjushN]ubeubh3)r}}r~(h1Uh2h4h7h:h<}rhjxshAhOhC}r(hG]hH]hF]hE]r(hj{jrehI]r(h%heuhLKhMhhV}r(jrjuj{jxuhN]r(hY)r}r(h1hh2j}h7h:hAh]hC}r(hE]hF]hG]hH]hI]hJhuhLKhMhhN]rh`XSingleBranchSchedulerrr}r(h1hh2jubaubh{)r}r(h1X{This is the original and still most popular scheduler class. It follows exactly one branch, and starts a configurable tree-stable-timer after each change on that branch. When the timer expires, it starts a build on some set of Builders. The Scheduler accepts a :meth:`fileIsImportant` function which can be used to ignore some Changes if they do not affect any *important* files.h2j}h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h`XThis is the original and still most popular scheduler class. It follows exactly one branch, and starts a configurable tree-stable-timer after each change on that branch. When the timer expires, it starts a build on some set of Builders. The Scheduler accepts a rr}r(h1XThis is the original and still most popular scheduler class. It follows exactly one branch, and starts a configurable tree-stable-timer after each change on that branch. When the timer expires, it starts a build on some set of Builders. The Scheduler accepts a h2jubj)r}r(h1X:meth:`fileIsImportant`rh2jh7h:hAjhC}r(UreftypeXmethjjXfileIsImportantU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-methrehF]hE]hI]uh2jhN]rh`XfileIsImportantrr}r(h1Uh2jubahAjubaubh`XM function which can be used to ignore some Changes if they do not affect any rr}r(h1XM function which can be used to ignore some Changes if they do not affect any h2jubji)r}r(h1X *important*hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X importantrr}r(h1Uh2jubahAjsubh`X files.rr}r(h1X files.h2jubeubh{)r}r(h1X1If ``treeStableTimer`` is not set, then this scheduler starts a build for every Change that matches its ``change_filter`` and statsfies :meth:`fileIsImportant`. If ``treeStableTimer`` is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.h2j}h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h`XIf rr}r(h1XIf h2jubj)r}r(h1X``treeStableTimer``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XtreeStableTimerrr}r(h1Uh2jubahAjubh`XR is not set, then this scheduler starts a build for every Change that matches its rr}r(h1XR is not set, then this scheduler starts a build for every Change that matches its h2jubj)r}r(h1X``change_filter``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X change_filterrr}r(h1Uh2jubahAjubh`X and statsfies rr}r(h1X and statsfies h2jubj)r}r(h1X:meth:`fileIsImportant`rh2jh7h:hAjhC}r(UreftypeXmethjjXfileIsImportantU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-methrehF]hE]hI]uh2jhN]rh`XfileIsImportantrr}r(h1Uh2jubahAjubaubh`X. If rr}r(h1X. If h2jubj)r}r(h1X``treeStableTimer``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XtreeStableTimerrr}r(h1Uh2jubahAjubh`Xz is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.rr}r(h1Xz is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.h2jubeubcdocutils.nodes note r)r}r(h1XThe behavior of this scheduler is undefined, if ``treeStableTimer`` is set, and changes from multiple branches, repositories or codebases are accepted by the filter.rh2j}h7h:hAUnoterhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1jh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]r(h`X0The behavior of this scheduler is undefined, if rr}r(h1X0The behavior of this scheduler is undefined, if h2jubj)r}r(h1X``treeStableTimer``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XtreeStableTimerrr}r(h1Uh2jubahAjubh`Xb is set, and changes from multiple branches, repositories or codebases are accepted by the filter.rr}r(h1Xb is set, and changes from multiple branches, repositories or codebases are accepted by the filter.h2jubeubaubj)r}r(h1XThe ``codebases`` argument will filter out codebases not specified there, but *won't* filter based on the branches specified there.rh2j}h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1jh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]r(h`XThe rr}r (h1XThe h2jubj)r }r (h1X ``codebases``hC}r (hG]hH]hF]hE]hI]uh2jhN]r h`X codebasesrr}r(h1Uh2j ubahAjubh`X= argument will filter out codebases not specified there, but rr}r(h1X= argument will filter out codebases not specified there, but h2jubji)r}r(h1X*won't*hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xwon'trr}r(h1Uh2jubahAjsubh`X. filter based on the branches specified there.rr}r(h1X. filter based on the branches specified there.h2jubeubaubh{)r}r(h1X$The arguments to this scheduler are:r h2j}h7h:hAhhC}r!(hG]hH]hF]hE]hI]uhLKhMhhN]r"h`X$The arguments to this scheduler are:r#r$}r%(h1j h2jubaubh{)r&}r'(h1X``name``r(h2j}h7h:hAhhC}r)(hG]hH]hF]hE]hI]uhLKhMhhN]r*j)r+}r,(h1j(hC}r-(hG]hH]hF]hE]hI]uh2j&hN]r.h`Xnamer/r0}r1(h1Uh2j+ubahAjubaubh{)r2}r3(h1X``builderNames``r4h2j}h7h:hAhhC}r5(hG]hH]hF]hE]hI]uhLKhMhhN]r6j)r7}r8(h1j4hC}r9(hG]hH]hF]hE]hI]uh2j2hN]r:h`X builderNamesr;r<}r=(h1Uh2j7ubahAjubaubh{)r>}r?(h1X``properties``r@h2j}h7h:hAhhC}rA(hG]hH]hF]hE]hI]uhLKhMhhN]rBj)rC}rD(h1j@hC}rE(hG]hH]hF]hE]hI]uh2j>hN]rFh`X propertiesrGrH}rI(h1Uh2jCubahAjubaubh{)rJ}rK(h1X``fileIsImportant``rLh2j}h7h:hAhhC}rM(hG]hH]hF]hE]hI]uhLKhMhhN]rNj)rO}rP(h1jLhC}rQ(hG]hH]hF]hE]hI]uh2jJhN]rRh`XfileIsImportantrSrT}rU(h1Uh2jOubahAjubaubh{)rV}rW(h1X``change_filter``rXh2j}h7h:hAhhC}rY(hG]hH]hF]hE]hI]uhLKhMhhN]rZj)r[}r\(h1jXhC}r](hG]hH]hF]hE]hI]uh2jVhN]r^h`X change_filterr_r`}ra(h1Uh2j[ubahAjubaubh{)rb}rc(h1X``onlyImportant``rdh2j}h7h:hAhhC}re(hG]hH]hF]hE]hI]uhLKhMhhN]rfj)rg}rh(h1jdhC}ri(hG]hH]hF]hE]hI]uh2jbhN]rjh`X onlyImportantrkrl}rm(h1Uh2jgubahAjubaubh{)rn}ro(h1X ``reason``rph2j}h7h:hAhhC}rq(hG]hH]hF]hE]hI]uhLKhMhhN]rrj)rs}rt(h1jphC}ru(hG]hH]hF]hE]hI]uh2jnhN]rvh`Xreasonrwrx}ry(h1Uh2jsubahAjubaubj)rz}r{(h1Uh2j}h7h:hAjhC}r|(hG]hH]hF]hE]hI]uhLNhMhhN]r}(j)r~}r(h1XB``createAbsoluteSourceStamps`` See :ref:`Configuring-Schedulers`. h2jzh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhN]r(j)r}r(h1X``createAbsoluteSourceStamps``rh2j~h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLKhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XcreateAbsoluteSourceStampsrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2j~hN]rh{)r}r(h1X"See :ref:`Configuring-Schedulers`.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]r(h`XSee rr}r(h1XSee h2jubj)r}r(h1X:ref:`Configuring-Schedulers`rh2jh7h:hAjhC}r(UreftypeXrefjjXconfiguring-schedulersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`XConfiguring-Schedulersrr}r(h1Uh2jubahAjsubaubh`X.r}r(h1X.h2jubeubahAjubeubj)r}r(h1Xn``treeStableTimer`` The scheduler will wait for this many seconds before starting the build. If new changes are made during this interval, the timer will be restarted, so really the build will be started after a change and then after this many seconds of inactivity. If ``treeStableTimer`` is ``None``, then a separate build is started immediately for each Change. h2jzh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X``treeStableTimer``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XtreeStableTimerrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]r(h{)r}r(h1XThe scheduler will wait for this many seconds before starting the build. If new changes are made during this interval, the timer will be restarted, so really the build will be started after a change and then after this many seconds of inactivity.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLKhN]rh`XThe scheduler will wait for this many seconds before starting the build. If new changes are made during this interval, the timer will be restarted, so really the build will be started after a change and then after this many seconds of inactivity.rr}r(h1jh2jubaubh{)r}r(h1XaIf ``treeStableTimer`` is ``None``, then a separate build is started immediately for each Change.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XIf rr}r(h1XIf h2jubj)r}r(h1X``treeStableTimer``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XtreeStableTimerrr}r(h1Uh2jubahAjubh`X is rr}r(h1X is h2jubj)r}r(h1X``None``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XNonerr}r(h1Uh2jubahAjubh`X?, then a separate build is started immediately for each Change.rr}r(h1X?, then a separate build is started immediately for each Change.h2jubeubehAjubeubj)r}r(h1X9``fileIsImportant`` A callable which takes one argument, a Change instance, and returns ``True`` if the change is worth building, and ``False`` if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important. h2jzh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM hMhhN]r(j)r}r(h1X``fileIsImportant``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM hN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XfileIsImportantrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X$A callable which takes one argument, a Change instance, and returns ``True`` if the change is worth building, and ``False`` if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XDA callable which takes one argument, a Change instance, and returns rr}r(h1XDA callable which takes one argument, a Change instance, and returns h2jubj)r}r(h1X``True``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XTruerr}r(h1Uh2jubahAjubh`X& if the change is worth building, and rr}r(h1X& if the change is worth building, and h2jubj)r}r(h1X ``False``hC}r(hG]hH]hF]hE]hI]uh2jhN]r h`XFalser r }r (h1Uh2jubahAjubh`X if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.r r}r(h1X if it is not. Unimportant Changes are accumulated until the build is triggered by an important change. The default value of None means that all Changes are important.h2jubeubahAjubeubj)r}r(h1X``categories`` (deprecated; use change_filter) A list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored. h2jzh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM hMhhN]r(j)r}r(h1X.``categories`` (deprecated; use change_filter)rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM hN]r(j)r}r(h1X``categories``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X categoriesrr}r(h1Uh2jubahAjubh`X (deprecated; use change_filter)r r!}r"(h1X (deprecated; use change_filter)h2jubeubj)r#}r$(h1UhC}r%(hG]hH]hF]hE]hI]uh2jhN]r&h{)r'}r((h1XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.r)h2j#h7h:hAhhC}r*(hG]hH]hF]hE]hI]uhLM hN]r+h`XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.r,r-}r.(h1j)h2j'ubaubahAjubeubj)r/}r0(h1XY``branch`` (deprecated; use change_filter) The scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting ``branch`` equal to the special value of ``None`` means it should only pay attention to the default branch. .. note:: ``None`` is a keyword, not a string, so write ``None`` and not ``"None"``. h2jzh7h:hAjhC}r1(hG]hH]hF]hE]hI]uhLMhMhhN]r2(j)r3}r4(h1X*``branch`` (deprecated; use change_filter)r5h2j/h7h:hAjhC}r6(hG]hH]hF]hE]hI]uhLMhN]r7(j)r8}r9(h1X ``branch``hC}r:(hG]hH]hF]hE]hI]uh2j3hN]r;h`Xbranchr<r=}r>(h1Uh2j8ubahAjubh`X (deprecated; use change_filter)r?r@}rA(h1X (deprecated; use change_filter)h2j3ubeubj)rB}rC(h1UhC}rD(hG]hH]hF]hE]hI]uh2j/hN]rE(h{)rF}rG(h1XThe scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting ``branch`` equal to the special value of ``None`` means it should only pay attention to the default branch.h2jBh7h:hAhhC}rH(hG]hH]hF]hE]hI]uhLMhN]rI(h`XhThe scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting rJrK}rL(h1XhThe scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting h2jFubj)rM}rN(h1X ``branch``hC}rO(hG]hH]hF]hE]hI]uh2jFhN]rPh`XbranchrQrR}rS(h1Uh2jMubahAjubh`X equal to the special value of rTrU}rV(h1X equal to the special value of h2jFubj)rW}rX(h1X``None``hC}rY(hG]hH]hF]hE]hI]uh2jFhN]rZh`XNoner[r\}r](h1Uh2jWubahAjubh`X: means it should only pay attention to the default branch.r^r_}r`(h1X: means it should only pay attention to the default branch.h2jFubeubj)ra}rb(h1XJ``None`` is a keyword, not a string, so write ``None`` and not ``"None"``.hC}rc(hG]hH]hF]hE]hI]uh2jBhN]rdh{)re}rf(h1XJ``None`` is a keyword, not a string, so write ``None`` and not ``"None"``.h2jah7h:hAhhC}rg(hG]hH]hF]hE]hI]uhLMhN]rh(j)ri}rj(h1X``None``hC}rk(hG]hH]hF]hE]hI]uh2jehN]rlh`XNonermrn}ro(h1Uh2jiubahAjubh`X& is a keyword, not a string, so write rprq}rr(h1X& is a keyword, not a string, so write h2jeubj)rs}rt(h1X``None``hC}ru(hG]hH]hF]hE]hI]uh2jehN]rvh`XNonerwrx}ry(h1Uh2jsubahAjubh`X and not rzr{}r|(h1X and not h2jeubj)r}}r~(h1X ``"None"``hC}r(hG]hH]hF]hE]hI]uh2jehN]rh`X"None"rr}r(h1Uh2j}ubahAjubh`X.r}r(h1X.h2jeubeubahAjubehAjubeubeubh{)r}r(h1X Example::rh2j}h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XExample:rr}r(h1XExample:h2jubaubj)r}r(h1XFfrom buildbot.schedulers.basic import SingleBranchScheduler from buildbot.changes import filter quick = SingleBranchScheduler(name="quick", change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=60, builderNames=["quick-linux", "quick-netbsd"]) full = SingleBranchScheduler(name="full", change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=5*60, builderNames=["full-linux", "full-netbsd", "full-OSX"]) c['schedulers'] = [quick, full]h2j}h7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`XFfrom buildbot.schedulers.basic import SingleBranchScheduler from buildbot.changes import filter quick = SingleBranchScheduler(name="quick", change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=60, builderNames=["quick-linux", "quick-netbsd"]) full = SingleBranchScheduler(name="full", change_filter=filter.ChangeFilter(branch='master'), treeStableTimer=5*60, builderNames=["full-linux", "full-netbsd", "full-OSX"]) c['schedulers'] = [quick, full]rr}r(h1Uh2jubaubh{)r}r(h1XIn this example, the two *quick* builders are triggered 60 seconds after the tree has been changed. The *full* builds do not run quite so quickly (they wait 5 minutes), so hopefully if the quick builds fail due to a missing file or really simple typo, the developer can discover and fix the problem before the full builds are started. Both Schedulers only pay attention to the default branch: any changes on other branches are ignored by these schedulers. Each scheduler triggers a different set of Builders, referenced by name.h2j}h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM'hMhhN]r(h`XIn this example, the two rr}r(h1XIn this example, the two h2jubji)r}r(h1X*quick*hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xquickrr}r(h1Uh2jubahAjsubh`XH builders are triggered 60 seconds after the tree has been changed. The rr}r(h1XH builders are triggered 60 seconds after the tree has been changed. The h2jubji)r}r(h1X*full*hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xfullrr}r(h1Uh2jubahAjsubh`X builds do not run quite so quickly (they wait 5 minutes), so hopefully if the quick builds fail due to a missing file or really simple typo, the developer can discover and fix the problem before the full builds are started. Both Schedulers only pay attention to the default branch: any changes on other branches are ignored by these schedulers. Each scheduler triggers a different set of Builders, referenced by name.rr}r(h1X builds do not run quite so quickly (they wait 5 minutes), so hopefully if the quick builds fail due to a missing file or really simple typo, the developer can discover and fix the problem before the full builds are started. Both Schedulers only pay attention to the default branch: any changes on other branches are ignored by these schedulers. Each scheduler triggers a different set of Builders, referenced by name.h2jubeubh{)r}r(h1XThe old names for this scheduler, ``buildbot.scheduler.Scheduler`` and ``buildbot.schedulers.basic.Scheduler``, are deprecated in favor of the more accurate name ``buildbot.schedulers.basic.SingleBranchScheduler``.h2j}h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM0hMhhN]r(h`X"The old names for this scheduler, rr}r(h1X"The old names for this scheduler, h2jubj)r}r(h1X ``buildbot.scheduler.Scheduler``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xbuildbot.scheduler.Schedulerrr}r(h1Uh2jubahAjubh`X and rr}r(h1X and h2jubj)r}r(h1X'``buildbot.schedulers.basic.Scheduler``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X#buildbot.schedulers.basic.Schedulerrr}r(h1Uh2jubahAjubh`X4, are deprecated in favor of the more accurate name rr}r(h1X4, are deprecated in favor of the more accurate name h2jubj)r}r(h1X3``buildbot.schedulers.basic.SingleBranchScheduler``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X/buildbot.schedulers.basic.SingleBranchSchedulerrr}r(h1Uh2jubahAjubh`X.r}r(h1X.h2jubeubjp)r}r(h1Uh2j}h7h:hAjshC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleXSchedulers; AnyBranchSchedulerXsched-AnyBranchSchedulerrjtr(UsingleXAnyBranchScheduler SchedulerjjtreuhLM5hMhhN]ubh>)r}r(h1Uh2j}h7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLM5hMhhN]ubh>)r}r(h1X.. _AnyBranchScheduler:h2j}h7h:h<}hAhBhC}r(hE]hF]hG]hH]hI]hJhuhLM6hMhhV}rjjshN]ubeubh3)r}r(h1Uh6Kh2h4h7h:h<}rhjshAhOhC}r(hG]rXanybranchschedulerrahH]hF]hE]r(hjUid4rehI]rhauhLM9hMhhV}r(jjhjuhN]r(hY)r}r(h1hh2jh7h:hAh]hC}r(hE]hF]hG]hH]hI]hJhuhLM9hMhhN]rh`XAnyBranchSchedulerrr}r(h1hh2jubaubh{)r}r(h1XhThis scheduler uses a tree-stable-timer like the default one, but uses a separate timer for each branch.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM;hMhhN]rh`XhThis scheduler uses a tree-stable-timer like the default one, but uses a separate timer for each branch.rr}r(h1jh2jubaubh{)r}r(h1XIf ``treeStableTimer`` is not set, then this scheduler is indistinguishable from bb:sched:``SingleBranchScheduler``. If ``treeStableTimer`` is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM>hMhhN]r(h`XIf r r }r (h1XIf h2jubj)r }r (h1X``treeStableTimer``hC}r (hG]hH]hF]hE]hI]uh2jhN]r h`XtreeStableTimerr r }r (h1Uh2j ubahAjubh`XD is not set, then this scheduler is indistinguishable from bb:sched:r r }r (h1XD is not set, then this scheduler is indistinguishable from bb:sched:h2jubj)r }r (h1X``SingleBranchScheduler``hC}r (hG]hH]hF]hE]hI]uh2jhN]r h`XSingleBranchSchedulerr r }r (h1Uh2j ubahAjubh`X. If r r }r (h1X. If h2jubj)r }r (h1X``treeStableTimer``hC}r (hG]hH]hF]hE]hI]uh2jhN]r h`XtreeStableTimerr r }r (h1Uh2j ubahAjubh`Xz is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.r r }r (h1Xz is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.h2jubeubh{)r! }r" (h1X$The arguments to this scheduler are:r# h2jh7h:hAhhC}r$ (hG]hH]hF]hE]hI]uhLMAhMhhN]r% h`X$The arguments to this scheduler are:r& r' }r( (h1j# h2j! ubaubh{)r) }r* (h1X``name``r+ h2jh7h:hAhhC}r, (hG]hH]hF]hE]hI]uhLMChMhhN]r- j)r. }r/ (h1j+ hC}r0 (hG]hH]hF]hE]hI]uh2j) hN]r1 h`Xnamer2 r3 }r4 (h1Uh2j. ubahAjubaubh{)r5 }r6 (h1X``builderNames``r7 h2jh7h:hAhhC}r8 (hG]hH]hF]hE]hI]uhLMEhMhhN]r9 j)r: }r; (h1j7 hC}r< (hG]hH]hF]hE]hI]uh2j5 hN]r= h`X builderNamesr> r? }r@ (h1Uh2j: ubahAjubaubh{)rA }rB (h1X``properties``rC h2jh7h:hAhhC}rD (hG]hH]hF]hE]hI]uhLMGhMhhN]rE j)rF }rG (h1jC hC}rH (hG]hH]hF]hE]hI]uh2jA hN]rI h`X propertiesrJ rK }rL (h1Uh2jF ubahAjubaubh{)rM }rN (h1X``fileIsImportant``rO h2jh7h:hAhhC}rP (hG]hH]hF]hE]hI]uhLMIhMhhN]rQ j)rR }rS (h1jO hC}rT (hG]hH]hF]hE]hI]uh2jM hN]rU h`XfileIsImportantrV rW }rX (h1Uh2jR ubahAjubaubh{)rY }rZ (h1X``change_filter``r[ h2jh7h:hAhhC}r\ (hG]hH]hF]hE]hI]uhLMKhMhhN]r] j)r^ }r_ (h1j[ hC}r` (hG]hH]hF]hE]hI]uh2jY hN]ra h`X change_filterrb rc }rd (h1Uh2j^ ubahAjubaubh{)re }rf (h1X``onlyImportant``rg h2jh7h:hAhhC}rh (hG]hH]hF]hE]hI]uhLMMhMhhN]ri j)rj }rk (h1jg hC}rl (hG]hH]hF]hE]hI]uh2je hN]rm h`X onlyImportantrn ro }rp (h1Uh2jj ubahAjubaubj)rq }rr (h1Uh2jh7h:hAjhC}rs (hG]hH]hF]hE]hI]uhLNhMhhN]rt (j)ru }rv (h1X.``reason`` See :ref:`Configuring-Schedulers`. h2jq h7h:hAjhC}rw (hG]hH]hF]hE]hI]uhLMPhN]rx (j)ry }rz (h1X ``reason``r{ h2ju h7h:hAjhC}r| (hG]hH]hF]hE]hI]uhLMPhN]r} j)r~ }r (h1j{ hC}r (hG]hH]hF]hE]hI]uh2jy hN]r h`Xreasonr r }r (h1Uh2j~ ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2ju hN]r h{)r }r (h1X"See :ref:`Configuring-Schedulers`.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMPhN]r (h`XSee r r }r (h1XSee h2j ubj)r }r (h1X:ref:`Configuring-Schedulers`r h2j h7h:hAjhC}r (UreftypeXrefjjXconfiguring-schedulersU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLMPhN]r ji)r }r (h1j hC}r (hG]hH]r (jj Xstd-refr ehF]hE]hI]uh2j hN]r h`XConfiguring-Schedulersr r }r (h1Uh2j ubahAjsubaubh`X.r }r (h1X.h2j ubeubahAjubeubj)r }r (h1X``treeStableTimer`` The scheduler will wait for this many seconds before starting the build. If new changes are made *on the same branch* during this interval, the timer will be restarted. h2jq h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMUhMhhN]r (j)r }r (h1X``treeStableTimer``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMUhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`XtreeStableTimerr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XThe scheduler will wait for this many seconds before starting the build. If new changes are made *on the same branch* during this interval, the timer will be restarted.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMShN]r (h`XaThe scheduler will wait for this many seconds before starting the build. If new changes are made r r }r (h1XaThe scheduler will wait for this many seconds before starting the build. If new changes are made h2j ubji)r }r (h1X*on the same branch*hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xon the same branchr r }r (h1Uh2j ubahAjsubh`X3 during this interval, the timer will be restarted.r r }r (h1X3 during this interval, the timer will be restarted.h2j ubeubahAjubeubj)r }r (h1Xm``branches`` (deprecated; use change_filter) Changes on branches not specified on this list will be ignored. h2jq h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMXhMhhN]r (j)r }r (h1X,``branches`` (deprecated; use change_filter)r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMXhN]r (j)r }r (h1X ``branches``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xbranchesr r }r (h1Uh2j ubahAjubh`X (deprecated; use change_filter)r r }r (h1X (deprecated; use change_filter)h2j ubeubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1X?Changes on branches not specified on this list will be ignored.r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMXhN]r h`X?Changes on branches not specified on this list will be ignored.r r }r (h1j h2j ubaubahAjubeubj)r }r (h1X``categories`` (deprecated; use change_filter) A list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored. h2jq h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLM\hMhhN]r (j)r }r (h1X.``categories`` (deprecated; use change_filter)r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLM\hN]r (j)r }r (h1X``categories``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X categoriesr r }r (h1Uh2j ubahAjubh`X (deprecated; use change_filter)r r }r (h1X (deprecated; use change_filter)h2j ubeubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLM[hN]r h`XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.r r }r (h1j h2j ubaubahAjubeubeubjp)r }r (h1Uh2jh7h:hAjshC}r (hE]hF]hG]hH]hI]Uentries]r ((UsingleXSchedulers; DependentXsched-Dependentr j tr (UsingleXDependent Schedulerj j tr euhLM_hMhhN]ubh>)r }r (h1Uh2jh7h:hAhBhC}r (hE]hF]hG]hH]hI]hJj uhLM_hMhhN]ubh>)r }r (h1X.. _Dependent-Scheduler:h2jh7h:h<}hAhBhC}r (hE]hF]hG]hH]hI]hJhuhLM`hMhhV}r j j shN]ubeubh3)r }r (h1Uh2h4h7h:h<}r h j shAhOhC}r (hG]hH]hF]hE]r (hj Uid5r ehI]r (h&h euhLMchMhhV}r (j j hj uhN]r (hY)r }r (h1hh2j h7h:hAh]hC}r (hE]hF]hG]hH]hI]hJhuhLMchMhhN]r h`XDependent Schedulerr r }r! (h1hh2j ubaubh{)r" }r# (h1X\It is common to wind up with one kind of build which should only be performed if the same source code was successfully handled by some other kind of build first. An example might be a packaging step: you might only want to produce .deb or RPM packages from a tree that was known to compile successfully and pass all unit tests. You could put the packaging step in the same Build as the compile and testing steps, but there might be other reasons to not do this (in particular you might have several Builders worth of compiles/tests, but only wish to do the packaging once). Another example is if you want to skip the *full* builds after a failing *quick* build of the same source code. Or, if one Build creates a product (like a compiled library) that is used by some other Builder, you'd want to make sure the consuming Build is run *after* the producing one.h2j h7h:hAhhC}r$ (hG]hH]hF]hE]hI]uhLMehMhhN]r% (h`XiIt is common to wind up with one kind of build which should only be performed if the same source code was successfully handled by some other kind of build first. An example might be a packaging step: you might only want to produce .deb or RPM packages from a tree that was known to compile successfully and pass all unit tests. You could put the packaging step in the same Build as the compile and testing steps, but there might be other reasons to not do this (in particular you might have several Builders worth of compiles/tests, but only wish to do the packaging once). Another example is if you want to skip the r& r' }r( (h1XiIt is common to wind up with one kind of build which should only be performed if the same source code was successfully handled by some other kind of build first. An example might be a packaging step: you might only want to produce .deb or RPM packages from a tree that was known to compile successfully and pass all unit tests. You could put the packaging step in the same Build as the compile and testing steps, but there might be other reasons to not do this (in particular you might have several Builders worth of compiles/tests, but only wish to do the packaging once). Another example is if you want to skip the h2j" ubji)r) }r* (h1X*full*hC}r+ (hG]hH]hF]hE]hI]uh2j" hN]r, h`Xfullr- r. }r/ (h1Uh2j) ubahAjsubh`X builds after a failing r0 r1 }r2 (h1X builds after a failing h2j" ubji)r3 }r4 (h1X*quick*hC}r5 (hG]hH]hF]hE]hI]uh2j" hN]r6 h`Xquickr7 r8 }r9 (h1Uh2j3 ubahAjsubh`X build of the same source code. Or, if one Build creates a product (like a compiled library) that is used by some other Builder, you'd want to make sure the consuming Build is run r: r; }r< (h1X build of the same source code. Or, if one Build creates a product (like a compiled library) that is used by some other Builder, you'd want to make sure the consuming Build is run h2j" ubji)r= }r> (h1X*after*hC}r? (hG]hH]hF]hE]hI]uh2j" hN]r@ h`XafterrA rB }rC (h1Uh2j= ubahAjsubh`X the producing one.rD rE }rF (h1X the producing one.h2j" ubeubh{)rG }rH (h1XYou can use *Dependencies* to express this relationship to the Buildbot. There is a special kind of scheduler named :class:`scheduler.Dependent` that will watch an *upstream* scheduler for builds to complete successfully (on all of its Builders). Each time that happens, the same source code (i.e. the same ``SourceStamp``) will be used to start a new set of builds, on a different set of Builders. This *downstream* scheduler doesn't pay attention to Changes at all. It only pays attention to the upstream scheduler.h2j h7h:hAhhC}rI (hG]hH]hF]hE]hI]uhLMshMhhN]rJ (h`X You can use rK rL }rM (h1X You can use h2jG ubji)rN }rO (h1X*Dependencies*hC}rP (hG]hH]hF]hE]hI]uh2jG hN]rQ h`X DependenciesrR rS }rT (h1Uh2jN ubahAjsubh`XZ to express this relationship to the Buildbot. There is a special kind of scheduler named rU rV }rW (h1XZ to express this relationship to the Buildbot. There is a special kind of scheduler named h2jG ubj)rX }rY (h1X:class:`scheduler.Dependent`rZ h2jG h7h:hAjhC}r[ (UreftypeXclassjjXscheduler.DependentU refdomainXpyr\ hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMshN]r] j)r^ }r_ (h1jZ hC}r` (hG]hH]ra (jj\ Xpy-classrb ehF]hE]hI]uh2jX hN]rc h`Xscheduler.Dependentrd re }rf (h1Uh2j^ ubahAjubaubh`X that will watch an rg rh }ri (h1X that will watch an h2jG ubji)rj }rk (h1X *upstream*hC}rl (hG]hH]hF]hE]hI]uh2jG hN]rm h`Xupstreamrn ro }rp (h1Uh2jj ubahAjsubh`X scheduler for builds to complete successfully (on all of its Builders). Each time that happens, the same source code (i.e. the same rq rr }rs (h1X scheduler for builds to complete successfully (on all of its Builders). Each time that happens, the same source code (i.e. the same h2jG ubj)rt }ru (h1X``SourceStamp``hC}rv (hG]hH]hF]hE]hI]uh2jG hN]rw h`X SourceStamprx ry }rz (h1Uh2jt ubahAjubh`XR) will be used to start a new set of builds, on a different set of Builders. This r{ r| }r} (h1XR) will be used to start a new set of builds, on a different set of Builders. This h2jG ubji)r~ }r (h1X *downstream*hC}r (hG]hH]hF]hE]hI]uh2jG hN]r h`X downstreamr r }r (h1Uh2j~ ubahAjsubh`Xe scheduler doesn't pay attention to Changes at all. It only pays attention to the upstream scheduler.r r }r (h1Xe scheduler doesn't pay attention to Changes at all. It only pays attention to the upstream scheduler.h2jG ubeubh{)r }r (h1XIf the build fails on any of the Builders in the upstream set, the downstream builds will not fire. Note that, for SourceStamps generated by a ChangeSource, the ``revision`` is ``None``, meaning HEAD. If any changes are committed between the time the upstream scheduler begins its build and the time the dependent scheduler begins its build, then those changes will be included in the downstream build. See the :ref:`Triggerable-Scheduler` for a more flexible dependency mechanism that can avoid this problem.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLM|hMhhN]r (h`XIf the build fails on any of the Builders in the upstream set, the downstream builds will not fire. Note that, for SourceStamps generated by a ChangeSource, the r r }r (h1XIf the build fails on any of the Builders in the upstream set, the downstream builds will not fire. Note that, for SourceStamps generated by a ChangeSource, the h2j ubj)r }r (h1X ``revision``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xrevisionr r }r (h1Uh2j ubahAjubh`X is r r }r (h1X is h2j ubj)r }r (h1X``None``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`XNoner r }r (h1Uh2j ubahAjubh`X, meaning HEAD. If any changes are committed between the time the upstream scheduler begins its build and the time the dependent scheduler begins its build, then those changes will be included in the downstream build. See the r r }r (h1X, meaning HEAD. If any changes are committed between the time the upstream scheduler begins its build and the time the dependent scheduler begins its build, then those changes will be included in the downstream build. See the h2j ubj)r }r (h1X:ref:`Triggerable-Scheduler`r h2j h7h:hAjhC}r (UreftypeXrefjjXtriggerable-schedulerU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLM|hN]r ji)r }r (h1j hC}r (hG]hH]r (jj Xstd-refr ehF]hE]hI]uh2j hN]r h`XTriggerable-Schedulerr r }r (h1Uh2j ubahAjsubaubh`XF for a more flexible dependency mechanism that can avoid this problem.r r }r (h1XF for a more flexible dependency mechanism that can avoid this problem.h2j ubeubh{)r }r (h1X,The keyword arguments to this scheduler are:r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h`X,The keyword arguments to this scheduler are:r r }r (h1j h2j ubaubh{)r }r (h1X``name``r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xnamer r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``builderNames``r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X builderNamesr r }r (h1Uh2j ubahAjubaubj)r }r (h1Uh2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r (j)r }r (h1X2``properties`` See :ref:`Configuring-Schedulers`. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r (j)r }r (h1X``properties``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X propertiesr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1X"See :ref:`Configuring-Schedulers`.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r (h`XSee r r }r (h1XSee h2j ubj)r }r (h1X:ref:`Configuring-Schedulers`r h2j h7h:hAjhC}r (UreftypeXrefjjXconfiguring-schedulersU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r ji)r }r (h1j hC}r (hG]hH]r (jj Xstd-refr ehF]hE]hI]uh2j hN]r h`XConfiguring-Schedulersr r }r (h1Uh2j ubahAjsubaubh`X.r }r (h1X.h2j ubeubahAjubeubj)r }r (h1Xo``upstream`` The upstream scheduler to watch. Note that this is an *instance*, not the name of the scheduler. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j)r }r (h1X ``upstream``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xupstreamr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XaThe upstream scheduler to watch. Note that this is an *instance*, not the name of the scheduler.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r (h`X7The upstream scheduler to watch. Note that this is an r r }r (h1X7The upstream scheduler to watch. Note that this is an h2j ubji)r }r! (h1X *instance*hC}r" (hG]hH]hF]hE]hI]uh2j hN]r# h`Xinstancer$ r% }r& (h1Uh2j ubahAjsubh`X , not the name of the scheduler.r' r( }r) (h1X , not the name of the scheduler.h2j ubeubahAjubeubeubh{)r* }r+ (h1X Example::r, h2j h7h:hAhhC}r- (hG]hH]hF]hE]hI]uhLMhMhhN]r. h`XExample:r/ r0 }r1 (h1XExample:h2j* ubaubj)r2 }r3 (h1Xfrom buildbot.schedulers import basic tests = basic.SingleBranchScheduler(name="just-tests", treeStableTimer=5*60, builderNames=["full-linux", "full-netbsd", "full-OSX"]) package = basic.Dependent(name="build-package", upstream=tests, # <- no quotes! builderNames=["make-tarball", "make-deb", "make-rpm"]) c['schedulers'] = [tests, package]h2j h7h:hAjhC}r4 (jjhE]hF]hG]hH]hI]uhLMhMhhN]r5 h`Xfrom buildbot.schedulers import basic tests = basic.SingleBranchScheduler(name="just-tests", treeStableTimer=5*60, builderNames=["full-linux", "full-netbsd", "full-OSX"]) package = basic.Dependent(name="build-package", upstream=tests, # <- no quotes! builderNames=["make-tarball", "make-deb", "make-rpm"]) c['schedulers'] = [tests, package]r6 r7 }r8 (h1Uh2j2 ubaubjp)r9 }r: (h1Uh2j h7h:hAjshC}r; (hE]hF]hG]hH]hI]Uentries]r< ((UsingleXSchedulers; PeriodicXsched-Periodicr= j= tr> (UsingleXPeriodic Schedulerj= j= tr? euhLMhMhhN]ubh>)r@ }rA (h1Uh2j h7h:hAhBhC}rB (hE]hF]hG]hH]hI]hJj= uhLMhMhhN]ubh>)rC }rD (h1X.. _Periodic-Scheduler:h2j h7h:h<}hAhBhC}rE (hE]hF]hG]hH]hI]hJhuhLMhMhhV}rF j= j@ shN]ubeubh3)rG }rH (h1Uh2h4h7h:h<}rI hjC shAhOhC}rJ (hG]hH]hF]hE]rK (hj= Uid6rL ehI]rM (h heuhLMhMhhV}rN (hjC j= j@ uhN]rO (hY)rP }rQ (h1hh2jG h7h:hAh]hC}rR (hE]hF]hG]hH]hI]hJhuhLMhMhhN]rS h`XPeriodic SchedulerrT rU }rV (h1hh2jP ubaubh{)rW }rX (h1X>This simple scheduler just triggers a build every *N* seconds.rY h2jG h7h:hAhhC}rZ (hG]hH]hF]hE]hI]uhLMhMhhN]r[ (h`X2This simple scheduler just triggers a build every r\ r] }r^ (h1X2This simple scheduler just triggers a build every h2jW ubji)r_ }r` (h1X*N*hC}ra (hG]hH]hF]hE]hI]uh2jW hN]rb h`XNrc }rd (h1Uh2j_ ubahAjsubh`X seconds.re rf }rg (h1X seconds.h2jW ubeubh{)rh }ri (h1X$The arguments to this scheduler are:rj h2jG h7h:hAhhC}rk (hG]hH]hF]hE]hI]uhLMhMhhN]rl h`X$The arguments to this scheduler are:rm rn }ro (h1jj h2jh ubaubh{)rp }rq (h1X``name``rr h2jG h7h:hAhhC}rs (hG]hH]hF]hE]hI]uhLMhMhhN]rt j)ru }rv (h1jr hC}rw (hG]hH]hF]hE]hI]uh2jp hN]rx h`Xnamery rz }r{ (h1Uh2ju ubahAjubaubh{)r| }r} (h1X``builderNames``r~ h2jG h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j~ hC}r (hG]hH]hF]hE]hI]uh2j| hN]r h`X builderNamesr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``properties``r h2jG h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X propertiesr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``onlyImportant``r h2jG h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X onlyImportantr r }r (h1Uh2j ubahAjubaubj)r }r (h1Uh2jG h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r (j)r }r (h1X.``reason`` See :ref:`Configuring-Schedulers`. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r (j)r }r (h1X ``reason``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xreasonr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1X"See :ref:`Configuring-Schedulers`.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r (h`XSee r r }r (h1XSee h2j ubj)r }r (h1X:ref:`Configuring-Schedulers`r h2j h7h:hAjhC}r (UreftypeXrefjjXconfiguring-schedulersU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r ji)r }r (h1j hC}r (hG]hH]r (jj Xstd-refr ehF]hE]hI]uh2j hN]r h`XConfiguring-Schedulersr r }r (h1Uh2j ubahAjsubaubh`X.r }r (h1X.h2j ubeubahAjubeubj)r }r (h1XK``periodicBuildTimer`` The time, in seconds, after which to start a build. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j)r }r (h1X``periodicBuildTimer``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`XperiodicBuildTimerr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1X3The time, in seconds, after which to start a build.r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r h`X3The time, in seconds, after which to start a build.r r }r (h1j h2j ubaubahAjubeubeubh{)r }r (h1X Example::r h2jG h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h`XExample:r r }r (h1XExample:h2j ubaubj)r }r (h1Xfrom buildbot.schedulers import timed nightly = timed.Periodic(name="daily", builderNames=["full-solaris"], periodicBuildTimer=24*60*60) c['schedulers'] = [nightly]h2jG h7h:hAjhC}r (jjhE]hF]hG]hH]hI]uhLMhMhhN]r h`Xfrom buildbot.schedulers import timed nightly = timed.Periodic(name="daily", builderNames=["full-solaris"], periodicBuildTimer=24*60*60) c['schedulers'] = [nightly]r r }r (h1Uh2j ubaubh{)r }r (h1X5The scheduler in this example just runs the full solaris build once per day. Note that this scheduler only lets you control the time between builds, not the absolute time-of-day of each Build, so this could easily wind up an *evening* or *every afternoon* scheduler depending upon when it was first activated.h2jG h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (h`XThe scheduler in this example just runs the full solaris build once per day. Note that this scheduler only lets you control the time between builds, not the absolute time-of-day of each Build, so this could easily wind up an r r }r (h1XThe scheduler in this example just runs the full solaris build once per day. Note that this scheduler only lets you control the time between builds, not the absolute time-of-day of each Build, so this could easily wind up an h2j ubji)r }r (h1X *evening*hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xeveningr r }r (h1Uh2j ubahAjsubh`X or r r }r (h1X or h2j ubji)r }r (h1X*every afternoon*hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xevery afternoonr r }r (h1Uh2j ubahAjsubh`X6 scheduler depending upon when it was first activated.r r }r (h1X6 scheduler depending upon when it was first activated.h2j ubeubjp)r }r (h1Uh2jG h7h:hAjshC}r (hE]hF]hG]hH]hI]Uentries]r ((UsingleXSchedulers; NightlyX sched-Nightlyr j tr (UsingleXNightly Schedulerj j tr euhLMhMhhN]ubh>)r }r (h1Uh2jG h7h:hAhBhC}r (hE]hF]hG]hH]hI]hJj uhLMhMhhN]ubh>)r }r! (h1X.. _Nightly-Scheduler:h2jG h7h:h<}hAhBhC}r" (hE]hF]hG]hH]hI]hJhuhLMhMhhV}r# j j shN]ubeubh3)r$ }r% (h1Uh2h4h7h:h<}r& hj shAhOhC}r' (hG]hH]hF]hE]r( (hj Uid7r) ehI]r* (h$heuhLMhMhhV}r+ (j j hj uhN]r, (hY)r- }r. (h1jh2j$ h7h:hAh]hC}r/ (hE]hF]hG]hH]hI]hJhuhLMhMhhN]r0 h`XNightly Schedulerr1 r2 }r3 (h1jh2j- ubaubh{)r4 }r5 (h1XThis is highly configurable periodic build scheduler, which triggers a build at particular times of day, week, month, or year. The configuration syntax is very similar to the well-known ``crontab`` format, in which you provide values for minute, hour, day, and month (some of which can be wildcards), and a build is triggered whenever the current time matches the given constraints. This can run a build every night, every morning, every weekend, alternate Thursdays, on your boss's birthday, etc.h2j$ h7h:hAhhC}r6 (hG]hH]hF]hE]hI]uhLMhMhhN]r7 (h`XThis is highly configurable periodic build scheduler, which triggers a build at particular times of day, week, month, or year. The configuration syntax is very similar to the well-known r8 r9 }r: (h1XThis is highly configurable periodic build scheduler, which triggers a build at particular times of day, week, month, or year. The configuration syntax is very similar to the well-known h2j4 ubj)r; }r< (h1X ``crontab``hC}r= (hG]hH]hF]hE]hI]uh2j4 hN]r> h`Xcrontabr? r@ }rA (h1Uh2j; ubahAjubh`X, format, in which you provide values for minute, hour, day, and month (some of which can be wildcards), and a build is triggered whenever the current time matches the given constraints. This can run a build every night, every morning, every weekend, alternate Thursdays, on your boss's birthday, etc.rB rC }rD (h1X, format, in which you provide values for minute, hour, day, and month (some of which can be wildcards), and a build is triggered whenever the current time matches the given constraints. This can run a build every night, every morning, every weekend, alternate Thursdays, on your boss's birthday, etc.h2j4 ubeubh{)rE }rF (h1XPass some subset of ``minute``, ``hour``, ``dayOfMonth``, ``month``, and ``dayOfWeek``\; each may be a single number or a list of valid values. The builds will be triggered whenever the current time matches these values. Wildcards are represented by a '*' string. All fields default to a wildcard except 'minute', so with no fields this defaults to a build every hour, on the hour. The full list of parameters is:h2j$ h7h:hAhhC}rG (hG]hH]hF]hE]hI]uhLMhMhhN]rH (h`XPass some subset of rI rJ }rK (h1XPass some subset of h2jE ubj)rL }rM (h1X ``minute``hC}rN (hG]hH]hF]hE]hI]uh2jE hN]rO h`XminuterP rQ }rR (h1Uh2jL ubahAjubh`X, rS rT }rU (h1X, h2jE ubj)rV }rW (h1X``hour``hC}rX (hG]hH]hF]hE]hI]uh2jE hN]rY h`XhourrZ r[ }r\ (h1Uh2jV ubahAjubh`X, r] r^ }r_ (h1X, h2jE ubj)r` }ra (h1X``dayOfMonth``hC}rb (hG]hH]hF]hE]hI]uh2jE hN]rc h`X dayOfMonthrd re }rf (h1Uh2j` ubahAjubh`X, rg rh }ri (h1X, h2jE ubj)rj }rk (h1X ``month``hC}rl (hG]hH]hF]hE]hI]uh2jE hN]rm h`Xmonthrn ro }rp (h1Uh2jj ubahAjubh`X, and rq rr }rs (h1X, and h2jE ubj)rt }ru (h1X ``dayOfWeek``hC}rv (hG]hH]hF]hE]hI]uh2jE hN]rw h`X dayOfWeekrx ry }rz (h1Uh2jt ubahAjubh`XF; each may be a single number or a list of valid values. The builds will be triggered whenever the current time matches these values. Wildcards are represented by a '*' string. All fields default to a wildcard except 'minute', so with no fields this defaults to a build every hour, on the hour. The full list of parameters is:r{ r| }r} (h1XG\; each may be a single number or a list of valid values. The builds will be triggered whenever the current time matches these values. Wildcards are represented by a '*' string. All fields default to a wildcard except 'minute', so with no fields this defaults to a build every hour, on the hour. The full list of parameters is:h2jE ubeubh{)r~ }r (h1X``name``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j~ hN]r h`Xnamer r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``builderNames``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X builderNamesr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``properties``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X propertiesr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``fileIsImportant``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`XfileIsImportantr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``change_filter``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X change_filterr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X``onlyImportant``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X onlyImportantr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X ``reason``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xreasonr r }r (h1Uh2j ubahAjubaubh{)r }r (h1X ``codebases``r h2j$ h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X codebasesr r }r (h1Uh2j ubahAjubaubj)r }r (h1Uh2j$ h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r (j)r }r (h1X``createAbsoluteSourceStamps`` See :ref:`Configuring-Schedulers`. Note that ``fileIsImportant``, ``change_filter`` and ``createAbsoluteSourceStamps`` are only relevant if ``onlyIfChanged`` is ``True``. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r (j)r }r (h1X``createAbsoluteSourceStamps``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`XcreateAbsoluteSourceStampsr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XSee :ref:`Configuring-Schedulers`. Note that ``fileIsImportant``, ``change_filter`` and ``createAbsoluteSourceStamps`` are only relevant if ``onlyIfChanged`` is ``True``.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r (h`XSee r r }r (h1XSee h2j ubj)r }r (h1X:ref:`Configuring-Schedulers`r h2j h7h:hAjhC}r (UreftypeXrefjjXconfiguring-schedulersU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r ji)r }r (h1j hC}r (hG]hH]r (jj Xstd-refr ehF]hE]hI]uh2j hN]r h`XConfiguring-Schedulersr r }r (h1Uh2j ubahAjsubaubh`X . Note that r r }r (h1X . Note that h2j ubj)r }r (h1X``fileIsImportant``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`XfileIsImportantr r }r (h1Uh2j ubahAjubh`X, r r }r (h1X, h2j ubj)r }r (h1X``change_filter``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X change_filterr r }r (h1Uh2j ubahAjubh`X and r r! }r" (h1X and h2j ubj)r# }r$ (h1X``createAbsoluteSourceStamps``hC}r% (hG]hH]hF]hE]hI]uh2j hN]r& h`XcreateAbsoluteSourceStampsr' r( }r) (h1Uh2j# ubahAjubh`X are only relevant if r* r+ }r, (h1X are only relevant if h2j ubj)r- }r. (h1X``onlyIfChanged``hC}r/ (hG]hH]hF]hE]hI]uh2j hN]r0 h`X onlyIfChangedr1 r2 }r3 (h1Uh2j- ubahAjubh`X is r4 r5 }r6 (h1X is h2j ubj)r7 }r8 (h1X``True``hC}r9 (hG]hH]hF]hE]hI]uh2j hN]r: h`XTruer; r< }r= (h1Uh2j7 ubahAjubh`X.r> }r? (h1X.h2j ubeubahAjubeubj)r@ }rA (h1X``onlyIfChanged`` If this is true, then builds will not be scheduled at the designated time *unless* the specified branch has seen an important change since the previous build. h2j h7h:hAjhC}rB (hG]hH]hF]hE]hI]uhLMhMhhN]rC (j)rD }rE (h1X``onlyIfChanged``rF h2j@ h7h:hAjhC}rG (hG]hH]hF]hE]hI]uhLMhN]rH j)rI }rJ (h1jF hC}rK (hG]hH]hF]hE]hI]uh2jD hN]rL h`X onlyIfChangedrM rN }rO (h1Uh2jI ubahAjubaubj)rP }rQ (h1UhC}rR (hG]hH]hF]hE]hI]uh2j@ hN]rS h{)rT }rU (h1XIf this is true, then builds will not be scheduled at the designated time *unless* the specified branch has seen an important change since the previous build.h2jP h7h:hAhhC}rV (hG]hH]hF]hE]hI]uhLMhN]rW (h`XJIf this is true, then builds will not be scheduled at the designated time rX rY }rZ (h1XJIf this is true, then builds will not be scheduled at the designated time h2jT ubji)r[ }r\ (h1X*unless*hC}r] (hG]hH]hF]hE]hI]uh2jT hN]r^ h`Xunlessr_ r` }ra (h1Uh2j[ ubahAjsubh`XL the specified branch has seen an important change since the previous build.rb rc }rd (h1XL the specified branch has seen an important change since the previous build.h2jT ubeubahAjubeubj)re }rf (h1X``branch`` (required) The branch to build when the time comes. Remember that a value of ``None`` here means the default branch, and will not match other branches! h2j h7h:hAjhC}rg (hG]hH]hF]hE]hI]uhLMhMhhN]rh (j)ri }rj (h1X ``branch``rk h2je h7h:hAjhC}rl (hG]hH]hF]hE]hI]uhLMhN]rm j)rn }ro (h1jk hC}rp (hG]hH]hF]hE]hI]uh2ji hN]rq h`Xbranchrr rs }rt (h1Uh2jn ubahAjubaubj)ru }rv (h1UhC}rw (hG]hH]hF]hE]hI]uh2je hN]rx h{)ry }rz (h1X(required) The branch to build when the time comes. Remember that a value of ``None`` here means the default branch, and will not match other branches!h2ju h7h:hAhhC}r{ (hG]hH]hF]hE]hI]uhLMhN]r| (h`XN(required) The branch to build when the time comes. Remember that a value of r} r~ }r (h1XN(required) The branch to build when the time comes. Remember that a value of h2jy ubj)r }r (h1X``None``hC}r (hG]hH]hF]hE]hI]uh2jy hN]r h`XNoner r }r (h1Uh2j ubahAjubh`XB here means the default branch, and will not match other branches!r r }r (h1XB here means the default branch, and will not match other branches!h2jy ubeubahAjubeubj)r }r (h1Xm``minute`` The minute of the hour on which to start the build. This defaults to 0, meaning an hourly build. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j)r }r (h1X ``minute``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xminuter r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XaThe minute of the hour on which to start the build. This defaults to 0, meaning an hourly build.r h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r h`XaThe minute of the hour on which to start the build. This defaults to 0, meaning an hourly build.r r }r (h1j h2j ubaubahAjubeubj)r }r (h1Xx``hour`` The hour of the day on which to start the build, in 24-hour notation. This defaults to \*, meaning every hour. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j)r }r (h1X``hour``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xhourr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XnThe hour of the day on which to start the build, in 24-hour notation. This defaults to \*, meaning every hour.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r h`XmThe hour of the day on which to start the build, in 24-hour notation. This defaults to *, meaning every hour.r r }r (h1XnThe hour of the day on which to start the build, in 24-hour notation. This defaults to \*, meaning every hour.h2j ubaubahAjubeubj)r }r (h1Xb``dayOfMonth`` The day of the month to start a build. This defaults to ``*``, meaning every day. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j)r }r (h1X``dayOfMonth``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLMhN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X dayOfMonthr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XRThe day of the month to start a build. This defaults to ``*``, meaning every day.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r (h`X9The day of the month to start a build. This defaults to r r }r (h1X9The day of the month to start a build. This defaults to h2j ubj)r }r (h1X``*``hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`X*r }r (h1Uh2j ubahAjubh`X, meaning every day.r r }r (h1X, meaning every day.h2j ubeubahAjubeubj)r }r (h1Xn``month`` The month in which to start the build, with January = 1. This defaults to \*, meaning every month. h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLM hMhhN]r (j)r }r (h1X ``month``r h2j h7h:hAjhC}r (hG]hH]hF]hE]hI]uhLM hN]r j)r }r (h1j hC}r (hG]hH]hF]hE]hI]uh2j hN]r h`Xmonthr r }r (h1Uh2j ubahAjubaubj)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2j hN]r h{)r }r (h1XcThe month in which to start the build, with January = 1. This defaults to \*, meaning every month.h2j h7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMhN]r h`XbThe month in which to start the build, with January = 1. This defaults to *, meaning every month.r r }r (h1XcThe month in which to start the build, with January = 1. This defaults to \*, meaning every month.h2j ubaubahAjubeubj)r}r(h1Xz``dayOfWeek`` The day of the week to start a build, with Monday = 0. This defaults to \*, meaning every day of the week. h2j h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM hMhhN]r(j)r}r(h1X ``dayOfWeek``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM hN]rj)r }r (h1jhC}r (hG]hH]hF]hE]hI]uh2jhN]r h`X dayOfWeekr r}r(h1Uh2j ubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1XkThe day of the week to start a build, with Monday = 0. This defaults to \*, meaning every day of the week.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM hN]rh`XjThe day of the week to start a build, with Monday = 0. This defaults to *, meaning every day of the week.rr}r(h1XkThe day of the week to start a build, with Monday = 0. This defaults to \*, meaning every day of the week.h2jubaubahAjubeubeubh{)r}r(h1XeFor example, the following master.cfg clause will cause a build to be started every night at 3:00am::h2j$ h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XdFor example, the following master.cfg clause will cause a build to be started every night at 3:00am:rr }r!(h1XdFor example, the following master.cfg clause will cause a build to be started every night at 3:00am:h2jubaubj)r"}r#(h1Xfrom buildbot.schedulers import timed c['schedulers'].append( timed.Nightly(name='nightly', branch='master', builderNames=['builder1', 'builder2'], hour=3, minute=0))h2j$ h7h:hAjhC}r$(jjhE]hF]hG]hH]hI]uhLMhMhhN]r%h`Xfrom buildbot.schedulers import timed c['schedulers'].append( timed.Nightly(name='nightly', branch='master', builderNames=['builder1', 'builder2'], hour=3, minute=0))r&r'}r((h1Uh2j"ubaubh{)r)}r*(h1XThis scheduler will perform a build each Monday morning at 6:23am and again at 8:23am, but only if someone has committed code in the interim::h2j$ h7h:hAhhC}r+(hG]hH]hF]hE]hI]uhLMhMhhN]r,h`XThis scheduler will perform a build each Monday morning at 6:23am and again at 8:23am, but only if someone has committed code in the interim:r-r.}r/(h1XThis scheduler will perform a build each Monday morning at 6:23am and again at 8:23am, but only if someone has committed code in the interim:h2j)ubaubj)r0}r1(h1Xc['schedulers'].append( timed.Nightly(name='BeforeWork', branch=`default`, builderNames=['builder1'], dayOfWeek=0, hour=[6,8], minute=23, onlyIfChanged=True))h2j$ h7h:hAjhC}r2(jjhE]hF]hG]hH]hI]uhLMhMhhN]r3h`Xc['schedulers'].append( timed.Nightly(name='BeforeWork', branch=`default`, builderNames=['builder1'], dayOfWeek=0, hour=[6,8], minute=23, onlyIfChanged=True))r4r5}r6(h1Uh2j0ubaubh{)r7}r8(h1XSThe following runs a build every two hours, using Python's :func:`range` function::h2j$ h7h:hAhhC}r9(hG]hH]hF]hE]hI]uhLM&hMhhN]r:(h`X;The following runs a build every two hours, using Python's r;r<}r=(h1X;The following runs a build every two hours, using Python's h2j7ubj)r>}r?(h1X :func:`range`r@h2j7h7h:hAjhC}rA(UreftypeXfuncjjXrangeU refdomainXpyrBhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM&hN]rCj)rD}rE(h1j@hC}rF(hG]hH]rG(jjBXpy-funcrHehF]hE]hI]uh2j>hN]rIh`XrangerJrK}rL(h1Uh2jDubahAjubaubh`X function:rMrN}rO(h1X function:h2j7ubeubj)rP}rQ(h1Xc.schedulers.append( timed.Nightly(name='every2hours', branch=None, # default branch builderNames=['builder1'], hour=range(0, 24, 2)))h2j$ h7h:hAjhC}rR(jjhE]hF]hG]hH]hI]uhLM)hMhhN]rSh`Xc.schedulers.append( timed.Nightly(name='every2hours', branch=None, # default branch builderNames=['builder1'], hour=range(0, 24, 2)))rTrU}rV(h1Uh2jPubaubh{)rW}rX(h1X6Finally, this example will run only on December 24th::rYh2j$ h7h:hAhhC}rZ(hG]hH]hF]hE]hI]uhLM/hMhhN]r[h`X5Finally, this example will run only on December 24th:r\r]}r^(h1X5Finally, this example will run only on December 24th:h2jWubaubj)r_}r`(h1Xc['schedulers'].append( timed.Nightly(name='SleighPreflightCheck', branch=None, # default branch builderNames=['flying_circuits', 'radar'], month=12, dayOfMonth=24, hour=12, minute=0))h2j$ h7h:hAjhC}ra(jjhE]hF]hG]hH]hI]uhLM1hMhhN]rbh`Xc['schedulers'].append( timed.Nightly(name='SleighPreflightCheck', branch=None, # default branch builderNames=['flying_circuits', 'radar'], month=12, dayOfMonth=24, hour=12, minute=0))rcrd}re(h1Uh2j_ubaubjp)rf}rg(h1Uh2j$ h7h:hAjshC}rh(hE]hF]hG]hH]hI]Uentries]ri((UsingleXSchedulers; Try_JobdirXsched-Try_Jobdirrjjjtrk(UsingleXTry_Jobdir SchedulerjjjjtrleuhLM:hMhhN]ubh>)rm}rn(h1Uh2j$ h7h:hAhBhC}ro(hG]hH]hF]hE]rpjjahI]uhLM:hMhhN]ubjp)rq}rr(h1Uh2j$ h7h:hAjshC}rs(hE]hF]hG]hH]hI]Uentries]rt((UsingleXSchedulers; Try_UserpassXsched-Try_Userpassrujutrv(UsingleXTry_Userpass SchedulerjujutrweuhLM<hMhhN]ubh>)rx}ry(h1Uh2j$ h7h:hAhBhC}rz(hE]hF]hG]hH]hI]hJjuuhLM<hMhhN]ubh>)r{}r|(h1X.. _Try-Schedulers:h2j$ h7h:h<}hAhBhC}r}(hE]hF]hG]hH]hI]hJjuhLM=hMhhV}r~jujxshN]ubeubh3)r}r(h1Uh2h4h7h:h<}rhj{shAhOhC}r(hG]hH]hF]hE]r(jjuUid8rehI]r(h'heuhLM@hMhhV}r(jujxjj{uhN]r(hY)r}r(h1jh2jh7h:hAh]hC}r(hE]hF]hG]hH]hI]hJj uhLM@hMhhN]rh`XTry Schedulersrr}r(h1jh2jubaubh{)r}r(h1XThis scheduler allows developers to use the :command:`buildbot try` command to trigger builds of code they have not yet committed. See :bb:cmdline:`try` for complete details.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMBhMhhN]r(h`X,This scheduler allows developers to use the rr}r(h1X,This scheduler allows developers to use the h2jubcdocutils.nodes strong r)r}r(h1X:command:`buildbot try`hC}r(hG]hH]rUcommandrahF]hE]hI]uh2jhN]rh`X buildbot tryrr}r(h1Uh2jubahAUstrongrubh`XD command to trigger builds of code they have not yet committed. See rr}r(h1XD command to trigger builds of code they have not yet committed. See h2jubj)r}r(h1X:bb:cmdline:`try`rh2jh7h:hAjhC}r(UreftypeXcmdlinejjXtryU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMBhN]rj)r}r(h1jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh2jhN]rh`Xtryrr}r(h1Uh2jubahAjubaubh`X for complete details.rr}r(h1X for complete details.h2jubeubh{)r}r(h1XTwo implementations are available: :bb:sched:`Try_Jobdir` and :bb:sched:`Try_Userpass`. The former monitors a job directory, specified by the ``jobdir`` parameter, while the latter listens for PB connections on a specific ``port``, and authenticates against ``userport``.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMFhMhhN]r(h`X#Two implementations are available: rr}r(h1X#Two implementations are available: h2jubj)r}r(h1X:bb:sched:`Try_Jobdir`rh2jh7h:hAjhC}r(UreftypeXschedjjX Try_JobdirU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMFhN]rj)r}r(h1jhC}r(hG]hH]r(jjXbb-schedrehF]hE]hI]uh2jhN]rh`X Try_Jobdirrr}r(h1Uh2jubahAjubaubh`X and rr}r(h1X and h2jubj)r}r(h1X:bb:sched:`Try_Userpass`rh2jh7h:hAjhC}r(UreftypeXschedjjX Try_UserpassU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMFhN]rj)r}r(h1jhC}r(hG]hH]r(jjXbb-schedrehF]hE]hI]uh2jhN]rh`X Try_Userpassrr}r(h1Uh2jubahAjubaubh`X9. The former monitors a job directory, specified by the rr}r(h1X9. The former monitors a job directory, specified by the h2jubj)r}r(h1X ``jobdir``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xjobdirrr}r(h1Uh2jubahAjubh`XF parameter, while the latter listens for PB connections on a specific rr}r(h1XF parameter, while the latter listens for PB connections on a specific h2jubj)r}r(h1X``port``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xportrr}r(h1Uh2jubahAjubh`X, and authenticates against rr}r(h1X, and authenticates against h2jubj)r}r(h1X ``userport``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xuserportrr}r(h1Uh2jubahAjubh`X.r}r(h1X.h2jubeubh{)r}r(h1XThe buildmaster must have a scheduler instance in the config file's :bb:cfg:`schedulers` list to receive try requests. This lets the administrator control who may initiate these `trial` builds, which branches are eligible for trial builds, and which Builders should be used for them.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMLhMhhN]r(h`XDThe buildmaster must have a scheduler instance in the config file's rr}r(h1XDThe buildmaster must have a scheduler instance in the config file's h2jubj)r}r(h1X:bb:cfg:`schedulers`rh2jh7h:hAjhC}r(UreftypeXcfgjjX schedulersU refdomainXbbr hE]hF]U refexplicithG]hH]hI]jjuhLMLhN]r j)r }r (h1jhC}r (hG]hH]r(jj Xbb-cfgrehF]hE]hI]uh2jhN]rh`X schedulersrr}r(h1Uh2j ubahAjubaubh`XZ list to receive try requests. This lets the administrator control who may initiate these rr}r(h1XZ list to receive try requests. This lets the administrator control who may initiate these h2jubcdocutils.nodes title_reference r)r}r(h1X`trial`hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xtrialrr}r(h1Uh2jubahAUtitle_referencerubh`Xb builds, which branches are eligible for trial builds, and which Builders should be used for them.r r!}r"(h1Xb builds, which branches are eligible for trial builds, and which Builders should be used for them.h2jubeubh{)r#}r$(h1XThe scheduler has various means to accept build requests. All of them enforce more security than the usual buildmaster ports do. Any source code being built can be used to compromise the buildslave accounts, but in general that code must be checked out from the VC repository first, so only people with commit privileges can get control of the buildslaves. The usual force-build control channels can waste buildslave time but do not allow arbitrary commands to be executed by people who don't have those commit privileges. However, the source code patch that is provided with the trial build does not have to go through the VC system first, so it is important to make sure these builds cannot be abused by a non-committer to acquire as much control over the buildslaves as a committer has. Ideally, only developers who have commit access to the VC repository would be able to start trial builds, but unfortunately the buildmaster does not, in general, have access to VC system's user list.r%h2jh7h:hAhhC}r&(hG]hH]hF]hE]hI]uhLMQhMhhN]r'h`XThe scheduler has various means to accept build requests. All of them enforce more security than the usual buildmaster ports do. Any source code being built can be used to compromise the buildslave accounts, but in general that code must be checked out from the VC repository first, so only people with commit privileges can get control of the buildslaves. The usual force-build control channels can waste buildslave time but do not allow arbitrary commands to be executed by people who don't have those commit privileges. However, the source code patch that is provided with the trial build does not have to go through the VC system first, so it is important to make sure these builds cannot be abused by a non-committer to acquire as much control over the buildslaves as a committer has. Ideally, only developers who have commit access to the VC repository would be able to start trial builds, but unfortunately the buildmaster does not, in general, have access to VC system's user list.r(r)}r*(h1j%h2j#ubaubh{)r+}r,(h1XnAs a result, the try scheduler requires a bit more configuration. There are currently two ways to set this up:r-h2jh7h:hAhhC}r.(hG]hH]hF]hE]hI]uhLMahMhhN]r/h`XnAs a result, the try scheduler requires a bit more configuration. There are currently two ways to set this up:r0r1}r2(h1j-h2j+ubaubj)r3}r4(h1Uh2jh7h:hAjhC}r5(hG]hH]hF]hE]hI]uhLNhMhhN]r6(j)r7}r8(h1X``jobdir`` (ssh) This approach creates a command queue directory, called the :file:`jobdir`, in the buildmaster's working directory. The buildmaster admin sets the ownership and permissions of this directory to only grant write access to the desired set of developers, all of whom must have accounts on the machine. The :command:`buildbot try` command creates a special file containing the source stamp information and drops it in the jobdir, just like a standard maildir. When the buildmaster notices the new file, it unpacks the information inside and starts the builds. The config file entries used by 'buildbot try' either specify a local queuedir (for which write and mv are used) or a remote one (using scp and ssh). The advantage of this scheme is that it is quite secure, the disadvantage is that it requires fiddling outside the buildmaster config (to set the permissions on the jobdir correctly). If the buildmaster machine happens to also house the VC repository, then it can be fairly easy to keep the VC userlist in sync with the trial-build userlist. If they are on different machines, this will be much more of a hassle. It may also involve granting developer accounts on a machine that would not otherwise require them. To implement this, the buildslave invokes :samp:`ssh -l {username} {host} buildbot tryserver {ARGS}`, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information. h2j3h7h:hAjhC}r9(hG]hH]hF]hE]hI]uhLM~hN]r:(j)r;}r<(h1X``jobdir`` (ssh)r=h2j7h7h:hAjhC}r>(hG]hH]hF]hE]hI]uhLM~hN]r?(j)r@}rA(h1X ``jobdir``hC}rB(hG]hH]hF]hE]hI]uh2j;hN]rCh`XjobdirrDrE}rF(h1Uh2j@ubahAjubh`X (ssh)rGrH}rI(h1X (ssh)h2j;ubeubj)rJ}rK(h1UhC}rL(hG]hH]hF]hE]hI]uh2j7hN]rM(h{)rN}rO(h1X+This approach creates a command queue directory, called the :file:`jobdir`, in the buildmaster's working directory. The buildmaster admin sets the ownership and permissions of this directory to only grant write access to the desired set of developers, all of whom must have accounts on the machine. The :command:`buildbot try` command creates a special file containing the source stamp information and drops it in the jobdir, just like a standard maildir. When the buildmaster notices the new file, it unpacks the information inside and starts the builds.h2jJh7h:hAhhC}rP(hG]hH]hF]hE]hI]uhLMehN]rQ(h`X<This approach creates a command queue directory, called the rRrS}rT(h1X<This approach creates a command queue directory, called the h2jNubj)rU}rV(h1UhC}rW(hE]hF]hG]hH]rXXfilerYaUrolejYhI]uh2jNhN]rZh`Xjobdirr[r\}r](h1Xjobdirh2jUubahAjubh`X, in the buildmaster's working directory. The buildmaster admin sets the ownership and permissions of this directory to only grant write access to the desired set of developers, all of whom must have accounts on the machine. The r^r_}r`(h1X, in the buildmaster's working directory. The buildmaster admin sets the ownership and permissions of this directory to only grant write access to the desired set of developers, all of whom must have accounts on the machine. The h2jNubj)ra}rb(h1X:command:`buildbot try`hC}rc(hG]hH]rdjahF]hE]hI]uh2jNhN]reh`X buildbot tryrfrg}rh(h1Uh2jaubahAjubh`X command creates a special file containing the source stamp information and drops it in the jobdir, just like a standard maildir. When the buildmaster notices the new file, it unpacks the information inside and starts the builds.rirj}rk(h1X command creates a special file containing the source stamp information and drops it in the jobdir, just like a standard maildir. When the buildmaster notices the new file, it unpacks the information inside and starts the builds.h2jNubeubh{)rl}rm(h1XThe config file entries used by 'buildbot try' either specify a local queuedir (for which write and mv are used) or a remote one (using scp and ssh).rnh2jJh7h:hAhhC}ro(hG]hH]hF]hE]hI]uhLMnhN]rph`XThe config file entries used by 'buildbot try' either specify a local queuedir (for which write and mv are used) or a remote one (using scp and ssh).rqrr}rs(h1jnh2jlubaubh{)rt}ru(h1XThe advantage of this scheme is that it is quite secure, the disadvantage is that it requires fiddling outside the buildmaster config (to set the permissions on the jobdir correctly). If the buildmaster machine happens to also house the VC repository, then it can be fairly easy to keep the VC userlist in sync with the trial-build userlist. If they are on different machines, this will be much more of a hassle. It may also involve granting developer accounts on a machine that would not otherwise require them.rvh2jJh7h:hAhhC}rw(hG]hH]hF]hE]hI]uhLMrhN]rxh`XThe advantage of this scheme is that it is quite secure, the disadvantage is that it requires fiddling outside the buildmaster config (to set the permissions on the jobdir correctly). If the buildmaster machine happens to also house the VC repository, then it can be fairly easy to keep the VC userlist in sync with the trial-build userlist. If they are on different machines, this will be much more of a hassle. It may also involve granting developer accounts on a machine that would not otherwise require them.ryrz}r{(h1jvh2jtubaubh{)r|}r}(h1XTo implement this, the buildslave invokes :samp:`ssh -l {username} {host} buildbot tryserver {ARGS}`, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information.h2jJh7h:hAhhC}r~(hG]hH]hF]hE]hI]uhLM{hN]r(h`X*To implement this, the buildslave invokes rr}r(h1X*To implement this, the buildslave invokes h2j|ubj)r}r(h1UhC}r(hE]hF]hG]hH]rXsampraUrolejhI]uh2j|hN]r(h`Xssh -l rr}r(h1Xssh -l h2jubji)r}r(h1XusernamehC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xusernamerr}r(h1Uh2jubahAjsubh`X r}r(h1X h2jubji)r}r(h1XhosthC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xhostrr}r(h1Uh2jubahAjsubh`X buildbot tryserver rr}r(h1X buildbot tryserver h2jubji)r}r(h1XARGShC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XARGSrr}r(h1Uh2jubahAjsubehAjubh`Xu, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information.rr}r(h1Xu, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information.h2j|ubeubehAjubeubj)r}r(h1XF``user+password`` (PB) In this approach, each developer gets a username/password pair, which are all listed in the buildmaster's configuration file. When the developer runs :command:`buildbot try`, their machine connects to the buildmaster via PB and authenticates themselves using that username and password, then sends a PB command to start the trial build. The advantage of this scheme is that the entire configuration is performed inside the buildmaster's config file. The disadvantages are that it is less secure (while the `cred` authentication system does not expose the password in plaintext over the wire, it does not offer most of the other security properties that SSH does). In addition, the buildmaster admin is responsible for maintaining the username/password list, adding and deleting entries as developers come and go. h2j3h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X``user+password`` (PB)rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLMhN]r(j)r}r(h1X``user+password``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X user+passwordrr}r(h1Uh2jubahAjubh`X (PB)rr}r(h1X (PB)h2jubeubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]r(h{)r}r(h1XPIn this approach, each developer gets a username/password pair, which are all listed in the buildmaster's configuration file. When the developer runs :command:`buildbot try`, their machine connects to the buildmaster via PB and authenticates themselves using that username and password, then sends a PB command to start the trial build.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XIn this approach, each developer gets a username/password pair, which are all listed in the buildmaster's configuration file. When the developer runs rr}r(h1XIn this approach, each developer gets a username/password pair, which are all listed in the buildmaster's configuration file. When the developer runs h2jubj)r}r(h1X:command:`buildbot try`hC}r(hG]hH]rjahF]hE]hI]uh2jhN]rh`X buildbot tryrr}r(h1Uh2jubahAjubh`X, their machine connects to the buildmaster via PB and authenticates themselves using that username and password, then sends a PB command to start the trial build.rr}r(h1X, their machine connects to the buildmaster via PB and authenticates themselves using that username and password, then sends a PB command to start the trial build.h2jubeubh{)r}r(h1XThe advantage of this scheme is that the entire configuration is performed inside the buildmaster's config file. The disadvantages are that it is less secure (while the `cred` authentication system does not expose the password in plaintext over the wire, it does not offer most of the other security properties that SSH does). In addition, the buildmaster admin is responsible for maintaining the username/password list, adding and deleting entries as developers come and go.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XThe advantage of this scheme is that the entire configuration is performed inside the buildmaster's config file. The disadvantages are that it is less secure (while the rr}r(h1XThe advantage of this scheme is that the entire configuration is performed inside the buildmaster's config file. The disadvantages are that it is less secure (while the h2jubj)r}r(h1X`cred`hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xcredrr}r(h1Uh2jubahAjubh`X, authentication system does not expose the password in plaintext over the wire, it does not offer most of the other security properties that SSH does). In addition, the buildmaster admin is responsible for maintaining the username/password list, adding and deleting entries as developers come and go.rr}r(h1X, authentication system does not expose the password in plaintext over the wire, it does not offer most of the other security properties that SSH does). In addition, the buildmaster admin is responsible for maintaining the username/password list, adding and deleting entries as developers come and go.h2jubeubehAjubeubeubh{)r}r(h1XFor example, to set up the `jobdir` style of trial build, using a command queue directory of :file:`{MASTERDIR}/jobdir` (and assuming that all your project developers were members of the ``developers`` unix group), you would first set up that directory:h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`XFor example, to set up the rr}r(h1XFor example, to set up the h2jubj)r}r(h1X`jobdir`hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xjobdirrr}r(h1Uh2jubahAjubh`X: style of trial build, using a command queue directory of rr}r(h1X: style of trial build, using a command queue directory of h2jubj)r}r(h1UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh2jhN]r(ji)r}r(h1X MASTERDIRhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X MASTERDIRrr}r(h1Uh2jubahAjsubh`X/jobdirrr}r(h1X/jobdirh2jubehAjubh`XD (and assuming that all your project developers were members of the rr}r(h1XD (and assuming that all your project developers were members of the h2jubj)r}r(h1X``developers``hC}r (hG]hH]hF]hE]hI]uh2jhN]r h`X developersr r }r (h1Uh2jubahAjubh`X4 unix group), you would first set up that directory:rr}r(h1X4 unix group), you would first set up that directory:h2jubeubj)r}r(h1Xmkdir -p MASTERDIR/jobdir MASTERDIR/jobdir/new MASTERDIR/jobdir/cur MASTERDIR/jobdir/tmp chgrp developers MASTERDIR/jobdir MASTERDIR/jobdir/* chmod g+rwx,o-rwx MASTERDIR/jobdir MASTERDIR/jobdir/*h2jh7h:hAjhC}r(jzj{XbashjjhE]hF]hG]hH]hI]uhLMhMhhN]rh`Xmkdir -p MASTERDIR/jobdir MASTERDIR/jobdir/new MASTERDIR/jobdir/cur MASTERDIR/jobdir/tmp chgrp developers MASTERDIR/jobdir MASTERDIR/jobdir/* chmod g+rwx,o-rwx MASTERDIR/jobdir MASTERDIR/jobdir/*rr}r(h1Uh2jubaubh{)r}r(h1XGand then use the following scheduler in the buildmaster's config file::rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XFand then use the following scheduler in the buildmaster's config file:rr}r(h1XFand then use the following scheduler in the buildmaster's config file:h2jubaubj)r }r!(h1Xfrom buildbot.schedulers.trysched import Try_Jobdir s = Try_Jobdir(name="try1", builderNames=["full-linux", "full-netbsd", "full-OSX"], jobdir="jobdir") c['schedulers'] = [s]h2jh7h:hAjhC}r"(jjhE]hF]hG]hH]hI]uhLMhMhhN]r#h`Xfrom buildbot.schedulers.trysched import Try_Jobdir s = Try_Jobdir(name="try1", builderNames=["full-linux", "full-netbsd", "full-OSX"], jobdir="jobdir") c['schedulers'] = [s]r$r%}r&(h1Uh2j ubaubh{)r'}r((h1XeNote that you must create the jobdir before telling the buildmaster to use this configuration, otherwise you will get an error. Also remember that the buildmaster must be able to read and write to the jobdir as well. Be sure to watch the :file:`twistd.log` file (:ref:`Logfiles`) as you start using the jobdir, to make sure the buildmaster is happy with it.h2jh7h:hAhhC}r)(hG]hH]hF]hE]hI]uhLMhMhhN]r*(h`XNote that you must create the jobdir before telling the buildmaster to use this configuration, otherwise you will get an error. Also remember that the buildmaster must be able to read and write to the jobdir as well. Be sure to watch the r+r,}r-(h1XNote that you must create the jobdir before telling the buildmaster to use this configuration, otherwise you will get an error. Also remember that the buildmaster must be able to read and write to the jobdir as well. Be sure to watch the h2j'ubj)r.}r/(h1UhC}r0(hE]hF]hG]hH]r1Xfiler2aUrolej2hI]uh2j'hN]r3h`X twistd.logr4r5}r6(h1X twistd.logh2j.ubahAjubh`X file (r7r8}r9(h1X file (h2j'ubj)r:}r;(h1X:ref:`Logfiles`r<h2j'h7h:hAjhC}r=(UreftypeXrefjjXlogfilesU refdomainXstdr>hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r?ji)r@}rA(h1j<hC}rB(hG]hH]rC(jj>Xstd-refrDehF]hE]hI]uh2j:hN]rEh`XLogfilesrFrG}rH(h1Uh2j@ubahAjsubaubh`XO) as you start using the jobdir, to make sure the buildmaster is happy with it.rIrJ}rK(h1XO) as you start using the jobdir, to make sure the buildmaster is happy with it.h2j'ubeubj)rL}rM(h1XbPatches in the jobdir are encoded using netstrings, which place an arbitrary upper limit on patch size of 99999 bytes. If your submitted try jobs are rejected with `BadJobfile`, try increasing this limit with a snippet like this in your `master.cfg`:: from twisted.protocols.basic import NetstringReceiver NetstringReceiver.MAX_LENGTH = 1000000h2jh7h:hAjhC}rN(hG]hH]hF]hE]hI]uhLNhMhhN]rO(h{)rP}rQ(h1XPatches in the jobdir are encoded using netstrings, which place an arbitrary upper limit on patch size of 99999 bytes. If your submitted try jobs are rejected with `BadJobfile`, try increasing this limit with a snippet like this in your `master.cfg`::h2jLh7h:hAhhC}rR(hG]hH]hF]hE]hI]uhLMhN]rS(h`XPatches in the jobdir are encoded using netstrings, which place an arbitrary upper limit on patch size of 99999 bytes. If your submitted try jobs are rejected with rTrU}rV(h1XPatches in the jobdir are encoded using netstrings, which place an arbitrary upper limit on patch size of 99999 bytes. If your submitted try jobs are rejected with h2jPubj)rW}rX(h1X `BadJobfile`hC}rY(hG]hH]hF]hE]hI]uh2jPhN]rZh`X BadJobfiler[r\}r](h1Uh2jWubahAjubh`X=, try increasing this limit with a snippet like this in your r^r_}r`(h1X=, try increasing this limit with a snippet like this in your h2jPubj)ra}rb(h1X `master.cfg`hC}rc(hG]hH]hF]hE]hI]uh2jPhN]rdh`X master.cfgrerf}rg(h1Uh2jaubahAjubh`X:rh}ri(h1X:h2jPubeubj)rj}rk(h1X\from twisted.protocols.basic import NetstringReceiver NetstringReceiver.MAX_LENGTH = 1000000h2jLhAjhC}rl(jjhE]hF]hG]hH]hI]uhLMhN]rmh`X\from twisted.protocols.basic import NetstringReceiver NetstringReceiver.MAX_LENGTH = 1000000rnro}rp(h1Uh2jjubaubeubh{)rq}rr(h1XTo use the username/password form of authentication, create a :class:`Try_Userpass` instance instead. It takes the same ``builderNames`` argument as the :class:`Try_Jobdir` form, but accepts an additional ``port`` argument (to specify the TCP port to listen on) and a ``userpass`` list of username/password pairs to accept. Remember to use good passwords for this: the security of the buildslave accounts depends upon it::h2jh7h:hAhhC}rs(hG]hH]hF]hE]hI]uhLMhMhhN]rt(h`X>To use the username/password form of authentication, create a rurv}rw(h1X>To use the username/password form of authentication, create a h2jqubj)rx}ry(h1X:class:`Try_Userpass`rzh2jqh7h:hAjhC}r{(UreftypeXclassjjX Try_UserpassU refdomainXpyr|hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]r}j)r~}r(h1jzhC}r(hG]hH]r(jj|Xpy-classrehF]hE]hI]uh2jxhN]rh`X Try_Userpassrr}r(h1Uh2j~ubahAjubaubh`X% instance instead. It takes the same rr}r(h1X% instance instead. It takes the same h2jqubj)r}r(h1X``builderNames``hC}r(hG]hH]hF]hE]hI]uh2jqhN]rh`X builderNamesrr}r(h1Uh2jubahAjubh`X argument as the rr}r(h1X argument as the h2jqubj)r}r(h1X:class:`Try_Jobdir`rh2jqh7h:hAjhC}r(UreftypeXclassjjX Try_JobdirU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`X Try_Jobdirrr}r(h1Uh2jubahAjubaubh`X! form, but accepts an additional rr}r(h1X! form, but accepts an additional h2jqubj)r}r(h1X``port``hC}r(hG]hH]hF]hE]hI]uh2jqhN]rh`Xportrr}r(h1Uh2jubahAjubh`X7 argument (to specify the TCP port to listen on) and a rr}r(h1X7 argument (to specify the TCP port to listen on) and a h2jqubj)r}r(h1X ``userpass``hC}r(hG]hH]hF]hE]hI]uh2jqhN]rh`Xuserpassrr}r(h1Uh2jubahAjubh`X list of username/password pairs to accept. Remember to use good passwords for this: the security of the buildslave accounts depends upon it:rr}r(h1X list of username/password pairs to accept. Remember to use good passwords for this: the security of the buildslave accounts depends upon it:h2jqubeubj)r}r(h1X from buildbot.schedulers.trysched import Try_Userpass s = Try_Userpass(name="try2", builderNames=["full-linux", "full-netbsd", "full-OSX"], port=8031, userpass=[("alice","pw1"), ("bob", "pw2")] ) c['schedulers'] = [s]h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`X from buildbot.schedulers.trysched import Try_Userpass s = Try_Userpass(name="try2", builderNames=["full-linux", "full-netbsd", "full-OSX"], port=8031, userpass=[("alice","pw1"), ("bob", "pw2")] ) c['schedulers'] = [s]rr}r(h1Uh2jubaubh{)r}r(h1XLike most places in the buildbot, the ``port`` argument takes a `strports` specification. See :mod:`twisted.application.strports` for details.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`X&Like most places in the buildbot, the rr}r(h1X&Like most places in the buildbot, the h2jubj)r}r(h1X``port``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xportrr}r(h1Uh2jubahAjubh`X argument takes a rr}r(h1X argument takes a h2jubj)r}r(h1X `strports`hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xstrportsrr}r(h1Uh2jubahAjubh`X specification. See rr}r(h1X specification. See h2jubj)r}r(h1X#:mod:`twisted.application.strports`rh2jh7h:hAjhC}r(UreftypeXmodjjXtwisted.application.strportsU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-modrehF]hE]hI]uh2jhN]rh`Xtwisted.application.strportsrr}r(h1Uh2jubahAjubaubh`X for details.rr}r(h1X for details.h2jubeubjp)r}r(h1Uh2jh7h:hAjshC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleXSchedulers; TriggerableXsched-Triggerablerjtr(UsingleXTriggerable SchedulerjjtreuhLMhMhhN]ubh>)r}r(h1Uh2jh7h:hAhBhC}r(hG]hH]hF]hE]rjahI]uhLMhMhhN]ubjp)r}r(h1Uh2jh7h:hAjshC}r(hE]hF]hG]hH]hI]j/]r(j1XTriggersUindex-1rUtraj4uhLMhMhhN]ubh>)r}r(h1Uh2jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLMhMhhN]ubh>)r}r(h1X.. _Triggerable-Scheduler:h2jh7h:h<}hAhBhC}r(hE]hF]hG]hH]hI]hJj!uhLMhMhhV}rjjshN]ubeubh3)r}r(h1Uh2h4h7h:h<}rh)jshAhOhC}r (hG]hH]hF]hE]r (j!jUid9r ehI]r (hh)euhLMhMhhV}r (j!jjjuhN]r(hY)r}r(h1j&h2jh7h:hAh]hC}r(hE]hF]hG]hH]hI]hJj uhLMhMhhN]rh`XTriggerable Schedulerrr}r(h1j&h2jubaubh{)r}r(h1XThe :class:`Triggerable` scheduler waits to be triggered by a Trigger step (see :ref:`Triggering-Schedulers`) in another build. That step can optionally wait for the scheduler's builds to complete. This provides two advantages over Dependent schedulers. First, the same scheduler can be triggered from multiple builds. Second, the ability to wait for a Triggerable's builds to complete provides a form of "subroutine call", where one or more builds can "call" a scheduler to perform some work for them, perhaps on other buildslaves. The Triggerable-Scheduler supports multiple codebases. The scheduler filters out all codebases from Trigger steps that are not configured in the scheduler.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`XThe rr}r(h1XThe h2jubj)r}r(h1X:class:`Triggerable`rh2jh7h:hAjhC}r (UreftypeXclassjjX TriggerableU refdomainXpyr!hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]r"j)r#}r$(h1jhC}r%(hG]hH]r&(jj!Xpy-classr'ehF]hE]hI]uh2jhN]r(h`X Triggerabler)r*}r+(h1Uh2j#ubahAjubaubh`X8 scheduler waits to be triggered by a Trigger step (see r,r-}r.(h1X8 scheduler waits to be triggered by a Trigger step (see h2jubj)r/}r0(h1X:ref:`Triggering-Schedulers`r1h2jh7h:hAjhC}r2(UreftypeXrefjjXtriggering-schedulersU refdomainXstdr3hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r4ji)r5}r6(h1j1hC}r7(hG]hH]r8(jj3Xstd-refr9ehF]hE]hI]uh2j/hN]r:h`XTriggering-Schedulersr;r<}r=(h1Uh2j5ubahAjsubaubh`XD) in another build. That step can optionally wait for the scheduler's builds to complete. This provides two advantages over Dependent schedulers. First, the same scheduler can be triggered from multiple builds. Second, the ability to wait for a Triggerable's builds to complete provides a form of "subroutine call", where one or more builds can "call" a scheduler to perform some work for them, perhaps on other buildslaves. The Triggerable-Scheduler supports multiple codebases. The scheduler filters out all codebases from Trigger steps that are not configured in the scheduler.r>r?}r@(h1XD) in another build. That step can optionally wait for the scheduler's builds to complete. This provides two advantages over Dependent schedulers. First, the same scheduler can be triggered from multiple builds. Second, the ability to wait for a Triggerable's builds to complete provides a form of "subroutine call", where one or more builds can "call" a scheduler to perform some work for them, perhaps on other buildslaves. The Triggerable-Scheduler supports multiple codebases. The scheduler filters out all codebases from Trigger steps that are not configured in the scheduler.h2jubeubh{)rA}rB(h1X#The parameters are just the basics:rCh2jh7h:hAhhC}rD(hG]hH]hF]hE]hI]uhLMhMhhN]rEh`X#The parameters are just the basics:rFrG}rH(h1jCh2jAubaubh{)rI}rJ(h1X``name``rKh2jh7h:hAhhC}rL(hG]hH]hF]hE]hI]uhLMhMhhN]rMj)rN}rO(h1jKhC}rP(hG]hH]hF]hE]hI]uh2jIhN]rQh`XnamerRrS}rT(h1Uh2jNubahAjubaubh{)rU}rV(h1X``builderNames``rWh2jh7h:hAhhC}rX(hG]hH]hF]hE]hI]uhLMhMhhN]rYj)rZ}r[(h1jWhC}r\(hG]hH]hF]hE]hI]uh2jUhN]r]h`X builderNamesr^r_}r`(h1Uh2jZubahAjubaubh{)ra}rb(h1X``properties``rch2jh7h:hAhhC}rd(hG]hH]hF]hE]hI]uhLMhMhhN]rej)rf}rg(h1jchC}rh(hG]hH]hF]hE]hI]uh2jahN]rih`X propertiesrjrk}rl(h1Uh2jfubahAjubaubj)rm}rn(h1Uh2jh7h:hAjhC}ro(hG]hH]hF]hE]hI]uhLNhMhhN]rpj)rq}rr(h1X2``codebases`` See :ref:`Configuring-Schedulers`. h2jmh7h:hAjhC}rs(hG]hH]hF]hE]hI]uhLMhN]rt(j)ru}rv(h1X ``codebases``rwh2jqh7h:hAjhC}rx(hG]hH]hF]hE]hI]uhLMhN]ryj)rz}r{(h1jwhC}r|(hG]hH]hF]hE]hI]uh2juhN]r}h`X codebasesr~r}r(h1Uh2jzubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jqhN]rh{)r}r(h1X"See :ref:`Configuring-Schedulers`.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XSee rr}r(h1XSee h2jubj)r}r(h1X:ref:`Configuring-Schedulers`rh2jh7h:hAjhC}r(UreftypeXrefjjXconfiguring-schedulersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`XConfiguring-Schedulersrr}r(h1Uh2jubahAjsubaubh`X.r}r(h1X.h2jubeubahAjubeubaubh{)r}r(h1XiThis class is only useful in conjunction with the :class:`Trigger` step. Here is a fully-worked example::h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`X2This class is only useful in conjunction with the rr}r(h1X2This class is only useful in conjunction with the h2jubj)r}r(h1X:class:`Trigger`rh2jh7h:hAjhC}r(UreftypeXclassjjXTriggerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`XTriggerrr}r(h1Uh2jubahAjubaubh`X& step. Here is a fully-worked example:rr}r(h1X& step. Here is a fully-worked example:h2jubeubj)r}r(h1Xfrom buildbot.schedulers import basic, timed, triggerable from buildbot.process import factory from buildbot.steps import trigger checkin = basic.SingleBranchScheduler(name="checkin", branch=None, treeStableTimer=5*60, builderNames=["checkin"]) nightly = timed.Nightly(name='nightly', branch=None, builderNames=['nightly'], hour=3, minute=0) mktarball = triggerable.Triggerable(name="mktarball", builderNames=["mktarball"]) build = triggerable.Triggerable(name="build-all-platforms", builderNames=["build-all-platforms"]) test = triggerable.Triggerable(name="distributed-test", builderNames=["distributed-test"]) package = triggerable.Triggerable(name="package-all-platforms", builderNames=["package-all-platforms"]) c['schedulers'] = [mktarball, checkin, nightly, build, test, package] # on checkin, make a tarball, build it, and test it checkin_factory = factory.BuildFactory() checkin_factory.addStep(trigger.Trigger(schedulerNames=['mktarball'], waitForFinish=True)) checkin_factory.addStep(trigger.Trigger(schedulerNames=['build-all-platforms'], waitForFinish=True)) checkin_factory.addStep(trigger.Trigger(schedulerNames=['distributed-test'], waitForFinish=True)) # and every night, make a tarball, build it, and package it nightly_factory = factory.BuildFactory() nightly_factory.addStep(trigger.Trigger(schedulerNames=['mktarball'], waitForFinish=True)) nightly_factory.addStep(trigger.Trigger(schedulerNames=['build-all-platforms'], waitForFinish=True)) nightly_factory.addStep(trigger.Trigger(schedulerNames=['package-all-platforms'], waitForFinish=True))h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`Xfrom buildbot.schedulers import basic, timed, triggerable from buildbot.process import factory from buildbot.steps import trigger checkin = basic.SingleBranchScheduler(name="checkin", branch=None, treeStableTimer=5*60, builderNames=["checkin"]) nightly = timed.Nightly(name='nightly', branch=None, builderNames=['nightly'], hour=3, minute=0) mktarball = triggerable.Triggerable(name="mktarball", builderNames=["mktarball"]) build = triggerable.Triggerable(name="build-all-platforms", builderNames=["build-all-platforms"]) test = triggerable.Triggerable(name="distributed-test", builderNames=["distributed-test"]) package = triggerable.Triggerable(name="package-all-platforms", builderNames=["package-all-platforms"]) c['schedulers'] = [mktarball, checkin, nightly, build, test, package] # on checkin, make a tarball, build it, and test it checkin_factory = factory.BuildFactory() checkin_factory.addStep(trigger.Trigger(schedulerNames=['mktarball'], waitForFinish=True)) checkin_factory.addStep(trigger.Trigger(schedulerNames=['build-all-platforms'], waitForFinish=True)) checkin_factory.addStep(trigger.Trigger(schedulerNames=['distributed-test'], waitForFinish=True)) # and every night, make a tarball, build it, and package it nightly_factory = factory.BuildFactory() nightly_factory.addStep(trigger.Trigger(schedulerNames=['mktarball'], waitForFinish=True)) nightly_factory.addStep(trigger.Trigger(schedulerNames=['build-all-platforms'], waitForFinish=True)) nightly_factory.addStep(trigger.Trigger(schedulerNames=['package-all-platforms'], waitForFinish=True))rr}r(h1Uh2jubaubjp)r}r(h1Uh2jh7h:hAjshC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleXSchedulers; NightlyTriggerableXsched-NightlyTriggerablerjtr(UsingleXNightlyTriggerable SchedulerjjtreuhLMhMhhN]ubh>)r}r(h1Uh2jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLMhMhhN]ubeubh3)r}r(h1Uh2h4h7h:h<}hAhOhC}r(hG]hH]hF]hE]r(j4jehI]rh auhLMhMhhV}rjjshN]r(hY)r}r(h1j9h2jh7h:hAh]hC}r(hE]hF]hG]hH]hI]hJj3uhLMhMhhN]rh`XNightlyTriggerable Schedulerrr}r(h1j9h2jubaubjp)r}r(h1Uh2jh7NhAjshC}r(hE]hF]hG]hH]hI]Uentries]r(j1X=buildbot.schedulers.timed.NightlyTriggerable (built-in class)hUtrauhLNhMhhN]ubcsphinx.addnodes desc r)r}r(h1Uh2jh7NhAUdescrhC}r(UnoindexrUdomainrXpyhE]hF]hG]hH]hI]UobjtyperXclassrUdesctyperjuhLNhMhhN]r(csphinx.addnodes desc_signature r)r}r(h1X,buildbot.schedulers.timed.NightlyTriggerableh2jh7h:hAUdesc_signaturerhC}r(hE]rhaUmodulerNhF]hG]hH]hI]rhaUfullnamerhUclassrXbuildbot.schedulers.timedUfirstruhLMhMhhN]r(csphinx.addnodes desc_annotation r)r}r(h1Xclass h2jh7h:hAUdesc_annotationrhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`Xclass rr}r(h1Uh2jubaubcsphinx.addnodes desc_addname r)r}r(h1Xbuildbot.schedulers.timed.h2jh7h:hAU desc_addnamerhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`Xbuildbot.schedulers.timed.rr}r(h1Uh2jubaubcsphinx.addnodes desc_name r)r}r(h1XNightlyTriggerableh2jh7h:hAU desc_namerhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XNightlyTriggerabler r }r (h1Uh2jubaubeubcsphinx.addnodes desc_content r )r }r(h1Uh2jh7h:hAU desc_contentrhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]ubeubh{)r}r(h1X^The :class:`NightlyTriggerable` scheduler is a mix of the :class:`Nightly` and :class:`Triggerable` schedulers. This scheduler triggers builds at a particular time of day, week, or year, exactly as the :class:`Nightly` scheduler. However, the source stamp set that is used that provided by the last :class:`Trigger` step that targeted this scheduler.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`XThe rr}r(h1XThe h2jubj)r}r(h1X:class:`NightlyTriggerable`rh2jh7h:hAjhC}r(UreftypeXclassjjXNightlyTriggerableU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rj)r}r(h1jhC}r (hG]hH]r!(jjXpy-classr"ehF]hE]hI]uh2jhN]r#h`XNightlyTriggerabler$r%}r&(h1Uh2jubahAjubaubh`X scheduler is a mix of the r'r(}r)(h1X scheduler is a mix of the h2jubj)r*}r+(h1X:class:`Nightly`r,h2jh7h:hAjhC}r-(UreftypeXclassjjXNightlyU refdomainXpyr.hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]r/j)r0}r1(h1j,hC}r2(hG]hH]r3(jj.Xpy-classr4ehF]hE]hI]uh2j*hN]r5h`XNightlyr6r7}r8(h1Uh2j0ubahAjubaubh`X and r9r:}r;(h1X and h2jubj)r<}r=(h1X:class:`Triggerable`r>h2jh7h:hAjhC}r?(UreftypeXclassjjX TriggerableU refdomainXpyr@hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rAj)rB}rC(h1j>hC}rD(hG]hH]rE(jj@Xpy-classrFehF]hE]hI]uh2j<hN]rGh`X TriggerablerHrI}rJ(h1Uh2jBubahAjubaubh`Xg schedulers. This scheduler triggers builds at a particular time of day, week, or year, exactly as the rKrL}rM(h1Xg schedulers. This scheduler triggers builds at a particular time of day, week, or year, exactly as the h2jubj)rN}rO(h1X:class:`Nightly`rPh2jh7h:hAjhC}rQ(UreftypeXclassjjXNightlyU refdomainXpyrRhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rSj)rT}rU(h1jPhC}rV(hG]hH]rW(jjRXpy-classrXehF]hE]hI]uh2jNhN]rYh`XNightlyrZr[}r\(h1Uh2jTubahAjubaubh`XQ scheduler. However, the source stamp set that is used that provided by the last r]r^}r_(h1XQ scheduler. However, the source stamp set that is used that provided by the last h2jubj)r`}ra(h1X:class:`Trigger`rbh2jh7h:hAjhC}rc(UreftypeXclassjjXTriggerU refdomainXpyrdhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rej)rf}rg(h1jbhC}rh(hG]hH]ri(jjdXpy-classrjehF]hE]hI]uh2j`hN]rkh`XTriggerrlrm}rn(h1Uh2jfubahAjubaubh`X# step that targeted this scheduler.rorp}rq(h1X# step that targeted this scheduler.h2jubeubh{)rr}rs(h1X#The parameters are just the basics:rth2jh7h:hAhhC}ru(hG]hH]hF]hE]hI]uhLM!hMhhN]rvh`X#The parameters are just the basics:rwrx}ry(h1jth2jrubaubh{)rz}r{(h1X``name``r|h2jh7h:hAhhC}r}(hG]hH]hF]hE]hI]uhLM#hMhhN]r~j)r}r(h1j|hC}r(hG]hH]hF]hE]hI]uh2jzhN]rh`Xnamerr}r(h1Uh2jubahAjubaubh{)r}r(h1X``builderNames``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM%hMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X builderNamesrr}r(h1Uh2jubahAjubaubh{)r}r(h1X``properties``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM'hMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X propertiesrr}r(h1Uh2jubahAjubaubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rj)r}r(h1X1``codebases`` See :ref:`Configuring-Schedulers`. h2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM*hN]r(j)r}r(h1X ``codebases``rh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM*hN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X codebasesrr}r(h1Uh2jubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X"See :ref:`Configuring-Schedulers`.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM*hN]r(h`XSee rr}r(h1XSee h2jubj)r}r(h1X:ref:`Configuring-Schedulers`rh2jh7h:hAjhC}r(UreftypeXrefjjXconfiguring-schedulersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLM*hN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`XConfiguring-Schedulersrr}r(h1Uh2jubahAjsubaubh`X.r}r(h1X.h2jubeubahAjubeubaubh{)r}r(h1X ``minute``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM,hMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xminuterr}r(h1Uh2jubahAjubaubh{)r}r(h1X``hour``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM.hMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xhourrr}r(h1Uh2jubahAjubaubh{)r}r(h1X``dayOfMonth``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM0hMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X dayOfMonthrr}r(h1Uh2jubahAjubaubh{)r}r(h1X ``month``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM2hMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xmonthrr}r(h1Uh2jubahAjubaubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rj)r}r(h1X'``dayOfWeek`` See :bb:sched:`Nightly`. h2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLM5hN]r(j)r}r(h1X ``dayOfWeek``rh2jh7h:hAjhC}r (hG]hH]hF]hE]hI]uhLM5hN]r j)r }r (h1jhC}r (hG]hH]hF]hE]hI]uh2jhN]rh`X dayOfWeekrr}r(h1Uh2j ubahAjubaubj)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1XSee :bb:sched:`Nightly`.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM5hN]r(h`XSee rr}r(h1XSee h2jubj)r}r(h1X:bb:sched:`Nightly`rh2jh7h:hAjhC}r (UreftypeXschedjjXNightlyU refdomainXbbr!hE]hF]U refexplicithG]hH]hI]jjuhLM5hN]r"j)r#}r$(h1jhC}r%(hG]hH]r&(jj!Xbb-schedr'ehF]hE]hI]uh2jhN]r(h`XNightlyr)r*}r+(h1Uh2j#ubahAjubaubh`X.r,}r-(h1X.h2jubeubahAjubeubaubh{)r.}r/(h1XThis class is only useful in conjunction with the :class:`Trigger` step. Note that ``waitForFinish`` is ignored by :class:`Trigger` steps targeting this scheduler.h2jh7h:hAhhC}r0(hG]hH]hF]hE]hI]uhLM7hMhhN]r1(h`X2This class is only useful in conjunction with the r2r3}r4(h1X2This class is only useful in conjunction with the h2j.ubj)r5}r6(h1X:class:`Trigger`r7h2j.h7h:hAjhC}r8(UreftypeXclassjjXTriggerU refdomainXpyr9hE]hF]U refexplicithG]hH]hI]jjjNjNuhLM7hN]r:j)r;}r<(h1j7hC}r=(hG]hH]r>(jj9Xpy-classr?ehF]hE]hI]uh2j5hN]r@h`XTriggerrArB}rC(h1Uh2j;ubahAjubaubh`X step. Note that rDrE}rF(h1X step. Note that h2j.ubj)rG}rH(h1X``waitForFinish``hC}rI(hG]hH]hF]hE]hI]uh2j.hN]rJh`X waitForFinishrKrL}rM(h1Uh2jGubahAjubh`X is ignored by rNrO}rP(h1X is ignored by h2j.ubj)rQ}rR(h1X:class:`Trigger`rSh2j.h7h:hAjhC}rT(UreftypeXclassjjXTriggerU refdomainXpyrUhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM7hN]rVj)rW}rX(h1jShC}rY(hG]hH]rZ(jjUXpy-classr[ehF]hE]hI]uh2jQhN]r\h`XTriggerr]r^}r_(h1Uh2jWubahAjubaubh`X steps targeting this scheduler.r`ra}rb(h1X steps targeting this scheduler.h2j.ubeubh{)rc}rd(h1X Here is a fully-worked example::reh2jh7h:hAhhC}rf(hG]hH]hF]hE]hI]uhLM:hMhhN]rgh`XHere is a fully-worked example:rhri}rj(h1XHere is a fully-worked example:h2jcubaubj)rk}rl(h1Xfrom buildbot.schedulers import basic, timed from buildbot.process import factory from buildbot.steps import shell, trigger checkin = basic.SingleBranchScheduler(name="checkin", branch=None, treeStableTimer=5*60, builderNames=["checkin"]) nightly = timed.NightlyTriggerable(name='nightly', builderNames=['nightly'], hour=3, minute=0) c['schedulers'] = [checkin, nightly] # on checkin, run tests checkin_factory = factory.BuildFactory() checkin_factory.addStep(shell.Test()) checkin_factory.addStep(trigger.Trigger(schedulerNames=['nightly'])) # and every night, package the latest successful build nightly_factory = factory.BuildFactory() nightly_factory.addStep(shell.ShellCommand(command=['make', 'package']))h2jh7h:hAjhC}rm(jjhE]hF]hG]hH]hI]uhLM<hMhhN]rnh`Xfrom buildbot.schedulers import basic, timed from buildbot.process import factory from buildbot.steps import shell, trigger checkin = basic.SingleBranchScheduler(name="checkin", branch=None, treeStableTimer=5*60, builderNames=["checkin"]) nightly = timed.NightlyTriggerable(name='nightly', builderNames=['nightly'], hour=3, minute=0) c['schedulers'] = [checkin, nightly] # on checkin, run tests checkin_factory = factory.BuildFactory() checkin_factory.addStep(shell.Test()) checkin_factory.addStep(trigger.Trigger(schedulerNames=['nightly'])) # and every night, package the latest successful build nightly_factory = factory.BuildFactory() nightly_factory.addStep(shell.ShellCommand(command=['make', 'package']))rorp}rq(h1Uh2jkubaubjp)rr}rs(h1Uh2jh7h:hAjshC}rt(hE]hF]hG]hH]hI]Uentries]ru((UsingleXSchedulers; ForceSchedulerXsched-ForceSchedulerrvjvtrw(UsingleXForceScheduler SchedulerjvjvtrxeuhLMUhMhhN]ubh>)ry}rz(h1Uh2jh7h:hAhBhC}r{(hG]hH]hF]hE]r|jvahI]uhLMUhMhhN]ubjp)r}}r~(h1Uh2jh7h:hAjshC}r(hE]hF]hG]hH]hI]j/]r(j1X Forced BuildsUindex-2rUtraj4uhLMVhMhhN]ubh>)r}r(h1Uh2jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLMWhMhhN]ubeubh3)r}r(h1Uh2h4h7h:h<}hAhOhC}r(hG]hH]hF]hE]r(jGjehI]rh auhLMYhMhhV}rjjshN]r(hY)r}r(h1jLh2jh7h:hAh]hC}r(hE]hF]hG]hH]hI]hJjFuhLMYhMhhN]rh`XForceScheduler Schedulerrr}r(h1jLh2jubaubh{)r}r(h1XdThe :class:`ForceScheduler` scheduler is the way you can configure a force build form in the web UI.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM[hMhhN]r(h`XThe rr}r(h1XThe h2jubj)r}r(h1X:class:`ForceScheduler`rh2jh7h:hAjhC}r(UreftypeXclassjjXForceSchedulerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM[hN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`XForceSchedulerrr}r(h1Uh2jubahAjubaubh`XI scheduler is the way you can configure a force build form in the web UI.rr}r(h1XI scheduler is the way you can configure a force build form in the web UI.h2jubeubh{)r}r(h1XIn the ``builder/`` web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM^hMhhN]r(h`XIn the rr}r(h1XIn the h2jubj)r}r(h1X``builder/``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xbuilder/rr}r(h1Uh2jubahAjubh`Xh web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.rr}r(h1Xh web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.h2jubeubh{)r}r(h1XThis allows you to customize exactly how the build form looks, which builders have a force build form (it might not make sense to force build every builder), and who is allowed to force builds on which builders.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMahMhhN]rh`XThis allows you to customize exactly how the build form looks, which builders have a force build form (it might not make sense to force build every builder), and who is allowed to force builds on which builders.rr}r(h1jh2jubaubh{)r}r(h1X-The scheduler takes the following parameters:rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMehMhhN]rh`X-The scheduler takes the following parameters:rr}r(h1jh2jubaubh{)r}r(h1X``name``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMghMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xnamerr}r(h1Uh2jubahAjubaubh{)r}r(h1X``builderNames``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMihMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X builderNamesrr}r(h1Uh2jubahAjubaubcdocutils.nodes block_quote r)r}r(h1Uh2jh7h:hAU block_quoterhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1X"See :ref:`Configuring-Schedulers`.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMkhN]r(h`XSee rr}r(h1XSee h2jubj)r}r(h1X:ref:`Configuring-Schedulers`rh2jh7h:hAjhC}r(UreftypeXrefjjXconfiguring-schedulersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMkhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`XConfiguring-Schedulersrr}r(h1Uh2jubahAjsubaubh`X.r}r(h1X.h2jubeubaubh{)r}r(h1X ``reason``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMmhMhhN]rj)r }r (h1jhC}r (hG]hH]hF]hE]hI]uh2jhN]r h`Xreasonr r}r(h1Uh2j ubahAjubaubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XA :ref:`parameter ` specifying the reason for the build. The default value is a string parameter with value "force build".h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMohN]r(h`XA rr}r(h1XA h2jubj)r}r(h1X,:ref:`parameter `rh2jh7h:hAjhC}r(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMohN]r ji)r!}r"(h1jhC}r#(hG]hH]r$(jjXstd-refr%ehF]hE]hI]uh2jhN]r&h`X parameterr'r(}r)(h1Uh2j!ubahAjsubaubh`Xh specifying the reason for the build. The default value is a string parameter with value "force build".r*r+}r,(h1Xh specifying the reason for the build. The default value is a string parameter with value "force build".h2jubeubaubh{)r-}r.(h1X``reasonString``r/h2jh7h:hAhhC}r0(hG]hH]hF]hE]hI]uhLMrhMhhN]r1j)r2}r3(h1j/hC}r4(hG]hH]hF]hE]hI]uh2j-hN]r5h`X reasonStringr6r7}r8(h1Uh2j2ubahAjubaubj)r9}r:(h1Uh2jh7h:hAjhC}r;(hG]hH]hF]hE]hI]uhLNhMhhN]r<h{)r=}r>(h1XA string that will be used to create the build reason for the forced build. This string can contain the placeholders '%(owner)s' and '%(reason)s', which represents the value typed into the reason field.r?h2j9h7h:hAhhC}r@(hG]hH]hF]hE]hI]uhLMthN]rAh`XA string that will be used to create the build reason for the forced build. This string can contain the placeholders '%(owner)s' and '%(reason)s', which represents the value typed into the reason field.rBrC}rD(h1j?h2j=ubaubaubh{)rE}rF(h1X ``username``rGh2jh7h:hAhhC}rH(hG]hH]hF]hE]hI]uhLMxhMhhN]rIj)rJ}rK(h1jGhC}rL(hG]hH]hF]hE]hI]uh2jEhN]rMh`XusernamerNrO}rP(h1Uh2jJubahAjubaubj)rQ}rR(h1Uh2jh7h:hAjhC}rS(hG]hH]hF]hE]hI]uhLNhMhhN]rTh{)rU}rV(h1XA :ref:`parameter ` specifying the project for the build. The default value is a username parameter,h2jQh7h:hAhhC}rW(hG]hH]hF]hE]hI]uhLMzhN]rX(h`XA rYrZ}r[(h1XA h2jUubj)r\}r](h1X,:ref:`parameter `r^h2jUh7h:hAjhC}r_(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdr`hE]hF]U refexplicithG]hH]hI]jjuhLMzhN]raji)rb}rc(h1j^hC}rd(hG]hH]re(jj`Xstd-refrfehF]hE]hI]uh2j\hN]rgh`X parameterrhri}rj(h1Uh2jbubahAjsubaubh`XR specifying the project for the build. The default value is a username parameter,rkrl}rm(h1XR specifying the project for the build. The default value is a username parameter,h2jUubeubaubh{)rn}ro(h1X ``codebases``rph2jh7h:hAhhC}rq(hG]hH]hF]hE]hI]uhLM}hMhhN]rrj)rs}rt(h1jphC}ru(hG]hH]hF]hE]hI]uh2jnhN]rvh`X codebasesrwrx}ry(h1Uh2jsubahAjubaubj)rz}r{(h1Uh2jh7h:hAjhC}r|(hG]hH]hF]hE]hI]uhLNhMhhN]r}h{)r~}r(h1XA list of strings or :ref:`CodebaseParameter ` specifying the codebases that should be presented. The default is a single codebase with no name.h2jzh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XA list of strings or rr}r(h1XA list of strings or h2j~ubj)r}r(h1X4:ref:`CodebaseParameter `rh2j~h7h:hAjhC}r(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`XCodebaseParameterrr}r(h1Uh2jubahAjsubaubh`Xb specifying the codebases that should be presented. The default is a single codebase with no name.rr}r(h1Xb specifying the codebases that should be presented. The default is a single codebase with no name.h2j~ubeubaubh{)r}r(h1X``properties``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X propertiesrr}r(h1Uh2jubahAjubaubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XA list of :ref:`parameters `, one for each property. These can be arbitrary parameters, where the parameter's name is taken as the property name, or ``AnyPropertyParameter``, which allows the web user to specify the property name.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`X A list of rr}r(h1X A list of h2jubj)r}r(h1X-:ref:`parameters `rh2jh7h:hAjhC}r(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`X parametersrr}r(h1Uh2jubahAjsubaubh`Xz, one for each property. These can be arbitrary parameters, where the parameter's name is taken as the property name, or rr}r(h1Xz, one for each property. These can be arbitrary parameters, where the parameter's name is taken as the property name, or h2jubj)r}r(h1X``AnyPropertyParameter``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`XAnyPropertyParameterrr}r(h1Uh2jubahAjubh`X9, which allows the web user to specify the property name.rr}r(h1X9, which allows the web user to specify the property name.h2jubeubaubh{)r}r(h1X``buttonName``rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X buttonNamerr}r(h1Uh2jubahAjubaubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XbThe name of the "submit" button on the resulting force-build form. This defaults to "Force Build".rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]rh`XbThe name of the "submit" button on the resulting force-build form. This defaults to "Force Build".rr}r(h1jh2jubaubaubh{)r}r(h1XfAn example may be better than long explanation. What you need in your config file is something like::h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XeAn example may be better than long explanation. What you need in your config file is something like:rr}r(h1XeAn example may be better than long explanation. What you need in your config file is something like:h2jubaubj)r}r(h1X!from buildbot.schedulers.forcesched import * sch = ForceScheduler(name="force", builderNames=["my-builder"], # will generate a combo box branch=ChoiceStringParameter(name="branch", choices=["main","devel"], default="main"), # will generate a text input reason=StringParameter(name="reason",label="reason:
", required=True, size=80), # will generate nothing in the form, but revision, repository, # and project are needed by buildbot scheduling system so we # need to pass a value ("") revision=FixedParameter(name="revision", default=""), repository=FixedParameter(name="repository", default=""), project=FixedParameter(name="project", default=""), # in case you dont require authentication this will display # input for user to type his name username=UserNameParameter(label="your name:
", size=80), # A completely customized property list. The name of the # property is the name of the parameter properties=[ BooleanParameter(name="force_build_clean", label="force a make clean", default=False), StringParameter(name="pull_url", label="optionally give a public Git pull url:
", default="", size=80) ] ) c['schedulers'].append(sch)h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`X!from buildbot.schedulers.forcesched import * sch = ForceScheduler(name="force", builderNames=["my-builder"], # will generate a combo box branch=ChoiceStringParameter(name="branch", choices=["main","devel"], default="main"), # will generate a text input reason=StringParameter(name="reason",label="reason:
", required=True, size=80), # will generate nothing in the form, but revision, repository, # and project are needed by buildbot scheduling system so we # need to pass a value ("") revision=FixedParameter(name="revision", default=""), repository=FixedParameter(name="repository", default=""), project=FixedParameter(name="project", default=""), # in case you dont require authentication this will display # input for user to type his name username=UserNameParameter(label="your name:
", size=80), # A completely customized property list. The name of the # property is the name of the parameter properties=[ BooleanParameter(name="force_build_clean", label="force a make clean", default=False), StringParameter(name="pull_url", label="optionally give a public Git pull url:
", default="", size=80) ] ) c['schedulers'].append(sch)rr}r(h1Uh2jubaubh3)r}r(h1Uh2jh7h:hAhOhC}r(hG]hH]hF]hE]rU authorizationrahI]rhauhLMhMhhN]r(hY)r}r(h1X Authorizationrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`X Authorizationrr}r(h1jh2jubaubh{)r}r(h1XThe force scheduler uses the web status's :ref:`authorization ` framework to determine which user has the right to force which build. Here is an example of code on how you can define which user has which right::h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`X*The force scheduler uses the web status's rr}r(h1X*The force scheduler uses the web status's h2jubj)r}r(h1X$:ref:`authorization `rh2jh7h:hAjhC}r (UreftypeXrefjjX authorizationU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r ji)r }r (h1jhC}r(hG]hH]r(jj Xstd-refrehF]hE]hI]uh2jhN]rh`X authorizationrr}r(h1Uh2j ubahAjsubaubh`X framework to determine which user has the right to force which build. Here is an example of code on how you can define which user has which right:rr}r(h1X framework to determine which user has the right to force which build. Here is an example of code on how you can define which user has which right:h2jubeubj)r}r(h1Xuser_mapping = { re.compile("project1-builder"): ["project1-maintainer", "john"] , re.compile("project2-builder"): ["project2-maintainer", "jack"], re.compile(".*"): ["root"] } def force_auth(user, status): global user_mapping for r,users in user_mapping.items(): if r.match(status.name): if user in users: return True return False # use authz_cfg in your WebStatus setup authz_cfg=authz.Authz( auth=my_auth, forceBuild = force_auth, )h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`Xuser_mapping = { re.compile("project1-builder"): ["project1-maintainer", "john"] , re.compile("project2-builder"): ["project2-maintainer", "jack"], re.compile(".*"): ["root"] } def force_auth(user, status): global user_mapping for r,users in user_mapping.items(): if r.match(status.name): if user in users: return True return False # use authz_cfg in your WebStatus setup authz_cfg=authz.Authz( auth=my_auth, forceBuild = force_auth, )rr}r(h1Uh2jubaubh>)r}r (h1X.. _ForceScheduler-Parameters:h2jh7h:hAhBhC}r!(hE]hF]hG]hH]hI]hJUforcescheduler-parametersr"uhLMhMhhN]ubeubh3)r#}r$(h1Uh2jh7h:h<}r%hjshAhOhC}r&(hG]hH]hF]hE]r'(Uforcesched-parametersr(j"ehI]r)(hheuhLMhMhhV}r*j"jshN]r+(hY)r,}r-(h1XForceSched Parametersr.h2j#h7h:hAh]hC}r/(hG]hH]hF]hE]hI]uhLMhMhhN]r0h`XForceSched Parametersr1r2}r3(h1j.h2j,ubaubh{)r4}r5(h1XMost of the arguments to ``ForceScheduler`` are "parameters". Several classes of parameters are available, each describing a different kind of input from a force-build form.h2j#h7h:hAhhC}r6(hG]hH]hF]hE]hI]uhLMhMhhN]r7(h`XMost of the arguments to r8r9}r:(h1XMost of the arguments to h2j4ubj)r;}r<(h1X``ForceScheduler``hC}r=(hG]hH]hF]hE]hI]uh2j4hN]r>h`XForceSchedulerr?r@}rA(h1Uh2j;ubahAjubh`X are "parameters". Several classes of parameters are available, each describing a different kind of input from a force-build form.rBrC}rD(h1X are "parameters". Several classes of parameters are available, each describing a different kind of input from a force-build form.h2j4ubeubh{)rE}rF(h1X0All parameter types have a few common arguments:rGh2j#h7h:hAhhC}rH(hG]hH]hF]hE]hI]uhLMhMhhN]rIh`X0All parameter types have a few common arguments:rJrK}rL(h1jGh2jEubaubh{)rM}rN(h1X``name`` (required)rOh2j#h7h:hAhhC}rP(hG]hH]hF]hE]hI]uhLMhMhhN]rQ(j)rR}rS(h1X``name``hC}rT(hG]hH]hF]hE]hI]uh2jMhN]rUh`XnamerVrW}rX(h1Uh2jRubahAjubh`X (required)rYrZ}r[(h1X (required)h2jMubeubj)r\}r](h1Uh2j#h7h:hAjhC}r^(hG]hH]hF]hE]hI]uhLNhMhhN]r_h{)r`}ra(h1XThe name of the parameter. For properties, this will correspond to the name of the property that your parameter will set. The name is also used internally as the identifier for in the HTML form.rbh2j\h7h:hAhhC}rc(hG]hH]hF]hE]hI]uhLMhN]rdh`XThe name of the parameter. For properties, this will correspond to the name of the property that your parameter will set. The name is also used internally as the identifier for in the HTML form.rerf}rg(h1jbh2j`ubaubaubh{)rh}ri(h1X-``label`` (optional; default is same as name)rjh2j#h7h:hAhhC}rk(hG]hH]hF]hE]hI]uhLMhMhhN]rl(j)rm}rn(h1X ``label``hC}ro(hG]hH]hF]hE]hI]uh2jhhN]rph`Xlabelrqrr}rs(h1Uh2jmubahAjubh`X$ (optional; default is same as name)rtru}rv(h1X$ (optional; default is same as name)h2jhubeubj)rw}rx(h1Uh2j#h7h:hAjhC}ry(hG]hH]hF]hE]hI]uhLNhMhhN]rzh{)r{}r|(h1X[The label of the parameter. This is what is displayed to the user. HTML is permitted here.r}h2jwh7h:hAhhC}r~(hG]hH]hF]hE]hI]uhLMhN]rh`X[The label of the parameter. This is what is displayed to the user. HTML is permitted here.rr}r(h1j}h2j{ubaubaubh{)r}r(h1X#``default`` (optional; default: "")rh2j#h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X ``default``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xdefaultrr}r(h1Uh2jubahAjubh`X (optional; default: "")rr}r(h1X (optional; default: "")h2jubeubj)r}r(h1Uh2j#h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XLThe default value for the parameter, that is used if there is no user input.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]rh`XLThe default value for the parameter, that is used if there is no user input.rr}r(h1jh2jubaubaubh{)r}r(h1X'``required`` (optional; default: False)rh2j#h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X ``required``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xrequiredrr}r(h1Uh2jubahAjubh`X (optional; default: False)rr}r(h1X (optional; default: False)h2jubeubj)r}r(h1Uh2j#h7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XWIf this is true, then an error will be shown to user if there is no input in this fieldrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]rh`XWIf this is true, then an error will be shown to user if there is no input in this fieldrr}r(h1jh2jubaubaubh{)r}r(h1XThe parameter types are:rh2j#h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XThe parameter types are:rr}r(h1jh2jubaubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rUfixedparameterrahI]rh auhLMhMhhN]r(hY)r}r(h1XFixedParameterrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XFixedParameterrr}r(h1jh2jubaubj)r}r(h1X/FixedParameter(name="branch", default="trunk"),h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`X/FixedParameter(name="branch", default="trunk"),rr}r(h1Uh2jubaubh{)r}r(h1XmThis parameter type will not be shown on the web form, and always generate a property with its default value.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XmThis parameter type will not be shown on the web form, and always generate a property with its default value.rr}r(h1jh2jubaubeubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rUstringparameterrahI]rhauhLMhMhhN]r(hY)r}r(h1XStringParameterrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XStringParameterrr}r(h1jh2jubaubj)r}r(h1XqStringParameter(name="pull_url", label="optionally give a public Git pull url:
", default="", size=80)h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`XqStringParameter(name="pull_url", label="optionally give a public Git pull url:
", default="", size=80)rr}r(h1Uh2jubaubh{)r}r(h1XThis parameter type will show a single-line text-entry box, and allow the user to enter an arbitrary string. It adds the following arguments:rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XThis parameter type will show a single-line text-entry box, and allow the user to enter an arbitrary string. It adds the following arguments:rr}r(h1jh2jubaubh{)r}r(h1X``regex`` (optional)rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM hMhhN]r(j)r}r(h1X ``regex``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xregexrr}r(h1Uh2jubahAjubh`X (optional)r r }r (h1X (optional)h2jubeubj)r }r (h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1X[a string that will be compiled as a regex, and used to validate the input of this parameterrh2j h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM hN]rh`X[a string that will be compiled as a regex, and used to validate the input of this parameterrr}r(h1jh2jubaubaubh{)r}r(h1X ``size`` (optional; default: 10)rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X``size``hC}r(hG]hH]hF]hE]hI]uh2jhN]r h`Xsizer!r"}r#(h1Uh2jubahAjubh`X (optional; default: 10)r$r%}r&(h1X (optional; default: 10)h2jubeubj)r'}r((h1Uh2jh7h:hAjhC}r)(hG]hH]hF]hE]hI]uhLNhMhhN]r*h{)r+}r,(h1X,The width of the input field (in characters)r-h2j'h7h:hAhhC}r.(hG]hH]hF]hE]hI]uhLMhN]r/h`X,The width of the input field (in characters)r0r1}r2(h1j-h2j+ubaubaubeubh3)r3}r4(h1Uh2j#h7h:hAhOhC}r5(hG]hH]hF]hE]r6U textparameterr7ahI]r8hauhLMhMhhN]r9(hY)r:}r;(h1X TextParameterr<h2j3h7h:hAh]hC}r=(hG]hH]hF]hE]hI]uhLMhMhhN]r>h`X TextParameterr?r@}rA(h1j<h2j:ubaubj)rB}rC(h1XStringParameter(name="comments", label="comments to be displayed to the user of the built binary", default="This is a development build", cols=60, rows=5)h2j3h7h:hAjhC}rD(jjhE]hF]hG]hH]hI]uhLMhMhhN]rEh`XStringParameter(name="comments", label="comments to be displayed to the user of the built binary", default="This is a development build", cols=60, rows=5)rFrG}rH(h1Uh2jBubaubh{)rI}rJ(h1XThis parameter type is similar to StringParameter, except that it is represented in the HTML form as a textarea, allowing multi-line input. It adds the StringParameter arguments, this type allows:rKh2j3h7h:hAhhC}rL(hG]hH]hF]hE]hI]uhLMhMhhN]rMh`XThis parameter type is similar to StringParameter, except that it is represented in the HTML form as a textarea, allowing multi-line input. It adds the StringParameter arguments, this type allows:rNrO}rP(h1jKh2jIubaubh{)rQ}rR(h1X ``cols`` (optional; default: 80)rSh2j3h7h:hAhhC}rT(hG]hH]hF]hE]hI]uhLM hMhhN]rU(j)rV}rW(h1X``cols``hC}rX(hG]hH]hF]hE]hI]uh2jQhN]rYh`XcolsrZr[}r\(h1Uh2jVubahAjubh`X (optional; default: 80)r]r^}r_(h1X (optional; default: 80)h2jQubeubj)r`}ra(h1Uh2j3h7h:hAjhC}rb(hG]hH]hF]hE]hI]uhLNhMhhN]rch{)rd}re(h1X,The number of columns the textarea will haverfh2j`h7h:hAhhC}rg(hG]hH]hF]hE]hI]uhLM"hN]rhh`X,The number of columns the textarea will haverirj}rk(h1jfh2jdubaubaubh{)rl}rm(h1X ``rows`` (optional; default: 20)rnh2j3h7h:hAhhC}ro(hG]hH]hF]hE]hI]uhLM$hMhhN]rp(j)rq}rr(h1X``rows``hC}rs(hG]hH]hF]hE]hI]uh2jlhN]rth`Xrowsrurv}rw(h1Uh2jqubahAjubh`X (optional; default: 20)rxry}rz(h1X (optional; default: 20)h2jlubeubj)r{}r|(h1Uh2j3h7h:hAjhC}r}(hG]hH]hF]hE]hI]uhLNhMhhN]r~h{)r}r(h1X)The number of rows the textarea will haverh2j{h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM&hN]rh`X)The number of rows the textarea will haverr}r(h1jh2jubaubaubh{)r}r(h1XGThis class could be subclassed in order to have more customization e.g.rh2j3h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM(hMhhN]rh`XGThis class could be subclassed in order to have more customization e.g.rr}r(h1jh2jubaubj)r}r(h1Uh2j3h7NhAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rhp)r}r(h1UhC}r(UbulletrX*hE]hF]hG]hH]hI]uh2jhN]r(hv)r}r(h1X9developer could send a list of Git branches to pull from hC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X8developer could send a list of Git branches to pull fromrh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM*hN]rh`X8developer could send a list of Git branches to pull fromrr}r(h1jh2jubaubahAhubhv)r}r(h1X>developer could send a list of gerrit changes to cherry-pick, hC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X=developer could send a list of gerrit changes to cherry-pick,rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM,hN]rh`X=developer could send a list of gerrit changes to cherry-pick,rr}r(h1jh2jubaubahAhubhv)r}r(h1X8developer could send a shell script to amend the build. hC}r(hG]hH]hF]hE]hI]uh2jhN]rh{)r}r(h1X7developer could send a shell script to amend the build.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM.hN]rh`X7developer could send a shell script to amend the build.rr}r(h1jh2jubaubahAhubehAhsubaubh{)r}r(h1X!beware of security issues anyway.rh2j3h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM0hMhhN]rh`X!beware of security issues anyway.rr}r(h1jh2jubaubeubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rU intparameterrahI]rh!auhLM3hMhhN]r(hY)r}r(h1X IntParameterrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLM3hMhhN]rh`X IntParameterrr}r(h1jh2jubaubj)r}r(h1XKIntParameter(name="debug_level", label="debug level (1-10)", default=2)h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLM7hMhhN]rh`XKIntParameter(name="debug_level", label="debug level (1-10)", default=2)rr}r(h1Uh2jubaubh{)r}r(h1XDThis parameter type accepts an integer value using a text-entry box.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM:hMhhN]rh`XDThis parameter type accepts an integer value using a text-entry box.rr}r(h1jh2jubaubeubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rUbooleanparameterrahI]rh"auhLM=hMhhN]r(hY)r}r(h1XBooleanParameterrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLM=hMhhN]rh`XBooleanParameterrr}r(h1jh2jubaubj)r}r(h1XYBooleanParameter(name="force_build_clean", label="force a make clean", default=False)h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMAhMhhN]rh`XYBooleanParameter(name="force_build_clean", label="force a make clean", default=False)rr}r(h1Uh2jubaubh{)r}r(h1XIThis type represents a boolean value. It will be presented as a checkbox.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMDhMhhN]rh`XIThis type represents a boolean value. It will be presented as a checkbox.rr}r(h1jh2jubaubeubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rUusernameparameterrahI]rhauhLMGhMhhN]r(hY)r}r(h1XUserNameParameterr h2jh7h:hAh]hC}r (hG]hH]hF]hE]hI]uhLMGhMhhN]r h`XUserNameParameterr r }r(h1j h2jubaubj)r}r(h1X2UserNameParameter(label="your name:
", size=80)h2jh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMKhMhhN]rh`X2UserNameParameter(label="your name:
", size=80)rr}r(h1Uh2jubaubh{)r}r(h1XThis parameter type accepts a username. If authentication is active, it will use the authenticated user instead of displaying a text-entry box.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMMhMhhN]rh`XThis parameter type accepts a username. If authentication is active, it will use the authenticated user instead of displaying a text-entry box.rr}r(h1jh2jubaubj)r}r(h1Uh2jh7h:hAjhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r!(j)r"}r#(h1XN``size`` (optional; default: 10) The width of the input field (in characters) h2jh7h:hAjhC}r$(hG]hH]hF]hE]hI]uhLMQhN]r%(j)r&}r'(h1X ``size`` (optional; default: 10)r(h2j"h7h:hAjhC}r)(hG]hH]hF]hE]hI]uhLMQhN]r*(j)r+}r,(h1X``size``hC}r-(hG]hH]hF]hE]hI]uh2j&hN]r.h`Xsizer/r0}r1(h1Uh2j+ubahAjubh`X (optional; default: 10)r2r3}r4(h1X (optional; default: 10)h2j&ubeubj)r5}r6(h1UhC}r7(hG]hH]hF]hE]hI]uh2j"hN]r8h{)r9}r:(h1X,The width of the input field (in characters)r;h2j5h7h:hAhhC}r<(hG]hH]hF]hE]hI]uhLMQhN]r=h`X,The width of the input field (in characters)r>r?}r@(h1j;h2j9ubaubahAjubeubj)rA}rB(h1Xj``need_email`` (optional; default True) If true, require a full email address rather than arbitrary text. h2jh7h:hAjhC}rC(hG]hH]hF]hE]hI]uhLMThMhhN]rD(j)rE}rF(h1X'``need_email`` (optional; default True)rGh2jAh7h:hAjhC}rH(hG]hH]hF]hE]hI]uhLMThN]rI(j)rJ}rK(h1X``need_email``hC}rL(hG]hH]hF]hE]hI]uh2jEhN]rMh`X need_emailrNrO}rP(h1Uh2jJubahAjubh`X (optional; default True)rQrR}rS(h1X (optional; default True)h2jEubeubj)rT}rU(h1UhC}rV(hG]hH]hF]hE]hI]uh2jAhN]rWh{)rX}rY(h1XAIf true, require a full email address rather than arbitrary text.rZh2jTh7h:hAhhC}r[(hG]hH]hF]hE]hI]uhLMThN]r\h`XAIf true, require a full email address rather than arbitrary text.r]r^}r_(h1jZh2jXubaubahAjubeubeubjp)r`}ra(h1Uh2jh7h:hAjshC}rb(hE]hF]hG]hH]hI]Uentries]rc((UsingleX!Schedulers; ChoiceStringParameterXsched-ChoiceStringParameterrdjdtre(UsingleXChoiceStringParameter SchedulerjdjdtrfeuhLMWhMhhN]ubh>)rg}rh(h1Uh2jh7h:hAhBhC}ri(hE]hF]hG]hH]hI]hJjduhLMWhMhhN]ubeubh3)rj}rk(h1Uh2j#h7h:h<}hAhOhC}rl(hG]hH]hF]hE]rm(UchoicestringparameterrnjdehI]rohauhLMYhMhhV}rpjdjgshN]rq(hY)rr}rs(h1XChoiceStringParameterrth2jjh7h:hAh]hC}ru(hG]hH]hF]hE]hI]uhLMYhMhhN]rvh`XChoiceStringParameterrwrx}ry(h1jth2jrubaubj)rz}r{(h1XRChoiceStringParameter(name="branch", choices=["main","devel"], default="main")h2jjh7h:hAjhC}r|(jjhE]hF]hG]hH]hI]uhLM]hMhhN]r}h`XRChoiceStringParameter(name="branch", choices=["main","devel"], default="main")r~r}r(h1Uh2jzubaubh{)r}r(h1X*This parameter type lets the user choose between several choices (e.g the list of branches you are supporting, or the test campaign to run). If ``multiple`` is false, then its result is a string - one of the choices. If ``multiple`` is true, then the result is a list of strings from the choices.h2jjh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLM`hMhhN]r(h`XThis parameter type lets the user choose between several choices (e.g the list of branches you are supporting, or the test campaign to run). If rr}r(h1XThis parameter type lets the user choose between several choices (e.g the list of branches you are supporting, or the test campaign to run). If h2jubj)r}r(h1X ``multiple``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xmultiplerr}r(h1Uh2jubahAjubh`XA is false, then its result is a string - one of the choices. If rr}r(h1XA is false, then its result is a string - one of the choices. If h2jubj)r}r(h1X ``multiple``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xmultiplerr}r(h1Uh2jubahAjubh`X@ is true, then the result is a list of strings from the choices.rr}r(h1X@ is true, then the result is a list of strings from the choices.h2jubeubh{)r}r(h1XNote that for some use cases, the choices need to be generated dynamically. This can be done via subclassing and overiding the 'getChoices' member function. An example of this is provided by the source for the :py:class:`InheritBuildParameter` class.h2jjh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMehMhhN]r(h`XNote that for some use cases, the choices need to be generated dynamically. This can be done via subclassing and overiding the 'getChoices' member function. An example of this is provided by the source for the rr}r(h1XNote that for some use cases, the choices need to be generated dynamically. This can be done via subclassing and overiding the 'getChoices' member function. An example of this is provided by the source for the h2jubj)r}r(h1X!:py:class:`InheritBuildParameter`rh2jh7h:hAjhC}r(UreftypeXclassjjXInheritBuildParameterU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMehN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`XInheritBuildParameterrr}r(h1Uh2jubahAjubaubh`X class.rr}r(h1X class.h2jubeubh{)r}r(h1X6Its arguments, in addition to the common options, are:rh2jjh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMihMhhN]rh`X6Its arguments, in addition to the common options, are:rr}r(h1jh2jubaubh{)r}r(h1X ``choices``rh2jjh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMkhMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xchoicesrr}r(h1Uh2jubahAjubaubj)r}r(h1Uh2jjh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XThe list of available choices.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMmhN]rh`XThe list of available choices.rr}r(h1jh2jubaubaubh{)r}r(h1X$``strict`` (optional; default: True)rh2jjh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMohMhhN]r(j)r}r(h1X ``strict``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xstrictrr}r(h1Uh2jubahAjubh`X (optional; default: True)rr}r(h1X (optional; default: True)h2jubeubj)r}r(h1Uh2jjh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XIf true, verify that the user's input is from the list. Note that this only affects the validation of the form request; even if this argument is False, there is no HTML form component available to enter an arbitrary value.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMqhN]rh`XIf true, verify that the user's input is from the list. Note that this only affects the validation of the form request; even if this argument is False, there is no HTML form component available to enter an arbitrary value.rr}r(h1jh2jubaubaubh{)r}r(h1X ``multiple``rh2jjh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMvhMhhN]rj)r}r(h1jhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xmultiplerr}r(h1Uh2jubahAjubaubj)r}r(h1Uh2jjh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1X3If true, then the user may select multiple choices.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMxhN]rh`X3If true, then the user may select multiple choices.rr}r(h1jh2jubaubaubh{)r}r (h1X Example::r h2jjh7h:hAhhC}r (hG]hH]hF]hE]hI]uhLMzhMhhN]r h`XExample:r r}r(h1XExample:h2jubaubj)r}r(h1XChoiceStringParameter(name="forced_tests", label = "smoke test campaign to run", default = default_tests, multiple = True, strict = True, choices = [ "test_builder1", "test_builder2", "test_builder3" ]) # .. and later base the schedulers to trigger off this property: # triggers the tests depending on the property forced_test builder1.factory.addStep(Trigger(name="Trigger tests", schedulerNames=Property("forced_tests")))h2jjh7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLM|hMhhN]rh`XChoiceStringParameter(name="forced_tests", label = "smoke test campaign to run", default = default_tests, multiple = True, strict = True, choices = [ "test_builder1", "test_builder2", "test_builder3" ]) # .. and later base the schedulers to trigger off this property: # triggers the tests depending on the property forced_test builder1.factory.addStep(Trigger(name="Trigger tests", schedulerNames=Property("forced_tests")))rr}r(h1Uh2jubaubeubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rUcodebaseparameterrahI]rh auhLMhMhhN]r(hY)r}r(h1XCodebaseParameterr h2jh7h:hAh]hC}r!(hG]hH]hF]hE]hI]uhLMhMhhN]r"h`XCodebaseParameterr#r$}r%(h1j h2jubaubj)r&}r'(h1X$CodebaseParameter(codebase="myrepo")h2jh7h:hAjhC}r((jjhE]hF]hG]hH]hI]uhLMhMhhN]r)h`X$CodebaseParameter(codebase="myrepo")r*r+}r,(h1Uh2j&ubaubh{)r-}r.(h1XHThis is a parameter group to specify a sourcestamp for a given codebase.r/h2jh7h:hAhhC}r0(hG]hH]hF]hE]hI]uhLMhMhhN]r1h`XHThis is a parameter group to specify a sourcestamp for a given codebase.r2r3}r4(h1j/h2j-ubaubh{)r5}r6(h1X ``codebase``r7h2jh7h:hAhhC}r8(hG]hH]hF]hE]hI]uhLMhMhhN]r9j)r:}r;(h1j7hC}r<(hG]hH]hF]hE]hI]uh2j5hN]r=h`Xcodebaser>r?}r@(h1Uh2j:ubahAjubaubj)rA}rB(h1Uh2jh7h:hAjhC}rC(hG]hH]hF]hE]hI]uhLNhMhhN]rDh{)rE}rF(h1XThe name of the codebase.rGh2jAh7h:hAhhC}rH(hG]hH]hF]hE]hI]uhLMhN]rIh`XThe name of the codebase.rJrK}rL(h1jGh2jEubaubaubh{)rM}rN(h1X/``branch`` (optional; default: StringParameter)rOh2jh7h:hAhhC}rP(hG]hH]hF]hE]hI]uhLMhMhhN]rQ(j)rR}rS(h1X ``branch``hC}rT(hG]hH]hF]hE]hI]uh2jMhN]rUh`XbranchrVrW}rX(h1Uh2jRubahAjubh`X% (optional; default: StringParameter)rYrZ}r[(h1X% (optional; default: StringParameter)h2jMubeubj)r\}r](h1Uh2jh7h:hAjhC}r^(hG]hH]hF]hE]hI]uhLNhMhhN]r_h{)r`}ra(h1XxA :ref:`parameter ` specifying the branch to build. The default value is a string parameter.h2j\h7h:hAhhC}rb(hG]hH]hF]hE]hI]uhLMhN]rc(h`XA rdre}rf(h1XA h2j`ubj)rg}rh(h1X,:ref:`parameter `rih2j`h7h:hAjhC}rj(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrkhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rlji)rm}rn(h1jihC}ro(hG]hH]rp(jjkXstd-refrqehF]hE]hI]uh2jghN]rrh`X parameterrsrt}ru(h1Uh2jmubahAjsubaubh`XJ specifying the branch to build. The default value is a string parameter.rvrw}rx(h1XJ specifying the branch to build. The default value is a string parameter.h2j`ubeubaubh{)ry}rz(h1X1``revision`` (optional; default: StringParameter)r{h2jh7h:hAhhC}r|(hG]hH]hF]hE]hI]uhLMhMhhN]r}(j)r~}r(h1X ``revision``hC}r(hG]hH]hF]hE]hI]uh2jyhN]rh`Xrevisionrr}r(h1Uh2j~ubahAjubh`X% (optional; default: StringParameter)rr}r(h1X% (optional; default: StringParameter)h2jyubeubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XzA :ref:`parameter ` specifying the revision to build. The default value is a string parameter.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XA rr}r(h1XA h2jubj)r}r(h1X,:ref:`parameter `rh2jh7h:hAjhC}r(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`X parameterrr}r(h1Uh2jubahAjsubaubh`XL specifying the revision to build. The default value is a string parameter.rr}r(h1XL specifying the revision to build. The default value is a string parameter.h2jubeubaubh{)r}r(h1X3``repository`` (optional; default: StringParameter)rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X``repository``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X repositoryrr}r(h1Uh2jubahAjubh`X% (optional; default: StringParameter)rr}r(h1X% (optional; default: StringParameter)h2jubeubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1XA :ref:`parameter ` specifying the repository for the build. The default value is a string parameter.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XA rr}r(h1XA h2jubj)r}r(h1X,:ref:`parameter `rh2jh7h:hAjhC}r(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`X parameterrr}r(h1Uh2jubahAjsubaubh`XS specifying the repository for the build. The default value is a string parameter.rr}r(h1XS specifying the repository for the build. The default value is a string parameter.h2jubeubaubh{)r}r(h1X0``project`` (optional; default: StringParameter)rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j)r}r(h1X ``project``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`Xprojectrr}r(h1Uh2jubahAjubh`X% (optional; default: StringParameter)rr}r(h1X% (optional; default: StringParameter)h2jubeubj)r}r(h1Uh2jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rh{)r}r(h1X~A :ref:`parameter ` specifying the project for the build. The default value is a string parameter.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhN]r(h`XA rr}r(h1XA h2jubj)r}r(h1X,:ref:`parameter `rh2jh7h:hAjhC}r(UreftypeXrefjjXforcescheduler-parametersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rji)r}r(h1jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh2jhN]rh`X parameterrr}r(h1Uh2jubahAjsubaubh`XP specifying the project for the build. The default value is a string parameter.rr}r(h1XP specifying the project for the build. The default value is a string parameter.h2jubeubaubjp)r}r(h1Uh2jh7h:hAjshC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleX!Schedulers; InheritBuildParameterXsched-InheritBuildParameterrjtr(UsingleXInheritBuildParameter SchedulerjjtreuhLMhMhhN]ubh>)r}r(h1Uh2jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLMhMhhN]ubeubh3)r}r(h1Uh2j#h7h:h<}hAhOhC}r (hG]hH]hF]hE]r (Uinheritbuildparameterr jehI]r hauhLMhMhhV}r jjshN]r(hY)r}r(h1XInheritBuildParameterrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XInheritBuildParameterrr}r(h1jh2jubaubh{)r}r(h1XThis is a special parameter for inheriting force build properties from another build. The user is presented with a list of compatible builds from which to choose, and all forced-build parameters from the selected build are copied into the new build. The new parameter is:rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XThis is a special parameter for inheriting force build properties from another build. The user is presented with a list of compatible builds from which to choose, and all forced-build parameters from the selected build are copied into the new build. The new parameter is:rr}r(h1jh2jubaubh{)r}r (h1X``compatible_builds``r!h2jh7h:hAhhC}r"(hG]hH]hF]hE]hI]uhLMhMhhN]r#j)r$}r%(h1j!hC}r&(hG]hH]hF]hE]hI]uh2jhN]r'h`Xcompatible_buildsr(r)}r*(h1Uh2j$ubahAjubaubj)r+}r,(h1Uh2jh7h:hAjhC}r-(hG]hH]hF]hE]hI]uhLNhMhhN]r.h{)r/}r0(h1XA function to find compatible builds in the build history. This function is given the master :py:class:`~buildbot.status.master.Status` instance as first argument, and the current builder name as second argument, or None when forcing all builds.h2j+h7h:hAhhC}r1(hG]hH]hF]hE]hI]uhLMhN]r2(h`X^A function to find compatible builds in the build history. This function is given the master r3r4}r5(h1X^A function to find compatible builds in the build history. This function is given the master h2j/ubj)r6}r7(h1X*:py:class:`~buildbot.status.master.Status`r8h2j/h7h:hAjhC}r9(UreftypeXclassjjXbuildbot.status.master.StatusU refdomainXpyr:hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]r;j)r<}r=(h1j8hC}r>(hG]hH]r?(jj:Xpy-classr@ehF]hE]hI]uh2j6hN]rAh`XStatusrBrC}rD(h1Uh2j<ubahAjubaubh`Xn instance as first argument, and the current builder name as second argument, or None when forcing all builds.rErF}rG(h1Xn instance as first argument, and the current builder name as second argument, or None when forcing all builds.h2j/ubeubaubh{)rH}rI(h1X Example::rJh2jh7h:hAhhC}rK(hG]hH]hF]hE]hI]uhLMhMhhN]rLh`XExample:rMrN}rO(h1XExample:h2jHubaubj)rP}rQ(h1Xadef get_compatible_builds(status, builder): if builder == None: # this is the case for force_build_all return ["cannot generate build list here"] # find all successful builds in builder1 and builder2 builds = [] for builder in ["builder1","builder2"]: builder_status = status.getBuilder(builder) for num in xrange(1,40): # 40 last builds b = builder_status.getBuild(-num) if not b: continue if b.getResults() == FAILURE: continue builds.append(builder+"/"+str(b.getNumber())) return builds # ... sched = Scheduler(..., properties=[ InheritBuildParameter( name="inherit", label="promote a build for merge", compatible_builds=get_compatible_builds, required = True), ])h2jh7h:hAjhC}rR(jjhE]hF]hG]hH]hI]uhLMhMhhN]rSh`Xadef get_compatible_builds(status, builder): if builder == None: # this is the case for force_build_all return ["cannot generate build list here"] # find all successful builds in builder1 and builder2 builds = [] for builder in ["builder1","builder2"]: builder_status = status.getBuilder(builder) for num in xrange(1,40): # 40 last builds b = builder_status.getBuild(-num) if not b: continue if b.getResults() == FAILURE: continue builds.append(builder+"/"+str(b.getNumber())) return builds # ... sched = Scheduler(..., properties=[ InheritBuildParameter( name="inherit", label="promote a build for merge", compatible_builds=get_compatible_builds, required = True), ])rTrU}rV(h1Uh2jPubaubjp)rW}rX(h1Uh2jh7h:hAjshC}rY(hE]hF]hG]hH]hI]Uentries]rZ((UsingleX%Schedulers; BuildslaveChoiceParameterXsched-BuildslaveChoiceParameterr[j[tr\(UsingleX#BuildslaveChoiceParameter Schedulerj[j[tr]euhLMhMhhN]ubh>)r^}r_(h1Uh2jh7h:hAhBhC}r`(hE]hF]hG]hH]hI]hJj[uhLMhMhhN]ubeubh3)ra}rb(h1Uh2j#h7h:h<}hAhOhC}rc(hG]hH]hF]hE]rd(Ubuildslavechoiceparameterrej[ehI]rfhauhLMhMhhV}rgj[j^shN]rh(hY)ri}rj(h1XBuildslaveChoiceParameterrkh2jah7h:hAh]hC}rl(hG]hH]hF]hE]hI]uhLMhMhhN]rmh`XBuildslaveChoiceParameterrnro}rp(h1jkh2jiubaubh{)rq}rr(h1X'This parameter allows a scheduler to require that a build is assigned to the chosen buildslave. The choice is assigned to the `slavename` property for the build. The :py:class:`~buildbot.builder.enforceChosenSlave` functor must be assigned to the ``canStartBuild`` parameter for the ``Builder``.h2jah7h:hAhhC}rs(hG]hH]hF]hE]hI]uhLMhMhhN]rt(h`X~This parameter allows a scheduler to require that a build is assigned to the chosen buildslave. The choice is assigned to the rurv}rw(h1X~This parameter allows a scheduler to require that a build is assigned to the chosen buildslave. The choice is assigned to the h2jqubj)rx}ry(h1X `slavename`hC}rz(hG]hH]hF]hE]hI]uh2jqhN]r{h`X slavenamer|r}}r~(h1Uh2jxubahAjubh`X property for the build. The rr}r(h1X property for the build. The h2jqubj)r}r(h1X0:py:class:`~buildbot.builder.enforceChosenSlave`rh2jqh7h:hAjhC}r(UreftypeXclassjjX#buildbot.builder.enforceChosenSlaveU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rj)r}r(h1jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh2jhN]rh`XenforceChosenSlaverr}r(h1Uh2jubahAjubaubh`X! functor must be assigned to the rr}r(h1X! functor must be assigned to the h2jqubj)r}r(h1X``canStartBuild``hC}r(hG]hH]hF]hE]hI]uh2jqhN]rh`X canStartBuildrr}r(h1Uh2jubahAjubh`X parameter for the rr}r(h1X parameter for the h2jqubj)r}r(h1X ``Builder``hC}r(hG]hH]hF]hE]hI]uh2jqhN]rh`XBuilderrr}r(h1Uh2jubahAjubh`X.r}r(h1X.h2jqubeubh{)r}r(h1X Example::rh2jah7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XExample:rr}r(h1XExample:h2jubaubj)r}r(h1Xfrom buildbot.process.builder import enforceChosenSlave # schedulers: ForceScheduler( # ... properties=[ BuildslaveChoiceParameter(), ] ) # builders: BuilderConfig( # ... canStartBuild=enforceChosenSlave, )h2jah7h:hAjhC}r(jjhE]hF]hG]hH]hI]uhLMhMhhN]rh`Xfrom buildbot.process.builder import enforceChosenSlave # schedulers: ForceScheduler( # ... properties=[ BuildslaveChoiceParameter(), ] ) # builders: BuilderConfig( # ... canStartBuild=enforceChosenSlave, )rr}r(h1Uh2jubaubeubh3)r}r(h1Uh2j#h7h:hAhOhC}r(hG]hH]hF]hE]rUanypropertyparameterrahI]rh(auhLMhMhhN]r(hY)r}r(h1XAnyPropertyParameterrh2jh7h:hAh]hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XAnyPropertyParameterrr}r(h1jh2jubaubh{)r}r(h1XThis parameter type can only be used in ``properties``, and allows the user to specify both the property name and value in the HTML form.h2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h`X(This parameter type can only be used in rr}r(h1X(This parameter type can only be used in h2jubj)r}r(h1X``properties``hC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X propertiesrr}r(h1Uh2jubahAjubh`XS, and allows the user to specify both the property name and value in the HTML form.rr}r(h1XS, and allows the user to specify both the property name and value in the HTML form.h2jubeubh{)r}r(h1XThis Parameter is here to reimplement old Buildbot behavior, and should be avoided. Stricter parameter name and type should be preferred.rh2jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh`XThis Parameter is here to reimplement old Buildbot behavior, and should be avoided. Stricter parameter name and type should be preferred.rr}r(h1jh2jubaubeubeubeubeubh7h:hAUsystem_messagerhC}r(hG]UlevelKhE]hF]rhTaUsourceh:hH]hI]UlineKUtypeUINFOruhLKhMhhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2h/hN]rh`X-Duplicate implicit target name: "schedulers".rr}r(h1Uh2jubahAhubaubh.)r}r(h1Uh2jh7h:hAjhC}r(hG]UlevelKhE]hF]rjaUsourceh:hH]hI]UlineM9UtypejuhLM9hMhhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X5Duplicate implicit target name: "anybranchscheduler".rr}r(h1Uh2jubahAhubaubeUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hjhjhhh j4h jh hh jGh jhhmhhKhj hjhj(hjehhhjehj{hjnhjhj"hhhj hjhhhj7hhh jL h!jh"jh#hh$j) h%hh&j h'jh(jh)j!uhN]r(cdocutils.nodes comment r)r}r(h1X -*- rst -*-h2hh7h:hAUcommentrhC}r(jjhE]hF]hG]hH]hI]uhLKhMhhN]rh`X -*- rst -*-rr}r(h1Uh2jubaubh?h4eh1UU transformerrNU footnote_refsr}rUrefnamesr}r Usymbol_footnotesr ]r Uautofootnote_refsr ]r Usymbol_footnote_refsr]rU citationsr]rhMhU current_linerNUtransform_messagesr]r(h.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X0Hyperlink target "schedulers" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r }r!(h1UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]r#h{)r$}r%(h1UhC}r&(hG]hH]hF]hE]hI]uh2j hN]r'h`X<Hyperlink target "configuring-schedulers" is not referenced.r(r)}r*(h1Uh2j$ubahAhubahAjubh.)r+}r,(h1UhC}r-(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]r.h{)r/}r0(h1UhC}r1(hG]hH]hF]hE]hI]uh2j+hN]r2h`X4Hyperlink target "cfg-schedulers" is not referenced.r3r4}r5(h1Uh2j/ubahAhubahAjubh.)r6}r7(h1UhC}r8(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineK/UtypejuhN]r9h{)r:}r;(h1UhC}r<(hG]hH]hF]hE]hI]uh2j6hN]r=h`X-Hyperlink target "index-0" is not referenced.r>r?}r@(h1Uh2j:ubahAhubahAjubh.)rA}rB(h1UhC}rC(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]rDh{)rE}rF(h1UhC}rG(hG]hH]hF]hE]hI]uh2jAhN]rHh`X4Hyperlink target "change-filters" is not referenced.rIrJ}rK(h1Uh2jEubahAhubahAjubh.)rL}rM(h1UhC}rN(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]rOh{)rP}rQ(h1UhC}rR(hG]hH]hF]hE]hI]uh2jLhN]rSh`XAHyperlink target "sched-SingleBranchScheduler" is not referenced.rTrU}rV(h1Uh2jPubahAhubahAjubh.)rW}rX(h1UhC}rY(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]rZh{)r[}r\(h1UhC}r](hG]hH]hF]hE]hI]uh2jWhN]r^h`X5Hyperlink target "sched-Scheduler" is not referenced.r_r`}ra(h1Uh2j[ubahAhubahAjubh.)rb}rc(h1UhC}rd(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypejuhN]reh{)rf}rg(h1UhC}rh(hG]hH]hF]hE]hI]uh2jbhN]rih`XEHyperlink target "scheduler-singlebranchscheduler" is not referenced.rjrk}rl(h1Uh2jfubahAhubahAjubh.)rm}rn(h1UhC}ro(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM5UtypejuhN]rph{)rq}rr(h1UhC}rs(hG]hH]hF]hE]hI]uh2jmhN]rth`X>Hyperlink target "sched-AnyBranchScheduler" is not referenced.rurv}rw(h1Uh2jqubahAhubahAjubh.)rx}ry(h1UhC}rz(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM6UtypejuhN]r{h{)r|}r}(h1UhC}r~(hG]hH]hF]hE]hI]uh2jxhN]rh`X8Hyperlink target "anybranchscheduler" is not referenced.rr}r(h1Uh2j|ubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM_UtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X5Hyperlink target "sched-Dependent" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM`UtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X9Hyperlink target "dependent-scheduler" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X4Hyperlink target "sched-Periodic" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X8Hyperlink target "periodic-scheduler" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X3Hyperlink target "sched-Nightly" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X7Hyperlink target "nightly-scheduler" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM:UtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X6Hyperlink target "sched-Try_Jobdir" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM<UtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X8Hyperlink target "sched-Try_Userpass" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM=UtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X4Hyperlink target "try-schedulers" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X7Hyperlink target "sched-Triggerable" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X-Hyperlink target "index-1" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X;Hyperlink target "triggerable-scheduler" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r (hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]r h{)r }r (h1UhC}r (hG]hH]hF]hE]hI]uh2jhN]rh`X>Hyperlink target "sched-NightlyTriggerable" is not referenced.rr}r(h1Uh2j ubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUUtypejuhN]rh{)r}r(h1UhC}r(hG]hH]hF]hE]hI]uh2jhN]rh`X:Hyperlink target "sched-ForceScheduler" is not referenced.rr}r(h1Uh2jubahAhubahAjubh.)r}r(h1UhC}r(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMWUtypejuhN]r h{)r!}r"(h1UhC}r#(hG]hH]hF]hE]hI]uh2jhN]r$h`X-Hyperlink target "index-2" is not referenced.r%r&}r'(h1Uh2j!ubahAhubahAjubh.)r(}r)(h1UhC}r*(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]r+h{)r,}r-(h1UhC}r.(hG]hH]hF]hE]hI]uh2j(hN]r/h`X?Hyperlink target "forcescheduler-parameters" is not referenced.r0r1}r2(h1Uh2j,ubahAhubahAjubh.)r3}r4(h1UhC}r5(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMWUtypejuhN]r6h{)r7}r8(h1UhC}r9(hG]hH]hF]hE]hI]uh2j3hN]r:h`XAHyperlink target "sched-ChoiceStringParameter" is not referenced.r;r<}r=(h1Uh2j7ubahAhubahAjubh.)r>}r?(h1UhC}r@(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rAh{)rB}rC(h1UhC}rD(hG]hH]hF]hE]hI]uh2j>hN]rEh`XAHyperlink target "sched-InheritBuildParameter" is not referenced.rFrG}rH(h1Uh2jBubahAhubahAjubh.)rI}rJ(h1UhC}rK(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypejuhN]rLh{)rM}rN(h1UhC}rO(hG]hH]hF]hE]hI]uh2jIhN]rPh`XEHyperlink target "sched-BuildslaveChoiceParameter" is not referenced.rQrR}rS(h1Uh2jMubahAhubahAjubeUreporterrTNUid_startrUKU autofootnotesrV]rWU citation_refsrX}rYUindirect_targetsrZ]r[Usettingsr\(cdocutils.frontend Values r]or^}r_(Ufootnote_backlinksr`KUrecord_dependenciesraNU rfc_base_urlrbUhttp://tools.ietf.org/html/rcU tracebackrdUpep_referencesreNUstrip_commentsrfNU toc_backlinksrgjU language_coderhUenriU datestamprjNU report_levelrkKU _destinationrlNU halt_levelrmKU strip_classesrnNh]NUerror_encoding_error_handlerroUbackslashreplacerpUdebugrqNUembed_stylesheetrrUoutput_encoding_error_handlerrsUstrictrtU sectnum_xformruKUdump_transformsrvNU docinfo_xformrwKUwarning_streamrxNUpep_file_url_templateryUpep-%04drzUexit_status_levelr{KUconfigr|NUstrict_visitorr}NUcloak_email_addressesr~Utrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-schedulers.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjtUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jjjjjgjjjejajjjjjrj}j(j#hj jGjjjhmhejjjjhKh4hj$ jjj jjL jG j) j$ jjj j jej`jjhj`hTh4hhhhhhhhj2j8jjjvjyj j j jj{j}jjj j jjhhj[jaj"j#jjjdjjhjj jj= jG jjj4jhjjvj|hhhjG j7j3jujjjjjhjj j$ j3j/jjjmhj}hhjnjjjFjBjjj!juUsubstitution_namesr}rhAhMhC}r(hG]hE]hF]Usourceh:hH]hI]uU footnotesr]rUrefidsr}r(j]rj{ah]rj aj]rjajr]rjuah]rj aj]rjaj]rjahK]rh?ah]rj]aj2]rj5aj]rjaj]rjaj ]rj aj ]rj aj"]rjah]rjaj= ]rj@ ajv]rjyah]rjC aju]rjxaj[]rj^ah]rjajd]rjgaj{]rjxaj!]rjauub.PK6DK?7buildbot-v0.8.9/.doctrees/manual/cfg-interlocks.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XcountqNX access-modesqX interlocksqU3U1X access modesq NU2Xexamplesq NXscopeq NUcontentsq NuUsubstitution_defsq }qUparse_messagesq]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceqcdocutils.nodes reprunicode qXV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-interlocks.rstqq}qbUexpect_referenced_by_nameq}q hcdocutils.nodes target q!)q"}q#(hX.. _Interlocks:hhhhUtagnameq$Utargetq%U attributesq&}q'(Uidsq(]Ubackrefsq)]Udupnamesq*]Uclassesq+]Unamesq,]Urefidq-U interlocksq.uUlineq/KUdocumentq0hUchildrenq1]ubsh$Usectionq2h&}q3(h*]q4X interlocksq5ah+]h)]h(]q6(h.Uid1q7eh,]q8hauh/Kh0hUexpect_referenced_by_idq9}q:h.h"sh1]q;(cdocutils.nodes title q<)q=}q>(hX Interlocksq?hhhhh$Utitleq@h&}qA(h*]h+]h)]h(]h,]uh/Kh0hh1]qBcdocutils.nodes Text qCX InterlocksqDqE}qF(hh?hh=ubaubcdocutils.nodes topic qG)qH}qI(hUhhhhh$UtopicqJh&}qK(h*]h+]qL(UcontentsqMUlocalqNeh)]h(]qOUcontentsqPah,]qQh auh/K h0hh1]qRcdocutils.nodes bullet_list qS)qT}qU(hUhhHhNh$U bullet_listqVh&}qW(h*]h+]h)]h(]h,]uh/Nh0hh1]qX(cdocutils.nodes list_item qY)qZ}q[(hUh&}q\(h*]h+]h)]h(]h,]uhhTh1]q]cdocutils.nodes paragraph q^)q_}q`(hUh&}qa(h*]h+]h)]h(]h,]uhhZh1]qbcdocutils.nodes reference qc)qd}qe(hUh&}qf(h(]qgUid9qhah)]h*]h+]h,]UrefidU access-modesqiuhh_h1]qjhCX Access Modesqkql}qm(hX Access Modesqnhhdubah$U referenceqoubah$U paragraphqpubah$U list_itemqqubhY)qr}qs(hUh&}qt(h*]h+]h)]h(]h,]uhhTh1]quh^)qv}qw(hUh&}qx(h*]h+]h)]h(]h,]uhhrh1]qyhc)qz}q{(hUh&}q|(h(]q}Uid10q~ah)]h*]h+]h,]UrefidUcountquhhvh1]qhCXCountqq}q(hXCountqhhzubah$houbah$hpubah$hqubhY)q}q(hUh&}q(h*]h+]h)]h(]h,]uhhTh1]qh^)q}q(hUh&}q(h*]h+]h)]h(]h,]uhhh1]qhc)q}q(hUh&}q(h(]qUid11qah)]h*]h+]h,]UrefidUscopequhhh1]qhCXScopeqq}q(hXScopeqhhubah$houbah$hpubah$hqubhY)q}q(hUh&}q(h*]h+]h)]h(]h,]uhhTh1]qh^)q}q(hUh&}q(h*]h+]h)]h(]h,]uhhh1]qhc)q}q(hUh&}q(h(]qUid12qah)]h*]h+]h,]UrefidUexamplesquhhh1]qhCXExamplesqq}q(hXExamplesqhhubah$houbah$hpubah$hqubeubaubh^)q}q(hXYUntil now, we assumed that a master can run builds at any slave whenever needed or desired. Some times, you want to enforce additional constraints on builds. For reasons like limited network bandwidth, old slave machines, or a self-willed data base server, you may want to limit the number of builds (or build steps) that can access a resource.qhhhhh$hph&}q(h*]h+]h)]h(]h,]uh/K h0hh1]qhCXYUntil now, we assumed that a master can run builds at any slave whenever needed or desired. Some times, you want to enforce additional constraints on builds. For reasons like limited network bandwidth, old slave machines, or a self-willed data base server, you may want to limit the number of builds (or build steps) that can access a resource.qq}q(hhhhubaubh!)q}q(hX.. _Access-Modes:hhhhh$h%h&}q(h(]h)]h*]h+]h,]h-hiuh/Kh0hh1]ubh)q}q(hUhhhhh}qhhsh$h2h&}q(h*]h+]h)]h(]q(hiUid2qeh,]q(h heuh/Kh0hh9}qhihsh1]q(h<)q}q(hhnhhhhh$h@h&}q(h(]h)]h*]h+]h,]h-hhuh/Kh0hh1]qhCX Access ModesqÅq}q(hhnhhubaubh^)q}q(hXGThe mechanism used by Buildbot is known as the read/write lock [#]_. It allows either many readers or a single writer but not a combination of readers and writers. The general lock has been modified and extended for use in Buildbot. Firstly, the general lock allows an infinite number of readers. In Buildbot, we often want to put an upper limit on the number of readers, for example allowing two out of five possible builds at the same time. To do this, the lock counts the number of active readers. Secondly, the terms *read mode* and *write mode* are confusing in Buildbot context. They have been replaced by *counting mode* (since the lock counts them) and *exclusive mode*. As a result of these changes, locks in Buildbot allow a number of builds (up to some fixed number) in counting mode, or they allow one build in exclusive mode.hhhhh$hph&}q(h*]h+]h)]h(]h,]uh/Kh0hh1]q(hCX?The mechanism used by Buildbot is known as the read/write lock qʅq}q(hX?The mechanism used by Buildbot is known as the read/write lock hhubcdocutils.nodes footnote_reference q)q}q(hX[#]_UresolvedqKhhh$Ufootnote_referenceqh&}q(UautoqKh(]qUid3qah)]h*]h+]h,]h-Uid6quh1]qhCX1q}q(hUhhubaubhCX. It allows either many readers or a single writer but not a combination of readers and writers. The general lock has been modified and extended for use in Buildbot. Firstly, the general lock allows an infinite number of readers. In Buildbot, we often want to put an upper limit on the number of readers, for example allowing two out of five possible builds at the same time. To do this, the lock counts the number of active readers. Secondly, the terms qڅq}q(hX. It allows either many readers or a single writer but not a combination of readers and writers. The general lock has been modified and extended for use in Buildbot. Firstly, the general lock allows an infinite number of readers. In Buildbot, we often want to put an upper limit on the number of readers, for example allowing two out of five possible builds at the same time. To do this, the lock counts the number of active readers. Secondly, the terms hhubcdocutils.nodes emphasis q)q}q(hX *read mode*h&}q(h*]h+]h)]h(]h,]uhhh1]qhCX read modeq⅁q}q(hUhhubah$UemphasisqubhCX and q慁q}q(hX and hhubh)q}q(hX *write mode*h&}q(h*]h+]h)]h(]h,]uhhh1]qhCX write modeq텁q}q(hUhhubah$hubhCX? are confusing in Buildbot context. They have been replaced by qq}q(hX? are confusing in Buildbot context. They have been replaced by hhubh)q}q(hX*counting mode*h&}q(h*]h+]h)]h(]h,]uhhh1]qhCX counting modeqq}q(hUhhubah$hubhCX" (since the lock counts them) and qq}q(hX" (since the lock counts them) and hhubh)q}q(hX*exclusive mode*h&}q(h*]h+]h)]h(]h,]uhhh1]rhCXexclusive moderr}r(hUhhubah$hubhCX. As a result of these changes, locks in Buildbot allow a number of builds (up to some fixed number) in counting mode, or they allow one build in exclusive mode.rr}r(hX. As a result of these changes, locks in Buildbot allow a number of builds (up to some fixed number) in counting mode, or they allow one build in exclusive mode.hhubeubcdocutils.nodes note r)r}r (hX.Access modes are specified when a lock is used. That is, it is possible to have a single lock that is used by several slaves in counting mode, and several slaves in exclusive mode. In fact, this is the strength of the modes: accessing a lock in exclusive mode will prevent all counting-mode accesses.hhhhh$Unoter h&}r (h*]h+]h)]h(]h,]uh/Nh0hh1]r h^)r }r(hX.Access modes are specified when a lock is used. That is, it is possible to have a single lock that is used by several slaves in counting mode, and several slaves in exclusive mode. In fact, this is the strength of the modes: accessing a lock in exclusive mode will prevent all counting-mode accesses.rhjhhh$hph&}r(h*]h+]h)]h(]h,]uh/K#h1]rhCX.Access modes are specified when a lock is used. That is, it is possible to have a single lock that is used by several slaves in counting mode, and several slaves in exclusive mode. In fact, this is the strength of the modes: accessing a lock in exclusive mode will prevent all counting-mode accesses.rr}r(hjhj ubaubaubeubh)r}r(hUhhhhh$h2h&}r(h*]h+]h)]h(]rhah,]rhauh/K*h0hh1]r(h<)r}r(hhhjhhh$h@h&}r(h(]h)]h*]h+]h,]h-h~uh/K*h0hh1]rhCXCountrr }r!(hhhjubaubh^)r"}r#(hXOften, not all slaves are equal. To allow for this situation, Buildbot allows to have a separate upper limit on the count for each slave. In this way, you can have at most 3 concurrent builds at a fast slave, 2 at a slightly older slave, and 1 at all other slaves.r$hjhhh$hph&}r%(h*]h+]h)]h(]h,]uh/K,h0hh1]r&hCXOften, not all slaves are equal. To allow for this situation, Buildbot allows to have a separate upper limit on the count for each slave. In this way, you can have at most 3 concurrent builds at a fast slave, 2 at a slightly older slave, and 1 at all other slaves.r'r(}r)(hj$hj"ubaubeubh)r*}r+(hUhhhhh$h2h&}r,(h*]h+]h)]h(]r-hah,]r.h auh/K2h0hh1]r/(h<)r0}r1(hhhj*hhh$h@h&}r2(h(]h)]h*]h+]h,]h-huh/K2h0hh1]r3hCXScoper4r5}r6(hhhj0ubaubh^)r7}r8(hXThe final thing you can specify when you introduce a new lock is its scope. Some constraints are global -- they must be enforced over all slaves. Other constraints are local to each slave. A *master lock* is used for the global constraints. You can ensure for example that at most one build (of all builds running at all slaves) accesses the data base server. With a *slave lock* you can add a limit local to each slave. With such a lock, you can for example enforce an upper limit to the number of active builds at a slave, like above.hj*hhh$hph&}r9(h*]h+]h)]h(]h,]uh/K4h0hh1]r:(hCXThe final thing you can specify when you introduce a new lock is its scope. Some constraints are global -- they must be enforced over all slaves. Other constraints are local to each slave. A r;r<}r=(hXThe final thing you can specify when you introduce a new lock is its scope. Some constraints are global -- they must be enforced over all slaves. Other constraints are local to each slave. A hj7ubh)r>}r?(hX *master lock*h&}r@(h*]h+]h)]h(]h,]uhj7h1]rAhCX master lockrBrC}rD(hUhj>ubah$hubhCX is used for the global constraints. You can ensure for example that at most one build (of all builds running at all slaves) accesses the data base server. With a rErF}rG(hX is used for the global constraints. You can ensure for example that at most one build (of all builds running at all slaves) accesses the data base server. With a hj7ubh)rH}rI(hX *slave lock*h&}rJ(h*]h+]h)]h(]h,]uhj7h1]rKhCX slave lockrLrM}rN(hUhjHubah$hubhCX you can add a limit local to each slave. With such a lock, you can for example enforce an upper limit to the number of active builds at a slave, like above.rOrP}rQ(hX you can add a limit local to each slave. With such a lock, you can for example enforce an upper limit to the number of active builds at a slave, like above.hj7ubeubeubh)rR}rS(hUhhhhh$h2h&}rT(h*]h+]h)]h(]rUhah,]rVh auh/K>h0hh1]rW(h<)rX}rY(hhhjRhhh$h@h&}rZ(h(]h)]h*]h+]h,]h-huh/K>h0hh1]r[hCXExamplesr\r]}r^(hhhjXubaubh^)r_}r`(hXTime for a few examples. Below a master lock is defined to protect a data base, and a slave lock is created to limit the number of builds at each slave. ::hjRhhh$hph&}ra(h*]h+]h)]h(]h,]uh/K@h0hh1]rbhCXTime for a few examples. Below a master lock is defined to protect a data base, and a slave lock is created to limit the number of builds at each slave.rcrd}re(hXTime for a few examples. Below a master lock is defined to protect a data base, and a slave lock is created to limit the number of builds at each slave.hj_ubaubcdocutils.nodes literal_block rf)rg}rh(hXfrom buildbot import locks db_lock = locks.MasterLock("database") build_lock = locks.SlaveLock("slave_builds", maxCount = 1, maxCountForSlave = { 'fast': 3, 'new': 2 })hjRhhh$U literal_blockrih&}rj(U xml:spacerkUpreserverlh(]h)]h*]h+]h,]uh/KCh0hh1]rmhCXfrom buildbot import locks db_lock = locks.MasterLock("database") build_lock = locks.SlaveLock("slave_builds", maxCount = 1, maxCountForSlave = { 'fast': 3, 'new': 2 })rnro}rp(hUhjgubaubh^)rq}rr(hXyAfter importing locks from buildbot, :data:`db_lock` is defined to be a master lock. The ``database`` string is used for uniquely identifying the lock. At the next line, a slave lock called :data:`build_lock` is created. It is identified by the ``slave_builds`` string. Since the requirements of the lock are a bit more complicated, two optional arguments are also specified. The ``maxCount`` parameter sets the default limit for builds in counting mode to ``1``. For the slave called ``'fast'`` however, we want to have at most three builds, and for the slave called ``'new'`` the upper limit is two builds running at the same time.hjRhhh$hph&}rs(h*]h+]h)]h(]h,]uh/KJh0hh1]rt(hCX%After importing locks from buildbot, rurv}rw(hX%After importing locks from buildbot, hjqubcsphinx.addnodes pending_xref rx)ry}rz(hX:data:`db_lock`r{hjqhhh$U pending_xrefr|h&}r}(UreftypeXdataUrefwarnr~U reftargetrXdb_lockU refdomainXpyrh(]h)]U refexplicith*]h+]h,]UrefdocrXmanual/cfg-interlocksrUpy:classrNU py:modulerNuh/KJh1]rcdocutils.nodes literal r)r}r(hj{h&}r(h*]h+]r(UxrefrjXpy-datareh)]h(]h,]uhjyh1]rhCXdb_lockrr}r(hUhjubah$UliteralrubaubhCX% is defined to be a master lock. The rr}r(hX% is defined to be a master lock. The hjqubj)r}r(hX ``database``h&}r(h*]h+]h)]h(]h,]uhjqh1]rhCXdatabaserr}r(hUhjubah$jubhCXY string is used for uniquely identifying the lock. At the next line, a slave lock called rr}r(hXY string is used for uniquely identifying the lock. At the next line, a slave lock called hjqubjx)r}r(hX:data:`build_lock`rhjqhhh$j|h&}r(UreftypeXdataj~jX build_lockU refdomainXpyrh(]h)]U refexplicith*]h+]h,]jjjNjNuh/KJh1]rj)r}r(hjh&}r(h*]h+]r(jjXpy-datareh)]h(]h,]uhjh1]rhCX build_lockrr}r(hUhjubah$jubaubhCX% is created. It is identified by the rr}r(hX% is created. It is identified by the hjqubj)r}r(hX``slave_builds``h&}r(h*]h+]h)]h(]h,]uhjqh1]rhCX slave_buildsrr}r(hUhjubah$jubhCXw string. Since the requirements of the lock are a bit more complicated, two optional arguments are also specified. The rr}r(hXw string. Since the requirements of the lock are a bit more complicated, two optional arguments are also specified. The hjqubj)r}r(hX ``maxCount``h&}r(h*]h+]h)]h(]h,]uhjqh1]rhCXmaxCountrr}r(hUhjubah$jubhCXA parameter sets the default limit for builds in counting mode to rr}r(hXA parameter sets the default limit for builds in counting mode to hjqubj)r}r(hX``1``h&}r(h*]h+]h)]h(]h,]uhjqh1]rhCX1r}r(hUhjubah$jubhCX. For the slave called rr}r(hX. For the slave called hjqubj)r}r(hX ``'fast'``h&}r(h*]h+]h)]h(]h,]uhjqh1]rhCX'fast'rr}r(hUhjubah$jubhCXI however, we want to have at most three builds, and for the slave called rr}r(hXI however, we want to have at most three builds, and for the slave called hjqubj)r}r(hX ``'new'``h&}r(h*]h+]h)]h(]h,]uhjqh1]rhCX'new'rr}r(hUhjubah$jubhCX8 the upper limit is two builds running at the same time.rr}r(hX8 the upper limit is two builds running at the same time.hjqubeubh^)r}r(hXrThe next step is accessing the locks in builds. Buildbot allows a lock to be used during an entire build (from beginning to end), or only during a single build step. In the latter case, the lock is claimed for use just before the step starts, and released again when the step ends. To prevent deadlocks, [#]_ it is not possible to claim or release locks at other times.hjRhhh$hph&}r(h*]h+]h)]h(]h,]uh/KTh0hh1]r(hCX1The next step is accessing the locks in builds. Buildbot allows a lock to be used during an entire build (from beginning to end), or only during a single build step. In the latter case, the lock is claimed for use just before the step starts, and released again when the step ends. To prevent deadlocks, rr}r(hX1The next step is accessing the locks in builds. Buildbot allows a lock to be used during an entire build (from beginning to end), or only during a single build step. In the latter case, the lock is claimed for use just before the step starts, and released again when the step ends. To prevent deadlocks, hjubh)r}r(hX[#]_hKhjh$hh&}r(hKh(]rUid4rah)]h*]h+]h,]h-Uid7ruh1]rhCX2r}r(hUhjubaubhCX= it is not possible to claim or release locks at other times.rr}r(hX= it is not possible to claim or release locks at other times.hjubeubh^)r}r(hX8To use locks, you add them with a ``locks`` argument to a build or a step. Each use of a lock is either in counting mode (that is, possibly shared with other builds) or in exclusive mode, and this is indicated with the syntax ``lock.access(mode)``, where :data:`mode` is one of ``"counting"`` or ``"exclusive"``.hjRhhh$hph&}r(h*]h+]h)]h(]h,]uh/K[h0hh1]r(hCX"To use locks, you add them with a rr}r(hX"To use locks, you add them with a hjubj)r}r(hX ``locks``h&}r(h*]h+]h)]h(]h,]uhjh1]rhCXlocksrr}r(hUhjubah$jubhCX argument to a build or a step. Each use of a lock is either in counting mode (that is, possibly shared with other builds) or in exclusive mode, and this is indicated with the syntax rr}r(hX argument to a build or a step. Each use of a lock is either in counting mode (that is, possibly shared with other builds) or in exclusive mode, and this is indicated with the syntax hjubj)r}r(hX``lock.access(mode)``h&}r(h*]h+]h)]h(]h,]uhjh1]r hCXlock.access(mode)r r }r (hUhjubah$jubhCX, where r r}r(hX, where hjubjx)r}r(hX :data:`mode`rhjhhh$j|h&}r(UreftypeXdataj~jXmodeU refdomainXpyrh(]h)]U refexplicith*]h+]h,]jjjNjNuh/K[h1]rj)r}r(hjh&}r(h*]h+]r(jjXpy-datareh)]h(]h,]uhjh1]rhCXmoderr}r(hUhjubah$jubaubhCX is one of rr }r!(hX is one of hjubj)r"}r#(hX``"counting"``h&}r$(h*]h+]h)]h(]h,]uhjh1]r%hCX "counting"r&r'}r((hUhj"ubah$jubhCX or r)r*}r+(hX or hjubj)r,}r-(hX``"exclusive"``h&}r.(h*]h+]h)]h(]h,]uhjh1]r/hCX "exclusive"r0r1}r2(hUhj,ubah$jubhCX.r3}r4(hX.hjubeubh^)r5}r6(hXA build or build step proceeds only when it has acquired all locks. If a build or step needs a lot of locks, it may be starved [#]_ by other builds that need fewer locks.hjRhhh$hph&}r7(h*]h+]h)]h(]h,]uh/K`h0hh1]r8(hCXA build or build step proceeds only when it has acquired all locks. If a build or step needs a lot of locks, it may be starved r9r:}r;(hXA build or build step proceeds only when it has acquired all locks. If a build or step needs a lot of locks, it may be starved hj5ubh)r<}r=(hX[#]_hKhj5h$hh&}r>(hKh(]r?Uid5r@ah)]h*]h+]h,]h-Uid8rAuh1]rBhCX3rC}rD(hUhj<ubaubhCX' by other builds that need fewer locks.rErF}rG(hX' by other builds that need fewer locks.hj5ubeubh^)rH}rI(hX.To illustrate use of locks, a few examples. ::rJhjRhhh$hph&}rK(h*]h+]h)]h(]h,]uh/Kdh0hh1]rLhCX+To illustrate use of locks, a few examples.rMrN}rO(hX+To illustrate use of locks, a few examples.hjHubaubjf)rP}rQ(hXSfrom buildbot import locks from buildbot.steps import source, shell from buildbot.process import factory db_lock = locks.MasterLock("database") build_lock = locks.SlaveLock("slave_builds", maxCount = 1, maxCountForSlave = { 'fast': 3, 'new': 2 }) f = factory.BuildFactory() f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk")) f.addStep(shell.ShellCommand(command="make all")) f.addStep(shell.ShellCommand(command="make test", locks=[db_lock.access('exclusive')])) b1 = {'name': 'full1', 'slavename': 'fast', 'builddir': 'f1', 'factory': f, 'locks': [build_lock.access('counting')] } b2 = {'name': 'full2', 'slavename': 'new', 'builddir': 'f2', 'factory': f, 'locks': [build_lock.access('counting')] } b3 = {'name': 'full3', 'slavename': 'old', 'builddir': 'f3', 'factory': f, 'locks': [build_lock.access('counting')] } b4 = {'name': 'full4', 'slavename': 'other', 'builddir': 'f4', 'factory': f, 'locks': [build_lock.access('counting')] } c['builders'] = [b1, b2, b3, b4]hjRhhh$jih&}rR(jkjlh(]h)]h*]h+]h,]uh/Kfh0hh1]rShCXSfrom buildbot import locks from buildbot.steps import source, shell from buildbot.process import factory db_lock = locks.MasterLock("database") build_lock = locks.SlaveLock("slave_builds", maxCount = 1, maxCountForSlave = { 'fast': 3, 'new': 2 }) f = factory.BuildFactory() f.addStep(source.SVN(svnurl="http://example.org/svn/Trunk")) f.addStep(shell.ShellCommand(command="make all")) f.addStep(shell.ShellCommand(command="make test", locks=[db_lock.access('exclusive')])) b1 = {'name': 'full1', 'slavename': 'fast', 'builddir': 'f1', 'factory': f, 'locks': [build_lock.access('counting')] } b2 = {'name': 'full2', 'slavename': 'new', 'builddir': 'f2', 'factory': f, 'locks': [build_lock.access('counting')] } b3 = {'name': 'full3', 'slavename': 'old', 'builddir': 'f3', 'factory': f, 'locks': [build_lock.access('counting')] } b4 = {'name': 'full4', 'slavename': 'other', 'builddir': 'f4', 'factory': f, 'locks': [build_lock.access('counting')] } c['builders'] = [b1, b2, b3, b4]rTrU}rV(hUhjPubaubh^)rW}rX(hXHere we have four slaves :data:`b1`, :data:`b2`, :data:`b3`, and :data:`b4`. Each slave performs the same checkout, make, and test build step sequence. We want to enforce that at most one test step is executed between all slaves due to restrictions with the data base server. This is done by adding the ``locks=`` parameter with the third step. It takes a list of locks with their access mode. In this case only the :data:`db_lock` is needed. The exclusive access mode is used to ensure there is at most one slave that executes the test step.hjRhhh$hph&}rY(h*]h+]h)]h(]h,]uh/Kh0hh1]rZ(hCXHere we have four slaves r[r\}r](hXHere we have four slaves hjWubjx)r^}r_(hX :data:`b1`r`hjWhhh$j|h&}ra(UreftypeXdataj~jXb1U refdomainXpyrbh(]h)]U refexplicith*]h+]h,]jjjNjNuh/Kh1]rcj)rd}re(hj`h&}rf(h*]h+]rg(jjbXpy-datarheh)]h(]h,]uhj^h1]rihCXb1rjrk}rl(hUhjdubah$jubaubhCX, rmrn}ro(hX, hjWubjx)rp}rq(hX :data:`b2`rrhjWhhh$j|h&}rs(UreftypeXdataj~jXb2U refdomainXpyrth(]h)]U refexplicith*]h+]h,]jjjNjNuh/Kh1]ruj)rv}rw(hjrh&}rx(h*]h+]ry(jjtXpy-datarzeh)]h(]h,]uhjph1]r{hCXb2r|r}}r~(hUhjvubah$jubaubhCX, rr}r(hX, hjWubjx)r}r(hX :data:`b3`rhjWhhh$j|h&}r(UreftypeXdataj~jXb3U refdomainXpyrh(]h)]U refexplicith*]h+]h,]jjjNjNuh/Kh1]rj)r}r(hjh&}r(h*]h+]r(jjXpy-datareh)]h(]h,]uhjh1]rhCXb3rr}r(hUhjubah$jubaubhCX, and rr}r(hX, and hjWubjx)r}r(hX :data:`b4`rhjWhhh$j|h&}r(UreftypeXdataj~jXb4U refdomainXpyrh(]h)]U refexplicith*]h+]h,]jjjNjNuh/Kh1]rj)r}r(hjh&}r(h*]h+]r(jjXpy-datareh)]h(]h,]uhjh1]rhCXb4rr}r(hUhjubah$jubaubhCX. Each slave performs the same checkout, make, and test build step sequence. We want to enforce that at most one test step is executed between all slaves due to restrictions with the data base server. This is done by adding the rr}r(hX. Each slave performs the same checkout, make, and test build step sequence. We want to enforce that at most one test step is executed between all slaves due to restrictions with the data base server. This is done by adding the hjWubj)r}r(hX ``locks=``h&}r(h*]h+]h)]h(]h,]uhjWh1]rhCXlocks=rr}r(hUhjubah$jubhCXg parameter with the third step. It takes a list of locks with their access mode. In this case only the rr}r(hXg parameter with the third step. It takes a list of locks with their access mode. In this case only the hjWubjx)r}r(hX:data:`db_lock`rhjWhhh$j|h&}r(UreftypeXdataj~jXdb_lockU refdomainXpyrh(]h)]U refexplicith*]h+]h,]jjjNjNuh/Kh1]rj)r}r(hjh&}r(h*]h+]r(jjXpy-datareh)]h(]h,]uhjh1]rhCXdb_lockrr}r(hUhjubah$jubaubhCXo is needed. The exclusive access mode is used to ensure there is at most one slave that executes the test step.rr}r(hXo is needed. The exclusive access mode is used to ensure there is at most one slave that executes the test step.hjWubeubh^)r}r(hXeIn addition to exclusive accessing the data base, we also want slaves to stay responsive even under the load of a large number of builds being triggered. For this purpose, the slave lock called :data:`build_lock` is defined. Since the restraint holds for entire builds, the lock is specified in the builder with ``'locks': [build_lock.access('counting')]``.hjRhhh$hph&}r(h*]h+]h)]h(]h,]uh/Kh0hh1]r(hCXIn addition to exclusive accessing the data base, we also want slaves to stay responsive even under the load of a large number of builds being triggered. For this purpose, the slave lock called rr}r(hXIn addition to exclusive accessing the data base, we also want slaves to stay responsive even under the load of a large number of builds being triggered. For this purpose, the slave lock called hjubjx)r}r(hX:data:`build_lock`rhjhhh$j|h&}r(UreftypeXdataj~jX build_lockU refdomainXpyrh(]h)]U refexplicith*]h+]h,]jjjNjNuh/Kh1]rj)r}r(hjh&}r(h*]h+]r(jjXpy-datareh)]h(]h,]uhjh1]rhCX build_lockrr}r(hUhjubah$jubaubhCXd is defined. Since the restraint holds for entire builds, the lock is specified in the builder with rr}r(hXd is defined. Since the restraint holds for entire builds, the lock is specified in the builder with hjubj)r}r(hX,``'locks': [build_lock.access('counting')]``h&}r(h*]h+]h)]h(]h,]uhjh1]rhCX('locks': [build_lock.access('counting')]rr}r(hUhjubah$jubhCX.r}r(hX.hjubeubh^)r}r(hXNote that you will occasionally see ``lock.access(mode)`` written as ``LockAccess(lock, mode)``. The two are equivalent, but the former is preferred.hjRhhh$hph&}r(h*]h+]h)]h(]h,]uh/Kh0hh1]r(hCX$Note that you will occasionally see rr}r(hX$Note that you will occasionally see hjubj)r}r(hX``lock.access(mode)``h&}r(h*]h+]h)]h(]h,]uhjh1]rhCXlock.access(mode)rr}r(hUhjubah$jubhCX written as rr}r(hX written as hjubj)r}r(hX``LockAccess(lock, mode)``h&}r(h*]h+]h)]h(]h,]uhjh1]rhCXLockAccess(lock, mode)rr}r(hUhjubah$jubhCX7. The two are equivalent, but the former is preferred.rr}r(hX7. The two are equivalent, but the former is preferred.hjubeubcdocutils.nodes footnote r)r}r(hXOSee http://en.wikipedia.org/wiki/Read/write_lock_pattern for more information. hjRhhh$Ufootnoterh&}r(hKh(]rhah)]rhah*]h+]h,]rU1auh/Kh0hh1]r(cdocutils.nodes label r)r }r (hUhjhNh$Ulabelr h&}r (h*]h+]h)]h(]h,]uh/Nh0hh1]r hCX1r}r(hUhj ubaubh^)r}r(hXNSee http://en.wikipedia.org/wiki/Read/write_lock_pattern for more information.hjhhh$hph&}r(h*]h+]h)]h(]h,]uh/Kh1]r(hCXSee rr}r(hXSee hjubhc)r}r(hX4http://en.wikipedia.org/wiki/Read/write_lock_patternrh&}r(Urefurijh(]h)]h*]h+]h,]uhjh1]rhCX4http://en.wikipedia.org/wiki/Read/write_lock_patternrr}r(hUhjubah$houbhCX for more information.rr }r!(hX for more information.hjubeubeubj)r"}r#(hXDeadlock is the situation where two or more slaves each hold a lock in exclusive mode, and in addition want to claim the lock held by the other slave exclusively as well. Since locks allow at most one exclusive user, both slaves will wait forever. hjRhhh$jh&}r$(hKh(]r%jah)]r&jah*]h+]h,]r'U2auh/Kh0hh1]r((j)r)}r*(hUhj"hNh$j h&}r+(h*]h+]h)]h(]h,]uh/Nh0hh1]r,hCX2r-}r.(hUhj)ubaubh^)r/}r0(hXDeadlock is the situation where two or more slaves each hold a lock in exclusive mode, and in addition want to claim the lock held by the other slave exclusively as well. Since locks allow at most one exclusive user, both slaves will wait forever.r1hj"hhh$hph&}r2(h*]h+]h)]h(]h,]uh/Kh1]r3hCXDeadlock is the situation where two or more slaves each hold a lock in exclusive mode, and in addition want to claim the lock held by the other slave exclusively as well. Since locks allow at most one exclusive user, both slaves will wait forever.r4r5}r6(hj1hj/ubaubeubj)r7}r8(hXStarving is the situation that only a few locks are available, and they are immediately grabbed by another build. As a result, it may take a long time before all locks needed by the starved build are free at the same time. hjRhhh$jh&}r9(hKh(]r:jAah)]r;j@ah*]h+]h,]r<U3auh/Kh0hh1]r=(j)r>}r?(hUhj7hNh$j h&}r@(h*]h+]h)]h(]h,]uh/Nh0hh1]rAhCX3rB}rC(hUhj>ubaubh^)rD}rE(hXStarving is the situation that only a few locks are available, and they are immediately grabbed by another build. As a result, it may take a long time before all locks needed by the starved build are free at the same time.rFhj7hhh$hph&}rG(h*]h+]h)]h(]h,]uh/Kh1]rHhCXStarving is the situation that only a few locks are available, and they are immediately grabbed by another build. As a result, it may take a long time before all locks needed by the starved build are free at the same time.rIrJ}rK(hjFhjDubaubeubeubeubhhh$Usystem_messagerLh&}rM(h*]UlevelKh(]h)]rNh7aUsourcehh+]h,]UlineKUtypeUINFOrOuh/Kh0hh1]rPh^)rQ}rR(hUh&}rS(h*]h+]h)]h(]h,]uhhh1]rThCX-Duplicate implicit target name: "interlocks".rUrV}rW(hUhjQubah$hpubaubaUcurrent_sourcerXNU decorationrYNUautofootnote_startrZKUnameidsr[}r\(hhhhihh.U3jAU1hh hU2jh hh hh hPuh1]r](cdocutils.nodes comment r^)r_}r`(hX -*- rst -*-hhhhh$Ucommentrah&}rb(jkjlh(]h)]h*]h+]h,]uh/Kh0hh1]rchCX -*- rst -*-rdre}rf(hUhj_ubaubh"hehUU transformerrgNU footnote_refsrh}riUrefnamesrj}rkUsymbol_footnotesrl]rmUautofootnote_refsrn]ro(hjj<eUsymbol_footnote_refsrp]rqU citationsrr]rsh0hU current_linertNUtransform_messagesru]rv(h)rw}rx(hUh&}ry(h*]UlevelKh(]h)]Usourcehh+]h,]UlineKUtypejOuh1]rzh^)r{}r|(hUh&}r}(h*]h+]h)]h(]h,]uhjwh1]r~hCX0Hyperlink target "interlocks" is not referenced.rr}r(hUhj{ubah$hpubah$jLubh)r}r(hUh&}r(h*]UlevelKh(]h)]Usourcehh+]h,]UlineKUtypejOuh1]rh^)r}r(hUh&}r(h*]h+]h)]h(]h,]uhjh1]rhCX2Hyperlink target "access-modes" is not referenced.rr}r(hUhjubah$hpubah$jLubeUreporterrNUid_startrK U autofootnotesr]r(jj"j7eU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh@NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-interlocks.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hjhihjAj7hhhdhjh.hjjj@j<hhhhh7hh~hzhhhhhjRjj"hj*hPhHuUsubstitution_namesr}rh$h0h&}r(h*]h(]h)]Usourcehh+]h,]uU footnotesr]rUrefidsr}r(h]rhaj]rjah.]rh"ahi]rhajA]rj<auub.PK7D*S5buildbot-v0.8.9/.doctrees/manual/installation.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xf1qX)upgrading a buildmaster to later versionsqNXshutdownqX distutilsq Xversion-specific notesq NXwindows supportq NXcontrib scriptsq NX!upgrading-an-existing-buildmasterq Xthe distribution packageqNXcreating-a-buildslaveqXtroubleshootingqXadditional requirementsqNXbuildslave optionsqNXother buildslave configurationqNX!buildslave-version-specific-notesqX virtualenvqXinstallation-in-a-virtualenvqXconnecting-to-the-buildmasterqXinstallation from tarballsqNX requirementsqX!upgrading an existing buildmasterqNX)upgrading a buildmaster to buildbot-0.7.6qNX upgrading an existing buildslaveqNXinstalling-the-codeqXinstallation in a virtualenvqNX twistedwordsqXusing a database serverq NXbuildmaster optionsq!NXlaunching-the-daemonsq"X(upgrading-a-buildmaster-to-later-versionq#X$upgrading into a non-sqlite databaseq$NXmockq%Xbuildmaster-requirementsq&X.upgrading a buildslave to buildbot-slave-0.8.1q'NX)upgrading a buildmaster to buildbot-0.8.0q(NX twistedmailq)X maintenanceq*Xcreating a buildslaveq+NX running-buildbots-tests-optionalq,X twistedconchq-Xinstalling the codeq.NXother-buildslave-configurationq/X twistedwebq0X upgrading-an-existing-buildslaveq1Xconnecting to the buildmasterq2NX installationq3NXchange encoding issuesq4NX"buildmaster-version-specific-notesq5Xbuildslave-optionsq6Xbuildbot-componentsq7Xbuildbot componentsq8NXcreating-a-buildmasterq9Xcommon requirementsq:NXinstallation from pypiq;NXstarting the buildslaveqXcreating a buildmasterq?NXcontrib-scriptsq@Xbuildmaster requirementsqANXcommon-requirementsqBXlaunching the daemonsqCNXstarting-the-buildslaveqDuUsubstitution_defsqE}qFUparse_messagesqG]qH(cdocutils.nodes system_message qI)qJ}qK(U rawsourceqLUUparentqMcdocutils.nodes section qN)qO}qP(hLUU referencedqQKhMhN)qR}qS(hLUhMhUsourceqTcdocutils.nodes reprunicode qUXT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/installation.rstqVqW}qXbUtagnameqYUsectionqZU attributesq[}q\(Udupnamesq]]Uclassesq^]Ubackrefsq_]Uidsq`]qaU installationqbaUnamesqc]qdh3auUlineqeKUdocumentqfhUchildrenqg]qh(cdocutils.nodes title qi)qj}qk(hLX InstallationqlhMhRhThWhYUtitleqmh[}qn(h]]h^]h_]h`]hc]uheKhfhhg]qocdocutils.nodes Text qpX Installationqqqr}qs(hLhlhMhjubaubcdocutils.nodes target qt)qu}qv(hLX.. _Buildbot-Components:hMhRhThWhYUtargetqwh[}qx(h`]h_]h]]h^]hc]UrefidqyUbuildbot-componentsqzuheKhfhhg]ubhN)q{}q|(hLUhMhRhThWUexpect_referenced_by_nameq}}q~h7hushYhZh[}q(h]]h^]h_]h`]q(hzUid1qehc]q(h8h7euheKhfhUexpect_referenced_by_idq}qhzhushg]q(hi)q}q(hLXBuildbot ComponentsqhMh{hThWhYhmh[}q(h]]h^]h_]h`]hc]uheKhfhhg]qhpXBuildbot Componentsqq}q(hLhhMhubaubcdocutils.nodes paragraph q)q}q(hLXsBuildbot is shipped in two components: the *buildmaster* (called ``buildbot`` for legacy reasons) and the *buildslave*. The buildslave component has far fewer requirements, and is more broadly compatible than the buildmaster. You will need to carefully pick the environment in which to run your buildmaster, but the buildslave should be able to run just about anywhere.hMh{hThWhYU paragraphqh[}q(h]]h^]h_]h`]hc]uheK hfhhg]q(hpX+Buildbot is shipped in two components: the qq}q(hLX+Buildbot is shipped in two components: the hMhubcdocutils.nodes emphasis q)q}q(hLX *buildmaster*h[}q(h]]h^]h_]h`]hc]uhMhhg]qhpX buildmasterqq}q(hLUhMhubahYUemphasisqubhpX (called qq}q(hLX (called hMhubcdocutils.nodes literal q)q}q(hLX ``buildbot``h[}q(h]]h^]h_]h`]hc]uhMhhg]qhpXbuildbotqq}q(hLUhMhubahYUliteralqubhpX for legacy reasons) and the qq}q(hLX for legacy reasons) and the hMhubh)q}q(hLX *buildslave*h[}q(h]]h^]h_]h`]hc]uhMhhg]qhpX buildslaveqq}q(hLUhMhubahYhubhpX. The buildslave component has far fewer requirements, and is more broadly compatible than the buildmaster. You will need to carefully pick the environment in which to run your buildmaster, but the buildslave should be able to run just about anywhere.qq}q(hLX. The buildslave component has far fewer requirements, and is more broadly compatible than the buildmaster. You will need to carefully pick the environment in which to run your buildmaster, but the buildslave should be able to run just about anywhere.hMhubeubh)q}q(hLXIt is possible to install the buildmaster and buildslave on the same system, although for anything but the smallest installation this arrangement will not be very efficient.qhMh{hThWhYhh[}q(h]]h^]h_]h`]hc]uheKhfhhg]qhpXIt is possible to install the buildmaster and buildslave on the same system, although for anything but the smallest installation this arrangement will not be very efficient.qq}q(hLhhMhubaubht)q}q(hLX.. _Requirements:hMh{hThWhYhwh[}q(h`]h_]h]]h^]hc]hyU requirementsquheKhfhhg]ubeubhOhN)q}q(hLUhMhRhThWh}}qhht)q}q(hLX.. _Installing-the-code:hMhN)q}q(hLUhMhOhThWh}}qh&ht)q}q(hLX.. _Buildmaster-Requirements:hMhN)q}q(hLUhMhN)q}q(hLUhMhOhThWh}}qhBht)q}q(hLX.. _Common-Requirements:hMhOhThWhYhwh[}q(h`]h_]h]]h^]hc]hyUcommon-requirementsquheKhfhhg]ubshYhZh[}q(h]]h^]h_]h`]q(hUid3qehc]q(h:hBeuheKhfhh}qhhshg]q(hi)q}q(hLXCommon RequirementsqhMhhThWhYhmh[}q(h]]h^]h_]h`]hc]uheKhfhhg]qhpXCommon Requirementsqㅁq}q(hLhhMhubaubh)q}q(hLXWAt a bare minimum, you'll need the following for both the buildmaster and a buildslave:qhMhhThWhYhh[}q(h]]h^]h_]h`]hc]uheKhfhhg]qhpXWAt a bare minimum, you'll need the following for both the buildmaster and a buildslave:q녁q}q(hLhhMhubaubh)q}q(hLXPython: http://www.python.orgqhMhhThWhYhh[}q(h]]h^]h_]h`]hc]uheK hfhhg]q(hpXPython: qq}q(hLXPython: hMhubcdocutils.nodes reference q)q}q(hLXhttp://www.python.orgqh[}q(Urefurihh`]h_]h]]h^]hc]uhMhhg]qhpXhttp://www.python.orgqq}q(hLUhMhubahYU referencequbeubcdocutils.nodes block_quote r)r}r(hLUhMhhThWhYU block_quoterh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXvBuildbot requires Python-2.5 or later on the master, although Python-2.7 is recommended. The slave run on Python-2.4.rhMjhThWhYhh[}r (h]]h^]h_]h`]hc]uheK"hg]r hpXvBuildbot requires Python-2.5 or later on the master, although Python-2.7 is recommended. The slave run on Python-2.4.r r }r (hLjhMjubaubaubh)r}r(hLX!Twisted: http://twistedmatrix.comrhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheK%hfhhg]r(hpX Twisted: rr}r(hLX Twisted: hMjubh)r}r(hLXhttp://twistedmatrix.comrh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpXhttp://twistedmatrix.comrr}r(hLUhMjubahYhubeubj)r}r(hLUhMhhThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r!(h)r"}r#(hLXBuildbot requires Twisted-11.0.0 or later on the master, and Twisted-8.1.0 on the slave. In upcoming versions of Buildbot, a newer Twisted will also be required on the slave. As always, the most recent version is recommended.r$hMjhThWhYhh[}r%(h]]h^]h_]h`]hc]uheK'hg]r&hpXBuildbot requires Twisted-11.0.0 or later on the master, and Twisted-8.1.0 on the slave. In upcoming versions of Buildbot, a newer Twisted will also be required on the slave. As always, the most recent version is recommended.r'r(}r)(hLj$hMj"ubaubh)r*}r+(hLXIn some cases, Twisted is delivered as a collection of subpackages. You'll need at least "Twisted" (the core package), and you'll also want `TwistedMail`_, `TwistedWeb`_, and `TwistedWords`_ (for sending email, serving a web status page, and delivering build status via IRC, respectively). You might also want `TwistedConch`_ (for the encrypted Manhole debug port). Note that Twisted requires ZopeInterface to be installed as well.hMjhThWhYhh[}r,(h]]h^]h_]h`]hc]uheK+hg]r-(hpXIn some cases, Twisted is delivered as a collection of subpackages. You'll need at least "Twisted" (the core package), and you'll also want r.r/}r0(hLXIn some cases, Twisted is delivered as a collection of subpackages. You'll need at least "Twisted" (the core package), and you'll also want hMj*ubh)r1}r2(hLX`TwistedMail`_Uresolvedr3KhMj*hYhh[}r4(UnameX TwistedMailUrefurir5X.http://twistedmatrix.com/trac/wiki/TwistedMailr6h`]h_]h]]h^]hc]uhg]r7hpX TwistedMailr8r9}r:(hLUhMj1ubaubhpX, r;r<}r=(hLX, hMj*ubh)r>}r?(hLX `TwistedWeb`_j3KhMj*hYhh[}r@(UnameX TwistedWebj5X-http://twistedmatrix.com/trac/wiki/TwistedWebrAh`]h_]h]]h^]hc]uhg]rBhpX TwistedWebrCrD}rE(hLUhMj>ubaubhpX, and rFrG}rH(hLX, and hMj*ubh)rI}rJ(hLX`TwistedWords`_j3KhMj*hYhh[}rK(UnameX TwistedWordsj5X/http://twistedmatrix.com/trac/wiki/TwistedWordsrLh`]h_]h]]h^]hc]uhg]rMhpX TwistedWordsrNrO}rP(hLUhMjIubaubhpXx (for sending email, serving a web status page, and delivering build status via IRC, respectively). You might also want rQrR}rS(hLXx (for sending email, serving a web status page, and delivering build status via IRC, respectively). You might also want hMj*ubh)rT}rU(hLX`TwistedConch`_j3KhMj*hYhh[}rV(UnameX TwistedConchj5X/http://twistedmatrix.com/trac/wiki/TwistedConchrWh`]h_]h]]h^]hc]uhg]rXhpX TwistedConchrYrZ}r[(hLUhMjTubaubhpXj (for the encrypted Manhole debug port). Note that Twisted requires ZopeInterface to be installed as well.r\r]}r^(hLXj (for the encrypted Manhole debug port). Note that Twisted requires ZopeInterface to be installed as well.hMj*ubeubeubh)r_}r`(hLXOf course, your project's build process will impose additional requirements on the buildslaves. These hosts must have all the tools necessary to compile and test your project's source code.rahMhhThWhYhh[}rb(h]]h^]h_]h`]hc]uheK3hfhhg]rchpXOf course, your project's build process will impose additional requirements on the buildslaves. These hosts must have all the tools necessary to compile and test your project's source code.rdre}rf(hLjahMj_ubaubheubhThWhYhZh[}rg(h]]h^]h_]h`]rhUwindows-supportriahc]rjh auheK8hfhhg]rk(hi)rl}rm(hLXWindows SupportrnhMhhThWhYhmh[}ro(h]]h^]h_]h`]hc]uheK8hfhhg]rphpXWindows Supportrqrr}rs(hLjnhMjlubaubh)rt}ru(hLXBuildbot - both master and slave - runs well natively on Windows. The slave runs well on Cygwin, but because of problems with SQLite on Cygwin, the master does not.rvhMhhThWhYhh[}rw(h]]h^]h_]h`]hc]uheK:hfhhg]rxhpXBuildbot - both master and slave - runs well natively on Windows. The slave runs well on Cygwin, but because of problems with SQLite on Cygwin, the master does not.ryrz}r{(hLjvhMjtubaubh)r|}r}(hLXBuildbot's windows testing is limited to the most recent Twisted and Python versions. For best results, use the most recent available versions of these libraries on Windows.r~hMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheK>hfhhg]rhpXBuildbot's windows testing is limited to the most recent Twisted and Python versions. For best results, use the most recent available versions of these libraries on Windows.rr}r(hLj~hMj|ubaubh)r}r(hLX1Pywin32: http://sourceforge.net/projects/pywin32/rhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheKBhfhhg]r(hpX Pywin32: rr}r(hLX Pywin32: hMjubh)r}r(hLX(http://sourceforge.net/projects/pywin32/rh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpX(http://sourceforge.net/projects/pywin32/rr}r(hLUhMjubahYhubeubj)r}r(hLUhMhhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLX@Twisted requires PyWin32 in order to spawn processes on Windows.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKDhg]rhpX@Twisted requires PyWin32 in order to spawn processes on Windows.rr}r(hLjhMjubaubaubheubhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUbuildmaster-requirementsruheKFhfhhg]ubshYhZh[}r(h]]h^]h_]h`]r(jUid4rehc]r(hAh&euheKIhfhh}rjhshg]r(hi)r}r(hLXBuildmaster RequirementsrhMhhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKIhfhhg]rhpXBuildmaster Requirementsrr}r(hLjhMjubaubh)r}r(hLXsqlite3: http://www.sqlite.orgrhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheKKhfhhg]r(hpX sqlite3: rr}r(hLX sqlite3: hMjubh)r}r(hLXhttp://www.sqlite.orgrh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpXhttp://www.sqlite.orgrr}r(hLUhMjubahYhubeubj)r}r(hLUhMhhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXBuildbot requires SQLite to store its state. Version 3.7.0 or higher is recommended, although Buildbot will run against earlier versions -- at the risk of "Database is locked" errors. The minimum version is 3.4.0, below which parallel database queries and schema introspection fail.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKMhg]rhpXBuildbot requires SQLite to store its state. Version 3.7.0 or higher is recommended, although Buildbot will run against earlier versions -- at the risk of "Database is locked" errors. The minimum version is 3.4.0, below which parallel database queries and schema introspection fail.rr}r(hLjhMjubaubaubh)r}r(hLX.pysqlite: http://pypi.python.org/pypi/pysqliterhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheKRhfhhg]r(hpX pysqlite: rr}r(hLX pysqlite: hMjubh)r}r(hLX$http://pypi.python.org/pypi/pysqliterh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpX$http://pypi.python.org/pypi/pysqliterr}r(hLUhMjubahYhubeubj)r}r(hLUhMhhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXThe SQLite Python package is required for Python-2.5 and earlier (it is already included in Python-2.5 and later, but the version in Python-2.5 has nasty bugs)rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKThg]rhpXThe SQLite Python package is required for Python-2.5 and earlier (it is already included in Python-2.5 and later, but the version in Python-2.5 has nasty bugs)rr}r(hLjhMjubaubaubh)r}r(hLX2simplejson: http://pypi.python.org/pypi/simplejsonrhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheKWhfhhg]r(hpX simplejson: rr}r(hLX simplejson: hMjubh)r}r(hLX&http://pypi.python.org/pypi/simplejsonrh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpX&http://pypi.python.org/pypi/simplejsonrr}r(hLUhMjubahYhubeubj)r}r(hLUhMhhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXvThe simplejson package is required for Python-2.5 and earlier (it is already included as json in Python-2.6 and later)rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKYhg]rhpXvThe simplejson package is required for Python-2.5 and earlier (it is already included as json in Python-2.6 and later)rr}r(hLjhMjubaubaubh)r}r(hLXJinja2: http://jinja.pocoo.org/rhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheK\hfhhg]r(hpXJinja2: r r }r (hLXJinja2: hMjubh)r }r (hLXhttp://jinja.pocoo.org/rh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpXhttp://jinja.pocoo.org/rr}r(hLUhMj ubahYhubeubj)r}r(hLUhMhhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]r(h)r}r(hLX.Buildbot requires Jinja version 2.1 or higher.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheK^hg]rhpX.Buildbot requires Jinja version 2.1 or higher.rr}r(hLjhMjubaubh)r }r!(hLXdJinja2 is a general purpose templating language and is used by Buildbot to generate the HTML output.r"hMjhThWhYhh[}r#(h]]h^]h_]h`]hc]uheK`hg]r$hpXdJinja2 is a general purpose templating language and is used by Buildbot to generate the HTML output.r%r&}r'(hLj"hMj ubaubeubh)r(}r)(hLX&SQLAlchemy: http://www.sqlalchemy.org/r*hMhhThWhYhh[}r+(h]]h^]h_]h`]hc]uheKchfhhg]r,(hpX SQLAlchemy: r-r.}r/(hLX SQLAlchemy: hMj(ubh)r0}r1(hLXhttp://www.sqlalchemy.org/r2h[}r3(Urefurij2h`]h_]h]]h^]hc]uhMj(hg]r4hpXhttp://www.sqlalchemy.org/r5r6}r7(hLUhMj0ubahYhubeubj)r8}r9(hLUhMhhThWhYjh[}r:(h]]h^]h_]h`]hc]uheNhfhhg]r;h)r<}r=(hLXBuildbot requires SQLAlchemy 0.6.0 or higher. SQLAlchemy allows Buildbot to build database schemas and queries for a wide variety of database systems.r>hMj8hThWhYhh[}r?(h]]h^]h_]h`]hc]uheKehg]r@hpXBuildbot requires SQLAlchemy 0.6.0 or higher. SQLAlchemy allows Buildbot to build database schemas and queries for a wide variety of database systems.rArB}rC(hLj>hMj<ubaubaubh)rD}rE(hLX@SQLAlchemy-Migrate: http://code.google.com/p/sqlalchemy-migrate/rFhMhhThWhYhh[}rG(h]]h^]h_]h`]hc]uheKhhfhhg]rH(hpXSQLAlchemy-Migrate: rIrJ}rK(hLXSQLAlchemy-Migrate: hMjDubh)rL}rM(hLX,http://code.google.com/p/sqlalchemy-migrate/rNh[}rO(UrefurijNh`]h_]h]]h^]hc]uhMjDhg]rPhpX,http://code.google.com/p/sqlalchemy-migrate/rQrR}rS(hLUhMjLubahYhubeubj)rT}rU(hLUhMhhThWhYjh[}rV(h]]h^]h_]h`]hc]uheNhfhhg]rWh)rX}rY(hLX0Buildbot requires one of the following SQLAlchemy-Migrate versions: 0.6.1, 0.7.0, and 0.7.1. Sadly, Migrate's inter-version compatibility is not good, so other versions - newer or older - are unlikely to work correctly. Buildbot uses SQLAlchemy-Migrate to manage schema upgrades from version to version.rZhMjThThWhYhh[}r[(h]]h^]h_]h`]hc]uheKjhg]r\hpX0Buildbot requires one of the following SQLAlchemy-Migrate versions: 0.6.1, 0.7.0, and 0.7.1. Sadly, Migrate's inter-version compatibility is not good, so other versions - newer or older - are unlikely to work correctly. Buildbot uses SQLAlchemy-Migrate to manage schema upgrades from version to version.r]r^}r_(hLjZhMjXubaubaubh)r`}ra(hLX1Python-Dateutil: http://labix.org/python-dateutilrbhMhhThWhYhh[}rc(h]]h^]h_]h`]hc]uheKphfhhg]rd(hpXPython-Dateutil: rerf}rg(hLXPython-Dateutil: hMj`ubh)rh}ri(hLX http://labix.org/python-dateutilrjh[}rk(Urefurijjh`]h_]h]]h^]hc]uhMj`hg]rlhpX http://labix.org/python-dateutilrmrn}ro(hLUhMjhubahYhubeubj)rp}rq(hLUhMhhThWhYjh[}rr(h]]h^]h_]h`]hc]uheNhfhhg]rsh)rt}ru(hLXThe Nightly scheduler requires Python-Dateutil version 1.5 (the last version to support Python-2.x). This is a small, pure-python library. Buildbot will function properly without it if the Nightlys scheduler is not used.rvhMjphThWhYhh[}rw(h]]h^]h_]h`]hc]uheKrhg]rxhpXThe Nightly scheduler requires Python-Dateutil version 1.5 (the last version to support Python-2.x). This is a small, pure-python library. Buildbot will function properly without it if the Nightlys scheduler is not used.ryrz}r{(hLjvhMjtubaubaubheubhThWhYhwh[}r|(h`]h_]h]]h^]hc]hyUinstalling-the-coder}uheKvhfhhg]ubshYhZh[}r~(h]]h^]h_]h`]r(j}Uid5rehc]r(h.heuheKyhfhh}rj}hshg]r(hi)r}r(hLXInstalling the coderhMhhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKyhfhhg]rhpXInstalling the coderr}r(hLjhMjubaubhN)r}r(hLUhMhhThWhYhZh[}r(h]]h^]h_]h`]rUthe-distribution-packagerahc]rhauheK|hfhhg]r(hi)r}r(hLXThe Distribution PackagerhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheK|hfhhg]rhpXThe Distribution Packagerr}r(hLjhMjubaubh)r}r(hLXBuildbot comes in two parts: ``buildbot`` (the master) and ``buildbot-slave`` (the slave). The two can be installed individually or together.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheK~hfhhg]r(hpXBuildbot comes in two parts: rr}r(hLXBuildbot comes in two parts: hMjubh)r}r(hLX ``buildbot``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbotrr}r(hLUhMjubahYhubhpX (the master) and rr}r(hLX (the master) and hMjubh)r}r(hLX``buildbot-slave``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot-slaverr}r(hLUhMjubahYhubhpXA (the slave). The two can be installed individually or together.rr}r(hLXA (the slave). The two can be installed individually or together.hMjubeubeubhN)r}r(hLUhMhhThWhYhZh[}r(h]]h^]h_]h`]rUinstallation-from-pypirahc]rh;auheKhfhhg]r(hi)r}r(hLXInstallation From PyPIrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXInstallation From PyPIrr}r(hLjhMjubaubh)r}r(hLXGThe preferred way to install Buildbot is using ``pip``. For the master:rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX/The preferred way to install Buildbot is using rr}r(hLX/The preferred way to install Buildbot is using hMjubh)r}r(hLX``pip``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXpiprr}r(hLUhMjubahYhubhpX. For the master:rr}r(hLX. For the master:hMjubeubcdocutils.nodes literal_block r)r}r(hLXpip install buildbothMjhThWhYU literal_blockrh[}r(UlinenosrUlanguagerXbashU xml:spacerUpreserverh`]h_]h]]h^]hc]uheKhfhhg]rhpXpip install buildbotrr}r(hLUhMjubaubh)r}r(hLXand for the slave:rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXand for the slave:rr}r(hLjhMjubaubj)r}r(hLXpip install buildbot-slavehMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpXpip install buildbot-slaverr}r(hLUhMjubaubh)r}r(hLXTWhen using ``pip`` to install instead of distribution specific package manangers, e.g. via `apt-get` or `ports`, it is simpler to choose exactly which version one wants to use. It may however be easier to install via distribution specific package mangers but note that they may provide an earlier version than what is available via ``pip``.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX When using rr}r(hLX When using hMjubh)r}r(hLX``pip``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXpiprr}r(hLUhMjubahYhubhpXI to install instead of distribution specific package manangers, e.g. via rr}r(hLXI to install instead of distribution specific package manangers, e.g. via hMjubcdocutils.nodes title_reference r)r}r(hLX `apt-get`h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXapt-getr r }r (hLUhMjubahYUtitle_referencer ubhpX or r r}r(hLX or hMjubj)r}r(hLX`ports`h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXportsrr}r(hLUhMjubahYj ubhpX, it is simpler to choose exactly which version one wants to use. It may however be easier to install via distribution specific package mangers but note that they may provide an earlier version than what is available via rr}r(hLX, it is simpler to choose exactly which version one wants to use. It may however be easier to install via distribution specific package mangers but note that they may provide an earlier version than what is available via hMjubh)r}r(hLX``pip``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXpiprr}r (hLUhMjubahYhubhpX.r!}r"(hLX.hMjubeubeubhN)r#}r$(hLUhMhhThWhYhZh[}r%(h]]h^]h_]h`]r&Uinstallation-from-tarballsr'ahc]r(hauheKhfhhg]r)(hi)r*}r+(hLXInstallation From Tarballsr,hMj#hThWhYhmh[}r-(h]]h^]h_]h`]hc]uheKhfhhg]r.hpXInstallation From Tarballsr/r0}r1(hLj,hMj*ubaubh)r2}r3(hLXBuildbot and Buildslave are installed using the standard Python `distutils `_ process. For either component, after unpacking the tarball, the process is:hMj#hThWhYhh[}r4(h]]h^]h_]h`]hc]uheKhfhhg]r5(hpX@Buildbot and Buildslave are installed using the standard Python r6r7}r8(hLX@Buildbot and Buildslave are installed using the standard Python hMj2ubh)r9}r:(hLX<`distutils `_h[}r;(Unameh j5X-http://docs.python.org/library/distutils.htmlr<h`]h_]h]]h^]hc]uhMj2hg]r=hpX distutilsr>r?}r@(hLUhMj9ubahYhubht)rA}rB(hLX0 hQKhMj2hYhwh[}rC(Urefurij<h`]rDU distutilsrEah_]h]]h^]hc]rFh auhg]ubhpXL process. For either component, after unpacking the tarball, the process is:rGrH}rI(hLXL process. For either component, after unpacking the tarball, the process is:hMj2ubeubj)rJ}rK(hLX-python setup.py build python setup.py installhMj#hThWhYjh[}rL(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rMhpX-python setup.py build python setup.py installrNrO}rP(hLUhMjJubaubh)rQ}rR(hLXwhere the install step may need to be done as root. This will put the bulk of the code in somewhere like :file:`/usr/lib/pythonx.y/site-packages/buildbot`. It will also install the :command:`buildbot` command-line tool in :file:`/usr/bin/buildbot`.hMj#hThWhYhh[}rS(h]]h^]h_]h`]hc]uheKhfhhg]rT(hpXiwhere the install step may need to be done as root. This will put the bulk of the code in somewhere like rUrV}rW(hLXiwhere the install step may need to be done as root. This will put the bulk of the code in somewhere like hMjQubh)rX}rY(hLUh[}rZ(h`]h_]h]]h^]r[Xfiler\aUrolej\hc]uhMjQhg]r]hpX)/usr/lib/pythonx.y/site-packages/buildbotr^r_}r`(hLX)/usr/lib/pythonx.y/site-packages/buildbothMjXubahYhubhpX. It will also install the rarb}rc(hLX. It will also install the hMjQubcdocutils.nodes strong rd)re}rf(hLX:command:`buildbot`h[}rg(h]]h^]rhUcommandriah_]h`]hc]uhMjQhg]rjhpXbuildbotrkrl}rm(hLUhMjeubahYUstrongrnubhpX command-line tool in rorp}rq(hLX command-line tool in hMjQubh)rr}rs(hLUh[}rt(h`]h_]h]]h^]ruXfilervaUrolejvhc]uhMjQhg]rwhpX/usr/bin/buildbotrxry}rz(hLX/usr/bin/buildbothMjrubahYhubhpX.r{}r|(hLX.hMjQubeubh)r}}r~(hLXIf the environment variable ``$NO_INSTALL_REQS`` is set to ``1``, then :file:`setup.py` will not try to install Buildbot's requirements. This is usually only useful when building a Buildbot package.hMj#hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpXIf the environment variable rr}r(hLXIf the environment variable hMj}ubh)r}r(hLX``$NO_INSTALL_REQS``h[}r(h]]h^]h_]h`]hc]uhMj}hg]rhpX$NO_INSTALL_REQSrr}r(hLUhMjubahYhubhpX is set to rr}r(hLX is set to hMj}ubh)r}r(hLX``1``h[}r(h]]h^]h_]h`]hc]uhMj}hg]rhpX1r}r(hLUhMjubahYhubhpX, then rr}r(hLX, then hMj}ubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMj}hg]rhpXsetup.pyrr}r(hLXsetup.pyhMjubahYhubhpXp will not try to install Buildbot's requirements. This is usually only useful when building a Buildbot package.rr}r(hLXp will not try to install Buildbot's requirements. This is usually only useful when building a Buildbot package.hMj}ubeubh)r}r(hLXJTo test this, shift to a different directory (like :file:`/tmp`), and run:rhMj#hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX3To test this, shift to a different directory (like rr}r(hLX3To test this, shift to a different directory (like hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX/tmprr}r(hLX/tmphMjubahYhubhpX ), and run:rr}r(hLX ), and run:hMjubeubj)r}r(hLX,buildbot --version # or buildslave --versionhMj#hThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpX,buildbot --version # or buildslave --versionrr}r(hLUhMjubaubh)r}r(hLXIf it shows you the versions of Buildbot and Twisted, the install went ok. If it says "no such command" or it gets an ``ImportError`` when it tries to load the libraries, then something went wrong. ``pydoc buildbot`` is another useful diagnostic tool.hMj#hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpXvIf it shows you the versions of Buildbot and Twisted, the install went ok. If it says "no such command" or it gets an rr}r(hLXvIf it shows you the versions of Buildbot and Twisted, the install went ok. If it says "no such command" or it gets an hMjubh)r}r(hLX``ImportError``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX ImportErrorrr}r(hLUhMjubahYhubhpXA when it tries to load the libraries, then something went wrong. rr}r(hLXA when it tries to load the libraries, then something went wrong. hMjubh)r}r(hLX``pydoc buildbot``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXpydoc buildbotrr}r(hLUhMjubahYhubhpX# is another useful diagnostic tool.rr}r(hLX# is another useful diagnostic tool.hMjubeubh)r}r(hLXWindows users will find these files in other places. You will need to make sure that Python can find the libraries, and will probably find it convenient to have :command:`buildbot` on your :envvar:`PATH`.hMj#hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpXWindows users will find these files in other places. You will need to make sure that Python can find the libraries, and will probably find it convenient to have rr}r(hLXWindows users will find these files in other places. You will need to make sure that Python can find the libraries, and will probably find it convenient to have hMjubjd)r}r(hLX:command:`buildbot`h[}r(h]]h^]rjiah_]h`]hc]uhMjhg]rhpXbuildbotrr}r(hLUhMjubahYjnubhpX on your rr}r(hLX on your hMjubcsphinx.addnodes index r)r}r(hLUh[}r(h`]h_]h]]h^]hc]Uentriesr]r((UsinglerXPATHrUindex-0rUtr(jXenvironment variable; PATHjUtreuhMjhg]hYUindexrubht)r}r(hLUh[}r(h]]h^]h_]h`]rjahc]uhMjhg]hYhwubcsphinx.addnodes pending_xref r)r}r(hLX:envvar:`PATH`rhMjhThWhYU pending_xrefrh[}r(UreftypeXenvvarUrefwarnrU reftargetrjU refdomainXstdrh`]h_]U refexplicith]]h^]hc]UrefdocrXmanual/installationruheKhg]rh)r}r(hLjh[}r (h]]h^]r (Uxrefr jX std-envvarr eh_]h`]hc]uhMjhg]r hpXPATHrr}r(hLUhMjubahYhubaubhpX.r}r(hLX.hMjubeubht)r}r(hLX!.. _Installation-in-a-Virtualenv:hMj#hThWhYhwh[}r(h`]h_]h]]h^]hc]hyUinstallation-in-a-virtualenvruheKhfhhg]ubeubhN)r}r(hLUhMhhThWh}}rhjshYhZh[}r(h]]h^]h_]h`]r(jUid6rehc]r(hheuheKhfhh}rjjshg]r(hi)r }r!(hLXInstallation in a Virtualenvr"hMjhThWhYhmh[}r#(h]]h^]h_]h`]hc]uheKhfhhg]r$hpXInstallation in a Virtualenvr%r&}r'(hLj"hMj ubaubh)r(}r)(hLXIf you cannot or do not wish to install the buildbot into a site-wide location like :file:`/usr` or :file:`/usr/local`, you can also install it into the account's home directory or any other location using a tool like `virtualenv `_.hMjhThWhYhh[}r*(h]]h^]h_]h`]hc]uheKhfhhg]r+(hpXTIf you cannot or do not wish to install the buildbot into a site-wide location like r,r-}r.(hLXTIf you cannot or do not wish to install the buildbot into a site-wide location like hMj(ubh)r/}r0(hLUh[}r1(h`]h_]h]]h^]r2Xfiler3aUrolej3hc]uhMj(hg]r4hpX/usrr5r6}r7(hLX/usrhMj/ubahYhubhpX or r8r9}r:(hLX or hMj(ubh)r;}r<(hLUh[}r=(h`]h_]h]]h^]r>Xfiler?aUrolej?hc]uhMj(hg]r@hpX /usr/localrArB}rC(hLX /usr/localhMj;ubahYhubhpXd, you can also install it into the account's home directory or any other location using a tool like rDrE}rF(hLXd, you can also install it into the account's home directory or any other location using a tool like hMj(ubh)rG}rH(hLX6`virtualenv `_h[}rI(Unamehj5X&http://pypi.python.org/pypi/virtualenvrJh`]h_]h]]h^]hc]uhMj(hg]rKhpX virtualenvrLrM}rN(hLUhMjGubahYhubht)rO}rP(hLX) hQKhMj(hYhwh[}rQ(UrefurijJh`]rRU virtualenvrSah_]h]]h^]hc]rThauhg]ubhpX.rU}rV(hLX.hMj(ubeubht)rW}rX(hLX%.. _Running-Buildbots-Tests-optional:hMjhThWhYhwh[}rY(h`]h_]h]]h^]hc]hyU running-buildbots-tests-optionalrZuheKhfhhg]ubeubeubhN)r[}r\(hLUhMhRhThWh}}r]h,jWshYhZh[}r^(h]]h^]h_]h`]r_(U!running-buildbot-s-tests-optionalr`jZehc]ra(h=h,euheKhfhh}rbjZjWshg]rc(hi)rd}re(hLX#Running Buildbot's Tests (optional)rfhMj[hThWhYhmh[}rg(h]]h^]h_]h`]hc]uheKhfhhg]rhhpX#Running Buildbot's Tests (optional)rirj}rk(hLjfhMjdubaubh)rl}rm(hLXJIf you wish, you can run the buildbot unit test suite. First, ensure you have the `mock `_ Python module installed from PyPi. This module is not required for ordinary Buildbot operation - only to run the tests. Note that this is not the same as the Fedora ``mock`` package! You can check withhMj[hThWhYhh[}rn(h]]h^]h_]h`]hc]uheKhfhhg]ro(hpXSIf you wish, you can run the buildbot unit test suite. First, ensure you have the rprq}rr(hLXSIf you wish, you can run the buildbot unit test suite. First, ensure you have the hMjlubh)rs}rt(hLX*`mock `_h[}ru(Unameh%j5X http://pypi.python.org/pypi/mockrvh`]h_]h]]h^]hc]uhMjlhg]rwhpXmockrxry}rz(hLUhMjsubahYhubht)r{}r|(hLX# hQKhMjlhYhwh[}r}(Urefurijvh`]r~Umockrah_]h]]h^]hc]rh%auhg]ubhpX Python module installed from PyPi. This module is not required for ordinary Buildbot operation - only to run the tests. Note that this is not the same as the Fedora rr}r(hLX Python module installed from PyPi. This module is not required for ordinary Buildbot operation - only to run the tests. Note that this is not the same as the Fedora hMjlubh)r}r(hLX``mock``h[}r(h]]h^]h_]h`]hc]uhMjlhg]rhpXmockrr}r(hLUhMjubahYhubhpX package! You can check withrr}r(hLX package! You can check withhMjlubeubj)r}r(hLX python -mmockhMj[hThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpX python -mmockrr}r(hLUhMjubaubh)r}r(hLXThen, run the tests:rhMj[hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXThen, run the tests:rr}r(hLjhMjubaubj)r}r(hLXHPYTHONPATH=. trial buildbot.test # or PYTHONPATH=. trial buildslave.testhMj[hThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpXHPYTHONPATH=. trial buildbot.test # or PYTHONPATH=. trial buildslave.testrr}r(hLUhMjubaubh)r}r(hLX5Nothing should fail, although a few might be skipped.rhMj[hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpX5Nothing should fail, although a few might be skipped.rr}r(hLjhMjubaubh)r}r(hLXIf any of the tests fail for reasons other than a missing ``mock``, you should stop and investigate the cause before continuing the installation process, as it will probably be easier to track down the bug early. In most cases, the problem is incorrectly installed Python modules or a badly configured ``PYTHONPATH``. This may be a good time to contact the Buildbot developers for help.hMj[hThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX:If any of the tests fail for reasons other than a missing rr}r(hLX:If any of the tests fail for reasons other than a missing hMjubh)r}r(hLX``mock``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXmockrr}r(hLUhMjubahYhubhpX, you should stop and investigate the cause before continuing the installation process, as it will probably be easier to track down the bug early. In most cases, the problem is incorrectly installed Python modules or a badly configured rr}r(hLX, you should stop and investigate the cause before continuing the installation process, as it will probably be easier to track down the bug early. In most cases, the problem is incorrectly installed Python modules or a badly configured hMjubh)r}r(hLX``PYTHONPATH``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX PYTHONPATHrr}r(hLUhMjubahYhubhpXF. This may be a good time to contact the Buildbot developers for help.rr}r(hLXF. This may be a good time to contact the Buildbot developers for help.hMjubeubht)r}r(hLX.. _Creating-a-buildmaster:hMj[hThWhYhwh[}r(h`]h_]h]]h^]hc]hyUcreating-a-buildmasterruheKhfhhg]ubeubhN)r}r(hLUhMhRhThWh}}rh9jshYhZh[}r(h]]h^]h_]h`]r(jUid7rehc]r(h?h9euheKhfhh}rjjshg]r(hi)r}r(hLXCreating a buildmasterrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXCreating a buildmasterrr}r(hLjhMjubaubh)r}r(hLXAs you learned earlier (:ref:`System-Architecture`), the buildmaster runs on a central host (usually one that is publicly visible, so everybody can check on the status of the project), and controls all aspects of the buildbot systemhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpXAs you learned earlier (rr}r(hLXAs you learned earlier (hMjubj)r}r(hLX:ref:`System-Architecture`rhMjhThWhYjh[}r(UreftypeXrefjjXsystem-architectureU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheKhg]rh)r}r(hLjh[}r(h]]h^]r(j jXstd-refreh_]h`]hc]uhMjhg]rhpXSystem-Architecturerr}r(hLUhMjubahYhubaubhpX), the buildmaster runs on a central host (usually one that is publicly visible, so everybody can check on the status of the project), and controls all aspects of the buildbot systemrr}r(hLX), the buildmaster runs on a central host (usually one that is publicly visible, so everybody can check on the status of the project), and controls all aspects of the buildbot systemhMjubeubh)r}r(hLXYou will probably wish to create a separate user account for the buildmaster, perhaps named ``buildmaster``. Do not run the buildmaster as ``root``!hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX\You will probably wish to create a separate user account for the buildmaster, perhaps named rr}r(hLX\You will probably wish to create a separate user account for the buildmaster, perhaps named hMjubh)r}r(hLX``buildmaster``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX buildmasterrr}r(hLUhMjubahYhubhpX . Do not run the buildmaster as rr}r(hLX . Do not run the buildmaster as hMjubh)r}r(hLX``root``h[}r(h]]h^]h_]h`]hc]uhMjhg]r hpXrootr r }r (hLUhMjubahYhubhpX!r }r(hLX!hMjubeubh)r}r(hLXRYou need to choose a directory for the buildmaster, called the ``basedir``. This directory will be owned by the buildmaster. It will contain configuration, the database, and status information - including logfiles. On a large buildmaster this directory will see a lot of activity, so it should be on a disk with adequate space and speed.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX?You need to choose a directory for the buildmaster, called the rr}r(hLX?You need to choose a directory for the buildmaster, called the hMjubh)r}r(hLX ``basedir``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbasedirrr}r(hLUhMjubahYhubhpX. This directory will be owned by the buildmaster. It will contain configuration, the database, and status information - including logfiles. On a large buildmaster this directory will see a lot of activity, so it should be on a disk with adequate space and speed.rr}r(hLX. This directory will be owned by the buildmaster. It will contain configuration, the database, and status information - including logfiles. On a large buildmaster this directory will see a lot of activity, so it should be on a disk with adequate space and speed.hMjubeubh)r }r!(hLXOnce you've picked a directory, use the ``buildbot create-master`` command to create the directory and populate it with startup files:hMjhThWhYhh[}r"(h]]h^]h_]h`]hc]uheKhfhhg]r#(hpX(Once you've picked a directory, use the r$r%}r&(hLX(Once you've picked a directory, use the hMj ubh)r'}r((hLX``buildbot create-master``h[}r)(h]]h^]h_]h`]hc]uhMj hg]r*hpXbuildbot create-masterr+r,}r-(hLUhMj'ubahYhubhpXD command to create the directory and populate it with startup files:r.r/}r0(hLXD command to create the directory and populate it with startup files:hMj ubeubj)r1}r2(hLX!buildbot create-master -r basedirhMjhThWhYjh[}r3(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]r4hpX!buildbot create-master -r basedirr5r6}r7(hLUhMj1ubaubh)r8}r9(hLX\You will need to create a :ref:`configuration file ` before starting the buildmaster. Most of the rest of this manual is dedicated to explaining how to do this. A sample configuration file is placed in the working directory, named :file:`master.cfg.sample`, which can be copied to :file:`master.cfg` and edited to suit your purposes.hMjhThWhYhh[}r:(h]]h^]h_]h`]hc]uheMhfhhg]r;(hpXYou will need to create a r<r=}r>(hLXYou will need to create a hMj8ubj)r?}r@(hLX):ref:`configuration file `rAhMj8hThWhYjh[}rB(UreftypeXrefjjX configurationU refdomainXstdrCh`]h_]U refexplicith]]h^]hc]jjuheMhg]rDh)rE}rF(hLjAh[}rG(h]]h^]rH(j jCXstd-refrIeh_]h`]hc]uhMj?hg]rJhpXconfiguration filerKrL}rM(hLUhMjEubahYhubaubhpX before starting the buildmaster. Most of the rest of this manual is dedicated to explaining how to do this. A sample configuration file is placed in the working directory, named rNrO}rP(hLX before starting the buildmaster. Most of the rest of this manual is dedicated to explaining how to do this. A sample configuration file is placed in the working directory, named hMj8ubh)rQ}rR(hLUh[}rS(h`]h_]h]]h^]rTXfilerUaUrolejUhc]uhMj8hg]rVhpXmaster.cfg.samplerWrX}rY(hLXmaster.cfg.samplehMjQubahYhubhpX, which can be copied to rZr[}r\(hLX, which can be copied to hMj8ubh)r]}r^(hLUh[}r_(h`]h_]h]]h^]r`XfileraaUrolejahc]uhMj8hg]rbhpX master.cfgrcrd}re(hLX master.cfghMj]ubahYhubhpX" and edited to suit your purposes.rfrg}rh(hLX" and edited to suit your purposes.hMj8ubeubh)ri}rj(hLX(Internal details: This command creates a file named :file:`buildbot.tac` that contains all the state necessary to create the buildmaster. Twisted has a tool called ``twistd`` which can use this .tac file to create and launch a buildmaster instance. twistd takes care of logging and daemonization (running the program in the background). :file:`/usr/bin/buildbot` is a front end which runs `twistd` for you.)hMjhThWhYhh[}rk(h]]h^]h_]h`]hc]uheMhfhhg]rl(hpX5(Internal details: This command creates a file named rmrn}ro(hLX5(Internal details: This command creates a file named hMjiubh)rp}rq(hLUh[}rr(h`]h_]h]]h^]rsXfilertaUrolejthc]uhMjihg]ruhpX buildbot.tacrvrw}rx(hLX buildbot.tachMjpubahYhubhpX\ that contains all the state necessary to create the buildmaster. Twisted has a tool called ryrz}r{(hLX\ that contains all the state necessary to create the buildmaster. Twisted has a tool called hMjiubh)r|}r}(hLX ``twistd``h[}r~(h]]h^]h_]h`]hc]uhMjihg]rhpXtwistdrr}r(hLUhMj|ubahYhubhpX which can use this .tac file to create and launch a buildmaster instance. twistd takes care of logging and daemonization (running the program in the background). rr}r(hLX which can use this .tac file to create and launch a buildmaster instance. twistd takes care of logging and daemonization (running the program in the background). hMjiubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjihg]rhpX/usr/bin/buildbotrr}r(hLX/usr/bin/buildbothMjubahYhubhpX is a front end which runs rr}r(hLX is a front end which runs hMjiubj)r}r(hLX`twistd`h[}r(h]]h^]h_]h`]hc]uhMjihg]rhpXtwistdrr}r(hLUhMjubahYj ubhpX for you.)rr}r(hLX for you.)hMjiubeubhN)r}r(hLUhMjhThWhYhZh[}r(h]]h^]h_]h`]rUusing-a-database-serverrahc]rh auheMhfhhg]r(hi)r}r(hLXUsing A Database ServerrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXUsing A Database Serverrr}r(hLjhMjubaubh)r}r(hLXlIf you want to use a database server (e.g., MySQL or Postgres) as the database backend for your Buildbot, add the ``--db`` option to the ``create-master`` invocation to specify the :ref:`connection string ` for the database, and make sure that the same URL appears in the ``db_url`` of the :bb:cfg:`db` parameter in your configuration file.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXrIf you want to use a database server (e.g., MySQL or Postgres) as the database backend for your Buildbot, add the rr}r(hLXrIf you want to use a database server (e.g., MySQL or Postgres) as the database backend for your Buildbot, add the hMjubh)r}r(hLX``--db``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX--dbrr}r(hLUhMjubahYhubhpX option to the rr}r(hLX option to the hMjubh)r}r(hLX``create-master``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX create-masterrr}r(hLUhMjubahYhubhpX invocation to specify the rr}r(hLX invocation to specify the hMjubj)r}r(hLX1:ref:`connection string `rhMjhThWhYjh[}r(UreftypeXrefjjXdatabase-specificationU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(j jXstd-refreh_]h`]hc]uhMjhg]rhpXconnection stringrr}r(hLUhMjubahYhubaubhpXB for the database, and make sure that the same URL appears in the rr}r(hLXB for the database, and make sure that the same URL appears in the hMjubh)r}r(hLX ``db_url``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXdb_urlrr}r(hLUhMjubahYhubhpX of the rr}r(hLX of the hMjubj)r}r(hLX :bb:cfg:`db`rhMjhThWhYjh[}r(UreftypeXcfgjjXdbU refdomainXbbrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(j jXbb-cfgreh_]h`]hc]uhMjhg]rhpXdbrr}r(hLUhMjubahYhubaubhpX& parameter in your configuration file.rr}r(hLX& parameter in your configuration file.hMjubeubhN)r}r(hLUhMjhThWhYhZh[}r(h]]h^]h_]h`]rUadditional-requirementsrahc]rhauheMhfhhg]r(hi)r}r(hLXAdditional RequirementsrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXAdditional Requirementsrr}r(hLjhMjubaubh)r}r(hLXDepending on the selected database, further Python packages will be required. Consult the SQLAlchemy dialect list for a full description. The most common choice for MySQL isrhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXDepending on the selected database, further Python packages will be required. Consult the SQLAlchemy dialect list for a full description. The most common choice for MySQL isrr }r (hLjhMjubaubh)r }r (hLX2MySQL-python: http://mysql-python.sourceforge.net/r hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM hfhhg]r(hpXMySQL-python: rr}r(hLXMySQL-python: hMj ubh)r}r(hLX$http://mysql-python.sourceforge.net/rh[}r(Urefurijh`]h_]h]]h^]hc]uhMj hg]rhpX$http://mysql-python.sourceforge.net/rr}r(hLUhMjubahYhubeubj)r}r(hLUhMjhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r (hLX{To communicate with MySQL, SQLAlchemy requires MySQL-python. Any reasonably recent version of MySQL-python should suffice.r!hMjhThWhYhh[}r"(h]]h^]h_]h`]hc]uheM"hg]r#hpX{To communicate with MySQL, SQLAlchemy requires MySQL-python. Any reasonably recent version of MySQL-python should suffice.r$r%}r&(hLj!hMjubaubaubh)r'}r((hLX&The most common choice for Postgres isr)hMjhThWhYhh[}r*(h]]h^]h_]h`]hc]uheM%hfhhg]r+hpX&The most common choice for Postgres isr,r-}r.(hLj)hMj'ubaubh)r/}r0(hLX"Psycopg: http://initd.org/psycopg/r1hMjhThWhYhh[}r2(h]]h^]h_]h`]hc]uheM'hfhhg]r3(hpX Psycopg: r4r5}r6(hLX Psycopg: hMj/ubh)r7}r8(hLXhttp://initd.org/psycopg/r9h[}r:(Urefurij9h`]h_]h]]h^]hc]uhMj/hg]r;hpXhttp://initd.org/psycopg/r<r=}r>(hLUhMj7ubahYhubeubj)r?}r@(hLUhMjhThWhYjh[}rA(h]]h^]h_]h`]hc]uheNhfhhg]rBh)rC}rD(hLXdSQLAlchemy uses Psycopg to communicate with Postgres. Any reasonably recent version should suffice.rEhMj?hThWhYhh[}rF(h]]h^]h_]h`]hc]uheM)hg]rGhpXdSQLAlchemy uses Psycopg to communicate with Postgres. Any reasonably recent version should suffice.rHrI}rJ(hLjEhMjCubaubaubeubeubhN)rK}rL(hLUhMjhThWhYhZh[}rM(h]]h^]h_]h`]rNUbuildmaster-optionsrOahc]rPh!auheM-hfhhg]rQ(hi)rR}rS(hLXBuildmaster OptionsrThMjKhThWhYhmh[}rU(h]]h^]h_]h`]hc]uheM-hfhhg]rVhpXBuildmaster OptionsrWrX}rY(hLjThMjRubaubh)rZ}r[(hLXThis section lists options to the ``create-master`` command. You can also type ``buildbot create-master --help`` for an up-to-the-moment summary.hMjKhThWhYhh[}r\(h]]h^]h_]h`]hc]uheM/hfhhg]r](hpX"This section lists options to the r^r_}r`(hLX"This section lists options to the hMjZubh)ra}rb(hLX``create-master``h[}rc(h]]h^]h_]h`]hc]uhMjZhg]rdhpX create-masterrerf}rg(hLUhMjaubahYhubhpX command. You can also type rhri}rj(hLX command. You can also type hMjZubh)rk}rl(hLX!``buildbot create-master --help``h[}rm(h]]h^]h_]h`]hc]uhMjZhg]rnhpXbuildbot create-master --helprorp}rq(hLUhMjkubahYhubhpX! for an up-to-the-moment summary.rrrs}rt(hLX! for an up-to-the-moment summary.hMjZubeubh)ru}rv(hLX ``--force``rwhMjKhThWhYhh[}rx(h]]h^]h_]h`]hc]uheM2hfhhg]ryh)rz}r{(hLjwh[}r|(h]]h^]h_]h`]hc]uhMjuhg]r}hpX--forcer~r}r(hLUhMjzubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXSWith this option, @command{create-master} will re-use an existing master directory.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM4hg]rhpXSWith this option, @command{create-master} will re-use an existing master directory.rr}r(hLjhMjubaubaubh)r}r(hLX``--no-logrotate``rhMjKhThWhYhh[}r(h]]h^]h_]h`]hc]uheM7hfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX--no-logrotaterr}r(hLUhMjubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXThis disables internal buildslave log management mechanism. With this option buildslave does not override the default logfile name and its behaviour giving a possibility to control those with command-line options of twistd daemon.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM9hg]rhpXThis disables internal buildslave log management mechanism. With this option buildslave does not override the default logfile name and its behaviour giving a possibility to control those with command-line options of twistd daemon.rr}r(hLjhMjubaubaubh)r}r(hLX``--relocatable``rhMjKhThWhYhh[}r(h]]h^]h_]h`]hc]uheM=hfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX --relocatablerr}r(hLUhMjubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXThis creates a "relocatable" buildbot.tac, which uses relative paths instead of absolute paths, so that the buildmaster directory can be moved about.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM?hg]rhpXThis creates a "relocatable" buildbot.tac, which uses relative paths instead of absolute paths, so that the buildmaster directory can be moved about.rr}r(hLjhMjubaubaubh)r}r(hLX ``--config``rhMjKhThWhYhh[}r(h]]h^]h_]h`]hc]uheMBhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX--configrr}r(hLUhMjubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXqThe name of the configuration file to use. This configuration file need not reside in the buildmaster directory.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMDhg]rhpXqThe name of the configuration file to use. This configuration file need not reside in the buildmaster directory.rr}r(hLjhMjubaubaubh)r}r(hLX``--log-size``rhMjKhThWhYhh[}r(h]]h^]h_]h`]hc]uheMGhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX --log-sizerr}r(hLUhMjubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXVThis is the size in bytes when to rotate the Twisted log files. The default is 10MiB.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMIhg]rhpXVThis is the size in bytes when to rotate the Twisted log files. The default is 10MiB.rr}r(hLjhMjubaubaubh)r}r(hLX``--log-count``rhMjKhThWhYhh[}r(h]]h^]h_]h`]hc]uheMLhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX --log-countrr}r(hLUhMjubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXThis is the number of log rotations to keep around. You can either specify a number or ``None`` to keep all @file{twistd.log} files around. The default is 10.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMNhg]r(hpXWThis is the number of log rotations to keep around. You can either specify a number or rr}r(hLXWThis is the number of log rotations to keep around. You can either specify a number or hMjubh)r}r(hLX``None``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXNonerr }r (hLUhMjubahYhubhpX@ to keep all @file{twistd.log} files around. The default is 10.r r }r (hLX@ to keep all @file{twistd.log} files around. The default is 10.hMjubeubaubh)r}r(hLX``--db``rhMjKhThWhYhh[}r(h]]h^]h_]h`]hc]uheMRhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX--dbrr}r(hLUhMjubahYhubaubj)r}r(hLUhMjKhThWhYjh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rh)r}r(hLXpThe database that the Buildmaster should use. Note that the same value must be added to the configuration file.r hMjhThWhYhh[}r!(h]]h^]h_]h`]hc]uheMThg]r"hpXpThe database that the Buildmaster should use. Note that the same value must be added to the configuration file.r#r$}r%(hLj hMjubaubaubht)r&}r'(hLX&.. _Upgrading-an-Existing-Buildmaster:hMjKhThWhYhwh[}r((h`]h_]h]]h^]hc]hyU!upgrading-an-existing-buildmasterr)uheMWhfhhg]ubeubeubhN)r*}r+(hLUhMhRhThWh}}r,h j&shYhZh[}r-(h]]h^]h_]h`]r.(j)Uid8r/ehc]r0(hh euheMZhfhh}r1j)j&shg]r2(hi)r3}r4(hLX!Upgrading an Existing Buildmasterr5hMj*hThWhYhmh[}r6(h]]h^]h_]h`]hc]uheMZhfhhg]r7hpX!Upgrading an Existing Buildmasterr8r9}r:(hLj5hMj3ubaubh)r;}r<(hLX>If you have just installed a new version of the Buildbot code, and you have buildmasters that were created using an older version, you'll need to upgrade these buildmasters before you can use them. The upgrade process adds and modifies files in the buildmaster's base directory to make it compatible with the new code.r=hMj*hThWhYhh[}r>(h]]h^]h_]h`]hc]uheM\hfhhg]r?hpX>If you have just installed a new version of the Buildbot code, and you have buildmasters that were created using an older version, you'll need to upgrade these buildmasters before you can use them. The upgrade process adds and modifies files in the buildmaster's base directory to make it compatible with the new code.r@rA}rB(hLj=hMj;ubaubj)rC}rD(hLXbuildbot upgrade-master basedirhMj*hThWhYjh[}rE(jjXbashjjh`]h_]h]]h^]hc]uheMbhfhhg]rFhpXbuildbot upgrade-master basedirrGrH}rI(hLUhMjCubaubh)rJ}rK(hLXThis command will also scan your :file:`master.cfg` file for incompatibilities (by loading it and printing any errors or deprecation warnings that occur). Each buildbot release tries to be compatible with configurations that worked cleanly (i.e. without deprecation warnings) on the previous release: any functions or classes that are to be removed will first be deprecated in a release, to give you a chance to start using the replacement.hMj*hThWhYhh[}rL(h]]h^]h_]h`]hc]uheMfhfhhg]rM(hpX!This command will also scan your rNrO}rP(hLX!This command will also scan your hMjJubh)rQ}rR(hLUh[}rS(h`]h_]h]]h^]rTXfilerUaUrolejUhc]uhMjJhg]rVhpX master.cfgrWrX}rY(hLX master.cfghMjQubahYhubhpX file for incompatibilities (by loading it and printing any errors or deprecation warnings that occur). Each buildbot release tries to be compatible with configurations that worked cleanly (i.e. without deprecation warnings) on the previous release: any functions or classes that are to be removed will first be deprecated in a release, to give you a chance to start using the replacement.rZr[}r\(hLX file for incompatibilities (by loading it and printing any errors or deprecation warnings that occur). Each buildbot release tries to be compatible with configurations that worked cleanly (i.e. without deprecation warnings) on the previous release: any functions or classes that are to be removed will first be deprecated in a release, to give you a chance to start using the replacement.hMjJubeubh)r]}r^(hLXThe ``upgrade-master`` command is idempotent. It is safe to run it multiple times. After each upgrade of the buildbot code, you should use ``upgrade-master`` on all your buildmasters.hMj*hThWhYhh[}r_(h]]h^]h_]h`]hc]uheMnhfhhg]r`(hpXThe rarb}rc(hLXThe hMj]ubh)rd}re(hLX``upgrade-master``h[}rf(h]]h^]h_]h`]hc]uhMj]hg]rghpXupgrade-masterrhri}rj(hLUhMjdubahYhubhpXu command is idempotent. It is safe to run it multiple times. After each upgrade of the buildbot code, you should use rkrl}rm(hLXu command is idempotent. It is safe to run it multiple times. After each upgrade of the buildbot code, you should use hMj]ubh)rn}ro(hLX``upgrade-master``h[}rp(h]]h^]h_]h`]hc]uhMj]hg]rqhpXupgrade-masterrrrs}rt(hLUhMjnubahYhubhpX on all your buildmasters.rurv}rw(hLX on all your buildmasters.hMj]ubeubh)rx}ry(hLXIn general, Buildbot slaves and masters can be upgraded independently, although some new features will not be available, depending on the master and slave versions.rzhMj*hThWhYhh[}r{(h]]h^]h_]h`]hc]uheMrhfhhg]r|hpXIn general, Buildbot slaves and masters can be upgraded independently, although some new features will not be available, depending on the master and slave versions.r}r~}r(hLjzhMjxubaubh)r}r(hLXwBeyond this general information, read all of the sections below that apply to versions through which you are upgrading.rhMj*hThWhYhh[}r(h]]h^]h_]h`]hc]uheMvhfhhg]rhpXwBeyond this general information, read all of the sections below that apply to versions through which you are upgrading.rr}r(hLjhMjubaubht)r}r(hLX'.. _Buildmaster-Version-specific-Notes:hMj*hThWhYhwh[}r(h`]h_]h]]h^]hc]hyU"buildmaster-version-specific-notesruheMyhfhhg]ubhN)r}r(hLUhQKhMj*hThWh}}rh5jshYhZh[}r(h]]rXversion-specific notesrah^]h_]h`]r(Uversion-specific-notesrjehc]rh5auheM|hfhh}rjjshg]r(hi)r}r(hLXVersion-specific NotesrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheM|hfhhg]rhpXVersion-specific Notesrr}r(hLjhMjubaubhN)r}r(hLUhMjhThWhYhZh[}r(h]]h^]h_]h`]rU)upgrading-a-buildmaster-to-buildbot-0-7-6rahc]rhauheMhfhhg]r(hi)r}r(hLX)Upgrading a Buildmaster to Buildbot-0.7.6rhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX)Upgrading a Buildmaster to Buildbot-0.7.6rr}r(hLjhMjubaubh)r}r(hLXThe 0.7.6 release introduced the :file:`public_html/` directory, which contains :file:`index.html` and other files served by the ``WebStatus`` and ``Waterfall`` status displays. The ``upgrade-master`` command will create these files if they do not already exist. It will not modify existing copies, but it will write a new copy in e.g. :file:`index.html.new` if the new version differs from the version that already exists.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX!The 0.7.6 release introduced the rr}r(hLX!The 0.7.6 release introduced the hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX public_html/rr}r(hLX public_html/hMjubahYhubhpX directory, which contains rr}r(hLX directory, which contains hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX index.htmlrr}r(hLX index.htmlhMjubahYhubhpX and other files served by the rr}r(hLX and other files served by the hMjubh)r}r(hLX ``WebStatus``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX WebStatusrr}r(hLUhMjubahYhubhpX and rr}r(hLX and hMjubh)r}r(hLX ``Waterfall``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX Waterfallrr}r(hLUhMjubahYhubhpX status displays. The rr}r(hLX status displays. The hMjubh)r}r(hLX``upgrade-master``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXupgrade-masterrr}r(hLUhMjubahYhubhpX command will create these files if they do not already exist. It will not modify existing copies, but it will write a new copy in e.g. rr}r(hLX command will create these files if they do not already exist. It will not modify existing copies, but it will write a new copy in e.g. hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpXindex.html.newrr}r(hLXindex.html.newhMjubahYhubhpXA if the new version differs from the version that already exists.rr}r(hLXA if the new version differs from the version that already exists.hMjubeubeubhN)r}r(hLUhMjhThWhYhZh[}r(h]]h^]h_]h`]rU)upgrading-a-buildmaster-to-buildbot-0-8-0rahc]rh(auheMhfhhg]r(hi)r}r(hLX)Upgrading a Buildmaster to Buildbot-0.8.0rhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX)Upgrading a Buildmaster to Buildbot-0.8.0rr}r(hLjhMjubaubh)r}r(hLX5Buildbot-0.8.0 introduces a database backend, which is SQLite by default. The ``upgrade-master`` command will automatically create and populate this database with the changes the buildmaster has seen. Note that, as of this release, build history is *not* contained in the database, and is thus not migrated.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r (hpXOBuildbot-0.8.0 introduces a database backend, which is SQLite by default. The r r }r (hLXOBuildbot-0.8.0 introduces a database backend, which is SQLite by default. The hMjubh)r }r(hLX``upgrade-master``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXupgrade-masterrr}r(hLUhMj ubahYhubhpX command will automatically create and populate this database with the changes the buildmaster has seen. Note that, as of this release, build history is rr}r(hLX command will automatically create and populate this database with the changes the buildmaster has seen. Note that, as of this release, build history is hMjubh)r}r(hLX*not*h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXnotrr}r(hLUhMjubahYhubhpX5 contained in the database, and is thus not migrated.rr}r (hLX5 contained in the database, and is thus not migrated.hMjubeubh)r!}r"(hLX#The upgrade process renames the Changes pickle (``$basedir/changes.pck``) to ``changes.pck.old`` once the upgrade is complete. To reverse the upgrade, simply downgrade Buildbot and move this file back to its original name. You may also wish to delete the state database (``state.sqlite``).hMjhThWhYhh[}r#(h]]h^]h_]h`]hc]uheMhfhhg]r$(hpX0The upgrade process renames the Changes pickle (r%r&}r'(hLX0The upgrade process renames the Changes pickle (hMj!ubh)r(}r)(hLX``$basedir/changes.pck``h[}r*(h]]h^]h_]h`]hc]uhMj!hg]r+hpX$basedir/changes.pckr,r-}r.(hLUhMj(ubahYhubhpX) to r/r0}r1(hLX) to hMj!ubh)r2}r3(hLX``changes.pck.old``h[}r4(h]]h^]h_]h`]hc]uhMj!hg]r5hpXchanges.pck.oldr6r7}r8(hLUhMj2ubahYhubhpX once the upgrade is complete. To reverse the upgrade, simply downgrade Buildbot and move this file back to its original name. You may also wish to delete the state database (r9r:}r;(hLX once the upgrade is complete. To reverse the upgrade, simply downgrade Buildbot and move this file back to its original name. You may also wish to delete the state database (hMj!ubh)r<}r=(hLX``state.sqlite``h[}r>(h]]h^]h_]h`]hc]uhMj!hg]r?hpX state.sqliter@rA}rB(hLUhMj<ubahYhubhpX).rCrD}rE(hLX).hMj!ubeubeubhN)rF}rG(hLUhMjhThWhYhZh[}rH(h]]h^]h_]h`]rIU$upgrading-into-a-non-sqlite-databaserJahc]rKh$auheMhfhhg]rL(hi)rM}rN(hLX$Upgrading into a non-SQLite databaserOhMjFhThWhYhmh[}rP(h]]h^]h_]h`]hc]uheMhfhhg]rQhpX$Upgrading into a non-SQLite databaserRrS}rT(hLjOhMjMubaubh)rU}rV(hLXIf you are not using sqlite, you will need to add an entry into your :file:`master.cfg` to reflect the database version you are using. The upgrade process does *not* edit your :file:`master.cfg` for you. So something like:hMjFhThWhYhh[}rW(h]]h^]h_]h`]hc]uheMhfhhg]rX(hpXEIf you are not using sqlite, you will need to add an entry into your rYrZ}r[(hLXEIf you are not using sqlite, you will need to add an entry into your hMjUubh)r\}r](hLUh[}r^(h`]h_]h]]h^]r_Xfiler`aUrolej`hc]uhMjUhg]rahpX master.cfgrbrc}rd(hLX master.cfghMj\ubahYhubhpXI to reflect the database version you are using. The upgrade process does rerf}rg(hLXI to reflect the database version you are using. The upgrade process does hMjUubh)rh}ri(hLX*not*h[}rj(h]]h^]h_]h`]hc]uhMjUhg]rkhpXnotrlrm}rn(hLUhMjhubahYhubhpX edit your rorp}rq(hLX edit your hMjUubh)rr}rs(hLUh[}rt(h`]h_]h]]h^]ruXfilervaUrolejvhc]uhMjUhg]rwhpX master.cfgrxry}rz(hLX master.cfghMjrubahYhubhpX for you. So something like:r{r|}r}(hLX for you. So something like:hMjUubeubj)r~}r(hLXO# for using mysql: c['db_url'] = 'mysql://bbuser:@localhost/buildbot'hMjFhThWhYjh[}r(jjXpythonjjh`]h_]h]]h^]hc]uheMhfhhg]rhpXO# for using mysql: c['db_url'] = 'mysql://bbuser:@localhost/buildbot'rr}r(hLUhMj~ubaubh)r}r(hLXxOnce the parameter has been added, invoke ``upgrade-master``. This will extract the DB url from your configuration file.hMjFhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX*Once the parameter has been added, invoke rr}r(hLX*Once the parameter has been added, invoke hMjubh)r}r(hLX``upgrade-master``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXupgrade-masterrr}r(hLUhMjubahYhubhpX<. This will extract the DB url from your configuration file.rr}r(hLX<. This will extract the DB url from your configuration file.hMjubeubj)r}r(hLXbuildbot upgrade-masterhMjFhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpXbuildbot upgrade-masterrr}r(hLUhMjubaubh)r}r(hLXISee :ref:`Database-Specification` for more options to specify a database.rhMjFhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXSee rr}r(hLXSee hMjubj)r}r(hLX:ref:`Database-Specification`rhMjhThWhYjh[}r(UreftypeXrefjjXdatabase-specificationU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(j jXstd-refreh_]h`]hc]uhMjhg]rhpXDatabase-Specificationrr}r(hLUhMjubahYhubaubhpX( for more options to specify a database.rr}r(hLX( for more options to specify a database.hMjubeubhN)r}r(hLUhMjFhThWhYhZh[}r(h]]h^]h_]h`]rUchange-encoding-issuesrahc]rh4auheMhfhhg]r(hi)r}r(hLXChange Encoding IssuesrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXChange Encoding Issuesrr}r(hLjhMjubaubh)r}r(hLXtThe upgrade process assumes that strings in your Changes pickle are encoded in UTF-8 (or plain ASCII). If this is not the case, and if there are non-UTF-8 characters in the pickle, the upgrade will fail with a suitable error message. If this occurs, you have two options. If the change history is not important to your purpose, you can simply delete :file:`changes.pck`.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX`The upgrade process assumes that strings in your Changes pickle are encoded in UTF-8 (or plain ASCII). If this is not the case, and if there are non-UTF-8 characters in the pickle, the upgrade will fail with a suitable error message. If this occurs, you have two options. If the change history is not important to your purpose, you can simply delete rr}r(hLX`The upgrade process assumes that strings in your Changes pickle are encoded in UTF-8 (or plain ASCII). If this is not the case, and if there are non-UTF-8 characters in the pickle, the upgrade will fail with a suitable error message. If this occurs, you have two options. If the change history is not important to your purpose, you can simply delete hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX changes.pckrr}r(hLX changes.pckhMjubahYhubhpX.r}r(hLX.hMjubeubh)r}r(hLXAIf you would like to keep the change history, then you will need to figure out which encoding is in use, and use :file:`contrib/fix_changes_pickle_encoding.py` (:ref:`Contrib-Scripts`) to rewrite the changes pickle into Unicode before upgrading the master. A typical invocation (with Mac-Roman encoding) might look like:hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXqIf you would like to keep the change history, then you will need to figure out which encoding is in use, and use rr}r(hLXqIf you would like to keep the change history, then you will need to figure out which encoding is in use, and use hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX&contrib/fix_changes_pickle_encoding.pyrr}r(hLX&contrib/fix_changes_pickle_encoding.pyhMjubahYhubhpX (rr}r(hLX (hMjubj)r}r(hLX:ref:`Contrib-Scripts`rhMjhThWhYjh[}r(UreftypeXrefjjXcontrib-scriptsU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(j jXstd-refreh_]h`]hc]uhMjhg]rhpXContrib-Scriptsrr}r(hLUhMjubahYhubaubhpX) to rewrite the changes pickle into Unicode before upgrading the master. A typical invocation (with Mac-Roman encoding) might look like:rr}r(hLX) to rewrite the changes pickle into Unicode before upgrading the master. A typical invocation (with Mac-Roman encoding) might look like:hMjubeubj)r}r(hLX$ python $buildbot/contrib/fix_changes_pickle_encoding.py changes.pck macroman decoding bytestrings in changes.pck using macroman converted 11392 strings backing up changes.pck to changes.pck.oldhMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]r hpX$ python $buildbot/contrib/fix_changes_pickle_encoding.py changes.pck macroman decoding bytestrings in changes.pck using macroman converted 11392 strings backing up changes.pck to changes.pck.oldr r }r (hLUhMjubaubh)r }r (hLXIf your Changes pickle uses multiple encodings, you're on your own, but the script in contrib may provide a good starting point for the fix.r hMjhThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpXIf your Changes pickle uses multiple encodings, you're on your own, but the script in contrib may provide a good starting point for the fix.r r }r (hLj hMj ubaubht)r }r (hLX-.. _Upgrading-a-Buildmaster-to-Later-Version:hMjhThWhYhwh[}r (h`]h_]h]]h^]hc]hyU(upgrading-a-buildmaster-to-later-versionr uheMhfhhg]ubeubeubhN)r }r (hLUhMjhThWh}}r h#j shYhZh[}r (h]]h^]h_]h`]r (U)upgrading-a-buildmaster-to-later-versionsr j ehc]r (hh#euheMhfhh}r j j shg]r (hi)r }r (hLX)Upgrading a Buildmaster to Later Versionsr hMj hThWhYhmh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpX)Upgrading a Buildmaster to Later Versionsr r }r (hLj hMj ubaubh)r! }r" (hLX]Up to Buildbot version |version|, no further steps beyond those described above are required.hMj hThWhYhh[}r# (h]]h^]h_]h`]hc]uheMhfhhg]r$ (hpXUp to Buildbot version r% r& }r' (hLXUp to Buildbot version hMj! ubhpX0.8.9r( r) }r* (hLU0.8.9r+ hTNheNhfhhMj! ubhpX=, no further steps beyond those described above are required.r, r- }r. (hLX=, no further steps beyond those described above are required.hMj! ubeubht)r/ }r0 (hLX.. _Creating-a-buildslave:hMj hThWhYhwh[}r1 (h`]h_]h]]h^]hc]hyUcreating-a-buildslaver2 uheMhfhhg]ubeubeubeubhN)r3 }r4 (hLUhMhRhThWh}}r5 hj/ shYhZh[}r6 (h]]h^]h_]h`]r7 (j2 Uid9r8 ehc]r9 (h+heuheMhfhh}r: j2 j/ shg]r; (hi)r< }r= (hLXCreating a buildslaver> hMj3 hThWhYhmh[}r? (h]]h^]h_]h`]hc]uheMhfhhg]r@ hpXCreating a buildslaverA rB }rC (hLj> hMj< ubaubh)rD }rE (hLXWTypically, you will be adding a buildslave to an existing buildmaster, to provide additional architecture coverage. The buildbot administrator will give you several pieces of information necessary to connect to the buildmaster. You should also be somewhat familiar with the project being tested, so you can troubleshoot build problems locally.rF hMj3 hThWhYhh[}rG (h]]h^]h_]h`]hc]uheMhfhhg]rH hpXWTypically, you will be adding a buildslave to an existing buildmaster, to provide additional architecture coverage. The buildbot administrator will give you several pieces of information necessary to connect to the buildmaster. You should also be somewhat familiar with the project being tested, so you can troubleshoot build problems locally.rI rJ }rK (hLjF hMjD ubaubh)rL }rM (hLXThe buildbot exists to make sure that the project's stated ``how to build it`` process actually works. To this end, the buildslave should run in an environment just like that of your regular developers. Typically the project build process is documented somewhere (:file:`README`, :file:`INSTALL`, etc), in a document that should mention all library dependencies and contain a basic set of build instructions. This document will be useful as you configure the host and account in which the buildslave runs.hMj3 hThWhYhh[}rN (h]]h^]h_]h`]hc]uheMhfhhg]rO (hpX;The buildbot exists to make sure that the project's stated rP rQ }rR (hLX;The buildbot exists to make sure that the project's stated hMjL ubh)rS }rT (hLX``how to build it``h[}rU (h]]h^]h_]h`]hc]uhMjL hg]rV hpXhow to build itrW rX }rY (hLUhMjS ubahYhubhpX process actually works. To this end, the buildslave should run in an environment just like that of your regular developers. Typically the project build process is documented somewhere (rZ r[ }r\ (hLX process actually works. To this end, the buildslave should run in an environment just like that of your regular developers. Typically the project build process is documented somewhere (hMjL ubh)r] }r^ (hLUh[}r_ (h`]h_]h]]h^]r` Xfilera aUroleja hc]uhMjL hg]rb hpXREADMErc rd }re (hLXREADMEhMj] ubahYhubhpX, rf rg }rh (hLX, hMjL ubh)ri }rj (hLUh[}rk (h`]h_]h]]h^]rl Xfilerm aUrolejm hc]uhMjL hg]rn hpXINSTALLro rp }rq (hLXINSTALLhMji ubahYhubhpX, etc), in a document that should mention all library dependencies and contain a basic set of build instructions. This document will be useful as you configure the host and account in which the buildslave runs.rr rs }rt (hLX, etc), in a document that should mention all library dependencies and contain a basic set of build instructions. This document will be useful as you configure the host and account in which the buildslave runs.hMjL ubeubh)ru }rv (hLX4Here's a good checklist for setting up a buildslave:rw hMj3 hThWhYhh[}rx (h]]h^]h_]h`]hc]uheMhfhhg]ry hpX4Here's a good checklist for setting up a buildslave:rz r{ }r| (hLjw hMju ubaubcdocutils.nodes enumerated_list r} )r~ }r (hLUhMj3 hThWhYUenumerated_listr h[}r (Usuffixr U.h`]h_]h]]Uprefixr Uh^]hc]Uenumtyper Uarabicr uheMhfhhg]r cdocutils.nodes list_item r )r }r (hLXSet up the account hMj~ hThWhYU list_itemr h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXSet up the accountr hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXSet up the accountr r }r (hLj hMj ubaubaubaubj)r }r (hLUhMj3 hThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXIt is recommended (although not mandatory) to set up a separate user account for the buildslave. This account is frequently named ``buildbot`` or ``buildslave``. This serves to isolate your personal working environment from that of the slave's, and helps to minimize the security threat posed by letting possibly-unknown contributors run arbitrary code on your system. The account should have a minimum of fancy init scripts.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r (hpXIt is recommended (although not mandatory) to set up a separate user account for the buildslave. This account is frequently named r r }r (hLXIt is recommended (although not mandatory) to set up a separate user account for the buildslave. This account is frequently named hMj ubh)r }r (hLX ``buildbot``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXbuildbotr r }r (hLUhMj ubahYhubhpX or r r }r (hLX or hMj ubh)r }r (hLX``buildslave``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX buildslaver r }r (hLUhMj ubahYhubhpX . This serves to isolate your personal working environment from that of the slave's, and helps to minimize the security threat posed by letting possibly-unknown contributors run arbitrary code on your system. The account should have a minimum of fancy init scripts.r r }r (hLX . This serves to isolate your personal working environment from that of the slave's, and helps to minimize the security threat posed by letting possibly-unknown contributors run arbitrary code on your system. The account should have a minimum of fancy init scripts.hMj ubeubaubj} )r }r (hLUhMj3 hThWhYj h[}r (j U.Ustartr Kh`]h_]h]]j Uh^]hc]j j uheMhfhhg]r j )r }r (hLXInstall the buildbot code hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXInstall the buildbot coder hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXInstall the buildbot coder r }r (hLj hMj ubaubaubaubj)r }r (hLUhMj3 hThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXFollow the instructions given earlier (:ref:`Installing-the-code`). If you use a separate buildslave account, and you didn't install the buildbot code to a shared location, then you will need to install it with ``--home=~`` for each account that needs it.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r (hpX'Follow the instructions given earlier (r r }r (hLX'Follow the instructions given earlier (hMj ubj)r }r (hLX:ref:`Installing-the-code`r hMj hThWhYjh[}r (UreftypeXrefjjXinstalling-the-codeU refdomainXstdr h`]h_]U refexplicith]]h^]hc]jjuheMhg]r h)r }r (hLj h[}r (h]]h^]r (j j Xstd-refr eh_]h`]hc]uhMj hg]r hpXInstalling-the-coder r }r (hLUhMj ubahYhubaubhpX). If you use a separate buildslave account, and you didn't install the buildbot code to a shared location, then you will need to install it with r r }r (hLX). If you use a separate buildslave account, and you didn't install the buildbot code to a shared location, then you will need to install it with hMj ubh)r }r (hLX ``--home=~``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX--home=~r r }r (hLUhMj ubahYhubhpX for each account that needs it.r r }r (hLX for each account that needs it.hMj ubeubaubj} )r }r (hLUhMj3 hThWhYj h[}r (j U.j Kh`]h_]h]]j Uh^]hc]j j uheMhfhhg]r j )r }r (hLXSet up the host hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXSet up the hostr hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXSet up the hostr r }r (hLj hMj ubaubaubaubj)r }r (hLUhMj3 hThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r (h)r }r (hLXMake sure the host can actually reach the buildmaster. Usually the buildmaster is running a status webserver on the same machine, so simply point your web browser at it and see if you can get there. Install whatever additional packages or libraries the project's INSTALL document advises. (or not: if your buildslave is supposed to make sure that building without optional libraries still works, then don't install those libraries).r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXMake sure the host can actually reach the buildmaster. Usually the buildmaster is running a status webserver on the same machine, so simply point your web browser at it and see if you can get there. Install whatever additional packages or libraries the project's INSTALL document advises. (or not: if your buildslave is supposed to make sure that building without optional libraries still works, then don't install those libraries).r r }r (hLj hMj ubaubh)r }r (hLX(Again, these libraries don't necessarily have to be installed to a site-wide shared location, but they must be available to your build process. Accomplishing this is usually very specific to the build process, so installing them to :file:`/usr` or :file:`/usr/local` is usually the best approach.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r (hpXAgain, these libraries don't necessarily have to be installed to a site-wide shared location, but they must be available to your build process. Accomplishing this is usually very specific to the build process, so installing them to r r }r (hLXAgain, these libraries don't necessarily have to be installed to a site-wide shared location, but they must be available to your build process. Accomplishing this is usually very specific to the build process, so installing them to hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpX/usrr r }r (hLX/usrhMj ubahYhubhpX or r r }r (hLX or hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpX /usr/localr! r" }r# (hLX /usr/localhMj ubahYhubhpX is usually the best approach.r$ r% }r& (hLX is usually the best approach.hMj ubeubeubj} )r' }r( (hLUhMj3 hThWhYj h[}r) (j U.j Kh`]h_]h]]j Uh^]hc]j j uheMhfhhg]r* j )r+ }r, (hLXTest the build process hMj' hThWhYj h[}r- (h]]h^]h_]h`]hc]uheNhfhhg]r. h)r/ }r0 (hLXTest the build processr1 hMj+ hThWhYhh[}r2 (h]]h^]h_]h`]hc]uheMhg]r3 hpXTest the build processr4 r5 }r6 (hLj1 hMj/ ubaubaubaubj)r7 }r8 (hLUhMj3 hThWhYjh[}r9 (h]]h^]h_]h`]hc]uheNhfhhg]r: h)r; }r< (hLXZFollow the instructions in the :file:`INSTALL` document, in the buildslave's account. Perform a full CVS (or whatever) checkout, configure, make, run tests, etc. Confirm that the build works without manual fussing. If it doesn't work when you do it by hand, it will be unlikely to work when the buildbot attempts to do it in an automated fashion.hMj7 hThWhYhh[}r= (h]]h^]h_]h`]hc]uheMhg]r> (hpXFollow the instructions in the r? r@ }rA (hLXFollow the instructions in the hMj; ubh)rB }rC (hLUh[}rD (h`]h_]h]]h^]rE XfilerF aUrolejF hc]uhMj; hg]rG hpXINSTALLrH rI }rJ (hLXINSTALLhMjB ubahYhubhpX, document, in the buildslave's account. Perform a full CVS (or whatever) checkout, configure, make, run tests, etc. Confirm that the build works without manual fussing. If it doesn't work when you do it by hand, it will be unlikely to work when the buildbot attempts to do it in an automated fashion.rK rL }rM (hLX, document, in the buildslave's account. Perform a full CVS (or whatever) checkout, configure, make, run tests, etc. Confirm that the build works without manual fussing. If it doesn't work when you do it by hand, it will be unlikely to work when the buildbot attempts to do it in an automated fashion.hMj; ubeubaubj} )rN }rO (hLUhMj3 hThWhYj h[}rP (j U.j Kh`]h_]h]]j Uh^]hc]j j uheMhfhhg]rQ j )rR }rS (hLXChoose a base directory hMjN hThWhYj h[}rT (h]]h^]h_]h`]hc]uheNhfhhg]rU h)rV }rW (hLXChoose a base directoryrX hMjR hThWhYhh[}rY (h]]h^]h_]h`]hc]uheMhg]rZ hpXChoose a base directoryr[ r\ }r] (hLjX hMjV ubaubaubaubj)r^ }r_ (hLUhMj3 hThWhYjh[}r` (h]]h^]h_]h`]hc]uheNhfhhg]ra h)rb }rc (hLXThis should be somewhere in the buildslave's account, typically named after the project which is being tested. The buildslave will not touch any file outside of this directory. Something like :file:`~/Buildbot` or :file:`~/Buildslaves/fooproject` is appropriate.hMj^ hThWhYhh[}rd (h]]h^]h_]h`]hc]uheMhg]re (hpXThis should be somewhere in the buildslave's account, typically named after the project which is being tested. The buildslave will not touch any file outside of this directory. Something like rf rg }rh (hLXThis should be somewhere in the buildslave's account, typically named after the project which is being tested. The buildslave will not touch any file outside of this directory. Something like hMjb ubh)ri }rj (hLUh[}rk (h`]h_]h]]h^]rl Xfilerm aUrolejm hc]uhMjb hg]rn hpX ~/Buildbotro rp }rq (hLX ~/BuildbothMji ubahYhubhpX or rr rs }rt (hLX or hMjb ubh)ru }rv (hLUh[}rw (h`]h_]h]]h^]rx Xfilery aUrolejy hc]uhMjb hg]rz hpX~/Buildslaves/fooprojectr{ r| }r} (hLX~/Buildslaves/fooprojecthMju ubahYhubhpX is appropriate.r~ r }r (hLX is appropriate.hMjb ubeubaubj} )r }r (hLUhMj3 hThWhYj h[}r (j U.j Kh`]h_]h]]j Uh^]hc]j j uheMhfhhg]r j )r }r (hLX5Get the buildmaster host/port, botname, and password hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLX4Get the buildmaster host/port, botname, and passwordr hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpX4Get the buildmaster host/port, botname, and passwordr r }r (hLj hMj ubaubaubaubj)r }r (hLUhMj3 hTNhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r (h)r }r (hLXWhen the buildbot admin configures the buildmaster to accept and use your buildslave, they will provide you with the following pieces of information:r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXWhen the buildbot admin configures the buildmaster to accept and use your buildslave, they will provide you with the following pieces of information:r r }r (hLj hMj ubaubcdocutils.nodes bullet_list r )r }r (hLUh[}r (Ubulletr X*h`]h_]h]]h^]hc]uhMj hg]r (j )r }r (hLXyour buildslave's namer h[}r (h]]h^]h_]h`]hc]uhMj hg]r h)r }r (hLj hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXyour buildslave's namer r }r (hLj hMj ubaubahYj ubj )r }r (hLX(the password assigned to your buildslaver h[}r (h]]h^]h_]h`]hc]uhMj hg]r h)r }r (hLj hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpX(the password assigned to your buildslaver r }r (hLj hMj ubaubahYj ubj )r }r (hLXPthe hostname and port number of the buildmaster, i.e. buildbot.example.org:8007 h[}r (h]]h^]h_]h`]hc]uhMj hg]r h)r }r (hLXOthe hostname and port number of the buildmaster, i.e. buildbot.example.org:8007r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXOthe hostname and port number of the buildmaster, i.e. buildbot.example.org:8007r r }r (hLj hMj ubaubahYj ubehYU bullet_listr ubeubj} )r }r (hLUhMj3 hThWhYj h[}r (j U.j Kh`]h_]h]]j Uh^]hc]j j uheMhfhhg]r j )r }r (hLXCreate the buildslave hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXCreate the buildslaver hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXCreate the buildslaver r }r (hLj hMj ubaubaubaubj)r }r (hLUhMj3 hThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r (h)r }r (hLX,Now run the 'buildslave' command as follows:r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheM!hg]r hpX,Now run the 'buildslave' command as follows:r r }r (hLj hMj ubaubj)r }r (hLUh[}r (h]]h^]h_]h`]hc]uhMj hg]r h)r }r (hLXT:samp:`buildslave create-slave {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}`hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheM#hg]r h)r }r (hLUh[}r (h`]h_]h]]h^]r Xsampr aUrolej hc]uhMj hg]r (hpXbuildslave create-slave r r }r (hLXbuildslave create-slave hMj ubh)r }r (hLXBASEDIRh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXBASEDIRr r }r (hLUhMj ubahYhubhpX r }r (hLX hMj ubh)r }r (hLX MASTERHOSTh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX MASTERHOSTr r }r (hLUhMj ubahYhubhpX:r }r (hLX:hMj ubh)r }r (hLXPORTh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXPORTr r }r (hLUhMj ubahYhubhpX r }r (hLX hMj ubh)r }r (hLX SLAVENAMEh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX SLAVENAMEr r }r (hLUhMj ubahYhubhpX r }r (hLX hMj ubh)r }r (hLXPASSWORDh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXPASSWORDr r }r (hLUhMj ubahYhubehYhubaubahYjubh)r }r! (hLXThis will create the base directory and a collection of files inside, including the :file:`buildbot.tac` file that contains all the information you passed to the :command:`buildbot` command.hMj hThWhYhh[}r" (h]]h^]h_]h`]hc]uheM%hg]r# (hpXTThis will create the base directory and a collection of files inside, including the r$ r% }r& (hLXTThis will create the base directory and a collection of files inside, including the hMj ubh)r' }r( (hLUh[}r) (h`]h_]h]]h^]r* Xfiler+ aUrolej+ hc]uhMj hg]r, hpX buildbot.tacr- r. }r/ (hLX buildbot.tachMj' ubahYhubhpX: file that contains all the information you passed to the r0 r1 }r2 (hLX: file that contains all the information you passed to the hMj ubjd)r3 }r4 (hLX:command:`buildbot`h[}r5 (h]]h^]r6 jiah_]h`]hc]uhMj hg]r7 hpXbuildbotr8 r9 }r: (hLUhMj3 ubahYjnubhpX command.r; r< }r= (hLX command.hMj ubeubeubj} )r> }r? (hLUhMj3 hThWhYj h[}r@ (j U.j Kh`]h_]h]]j Uh^]hc]j j uheM)hfhhg]rA j )rB }rC (hLXFill in the hostinfo files hMj> hThWhYj h[}rD (h]]h^]h_]h`]hc]uheNhfhhg]rE h)rF }rG (hLXFill in the hostinfo filesrH hMjB hThWhYhh[}rI (h]]h^]h_]h`]hc]uheM)hg]rJ hpXFill in the hostinfo filesrK rL }rM (hLjH hMjF ubaubaubaubj)rN }rO (hLUhMj3 hThWhYjh[}rP (h]]h^]h_]h`]hc]uheNhfhhg]rQ (h)rR }rS (hLXWhen it first connects, the buildslave will send a few files up to the buildmaster which describe the host that it is running on. These files are presented on the web status display so that developers have more information to reproduce any test failures that are witnessed by the buildbot. There are sample files in the :file:`info` subdirectory of the buildbot's base directory. You should edit these to correctly describe you and your host.hMjN hThWhYhh[}rT (h]]h^]h_]h`]hc]uheM+hg]rU (hpX@When it first connects, the buildslave will send a few files up to the buildmaster which describe the host that it is running on. These files are presented on the web status display so that developers have more information to reproduce any test failures that are witnessed by the buildbot. There are sample files in the rV rW }rX (hLX@When it first connects, the buildslave will send a few files up to the buildmaster which describe the host that it is running on. These files are presented on the web status display so that developers have more information to reproduce any test failures that are witnessed by the buildbot. There are sample files in the hMjR ubh)rY }rZ (hLUh[}r[ (h`]h_]h]]h^]r\ Xfiler] aUrolej] hc]uhMjR hg]r^ hpXinfor_ r` }ra (hLXinfohMjY ubahYhubhpXn subdirectory of the buildbot's base directory. You should edit these to correctly describe you and your host.rb rc }rd (hLXn subdirectory of the buildbot's base directory. You should edit these to correctly describe you and your host.hMjR ubeubh)re }rf (hLX:file:`{BASEDIR}/info/admin` should contain your name and email address. This is the ``buildslave admin address``, and will be visible from the build status page (so you may wish to munge it a bit if address-harvesting spambots are a concern).hMjN hThWhYhh[}rg (h]]h^]h_]h`]hc]uheM3hg]rh (h)ri }rj (hLUh[}rk (h`]h_]h]]h^]rl Xfilerm aUrolejm hc]uhMje hg]rn (h)ro }rp (hLXBASEDIRh[}rq (h]]h^]h_]h`]hc]uhMji hg]rr hpXBASEDIRrs rt }ru (hLUhMjo ubahYhubhpX /info/adminrv rw }rx (hLX /info/adminhMji ubehYhubhpX9 should contain your name and email address. This is the ry rz }r{ (hLX9 should contain your name and email address. This is the hMje ubh)r| }r} (hLX``buildslave admin address``h[}r~ (h]]h^]h_]h`]hc]uhMje hg]r hpXbuildslave admin addressr r }r (hLUhMj| ubahYhubhpX, and will be visible from the build status page (so you may wish to munge it a bit if address-harvesting spambots are a concern).r r }r (hLX, and will be visible from the build status page (so you may wish to munge it a bit if address-harvesting spambots are a concern).hMje ubeubh)r }r (hLX:file:`{BASEDIR}/info/host` should be filled with a brief description of the host: OS, version, memory size, CPU speed, versions of relevant libraries installed, and finally the version of the buildbot code which is running the buildslave.hMjN hThWhYhh[}r (h]]h^]h_]h`]hc]uheM8hg]r (h)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r (h)r }r (hLXBASEDIRh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXBASEDIRr r }r (hLUhMj ubahYhubhpX /info/hostr r }r (hLX /info/hosthMj ubehYhubhpX should be filled with a brief description of the host: OS, version, memory size, CPU speed, versions of relevant libraries installed, and finally the version of the buildbot code which is running the buildslave.r r }r (hLX should be filled with a brief description of the host: OS, version, memory size, CPU speed, versions of relevant libraries installed, and finally the version of the buildbot code which is running the buildslave.hMj ubeubh)r }r (hLXThe optional :file:`{BASEDIR}/info/access_uri` can specify a URI which will connect a user to the machine. Many systems accept ``ssh://hostname`` URIs for this purpose.hMjN hThWhYhh[}r (h]]h^]h_]h`]hc]uheM=hg]r (hpX The optional r r }r (hLX The optional hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r (h)r }r (hLXBASEDIRh[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXBASEDIRr r }r (hLUhMj ubahYhubhpX/info/access_urir r }r (hLX/info/access_urihMj ubehYhubhpXR can specify a URI which will connect a user to the machine. Many systems accept r r }r (hLXR can specify a URI which will connect a user to the machine. Many systems accept hMj ubh)r }r (hLX``ssh://hostname``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXssh://hostnamer r }r (hLUhMj ubahYhubhpX URIs for this purpose.r r }r (hLX URIs for this purpose.hMj ubeubh)r }r (hLXIf you run many buildslaves, you may want to create a single :file:`~buildslave/info` file and share it among all the buildslaves with symlinks.hMjN hThWhYhh[}r (h]]h^]h_]h`]hc]uheMAhg]r (hpX=If you run many buildslaves, you may want to create a single r r }r (hLX=If you run many buildslaves, you may want to create a single hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpX~buildslave/infor r }r (hLX~buildslave/infohMj ubahYhubhpX; file and share it among all the buildslaves with symlinks.r r }r (hLX; file and share it among all the buildslaves with symlinks.hMj ubeubeubht)r }r (hLX.. _Buildslave-Options:hMj3 hThWhYhwh[}r (h`]h_]h]]h^]hc]hyUbuildslave-optionsr uheMEhfhhg]ubhN)r }r (hLUhMj3 hThWh}}r h6j shYhZh[}r (h]]h^]h_]h`]r (j Uid10r ehc]r (hh6euheMHhfhh}r j j shg]r (hi)r }r (hLXBuildslave Optionsr hMj hThWhYhmh[}r (h]]h^]h_]h`]hc]uheMHhfhhg]r hpXBuildslave Optionsr r }r (hLj hMj ubaubh)r }r (hLX4There are a handful of options you might want to use when creating the buildslave with the :samp:`buildslave create-slave DIR ` command. You can type ``buildslave create-slave --help`` for a summary. To use these, just include them on the ``buildslave create-slave`` command line, like thishMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMJhfhhg]r (hpX[There are a handful of options you might want to use when creating the buildslave with the r r }r (hLX[There are a handful of options you might want to use when creating the buildslave with the hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xsampr aUrolej hc]uhMj hg]r hpX.buildslave create-slave DIR r r }r (hLX.buildslave create-slave DIR hMj ubahYhubhpX command. You can type r r }r (hLX command. You can type hMj ubh)r }r (hLX"``buildslave create-slave --help``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXbuildslave create-slave --helpr r }r (hLUhMj ubahYhubhpX7 for a summary. To use these, just include them on the r r }r (hLX7 for a summary. To use these, just include them on the hMj ubh)r }r (hLX``buildslave create-slave``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXbuildslave create-slaver r }r (hLUhMj ubahYhubhpX command line, like thisr r }r (hLX command line, like thishMj ubeubj)r }r (hLXgbuildslave create-slave --umask=022 ~/buildslave buildmaster.example.org:42012 {myslavename} {mypasswd}hMj hThWhYjh[}r (jjXbashjjh`]h_]h]]h^]hc]uheMPhfhhg]r hpXgbuildslave create-slave --umask=022 ~/buildslave buildmaster.example.org:42012 {myslavename} {mypasswd}r r }r (hLUhMj ubaubj)r }r (hLUhMj hThWhYjh[}r (h`]h_]h]]h^]hc]Uentries]r (Upairr X;buildslave-create-slave command line option; --no-logrotateX/cmdoption-buildslave-create-slave--no-logrotater Utr auheNhfhhg]ubcsphinx.addnodes desc r )r }r (hLUhMj hThWhYUdescr! h[}r" (Unoindexr# Udomainr$ Xstdh`]h_]h]]h^]hc]Uobjtyper% Xoptionr& Udesctyper' j& uheNhfhhg]r( (csphinx.addnodes desc_signature r) )r* }r+ (hLX--no-logrotater, hMj hThWhYUdesc_signaturer- h[}r. (Uallnamesr/ ]r0 j, ah`]r1 j ah_]h]]h^]hc]Ufirstr2 uheM\hfhhg]r3 (csphinx.addnodes desc_name r4 )r5 }r6 (hLj, hMj* hThWhYU desc_namer7 h[}r8 (h]]h^]h_]h`]hc]uheM\hfhhg]r9 hpX--no-logrotater: r; }r< (hLUhMj5 ubaubcsphinx.addnodes desc_addname r= )r> }r? (hLXhMj* hThWhYU desc_addnamer@ h[}rA (h]]h^]h_]h`]hc]uheM\hfhhg]ubeubcsphinx.addnodes desc_content rB )rC }rD (hLUhMj hThWhYU desc_contentrE h[}rF (h]]h^]h_]h`]hc]uheM\hfhhg]rG h)rH }rI (hLXThis disables internal buildslave log management mechanism. With this option buildslave does not override the default logfile name and its behaviour giving a possibility to control those with command-line options of twistd daemon.rJ hMjC hThWhYhh[}rK (h]]h^]h_]h`]hc]uheMXhfhhg]rL hpXThis disables internal buildslave log management mechanism. With this option buildslave does not override the default logfile name and its behaviour giving a possibility to control those with command-line options of twistd daemon.rM rN }rO (hLjJ hMjH ubaubaubeubj)rP }rQ (hLUhMj hThWhYjh[}rR (h`]h_]h]]h^]hc]Uentries]rS (j X5buildslave-create-slave command line option; --useptyX)cmdoption-buildslave-create-slave--useptyrT UtrU auheNhfhhg]ubj )rV }rW (hLUhMj hThWhYj! h[}rX (j# j$ Xstdh`]h_]h]]h^]hc]j% XoptionrY j' jY uheNhfhhg]rZ (j) )r[ }r\ (hLX--useptyr] hMjV hThWhYj- h[}r^ (j/ ]r_ j] ah`]r` jT ah_]h]]h^]hc]j2 uheMchfhhg]ra (j4 )rb }rc (hLj] hMj[ hThWhYj7 h[}rd (h]]h^]h_]h`]hc]uheMchfhhg]re hpX--useptyrf rg }rh (hLUhMjb ubaubj= )ri }rj (hLXhMj[ hThWhYj@ h[}rk (h]]h^]h_]h`]hc]uheMchfhhg]ubeubjB )rl }rm (hLUhMjV hThWhYjE h[}rn (h]]h^]h_]h`]hc]uheMchfhhg]ro h)rp }rq (hLXThis is a boolean flag that tells the buildslave whether to launch child processes in a PTY or with regular pipes (the default) when the master does not specify. This option is deprecated, as this particular parameter is better specified on the master.rr hMjl hThWhYhh[}rs (h]]h^]h_]h`]hc]uheM_hfhhg]rt hpXThis is a boolean flag that tells the buildslave whether to launch child processes in a PTY or with regular pipes (the default) when the master does not specify. This option is deprecated, as this particular parameter is better specified on the master.ru rv }rw (hLjr hMjp ubaubaubeubj)rx }ry (hLUhMj hThWhYjh[}rz (h`]h_]h]]h^]hc]Uentries]r{ (j X4buildslave-create-slave command line option; --umaskX(cmdoption-buildslave-create-slave--umaskr| Utr} auheNhfhhg]ubj )r~ }r (hLUhMj hThWhYj! h[}r (j# j$ Xstdh`]h_]h]]h^]hc]j% Xoptionr j' j uheNhfhhg]r (j) )r }r (hLX--umaskr hMj~ hThWhYj- h[}r (j/ ]r j ah`]r j| ah_]h]]h^]hc]j2 uheMphfhhg]r (j4 )r }r (hLj hMj hThWhYj7 h[}r (h]]h^]h_]h`]hc]uheMphfhhg]r hpX--umaskr r }r (hLUhMj ubaubj= )r }r (hLXhMj hThWhYj@ h[}r (h]]h^]h_]h`]hc]uheMphfhhg]ubeubjB )r }r (hLUhMj~ hThWhYjE h[}r (h]]h^]h_]h`]hc]uheMphfhhg]r h)r }r (hLXThis is a string (generally an octal representation of an integer) which will cause the buildslave process' ``umask`` value to be set shortly after initialization. The ``twistd`` daemonization utility forces the umask to 077 at startup (which means that all files created by the buildslave or its child processes will be unreadable by any user other than the buildslave account). If you want build products to be readable by other accounts, you can add ``--umask=022`` to tell the buildslave to fix the umask after twistd clobbers it. If you want build products to be *writable* by other accounts too, use ``--umask=000``, but this is likely to be a security problem.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMfhfhhg]r (hpXlThis is a string (generally an octal representation of an integer) which will cause the buildslave process' r r }r (hLXlThis is a string (generally an octal representation of an integer) which will cause the buildslave process' hMj ubh)r }r (hLX ``umask``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXumaskr r }r (hLUhMj ubahYhubhpX3 value to be set shortly after initialization. The r r }r (hLX3 value to be set shortly after initialization. The hMj ubh)r }r (hLX ``twistd``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXtwistdr r }r (hLUhMj ubahYhubhpX daemonization utility forces the umask to 077 at startup (which means that all files created by the buildslave or its child processes will be unreadable by any user other than the buildslave account). If you want build products to be readable by other accounts, you can add r r }r (hLX daemonization utility forces the umask to 077 at startup (which means that all files created by the buildslave or its child processes will be unreadable by any user other than the buildslave account). If you want build products to be readable by other accounts, you can add hMj ubh)r }r (hLX``--umask=022``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX --umask=022r r }r (hLUhMj ubahYhubhpXd to tell the buildslave to fix the umask after twistd clobbers it. If you want build products to be r r }r (hLXd to tell the buildslave to fix the umask after twistd clobbers it. If you want build products to be hMj ubh)r }r (hLX *writable*h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXwritabler r }r (hLUhMj ubahYhubhpX by other accounts too, use r r }r (hLX by other accounts too, use hMj ubh)r }r (hLX``--umask=000``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX --umask=000r r }r (hLUhMj ubahYhubhpX., but this is likely to be a security problem.r r }r (hLX., but this is likely to be a security problem.hMj ubeubaubeubj)r }r (hLUhMj hThWhYjh[}r (h`]h_]h]]h^]hc]Uentries]r (j X8buildslave-create-slave command line option; --keepaliveX,cmdoption-buildslave-create-slave--keepaliver Utr auheNhfhhg]ubj )r }r (hLUhMj hThWhYj! h[}r (j# j$ Xstdh`]h_]h]]h^]hc]j% Xoptionr j' j uheNhfhhg]r (j) )r }r (hLX --keepaliver hMj hThWhYj- h[}r (j/ ]r j ah`]r j ah_]h]]h^]hc]j2 uheMhfhhg]r (j4 )r }r (hLj hMj hThWhYj7 h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpX --keepaliver r }r (hLUhMj ubaubj= )r }r (hLXhMj hThWhYj@ h[}r (h]]h^]h_]h`]hc]uheMhfhhg]ubeubjB )r }r (hLUhMj hThWhYjE h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (h)r }r (hLX/This is a number that indicates how frequently ``keepalive`` messages should be sent from the buildslave to the buildmaster, expressed in seconds. The default (600) causes a message to be sent to the buildmaster at least once every 10 minutes. To set this to a lower value, use e.g. ``--keepalive=120``.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMshfhhg]r (hpX/This is a number that indicates how frequently r r }r (hLX/This is a number that indicates how frequently hMj ubh)r }r (hLX ``keepalive``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX keepaliver r }r (hLUhMj ubahYhubhpX messages should be sent from the buildslave to the buildmaster, expressed in seconds. The default (600) causes a message to be sent to the buildmaster at least once every 10 minutes. To set this to a lower value, use e.g. r r }r (hLX messages should be sent from the buildslave to the buildmaster, expressed in seconds. The default (600) causes a message to be sent to the buildmaster at least once every 10 minutes. To set this to a lower value, use e.g. hMj ubh)r }r (hLX``--keepalive=120``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpX--keepalive=120r r }r (hLUhMj ubahYhubhpX.r }r (hLX.hMj ubeubh)r }r (hLXuIf the buildslave is behind a NAT box or stateful firewall, these messages may help to keep the connection alive: some NAT boxes tend to forget about a connection if it has not been used in a while. When this happens, the buildmaster will think that the buildslave has disappeared, and builds will time out. Meanwhile the buildslave will not realize than anything is wrong.r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMyhfhhg]r hpXuIf the buildslave is behind a NAT box or stateful firewall, these messages may help to keep the connection alive: some NAT boxes tend to forget about a connection if it has not been used in a while. When this happens, the buildmaster will think that the buildslave has disappeared, and builds will time out. Meanwhile the buildslave will not realize than anything is wrong.r r }r (hLj hMj ubaubeubeubj)r }r (hLUhMj hThWhYjh[}r (h`]h_]h]]h^]hc]Uentries]r (j X7buildslave-create-slave command line option; --maxdelayX+cmdoption-buildslave-create-slave--maxdelayr Utr auheNhfhhg]ubj )r }r (hLUhMj hThWhYj! h[}r (j# j$ Xstdh`]h_]h]]h^]hc]j% Xoptionr j' j uheNhfhhg]r (j) )r }r (hLX --maxdelayr hMj hThWhYj- h[}r! (j/ ]r" j ah`]r# j ah_]h]]h^]hc]j2 uheMhfhhg]r$ (j4 )r% }r& (hLj hMj hThWhYj7 h[}r' (h]]h^]h_]h`]hc]uheMhfhhg]r( hpX --maxdelayr) r* }r+ (hLUhMj% ubaubj= )r, }r- (hLXhMj hThWhYj@ h[}r. (h]]h^]h_]h`]hc]uheMhfhhg]ubeubjB )r/ }r0 (hLUhMj hThWhYjE h[}r1 (h]]h^]h_]h`]hc]uheMhfhhg]r2 h)r3 }r4 (hLXThis is a number that indicates the maximum amount of time the buildslave will wait between connection attempts, expressed in seconds. The default (300) causes the buildslave to wait at most 5 minutes before trying to connect to the buildmaster again.r5 hMj/ hThWhYhh[}r6 (h]]h^]h_]h`]hc]uheMhfhhg]r7 hpXThis is a number that indicates the maximum amount of time the buildslave will wait between connection attempts, expressed in seconds. The default (300) causes the buildslave to wait at most 5 minutes before trying to connect to the buildmaster again.r8 r9 }r: (hLj5 hMj3 ubaubaubeubj)r; }r< (hLUhMj hThWhYjh[}r= (h`]h_]h]]h^]hc]Uentries]r> (j X7buildslave-create-slave command line option; --log-sizeX+cmdoption-buildslave-create-slave--log-sizer? Utr@ auheNhfhhg]ubj )rA }rB (hLUhMj hThWhYj! h[}rC (j# j$ Xstdh`]h_]h]]h^]hc]j% XoptionrD j' jD uheNhfhhg]rE (j) )rF }rG (hLX --log-sizerH hMjA hThWhYj- h[}rI (j/ ]rJ jH ah`]rK j? ah_]h]]h^]hc]j2 uheMhfhhg]rL (j4 )rM }rN (hLjH hMjF hThWhYj7 h[}rO (h]]h^]h_]h`]hc]uheMhfhhg]rP hpX --log-sizerQ rR }rS (hLUhMjM ubaubj= )rT }rU (hLXhMjF hThWhYj@ h[}rV (h]]h^]h_]h`]hc]uheMhfhhg]ubeubjB )rW }rX (hLUhMjA hThWhYjE h[}rY (h]]h^]h_]h`]hc]uheMhfhhg]rZ h)r[ }r\ (hLX?This is the size in bytes when to rotate the Twisted log files.r] hMjW hThWhYhh[}r^ (h]]h^]h_]h`]hc]uheMhfhhg]r_ hpX?This is the size in bytes when to rotate the Twisted log files.r` ra }rb (hLj] hMj[ ubaubaubeubj)rc }rd (hLUhMj hThWhYjh[}re (h`]h_]h]]h^]hc]Uentries]rf (j X8buildslave-create-slave command line option; --log-countX,cmdoption-buildslave-create-slave--log-countrg Utrh auheNhfhhg]ubj )ri }rj (hLUhMj hThWhYj! h[}rk (j# j$ Xstdh`]h_]h]]h^]hc]j% Xoptionrl j' jl uheNhfhhg]rm (j) )rn }ro (hLX --log-countrp hMji hThWhYj- h[}rq (j/ ]rr jp ah`]rs jg ah_]h]]h^]hc]j2 uheMhfhhg]rt (j4 )ru }rv (hLjp hMjn hThWhYj7 h[}rw (h]]h^]h_]h`]hc]uheMhfhhg]rx hpX --log-country rz }r{ (hLUhMju ubaubj= )r| }r} (hLXhMjn hThWhYj@ h[}r~ (h]]h^]h_]h`]hc]uheMhfhhg]ubeubjB )r }r (hLUhMji hThWhYjE h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r h)r }r (hLXThis is the number of log rotations to keep around. You can either specify a number or ``None`` to keep all :file:`twistd.log` files around. The default is 10.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (hpXWThis is the number of log rotations to keep around. You can either specify a number or r r }r (hLXWThis is the number of log rotations to keep around. You can either specify a number or hMj ubh)r }r (hLX``None``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXNoner r }r (hLUhMj ubahYhubhpX to keep all r r }r (hLX to keep all hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpX twistd.logr r }r (hLX twistd.loghMj ubahYhubhpX! files around. The default is 10.r r }r (hLX! files around. The default is 10.hMj ubeubaubeubj)r }r (hLUhMj hThWhYjh[}r (h`]h_]h]]h^]hc]Uentries]r (j X=buildslave-create-slave command line option; --allow-shutdownX1cmdoption-buildslave-create-slave--allow-shutdownr Utr auheNhfhhg]ubj )r }r (hLUhMj hThWhYj! h[}r (j# j$ Xstdh`]h_]h]]h^]hc]j% Xoptionr j' j uheNhfhhg]r (j) )r }r (hLX--allow-shutdownr hMj hThWhYj- h[}r (j/ ]r j ah`]r j ah_]h]]h^]hc]j2 uheMhfhhg]r (j4 )r }r (hLj hMj hThWhYj7 h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpX--allow-shutdownr r }r (hLUhMj ubaubj= )r }r (hLXhMj hThWhYj@ h[}r (h]]h^]h_]h`]hc]uheMhfhhg]ubeubjB )r }r (hLUhMj hThWhYjE h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (h)r }r (hLXCan also be passed directly to the BuildSlave constructor in buildbot.tac. If set, it allows the buildslave to initiate a graceful shutdown, meaning that it will ask the master to shut down the slave when the current build, if any, is complete.r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpXCan also be passed directly to the BuildSlave constructor in buildbot.tac. If set, it allows the buildslave to initiate a graceful shutdown, meaning that it will ask the master to shut down the slave when the current build, if any, is complete.r r }r (hLj hMj ubaubh)r }r (hLXSetting allow_shutdown to ``file`` will cause the buildslave to watch :file:`shutdown.stamp` in basedir for updates to its mtime. When the mtime changes, the slave will request a graceful shutdown from the master. The file does not need to exist prior to starting the slave.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (hpXSetting allow_shutdown to r r }r (hLXSetting allow_shutdown to hMj ubh)r }r (hLX``file``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXfiler r }r (hLUhMj ubahYhubhpX$ will cause the buildslave to watch r r }r (hLX$ will cause the buildslave to watch hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpXshutdown.stampr r }r (hLXshutdown.stamphMj ubahYhubhpX in basedir for updates to its mtime. When the mtime changes, the slave will request a graceful shutdown from the master. The file does not need to exist prior to starting the slave.r r }r (hLX in basedir for updates to its mtime. When the mtime changes, the slave will request a graceful shutdown from the master. The file does not need to exist prior to starting the slave.hMj ubeubh)r }r (hLXSetting allow_shutdown to ``signal`` will set up a SIGHUP handler to start a graceful shutdown. When the signal is received, the slave will request a graceful shutdown from the master.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (hpXSetting allow_shutdown to r r }r (hLXSetting allow_shutdown to hMj ubh)r }r (hLX ``signal``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXsignalr r }r (hLUhMj ubahYhubhpX will set up a SIGHUP handler to start a graceful shutdown. When the signal is received, the slave will request a graceful shutdown from the master.r r }r (hLX will set up a SIGHUP handler to start a graceful shutdown. When the signal is received, the slave will request a graceful shutdown from the master.hMj ubeubh)r }r (hLXKThe default value is ``None``, in which case this feature will be disabled.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (hpXThe default value is r r }r (hLXThe default value is hMj ubh)r }r (hLX``None``h[}r (h]]h^]h_]h`]hc]uhMj hg]rhpXNonerr}r(hLUhMj ubahYhubhpX., in which case this feature will be disabled.rr}r(hLX., in which case this feature will be disabled.hMj ubeubh)r}r(hLXNBoth master and slave must be at least version 0.8.3 for this feature to work.r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpXNBoth master and slave must be at least version 0.8.3 for this feature to work.r r }r(hLj hMjubaubeubeubht)r}r(hLX#.. _Other-Buildslave-Configuration:hMj hThWhYhwh[}r(h`]h_]h]]h^]hc]hyUother-buildslave-configurationruheMhfhhg]ubeubhN)r}r(hLUhMj3 hThWh}}rh/jshYhZh[}r(h]]h^]h_]h`]r(jUid11rehc]r(hh/euheMhfhh}rjjshg]r(hi)r}r(hLXOther Buildslave ConfigurationrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r hpXOther Buildslave Configurationr!r"}r#(hLjhMjubaubcdocutils.nodes definition_list r$)r%}r&(hLUhMjhThWhYUdefinition_listr'h[}r((h]]h^]h_]h`]hc]uheNhfhhg]r)cdocutils.nodes definition_list_item r*)r+}r,(hLX3``unicode_encoding`` This represents the encoding that buildbot should use when converting unicode commandline arguments into byte strings in order to pass to the operating system when spawning new processes. The default value is what Python's :func:`sys.getfilesystemencoding()` returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings. If you need a different encoding, this can be changed in your build slave's :file:`buildbot.tac` file by adding a ``unicode_encoding`` argument to the BuildSlave constructor. hMj%hThWhYUdefinition_list_itemr-h[}r.(h]]h^]h_]h`]hc]uheMhg]r/(cdocutils.nodes term r0)r1}r2(hLX``unicode_encoding``r3hMj+hThWhYUtermr4h[}r5(h]]h^]h_]h`]hc]uheMhg]r6h)r7}r8(hLj3h[}r9(h]]h^]h_]h`]hc]uhMj1hg]r:hpXunicode_encodingr;r<}r=(hLUhMj7ubahYhubaubcdocutils.nodes definition r>)r?}r@(hLUh[}rA(h]]h^]h_]h`]hc]uhMj+hg]rB(h)rC}rD(hLXThis represents the encoding that buildbot should use when converting unicode commandline arguments into byte strings in order to pass to the operating system when spawning new processes.rEhMj?hThWhYhh[}rF(h]]h^]h_]h`]hc]uheMhg]rGhpXThis represents the encoding that buildbot should use when converting unicode commandline arguments into byte strings in order to pass to the operating system when spawning new processes.rHrI}rJ(hLjEhMjCubaubh)rK}rL(hLXThe default value is what Python's :func:`sys.getfilesystemencoding()` returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings.hMj?hThWhYhh[}rM(h]]h^]h_]h`]hc]uheMhg]rN(hpX#The default value is what Python's rOrP}rQ(hLX#The default value is what Python's hMjKubj)rR}rS(hLX#:func:`sys.getfilesystemencoding()`rThMjKhThWhYjh[}rU(UreftypeXfuncjjXsys.getfilesystemencodingU refdomainXpyrVh`]h_]U refexplicith]]h^]hc]jjUpy:classrWNU py:modulerXNuheMhg]rYh)rZ}r[(hLjTh[}r\(h]]h^]r](j jVXpy-funcr^eh_]h`]hc]uhMjRhg]r_hpXsys.getfilesystemencodingr`ra}rb(hLUhMjZubahYhubaubhpXi returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings.rcrd}re(hLXi returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings.hMjKubeubh)rf}rg(hLXIf you need a different encoding, this can be changed in your build slave's :file:`buildbot.tac` file by adding a ``unicode_encoding`` argument to the BuildSlave constructor.hMj?hThWhYhh[}rh(h]]h^]h_]h`]hc]uheMhg]ri(hpXLIf you need a different encoding, this can be changed in your build slave's rjrk}rl(hLXLIf you need a different encoding, this can be changed in your build slave's hMjfubh)rm}rn(hLUh[}ro(h`]h_]h]]h^]rpXfilerqaUrolejqhc]uhMjfhg]rrhpX buildbot.tacrsrt}ru(hLX buildbot.tachMjmubahYhubhpX file by adding a rvrw}rx(hLX file by adding a hMjfubh)ry}rz(hLX``unicode_encoding``h[}r{(h]]h^]h_]h`]hc]uhMjfhg]r|hpXunicode_encodingr}r~}r(hLUhMjyubahYhubhpX) argument to the BuildSlave constructor.rr}r(hLX) argument to the BuildSlave constructor.hMjfubeubehYU definitionrubeubaubj)r}r(hLXs = BuildSlave(buildmaster_host, port, slavename, passwd, basedir, keepalive, usepty, umask=umask, maxdelay=maxdelay, unicode_encoding='utf-8', allow_shutdown='signal')hMjhThWhYjh[}r(jjXpythonjjh`]h_]h]]h^]hc]uheMhfhhg]rhpXs = BuildSlave(buildmaster_host, port, slavename, passwd, basedir, keepalive, usepty, umask=umask, maxdelay=maxdelay, unicode_encoding='utf-8', allow_shutdown='signal')rr}r(hLUhMjubaubht)r}r(hLX%.. _Upgrading-an-Existing-Buildslave:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyU upgrading-an-existing-buildslaveruheMhfhhg]ubeubeubhN)r}r(hLUhMhRhThWh}}rh1jshYhZh[}r(h]]h^]h_]h`]r(jUid12rehc]r(hh1euheMhfhh}rjjshg]r(hi)r}r(hLX Upgrading an Existing BuildslaverhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX Upgrading an Existing Buildslaverr}r(hLjhMjubaubh)r}r(hLXIf you have just installed a new version of Buildbot-slave, you may need to take some steps to upgrade it. If you are upgrading to version 0.8.2 or later, you can runrhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXIf you have just installed a new version of Buildbot-slave, you may need to take some steps to upgrade it. If you are upgrading to version 0.8.2 or later, you can runrr}r(hLjhMjubaubj)r}r(hLX0buildslave upgrade-slave /path/to/buildslave/dirhMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpX0buildslave upgrade-slave /path/to/buildslave/dirrr}r(hLUhMjubaubht)r}r(hLX&.. _Buildslave-Version-specific-Notes:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyU!buildslave-version-specific-notesruheMhfhhg]ubhN)r}r(hLUhQKhMjhThWh}}rhjshYhZh[}r(h]]rjah^]h_]h`]r(jUid13rehc]rhauheMhfhh}rjjshg]r(hi)r}r(hLXVersion-specific NotesrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXVersion-specific Notesrr}r(hLjhMjubaubhN)r}r(hLUhMjhThWhYhZh[}r(h]]h^]h_]h`]rU.upgrading-a-buildslave-to-buildbot-slave-0-8-1rahc]rh'auheMhfhhg]r(hi)r}r(hLX.Upgrading a Buildslave to Buildbot-slave-0.8.1rhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX.Upgrading a Buildslave to Buildbot-slave-0.8.1rr}r(hLjhMjubaubh)r}r(hLXBefore Buildbot version 0.8.1, the Buildbot master and slave were part of the same distribution. As of version 0.8.1, the buildslave is a separate distribution.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXBefore Buildbot version 0.8.1, the Buildbot master and slave were part of the same distribution. As of version 0.8.1, the buildslave is a separate distribution.rr}r(hLjhMjubaubh)r}r(hLXOAs of this release, you will need to install ``buildbot-slave`` to run a slave.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX-As of this release, you will need to install rr}r(hLX-As of this release, you will need to install hMjubh)r}r(hLX``buildbot-slave``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot-slaverr}r(hLUhMjubahYhubhpX to run a slave.rr}r(hLX to run a slave.hMjubeubh)r}r(hLXAny automatic startup scripts that had run ``buildbot start`` for previous versions should be changed to run ``buildslave start`` instead.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX+Any automatic startup scripts that had run rr}r(hLX+Any automatic startup scripts that had run hMjubh)r}r(hLX``buildbot start``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot startrr}r(hLUhMjubahYhubhpX0 for previous versions should be changed to run rr}r(hLX0 for previous versions should be changed to run hMjubh)r}r(hLX``buildslave start``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildslave startrr}r(hLUhMjubahYhubhpX instead.rr}r(hLX instead.hMjubeubh)r }r (hLXIf you are running a version later than 0.8.1, then you can skip the remainder of this section: the ```upgrade-slave`` command will take care of this. If you are upgrading directly to 0.8.1, read on.hMjhThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (hpXdIf you are running a version later than 0.8.1, then you can skip the remainder of this section: the r r}r(hLXdIf you are running a version later than 0.8.1, then you can skip the remainder of this section: the hMj ubh)r}r(hLX```upgrade-slave``h[}r(h]]h^]h_]h`]hc]uhMj hg]rhpX`upgrade-slaverr}r(hLUhMjubahYhubhpXR command will take care of this. If you are upgrading directly to 0.8.1, read on.rr}r(hLXR command will take care of this. If you are upgrading directly to 0.8.1, read on.hMj ubeubh)r}r(hLX7The existing :file:`buildbot.tac` for any buildslaves running older versions will need to be edited or replaced. If the loss of cached buildslave state (e.g., for Source steps in copy mode) is not problematic, the easiest solution is to simply delete the slave directory and re-run ``buildslave create-slave``.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX The existing rr}r (hLX The existing hMjubh)r!}r"(hLUh[}r#(h`]h_]h]]h^]r$Xfiler%aUrolej%hc]uhMjhg]r&hpX buildbot.tacr'r(}r)(hLX buildbot.tachMj!ubahYhubhpX for any buildslaves running older versions will need to be edited or replaced. If the loss of cached buildslave state (e.g., for Source steps in copy mode) is not problematic, the easiest solution is to simply delete the slave directory and re-run r*r+}r,(hLX for any buildslaves running older versions will need to be edited or replaced. If the loss of cached buildslave state (e.g., for Source steps in copy mode) is not problematic, the easiest solution is to simply delete the slave directory and re-run hMjubh)r-}r.(hLX``buildslave create-slave``h[}r/(h]]h^]h_]h`]hc]uhMjhg]r0hpXbuildslave create-slaver1r2}r3(hLUhMj-ubahYhubhpX.r4}r5(hLX.hMjubeubh)r6}r7(hLXtIf deleting the slave directory is problematic, the change to :file:`buildbot.tac` is simple. On line 3, replace ::hMjhThWhYhh[}r8(h]]h^]h_]h`]hc]uheMhfhhg]r9(hpX>If deleting the slave directory is problematic, the change to r:r;}r<(hLX>If deleting the slave directory is problematic, the change to hMj6ubh)r=}r>(hLUh[}r?(h`]h_]h]]h^]r@XfilerAaUrolejAhc]uhMj6hg]rBhpX buildbot.tacrCrD}rE(hLX buildbot.tachMj=ubahYhubhpX is simple. On line 3, replacerFrG}rH(hLX is simple. On line 3, replacehMj6ubeubj)rI}rJ(hLX)from buildbot.slave.bot import BuildSlavehMjhThWhYjh[}rK(jjh`]h_]h]]h^]hc]uheMhfhhg]rLhpX)from buildbot.slave.bot import BuildSlaverMrN}rO(hLUhMjIubaubh)rP}rQ(hLXwith ::rRhMjhThWhYhh[}rS(h]]h^]h_]h`]hc]uheMhfhhg]rThpXwithrUrV}rW(hLXwithhMjPubaubj)rX}rY(hLX%from buildslave.bot import BuildSlavehMjhThWhYjh[}rZ(jjh`]h_]h]]h^]hc]uheMhfhhg]r[hpX%from buildslave.bot import BuildSlaver\r]}r^(hLUhMjXubaubh)r_}r`(hLX8After this change, the buildslave should start as usual.rahMjhThWhYhh[}rb(h]]h^]h_]h`]hc]uheMhfhhg]rchpX8After this change, the buildslave should start as usual.rdre}rf(hLjahMj_ubaubht)rg}rh(hLX.. _Launching-the-daemons:hMjhThWhYhwh[}ri(h`]h_]h]]h^]hc]hyUlaunching-the-daemonsrjuheMhfhhg]ubeubeubeubhN)rk}rl(hLUhMhRhThWh}}rmh"jgshYhZh[}rn(h]]h^]h_]h`]ro(jjUid14rpehc]rq(hCh"euheMhfhh}rrjjjgshg]rs(hi)rt}ru(hLXLaunching the daemonsrvhMjkhThWhYhmh[}rw(h]]h^]h_]h`]hc]uheMhfhhg]rxhpXLaunching the daemonsryrz}r{(hLjvhMjtubaubh)r|}r}(hLXBoth the buildmaster and the buildslave run as daemon programs. To launch them, pass the working directory to the :command:`buildbot` and :command:`buildslave` commands, as appropriate:hMjkhThWhYhh[}r~(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXrBoth the buildmaster and the buildslave run as daemon programs. To launch them, pass the working directory to the rr}r(hLXrBoth the buildmaster and the buildslave run as daemon programs. To launch them, pass the working directory to the hMj|ubjd)r}r(hLX:command:`buildbot`h[}r(h]]h^]rjiah_]h`]hc]uhMj|hg]rhpXbuildbotrr}r(hLUhMjubahYjnubhpX and rr}r(hLX and hMj|ubjd)r}r(hLX:command:`buildslave`h[}r(h]]h^]rjiah_]h`]hc]uhMj|hg]rhpX buildslaverr}r(hLUhMjubahYjnubhpX commands, as appropriate:rr}r(hLX commands, as appropriate:hMj|ubeubj)r}r(hLX^# start a master buildbot start [ BASEDIR ] # start a slave buildslave start [ SLAVE_BASEDIR ]hMjkhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpX^# start a master buildbot start [ BASEDIR ] # start a slave buildslave start [ SLAVE_BASEDIR ]rr}r(hLUhMjubaubh)r}r(hLXThe *BASEDIR* is option and can be omitted if the current directory contains the buildbot configuration (the :file:`buildbot.tac` file).hMjkhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXThe rr}r(hLXThe hMjubh)r}r(hLX *BASEDIR*h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXBASEDIRrr}r(hLUhMjubahYhubhpX` is option and can be omitted if the current directory contains the buildbot configuration (the rr}r(hLX` is option and can be omitted if the current directory contains the buildbot configuration (the hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX buildbot.tacrr}r(hLX buildbot.tachMjubahYhubhpX file).rr}r(hLX file).hMjubeubj)r}r(hLXbuildbot starthMjkhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpXbuildbot startrr}r(hLUhMjubaubh)r}r(hLXQThis command will start the daemon and then return, so normally it will not produce any output. To verify that the programs are indeed running, look for a pair of files named :file:`twistd.log` and :file:`twistd.pid` that should be created in the working directory. :file:`twistd.pid` contains the process ID of the newly-spawned daemon.hMjkhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXThis command will start the daemon and then return, so normally it will not produce any output. To verify that the programs are indeed running, look for a pair of files named rr}r(hLXThis command will start the daemon and then return, so normally it will not produce any output. To verify that the programs are indeed running, look for a pair of files named hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX twistd.logrr}r(hLX twistd.loghMjubahYhubhpX and rr}r(hLX and hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX twistd.pidrr}r(hLX twistd.pidhMjubahYhubhpX2 that should be created in the working directory. rr}r(hLX2 that should be created in the working directory. hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX twistd.pidrr}r(hLX twistd.pidhMjubahYhubhpX5 contains the process ID of the newly-spawned daemon.rr}r(hLX5 contains the process ID of the newly-spawned daemon.hMjubeubh)r}r(hLX4When the buildslave connects to the buildmaster, new directories will start appearing in its base directory. The buildmaster tells the slave to create a directory for each Builder which will be using that slave. All build operations are performed within these directories: CVS checkouts, compiles, and tests.rhMjkhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX4When the buildslave connects to the buildmaster, new directories will start appearing in its base directory. The buildmaster tells the slave to create a directory for each Builder which will be using that slave. All build operations are performed within these directories: CVS checkouts, compiles, and tests.rr}r(hLjhMjubaubh)r}r(hLXOnce you get everything running, you will want to arrange for the buildbot daemons to be started at boot time. One way is to use :command:`cron`, by putting them in a ``@reboot`` crontab entry [#f1]_hMjkhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXOnce you get everything running, you will want to arrange for the buildbot daemons to be started at boot time. One way is to use rr}r(hLXOnce you get everything running, you will want to arrange for the buildbot daemons to be started at boot time. One way is to use hMjubjd)r}r(hLX:command:`cron`h[}r(h]]h^]rjiah_]h`]hc]uhMjhg]rhpXcronrr}r(hLUhMjubahYjnubhpX, by putting them in a rr}r(hLX, by putting them in a hMjubh)r }r (hLX ``@reboot``h[}r (h]]h^]h_]h`]hc]uhMjhg]r hpX@rebootr r}r(hLUhMj ubahYhubhpX crontab entry rr}r(hLX crontab entry hMjubcdocutils.nodes footnote_reference r)r}r(hLX[#f1]_j3KhMjhYUfootnote_referencerh[}r(UautorKh`]rUid15rah_]h]]h^]hc]hyUf1ruhg]rhpX1r}r(hLUhMjubaubeubj)r}r (hLX"@reboot buildbot start [ BASEDIR ]hMjkhThWhYjh[}r!(jjXnonejjh`]h_]h]]h^]hc]uheMhfhhg]r"hpX"@reboot buildbot start [ BASEDIR ]r#r$}r%(hLUhMjubaubh)r&}r'(hLX:When you run :command:`crontab` to set this up, remember to do it as the buildmaster or buildslave account! If you add this to your crontab when running as your regular account (or worse yet, root), then the daemon will run as the wrong user, quite possibly as one with more authority than you intended to provide.hMjkhThWhYhh[}r((h]]h^]h_]h`]hc]uheMhfhhg]r)(hpX When you run r*r+}r,(hLX When you run hMj&ubjd)r-}r.(hLX:command:`crontab`h[}r/(h]]h^]r0jiah_]h`]hc]uhMj&hg]r1hpXcrontabr2r3}r4(hLUhMj-ubahYjnubhpX to set this up, remember to do it as the buildmaster or buildslave account! If you add this to your crontab when running as your regular account (or worse yet, root), then the daemon will run as the wrong user, quite possibly as one with more authority than you intended to provide.r5r6}r7(hLX to set this up, remember to do it as the buildmaster or buildslave account! If you add this to your crontab when running as your regular account (or worse yet, root), then the daemon will run as the wrong user, quite possibly as one with more authority than you intended to provide.hMj&ubeubh)r8}r9(hLXIt is important to remember that the environment provided to cron jobs and init scripts can be quite different that your normal runtime. There may be fewer environment variables specified, and the :envvar:`PATH` may be shorter than usual. It is a good idea to test out this method of launching the buildslave by using a cron job with a time in the near future, with the same command, and then check :file:`twistd.log` to make sure the slave actually started correctly. Common problems here are for :file:`/usr/local` or :file:`~/bin` to not be on your :envvar:`PATH`, or for :envvar:`PYTHONPATH` to not be set correctly. Sometimes :envvar:`HOME` is messed up too.hMjkhThWhYhh[}r:(h]]h^]h_]h`]hc]uheM"hfhhg]r;(hpXIt is important to remember that the environment provided to cron jobs and init scripts can be quite different that your normal runtime. There may be fewer environment variables specified, and the r<r=}r>(hLXIt is important to remember that the environment provided to cron jobs and init scripts can be quite different that your normal runtime. There may be fewer environment variables specified, and the hMj8ubj)r?}r@(hLUh[}rA(h`]h_]h]]h^]hc]j]rB((jXPATHrCUindex-1rDUtrE(jXenvironment variable; PATHjDUtrFeuhMj8hg]hYjubht)rG}rH(hLUh[}rI(h]]h^]h_]h`]rJjDahc]uhMj8hg]hYhwubj)rK}rL(hLX:envvar:`PATH`rMhMj8hThWhYjh[}rN(UreftypeXenvvarjjjCU refdomainXstdrOh`]h_]U refexplicith]]h^]hc]jjuheM"hg]rPh)rQ}rR(hLjMh[}rS(h]]h^]rT(j jOX std-envvarrUeh_]h`]hc]uhMjKhg]rVhpXPATHrWrX}rY(hLUhMjQubahYhubaubhpX may be shorter than usual. It is a good idea to test out this method of launching the buildslave by using a cron job with a time in the near future, with the same command, and then check rZr[}r\(hLX may be shorter than usual. It is a good idea to test out this method of launching the buildslave by using a cron job with a time in the near future, with the same command, and then check hMj8ubh)r]}r^(hLUh[}r_(h`]h_]h]]h^]r`XfileraaUrolejahc]uhMj8hg]rbhpX twistd.logrcrd}re(hLX twistd.loghMj]ubahYhubhpXQ to make sure the slave actually started correctly. Common problems here are for rfrg}rh(hLXQ to make sure the slave actually started correctly. Common problems here are for hMj8ubh)ri}rj(hLUh[}rk(h`]h_]h]]h^]rlXfilermaUrolejmhc]uhMj8hg]rnhpX /usr/localrorp}rq(hLX /usr/localhMjiubahYhubhpX or rrrs}rt(hLX or hMj8ubh)ru}rv(hLUh[}rw(h`]h_]h]]h^]rxXfileryaUrolejyhc]uhMj8hg]rzhpX~/binr{r|}r}(hLX~/binhMjuubahYhubhpX to not be on your r~r}r(hLX to not be on your hMj8ubj)r}r(hLUh[}r(h`]h_]h]]h^]hc]j]r((jXPATHrUindex-2rUtr(jXenvironment variable; PATHjUtreuhMj8hg]hYjubht)r}r(hLUh[}r(h]]h^]h_]h`]rjahc]uhMj8hg]hYhwubj)r}r(hLX:envvar:`PATH`rhMj8hThWhYjh[}r(UreftypeXenvvarjjjU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheM"hg]rh)r}r(hLjh[}r(h]]h^]r(j jX std-envvarreh_]h`]hc]uhMjhg]rhpXPATHrr}r(hLUhMjubahYhubaubhpX , or for rr}r(hLX , or for hMj8ubj)r}r(hLUh[}r(h`]h_]h]]h^]hc]j]r((jX PYTHONPATHrUindex-3rUtr(jX environment variable; PYTHONPATHjUtreuhMj8hg]hYjubht)r}r(hLUh[}r(h]]h^]h_]h`]rjahc]uhMj8hg]hYhwubj)r}r(hLX:envvar:`PYTHONPATH`rhMj8hThWhYjh[}r(UreftypeXenvvarjjjU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheM"hg]rh)r}r(hLjh[}r(h]]h^]r(j jX std-envvarreh_]h`]hc]uhMjhg]rhpX PYTHONPATHrr}r(hLUhMjubahYhubaubhpX$ to not be set correctly. Sometimes rr}r(hLX$ to not be set correctly. Sometimes hMj8ubj)r}r(hLUh[}r(h`]h_]h]]h^]hc]j]r((jXHOMErUindex-4rUtr(jXenvironment variable; HOMEjUtreuhMj8hg]hYjubht)r}r(hLUh[}r(h]]h^]h_]h`]rjahc]uhMj8hg]hYhwubj)r}r(hLX:envvar:`HOME`rhMj8hThWhYjh[}r(UreftypeXenvvarjjjU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheM"hg]rh)r}r(hLjh[}r(h]]h^]r(j jX std-envvarreh_]h`]hc]uhMjhg]rhpXHOMErr}r(hLUhMjubahYhubaubhpX is messed up too.rr}r(hLX is messed up too.hMj8ubeubh)r}r(hLXKSome distributions may include conveniences to make starting buildbot at boot time easy. For instance, with the default buildbot package in Debian-based distributions, you may only need to modify :file:`/etc/default/buildbot` (see also :file:`/etc/init.d/buildbot`, which reads the configuration in :file:`/etc/default/buildbot`).hMjkhThWhYhh[}r(h]]h^]h_]h`]hc]uheM-hfhhg]r(hpXSome distributions may include conveniences to make starting buildbot at boot time easy. For instance, with the default buildbot package in Debian-based distributions, you may only need to modify rr}r(hLXSome distributions may include conveniences to make starting buildbot at boot time easy. For instance, with the default buildbot package in Debian-based distributions, you may only need to modify hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX/etc/default/buildbotrr}r(hLX/etc/default/buildbothMjubahYhubhpX (see also rr}r(hLX (see also hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX/etc/init.d/buildbotrr}r(hLX/etc/init.d/buildbothMjubahYhubhpX#, which reads the configuration in rr}r(hLX#, which reads the configuration in hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX/etc/default/buildbotrr}r(hLX/etc/default/buildbothMjubahYhubhpX).rr}r(hLX).hMjubeubh)r}r(hLXBuildbot also comes with its own init scripts that provide support for controlling multi-slave and multi-master setups (mostly because they are based on the init script from the Debian package). With a little modification these scripts can be used both on Debian and RHEL-based distributions and may thus prove helpful to package maintainers who are working on buildbot (or those that haven't yet split buildbot into master and slave packages).rhMjkhThWhYhh[}r (h]]h^]h_]h`]hc]uheM3hfhhg]r hpXBuildbot also comes with its own init scripts that provide support for controlling multi-slave and multi-master setups (mostly because they are based on the init script from the Debian package). With a little modification these scripts can be used both on Debian and RHEL-based distributions and may thus prove helpful to package maintainers who are working on buildbot (or those that haven't yet split buildbot into master and slave packages).r r }r (hLjhMjubaubj)r}r(hLX # install as /etc/default/buildslave # or /etc/sysconfig/buildslave master/contrib/init-scripts/buildslave.default # install as /etc/default/buildmaster # or /etc/sysconfig/buildmaster master/contrib/init-scripts/buildmaster.default # install as /etc/init.d/buildslave slave/contrib/init-scripts/buildslave.init.sh # install as /etc/init.d/buildmaster slave/contrib/init-scripts/buildmaster.init.sh # ... and tell sysvinit about them chkconfig buildmaster reset # ... or update-rc.d buildmaster defaultshMjkhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheM:hfhhg]rhpX # install as /etc/default/buildslave # or /etc/sysconfig/buildslave master/contrib/init-scripts/buildslave.default # install as /etc/default/buildmaster # or /etc/sysconfig/buildmaster master/contrib/init-scripts/buildmaster.default # install as /etc/init.d/buildslave slave/contrib/init-scripts/buildslave.init.sh # install as /etc/init.d/buildmaster slave/contrib/init-scripts/buildmaster.init.sh # ... and tell sysvinit about them chkconfig buildmaster reset # ... or update-rc.d buildmaster defaultsrr}r(hLUhMjubaubht)r}r(hLX .. _Logfiles:hMjkhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUlogfilesruheMOhfhhg]ubeubhN)r}r(hLUhQKhMhRhThWh}}rh>jshYhZh[}r(h]]rXlogfilesrah^]h_]h`]r(jUid16r ehc]r!h>auheMRhfhh}r"jjshg]r#(hi)r$}r%(hLXLogfilesr&hMjhThWhYhmh[}r'(h]]h^]h_]h`]hc]uheMRhfhhg]r(hpXLogfilesr)r*}r+(hLj&hMj$ubaubh)r,}r-(hLXWhile a buildbot daemon runs, it emits text to a logfile, named :file:`twistd.log`. A command like ``tail -f twistd.log`` is useful to watch the command output as it runs.hMjhThWhYhh[}r.(h]]h^]h_]h`]hc]uheMThfhhg]r/(hpX@While a buildbot daemon runs, it emits text to a logfile, named r0r1}r2(hLX@While a buildbot daemon runs, it emits text to a logfile, named hMj,ubh)r3}r4(hLUh[}r5(h`]h_]h]]h^]r6Xfiler7aUrolej7hc]uhMj,hg]r8hpX twistd.logr9r:}r;(hLX twistd.loghMj3ubahYhubhpX. A command like r<r=}r>(hLX. A command like hMj,ubh)r?}r@(hLX``tail -f twistd.log``h[}rA(h]]h^]h_]h`]hc]uhMj,hg]rBhpXtail -f twistd.logrCrD}rE(hLUhMj?ubahYhubhpX2 is useful to watch the command output as it runs.rFrG}rH(hLX2 is useful to watch the command output as it runs.hMj,ubeubh)rI}rJ(hLXThe buildmaster will announce any errors with its configuration file in the logfile, so it is a good idea to look at the log at startup time to check for any problems. Most buildmaster activities will cause lines to be added to the log.rKhMjhThWhYhh[}rL(h]]h^]h_]h`]hc]uheMXhfhhg]rMhpXThe buildmaster will announce any errors with its configuration file in the logfile, so it is a good idea to look at the log at startup time to check for any problems. Most buildmaster activities will cause lines to be added to the log.rNrO}rP(hLjKhMjIubaubht)rQ}rR(hLX .. _Shutdown:hMjhThWhYhwh[}rS(h`]h_]h]]h^]hc]hyUshutdownrTuheM]hfhhg]ubeubhN)rU}rV(hLUhQKhMhRhThWh}}rWhjQshYhZh[}rX(h]]rYXshutdownrZah^]h_]h`]r[(jTUid17r\ehc]r]hauheM`hfhh}r^jTjQshg]r_(hi)r`}ra(hLXShutdownrbhMjUhThWhYhmh[}rc(h]]h^]h_]h`]hc]uheM`hfhhg]rdhpXShutdownrerf}rg(hLjbhMj`ubaubh)rh}ri(hLX2To stop a buildmaster or buildslave manually, use:rjhMjUhThWhYhh[}rk(h]]h^]h_]h`]hc]uheMbhfhhg]rlhpX2To stop a buildmaster or buildslave manually, use:rmrn}ro(hLjjhMjhubaubj)rp}rq(hLX@buildbot stop [ BASEDIR ] # or buildslave stop [ SLAVE_BASEDIR ]hMjUhThWhYjh[}rr(jjXbashjjh`]h_]h]]h^]hc]uheMdhfhhg]rshpX@buildbot stop [ BASEDIR ] # or buildslave stop [ SLAVE_BASEDIR ]rtru}rv(hLUhMjpubaubh)rw}rx(hLXbThis simply looks for the :file:`twistd.pid` file and kills whatever process is identified within.hMjUhThWhYhh[}ry(h]]h^]h_]h`]hc]uheMjhfhhg]rz(hpXThis simply looks for the r{r|}r}(hLXThis simply looks for the hMjwubh)r~}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjwhg]rhpX twistd.pidrr}r(hLX twistd.pidhMj~ubahYhubhpX6 file and kills whatever process is identified within.rr}r(hLX6 file and kills whatever process is identified within.hMjwubeubh)r}r(hLXAt system shutdown, all processes are sent a ``SIGKILL``. The buildmaster and buildslave will respond to this by shutting down normally.hMjUhThWhYhh[}r(h]]h^]h_]h`]hc]uheMmhfhhg]r(hpX-At system shutdown, all processes are sent a rr}r(hLX-At system shutdown, all processes are sent a hMjubh)r}r(hLX ``SIGKILL``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXSIGKILLrr}r(hLUhMjubahYhubhpXP. The buildmaster and buildslave will respond to this by shutting down normally.rr}r(hLXP. The buildmaster and buildslave will respond to this by shutting down normally.hMjubeubh)r}r(hLXThe buildmaster will respond to a ``SIGHUP`` by re-reading its config file. Of course, this only works on Unix-like systems with signal support, and won't work on Windows. The following shortcut is available:hMjUhThWhYhh[}r(h]]h^]h_]h`]hc]uheMqhfhhg]r(hpX"The buildmaster will respond to a rr}r(hLX"The buildmaster will respond to a hMjubh)r}r(hLX ``SIGHUP``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXSIGHUPrr}r(hLUhMjubahYhubhpX by re-reading its config file. Of course, this only works on Unix-like systems with signal support, and won't work on Windows. The following shortcut is available:rr}r(hLX by re-reading its config file. Of course, this only works on Unix-like systems with signal support, and won't work on Windows. The following shortcut is available:hMjubeubj)r}r(hLXbuildbot reconfig [ BASEDIR ]hMjUhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMvhfhhg]rhpXbuildbot reconfig [ BASEDIR ]rr}r(hLUhMjubaubh)r}r(hLXKWhen you update the Buildbot code to a new release, you will need to restart the buildmaster and/or buildslave before it can take advantage of the new code. You can do a :samp:`buildbot stop {BASEDIR}` and :samp:`buildbot start {BASEDIR}` in quick succession, or you can use the ``restart`` shortcut, which does both steps for you:hMjUhThWhYhh[}r(h]]h^]h_]h`]hc]uheMzhfhhg]r(hpXWhen you update the Buildbot code to a new release, you will need to restart the buildmaster and/or buildslave before it can take advantage of the new code. You can do a rr}r(hLXWhen you update the Buildbot code to a new release, you will need to restart the buildmaster and/or buildslave before it can take advantage of the new code. You can do a hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXsampraUrolejhc]uhMjhg]r(hpXbuildbot stop rr}r(hLXbuildbot stop hMjubh)r}r(hLXBASEDIRh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXBASEDIRrr}r(hLUhMjubahYhubehYhubhpX and rr}r(hLX and hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXsampraUrolejhc]uhMjhg]r(hpXbuildbot start rr}r(hLXbuildbot start hMjubh)r}r(hLXBASEDIRh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXBASEDIRrr}r(hLUhMjubahYhubehYhubhpX) in quick succession, or you can use the rr}r(hLX) in quick succession, or you can use the hMjubh)r}r(hLX ``restart``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXrestartrr}r(hLUhMjubahYhubhpX) shortcut, which does both steps for you:rr}r(hLX) shortcut, which does both steps for you:hMjubeubj)r}r(hLXbuildbot restart [ BASEDIR ]hMjUhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpXbuildbot restart [ BASEDIR ]rr}r(hLUhMjubaubh)r}r(hLX,Buildslaves can similarly be restarted with:rhMjUhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX,Buildslaves can similarly be restarted with:rr}r(hLjhMjubaubj)r}r(hLXbuildslave restart [ BASEDIR ]hMjUhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpXbuildslave restart [ BASEDIR ]rr}r(hLUhMjubaubh)r}r(hLXThere are certain configuration changes that are not handled cleanly by ``buildbot reconfig``. If this occurs, ``buildbot restart`` is a more robust tool to fully switch over to the new configuration.hMjUhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXHThere are certain configuration changes that are not handled cleanly by rr}r(hLXHThere are certain configuration changes that are not handled cleanly by hMjubh)r}r(hLX``buildbot reconfig``h[}r (h]]h^]h_]h`]hc]uhMjhg]r hpXbuildbot reconfigr r }r (hLUhMjubahYhubhpX. If this occurs, rr}r(hLX. If this occurs, hMjubh)r}r(hLX``buildbot restart``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot restartrr}r(hLUhMjubahYhubhpXE is a more robust tool to fully switch over to the new configuration.rr}r(hLXE is a more robust tool to fully switch over to the new configuration.hMjubeubh)r}r(hLX``buildbot restart`` may also be used to start a stopped Buildbot instance. This behaviour is useful when writing scripts that stop, start and restart Buildbot.hMjUhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(h)r}r (hLX``buildbot restart``h[}r!(h]]h^]h_]h`]hc]uhMjhg]r"hpXbuildbot restartr#r$}r%(hLUhMjubahYhubhpX may also be used to start a stopped Buildbot instance. This behaviour is useful when writing scripts that stop, start and restart Buildbot.r&r'}r((hLX may also be used to start a stopped Buildbot instance. This behaviour is useful when writing scripts that stop, start and restart Buildbot.hMjubeubh)r)}r*(hLX.A buildslave may also be gracefully shutdown from the :bb:status:`WebStatus` status plugin. This is useful to shutdown a buildslave without interrupting any current builds. The buildmaster will wait until the buildslave is finished all its current builds, and will then tell the buildslave to shutdown.hMjUhThWhYhh[}r+(h]]h^]h_]h`]hc]uheMhfhhg]r,(hpX6A buildslave may also be gracefully shutdown from the r-r.}r/(hLX6A buildslave may also be gracefully shutdown from the hMj)ubj)r0}r1(hLX:bb:status:`WebStatus`r2hMj)hThWhYjh[}r3(UreftypeXstatusjjX WebStatusU refdomainXbbr4h`]h_]U refexplicith]]h^]hc]jjuheMhg]r5h)r6}r7(hLj2h[}r8(h]]h^]r9(j j4X bb-statusr:eh_]h`]hc]uhMj0hg]r;hpX WebStatusr<r=}r>(hLUhMj6ubahYhubaubhpX status plugin. This is useful to shutdown a buildslave without interrupting any current builds. The buildmaster will wait until the buildslave is finished all its current builds, and will then tell the buildslave to shutdown.r?r@}rA(hLX status plugin. This is useful to shutdown a buildslave without interrupting any current builds. The buildmaster will wait until the buildslave is finished all its current builds, and will then tell the buildslave to shutdown.hMj)ubeubht)rB}rC(hLX.. _Maintenance:hMjUhThWhYhwh[}rD(h`]h_]h]]h^]hc]hyU maintenancerEuheMhfhhg]ubeubhN)rF}rG(hLUhQKhMhRhThWh}}rHh*jBshYhZh[}rI(h]]rJX maintenancerKah^]h_]h`]rL(jEUid18rMehc]rNh*auheMhfhh}rOjEjBshg]rP(hi)rQ}rR(hLX MaintenancerShMjFhThWhYhmh[}rT(h]]h^]h_]h`]hc]uheMhfhhg]rUhpX MaintenancerVrW}rX(hLjShMjQubaubh)rY}rZ(hLXThe buildmaster can be configured to send out email notifications when a slave has been offline for a while. Be sure to configure the buildmaster with a contact email address for each slave so these notifications are sent to someone who can bring it back online.r[hMjFhThWhYhh[}r\(h]]h^]h_]h`]hc]uheMhfhhg]r]hpXThe buildmaster can be configured to send out email notifications when a slave has been offline for a while. Be sure to configure the buildmaster with a contact email address for each slave so these notifications are sent to someone who can bring it back online.r^r_}r`(hLj[hMjYubaubh)ra}rb(hLXIf you find you can no longer provide a buildslave to the project, please let the project admins know, so they can put out a call for a replacement.rchMjFhThWhYhh[}rd(h]]h^]h_]h`]hc]uheMhfhhg]rehpXIf you find you can no longer provide a buildslave to the project, please let the project admins know, so they can put out a call for a replacement.rfrg}rh(hLjchMjaubaubh)ri}rj(hLXThe Buildbot records status and logs output continually, each time a build is performed. The status tends to be small, but the build logs can become quite large. Each build and log are recorded in a separate file, arranged hierarchically under the buildmaster's base directory. To prevent these files from growing without bound, you should periodically delete old build logs. A simple cron job to delete anything older than, say, two weeks should do the job. The only trick is to leave the :file:`buildbot.tac` and other support files alone, for which :command:`find`'s ``-mindepth`` argument helps skip everything in the top directory. You can use something like the following:hMjFhThWhYhh[}rk(h]]h^]h_]h`]hc]uheMhfhhg]rl(hpXThe Buildbot records status and logs output continually, each time a build is performed. The status tends to be small, but the build logs can become quite large. Each build and log are recorded in a separate file, arranged hierarchically under the buildmaster's base directory. To prevent these files from growing without bound, you should periodically delete old build logs. A simple cron job to delete anything older than, say, two weeks should do the job. The only trick is to leave the rmrn}ro(hLXThe Buildbot records status and logs output continually, each time a build is performed. The status tends to be small, but the build logs can become quite large. Each build and log are recorded in a separate file, arranged hierarchically under the buildmaster's base directory. To prevent these files from growing without bound, you should periodically delete old build logs. A simple cron job to delete anything older than, say, two weeks should do the job. The only trick is to leave the hMjiubh)rp}rq(hLUh[}rr(h`]h_]h]]h^]rsXfilertaUrolejthc]uhMjihg]ruhpX buildbot.tacrvrw}rx(hLX buildbot.tachMjpubahYhubhpX* and other support files alone, for which ryrz}r{(hLX* and other support files alone, for which hMjiubjd)r|}r}(hLX:command:`find`h[}r~(h]]h^]rjiah_]h`]hc]uhMjihg]rhpXfindrr}r(hLUhMj|ubahYjnubhpX's rr}r(hLX's hMjiubh)r}r(hLX ``-mindepth``h[}r(h]]h^]h_]h`]hc]uhMjihg]rhpX -mindepthrr}r(hLUhMjubahYhubhpX_ argument helps skip everything in the top directory. You can use something like the following:rr}r(hLX_ argument helps skip everything in the top directory. You can use something like the following:hMjiubeubj)r}r(hLX@weekly cd BASEDIR && find . -mindepth 2 i-path './public_html/*' \ -prune -o -type f -mtime +14 -exec rm {} \; @weekly cd BASEDIR && find twistd.log* -mtime +14 -exec rm {} \;hMjFhThWhYjh[}r(jjXnonejjh`]h_]h]]h^]hc]uheMhfhhg]rhpX@weekly cd BASEDIR && find . -mindepth 2 i-path './public_html/*' \ -prune -o -type f -mtime +14 -exec rm {} \; @weekly cd BASEDIR && find twistd.log* -mtime +14 -exec rm {} \;rr}r(hLUhMjubaubh)r}r(hLXAlternatively, you can configure a maximum number of old logs to be kept using the ``--log-count`` command line option when running ``buildslave create-slave`` or ``buildbot create-master``.hMjFhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXSAlternatively, you can configure a maximum number of old logs to be kept using the rr}r(hLXSAlternatively, you can configure a maximum number of old logs to be kept using the hMjubh)r}r(hLX``--log-count``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX --log-countrr}r(hLUhMjubahYhubhpX" command line option when running rr}r(hLX" command line option when running hMjubh)r}r(hLX``buildslave create-slave``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildslave create-slaverr}r(hLUhMjubahYhubhpX or rr}r(hLX or hMjubh)r}r(hLX``buildbot create-master``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot create-masterrr}r(hLUhMjubahYhubhpX.r}r(hLX.hMjubeubht)r}r(hLX.. _Troubleshooting:hMjFhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUtroubleshootingruheMhfhhg]ubeubhN)r}r(hLUhQKhMhRhThWh}}rhjshYhZh[}r(h]]rXtroubleshootingrah^]h_]h`]r(jUid19rehc]rhauheMhfhh}rjjshg]r(hi)r}r(hLXTroubleshootingrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXTroubleshootingrr}r(hLjhMjubaubh)r}r(hLX3Here are a few hints on diagnosing common problems.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX3Here are a few hints on diagnosing common problems.rr}r(hLjhMjubaubht)r}r(hLX.. _Starting-the-buildslave:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUstarting-the-buildslaveruheMhfhhg]ubhN)r}r(hLUhMjhThWh}}rhDjshYhZh[}r(h]]h^]h_]h`]r(jUid20rehc]r(hhpX.bashrcr?r@}rA(hLX.bashrchMj9ubahYhubhpXo, etc). If you've installed buildbot (or other Python libraries) to an unusual location, you may need to add a rBrC}rD(hLXo, etc). If you've installed buildbot (or other Python libraries) to an unusual location, you may need to add a hMjubj)rE}rF(hLUh[}rG(h`]h_]h]]h^]hc]j]rH((jX PYTHONPATHrIUindex-6rJUtrK(jX environment variable; PYTHONPATHjJUtrLeuhMjhg]hYjubht)rM}rN(hLUh[}rO(h]]h^]h_]h`]rPjJahc]uhMjhg]hYhwubj)rQ}rR(hLX:envvar:`PYTHONPATH`rShMjhThWhYjh[}rT(UreftypeXenvvarjjjIU refdomainXstdrUh`]h_]U refexplicith]]h^]hc]jjuheMhg]rVh)rW}rX(hLjSh[}rY(h]]h^]rZ(j jUX std-envvarr[eh_]h`]hc]uhMjQhg]r\hpX PYTHONPATHr]r^}r_(hLUhMjWubahYhubaubhpX< specification (note that Python will do tilde-expansion on r`ra}rb(hLX< specification (note that Python will do tilde-expansion on hMjubj)rc}rd(hLUh[}re(h`]h_]h]]h^]hc]j]rf((jX PYTHONPATHrgUindex-7rhUtri(jX environment variable; PYTHONPATHjhUtrjeuhMjhg]hYjubht)rk}rl(hLUh[}rm(h]]h^]h_]h`]rnjhahc]uhMjhg]hYhwubj)ro}rp(hLX:envvar:`PYTHONPATH`rqhMjhThWhYjh[}rr(UreftypeXenvvarjjjgU refdomainXstdrsh`]h_]U refexplicith]]h^]hc]jjuheMhg]rth)ru}rv(hLjqh[}rw(h]]h^]rx(j jsX std-envvarryeh_]h`]hc]uhMjohg]rzhpX PYTHONPATHr{r|}r}(hLUhMjuubahYhubaubhpXH elements by itself). Sometimes it is safer to fully-specify everything:r~r}r(hLXH elements by itself). Sometimes it is safer to fully-specify everything:hMjubeubj)r}r(hLX^@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot \ start /usr/home/buildbot/basedirhMjhThWhYjh[}r(jjXnonejjh`]h_]h]]h^]hc]uheMhfhhg]rhpX^@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot \ start /usr/home/buildbot/basedirrr}r(hLUhMjubaubh)r}r(hLXTake the time to get the ``@reboot`` job set up. Otherwise, things will work fine for a while, but the first power outage or system reboot you have will stop the buildslave with nothing but the cries of sorrowful developers to remind you that it has gone away.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXTake the time to get the rr}r(hLXTake the time to get the hMjubh)r}r(hLX ``@reboot``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX@rebootrr}r(hLUhMjubahYhubhpX job set up. Otherwise, things will work fine for a while, but the first power outage or system reboot you have will stop the buildslave with nothing but the cries of sorrowful developers to remind you that it has gone away.rr}r(hLX job set up. Otherwise, things will work fine for a while, but the first power outage or system reboot you have will stop the buildslave with nothing but the cries of sorrowful developers to remind you that it has gone away.hMjubeubht)r}r(hLX".. _Connecting-to-the-buildmaster:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUconnecting-to-the-buildmasterruheMhfhhg]ubeubhN)r}r(hLUhMjhThWh}}rhjshYhZh[}r(h]]h^]h_]h`]r(jUid21rehc]r(h2heuheMhfhh}rjjshg]r(hi)r}r(hLXConnecting to the buildmasterrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXConnecting to the buildmasterrr}r(hLjhMjubaubh)r}r(hLXIf the buildslave cannot connect to the buildmaster, the reason should be described in the :file:`twistd.log` logfile. Some common problems are an incorrect master hostname or port number, or a mistyped bot name or password. If the buildslave loses the connection to the master, it is supposed to attempt to reconnect with an exponentially-increasing backoff. Each attempt (and the time of the next attempt) will be logged. If you get impatient, just manually stop and re-start the buildslave.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX[If the buildslave cannot connect to the buildmaster, the reason should be described in the rr}r(hLX[If the buildslave cannot connect to the buildmaster, the reason should be described in the hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX twistd.logrr}r(hLX twistd.loghMjubahYhubhpX logfile. Some common problems are an incorrect master hostname or port number, or a mistyped bot name or password. If the buildslave loses the connection to the master, it is supposed to attempt to reconnect with an exponentially-increasing backoff. Each attempt (and the time of the next attempt) will be logged. If you get impatient, just manually stop and re-start the buildslave.rr}r(hLX logfile. Some common problems are an incorrect master hostname or port number, or a mistyped bot name or password. If the buildslave loses the connection to the master, it is supposed to attempt to reconnect with an exponentially-increasing backoff. Each attempt (and the time of the next attempt) will be logged. If you get impatient, just manually stop and re-start the buildslave.hMjubeubh)r}r(hLXEWhen the buildmaster is restarted, all slaves will be disconnected, and will attempt to reconnect as usual. The reconnect time will depend upon how long the buildmaster is offline (i.e. how far up the exponential backoff curve the slaves have travelled). Again, :samp:`buildslave restart {BASEDIR}` will speed up the process.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXWhen the buildmaster is restarted, all slaves will be disconnected, and will attempt to reconnect as usual. The reconnect time will depend upon how long the buildmaster is offline (i.e. how far up the exponential backoff curve the slaves have travelled). Again, rr}r(hLXWhen the buildmaster is restarted, all slaves will be disconnected, and will attempt to reconnect as usual. The reconnect time will depend upon how long the buildmaster is offline (i.e. how far up the exponential backoff curve the slaves have travelled). Again, hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXsampraUrolejhc]uhMjhg]r(hpXbuildslave restart rr}r(hLXbuildslave restart hMjubh)r}r(hLXBASEDIRh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXBASEDIRrr}r(hLUhMjubahYhubehYhubhpX will speed up the process.rr}r(hLX will speed up the process.hMjubeubcdocutils.nodes footnote r)r}r(hLXThis ``@reboot`` syntax is understood by Vixie cron, which is the flavor usually provided with Linux systems. Other unices may have a cron that doesn't understand ``@reboot``: hMjhThWhYUfootnoterh[}r(jKh`]rjah_]rjah]]h^]hc]rhauheMhfhhg]r(cdocutils.nodes label r)r}r(hLUhMjhTNhYUlabelrh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rhpX1r}r(hLUhMjubaubh)r}r(hLXThis ``@reboot`` syntax is understood by Vixie cron, which is the flavor usually provided with Linux systems. Other unices may have a cron that doesn't understand ``@reboot``:hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhg]r(hpXThis rr}r(hLXThis hMjubh)r}r(hLX ``@reboot``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX@rebootrr}r(hLUhMjubahYhubhpX syntax is understood by Vixie cron, which is the flavor usually provided with Linux systems. Other unices may have a cron that doesn't understand rr}r(hLX syntax is understood by Vixie cron, which is the flavor usually provided with Linux systems. Other unices may have a cron that doesn't understand hMjubh)r}r(hLX ``@reboot``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX@rebootrr}r(hLUhMjubahYhubhpX:r}r(hLX:hMjubeubeubht)r}r(hLX.. _Contrib-Scripts:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUcontrib-scriptsr uheMhfhhg]ubeubhN)r }r (hLUhMjhThWh}}r h@jshYhZh[}r (h]]h^]h_]h`]r(j Uid22rehc]r(h h@euheMhfhh}rj jshg]r(hi)r}r(hLXContrib ScriptsrhMj hThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXContrib Scriptsrr}r(hLjhMjubaubh)r}r(hLXWhile some features of Buildbot are included in the distribution, others are only available in :file:`contrib/` in the source directory. The latest versions of such scripts are available at http://github.com/buildbot/buildbot/tree/master/master/contrib.hMj hThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX_While some features of Buildbot are included in the distribution, others are only available in rr }r!(hLX_While some features of Buildbot are included in the distribution, others are only available in hMjubh)r"}r#(hLUh[}r$(h`]h_]h]]h^]r%Xfiler&aUrolej&hc]uhMjhg]r'hpXcontrib/r(r)}r*(hLXcontrib/hMj"ubahYhubhpXP in the source directory. The latest versions of such scripts are available at r+r,}r-(hLXP in the source directory. The latest versions of such scripts are available at hMjubh)r.}r/(hLX>http://github.com/buildbot/buildbot/tree/master/master/contribr0h[}r1(Urefurij0h`]h_]h]]h^]hc]uhMjhg]r2hpX>http://github.com/buildbot/buildbot/tree/master/master/contribr3r4}r5(hLUhMj.ubahYhubhpX.r6}r7(hLX.hMjubeubht)r8}r9(hLXA.. _TwistedConch: http://twistedmatrix.com/trac/wiki/TwistedConchhQKhMj hThWhYhwh[}r:(j5jWh`]r;U twistedconchr<ah_]h]]h^]hc]r=h-auheMhfhhg]ubht)r>}r?(hLXA.. _TwistedWords: http://twistedmatrix.com/trac/wiki/TwistedWordshQKhMj hThWhYhwh[}r@(j5jLh`]rAU twistedwordsrBah_]h]]h^]hc]rChauheMhfhhg]ubht)rD}rE(hLX?.. _TwistedMail: http://twistedmatrix.com/trac/wiki/TwistedMailhQKhMj hThWhYhwh[}rF(j5j6h`]rGU twistedmailrHah_]h]]h^]hc]rIh)auheMhfhhg]ubht)rJ}rK(hLX=.. _TwistedWeb: http://twistedmatrix.com/trac/wiki/TwistedWebhQKhMj hThWhYhwh[}rL(j5jAh`]rMU twistedwebrNah_]h]]h^]hc]rOh0auheMhfhhg]ubeubeubeubhThWh}}rPhhshYhZh[}rQ(h]]rRX requirementsrSah^]h_]h`]rT(hUid2rUehc]rVhauheKhfhh}rWhhshg]rX(hi)rY}rZ(hLX Requirementsr[hMhOhThWhYhmh[}r\(h]]h^]h_]h`]hc]uheKhfhhg]r]hpX Requirementsr^r_}r`(hLj[hMjYubaubhhheubhThWhYUsystem_messagerah[}rb(h]]UlevelKh`]h_]rcjUaUsourcehWh^]hc]UlineKUtypeUINFOrduheKhfhhg]reh)rf}rg(hLUh[}rh(h]]h^]h_]h`]hc]uhMhJhg]rihpX/Duplicate implicit target name: "requirements".rjrk}rl(hLUhMjfubahYhubaubhI)rm}rn(hLUhMj3 hThWhYjah[}ro(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheMhfhhg]rph)rq}rr(hLUh[}rs(h]]h^]h_]h`]hc]uhMjmhg]rthpX:Enumerated list start value not ordinal-1: "2" (ordinal 2)rurv}rw(hLUhMjqubahYhubaubhI)rx}ry(hLUhMj3 hThWhYjah[}rz(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheMhfhhg]r{h)r|}r}(hLUh[}r~(h]]h^]h_]h`]hc]uhMjxhg]rhpX:Enumerated list start value not ordinal-1: "3" (ordinal 3)rr}r(hLUhMj|ubahYhubaubhI)r}r(hLUhMj3 hThWhYjah[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX:Enumerated list start value not ordinal-1: "4" (ordinal 4)rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMj3 hThWhYjah[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX:Enumerated list start value not ordinal-1: "5" (ordinal 5)rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMj3 hThWhYjah[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX:Enumerated list start value not ordinal-1: "6" (ordinal 6)rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMj3 hThWhYjah[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX:Enumerated list start value not ordinal-1: "7" (ordinal 7)rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMj3 hThWhYjah[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduheM)hfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX:Enumerated list start value not ordinal-1: "8" (ordinal 8)rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjhThWhYjah[}r(h]]UlevelKh`]h_]rjaUsourcehWh^]hc]UlineMUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX9Duplicate implicit target name: "version-specific notes".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjhThWhYjah[}r(h]]UlevelKh`]h_]rj aUsourcehWh^]hc]UlineMRUtypejduheMRhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX+Duplicate implicit target name: "logfiles".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjUhThWhYjah[}r(h]]UlevelKh`]h_]rj\aUsourcehWh^]hc]UlineM`UtypejduheM`hfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX+Duplicate implicit target name: "shutdown".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjFhThWhYjah[}r(h]]UlevelKh`]h_]rjMaUsourcehWh^]hc]UlineMUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX.Duplicate implicit target name: "maintenance".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjhThWhYjah[}r(h]]UlevelKh`]h_]rjaUsourcehWh^]hc]UlineMUtypejduheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX2Duplicate implicit target name: "troubleshooting".rr}r(hLUhMjubahYhubaubeUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hjhj hjTh jEh Nh jih jh j)hjhj2 hjhjhj hjhjhjShjhjhj'hhhj/hjhjhj}hjhjBh jh!jOh"jjh#j h$jJh%jh&jh'jh(jh)jHh*jEh+j8 h,jZh-j<h.jh/jh0jNh1jh2jh3hbh4jh5jh6j h7hzh8hh9jh:hh;jhjh?jh@j hAjhBhhCjphDjuhg]rhRahLUU transformerrNU footnote_refsr}rXf1r]rjasUrefnamesr}r(j]rjaX twistedweb]rj>aX twistedmail]rj1aX twistedwords]rjIaX twistedconch]rjTauUsymbol_footnotesr]r Uautofootnote_refsr ]r jaUsymbol_footnote_refsr ]r U citationsr]rhfhU current_linerNUtransform_messagesr]r(hI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX9Hyperlink target "buildbot-components" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r (h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]r!h)r"}r#(hLUh[}r$(h]]h^]h_]h`]hc]uhMjhg]r%hpX2Hyperlink target "requirements" is not referenced.r&r'}r((hLUhMj"ubahYhubahYjaubhI)r)}r*(hLUh[}r+(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]r,h)r-}r.(hLUh[}r/(h]]h^]h_]h`]hc]uhMj)hg]r0hpX9Hyperlink target "common-requirements" is not referenced.r1r2}r3(hLUhMj-ubahYhubahYjaubhI)r4}r5(hLUh[}r6(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKFUtypejduhg]r7h)r8}r9(hLUh[}r:(h]]h^]h_]h`]hc]uhMj4hg]r;hpX>Hyperlink target "buildmaster-requirements" is not referenced.r<r=}r>(hLUhMj8ubahYhubahYjaubhI)r?}r@(hLUh[}rA(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKvUtypejduhg]rBh)rC}rD(hLUh[}rE(h]]h^]h_]h`]hc]uhMj?hg]rFhpX9Hyperlink target "installing-the-code" is not referenced.rGrH}rI(hLUhMjCubahYhubahYjaubhI)rJ}rK(hLUh[}rL(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]rMh)rN}rO(hLUh[}rP(h]]h^]h_]h`]hc]uhMjJhg]rQhpX-Hyperlink target "index-0" is not referenced.rRrS}rT(hLUhMjNubahYhubahYjaubhI)rU}rV(hLUh[}rW(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]rXh)rY}rZ(hLUh[}r[(h]]h^]h_]h`]hc]uhMjUhg]r\hpXBHyperlink target "installation-in-a-virtualenv" is not referenced.r]r^}r_(hLUhMjYubahYhubahYjaubhI)r`}ra(hLUh[}rb(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]rch)rd}re(hLUh[}rf(h]]h^]h_]h`]hc]uhMj`hg]rghpXFHyperlink target "running-buildbots-tests-optional" is not referenced.rhri}rj(hLUhMjdubahYhubahYjaubhI)rk}rl(hLUh[}rm(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejduhg]rnh)ro}rp(hLUh[}rq(h]]h^]h_]h`]hc]uhMjkhg]rrhpX<Hyperlink target "creating-a-buildmaster" is not referenced.rsrt}ru(hLUhMjoubahYhubahYjaubhI)rv}rw(hLUh[}rx(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMWUtypejduhg]ryh)rz}r{(hLUh[}r|(h]]h^]h_]h`]hc]uhMjvhg]r}hpXGHyperlink target "upgrading-an-existing-buildmaster" is not referenced.r~r}r(hLUhMjzubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMyUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXHHyperlink target "buildmaster-version-specific-notes" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXNHyperlink target "upgrading-a-buildmaster-to-later-version" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX;Hyperlink target "creating-a-buildslave" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMEUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX8Hyperlink target "buildslave-options" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXDHyperlink target "other-buildslave-configuration" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXFHyperlink target "upgrading-an-existing-buildslave" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXGHyperlink target "buildslave-version-specific-notes" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX;Hyperlink target "launching-the-daemons" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineM"Utypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-1" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineM"Utypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-2" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineM"Utypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-3" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineM"Utypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-4" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMOUtypejduhg]rh)r }r (hLUh[}r (h]]h^]h_]h`]hc]uhMjhg]r hpX.Hyperlink target "logfiles" is not referenced.r r}r(hLUhMj ubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineM]Utypejduhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX.Hyperlink target "shutdown" is not referenced.rr}r(hLUhMjubahYhubahYjaubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rh)r}r (hLUh[}r!(h]]h^]h_]h`]hc]uhMjhg]r"hpX1Hyperlink target "maintenance" is not referenced.r#r$}r%(hLUhMjubahYhubahYjaubhI)r&}r'(hLUh[}r((h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]r)h)r*}r+(hLUh[}r,(h]]h^]h_]h`]hc]uhMj&hg]r-hpX5Hyperlink target "troubleshooting" is not referenced.r.r/}r0(hLUhMj*ubahYhubahYjaubhI)r1}r2(hLUh[}r3(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]r4h)r5}r6(hLUh[}r7(h]]h^]h_]h`]hc]uhMj1hg]r8hpX=Hyperlink target "starting-the-buildslave" is not referenced.r9r:}r;(hLUhMj5ubahYhubahYjaubhI)r<}r=(hLUh[}r>(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]r?h)r@}rA(hLUh[}rB(h]]h^]h_]h`]hc]uhMj<hg]rChpX-Hyperlink target "index-5" is not referenced.rDrE}rF(hLUhMj@ubahYhubahYjaubhI)rG}rH(hLUh[}rI(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rJh)rK}rL(hLUh[}rM(h]]h^]h_]h`]hc]uhMjGhg]rNhpX-Hyperlink target "index-6" is not referenced.rOrP}rQ(hLUhMjKubahYhubahYjaubhI)rR}rS(hLUh[}rT(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rUh)rV}rW(hLUh[}rX(h]]h^]h_]h`]hc]uhMjRhg]rYhpX-Hyperlink target "index-7" is not referenced.rZr[}r\(hLUhMjVubahYhubahYjaubhI)r]}r^(hLUh[}r_(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]r`h)ra}rb(hLUh[}rc(h]]h^]h_]h`]hc]uhMj]hg]rdhpXCHyperlink target "connecting-to-the-buildmaster" is not referenced.rerf}rg(hLUhMjaubahYhubahYjaubhI)rh}ri(hLUh[}rj(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejduhg]rkh)rl}rm(hLUh[}rn(h]]h^]h_]h`]hc]uhMjhhg]rohpX5Hyperlink target "contrib-scripts" is not referenced.rprq}rr(hLUhMjlubahYhubahYjaubeUreporterrsNUid_startrtKU autofootnotesru]rvjaU citation_refsrw}rxUindirect_targetsry]rzUsettingsr{(cdocutils.frontend Values r|or}}r~(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhmNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/installation.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jOjKj j jEjAj)j*j2 j3 j j jhjjjjj j hzh{jjj j jjjjjjjjj`j[jjjjjSjOjjj/j*j8 j3 jjjjjhjhjUhOhhj}hhh{jjjjjJjMjhjkjjjDjGjjjZj[jihjjj j hbhRj j j'j#jBj>hhj j* j j jjjTjUjjj j jjjjjjjpjkjjjEjFj\jUjMjFjjj jj| j j<j8jT j[ j? jF jjjJjFjjhhOjg jn jjjkjj{jjjHjDjjjNjJjjjjjjjjjjjj jjuUsubstitution_namesr}rhYhfh[}r(h]]h`]h_]UsourcehWh^]hc]uU footnotesr]rUrefidsr}r(j]rjaj]rjaj)]rj&aj2 ]rj/ aj]rjajT]rjQaj]rjaj]rjah]rhaj}]rhajE]rjBajj]rjgaj ]rj aj]rhajZ]rjWaj]rjaj ]rjaj]rjaj ]rj ahz]rhuaj]rjaj]rjaj]rjah]rhaj]rjauub.PK7D]ޔ0<0<5buildbot-v0.8.9/.doctrees/manual/introduction.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XgplqXbuildslave connectionsqNXstatus delivery architectureqNX introductionq Xhistory and philosophyq NXbuildslave-connectionsq X control-flowq Xsystem-architectureq Xsystem architectureqNXstatus-delivery-architectureqXbuildmaster architectureqNXbuildmaster-architectureqXhistory-and-philosophyqX control flowqNuUsubstitution_defsq}qUparse_messagesq]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedq KhhUsourceq!cdocutils.nodes reprunicode q"XT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/introduction.rstq#q$}q%bUexpect_referenced_by_nameq&}q'h cdocutils.nodes target q()q)}q*(hX.. _Introduction:hhh!h$Utagnameq+Utargetq,U attributesq-}q.(Uidsq/]Ubackrefsq0]Udupnamesq1]Uclassesq2]Unamesq3]Urefidq4U introductionq5uUlineq6KUdocumentq7hUchildrenq8]ubsh+Usectionq9h-}q:(h1]q;X introductionqeh3]q?h auh6Kh7hUexpect_referenced_by_idq@}qAh5h)sh8]qB(cdocutils.nodes title qC)qD}qE(hX IntroductionqFhhh!h$h+UtitleqGh-}qH(h1]h2]h0]h/]h3]uh6Kh7hh8]qIcdocutils.nodes Text qJX IntroductionqKqL}qM(hhFhhDubaubcdocutils.nodes paragraph qN)qO}qP(hXBuildBot is a system to automate the compile/test cycle required by most software projects to validate code changes. By automatically rebuilding and testing the tree each time something has changed, build problems are pinpointed quickly, before other developers are inconvenienced by the failure. The guilty developer can be identified and harassed without human intervention. By running the builds on a variety of platforms, developers who do not have the facilities to test their changes everywhere before checkin will at least know shortly afterwards whether they have broken the build or not. Warning counts, lint checks, image size, compile time, and other build parameters can be tracked over time, are more visible, and are therefore easier to improve.qQhhh!h$h+U paragraphqRh-}qS(h1]h2]h0]h/]h3]uh6Kh7hh8]qThJXBuildBot is a system to automate the compile/test cycle required by most software projects to validate code changes. By automatically rebuilding and testing the tree each time something has changed, build problems are pinpointed quickly, before other developers are inconvenienced by the failure. The guilty developer can be identified and harassed without human intervention. By running the builds on a variety of platforms, developers who do not have the facilities to test their changes everywhere before checkin will at least know shortly afterwards whether they have broken the build or not. Warning counts, lint checks, image size, compile time, and other build parameters can be tracked over time, are more visible, and are therefore easier to improve.qUqV}qW(hhQhhOubaubhN)qX}qY(hXBThe overall goal is to reduce tree breakage and provide a platform to run tests or code-quality checks that are too annoying or pedantic for any human to waste their time with. Developers get immediate (and potentially public) feedback about their changes, encouraging them to be more careful about testing before checkin.qZhhh!h$h+hRh-}q[(h1]h2]h0]h/]h3]uh6Kh7hh8]q\hJXBThe overall goal is to reduce tree breakage and provide a platform to run tests or code-quality checks that are too annoying or pedantic for any human to waste their time with. Developers get immediate (and potentially public) feedback about their changes, encouraging them to be more careful about testing before checkin.q]q^}q_(hhZhhXubaubhN)q`}qa(hX Features:qbhhh!h$h+hRh-}qc(h1]h2]h0]h/]h3]uh6Kh7hh8]qdhJX Features:qeqf}qg(hhbhh`ubaubcdocutils.nodes bullet_list qh)qi}qj(hUhhh!h$h+U bullet_listqkh-}ql(UbulletqmX*h/]h0]h1]h2]h3]uh6Kh7hh8]qn(cdocutils.nodes list_item qo)qp}qq(hX*run builds on a variety of slave platformsqrhhih!h$h+U list_itemqsh-}qt(h1]h2]h0]h/]h3]uh6Nh7hh8]quhN)qv}qw(hhrhhph!h$h+hRh-}qx(h1]h2]h0]h/]h3]uh6Kh8]qyhJX*run builds on a variety of slave platformsqzq{}q|(hhrhhvubaubaubho)q}}q~(hXCarbitrary build process: handles projects using C, Python, whateverqhhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hhhh}h!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6Kh8]qhJXCarbitrary build process: handles projects using C, Python, whateverqq}q(hhhhubaubaubho)q}q(hX-minimal host requirements: Python and Twistedqhhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hhhhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6Kh8]qhJX-minimal host requirements: Python and Twistedqq}q(hhhhubaubaubho)q}q(hX=slaves can be behind a firewall if they can still do checkoutqhhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hhhhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6Kh8]qhJX=slaves can be behind a firewall if they can still do checkoutqq}q(hhhhubaubaubho)q}q(hX=status delivery through web page, email, IRC, other protocolsqhhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hhhhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6Kh8]qhJX=status delivery through web page, email, IRC, other protocolsqq}q(hhhhubaubaubho)q}q(hX;track builds in progress, provide estimated completion timeqhhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hhhhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6Kh8]qhJX;track builds in progress, provide estimated completion timeqq}q(hhhhubaubaubho)q}q(hXCflexible configuration by subclassing generic build process classesqhhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hhhhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6K h8]qhJXCflexible configuration by subclassing generic build process classesq…q}q(hhhhubaubaubho)q}q(hXSdebug tools to force a new build, submit fake :class:`Change`\s, query slave statushhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hXSdebug tools to force a new build, submit fake :class:`Change`\s, query slave statushhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6K!h8]q(hJX.debug tools to force a new build, submit fake qͅq}q(hX.debug tools to force a new build, submit fake hhubcsphinx.addnodes pending_xref q)q}q(hX:class:`Change`qhhh!h$h+U pending_xrefqh-}q(UreftypeXclassUrefwarnq։U reftargetqXChangeU refdomainXpyqh/]h0]U refexplicith1]h2]h3]UrefdocqXmanual/introductionqUpy:classqNU py:moduleqNuh6K!h8]qcdocutils.nodes literal q)q}q(hhh-}q(h1]h2]q(UxrefqhXpy-classqeh0]h/]h3]uhhh8]qhJXChangeq慁q}q(hUhhubah+UliteralqubaubhJXs, query slave statusqꅁq}q(hX\s, query slave statushhubeubaubho)q}q(hXGreleased under the `GPL `_ hhih!h$h+hsh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qhN)q}q(hXFreleased under the `GPL `_hhh!h$h+hRh-}q(h1]h2]h0]h/]h3]uh6K#h8]q(hJXreleased under the qq}q(hXreleased under the hhubcdocutils.nodes reference q)q}q(hX3`GPL `_h-}q(UnameXGPLUrefuriqX*http://opensource.org/licenses/gpl-2.0.phpqh/]h0]h1]h2]h3]uhhh8]qhJXGPLqr}r(hUhhubah+U referencerubh()r}r(hX- h Khhh+h,h-}r(Urefurihh/]rUgplrah0]h1]h2]h3]rhauh8]ubeubaubeubh()r }r (hX.. _History-and-Philosophy:hhh!h$h+h,h-}r (h/]h0]h1]h2]h3]h4Uhistory-and-philosophyr uh6K%h7hh8]ubh)r }r(hUhhh!h$h&}rhj sh+h9h-}r(h1]h2]h0]h/]r(j Uid2reh3]r(h heuh6K(h7hh@}rj j sh8]r(hC)r}r(hXHistory and Philosophyrhj h!h$h+hGh-}r(h1]h2]h0]h/]h3]uh6K(h7hh8]rhJXHistory and Philosophyrr}r(hjhjubaubhN)r}r(hXThe Buildbot was inspired by a similar project built for a development team writing a cross-platform embedded system. The various components of the project were supposed to compile and run on several flavors of unix (linux, solaris, BSD), but individual developers had their own preferences and tended to stick to a single platform. From time to time, incompatibilities would sneak in (some unix platforms want to use :file:`string.h`, some prefer :file:`strings.h`), and then the tree would compile for some developers but not others. The buildbot was written to automate the human process of walking into the office, updating a tree, compiling (and discovering the breakage), finding the developer at fault, and complaining to them about the problem they had introduced. With multiple platforms it was difficult for developers to do the right thing (compile their potential change on all platforms); the buildbot offered a way to help.hj h!h$h+hRh-}r (h1]h2]h0]h/]h3]uh6K*h7hh8]r!(hJXThe Buildbot was inspired by a similar project built for a development team writing a cross-platform embedded system. The various components of the project were supposed to compile and run on several flavors of unix (linux, solaris, BSD), but individual developers had their own preferences and tended to stick to a single platform. From time to time, incompatibilities would sneak in (some unix platforms want to use r"r#}r$(hXThe Buildbot was inspired by a similar project built for a development team writing a cross-platform embedded system. The various components of the project were supposed to compile and run on several flavors of unix (linux, solaris, BSD), but individual developers had their own preferences and tended to stick to a single platform. From time to time, incompatibilities would sneak in (some unix platforms want to use hjubh)r%}r&(hUh-}r'(h/]h0]h1]h2]r(Xfiler)aUrolej)h3]uhjh8]r*hJXstring.hr+r,}r-(hXstring.hhj%ubah+hubhJX, some prefer r.r/}r0(hX, some prefer hjubh)r1}r2(hUh-}r3(h/]h0]h1]h2]r4Xfiler5aUrolej5h3]uhjh8]r6hJX strings.hr7r8}r9(hX strings.hhj1ubah+hubhJX), and then the tree would compile for some developers but not others. The buildbot was written to automate the human process of walking into the office, updating a tree, compiling (and discovering the breakage), finding the developer at fault, and complaining to them about the problem they had introduced. With multiple platforms it was difficult for developers to do the right thing (compile their potential change on all platforms); the buildbot offered a way to help.r:r;}r<(hX), and then the tree would compile for some developers but not others. The buildbot was written to automate the human process of walking into the office, updating a tree, compiling (and discovering the breakage), finding the developer at fault, and complaining to them about the problem they had introduced. With multiple platforms it was difficult for developers to do the right thing (compile their potential change on all platforms); the buildbot offered a way to help.hjubeubhN)r=}r>(hX&Another problem was when programmers would change the behavior of a library without warning its users, or change internal aspects that other code was (unfortunately) depending upon. Adding unit tests to the codebase helps here: if an application's unit tests pass despite changes in the libraries it uses, you can have more confidence that the library changes haven't broken anything. Many developers complained that the unit tests were inconvenient or took too long to run: having the buildbot run them reduces the developer's workload to a minimum.r?hj h!h$h+hRh-}r@(h1]h2]h0]h/]h3]uh6K9h7hh8]rAhJX&Another problem was when programmers would change the behavior of a library without warning its users, or change internal aspects that other code was (unfortunately) depending upon. Adding unit tests to the codebase helps here: if an application's unit tests pass despite changes in the libraries it uses, you can have more confidence that the library changes haven't broken anything. Many developers complained that the unit tests were inconvenient or took too long to run: having the buildbot run them reduces the developer's workload to a minimum.rBrC}rD(hj?hj=ubaubhN)rE}rF(hXIn general, having more visibility into the project is always good, and automation makes it easier for developers to do the right thing. When everyone can see the status of the project, developers are encouraged to keep the tree in good working order. Unit tests that aren't run on a regular basis tend to suffer from bitrot just like code does: exercising them on a regular basis helps to keep them functioning and useful.rGhj h!h$h+hRh-}rH(h1]h2]h0]h/]h3]uh6KCh7hh8]rIhJXIn general, having more visibility into the project is always good, and automation makes it easier for developers to do the right thing. When everyone can see the status of the project, developers are encouraged to keep the tree in good working order. Unit tests that aren't run on a regular basis tend to suffer from bitrot just like code does: exercising them on a regular basis helps to keep them functioning and useful.rJrK}rL(hjGhjEubaubhN)rM}rN(hXyThe current version of the Buildbot is additionally targeted at distributed free-software projects, where resources and platforms are only available when provided by interested volunteers. The buildslaves are designed to require an absolute minimum of configuration, reducing the effort a potential volunteer needs to expend to be able to contribute a new test environment to the project. The goal is for anyone who wishes that a given project would run on their favorite platform should be able to offer that project a buildslave, running on that platform, where they can verify that their portability code works, and keeps working.rOhj h!h$h+hRh-}rP(h1]h2]h0]h/]h3]uh6KKh7hh8]rQhJXyThe current version of the Buildbot is additionally targeted at distributed free-software projects, where resources and platforms are only available when provided by interested volunteers. The buildslaves are designed to require an absolute minimum of configuration, reducing the effort a potential volunteer needs to expend to be able to contribute a new test environment to the project. The goal is for anyone who wishes that a given project would run on their favorite platform should be able to offer that project a buildslave, running on that platform, where they can verify that their portability code works, and keeps working.rRrS}rT(hjOhjMubaubh()rU}rV(hX.. _System-Architecture:hj h!h$h+h,h-}rW(h/]h0]h1]h2]h3]h4Usystem-architecturerXuh6KVh7hh8]ubeubh)rY}rZ(hUhhh!h$h&}r[h jUsh+h9h-}r\(h1]h2]h0]h/]r](jXUid3r^eh3]r_(hh euh6KYh7hh@}r`jXjUsh8]ra(hC)rb}rc(hXSystem ArchitecturerdhjYh!h$h+hGh-}re(h1]h2]h0]h/]h3]uh6KYh7hh8]rfhJXSystem Architecturergrh}ri(hjdhjbubaubhN)rj}rk(hXThe Buildbot consists of a single *buildmaster* and one or more *buildslaves*, connected in a star topology. The buildmaster makes all decisions about what, when, and how to build. It sends commands to be run on the build slaves, which simply execute the commands and return the results. (certain steps involve more local decision making, where the overhead of sending a lot of commands back and forth would be inappropriate, but in general the buildmaster is responsible for everything).hjYh!h$h+hRh-}rl(h1]h2]h0]h/]h3]uh6K[h7hh8]rm(hJX"The Buildbot consists of a single rnro}rp(hX"The Buildbot consists of a single hjjubcdocutils.nodes emphasis rq)rr}rs(hX *buildmaster*h-}rt(h1]h2]h0]h/]h3]uhjjh8]ruhJX buildmasterrvrw}rx(hUhjrubah+UemphasisryubhJX and one or more rzr{}r|(hX and one or more hjjubjq)r}}r~(hX *buildslaves*h-}r(h1]h2]h0]h/]h3]uhjjh8]rhJX buildslavesrr}r(hUhj}ubah+jyubhJX, connected in a star topology. The buildmaster makes all decisions about what, when, and how to build. It sends commands to be run on the build slaves, which simply execute the commands and return the results. (certain steps involve more local decision making, where the overhead of sending a lot of commands back and forth would be inappropriate, but in general the buildmaster is responsible for everything).rr}r(hX, connected in a star topology. The buildmaster makes all decisions about what, when, and how to build. It sends commands to be run on the build slaves, which simply execute the commands and return the results. (certain steps involve more local decision making, where the overhead of sending a lot of commands back and forth would be inappropriate, but in general the buildmaster is responsible for everything).hjjubeubhN)r}r(hXThe buildmaster is usually fed :class:`Change`\s by some sort of version control system (:ref:`change-sources`), which may cause builds to be run. As the builds are performed, various status messages are produced, which are then sent to any registered :ref:`status-targets`.hjYh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kdh7hh8]r(hJXThe buildmaster is usually fed rr}r(hXThe buildmaster is usually fed hjubh)r}r(hX:class:`Change`rhjh!h$h+hh-}r(UreftypeXclassh։hXChangeU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kdh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXChangerr}r(hUhjubah+hubaubhJX*s by some sort of version control system (rr}r(hX+\s by some sort of version control system (hjubh)r}r(hX:ref:`change-sources`rhjh!h$h+hh-}r(UreftypeXrefhֈhXchange-sourcesU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh6Kdh8]rjq)r}r(hjh-}r(h1]h2]r(hjXstd-refreh0]h/]h3]uhjh8]rhJXchange-sourcesrr}r(hUhjubah+jyubaubhJX), which may cause builds to be run. As the builds are performed, various status messages are produced, which are then sent to any registered rr}r(hX), which may cause builds to be run. As the builds are performed, various status messages are produced, which are then sent to any registered hjubh)r}r(hX:ref:`status-targets`rhjh!h$h+hh-}r(UreftypeXrefhֈhXstatus-targetsU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh6Kdh8]rjq)r}r(hjh-}r(h1]h2]r(hjXstd-refreh0]h/]h3]uhjh8]rhJXstatus-targetsrr}r(hUhjubah+jyubaubhJX.r}r(hX.hjubeubcdocutils.nodes image r)r}r(hX8.. image:: _images/overview.* :alt: Overview Diagram hjYh!h$h+Uimagerh-}r(UuriXmanual/_images/overview.*h/]h0]h1]h2]U candidatesr}r(U image/pngXmanual/_images/overview.pngrU image/svg+xmlrXmanual/_images/overview.svgruh3]Ualth"XOverview Diagramrr}rbuh6Nh7hh8]ubhN)r}r(hXjThe buildmaster is configured and maintained by the *buildmaster admin*, who is generally the project team member responsible for build process issues. Each buildslave is maintained by a *buildslave admin*, who do not need to be quite as involved. Generally slaves are run by anyone who has an interest in seeing the project work well on their favorite platform.hjYh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Klh7hh8]r(hJX4The buildmaster is configured and maintained by the rr}r(hX4The buildmaster is configured and maintained by the hjubjq)r}r(hX*buildmaster admin*h-}r(h1]h2]h0]h/]h3]uhjh8]rhJXbuildmaster adminrr}r(hUhjubah+jyubhJXt, who is generally the project team member responsible for build process issues. Each buildslave is maintained by a rr}r(hXt, who is generally the project team member responsible for build process issues. Each buildslave is maintained by a hjubjq)r}r(hX*buildslave admin*h-}r(h1]h2]h0]h/]h3]uhjh8]rhJXbuildslave adminrr}r(hUhjubah+jyubhJX, who do not need to be quite as involved. Generally slaves are run by anyone who has an interest in seeing the project work well on their favorite platform.rr}r(hX, who do not need to be quite as involved. Generally slaves are run by anyone who has an interest in seeing the project work well on their favorite platform.hjubeubh()r}r(hX.. _BuildSlave-Connections:hjYh!h$h+h,h-}r(h/]h0]h1]h2]h3]h4Ubuildslave-connectionsruh6Ksh7hh8]ubh)r}r(hUhjYh!h$h&}rh jsh+h9h-}r(h1]h2]h0]h/]r(jUid4reh3]r(hh euh6Kvh7hh@}rjjsh8]r(hC)r}r(hXBuildSlave Connectionsrhjh!h$h+hGh-}r(h1]h2]h0]h/]h3]uh6Kvh7hh8]rhJXBuildSlave Connectionsrr}r(hjhjubaubhN)r}r(hXEThe buildslaves are typically run on a variety of separate machines, at least one per platform of interest. These machines connect to the buildmaster over a TCP connection to a publically-visible port. As a result, the buildslaves can live behind a NAT box or similar firewalls, as long as they can get to buildmaster. The TCP connections are initiated by the buildslave and accepted by the buildmaster, but commands and results travel both ways within this connection. The buildmaster is always in charge, so all commands travel exclusively from the buildmaster to the buildslave.rhjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kxh7hh8]rhJXEThe buildslaves are typically run on a variety of separate machines, at least one per platform of interest. These machines connect to the buildmaster over a TCP connection to a publically-visible port. As a result, the buildslaves can live behind a NAT box or similar firewalls, as long as they can get to buildmaster. The TCP connections are initiated by the buildslave and accepted by the buildmaster, but commands and results travel both ways within this connection. The buildmaster is always in charge, so all commands travel exclusively from the buildmaster to the buildslave.rr}r(hjhjubaubhN)r}r (hXTo perform builds, the buildslaves must typically obtain source code from a CVS/SVN/etc repository. Therefore they must also be able to reach the repository. The buildmaster provides instructions for performing builds, but does not provide the source code itself.r hjh!h$h+hRh-}r (h1]h2]h0]h/]h3]uh6Kh7hh8]r hJXTo perform builds, the buildslaves must typically obtain source code from a CVS/SVN/etc repository. Therefore they must also be able to reach the repository. The buildmaster provides instructions for performing builds, but does not provide the source code itself.r r}r(hj hjubaubj)r}r(hX<.. image:: _images/slaves.* :alt: BuildSlave Connections hjh!h$h+jh-}r(UuriXmanual/_images/slaves.*h/]h0]h1]h2]j}r(U image/pngXmanual/_images/slaves.pngrjXmanual/_images/slaves.svgruh3]Ualth"XBuildSlave Connectionsrr}rbuh6Nh7hh8]ubh()r}r(hX.. _Buildmaster-Architecture:hjh!h$h+h,h-}r(h/]h0]h1]h2]h3]h4Ubuildmaster-architectureruh6Kh7hh8]ubeubh)r}r(hUhjYh!h$h&}rhjsh+h9h-}r (h1]h2]h0]h/]r!(jUid5r"eh3]r#(hheuh6Kh7hh@}r$jjsh8]r%(hC)r&}r'(hXBuildmaster Architecturer(hjh!h$h+hGh-}r)(h1]h2]h0]h/]h3]uh6Kh7hh8]r*hJXBuildmaster Architecturer+r,}r-(hj(hj&ubaubhN)r.}r/(hX+The buildmaster consists of several pieces:r0hjh!h$h+hRh-}r1(h1]h2]h0]h/]h3]uh6Kh7hh8]r2hJX+The buildmaster consists of several pieces:r3r4}r5(hj0hj.ubaubj)r6}r7(hX>.. image:: _images/master.* :alt: Buildmaster Architecture hjh!h$h+jh-}r8(UuriXmanual/_images/master.*h/]h0]h1]h2]j}r9(U image/pngXmanual/_images/master.pngr:jXmanual/_images/master.svgr;uh3]Ualth"XBuildmaster Architecturer<r=}r>buh6Nh7hh8]ubcdocutils.nodes definition_list r?)r@}rA(hUhjh!h$h+Udefinition_listrBh-}rC(h1]h2]h0]h/]h3]uh6Nh7hh8]rD(cdocutils.nodes definition_list_item rE)rF}rG(hX-Change Sources Which create a Change object each time something is modified in the VC repository. Most :class:`ChangeSource`\s listen for messages from a hook script of some sort. Some sources actively poll the repository on a regular basis. All :class:`Change`\s are fed to the :class:`Scheduler`\s. hj@h!h$h+Udefinition_list_itemrHh-}rI(h1]h2]h0]h/]h3]uh6Kh8]rJ(cdocutils.nodes term rK)rL}rM(hXChange SourcesrNhjFh!h$h+UtermrOh-}rP(h1]h2]h0]h/]h3]uh6Kh8]rQhJXChange SourcesrRrS}rT(hjNhjLubaubcdocutils.nodes definition rU)rV}rW(hUh-}rX(h1]h2]h0]h/]h3]uhjFh8]rYhN)rZ}r[(hXWhich create a Change object each time something is modified in the VC repository. Most :class:`ChangeSource`\s listen for messages from a hook script of some sort. Some sources actively poll the repository on a regular basis. All :class:`Change`\s are fed to the :class:`Scheduler`\s.hjVh!h$h+hRh-}r\(h1]h2]h0]h/]h3]uh6Kh8]r](hJXXWhich create a Change object each time something is modified in the VC repository. Most r^r_}r`(hXXWhich create a Change object each time something is modified in the VC repository. Most hjZubh)ra}rb(hX:class:`ChangeSource`rchjZh!h$h+hh-}rd(UreftypeXclassh։hX ChangeSourceU refdomainXpyreh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rfh)rg}rh(hjch-}ri(h1]h2]rj(hjeXpy-classrkeh0]h/]h3]uhjah8]rlhJX ChangeSourcermrn}ro(hUhjgubah+hubaubhJXys listen for messages from a hook script of some sort. Some sources actively poll the repository on a regular basis. All rprq}rr(hXz\s listen for messages from a hook script of some sort. Some sources actively poll the repository on a regular basis. All hjZubh)rs}rt(hX:class:`Change`ruhjZh!h$h+hh-}rv(UreftypeXclassh։hXChangeU refdomainXpyrwh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rxh)ry}rz(hjuh-}r{(h1]h2]r|(hjwXpy-classr}eh0]h/]h3]uhjsh8]r~hJXChangerr}r(hUhjyubah+hubaubhJXs are fed to the rr}r(hX\s are fed to the hjZubh)r}r(hX:class:`Scheduler`rhjZh!h$h+hh-}r(UreftypeXclassh։hX SchedulerU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX Schedulerrr}r(hUhjubah+hubaubhJXs.rr}r(hX\s.hjZubeubah+U definitionrubeubjE)r}r(hXSchedulers Which decide when builds should be performed. They collect :class:`Change`\s into :class:`BuildRequest`\s, which are then queued for delivery to :class:`Builders` until a buildslave is available. hj@h!h$h+jHh-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(jK)r}r(hX Schedulersrhjh!h$h+jOh-}r(h1]h2]h0]h/]h3]uh6Kh8]rhJX Schedulersrr}r(hjhjubaubjU)r}r(hUh-}r(h1]h2]h0]h/]h3]uhjh8]rhN)r}r(hXWhich decide when builds should be performed. They collect :class:`Change`\s into :class:`BuildRequest`\s, which are then queued for delivery to :class:`Builders` until a buildslave is available.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kh8]r(hJX;Which decide when builds should be performed. They collect rr}r(hX;Which decide when builds should be performed. They collect hjubh)r}r(hX:class:`Change`rhjh!h$h+hh-}r(UreftypeXclassh։hXChangeU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXChangerr}r(hUhjubah+hubaubhJXs into rr}r(hX\s into hjubh)r}r(hX:class:`BuildRequest`rhjh!h$h+hh-}r(UreftypeXclassh։hX BuildRequestU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX BuildRequestrr}r(hUhjubah+hubaubhJX)s, which are then queued for delivery to rr}r(hX*\s, which are then queued for delivery to hjubh)r}r(hX:class:`Builders`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildersU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildersrr}r(hUhjubah+hubaubhJX! until a buildslave is available.rr}r(hX! until a buildslave is available.hjubeubah+jubeubjE)r}r(hXBuilders Which control exactly *how* each build is performed (with a series of :class:`BuildStep`\s, configured in a :class:`BuildFactory`). Each :class:`Build` is run on a single buildslave. hj@h!h$h+jHh-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(jK)r}r(hXBuildersrhjh!h$h+jOh-}r(h1]h2]h0]h/]h3]uh6Kh8]rhJXBuildersrr}r(hjhjubaubjU)r}r(hUh-}r(h1]h2]h0]h/]h3]uhjh8]rhN)r}r(hXWhich control exactly *how* each build is performed (with a series of :class:`BuildStep`\s, configured in a :class:`BuildFactory`). Each :class:`Build` is run on a single buildslave.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kh8]r(hJXWhich control exactly rr}r(hXWhich control exactly hjubjq)r}r(hX*how*h-}r(h1]h2]h0]h/]h3]uhjh8]rhJXhowrr}r(hUhjubah+jyubhJX+ each build is performed (with a series of rr}r(hX+ each build is performed (with a series of hjubh)r}r(hX:class:`BuildStep`rhjh!h$h+hh-}r (UreftypeXclassh։hX BuildStepU refdomainXpyr h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r h)r }r (hjh-}r(h1]h2]r(hj Xpy-classreh0]h/]h3]uhjh8]rhJX BuildSteprr}r(hUhj ubah+hubaubhJXs, configured in a rr}r(hX\s, configured in a hjubh)r}r(hX:class:`BuildFactory`rhjh!h$h+hh-}r(UreftypeXclassh։hX BuildFactoryU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r (h1]h2]r!(hjXpy-classr"eh0]h/]h3]uhjh8]r#hJX BuildFactoryr$r%}r&(hUhjubah+hubaubhJX). Each r'r(}r)(hX). Each hjubh)r*}r+(hX:class:`Build`r,hjh!h$h+hh-}r-(UreftypeXclassh։hXBuildU refdomainXpyr.h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r/h)r0}r1(hj,h-}r2(h1]h2]r3(hj.Xpy-classr4eh0]h/]h3]uhj*h8]r5hJXBuildr6r7}r8(hUhj0ubah+hubaubhJX is run on a single buildslave.r9r:}r;(hX is run on a single buildslave.hjubeubah+jubeubjE)r<}r=(hXmStatus plugins Which deliver information about the build results through protocols like HTTP, mail, and IRC. hj@h!h$h+jHh-}r>(h1]h2]h0]h/]h3]uh6Kh7hh8]r?(jK)r@}rA(hXStatus pluginsrBhj<h!h$h+jOh-}rC(h1]h2]h0]h/]h3]uh6Kh8]rDhJXStatus pluginsrErF}rG(hjBhj@ubaubjU)rH}rI(hUh-}rJ(h1]h2]h0]h/]h3]uhj<h8]rKhN)rL}rM(hX]Which deliver information about the build results through protocols like HTTP, mail, and IRC.rNhjHh!h$h+hRh-}rO(h1]h2]h0]h/]h3]uh6Kh8]rPhJX]Which deliver information about the build results through protocols like HTTP, mail, and IRC.rQrR}rS(hjNhjLubaubah+jubeubeubhN)rT}rU(hXEach :class:`Builder` is configured with a list of :class:`BuildSlave`\s that it will use for its builds. These buildslaves are expected to behave identically: the only reason to use multiple :class:`BuildSlave`\s for a single :class:`Builder` is to provide a measure of load-balancing.hjh!h$h+hRh-}rV(h1]h2]h0]h/]h3]uh6Kh7hh8]rW(hJXEach rXrY}rZ(hXEach hjTubh)r[}r\(hX:class:`Builder`r]hjTh!h$h+hh-}r^(UreftypeXclassh։hXBuilderU refdomainXpyr_h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r`h)ra}rb(hj]h-}rc(h1]h2]rd(hj_Xpy-classreeh0]h/]h3]uhj[h8]rfhJXBuilderrgrh}ri(hUhjaubah+hubaubhJX is configured with a list of rjrk}rl(hX is configured with a list of hjTubh)rm}rn(hX:class:`BuildSlave`rohjTh!h$h+hh-}rp(UreftypeXclassh։hX BuildSlaveU refdomainXpyrqh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rrh)rs}rt(hjoh-}ru(h1]h2]rv(hjqXpy-classrweh0]h/]h3]uhjmh8]rxhJX BuildSlaveryrz}r{(hUhjsubah+hubaubhJXys that it will use for its builds. These buildslaves are expected to behave identically: the only reason to use multiple r|r}}r~(hXz\s that it will use for its builds. These buildslaves are expected to behave identically: the only reason to use multiple hjTubh)r}r(hX:class:`BuildSlave`rhjTh!h$h+hh-}r(UreftypeXclassh։hX BuildSlaveU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX BuildSlaverr}r(hUhjubah+hubaubhJXs for a single rr}r(hX\s for a single hjTubh)r}r(hX:class:`Builder`rhjTh!h$h+hh-}r(UreftypeXclassh։hXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuilderrr}r(hUhjubah+hubaubhJX+ is to provide a measure of load-balancing.rr}r(hX+ is to provide a measure of load-balancing.hjTubeubhN)r}r(hXBWithin a single :class:`BuildSlave`, each :class:`Builder` creates its own :class:`SlaveBuilder` instance. These :class:`SlaveBuilder`\s operate independently from each other. Each gets its own base directory to work in. It is quite common to have many :class:`Builder`\s sharing the same buildslave. For example, there might be two buildslaves: one for i386, and a second for PowerPC. There may then be a pair of :class:`Builder`\s that do a full compile/test run, one for each architecture, and a lone :class:`Builder` that creates snapshot source tarballs if the full builders complete successfully. The full builders would each run on a single buildslave, whereas the tarball creation step might run on either buildslave (since the platform doesn't matter when creating source tarballs). In this case, the mapping would look like:hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hJXWithin a single rr}r(hXWithin a single hjubh)r}r(hX:class:`BuildSlave`rhjh!h$h+hh-}r(UreftypeXclassh։hX BuildSlaveU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX BuildSlaverr}r(hUhjubah+hubaubhJX, each rr}r(hX, each hjubh)r}r(hX:class:`Builder`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuilderrr}r(hUhjubah+hubaubhJX creates its own rr}r(hX creates its own hjubh)r}r(hX:class:`SlaveBuilder`rhjh!h$h+hh-}r(UreftypeXclassh։hX SlaveBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX SlaveBuilderrr}r(hUhjubah+hubaubhJX instance. These rr}r(hX instance. These hjubh)r}r(hX:class:`SlaveBuilder`rhjh!h$h+hh-}r(UreftypeXclassh։hX SlaveBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX SlaveBuilderrr}r(hUhjubah+hubaubhJXvs operate independently from each other. Each gets its own base directory to work in. It is quite common to have many rr}r(hXw\s operate independently from each other. Each gets its own base directory to work in. It is quite common to have many hjubh)r}r(hX:class:`Builder`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuilderrr}r(hUhjubah+hubaubhJXs sharing the same buildslave. For example, there might be two buildslaves: one for i386, and a second for PowerPC. There may then be a pair of rr}r(hX\s sharing the same buildslave. For example, there might be two buildslaves: one for i386, and a second for PowerPC. There may then be a pair of hjubh)r}r(hX:class:`Builder`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r h)r }r (hjh-}r (h1]h2]r (hjXpy-classreh0]h/]h3]uhjh8]rhJXBuilderrr}r(hUhj ubah+hubaubhJXIs that do a full compile/test run, one for each architecture, and a lone rr}r(hXJ\s that do a full compile/test run, one for each architecture, and a lone hjubh)r}r(hX:class:`Builder`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classr eh0]h/]h3]uhjh8]r!hJXBuilderr"r#}r$(hUhjubah+hubaubhJX: that creates snapshot source tarballs if the full builders complete successfully. The full builders would each run on a single buildslave, whereas the tarball creation step might run on either buildslave (since the platform doesn't matter when creating source tarballs). In this case, the mapping would look like:r%r&}r'(hX: that creates snapshot source tarballs if the full builders complete successfully. The full builders would each run on a single buildslave, whereas the tarball creation step might run on either buildslave (since the platform doesn't matter when creating source tarballs). In this case, the mapping would look like:hjubeubcdocutils.nodes literal_block r()r)}r*(hXBuilder(full-i386) -> BuildSlaves(slave-i386) Builder(full-ppc) -> BuildSlaves(slave-ppc) Builder(source-tarball) -> BuildSlaves(slave-i386, slave-ppc)hjh!h$h+U literal_blockr+h-}r,(Ulinenosr-Ulanguager.XnoneU xml:spacer/Upreserver0h/]h0]h1]h2]h3]uh6Kh7hh8]r1hJXBuilder(full-i386) -> BuildSlaves(slave-i386) Builder(full-ppc) -> BuildSlaves(slave-ppc) Builder(source-tarball) -> BuildSlaves(slave-i386, slave-ppc)r2r3}r4(hUhj)ubaubhN)r5}r6(hXand each :class:`BuildSlave` would have two :class:`SlaveBuilders` inside it, one for a full builder, and a second for the source-tarball builder.hjh!h$h+hRh-}r7(h1]h2]h0]h/]h3]uh6Kh7hh8]r8(hJX and each r9r:}r;(hX and each hj5ubh)r<}r=(hX:class:`BuildSlave`r>hj5h!h$h+hh-}r?(UreftypeXclassh։hX BuildSlaveU refdomainXpyr@h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rAh)rB}rC(hj>h-}rD(h1]h2]rE(hj@Xpy-classrFeh0]h/]h3]uhj<h8]rGhJX BuildSlaverHrI}rJ(hUhjBubah+hubaubhJX would have two rKrL}rM(hX would have two hj5ubh)rN}rO(hX:class:`SlaveBuilders`rPhj5h!h$h+hh-}rQ(UreftypeXclassh։hX SlaveBuildersU refdomainXpyrRh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rSh)rT}rU(hjPh-}rV(h1]h2]rW(hjRXpy-classrXeh0]h/]h3]uhjNh8]rYhJX SlaveBuildersrZr[}r\(hUhjTubah+hubaubhJXP inside it, one for a full builder, and a second for the source-tarball builder.r]r^}r_(hXP inside it, one for a full builder, and a second for the source-tarball builder.hj5ubeubhN)r`}ra(hXHOnce a :class:`SlaveBuilder` is available, the :class:`Builder` pulls one or more :class:`BuildRequest`\s off its incoming queue. (It may pull more than one if it determines that it can merge the requests together; for example, there may be multiple requests to build the current *HEAD* revision). These requests are merged into a single :class:`Build` instance, which includes the :class:`SourceStamp` that describes what exact version of the source code should be used for the build. The :class:`Build` is then randomly assigned to a free :class:`SlaveBuilder` and the build begins.hjh!h$h+hRh-}rb(h1]h2]h0]h/]h3]uh6Kh7hh8]rc(hJXOnce a rdre}rf(hXOnce a hj`ubh)rg}rh(hX:class:`SlaveBuilder`rihj`h!h$h+hh-}rj(UreftypeXclassh։hX SlaveBuilderU refdomainXpyrkh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rlh)rm}rn(hjih-}ro(h1]h2]rp(hjkXpy-classrqeh0]h/]h3]uhjgh8]rrhJX SlaveBuilderrsrt}ru(hUhjmubah+hubaubhJX is available, the rvrw}rx(hX is available, the hj`ubh)ry}rz(hX:class:`Builder`r{hj`h!h$h+hh-}r|(UreftypeXclassh։hXBuilderU refdomainXpyr}h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r~h)r}r(hj{h-}r(h1]h2]r(hj}Xpy-classreh0]h/]h3]uhjyh8]rhJXBuilderrr}r(hUhjubah+hubaubhJX pulls one or more rr}r(hX pulls one or more hj`ubh)r}r(hX:class:`BuildRequest`rhj`h!h$h+hh-}r(UreftypeXclassh։hX BuildRequestU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX BuildRequestrr}r(hUhjubah+hubaubhJXs off its incoming queue. (It may pull more than one if it determines that it can merge the requests together; for example, there may be multiple requests to build the current rr}r(hX\s off its incoming queue. (It may pull more than one if it determines that it can merge the requests together; for example, there may be multiple requests to build the current hj`ubjq)r}r(hX*HEAD*h-}r(h1]h2]h0]h/]h3]uhj`h8]rhJXHEADrr}r(hUhjubah+jyubhJX4 revision). These requests are merged into a single rr}r(hX4 revision). These requests are merged into a single hj`ubh)r}r(hX:class:`Build`rhj`h!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX instance, which includes the rr}r(hX instance, which includes the hj`ubh)r}r(hX:class:`SourceStamp`rhj`h!h$h+hh-}r(UreftypeXclassh։hX SourceStampU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX SourceStamprr}r(hUhjubah+hubaubhJXX that describes what exact version of the source code should be used for the build. The rr}r(hXX that describes what exact version of the source code should be used for the build. The hj`ubh)r}r(hX:class:`Build`rhj`h!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX% is then randomly assigned to a free rr}r(hX% is then randomly assigned to a free hj`ubh)r}r(hX:class:`SlaveBuilder`rhj`h!h$h+hh-}r(UreftypeXclassh։hX SlaveBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX SlaveBuilderrr}r(hUhjubah+hubaubhJX and the build begins.rr}r(hX and the build begins.hj`ubeubhN)r}r(hXgThe behaviour when :class:`BuildRequest`\s are merged can be customized, :ref:`Merging-Build-Requests`.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hJXThe behaviour when rr}r(hXThe behaviour when hjubh)r}r(hX:class:`BuildRequest`rhjh!h$h+hh-}r(UreftypeXclassh։hX BuildRequestU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX BuildRequestrr}r(hUhjubah+hubaubhJX s are merged can be customized, rr}r(hX!\s are merged can be customized, hjubh)r}r (hX:ref:`Merging-Build-Requests`r hjh!h$h+hh-}r (UreftypeXrefhֈhXmerging-build-requestsU refdomainXstdr h/]h0]U refexplicith1]h2]h3]hhuh6Kh8]r jq)r}r(hj h-}r(h1]h2]r(hj Xstd-refreh0]h/]h3]uhjh8]rhJXMerging-Build-Requestsrr}r(hUhjubah+jyubaubhJX.r}r(hX.hjubeubh()r}r(hX!.. _Status-Delivery-Architecture:hjh!h$h+h,h-}r(h/]h0]h1]h2]h3]h4Ustatus-delivery-architectureruh6Kh7hh8]ubeubh)r}r(hUhjYh!h$h&}rhjsh+h9h-}r (h1]h2]h0]h/]r!(jUid6r"eh3]r#(hheuh6Kh7hh@}r$jjsh8]r%(hC)r&}r'(hXStatus Delivery Architecturer(hjh!h$h+hGh-}r)(h1]h2]h0]h/]h3]uh6Kh7hh8]r*hJXStatus Delivery Architecturer+r,}r-(hj(hj&ubaubhN)r.}r/(hXThe buildmaster maintains a central :class:`Status` object, to which various status plugins are connected. Through this :class:`Status` object, a full hierarchy of build status objects can be obtained.hjh!h$h+hRh-}r0(h1]h2]h0]h/]h3]uh6Kh7hh8]r1(hJX$The buildmaster maintains a central r2r3}r4(hX$The buildmaster maintains a central hj.ubh)r5}r6(hX:class:`Status`r7hj.h!h$h+hh-}r8(UreftypeXclassh։hXStatusU refdomainXpyr9h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r:h)r;}r<(hj7h-}r=(h1]h2]r>(hj9Xpy-classr?eh0]h/]h3]uhj5h8]r@hJXStatusrArB}rC(hUhj;ubah+hubaubhJXE object, to which various status plugins are connected. Through this rDrE}rF(hXE object, to which various status plugins are connected. Through this hj.ubh)rG}rH(hX:class:`Status`rIhj.h!h$h+hh-}rJ(UreftypeXclassh։hXStatusU refdomainXpyrKh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rLh)rM}rN(hjIh-}rO(h1]h2]rP(hjKXpy-classrQeh0]h/]h3]uhjGh8]rRhJXStatusrSrT}rU(hUhjMubah+hubaubhJXB object, a full hierarchy of build status objects can be obtained.rVrW}rX(hXB object, a full hierarchy of build status objects can be obtained.hj.ubeubj)rY}rZ(hX5.. image:: _images/status.* :alt: Status Delivery hjh!h$h+jh-}r[(UuriXmanual/_images/status.*h/]h0]h1]h2]j}r\(U image/pngXmanual/_images/status.pngr]jXmanual/_images/status.svgr^uh3]Ualth"XStatus Deliveryr_r`}rabuh6Nh7hh8]ubhN)rb}rc(hXThe configuration file controls which status plugins are active. Each status plugin gets a reference to the top-level :class:`Status` object. From there they can request information on each :class:`Builder`, :class:`Build`, :class:`Step`, and :class:`LogFile`. This query-on-demand interface is used by the ``html.Waterfall`` plugin to create the main status page each time a web browser hits the main URL.hjh!h$h+hRh-}rd(h1]h2]h0]h/]h3]uh6Kh7hh8]re(hJXvThe configuration file controls which status plugins are active. Each status plugin gets a reference to the top-level rfrg}rh(hXvThe configuration file controls which status plugins are active. Each status plugin gets a reference to the top-level hjbubh)ri}rj(hX:class:`Status`rkhjbh!h$h+hh-}rl(UreftypeXclassh։hXStatusU refdomainXpyrmh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rnh)ro}rp(hjkh-}rq(h1]h2]rr(hjmXpy-classrseh0]h/]h3]uhjih8]rthJXStatusrurv}rw(hUhjoubah+hubaubhJX9 object. From there they can request information on each rxry}rz(hX9 object. From there they can request information on each hjbubh)r{}r|(hX:class:`Builder`r}hjbh!h$h+hh-}r~(UreftypeXclassh։hXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hj}h-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhj{h8]rhJXBuilderrr}r(hUhjubah+hubaubhJX, rr}r(hX, hjbubh)r}r(hX:class:`Build`rhjbh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX, rr}r(hX, hjbubh)r}r(hX :class:`Step`rhjbh!h$h+hh-}r(UreftypeXclassh։hXStepU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXSteprr}r(hUhjubah+hubaubhJX, and rr}r(hX, and hjbubh)r}r(hX:class:`LogFile`rhjbh!h$h+hh-}r(UreftypeXclassh։hXLogFileU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXLogFilerr}r(hUhjubah+hubaubhJX0. This query-on-demand interface is used by the rr}r(hX0. This query-on-demand interface is used by the hjbubh)r}r(hX``html.Waterfall``h-}r(h1]h2]h0]h/]h3]uhjbh8]rhJXhtml.Waterfallrr}r(hUhjubah+hubhJXQ plugin to create the main status page each time a web browser hits the main URL.rr}r(hXQ plugin to create the main status page each time a web browser hits the main URL.hjbubeubhN)r}r(hXThe status plugins can also subscribe to hear about new :class:`Build`\s as they occur: this is used by the :class:`MailNotifier` to create new email messages for each recently-completed :class:`Build`.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hJX8The status plugins can also subscribe to hear about new rr}r(hX8The status plugins can also subscribe to hear about new hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX%s as they occur: this is used by the rr}r(hX&\s as they occur: this is used by the hjubh)r}r(hX:class:`MailNotifier`rhjh!h$h+hh-}r(UreftypeXclassh։hX MailNotifierU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX MailNotifierrr}r(hUhjubah+hubaubhJX: to create new email messages for each recently-completed rr}r(hX: to create new email messages for each recently-completed hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX.r}r(hX.hjubeubhN)r }r (hXThe :class:`Status` object records the status of old builds on disk in the buildmaster's base directory. This allows it to return information about historical builds.hjh!h$h+hRh-}r (h1]h2]h0]h/]h3]uh6Kh7hh8]r (hJXThe r r}r(hXThe hj ubh)r}r(hX:class:`Status`rhj h!h$h+hh-}r(UreftypeXclassh։hXStatusU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXStatusrr}r(hUhjubah+hubaubhJX object records the status of old builds on disk in the buildmaster's base directory. This allows it to return information about historical builds.rr }r!(hX object records the status of old builds on disk in the buildmaster's base directory. This allows it to return information about historical builds.hj ubeubhN)r"}r#(hXThere are also status objects that correspond to :class:`Scheduler`\s and :class:`BuildSlave`\s. These allow status plugins to report information about upcoming builds, and the online/offline status of each buildslave.hjh!h$h+hRh-}r$(h1]h2]h0]h/]h3]uh6Kh7hh8]r%(hJX1There are also status objects that correspond to r&r'}r((hX1There are also status objects that correspond to hj"ubh)r)}r*(hX:class:`Scheduler`r+hj"h!h$h+hh-}r,(UreftypeXclassh։hX SchedulerU refdomainXpyr-h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r.h)r/}r0(hj+h-}r1(h1]h2]r2(hj-Xpy-classr3eh0]h/]h3]uhj)h8]r4hJX Schedulerr5r6}r7(hUhj/ubah+hubaubhJXs and r8r9}r:(hX\s and hj"ubh)r;}r<(hX:class:`BuildSlave`r=hj"h!h$h+hh-}r>(UreftypeXclassh։hX BuildSlaveU refdomainXpyr?h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]r@h)rA}rB(hj=h-}rC(h1]h2]rD(hj?Xpy-classrEeh0]h/]h3]uhj;h8]rFhJX BuildSlaverGrH}rI(hUhjAubah+hubaubhJX|s. These allow status plugins to report information about upcoming builds, and the online/offline status of each buildslave.rJrK}rL(hX}\s. These allow status plugins to report information about upcoming builds, and the online/offline status of each buildslave.hj"ubeubh()rM}rN(hX.. _Control-Flow:hjh!h$h+h,h-}rO(h/]h0]h1]h2]h3]h4U control-flowrPuh6Kh7hh8]ubeubeubh)rQ}rR(hUhhh!h$h&}rSh jMsh+h9h-}rT(h1]h2]h0]h/]rU(jPUid7rVeh3]rW(hh euh6Kh7hh@}rXjPjMsh8]rY(hC)rZ}r[(hX Control Flowr\hjQh!h$h+hGh-}r](h1]h2]h0]h/]h3]uh6Kh7hh8]r^hJX Control Flowr_r`}ra(hj\hjZubaubhN)rb}rc(hX"A day in the life of the buildbot:rdhjQh!h$h+hRh-}re(h1]h2]h0]h/]h3]uh6Kh7hh8]rfhJX"A day in the life of the buildbot:rgrh}ri(hjdhjbubaubhh)rj}rk(hUhjQh!h$h+hkh-}rl(hmX*h/]h0]h1]h2]h3]uh6Kh7hh8]rm(ho)rn}ro(hXKA developer commits some source code changes to the repository. A hook script or commit trigger of some sort sends information about this change to the buildmaster through one of its configured Change Sources. This notification might arrive via email, or over a network connection (either initiated by the buildmaster as it *subscribes* to changes, or by the commit trigger as it pushes :class:`Change`\s towards the buildmaster). The :class:`Change` contains information about who made the change, what files were modified, which revision contains the change, and any checkin comments. hjjh!h$h+hsh-}rp(h1]h2]h0]h/]h3]uh6Nh7hh8]rqhN)rr}rs(hXJA developer commits some source code changes to the repository. A hook script or commit trigger of some sort sends information about this change to the buildmaster through one of its configured Change Sources. This notification might arrive via email, or over a network connection (either initiated by the buildmaster as it *subscribes* to changes, or by the commit trigger as it pushes :class:`Change`\s towards the buildmaster). The :class:`Change` contains information about who made the change, what files were modified, which revision contains the change, and any checkin comments.hjnh!h$h+hRh-}rt(h1]h2]h0]h/]h3]uh6Kh8]ru(hJXDA developer commits some source code changes to the repository. A hook script or commit trigger of some sort sends information about this change to the buildmaster through one of its configured Change Sources. This notification might arrive via email, or over a network connection (either initiated by the buildmaster as it rvrw}rx(hXDA developer commits some source code changes to the repository. A hook script or commit trigger of some sort sends information about this change to the buildmaster through one of its configured Change Sources. This notification might arrive via email, or over a network connection (either initiated by the buildmaster as it hjrubjq)ry}rz(hX *subscribes*h-}r{(h1]h2]h0]h/]h3]uhjrh8]r|hJX subscribesr}r~}r(hUhjyubah+jyubhJX3 to changes, or by the commit trigger as it pushes rr}r(hX3 to changes, or by the commit trigger as it pushes hjrubh)r}r(hX:class:`Change`rhjrh!h$h+hh-}r(UreftypeXclassh։hXChangeU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXChangerr}r(hUhjubah+hubaubhJX s towards the buildmaster). The rr}r(hX!\s towards the buildmaster). The hjrubh)r}r(hX:class:`Change`rhjrh!h$h+hh-}r(UreftypeXclassh։hXChangeU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Kh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXChangerr}r(hUhjubah+hubaubhJX contains information about who made the change, what files were modified, which revision contains the change, and any checkin comments.rr}r(hX contains information about who made the change, what files were modified, which revision contains the change, and any checkin comments.hjrubeubaubho)r}r(hXThe buildmaster distributes this change to all of its configured :class:`Scheduler`\s. Any ``important`` changes cause the ``tree-stable-timer`` to be started, and the :class:`Change` is added to a list of those that will go into a new :class:`Build`. When the timer expires, a :class:`Build` is started on each of a set of configured Builders, all compiling/testing the same source code. Unless configured otherwise, all :class:`Build`\s run in parallel on the various buildslaves. hjjh!h$h+hsh-}r(h1]h2]h0]h/]h3]uh6Nh7hh8]rhN)r}r(hXThe buildmaster distributes this change to all of its configured :class:`Scheduler`\s. Any ``important`` changes cause the ``tree-stable-timer`` to be started, and the :class:`Change` is added to a list of those that will go into a new :class:`Build`. When the timer expires, a :class:`Build` is started on each of a set of configured Builders, all compiling/testing the same source code. Unless configured otherwise, all :class:`Build`\s run in parallel on the various buildslaves.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Mh8]r(hJXAThe buildmaster distributes this change to all of its configured rr}r(hXAThe buildmaster distributes this change to all of its configured hjubh)r}r(hX:class:`Scheduler`rhjh!h$h+hh-}r(UreftypeXclassh։hX SchedulerU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX Schedulerrr}r(hUhjubah+hubaubhJXs. Any rr}r(hX\s. Any hjubh)r}r(hX ``important``h-}r(h1]h2]h0]h/]h3]uhjh8]rhJX importantrr}r(hUhjubah+hubhJX changes cause the rr}r(hX changes cause the hjubh)r}r(hX``tree-stable-timer``h-}r(h1]h2]h0]h/]h3]uhjh8]rhJXtree-stable-timerrr}r(hUhjubah+hubhJX to be started, and the rr}r(hX to be started, and the hjubh)r}r(hX:class:`Change`rhjh!h$h+hh-}r(UreftypeXclassh։hXChangeU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXChangerr}r(hUhjubah+hubaubhJX5 is added to a list of those that will go into a new rr}r(hX5 is added to a list of those that will go into a new hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX. When the timer expires, a rr}r(hX. When the timer expires, a hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr }r (hUhjubah+hubaubhJX is started on each of a set of configured Builders, all compiling/testing the same source code. Unless configured otherwise, all r r }r (hX is started on each of a set of configured Builders, all compiling/testing the same source code. Unless configured otherwise, all hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX-s run in parallel on the various buildslaves.rr}r(hX.\s run in parallel on the various buildslaves.hjubeubaubho)r }r!(hXThe :class:`Build` consists of a series of :class:`Step`\s. Each :class:`Step` causes some number of commands to be invoked on the remote buildslave associated with that :class:`Builder`. The first step is almost always to perform a checkout of the appropriate revision from the same VC system that produced the :class:`Change`. The rest generally perform a compile and run unit tests. As each :class:`Step` runs, the buildslave reports back command output and return status to the buildmaster. hjjh!h$h+hsh-}r"(h1]h2]h0]h/]h3]uh6Nh7hh8]r#hN)r$}r%(hXThe :class:`Build` consists of a series of :class:`Step`\s. Each :class:`Step` causes some number of commands to be invoked on the remote buildslave associated with that :class:`Builder`. The first step is almost always to perform a checkout of the appropriate revision from the same VC system that produced the :class:`Change`. The rest generally perform a compile and run unit tests. As each :class:`Step` runs, the buildslave reports back command output and return status to the buildmaster.hj h!h$h+hRh-}r&(h1]h2]h0]h/]h3]uh6Mh8]r'(hJXThe r(r)}r*(hXThe hj$ubh)r+}r,(hX:class:`Build`r-hj$h!h$h+hh-}r.(UreftypeXclassh։hXBuildU refdomainXpyr/h/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]r0h)r1}r2(hj-h-}r3(h1]h2]r4(hj/Xpy-classr5eh0]h/]h3]uhj+h8]r6hJXBuildr7r8}r9(hUhj1ubah+hubaubhJX consists of a series of r:r;}r<(hX consists of a series of hj$ubh)r=}r>(hX :class:`Step`r?hj$h!h$h+hh-}r@(UreftypeXclassh։hXStepU refdomainXpyrAh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rBh)rC}rD(hj?h-}rE(h1]h2]rF(hjAXpy-classrGeh0]h/]h3]uhj=h8]rHhJXSteprIrJ}rK(hUhjCubah+hubaubhJXs. Each rLrM}rN(hX \s. Each hj$ubh)rO}rP(hX :class:`Step`rQhj$h!h$h+hh-}rR(UreftypeXclassh։hXStepU refdomainXpyrSh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rTh)rU}rV(hjQh-}rW(h1]h2]rX(hjSXpy-classrYeh0]h/]h3]uhjOh8]rZhJXStepr[r\}r](hUhjUubah+hubaubhJX\ causes some number of commands to be invoked on the remote buildslave associated with that r^r_}r`(hX\ causes some number of commands to be invoked on the remote buildslave associated with that hj$ubh)ra}rb(hX:class:`Builder`rchj$h!h$h+hh-}rd(UreftypeXclassh։hXBuilderU refdomainXpyreh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rfh)rg}rh(hjch-}ri(h1]h2]rj(hjeXpy-classrkeh0]h/]h3]uhjah8]rlhJXBuilderrmrn}ro(hUhjgubah+hubaubhJX~. The first step is almost always to perform a checkout of the appropriate revision from the same VC system that produced the rprq}rr(hX~. The first step is almost always to perform a checkout of the appropriate revision from the same VC system that produced the hj$ubh)rs}rt(hX:class:`Change`ruhj$h!h$h+hh-}rv(UreftypeXclassh։hXChangeU refdomainXpyrwh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rxh)ry}rz(hjuh-}r{(h1]h2]r|(hjwXpy-classr}eh0]h/]h3]uhjsh8]r~hJXChangerr}r(hUhjyubah+hubaubhJXC. The rest generally perform a compile and run unit tests. As each rr}r(hXC. The rest generally perform a compile and run unit tests. As each hj$ubh)r}r(hX :class:`Step`rhj$h!h$h+hh-}r(UreftypeXclassh։hXStepU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXSteprr}r(hUhjubah+hubaubhJXW runs, the buildslave reports back command output and return status to the buildmaster.rr}r(hXW runs, the buildslave reports back command output and return status to the buildmaster.hj$ubeubaubho)r}r(hXiAs the :class:`Build` runs, status messages like "Build Started", "Step Started", "Build Finished", etc, are published to a collection of Status Targets. One of these targets is usually the HTML ``Waterfall`` display, which shows a chronological list of events, and summarizes the results of the most recent build at the top of each column. Developers can periodically check this page to see how their changes have fared. If they see red, they know that they've made a mistake and need to fix it. If they see green, they know that they've done their duty and don't need to worry about their change breaking anything. hjjh!h$h+hsh-}r(h1]h2]h0]h/]h3]uh6Nh7hh8]rhN)r}r(hXhAs the :class:`Build` runs, status messages like "Build Started", "Step Started", "Build Finished", etc, are published to a collection of Status Targets. One of these targets is usually the HTML ``Waterfall`` display, which shows a chronological list of events, and summarizes the results of the most recent build at the top of each column. Developers can periodically check this page to see how their changes have fared. If they see red, they know that they've made a mistake and need to fix it. If they see green, they know that they've done their duty and don't need to worry about their change breaking anything.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Mh8]r(hJXAs the rr}r(hXAs the hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX runs, status messages like "Build Started", "Step Started", "Build Finished", etc, are published to a collection of Status Targets. One of these targets is usually the HTML rr}r(hX runs, status messages like "Build Started", "Step Started", "Build Finished", etc, are published to a collection of Status Targets. One of these targets is usually the HTML hjubh)r}r(hX ``Waterfall``h-}r(h1]h2]h0]h/]h3]uhjh8]rhJX Waterfallrr}r(hUhjubah+hubhJX display, which shows a chronological list of events, and summarizes the results of the most recent build at the top of each column. Developers can periodically check this page to see how their changes have fared. If they see red, they know that they've made a mistake and need to fix it. If they see green, they know that they've done their duty and don't need to worry about their change breaking anything.rr}r(hX display, which shows a chronological list of events, and summarizes the results of the most recent build at the top of each column. Developers can periodically check this page to see how their changes have fared. If they see red, they know that they've made a mistake and need to fix it. If they see green, they know that they've done their duty and don't need to worry about their change breaking anything.hjubeubaubho)r}r(hXIf a :class:`MailNotifier` status target is active, the completion of a build will cause email to be sent to any developers whose :class:`Change`\s were incorporated into this :class:`Build`. The :class:`MailNotifier` can be configured to only send mail upon failing builds, or for builds which have just transitioned from passing to failing. Other status targets can provide similar real-time notification via different communication channels, like IRC. hjjh!h$h+hsh-}r(h1]h2]h0]h/]h3]uh6Nh7hh8]rhN)r}r(hXIf a :class:`MailNotifier` status target is active, the completion of a build will cause email to be sent to any developers whose :class:`Change`\s were incorporated into this :class:`Build`. The :class:`MailNotifier` can be configured to only send mail upon failing builds, or for builds which have just transitioned from passing to failing. Other status targets can provide similar real-time notification via different communication channels, like IRC.hjh!h$h+hRh-}r(h1]h2]h0]h/]h3]uh6Mh8]r(hJXIf a rr}r(hXIf a hjubh)r}r(hX:class:`MailNotifier`rhjh!h$h+hh-}r(UreftypeXclassh։hX MailNotifierU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJX MailNotifierrr}r(hUhjubah+hubaubhJXh status target is active, the completion of a build will cause email to be sent to any developers whose rr}r(hXh status target is active, the completion of a build will cause email to be sent to any developers whose hjubh)r}r(hX:class:`Change`rhjh!h$h+hh-}r(UreftypeXclassh։hXChangeU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXChangerr}r(hUhjubah+hubaubhJXs were incorporated into this rr}r(hX\s were incorporated into this hjubh)r}r(hX:class:`Build`rhjh!h$h+hh-}r(UreftypeXclassh։hXBuildU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classreh0]h/]h3]uhjh8]rhJXBuildrr}r(hUhjubah+hubaubhJX. The rr}r(hX. The hjubh)r}r(hX:class:`MailNotifier`rhjh!h$h+hh-}r(UreftypeXclassh։hX MailNotifierU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhhNhNuh6Mh8]rh)r}r(hjh-}r(h1]h2]r(hjXpy-classr eh0]h/]h3]uhjh8]r hJX MailNotifierr r }r (hUhjubah+hubaubhJX can be configured to only send mail upon failing builds, or for builds which have just transitioned from passing to failing. Other status targets can provide similar real-time notification via different communication channels, like IRC.rr}r(hX can be configured to only send mail upon failing builds, or for builds which have just transitioned from passing to failing. Other status targets can provide similar real-time notification via different communication channels, like IRC.hjubeubaubeubeubeubh!h$h+Usystem_messagerh-}r(h1]UlevelKh/]h0]rh>aUsourceh$h2]h3]UlineKUtypeUINFOruh6Kh7hh8]rhN)r}r(hUh-}r(h1]h2]h0]h/]h3]uhhh8]rhJX/Duplicate implicit target name: "introduction".rr}r(hUhjubah+hRubaubaUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr }r!(hjhjhj"h h5h jh jh jPh jXhj^hjhj"hjhj hjVuh8]r"(h)hehUU transformerr#NU footnote_refsr$}r%Urefnamesr&}r'Usymbol_footnotesr(]r)Uautofootnote_refsr*]r+Usymbol_footnote_refsr,]r-U citationsr.]r/h7hU current_liner0NUtransform_messagesr1]r2(h)r3}r4(hUh-}r5(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKUtypejuh8]r6hN)r7}r8(hUh-}r9(h1]h2]h0]h/]h3]uhj3h8]r:hJX2Hyperlink target "introduction" is not referenced.r;r<}r=(hUhj7ubah+hRubah+jubh)r>}r?(hUh-}r@(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineK%Utypejuh8]rAhN)rB}rC(hUh-}rD(h1]h2]h0]h/]h3]uhj>h8]rEhJX<Hyperlink target "history-and-philosophy" is not referenced.rFrG}rH(hUhjBubah+hRubah+jubh)rI}rJ(hUh-}rK(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKVUtypejuh8]rLhN)rM}rN(hUh-}rO(h1]h2]h0]h/]h3]uhjIh8]rPhJX9Hyperlink target "system-architecture" is not referenced.rQrR}rS(hUhjMubah+hRubah+jubh)rT}rU(hUh-}rV(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKsUtypejuh8]rWhN)rX}rY(hUh-}rZ(h1]h2]h0]h/]h3]uhjTh8]r[hJX<Hyperlink target "buildslave-connections" is not referenced.r\r]}r^(hUhjXubah+hRubah+jubh)r_}r`(hUh-}ra(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKUtypejuh8]rbhN)rc}rd(hUh-}re(h1]h2]h0]h/]h3]uhj_h8]rfhJX>Hyperlink target "buildmaster-architecture" is not referenced.rgrh}ri(hUhjcubah+hRubah+jubh)rj}rk(hUh-}rl(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKUtypejuh8]rmhN)rn}ro(hUh-}rp(h1]h2]h0]h/]h3]uhjjh8]rqhJXBHyperlink target "status-delivery-architecture" is not referenced.rrrs}rt(hUhjnubah+hRubah+jubh)ru}rv(hUh-}rw(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKUtypejuh8]rxhN)ry}rz(hUh-}r{(h1]h2]h0]h/]h3]uhjuh8]r|hJX2Hyperlink target "control-flow" is not referenced.r}r~}r(hUhjyubah+hRubah+jubeUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhGNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/introduction.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jjj"jh5hjPjQjjjjjj j^jYjXjYh>hj"jjjjVjQjjj j uUsubstitution_namesr}rh+h7h-}r(h1]h/]h0]Usourceh$h2]h3]uU footnotesr]rUrefidsr}r(h5]rh)aj]rjajP]rjMajX]rjUaj]rjaj]rjaj ]rj auub.PK6D'H6buildbot-v0.8.9/.doctrees/manual/configuration.doctreecdocutils.nodes document q)q}q(U nametypesq}qX configurationqsUsubstitution_defsq}qUparse_messagesq ]q cdocutils.nodes system_message q )q }q (U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceqcdocutils.nodes reprunicode qXU/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/configuration.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q)q}q(hX.. _Configuration:hhhhUtagnameqUtargetqU attributesq }q!(Uidsq"]Ubackrefsq#]Udupnamesq$]Uclassesq%]Unamesq&]Urefidq'U configurationq(uUlineq)KUdocumentq*hUchildrenq+]ubshUsectionq,h }q-(h$]q.X configurationq/ah%]h#]h"]q0(h(Uid1q1eh&]q2hauh)Kh*hUexpect_referenced_by_idq3}q4h(hsh+]q5(cdocutils.nodes title q6)q7}q8(hX Configurationq9hhhhhUtitleq:h }q;(h$]h%]h#]h"]h&]uh)Kh*hh+]qq?}q@(hh9hh7ubaubcdocutils.nodes paragraph qA)qB}qC(hXThe following sections describe the configuration of the various Buildbot components. The information available here is sufficient to create basic build and test configurations, and does not assume great familiarity with Python.qDhhhhhU paragraphqEh }qF(h$]h%]h#]h"]h&]uh)Kh*hh+]qGh=XThe following sections describe the configuration of the various Buildbot components. The information available here is sufficient to create basic build and test configurations, and does not assume great familiarity with Python.qHqI}qJ(hhDhhBubaubhA)qK}qL(hX In more advanced Buildbot configurations, Buildbot acts as a framework for a continuous-integration application. The next section, :doc:`customization`, describes this approach, with frequent references into the :ref:`development documentation `.hhhhhhEh }qM(h$]h%]h#]h"]h&]uh)K h*hh+]qN(h=XIn more advanced Buildbot configurations, Buildbot acts as a framework for a continuous-integration application. The next section, qOqP}qQ(hXIn more advanced Buildbot configurations, Buildbot acts as a framework for a continuous-integration application. The next section, hhKubcsphinx.addnodes pending_xref qR)qS}qT(hX:doc:`customization`qUhhKhhhU pending_xrefqVh }qW(UreftypeXdocqXUrefwarnqYU reftargetqZX customizationU refdomainUh"]h#]U refexplicith$]h%]h&]Urefdocq[Xmanual/configurationq\uh)K h+]q]cdocutils.nodes literal q^)q_}q`(hhUh }qa(h$]h%]qb(UxrefqchXeh#]h"]h&]uhhSh+]qdh=X customizationqeqf}qg(hUhh_ubahUliteralqhubaubh=X=, describes this approach, with frequent references into the qiqj}qk(hX=, describes this approach, with frequent references into the hhKubhR)ql}qm(hX7:ref:`development documentation `qnhhKhhhhVh }qo(UreftypeXrefhYhZXbuildbot developmentU refdomainXstdqph"]h#]U refexplicith$]h%]h&]h[h\uh)K h+]qqcdocutils.nodes emphasis qr)qs}qt(hhnh }qu(h$]h%]qv(hchpXstd-refqweh#]h"]h&]uhhlh+]qxh=Xdevelopment documentationqyqz}q{(hUhhsubahUemphasisq|ubaubh=X.q}}q~(hX.hhKubeubcdocutils.nodes compound q)q}q(hUhhhhhUcompoundqh }q(h$]h%]qUtoctree-wrapperqah#]h"]h&]uh)Nh*hh+]qcsphinx.addnodes toctree q)q}q(hUhhhhhUtoctreeqh }q(UnumberedqKU includehiddenqhh\U titlesonlyqUglobqh"]h#]h$]h%]h&]Uentriesq]q(NXmanual/cfg-introqqNXmanual/cfg-globalqqNXmanual/cfg-changesourcesqqNXmanual/cfg-schedulersqqNXmanual/cfg-buildslavesqqNXmanual/cfg-buildersqqNXmanual/cfg-buildfactoriesqqNXmanual/cfg-propertiesqqNXmanual/cfg-buildstepsqqNXmanual/cfg-interlocksqqNXmanual/cfg-statustargetsqqeUhiddenqU includefilesq]q(hhhhhhhhhhheUmaxdepthqKuh)Kh+]ubaubeubhhhUsystem_messageqh }q(h$]UlevelKh"]h#]qh1aUsourcehh%]h&]UlineKUtypeUINFOquh)Kh*hh+]qhA)q}q(hUh }q(h$]h%]h#]h"]h&]uhh h+]qh=X0Duplicate implicit target name: "configuration".qq}q(hUhhubahhEubaubaUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}qhh(sh+]q(hhehUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh*hU current_lineqNUtransform_messagesq]qh )q}q(hUh }q(h$]UlevelKh"]h#]Usourcehh%]h&]UlineKUtypehuh+]qhA)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh+]qh=X3Hyperlink target "configuration" is not referenced.qօq}q(hUhhubahhEubahhubaUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh:NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformr U source_linkr NUrfc_referencesr NUoutput_encodingr Uutf-8r U source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUU/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/configuration.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerr hUauto_id_prefixr!Uidr"Udoctitle_xformr#Ustrip_elements_with_classesr$NU _config_filesr%]Ufile_insertion_enabledr&U raw_enabledr'KU dump_settingsr(NubUsymbol_footnote_startr)KUidsr*}r+(h(hh1huUsubstitution_namesr,}r-hh*h }r.(h$]h"]h#]Usourcehh%]h&]uU footnotesr/]r0Urefidsr1}r2h(]r3hasub.PK6D3buildbot-v0.8.9/.doctrees/manual/cfg-global.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XsqliteqNXinput-validationqXprioritizing buildersqNXmysqlq NXglobal configurationq NX debug optionsq NUcontentsq NX log handlingq NXdatabase specificationqNXrevision link helpersqNXcodebase generatorqNXmulti-master-modeqXinput validationqNXprioritizing-buildersqXsite definitionsqNXmerging build requestsqNXpostgresqNXsetting the pb port for slavesqNX using manholeqNXdatabase-specificationqXdefining global propertiesqNX data lifetimeqNXmanholeqNXmetrics optionsqNX users optionsqNX debug-optionsqXrevision linksq NXhorizonsq!NXmulti-master modeq"NXsetting-the-pb-port-for-slavesq#X twistedconchq$X users-optionsq%Xcachesq&NuUsubstitution_defsq'}q(Uparse_messagesq)]q*Ucurrent_sourceq+NU decorationq,NUautofootnote_startq-KUnameidsq.}q/(hUsqliteq0hUinput-validationq1hUid3q2h Umysqlq3h Uglobal-configurationq4h Uid5q5h Ucontentsq6h U log-handlingq7hUid1q8hUrevision-link-helpersq9hUcodebase-generatorq:hUmulti-master-modeq;hUid7qhUmerging-build-requestsq?hUpostgresq@hUid4qAhU using-manholeqBhUdatabase-specificationqChUdefining-global-propertiesqDhU data-lifetimeqEhUmanholeqFhUmetrics-optionsqGhUid6qHhU debug-optionsqIh Urevision-linksqJh!UhorizonsqKh"Uid2qLh#Usetting-the-pb-port-for-slavesqMh$U twistedconchqNh%U users-optionsqOh&UcachesqPuUchildrenqQ]qRcdocutils.nodes section qS)qT}qU(U rawsourceqVUUparentqWhUsourceqXcdocutils.nodes reprunicode qYXR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-global.rstqZq[}q\bUtagnameq]Usectionq^U attributesq_}q`(Udupnamesqa]Uclassesqb]Ubackrefsqc]Uidsqd]qeh4aUnamesqf]qgh auUlineqhKUdocumentqihhQ]qj(cdocutils.nodes title qk)ql}qm(hVXGlobal ConfigurationqnhWhThXh[h]Utitleqoh_}qp(ha]hb]hc]hd]hf]uhhKhihhQ]qqcdocutils.nodes Text qrXGlobal Configurationqsqt}qu(hVhnhWhlubaubcdocutils.nodes paragraph qv)qw}qx(hVXKThe keys in this section affect the operations of the buildmaster globally.qyhWhThXh[h]U paragraphqzh_}q{(ha]hb]hc]hd]hf]uhhKhihhQ]q|hrXKThe keys in this section affect the operations of the buildmaster globally.q}q~}q(hVhyhWhwubaubcdocutils.nodes topic q)q}q(hVUhWhThXh[h]Utopicqh_}q(ha]hb]q(UcontentsqUlocalqehc]hd]qh6ahf]qh auhhKhihhQ]qcdocutils.nodes bullet_list q)q}q(hVUhWhhXNh]U bullet_listqh_}q(ha]hb]hc]hd]hf]uhhNhihhQ]q(cdocutils.nodes list_item q)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qhv)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qcdocutils.nodes reference q)q}q(hVUh_}q(hd]qUid8qahc]ha]hb]hf]UrefidhCuhWhhQ]qhrXDatabase Specificationqq}q(hVXDatabase SpecificationqhWhubah]U referencequbah]hzubah]U list_itemqubh)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qhv)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qh)q}q(hVUh_}q(hd]qUid9qahc]ha]hb]hf]Urefidh;uhWhhQ]qhrXMulti-master modeqq}q(hVXMulti-master modeqhWhubah]hubah]hzubah]hubh)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qhv)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qh)q}q(hVUh_}q(hd]qUid10qahc]ha]hb]hf]Urefidh>uhWhhQ]qhrXSite DefinitionsqDžq}q(hVXSite DefinitionsqhWhubah]hubah]hzubah]hubh)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qhv)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qh)q}q(hVUh_}q(hd]qUid11qahc]ha]hb]hf]Urefidh7uhWhhQ]qhrX Log Handlingqمq}q(hVX Log HandlingqhWhubah]hubah]hzubah]hubh)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qhv)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qh)q}q(hVUh_}q(hd]qUid12qahc]ha]hb]hf]UrefidhEuhWhhQ]qhrX Data Lifetimeq녁q}q(hVX Data LifetimeqhWhubah]hubah]hzubah]hubh)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qhv)q}q(hVUh_}q(ha]hb]hc]hd]hf]uhWhhQ]qh)q}q(hVUh_}q(hd]qUid13qahc]ha]hb]hf]Urefidh?uhWhhQ]qhrXMerging Build Requestsqq}q(hVXMerging Build RequestsrhWhubah]hubah]hzubah]hubh)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWhhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rh)r }r (hVUh_}r (hd]r Uid14r ahc]ha]hb]hf]Urefidh=uhWjhQ]rhrXPrioritizing Buildersrr}r(hVXPrioritizing BuildersrhWj ubah]hubah]hzubah]hubh)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWhhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rh)r}r(hVUh_}r(hd]rUid15rahc]ha]hb]hf]UrefidhMuhWjhQ]r hrXSetting the PB Port for Slavesr!r"}r#(hVXSetting the PB Port for Slavesr$hWjubah]hubah]hzubah]hubh)r%}r&(hVUh_}r'(ha]hb]hc]hd]hf]uhWhhQ]r(hv)r)}r*(hVUh_}r+(ha]hb]hc]hd]hf]uhWj%hQ]r,h)r-}r.(hVUh_}r/(hd]r0Uid16r1ahc]ha]hb]hf]UrefidhDuhWj)hQ]r2hrXDefining Global Propertiesr3r4}r5(hVXDefining Global Propertiesr6hWj-ubah]hubah]hzubah]hubh)r7}r8(hVUh_}r9(ha]hb]hc]hd]hf]uhWhhQ]r:hv)r;}r<(hVUh_}r=(ha]hb]hc]hd]hf]uhWj7hQ]r>h)r?}r@(hVUh_}rA(hd]rBUid17rCahc]ha]hb]hf]UrefidhIuhWj;hQ]rDhrX Debug OptionsrErF}rG(hVX Debug OptionsrHhWj?ubah]hubah]hzubah]hubh)rI}rJ(hVUh_}rK(ha]hb]hc]hd]hf]uhWhhQ]rLhv)rM}rN(hVUh_}rO(ha]hb]hc]hd]hf]uhWjIhQ]rPh)rQ}rR(hVUh_}rS(hd]rTUid18rUahc]ha]hb]hf]UrefidhFuhWjMhQ]rVhrXManholerWrX}rY(hVXManholerZhWjQubah]hubah]hzubah]hubh)r[}r\(hVUh_}r](ha]hb]hc]hd]hf]uhWhhQ]r^hv)r_}r`(hVUh_}ra(ha]hb]hc]hd]hf]uhWj[hQ]rbh)rc}rd(hVUh_}re(hd]rfUid19rgahc]ha]hb]hf]UrefidhGuhWj_hQ]rhhrXMetrics Optionsrirj}rk(hVXMetrics OptionsrlhWjcubah]hubah]hzubah]hubh)rm}rn(hVUh_}ro(ha]hb]hc]hd]hf]uhWhhQ]rphv)rq}rr(hVUh_}rs(ha]hb]hc]hd]hf]uhWjmhQ]rth)ru}rv(hVUh_}rw(hd]rxUid20ryahc]ha]hb]hf]UrefidhOuhWjqhQ]rzhrX Users Optionsr{r|}r}(hVX Users Optionsr~hWjuubah]hubah]hzubah]hubh)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWhhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rh)r}r(hVUh_}r(hd]rUid21rahc]ha]hb]hf]Urefidh1uhWjhQ]rhrXInput Validationrr}r(hVXInput ValidationrhWjubah]hubah]hzubah]hubh)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWhhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rh)r}r(hVUh_}r(hd]rUid22rahc]ha]hb]hf]UrefidhJuhWjhQ]rhrXRevision Linksrr}r(hVXRevision LinksrhWjubah]hubah]hzubah]hubh)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWhhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rh)r}r(hVUh_}r(hd]rUid23rahc]ha]hb]hf]Urefidh:uhWjhQ]rhrXCodebase Generatorrr}r(hVXCodebase GeneratorrhWjubah]hubah]hzubah]hubeubaubcsphinx.addnodes index r)r}r(hVUhWhThXh[h]Uindexrh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; dbXcfg-dbrjtr(UsingleXdb (Buildmaster Config)jjtreuhhK hihhQ]ubcdocutils.nodes target r)r}r(hVUhWhThXh[h]Utargetrh_}r(ha]hb]hc]hd]rjahf]uhhK hihhQ]ubj)r}r(hVUhWhThXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; db_urlX cfg-db_urlrjtr(UsingleXdb_url (Buildmaster Config)jjtreuhhK hihhQ]ubj)r}r(hVUhWhThXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhK hihhQ]ubj)r}r(hVUhWhThXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX$Buildmaster Config; db_poll_intervalXcfg-db_poll_intervalrjtr(UsingleX%db_poll_interval (Buildmaster Config)jjtreuhhK hihhQ]ubj)r}r(hVUhWhThXh[h]jh_}r(hd]hc]ha]hb]hf]UrefidrjuhhK hihhQ]ubj)r}r(hVX.. _Database-Specification:hWhThXh[Uexpect_referenced_by_namer}h]jh_}r(hd]hc]ha]hb]hf]jhCuhhKhihUexpect_referenced_by_idr}rjjshQ]ubhS)r}r(hVUhWhThXh[j}rhjsh]h^h_}r(ha]hb]hc]hd]r(hCjh8ehf]r(hheuhhKhihj}r(hCjjjuhQ]r(hk)r}r(hVhhWjhXh[h]hoh_}r(hd]hc]ha]hb]hf]jhuhhKhihhQ]rhrXDatabase Specificationrr}r(hVhhWjubaubhv)r}r(hVXNBuildbot requires a connection to a database to maintain certain state information, such as tracking pending build requests. In the default configuration Buildbot uses a file-based SQLite database, stored in the :file:`state.sqlite` file of the master's base directory. Override this configuration with the :bb:cfg:`db_url` parameter.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXBuildbot requires a connection to a database to maintain certain state information, such as tracking pending build requests. In the default configuration Buildbot uses a file-based SQLite database, stored in the rr}r(hVXBuildbot requires a connection to a database to maintain certain state information, such as tracking pending build requests. In the default configuration Buildbot uses a file-based SQLite database, stored in the hWjubcdocutils.nodes literal r)r}r(hVUh_}r(hd]hc]ha]hb]rXfileraUrolejhf]uhWjhQ]rhrX state.sqliterr}r(hVX state.sqlitehWjubah]UliteralrubhrXK file of the master's base directory. Override this configuration with the rr}r(hVXK file of the master's base directory. Override this configuration with the hWjubcsphinx.addnodes pending_xref r)r}r(hVX:bb:cfg:`db_url`rhWjhXh[h]U pending_xrefrh_}r (UreftypeXcfgUrefwarnr U reftargetr Xdb_urlU refdomainXbbr hd]hc]U refexplicitha]hb]hf]Urefdocr Xmanual/cfg-globalruhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(Uxrefrj Xbb-cfgrehc]hd]hf]uhWjhQ]rhrXdb_urlrr}r(hVUhWjubah]jubaubhrX parameter.rr}r(hVX parameter.hWjubeubhv)r}r(hVX_Buildbot accepts a database configuration in a dictionary named ``db``. All keys are optional::hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r (hrX@Buildbot accepts a database configuration in a dictionary named r!r"}r#(hVX@Buildbot accepts a database configuration in a dictionary named hWjubj)r$}r%(hVX``db``h_}r&(ha]hb]hc]hd]hf]uhWjhQ]r'hrXdbr(r)}r*(hVUhWj$ubah]jubhrX. All keys are optional:r+r,}r-(hVX. All keys are optional:hWjubeubcdocutils.nodes literal_block r.)r/}r0(hVXSc['db'] = { 'db_url' : 'sqlite:///state.sqlite', 'db_poll_interval' : 30, }hWjhXh[h]U literal_blockr1h_}r2(U xml:spacer3Upreserver4hd]hc]ha]hb]hf]uhhKhihhQ]r5hrXSc['db'] = { 'db_url' : 'sqlite:///state.sqlite', 'db_poll_interval' : 30, }r6r7}r8(hVUhWj/ubaubhv)r9}r:(hVXThe ``db_url`` key indicates the database engine to use. The format of this parameter is completely documented at http://www.sqlalchemy.org/docs/dialects/, but is generally of the form::hWjhXh[h]hzh_}r;(ha]hb]hc]hd]hf]uhhKhihhQ]r<(hrXThe r=r>}r?(hVXThe hWj9ubj)r@}rA(hVX ``db_url``h_}rB(ha]hb]hc]hd]hf]uhWj9hQ]rChrXdb_urlrDrE}rF(hVUhWj@ubah]jubhrXd key indicates the database engine to use. The format of this parameter is completely documented at rGrH}rI(hVXd key indicates the database engine to use. The format of this parameter is completely documented at hWj9ubh)rJ}rK(hVX(http://www.sqlalchemy.org/docs/dialects/rLh_}rM(UrefurijLhd]hc]ha]hb]hf]uhWj9hQ]rNhrX(http://www.sqlalchemy.org/docs/dialects/rOrP}rQ(hVUhWjJubah]hubhrX, but is generally of the form:rRrS}rT(hVX, but is generally of the form:hWj9ubeubj.)rU}rV(hVX8"driver://[username:password@]host:port/database[?args]"hWjhXh[h]j1h_}rW(j3j4hd]hc]ha]hb]hf]uhhK"hihhQ]rXhrX8"driver://[username:password@]host:port/database[?args]"rYrZ}r[(hVUhWjUubaubhv)r\}r](hVXThe optional ``db_poll_interval`` specifies the interval, in seconds, between checks for pending tasks in the database. This parameter is generally only useful in multi-master mode. See :ref:`Multi-master-mode`.hWjhXh[h]hzh_}r^(ha]hb]hc]hd]hf]uhhK$hihhQ]r_(hrX The optional r`ra}rb(hVX The optional hWj\ubj)rc}rd(hVX``db_poll_interval``h_}re(ha]hb]hc]hd]hf]uhWj\hQ]rfhrXdb_poll_intervalrgrh}ri(hVUhWjcubah]jubhrX specifies the interval, in seconds, between checks for pending tasks in the database. This parameter is generally only useful in multi-master mode. See rjrk}rl(hVX specifies the interval, in seconds, between checks for pending tasks in the database. This parameter is generally only useful in multi-master mode. See hWj\ubj)rm}rn(hVX:ref:`Multi-master-mode`rohWj\hXh[h]jh_}rp(UreftypeXrefj j Xmulti-master-modeU refdomainXstdrqhd]hc]U refexplicitha]hb]hf]j juhhK$hQ]rrcdocutils.nodes emphasis rs)rt}ru(hVjoh_}rv(ha]hb]rw(jjqXstd-refrxehc]hd]hf]uhWjmhQ]ryhrXMulti-master-moderzr{}r|(hVUhWjtubah]Uemphasisr}ubaubhrX.r~}r(hVX.hWj\ubeubhv)r}r(hVXThese parameters can be specified directly in the configuration dictionary, as ``c['db_url']`` and ``c['db_poll_interval']``, although this method is deprecated.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK'hihhQ]r(hrXOThese parameters can be specified directly in the configuration dictionary, as rr}r(hVXOThese parameters can be specified directly in the configuration dictionary, as hWjubj)r}r(hVX``c['db_url']``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX c['db_url']rr}r(hVUhWjubah]jubhrX and rr}r(hVX and hWjubj)r}r(hVX``c['db_poll_interval']``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXc['db_poll_interval']rr}r(hVUhWjubah]jubhrX%, although this method is deprecated.rr}r(hVX%, although this method is deprecated.hWjubeubhv)r}r(hVXTThe following sections give additional information for particular database backends:rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK)hihhQ]rhrXTThe following sections give additional information for particular database backends:rr}r(hVjhWjubaubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentriesr]r(UsinglerXSQLiteUindex-0rUtraUinlineruhhK+hihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhK,hihhQ]ubhS)r}r(hVUhWjhXh[j}h]h^h_}r(ha]hb]hc]hd]r(h0jehf]rhauhhK.hihj}rjjshQ]r(hk)r}r(hVXSQLiterhWjhXh[h]hoh_}r(ha]hb]hc]hd]hf]uhhK.hihhQ]rhrXSQLiterr}r(hVjhWjubaubhv)r}r(hVXFor sqlite databases, since there is no host and port, relative paths are specified with ``sqlite:///`` and absolute paths with ``sqlite:////``. Examples::hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK0hihhQ]r(hrXYFor sqlite databases, since there is no host and port, relative paths are specified with rr}r(hVXYFor sqlite databases, since there is no host and port, relative paths are specified with hWjubj)r}r(hVX``sqlite:///``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX sqlite:///rr}r(hVUhWjubah]jubhrX and absolute paths with rr}r(hVX and absolute paths with hWjubj)r}r(hVX``sqlite:////``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX sqlite:////rr}r(hVUhWjubah]jubhrX . Examples:rr}r(hVX . Examples:hWjubeubj.)r}r(hVX&c['db_url'] = "sqlite:///state.sqlite"hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhK3hihhQ]rhrX&c['db_url'] = "sqlite:///state.sqlite"rr}r(hVUhWjubaubhv)r}r(hVX)SQLite requires no special configuration.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK5hihhQ]rhrX)SQLite requires no special configuration.rr}r(hVjhWjubaubhv)r}r(hVXwIf Buildbot produces "database is locked" exceptions, try adding ``serialize_access=1`` to the DB URL as a workaround::rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK7hihhQ]r(hrXAIf Buildbot produces "database is locked" exceptions, try adding rr}r(hVXAIf Buildbot produces "database is locked" exceptions, try adding hWjubj)r}r(hVX``serialize_access=1``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXserialize_access=1rr}r(hVUhWjubah]jubhrX to the DB URL as a workaround:rr}r(hVX to the DB URL as a workaround:hWjubeubj.)r}r(hVX9c['db_url'] = "sqlite:///state.sqlite?serialize_access=1"hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhK9hihhQ]rhrX9c['db_url'] = "sqlite:///state.sqlite?serialize_access=1"rr}r(hVUhWjubaubhv)r}r(hVX2and please file a bug at http://trac.buildbot.net.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK;hihhQ]r(hrXand please file a bug at rr}r (hVXand please file a bug at hWjubh)r }r (hVXhttp://trac.buildbot.netr h_}r (Urefurij hd]hc]ha]hb]hf]uhWjhQ]rhrXhttp://trac.buildbot.netrr}r(hVUhWj ubah]hubhrX.r}r(hVX.hWjubeubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]j]r(jXMySQLUindex-1rUtrajuhhK=hihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhK>hihhQ]ubeubhS)r}r(hVUhWjhXh[j}h]h^h_}r(ha]hb]hc]hd]r (h3jehf]r!h auhhK@hihj}r"jjshQ]r#(hk)r$}r%(hVXMySQLr&hWjhXh[h]hoh_}r'(ha]hb]hc]hd]hf]uhhK@hihhQ]r(hrXMySQLr)r*}r+(hVj&hWj$ubaubj.)r,}r-(hVXIc['db_url'] = "mysql://user:pass@somehost.com/database_name?max_idle=300"hWjhXh[h]j1h_}r.(Ulinenosr/Ulanguager0Xpythonj3j4hd]hc]ha]hb]hf]uhhKBhihhQ]r1hrXIc['db_url'] = "mysql://user:pass@somehost.com/database_name?max_idle=300"r2r3}r4(hVUhWj,ubaubhv)r5}r6(hVXThe ``max_idle`` argument for MySQL connections is unique to Buildbot, and should be set to something less than the ``wait_timeout`` configured for your server. This controls the SQLAlchemy ``pool_recycle`` parameter, which defaults to no timeout. Setting this parameter ensures that connections are closed and re-opened after the configured amount of idle time. If you see errors such as ``_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')``, this means your ``max_idle`` setting is probably too high. ``show global variables like 'wait_timeout';`` will show what the currently configured ``wait_timeout`` is on your MySQL server.hWjhXh[h]hzh_}r7(ha]hb]hc]hd]hf]uhhKFhihhQ]r8(hrXThe r9r:}r;(hVXThe hWj5ubj)r<}r=(hVX ``max_idle``h_}r>(ha]hb]hc]hd]hf]uhWj5hQ]r?hrXmax_idler@rA}rB(hVUhWj<ubah]jubhrXd argument for MySQL connections is unique to Buildbot, and should be set to something less than the rCrD}rE(hVXd argument for MySQL connections is unique to Buildbot, and should be set to something less than the hWj5ubj)rF}rG(hVX``wait_timeout``h_}rH(ha]hb]hc]hd]hf]uhWj5hQ]rIhrX wait_timeoutrJrK}rL(hVUhWjFubah]jubhrX: configured for your server. This controls the SQLAlchemy rMrN}rO(hVX: configured for your server. This controls the SQLAlchemy hWj5ubj)rP}rQ(hVX``pool_recycle``h_}rR(ha]hb]hc]hd]hf]uhWj5hQ]rShrX pool_recyclerTrU}rV(hVUhWjPubah]jubhrX parameter, which defaults to no timeout. Setting this parameter ensures that connections are closed and re-opened after the configured amount of idle time. If you see errors such as rWrX}rY(hVX parameter, which defaults to no timeout. Setting this parameter ensures that connections are closed and re-opened after the configured amount of idle time. If you see errors such as hWj5ubj)rZ}r[(hVXL``_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')``h_}r\(ha]hb]hc]hd]hf]uhWj5hQ]r]hrXH_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')r^r_}r`(hVUhWjZubah]jubhrX, this means your rarb}rc(hVX, this means your hWj5ubj)rd}re(hVX ``max_idle``h_}rf(ha]hb]hc]hd]hf]uhWj5hQ]rghrXmax_idlerhri}rj(hVUhWjdubah]jubhrX setting is probably too high. rkrl}rm(hVX setting is probably too high. hWj5ubj)rn}ro(hVX.``show global variables like 'wait_timeout';``h_}rp(ha]hb]hc]hd]hf]uhWj5hQ]rqhrX*show global variables like 'wait_timeout';rrrs}rt(hVUhWjnubah]jubhrX) will show what the currently configured rurv}rw(hVX) will show what the currently configured hWj5ubj)rx}ry(hVX``wait_timeout``h_}rz(ha]hb]hc]hd]hf]uhWj5hQ]r{hrX wait_timeoutr|r}}r~(hVUhWjxubah]jubhrX is on your MySQL server.rr}r(hVX is on your MySQL server.hWj5ubeubhv)r}r(hVXBuildbot requires ``use_unique=True`` and ``charset=utf8``, and will add them automatically, so they do not need to be specified in ``db_url``.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKLhihhQ]r(hrXBuildbot requires rr}r(hVXBuildbot requires hWjubj)r}r(hVX``use_unique=True``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXuse_unique=Truerr}r(hVUhWjubah]jubhrX and rr}r(hVX and hWjubj)r}r(hVX``charset=utf8``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX charset=utf8rr}r(hVUhWjubah]jubhrXJ, and will add them automatically, so they do not need to be specified in rr}r(hVXJ, and will add them automatically, so they do not need to be specified in hWjubj)r}r(hVX ``db_url``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXdb_urlrr}r(hVUhWjubah]jubhrX.r}r(hVX.hWjubeubhv)r}r(hVXqMySQL defaults to the MyISAM storage engine, but this can be overridden with the ``storage_engine`` URL argument.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKNhihhQ]r(hrXQMySQL defaults to the MyISAM storage engine, but this can be overridden with the rr}r(hVXQMySQL defaults to the MyISAM storage engine, but this can be overridden with the hWjubj)r}r(hVX``storage_engine``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXstorage_enginerr}r(hVUhWjubah]jubhrX URL argument.rr}r(hVX URL argument.hWjubeubhv)r}r(hVXNote that, because of InnoDB's extremely short key length limitations, it cannot be used to run Buildbot. See http://bugs.mysql.com/bug.php?id=4541 for more information.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKPhihhQ]r(hrXnNote that, because of InnoDB's extremely short key length limitations, it cannot be used to run Buildbot. See rr}r(hVXnNote that, because of InnoDB's extremely short key length limitations, it cannot be used to run Buildbot. See hWjubh)r}r(hVX%http://bugs.mysql.com/bug.php?id=4541rh_}r(Urefurijhd]hc]ha]hb]hf]uhWjhQ]rhrX%http://bugs.mysql.com/bug.php?id=4541rr}r(hVUhWjubah]hubhrX for more information.rr}r(hVX for more information.hWjubeubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]j]r(jXPostgresUindex-2rUtrajuhhKShihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhKThihhQ]ubeubhS)r}r(hVUhWjhXh[j}h]h^h_}r(ha]hb]hc]hd]r(h@jehf]rhauhhKVhihj}rjjshQ]r(hk)r}r(hVXPostgresrhWjhXh[h]hoh_}r(ha]hb]hc]hd]hf]uhhKVhihhQ]rhrXPostgresrr}r(hVjhWjubaubj.)r}r(hVX5c['db_url'] = "postgresql://username@hostname/dbname"hWjhXh[h]j1h_}r(j/j0Xpythonj3j4hd]hc]ha]hb]hf]uhhKXhihhQ]rhrX5c['db_url'] = "postgresql://username@hostname/dbname"rr}r(hVUhWjubaubhv)r}r(hVX,PosgreSQL requires no special configuration.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK\hihhQ]rhrX,PosgreSQL requires no special configuration.rr}r(hVjhWjubaubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; multiMasterXcfg-multiMasterrjtr(UsingleX multiMaster (Buildmaster Config)jjtreuhhK_hihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhK_hihhQ]ubj)r}r(hVX.. _Multi-master-mode:hWjhXh[j}h]jh_}r(hd]hc]ha]hb]hf]jh;uhhK`hihj}rjjshQ]ubeubeubhS)r}r(hVUhWhThXh[j}rhjsh]h^h_}r(ha]hb]hc]hd]r(h;jhLehf]r(h"heuhhKchihj}r(h;jjjuhQ]r(hk)r}r (hVhhWjhXh[h]hoh_}r (hd]hc]ha]hb]hf]jhuhhKchihhQ]r hrXMulti-master moder r }r(hVhhWjubaubhv)r}r(hVXiNormally buildbot operates using a single master process that uses the configured database to save state.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKehihhQ]rhrXiNormally buildbot operates using a single master process that uses the configured database to save state.rr}r(hVjhWjubaubhv)r}r(hVXIt is possible to configure buildbot to have multiple master processes that share state in the same database. This has been well tested using a MySQL database. There are several benefits of Multi-master mode:rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKghihhQ]rhrXIt is possible to configure buildbot to have multiple master processes that share state in the same database. This has been well tested using a MySQL database. There are several benefits of Multi-master mode:rr}r(hVjhWjubaubcdocutils.nodes block_quote r)r }r!(hVUhWjhXNh]U block_quoter"h_}r#(ha]hb]hc]hd]hf]uhhNhihhQ]r$h)r%}r&(hVUh_}r'(Ubulletr(X*hd]hc]ha]hb]hf]uhWj hQ]r)(h)r*}r+(hVXYou can have large numbers of build slaves handling the same queue of build requests. A single master can only handle so many slaves (the number is based on a number of factors including type of builds, number of builds, and master and slave IO and CPU capacity--there is no fixed formula). By adding another master which shares the queue of build requests, you can attach more slaves to this additional master, and increase your build throughput. h_}r,(ha]hb]hc]hd]hf]uhWj%hQ]r-hv)r.}r/(hVXYou can have large numbers of build slaves handling the same queue of build requests. A single master can only handle so many slaves (the number is based on a number of factors including type of builds, number of builds, and master and slave IO and CPU capacity--there is no fixed formula). By adding another master which shares the queue of build requests, you can attach more slaves to this additional master, and increase your build throughput.r0hWj*hXh[h]hzh_}r1(ha]hb]hc]hd]hf]uhhKkhQ]r2hrXYou can have large numbers of build slaves handling the same queue of build requests. A single master can only handle so many slaves (the number is based on a number of factors including type of builds, number of builds, and master and slave IO and CPU capacity--there is no fixed formula). By adding another master which shares the queue of build requests, you can attach more slaves to this additional master, and increase your build throughput.r3r4}r5(hVj0hWj.ubaubah]hubh)r6}r7(hVX^You can shut one master down to do maintenance, and other masters will continue to do builds. h_}r8(ha]hb]hc]hd]hf]uhWj%hQ]r9hv)r:}r;(hVX]You can shut one master down to do maintenance, and other masters will continue to do builds.r<hWj6hXh[h]hzh_}r=(ha]hb]hc]hd]hf]uhhKohQ]r>hrX]You can shut one master down to do maintenance, and other masters will continue to do builds.r?r@}rA(hVj<hWj:ubaubah]hubeh]hubaubhv)rB}rC(hVX.State that is shared in the database includes:rDhWjhXh[h]hzh_}rE(ha]hb]hc]hd]hf]uhhKqhihhQ]rFhrX.State that is shared in the database includes:rGrH}rI(hVjDhWjBubaubj)rJ}rK(hVUhWjhXNh]j"h_}rL(ha]hb]hc]hd]hf]uhhNhihhQ]rMh)rN}rO(hVUh_}rP(j(X*hd]hc]ha]hb]hf]uhWjJhQ]rQ(h)rR}rS(hVXList of changesrTh_}rU(ha]hb]hc]hd]hf]uhWjNhQ]rVhv)rW}rX(hVjThWjRhXh[h]hzh_}rY(ha]hb]hc]hd]hf]uhhKshQ]rZhrXList of changesr[r\}r](hVjThWjWubaubah]hubh)r^}r_(hVX"Scheduler names and internal stater`h_}ra(ha]hb]hc]hd]hf]uhWjNhQ]rbhv)rc}rd(hVj`hWj^hXh[h]hzh_}re(ha]hb]hc]hd]hf]uhhKthQ]rfhrX"Scheduler names and internal statergrh}ri(hVj`hWjcubaubah]hubh)rj}rk(hVX+Build requests, including the builder name h_}rl(ha]hb]hc]hd]hf]uhWjNhQ]rmhv)rn}ro(hVX*Build requests, including the builder namerphWjjhXh[h]hzh_}rq(ha]hb]hc]hd]hf]uhhKuhQ]rrhrX*Build requests, including the builder namersrt}ru(hVjphWjnubaubah]hubeh]hubaubhv)rv}rw(hVX=Because of this shared state, you are strongly encouraged to:rxhWjhXh[h]hzh_}ry(ha]hb]hc]hd]hf]uhhKwhihhQ]rzhrX=Because of this shared state, you are strongly encouraged to:r{r|}r}(hVjxhWjvubaubj)r~}r(hVUhWjhXNh]j"h_}r(ha]hb]hc]hd]hf]uhhNhihhQ]rh)r}r(hVUh_}r(j(X*hd]hc]ha]hb]hf]uhWj~hQ]r(h)r}r(hVXEnsure that each named scheduler runs on only one master. If the same scheduler runs on multiple masters, it will trigger duplicate builds and may produce other undesirable behaviors. h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVXEnsure that each named scheduler runs on only one master. If the same scheduler runs on multiple masters, it will trigger duplicate builds and may produce other undesirable behaviors.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKyhQ]rhrXEnsure that each named scheduler runs on only one master. If the same scheduler runs on multiple masters, it will trigger duplicate builds and may produce other undesirable behaviors.rr}r(hVjhWjubaubah]hubh)r}r(hVXEnsure builder names are unique for a given build factory implementation. You can have the same builder name configured on many masters, but if the build factories differ, you will get different results depending on which master claims the build. h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVXEnsure builder names are unique for a given build factory implementation. You can have the same builder name configured on many masters, but if the build factories differ, you will get different results depending on which master claims the build.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhK|hQ]rhrXEnsure builder names are unique for a given build factory implementation. You can have the same builder name configured on many masters, but if the build factories differ, you will get different results depending on which master claims the build.rr}r(hVjhWjubaubah]hubeh]hubaubhv)r}r(hVXOne suggested configuration is to have one buildbot master configured with just the scheduler and change sources; and then other masters configured with just the builders.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]rhrXOne suggested configuration is to have one buildbot master configured with just the scheduler and change sources; and then other masters configured with just the builders.rr}r(hVjhWjubaubhv)r}r(hVX;To enable multi-master mode in this configuration, you will need to set the :bb:cfg:`multiMaster` option so that buildbot doesn't warn about missing schedulers or builders. You will also need to set :bb:cfg:`db_poll_interval` to specify the interval (in seconds) at which masters should poll the database for tasks.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXLTo enable multi-master mode in this configuration, you will need to set the rr}r(hVXLTo enable multi-master mode in this configuration, you will need to set the hWjubj)r}r(hVX:bb:cfg:`multiMaster`rhWjhXh[h]jh_}r(UreftypeXcfgj j X multiMasterU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX multiMasterrr}r(hVUhWjubah]jubaubhrXf option so that buildbot doesn't warn about missing schedulers or builders. You will also need to set rr}r(hVXf option so that buildbot doesn't warn about missing schedulers or builders. You will also need to set hWjubj)r}r(hVX:bb:cfg:`db_poll_interval`rhWjhXh[h]jh_}r(UreftypeXcfgj j Xdb_poll_intervalU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrXdb_poll_intervalrr}r(hVUhWjubah]jubaubhrXZ to specify the interval (in seconds) at which masters should poll the database for tasks.rr}r(hVXZ to specify the interval (in seconds) at which masters should poll the database for tasks.hWjubeubj.)r}r(hVX# Enable multiMaster mode; disables warnings about unknown builders and # schedulers c['multiMaster'] = True # Check for new build requests every 60 seconds c['db'] = { 'db_url' : 'mysql://...', 'db_poll_interval' : 30, }hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhKhihhQ]rhrX# Enable multiMaster mode; disables warnings about unknown builders and # schedulers c['multiMaster'] = True # Check for new build requests every 60 seconds c['db'] = { 'db_url' : 'mysql://...', 'db_poll_interval' : 30, }rr}r(hVUhWjubaubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; buildbotURLXcfg-buildbotURLrjtr(UsingleX buildbotURL (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; titleURLX cfg-titleURLrjtr(UsingleXtitleURL (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; titleX cfg-titlerjtr(UsingleXtitle (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhKhihhQ]ubeubhS)r}r(hVUhWhThXh[j}h]h^h_}r(ha]hb]hc]hd]r(h>jehf]rhauhhKhihj}rjjshQ]r(hk)r}r(hVhhWjhXh[h]hoh_}r(hd]hc]ha]hb]hf]jhuhhKhihhQ]rhrXSite Definitionsrr}r(hVhhWjubaubhv)r}r(hVXAThree basic settings describe the buildmaster in status reports::rhWjhXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhKhihhQ]r hrX@Three basic settings describe the buildmaster in status reports:r r }r (hVX@Three basic settings describe the buildmaster in status reports:hWjubaubj.)r}r(hVXvc['title'] = "Buildbot" c['titleURL'] = "http://buildbot.sourceforge.net/" c['buildbotURL'] = "http://localhost:8010/"hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhKhihhQ]rhrXvc['title'] = "Buildbot" c['titleURL'] = "http://buildbot.sourceforge.net/" c['buildbotURL'] = "http://localhost:8010/"rr}r(hVUhWjubaubhv)r}r(hVX:bb:cfg:`title` is a short string that will appear at the top of this buildbot installation's :class:`html.WebStatus` home page (linked to the :bb:cfg:`titleURL`), and is embedded in the title of the waterfall HTML page.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(j)r}r(hVX:bb:cfg:`title`rhWjhXh[h]jh_}r(UreftypeXcfgj j XtitleU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r }r!(hVjh_}r"(ha]hb]r#(jjXbb-cfgr$ehc]hd]hf]uhWjhQ]r%hrXtitler&r'}r((hVUhWj ubah]jubaubhrXO is a short string that will appear at the top of this buildbot installation's r)r*}r+(hVXO is a short string that will appear at the top of this buildbot installation's hWjubj)r,}r-(hVX:class:`html.WebStatus`r.hWjhXh[h]jh_}r/(UreftypeXclassj j Xhtml.WebStatusU refdomainXpyr0hd]hc]U refexplicitha]hb]hf]j jUpy:classr1NU py:moduler2NuhhKhQ]r3j)r4}r5(hVj.h_}r6(ha]hb]r7(jj0Xpy-classr8ehc]hd]hf]uhWj,hQ]r9hrXhtml.WebStatusr:r;}r<(hVUhWj4ubah]jubaubhrX home page (linked to the r=r>}r?(hVX home page (linked to the hWjubj)r@}rA(hVX:bb:cfg:`titleURL`rBhWjhXh[h]jh_}rC(UreftypeXcfgj j XtitleURLU refdomainXbbrDhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rEj)rF}rG(hVjBh_}rH(ha]hb]rI(jjDXbb-cfgrJehc]hd]hf]uhWj@hQ]rKhrXtitleURLrLrM}rN(hVUhWjFubah]jubaubhrX;), and is embedded in the title of the waterfall HTML page.rOrP}rQ(hVX;), and is embedded in the title of the waterfall HTML page.hWjubeubhv)rR}rS(hVX:bb:cfg:`titleURL` is a URL string that must end with a slash (``/``). HTML status displays will show ``title`` as a link to :bb:cfg:`titleURL`. This URL is often used to provide a link from buildbot HTML pages to your project's home page.hWjhXh[h]hzh_}rT(ha]hb]hc]hd]hf]uhhKhihhQ]rU(j)rV}rW(hVX:bb:cfg:`titleURL`rXhWjRhXh[h]jh_}rY(UreftypeXcfgj j XtitleURLU refdomainXbbrZhd]hc]U refexplicitha]hb]hf]j juhhKhQ]r[j)r\}r](hVjXh_}r^(ha]hb]r_(jjZXbb-cfgr`ehc]hd]hf]uhWjVhQ]rahrXtitleURLrbrc}rd(hVUhWj\ubah]jubaubhrX- is a URL string that must end with a slash (rerf}rg(hVX- is a URL string that must end with a slash (hWjRubj)rh}ri(hVX``/``h_}rj(ha]hb]hc]hd]hf]uhWjRhQ]rkhrX/rl}rm(hVUhWjhubah]jubhrX"). HTML status displays will show rnro}rp(hVX"). HTML status displays will show hWjRubj)rq}rr(hVX ``title``h_}rs(ha]hb]hc]hd]hf]uhWjRhQ]rthrXtitlerurv}rw(hVUhWjqubah]jubhrX as a link to rxry}rz(hVX as a link to hWjRubj)r{}r|(hVX:bb:cfg:`titleURL`r}hWjRhXh[h]jh_}r~(UreftypeXcfgj j XtitleURLU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVj}h_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWj{hQ]rhrXtitleURLrr}r(hVUhWjubah]jubaubhrX`. This URL is often used to provide a link from buildbot HTML pages to your project's home page.rr}r(hVX`. This URL is often used to provide a link from buildbot HTML pages to your project's home page.hWjRubeubhv)r}r(hVXBThe :bb:cfg:`buildbotURL` string should point to the location where the buildbot's internal web server is visible. This URL must end with a slash (``/``). This typically uses the port number set for the web status (:bb:status:`WebStatus`): the buildbot needs your help to figure out a suitable externally-visible host URL.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXThe rr}r(hVXThe hWjubj)r}r(hVX:bb:cfg:`buildbotURL`rhWjhXh[h]jh_}r(UreftypeXcfgj j X buildbotURLU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX buildbotURLrr}r(hVUhWjubah]jubaubhrXz string should point to the location where the buildbot's internal web server is visible. This URL must end with a slash (rr}r(hVXz string should point to the location where the buildbot's internal web server is visible. This URL must end with a slash (hWjubj)r}r(hVX``/``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX/r}r(hVUhWjubah]jubhrX?). This typically uses the port number set for the web status (rr}r(hVX?). This typically uses the port number set for the web status (hWjubj)r}r(hVX:bb:status:`WebStatus`rhWjhXh[h]jh_}r(UreftypeXstatusj j X WebStatusU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjX bb-statusrehc]hd]hf]uhWjhQ]rhrX WebStatusrr}r(hVUhWjubah]jubaubhrXU): the buildbot needs your help to figure out a suitable externally-visible host URL.rr}r(hVXU): the buildbot needs your help to figure out a suitable externally-visible host URL.hWjubeubhv)r}r(hVX:When status notices are sent to users (either by email or over IRC), :bb:cfg:`buildbotURL` will be used to create a URL to the specific build or problem that they are being notified about. It will also be made available to queriers (over IRC) who want to find out where to get more information about this buildbot.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXEWhen status notices are sent to users (either by email or over IRC), rr}r(hVXEWhen status notices are sent to users (either by email or over IRC), hWjubj)r}r(hVX:bb:cfg:`buildbotURL`rhWjhXh[h]jh_}r(UreftypeXcfgj j X buildbotURLU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX buildbotURLrr}r(hVUhWjubah]jubaubhrX will be used to create a URL to the specific build or problem that they are being notified about. It will also be made available to queriers (over IRC) who want to find out where to get more information about this buildbot.rr}r(hVX will be used to create a URL to the specific build or problem that they are being notified about. It will also be made available to queriers (over IRC) who want to find out where to get more information about this buildbot.hWjubeubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX'Buildmaster Config; logCompressionLimitXcfg-logCompressionLimitrjtr(UsingleX(logCompressionLimit (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX(Buildmaster Config; logCompressionMethodXcfg-logCompressionMethodrjtr(UsingleX)logCompressionMethod (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; logMaxSizeXcfg-logMaxSizerjtr(UsingleXlogMaxSize (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX"Buildmaster Config; logMaxTailSizeXcfg-logMaxTailSizerjtr(UsingleX#logMaxTailSize (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhKhihhQ]ubeubhS)r}r(hVUhWhThXh[j}h]h^h_}r(ha]hb]hc]hd]r(h7jehf]r h auhhKhihj}r jjshQ]r (hk)r }r (hVhhWjhXh[h]hoh_}r(hd]hc]ha]hb]hf]jhuhhKhihhQ]rhrX Log Handlingrr}r(hVhhWj ubaubj.)r}r(hVX~c['logCompressionLimit'] = 16384 c['logCompressionMethod'] = 'gz' c['logMaxSize'] = 1024*1024 # 1M c['logMaxTailSize'] = 32768hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhKhihhQ]rhrX~c['logCompressionLimit'] = 16384 c['logCompressionMethod'] = 'gz' c['logMaxSize'] = 1024*1024 # 1M c['logMaxTailSize'] = 32768rr}r(hVUhWjubaubhv)r}r(hVXwThe :bb:cfg:`logCompressionLimit` enables compression of build logs on disk for logs that are bigger than the given size, or disables that completely if set to ``False``. The default value is 4096, which should be a reasonable default on most file systems. This setting has no impact on status plugins, and merely affects the required disk space on the master for build logs.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXThe rr}r (hVXThe hWjubj)r!}r"(hVX:bb:cfg:`logCompressionLimit`r#hWjhXh[h]jh_}r$(UreftypeXcfgj j XlogCompressionLimitU refdomainXbbr%hd]hc]U refexplicitha]hb]hf]j juhhKhQ]r&j)r'}r((hVj#h_}r)(ha]hb]r*(jj%Xbb-cfgr+ehc]hd]hf]uhWj!hQ]r,hrXlogCompressionLimitr-r.}r/(hVUhWj'ubah]jubaubhrX enables compression of build logs on disk for logs that are bigger than the given size, or disables that completely if set to r0r1}r2(hVX enables compression of build logs on disk for logs that are bigger than the given size, or disables that completely if set to hWjubj)r3}r4(hVX ``False``h_}r5(ha]hb]hc]hd]hf]uhWjhQ]r6hrXFalser7r8}r9(hVUhWj3ubah]jubhrX. The default value is 4096, which should be a reasonable default on most file systems. This setting has no impact on status plugins, and merely affects the required disk space on the master for build logs.r:r;}r<(hVX. The default value is 4096, which should be a reasonable default on most file systems. This setting has no impact on status plugins, and merely affects the required disk space on the master for build logs.hWjubeubhv)r=}r>(hVXThe :bb:cfg:`logCompressionMethod` controls what type of compression is used for build logs. The default is 'bz2', and the other valid option is 'gz'. 'bz2' offers better compression at the expense of more CPU time.hWjhXh[h]hzh_}r?(ha]hb]hc]hd]hf]uhhKhihhQ]r@(hrXThe rArB}rC(hVXThe hWj=ubj)rD}rE(hVX:bb:cfg:`logCompressionMethod`rFhWj=hXh[h]jh_}rG(UreftypeXcfgj j XlogCompressionMethodU refdomainXbbrHhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rIj)rJ}rK(hVjFh_}rL(ha]hb]rM(jjHXbb-cfgrNehc]hd]hf]uhWjDhQ]rOhrXlogCompressionMethodrPrQ}rR(hVUhWjJubah]jubaubhrX controls what type of compression is used for build logs. The default is 'bz2', and the other valid option is 'gz'. 'bz2' offers better compression at the expense of more CPU time.rSrT}rU(hVX controls what type of compression is used for build logs. The default is 'bz2', and the other valid option is 'gz'. 'bz2' offers better compression at the expense of more CPU time.hWj=ubeubhv)rV}rW(hVXAThe :bb:cfg:`logMaxSize` parameter sets an upper limit (in bytes) to how large logs from an individual build step can be. The default value is None, meaning no upper limit to the log size. Any output exceeding :bb:cfg:`logMaxSize` will be truncated, and a message to this effect will be added to the log's HEADER channel.hWjhXh[h]hzh_}rX(ha]hb]hc]hd]hf]uhhKhihhQ]rY(hrXThe rZr[}r\(hVXThe hWjVubj)r]}r^(hVX:bb:cfg:`logMaxSize`r_hWjVhXh[h]jh_}r`(UreftypeXcfgj j X logMaxSizeU refdomainXbbrahd]hc]U refexplicitha]hb]hf]j juhhKhQ]rbj)rc}rd(hVj_h_}re(ha]hb]rf(jjaXbb-cfgrgehc]hd]hf]uhWj]hQ]rhhrX logMaxSizerirj}rk(hVUhWjcubah]jubaubhrX parameter sets an upper limit (in bytes) to how large logs from an individual build step can be. The default value is None, meaning no upper limit to the log size. Any output exceeding rlrm}rn(hVX parameter sets an upper limit (in bytes) to how large logs from an individual build step can be. The default value is None, meaning no upper limit to the log size. Any output exceeding hWjVubj)ro}rp(hVX:bb:cfg:`logMaxSize`rqhWjVhXh[h]jh_}rr(UreftypeXcfgj j X logMaxSizeU refdomainXbbrshd]hc]U refexplicitha]hb]hf]j juhhKhQ]rtj)ru}rv(hVjqh_}rw(ha]hb]rx(jjsXbb-cfgryehc]hd]hf]uhWjohQ]rzhrX logMaxSizer{r|}r}(hVUhWjuubah]jubaubhrX[ will be truncated, and a message to this effect will be added to the log's HEADER channel.r~r}r(hVX[ will be truncated, and a message to this effect will be added to the log's HEADER channel.hWjVubeubhv)r}r(hVXIf :bb:cfg:`logMaxSize` is set, and the output from a step exceeds the maximum, the :bb:cfg:`logMaxTailSize` parameter controls how much of the end of the build log will be kept. The effect of setting this parameter is that the log will contain the first :bb:cfg:`logMaxSize` bytes and the last :bb:cfg:`logMaxTailSize` bytes of output. Don't set this value too high, as the the tail of the log is kept in memory.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXIf rr}r(hVXIf hWjubj)r}r(hVX:bb:cfg:`logMaxSize`rhWjhXh[h]jh_}r(UreftypeXcfgj j X logMaxSizeU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX logMaxSizerr}r(hVUhWjubah]jubaubhrX= is set, and the output from a step exceeds the maximum, the rr}r(hVX= is set, and the output from a step exceeds the maximum, the hWjubj)r}r(hVX:bb:cfg:`logMaxTailSize`rhWjhXh[h]jh_}r(UreftypeXcfgj j XlogMaxTailSizeU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrXlogMaxTailSizerr}r(hVUhWjubah]jubaubhrX parameter controls how much of the end of the build log will be kept. The effect of setting this parameter is that the log will contain the first rr}r(hVX parameter controls how much of the end of the build log will be kept. The effect of setting this parameter is that the log will contain the first hWjubj)r}r(hVX:bb:cfg:`logMaxSize`rhWjhXh[h]jh_}r(UreftypeXcfgj j X logMaxSizeU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX logMaxSizerr}r(hVUhWjubah]jubaubhrX bytes and the last rr}r(hVX bytes and the last hWjubj)r}r(hVX:bb:cfg:`logMaxTailSize`rhWjhXh[h]jh_}r(UreftypeXcfgj j XlogMaxTailSizeU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrXlogMaxTailSizerr}r(hVUhWjubah]jubaubhrX^ bytes of output. Don't set this value too high, as the the tail of the log is kept in memory.rr}r(hVX^ bytes of output. Don't set this value too high, as the the tail of the log is kept in memory.hWjubeubeubhS)r}r(hVUhWhThXh[h]h^h_}r(ha]hb]hc]hd]rhEahf]rhauhhKhihhQ]r(hk)r}r(hVhhWjhXh[h]hoh_}r(hd]hc]ha]hb]hf]jhuhhKhihhQ]rhrX Data Lifetimerr}r(hVhhWjubaubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX!Buildmaster Config; changeHorizonXcfg-changeHorizonrjtr(UsingleX"changeHorizon (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX Buildmaster Config; buildHorizonXcfg-buildHorizonrjtr(UsingleX!buildHorizon (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX Buildmaster Config; eventHorizonXcfg-eventHorizonrjtr(UsingleX!eventHorizon (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; logHorizonXcfg-logHorizonrjtr(UsingleXlogHorizon (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhKhihhQ]ubhS)r}r (hVUhWjhXh[j}h]h^h_}r (ha]hb]hc]hd]r (hKjehf]r h!auhhKhihj}r jjshQ]r(hk)r}r(hVXHorizonsrhWjhXh[h]hoh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]rhrXHorizonsrr}r(hVjhWjubaubj.)r}r(hVXuc['changeHorizon'] = 200 c['buildHorizon'] = 100 c['eventHorizon'] = 50 c['logHorizon'] = 40 c['buildCacheSize'] = 15hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhKhihhQ]rhrXuc['changeHorizon'] = 200 c['buildHorizon'] = 100 c['eventHorizon'] = 50 c['logHorizon'] = 40 c['buildCacheSize'] = 15rr}r(hVUhWjubaubhv)r}r(hVXBuildbot stores historical information on disk in the form of "Pickle" files and compressed logfiles. In a large installation, these can quickly consume disk space, yet in many cases developers never consult this historical information.r hWjhXh[h]hzh_}r!(ha]hb]hc]hd]hf]uhhKhihhQ]r"hrXBuildbot stores historical information on disk in the form of "Pickle" files and compressed logfiles. In a large installation, these can quickly consume disk space, yet in many cases developers never consult this historical information.r#r$}r%(hVj hWjubaubhv)r&}r'(hVXThe :bb:cfg:`changeHorizon` key determines how many changes the master will keep a record of. One place these changes are displayed is on the waterfall page. This parameter defaults to 0, which means keep all changes indefinitely.hWjhXh[h]hzh_}r((ha]hb]hc]hd]hf]uhhKhihhQ]r)(hrXThe r*r+}r,(hVXThe hWj&ubj)r-}r.(hVX:bb:cfg:`changeHorizon`r/hWj&hXh[h]jh_}r0(UreftypeXcfgj j X changeHorizonU refdomainXbbr1hd]hc]U refexplicitha]hb]hf]j juhhKhQ]r2j)r3}r4(hVj/h_}r5(ha]hb]r6(jj1Xbb-cfgr7ehc]hd]hf]uhWj-hQ]r8hrX changeHorizonr9r:}r;(hVUhWj3ubah]jubaubhrX key determines how many changes the master will keep a record of. One place these changes are displayed is on the waterfall page. This parameter defaults to 0, which means keep all changes indefinitely.r<r=}r>(hVX key determines how many changes the master will keep a record of. One place these changes are displayed is on the waterfall page. This parameter defaults to 0, which means keep all changes indefinitely.hWj&ubeubhv)r?}r@(hVX{The :bb:cfg:`buildHorizon` specifies the minimum number of builds for each builder which should be kept on disk. The :bb:cfg:`eventHorizon` specifies the minimum number of events to keep--events mostly describe connections and disconnections of slaves, and are seldom helpful to developers. The :bb:cfg:`logHorizon` gives the minimum number of builds for which logs should be maintained; this parameter must be less than or equal to :bb:cfg:`buildHorizon`. Builds older than :bb:cfg:`logHorizon` but not older than :bb:cfg:`buildHorizon` will maintain their overall status and the status of each step, but the logfiles will be deleted.hWjhXh[h]hzh_}rA(ha]hb]hc]hd]hf]uhhKhihhQ]rB(hrXThe rCrD}rE(hVXThe hWj?ubj)rF}rG(hVX:bb:cfg:`buildHorizon`rHhWj?hXh[h]jh_}rI(UreftypeXcfgj j X buildHorizonU refdomainXbbrJhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rKj)rL}rM(hVjHh_}rN(ha]hb]rO(jjJXbb-cfgrPehc]hd]hf]uhWjFhQ]rQhrX buildHorizonrRrS}rT(hVUhWjLubah]jubaubhrX[ specifies the minimum number of builds for each builder which should be kept on disk. The rUrV}rW(hVX[ specifies the minimum number of builds for each builder which should be kept on disk. The hWj?ubj)rX}rY(hVX:bb:cfg:`eventHorizon`rZhWj?hXh[h]jh_}r[(UreftypeXcfgj j X eventHorizonU refdomainXbbr\hd]hc]U refexplicitha]hb]hf]j juhhKhQ]r]j)r^}r_(hVjZh_}r`(ha]hb]ra(jj\Xbb-cfgrbehc]hd]hf]uhWjXhQ]rchrX eventHorizonrdre}rf(hVUhWj^ubah]jubaubhrX specifies the minimum number of events to keep--events mostly describe connections and disconnections of slaves, and are seldom helpful to developers. The rgrh}ri(hVX specifies the minimum number of events to keep--events mostly describe connections and disconnections of slaves, and are seldom helpful to developers. The hWj?ubj)rj}rk(hVX:bb:cfg:`logHorizon`rlhWj?hXh[h]jh_}rm(UreftypeXcfgj j X logHorizonU refdomainXbbrnhd]hc]U refexplicitha]hb]hf]j juhhKhQ]roj)rp}rq(hVjlh_}rr(ha]hb]rs(jjnXbb-cfgrtehc]hd]hf]uhWjjhQ]ruhrX logHorizonrvrw}rx(hVUhWjpubah]jubaubhrXv gives the minimum number of builds for which logs should be maintained; this parameter must be less than or equal to ryrz}r{(hVXv gives the minimum number of builds for which logs should be maintained; this parameter must be less than or equal to hWj?ubj)r|}r}(hVX:bb:cfg:`buildHorizon`r~hWj?hXh[h]jh_}r(UreftypeXcfgj j X buildHorizonU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVj~h_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWj|hQ]rhrX buildHorizonrr}r(hVUhWjubah]jubaubhrX. Builds older than rr}r(hVX. Builds older than hWj?ubj)r}r(hVX:bb:cfg:`logHorizon`rhWj?hXh[h]jh_}r(UreftypeXcfgj j X logHorizonU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX logHorizonrr}r(hVUhWjubah]jubaubhrX but not older than rr}r(hVX but not older than hWj?ubj)r}r(hVX:bb:cfg:`buildHorizon`rhWj?hXh[h]jh_}r(UreftypeXcfgj j X buildHorizonU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrX buildHorizonrr}r(hVUhWjubah]jubaubhrXb will maintain their overall status and the status of each step, but the logfiles will be deleted.rr}r(hVXb will maintain their overall status and the status of each step, but the logfiles will be deleted.hWj?ubeubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleXBuildmaster Config; cachesX cfg-cachesrjtr(UsingleXcaches (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX#Buildmaster Config; changeCacheSizeXcfg-changeCacheSizerjtr(UsingleX$changeCacheSize (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(ha]hb]hc]hd]rjahf]uhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]Uentries]r((UsingleX"Buildmaster Config; buildCacheSizeXcfg-buildCacheSizerjtr(UsingleX#buildCacheSize (Buildmaster Config)jjtreuhhKhihhQ]ubj)r}r(hVUhWjhXh[h]jh_}r(hd]hc]ha]hb]hf]jjuhhKhihhQ]ubeubhS)r}r(hVUhWjhXh[j}h]h^h_}r(ha]hb]hc]hd]r(hPjehf]rh&auhhKhihj}rjjshQ]r(hk)r}r(hVXCachesrhWjhXh[h]hoh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]rhrXCachesrr}r(hVjhWjubaubj.)r}r(hVX c['caches'] = { 'Changes' : 100, # formerly c['changeCacheSize'] 'Builds' : 500, # formerly c['buildCacheSize'] 'chdicts' : 100, 'BuildRequests' : 10, 'SourceStamps' : 20, 'ssdicts' : 20, 'objectids' : 10, 'usdicts' : 100, }hWjhXh[h]j1h_}r(j3j4hd]hc]ha]hb]hf]uhhKhihhQ]rhrX c['caches'] = { 'Changes' : 100, # formerly c['changeCacheSize'] 'Builds' : 500, # formerly c['buildCacheSize'] 'chdicts' : 100, 'BuildRequests' : 10, 'SourceStamps' : 20, 'ssdicts' : 20, 'objectids' : 10, 'usdicts' : 100, }rr}r(hVUhWjubaubhv)r}r(hVX"The :bb:cfg:`caches` configuration key contains the configuration for Buildbot's in-memory caches. These caches keep frequently-used objects in memory to avoid unnecessary trips to the database or to pickle files. Caches are divided by object type, and each has a configurable maximum size.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]r(hrXThe rr}r(hVXThe hWjubj)r}r(hVX:bb:cfg:`caches`rhWjhXh[h]jh_}r(UreftypeXcfgj j XcachesU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhKhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrXcachesrr}r(hVUhWjubah]jubaubhrX configuration key contains the configuration for Buildbot's in-memory caches. These caches keep frequently-used objects in memory to avoid unnecessary trips to the database or to pickle files. Caches are divided by object type, and each has a configurable maximum size.rr}r(hVX configuration key contains the configuration for Buildbot's in-memory caches. These caches keep frequently-used objects in memory to avoid unnecessary trips to the database or to pickle files. Caches are divided by object type, and each has a configurable maximum size.hWjubeubhv)r}r(hVXThe default size for each cache is 1, except where noted below. A value of 1 allows Buildbot to make a number of optimizations without consuming much memory. Larger, busier installations will likely want to increase these values.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhKhihhQ]rhrXThe default size for each cache is 1, except where noted below. A value of 1 allows Buildbot to make a number of optimizations without consuming much memory. Larger, busier installations will likely want to increase these values.rr}r(hVjhWjubaubhv)r }r (hVXThe available caches are:r hWjhXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r hrXThe available caches are:rr}r(hVj hWj ubaubcdocutils.nodes definition_list r)r}r(hVUhWjhXh[h]Udefinition_listrh_}r(ha]hb]hc]hd]hf]uhhNhihhQ]r(cdocutils.nodes definition_list_item r)r}r(hVX``Changes`` the number of change objects to cache in memory. This should be larger than the number of changes that typically arrive in the span of a few minutes, otherwise your schedulers will be reloading changes from the database every time they run. For distributed version control systems, like Git or Hg, several thousand changes may arrive at once, so setting this parameter to something like 10000 isn't unreasonable. This parameter is the same as the deprecated global parameter :bb:cfg:`changeCacheSize`. Its default value is 10. hWjhXh[h]Udefinition_list_itemrh_}r(ha]hb]hc]hd]hf]uhhM hQ]r(cdocutils.nodes term r)r}r(hVX ``Changes``r hWjhXh[h]Utermr!h_}r"(ha]hb]hc]hd]hf]uhhM hQ]r#j)r$}r%(hVj h_}r&(ha]hb]hc]hd]hf]uhWjhQ]r'hrXChangesr(r)}r*(hVUhWj$ubah]jubaubcdocutils.nodes definition r+)r,}r-(hVUh_}r.(ha]hb]hc]hd]hf]uhWjhQ]r/(hv)r0}r1(hVXthe number of change objects to cache in memory. This should be larger than the number of changes that typically arrive in the span of a few minutes, otherwise your schedulers will be reloading changes from the database every time they run. For distributed version control systems, like Git or Hg, several thousand changes may arrive at once, so setting this parameter to something like 10000 isn't unreasonable.r2hWj,hXh[h]hzh_}r3(ha]hb]hc]hd]hf]uhhMhQ]r4hrXthe number of change objects to cache in memory. This should be larger than the number of changes that typically arrive in the span of a few minutes, otherwise your schedulers will be reloading changes from the database every time they run. For distributed version control systems, like Git or Hg, several thousand changes may arrive at once, so setting this parameter to something like 10000 isn't unreasonable.r5r6}r7(hVj2hWj0ubaubhv)r8}r9(hVXrThis parameter is the same as the deprecated global parameter :bb:cfg:`changeCacheSize`. Its default value is 10.hWj,hXh[h]hzh_}r:(ha]hb]hc]hd]hf]uhhM hQ]r;(hrX>This parameter is the same as the deprecated global parameter r<r=}r>(hVX>This parameter is the same as the deprecated global parameter hWj8ubj)r?}r@(hVX:bb:cfg:`changeCacheSize`rAhWj8hXh[h]jh_}rB(UreftypeXcfgj j XchangeCacheSizeU refdomainXbbrChd]hc]U refexplicitha]hb]hf]j juhhM hQ]rDj)rE}rF(hVjAh_}rG(ha]hb]rH(jjCXbb-cfgrIehc]hd]hf]uhWj?hQ]rJhrXchangeCacheSizerKrL}rM(hVUhWjEubah]jubaubhrX. Its default value is 10.rNrO}rP(hVX. Its default value is 10.hWj8ubeubeh]U definitionrQubeubj)rR}rS(hVX``Builds`` The :bb:cfg:`buildCacheSize` parameter gives the number of builds for each builder which are cached in memory. This number should be larger than the number of builds required for commonly-used status displays (the waterfall or grid views), so that those displays do not miss the cache on a refresh. This parameter is the same as the deprecated global parameter :bb:cfg:`buildCacheSize`. Its default value is 15. hWjhXh[h]jh_}rT(ha]hb]hc]hd]hf]uhhMhihhQ]rU(j)rV}rW(hVX ``Builds``rXhWjRhXh[h]j!h_}rY(ha]hb]hc]hd]hf]uhhMhQ]rZj)r[}r\(hVjXh_}r](ha]hb]hc]hd]hf]uhWjVhQ]r^hrXBuildsr_r`}ra(hVUhWj[ubah]jubaubj+)rb}rc(hVUh_}rd(ha]hb]hc]hd]hf]uhWjRhQ]re(hv)rf}rg(hVX*The :bb:cfg:`buildCacheSize` parameter gives the number of builds for each builder which are cached in memory. This number should be larger than the number of builds required for commonly-used status displays (the waterfall or grid views), so that those displays do not miss the cache on a refresh.hWjbhXh[h]hzh_}rh(ha]hb]hc]hd]hf]uhhM hQ]ri(hrXThe rjrk}rl(hVXThe hWjfubj)rm}rn(hVX:bb:cfg:`buildCacheSize`rohWjfhXh[h]jh_}rp(UreftypeXcfgj j XbuildCacheSizeU refdomainXbbrqhd]hc]U refexplicitha]hb]hf]j juhhM hQ]rrj)rs}rt(hVjoh_}ru(ha]hb]rv(jjqXbb-cfgrwehc]hd]hf]uhWjmhQ]rxhrXbuildCacheSizeryrz}r{(hVUhWjsubah]jubaubhrX parameter gives the number of builds for each builder which are cached in memory. This number should be larger than the number of builds required for commonly-used status displays (the waterfall or grid views), so that those displays do not miss the cache on a refresh.r|r}}r~(hVX parameter gives the number of builds for each builder which are cached in memory. This number should be larger than the number of builds required for commonly-used status displays (the waterfall or grid views), so that those displays do not miss the cache on a refresh.hWjfubeubhv)r}r(hVXqThis parameter is the same as the deprecated global parameter :bb:cfg:`buildCacheSize`. Its default value is 15.hWjbhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhQ]r(hrX>This parameter is the same as the deprecated global parameter rr}r(hVX>This parameter is the same as the deprecated global parameter hWjubj)r}r(hVX:bb:cfg:`buildCacheSize`rhWjhXh[h]jh_}r(UreftypeXcfgj j XbuildCacheSizeU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhMhQ]rj)r}r(hVjh_}r(ha]hb]r(jjXbb-cfgrehc]hd]hf]uhWjhQ]rhrXbuildCacheSizerr}r(hVUhWjubah]jubaubhrX. Its default value is 15.rr}r(hVX. Its default value is 15.hWjubeubeh]jQubeubj)r}r(hVX``chdicts`` The number of rows from the ``changes`` table to cache in memory. This value should be similar to the value for ``Changes``. hWjhXh[h]jh_}r(ha]hb]hc]hd]hf]uhhMhihhQ]r(j)r}r(hVX ``chdicts``rhWjhXh[h]j!h_}r(ha]hb]hc]hd]hf]uhhMhQ]rj)r}r(hVjh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXchdictsrr}r(hVUhWjubah]jubaubj+)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVX|The number of rows from the ``changes`` table to cache in memory. This value should be similar to the value for ``Changes``.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhQ]r(hrXThe number of rows from the rr}r(hVXThe number of rows from the hWjubj)r}r(hVX ``changes``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXchangesrr}r(hVUhWjubah]jubhrXI table to cache in memory. This value should be similar to the value for rr}r(hVXI table to cache in memory. This value should be similar to the value for hWjubj)r}r(hVX ``Changes``h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXChangesrr}r(hVUhWjubah]jubhrX.r}r(hVX.hWjubeubah]jQubeubj)r}r(hVX``BuildRequests`` The number of BuildRequest objects kept in memory. This number should be higher than the typical number of outstanding build requests. If the master ordinarily finds jobs for BuildRequests immediately, you may set a lower value. hWjhXh[h]jh_}r(ha]hb]hc]hd]hf]uhhMhihhQ]r(j)r}r(hVX``BuildRequests``rhWjhXh[h]j!h_}r(ha]hb]hc]hd]hf]uhhMhQ]rj)r}r(hVjh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX BuildRequestsrr}r(hVUhWjubah]jubaubj+)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVXThe number of BuildRequest objects kept in memory. This number should be higher than the typical number of outstanding build requests. If the master ordinarily finds jobs for BuildRequests immediately, you may set a lower value.rhWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhQ]rhrXThe number of BuildRequest objects kept in memory. This number should be higher than the typical number of outstanding build requests. If the master ordinarily finds jobs for BuildRequests immediately, you may set a lower value.rr}r(hVjhWjubaubah]jQubeubj)r}r(hVX``SourceStamps`` the number of SourceStamp objects kept in memory. This number should generally be similar to the number ``BuildRequesets``. hWjhXh[h]jh_}r(ha]hb]hc]hd]hf]uhhMhihhQ]r(j)r}r(hVX``SourceStamps``rhWjhXh[h]j!h_}r(ha]hb]hc]hd]hf]uhhMhQ]rj)r}r(hVjh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX SourceStampsrr}r(hVUhWjubah]jubaubj+)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVX{the number of SourceStamp objects kept in memory. This number should generally be similar to the number ``BuildRequesets``.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhQ]r(hrXhthe number of SourceStamp objects kept in memory. This number should generally be similar to the number rr}r(hVXhthe number of SourceStamp objects kept in memory. This number should generally be similar to the number hWjubj)r}r(hVX``BuildRequesets``h_}r(ha]hb]hc]hd]hf]uhWjhQ]r hrXBuildRequesetsr r }r (hVUhWjubah]jubhrX.r }r (hVX.hWjubeubah]jQubeubj)r }r (hVX``ssdicts`` The number of rows from the ``sourcestamps`` table to cache in memory. This value should be similar to the value for ``SourceStamps``. hWjhXh[h]jh_}r (ha]hb]hc]hd]hf]uhhM hihhQ]r (j)r }r (hVX ``ssdicts``r hWj hXh[h]j!h_}r (ha]hb]hc]hd]hf]uhhM hQ]r j)r }r (hVj h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXssdictsr r }r (hVUhWj ubah]jubaubj+)r }r (hVUh_}r (ha]hb]hc]hd]hf]uhWj hQ]r hv)r }r (hVXThe number of rows from the ``sourcestamps`` table to cache in memory. This value should be similar to the value for ``SourceStamps``.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhQ]r (hrXThe number of rows from the r r }r (hVXThe number of rows from the hWj ubj)r! }r" (hVX``sourcestamps``h_}r# (ha]hb]hc]hd]hf]uhWj hQ]r$ hrX sourcestampsr% r& }r' (hVUhWj! ubah]jubhrXI table to cache in memory. This value should be similar to the value for r( r) }r* (hVXI table to cache in memory. This value should be similar to the value for hWj ubj)r+ }r, (hVX``SourceStamps``h_}r- (ha]hb]hc]hd]hf]uhWj hQ]r. hrX SourceStampsr/ r0 }r1 (hVUhWj+ ubah]jubhrX.r2 }r3 (hVX.hWj ubeubah]jQubeubj)r4 }r5 (hVX``objectids`` The number of object IDs - a means to correlate an object in the Buildbot configuration with an identity in the database--to cache. In this version, object IDs are not looked up often during runtime, so a relatively low value such as 10 is fine. hWjhXh[h]jh_}r6 (ha]hb]hc]hd]hf]uhhM$hihhQ]r7 (j)r8 }r9 (hVX ``objectids``r: hWj4 hXh[h]j!h_}r; (ha]hb]hc]hd]hf]uhhM$hQ]r< j)r= }r> (hVj: h_}r? (ha]hb]hc]hd]hf]uhWj8 hQ]r@ hrX objectidsrA rB }rC (hVUhWj= ubah]jubaubj+)rD }rE (hVUh_}rF (ha]hb]hc]hd]hf]uhWj4 hQ]rG hv)rH }rI (hVXThe number of object IDs - a means to correlate an object in the Buildbot configuration with an identity in the database--to cache. In this version, object IDs are not looked up often during runtime, so a relatively low value such as 10 is fine.rJ hWjD hXh[h]hzh_}rK (ha]hb]hc]hd]hf]uhhM#hQ]rL hrXThe number of object IDs - a means to correlate an object in the Buildbot configuration with an identity in the database--to cache. In this version, object IDs are not looked up often during runtime, so a relatively low value such as 10 is fine.rM rN }rO (hVjJ hWjH ubaubah]jQubeubj)rP }rQ (hVX``usdicts`` The number of rows from the ``users`` table to cache in memory. Note that for a given user there will be a row for each attribute that user has. c['buildCacheSize'] = 15 hWjhXh[h]jh_}rR (ha]hb]hc]hd]hf]uhhM*hihhQ]rS (j)rT }rU (hVX ``usdicts``rV hWjP hXh[h]j!h_}rW (ha]hb]hc]hd]hf]uhhM*hQ]rX j)rY }rZ (hVjV h_}r[ (ha]hb]hc]hd]hf]uhWjT hQ]r\ hrXusdictsr] r^ }r_ (hVUhWjY ubah]jubaubj+)r` }ra (hVUh_}rb (ha]hb]hc]hd]hf]uhWjP hQ]rc (hv)rd }re (hVXThe number of rows from the ``users`` table to cache in memory. Note that for a given user there will be a row for each attribute that user has.hWj` hXh[h]hzh_}rf (ha]hb]hc]hd]hf]uhhM'hQ]rg (hrXThe number of rows from the rh ri }rj (hVXThe number of rows from the hWjd ubj)rk }rl (hVX ``users``h_}rm (ha]hb]hc]hd]hf]uhWjd hQ]rn hrXusersro rp }rq (hVUhWjk ubah]jubhrXk table to cache in memory. Note that for a given user there will be a row for each attribute that user has.rr rs }rt (hVXk table to cache in memory. Note that for a given user there will be a row for each attribute that user has.hWjd ubeubhv)ru }rv (hVXc['buildCacheSize'] = 15rw hWj` hXh[h]hzh_}rx (ha]hb]hc]hd]hf]uhhM*hQ]ry hrXc['buildCacheSize'] = 15rz r{ }r| (hVjw hWju ubaubeh]jQubeubeubj)r} }r~ (hVUhWjhXh[h]jh_}r (hd]hc]ha]hb]hf]Uentries]r ((UsingleX!Buildmaster Config; mergeRequestsXcfg-mergeRequestsr j tr (UsingleX"mergeRequests (Buildmaster Config)j j tr euhhM-hihhQ]ubj)r }r (hVUhWjhXh[h]jh_}r (ha]hb]hc]hd]r j ahf]uhhM-hihhQ]ubj)r }r (hVUhWjhXh[h]jh_}r (hd]hc]ha]hb]hf]j]r (jXBuilds; mergingUindex-3r Utr ajuhhM.hihhQ]ubj)r }r (hVUhWjhXh[h]jh_}r (hd]hc]ha]hb]hf]jj uhhM/hihhQ]ubeubeubhS)r }r (hVUhWhThXh[j}h]h^h_}r (ha]hb]hc]hd]r (h?j ehf]r hauhhM1hihj}r j j shQ]r (hk)r }r (hVjhWj hXh[h]hoh_}r (hd]hc]ha]hb]hf]jhuhhM1hihhQ]r hrXMerging Build Requestsr r }r (hVjhWj ubaubj.)r }r (hVXc['mergeRequests'] = TruehWj hXh[h]j1h_}r (j/j0Xpythonj3j4hd]hc]ha]hb]hf]uhhM3hihhQ]r hrXc['mergeRequests'] = Truer r }r (hVUhWj ubaubhv)r }r (hVX{This is a global default value for builders' :bb:cfg:`mergeRequests` parameter, and controls the merging of build requests.r hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhM7hihhQ]r (hrX-This is a global default value for builders' r r }r (hVX-This is a global default value for builders' hWj ubj)r }r (hVX:bb:cfg:`mergeRequests`r hWj hXh[h]jh_}r (UreftypeXcfgj j X mergeRequestsU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhM7hQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r hrX mergeRequestsr r }r (hVUhWj ubah]jubaubhrX7 parameter, and controls the merging of build requests.r r }r (hVX7 parameter, and controls the merging of build requests.hWj ubeubhv)r }r (hVXThis parameter can be overridden on a per-builder basis. See :ref:`Merging-Build-Requests` for the allowed values for this parameter.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhM9hihhQ]r (hrX=This parameter can be overridden on a per-builder basis. See r r }r (hVX=This parameter can be overridden on a per-builder basis. See hWj ubj)r }r (hVX:ref:`Merging-Build-Requests`r hWj hXh[h]jh_}r (UreftypeXrefj j Xmerging-build-requestsU refdomainXstdr hd]hc]U refexplicitha]hb]hf]j juhhM9hQ]r js)r }r (hVj h_}r (ha]hb]r (jj Xstd-refr ehc]hd]hf]uhWj hQ]r hrXMerging-Build-Requestsr r }r (hVUhWj ubah]j}ubaubhrX+ for the allowed values for this parameter.r r }r (hVX+ for the allowed values for this parameter.hWj ubeubj)r }r (hVUhWj hXh[h]jh_}r (hd]hc]ha]hb]hf]j]r (jXBuilders; priorityUindex-4r Utr ajuhhM<hihhQ]ubj)r }r (hVUhWj hXh[h]jh_}r (ha]hb]hc]hd]r j ahf]uhhM=hihhQ]ubj)r }r (hVUhWj hXh[h]jh_}r (hd]hc]ha]hb]hf]Uentries]r ((UsingleX&Buildmaster Config; prioritizeBuildersXcfg-prioritizeBuildersr j tr (UsingleX'prioritizeBuilders (Buildmaster Config)j j tr euhhM?hihhQ]ubj)r }r (hVUhWj hXh[h]jh_}r (hd]hc]ha]hb]hf]jj uhhM?hihhQ]ubj)r }r (hVX.. _Prioritizing-Builders:hWj hXh[j}h]jh_}r (hd]hc]ha]hb]hf]jh=uhhM@hihj}r j j shQ]ubeubhS)r }r (hVUhWhThXh[j}r hj sh]h^h_}r (ha]hb]hc]hd]r (h=j h2ehf]r (hheuhhMChihj}r (j j h=j uhQ]r (hk)r }r (hVjhWj hXh[h]hoh_}r (hd]hc]ha]hb]hf]jj uhhMChihhQ]r hrXPrioritizing Buildersr r }r (hVjhWj ubaubj.)r }r (hVXcdef prioritizeBuilders(buildmaster, builders): ... c['prioritizeBuilders'] = prioritizeBuildershWj hXh[h]j1h_}r (j/j0Xpythonj3j4hd]hc]ha]hb]hf]uhhMEhihhQ]r hrXcdef prioritizeBuilders(buildmaster, builders): ... c['prioritizeBuilders'] = prioritizeBuildersr r }r (hVUhWj ubaubhv)r }r (hVX0By default, buildbot will attempt to start builds on builders in order, beginning with the builder with the oldest pending request. Customize this behavior with the :bb:cfg:`prioritizeBuilders` configuration key, which takes a callable. See :ref:`Builder-Priority-Functions` for details on this callable.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMKhihhQ]r (hrXBy default, buildbot will attempt to start builds on builders in order, beginning with the builder with the oldest pending request. Customize this behavior with the r r }r (hVXBy default, buildbot will attempt to start builds on builders in order, beginning with the builder with the oldest pending request. Customize this behavior with the hWj ubj)r }r (hVX:bb:cfg:`prioritizeBuilders`r hWj hXh[h]jh_}r (UreftypeXcfgj j XprioritizeBuildersU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhMKhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r hrXprioritizeBuildersr r }r (hVUhWj ubah]jubaubhrX0 configuration key, which takes a callable. See r r }r (hVX0 configuration key, which takes a callable. See hWj ubj)r }r! (hVX!:ref:`Builder-Priority-Functions`r" hWj hXh[h]jh_}r# (UreftypeXrefj j Xbuilder-priority-functionsU refdomainXstdr$ hd]hc]U refexplicitha]hb]hf]j juhhMKhQ]r% js)r& }r' (hVj" h_}r( (ha]hb]r) (jj$ Xstd-refr* ehc]hd]hf]uhWj hQ]r+ hrXBuilder-Priority-Functionsr, r- }r. (hVUhWj& ubah]j}ubaubhrX for details on this callable.r/ r0 }r1 (hVX for details on this callable.hWj ubeubhv)r2 }r3 (hVXBThis parameter controls the order that the build master can start builds, and is useful in situations where there is resource contention between builders, e.g., for a test database. It does not affect the order in which a builder processes the build requests in its queue. For that purpose, see :ref:`Prioritizing-Builds`.hWj hXh[h]hzh_}r4 (ha]hb]hc]hd]hf]uhhMOhihhQ]r5 (hrX'This parameter controls the order that the build master can start builds, and is useful in situations where there is resource contention between builders, e.g., for a test database. It does not affect the order in which a builder processes the build requests in its queue. For that purpose, see r6 r7 }r8 (hVX'This parameter controls the order that the build master can start builds, and is useful in situations where there is resource contention between builders, e.g., for a test database. It does not affect the order in which a builder processes the build requests in its queue. For that purpose, see hWj2 ubj)r9 }r: (hVX:ref:`Prioritizing-Builds`r; hWj2 hXh[h]jh_}r< (UreftypeXrefj j Xprioritizing-buildsU refdomainXstdr= hd]hc]U refexplicitha]hb]hf]j juhhMOhQ]r> js)r? }r@ (hVj; h_}rA (ha]hb]rB (jj= Xstd-refrC ehc]hd]hf]uhWj9 hQ]rD hrXPrioritizing-BuildsrE rF }rG (hVUhWj? ubah]j}ubaubhrX.rH }rI (hVX.hWj2 ubeubj)rJ }rK (hVUhWj hXh[h]jh_}rL (hd]hc]ha]hb]hf]Uentries]rM ((UsingleXBuildmaster Config; protocolsX cfg-protocolsrN jN trO (UsingleXprotocols (Buildmaster Config)jN jN trP euhhMThihhQ]ubj)rQ }rR (hVUhWj hXh[h]jh_}rS (hd]hc]ha]hb]hf]jjN uhhMThihhQ]ubj)rT }rU (hVX#.. _Setting-the-PB-Port-for-Slaves:hWj hXh[j}h]jh_}rV (hd]hc]ha]hb]hf]jhMuhhMUhihj}rW jN jQ shQ]ubeubhS)rX }rY (hVUhWhThXh[j}rZ h#jT sh]h^h_}r[ (ha]hb]hc]hd]r\ (hMjN hAehf]r] (hh#euhhMXhihj}r^ (hMjT jN jQ uhQ]r_ (hk)r` }ra (hVj$hWjX hXh[h]hoh_}rb (hd]hc]ha]hb]hf]jjuhhMXhihhQ]rc hrXSetting the PB Port for Slavesrd re }rf (hVj$hWj` ubaubj.)rg }rh (hVX(c['protocols'] = {"pb": {"port": 10000}}hWjX hXh[h]j1h_}ri (j3j4hd]hc]ha]hb]hf]uhhM\hihhQ]rj hrX(c['protocols'] = {"pb": {"port": 10000}}rk rl }rm (hVUhWjg ubaubhv)rn }ro (hVX7The buildmaster will listen on a TCP port of your choosing for connections from buildslaves. It can also use this port for connections from remote Change Sources, status clients, and debug tools. This port should be visible to the outside world, and you'll need to tell your buildslave admins about your choice.rp hWjX hXh[h]hzh_}rq (ha]hb]hc]hd]hf]uhhM^hihhQ]rr hrX7The buildmaster will listen on a TCP port of your choosing for connections from buildslaves. It can also use this port for connections from remote Change Sources, status clients, and debug tools. This port should be visible to the outside world, and you'll need to tell your buildslave admins about your choice.rs rt }ru (hVjp hWjn ubaubhv)rv }rw (hVXyIt does not matter which port you pick, as long it is externally visible; however, you should probably use something larger than 1024, since most operating systems don't allow non-root processes to bind to low-numbered ports. If your buildmaster is behind a firewall or a NAT box of some sort, you may have to configure your firewall to permit inbound connections to this port.rx hWjX hXh[h]hzh_}ry (ha]hb]hc]hd]hf]uhhMbhihhQ]rz hrXyIt does not matter which port you pick, as long it is externally visible; however, you should probably use something larger than 1024, since most operating systems don't allow non-root processes to bind to low-numbered ports. If your buildmaster is behind a firewall or a NAT box of some sort, you may have to configure your firewall to permit inbound connections to this port.r{ r| }r} (hVjx hWjv ubaubhv)r~ }r (hVX``c['protocols']['pb']['port']`` is a *strports* specification string, defined in the ``twisted.application.strports`` module (try ``pydoc twisted.application.strports`` to get documentation on the format).r hWjX hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMehihhQ]r (j)r }r (hVX ``c['protocols']['pb']['port']``h_}r (ha]hb]hc]hd]hf]uhWj~ hQ]r hrXc['protocols']['pb']['port']r r }r (hVUhWj ubah]jubhrX is a r r }r (hVX is a hWj~ ubjs)r }r (hVX *strports*h_}r (ha]hb]hc]hd]hf]uhWj~ hQ]r hrXstrportsr r }r (hVUhWj ubah]j}ubhrX& specification string, defined in the r r }r (hVX& specification string, defined in the hWj~ ubj)r }r (hVX ``twisted.application.strports``h_}r (ha]hb]hc]hd]hf]uhWj~ hQ]r hrXtwisted.application.strportsr r }r (hVUhWj ubah]jubhrX module (try r r }r (hVX module (try hWj~ ubj)r }r (hVX&``pydoc twisted.application.strports``h_}r (ha]hb]hc]hd]hf]uhWj~ hQ]r hrX"pydoc twisted.application.strportsr r }r (hVUhWj ubah]jubhrX% to get documentation on the format).r r }r (hVX% to get documentation on the format).hWj~ ubeubhv)r }r (hVXVThis means that you can have the buildmaster listen on a localhost-only port by doing:r hWjX hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMghihhQ]r hrXVThis means that you can have the buildmaster listen on a localhost-only port by doing:r r }r (hVj hWj ubaubj.)r }r (hVXBc['protocols'] = {"pb": {"port": "tcp:10000:interface=127.0.0.1"}}hWjX hXh[h]j1h_}r (j/j0Xpythonj3j4hd]hc]ha]hb]hf]uhhMihihhQ]r hrXBc['protocols'] = {"pb": {"port": "tcp:10000:interface=127.0.0.1"}}r r }r (hVUhWj ubaubhv)r }r (hVXThis might be useful if you only run buildslaves on the same machine, and they are all configured to contact the buildmaster at ``localhost:10000``.r hWjX hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMmhihhQ]r (hrXThis might be useful if you only run buildslaves on the same machine, and they are all configured to contact the buildmaster at r r }r (hVXThis might be useful if you only run buildslaves on the same machine, and they are all configured to contact the buildmaster at hWj ubj)r }r (hVX``localhost:10000``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXlocalhost:10000r r }r (hVUhWj ubah]jubhrX.r }r (hVX.hWj ubeubcdocutils.nodes note r )r }r (hVXIn Buildbot versions <=0.8.8 you might see ``slavePortnum`` option. This option contains same value as ``c['protocols']['pb']['port']`` but not recomended to use.hWjX hXh[h]Unoter h_}r (ha]hb]hc]hd]hf]uhhNhihhQ]r hv)r }r (hVXIn Buildbot versions <=0.8.8 you might see ``slavePortnum`` option. This option contains same value as ``c['protocols']['pb']['port']`` but not recomended to use.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMohQ]r (hrX+In Buildbot versions <=0.8.8 you might see r r }r (hVX+In Buildbot versions <=0.8.8 you might see hWj ubj)r }r (hVX``slavePortnum``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrX slavePortnumr r }r (hVUhWj ubah]jubhrX, option. This option contains same value as r r }r (hVX, option. This option contains same value as hWj ubj)r }r (hVX ``c['protocols']['pb']['port']``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXc['protocols']['pb']['port']r r }r (hVUhWj ubah]jubhrX but not recomended to use.r r }r (hVX but not recomended to use.hWj ubeubaubj)r }r (hVUhWjX hXh[h]jh_}r (hd]hc]ha]hb]hf]j]r (jXProperties; globalUindex-5r Utr ajuhhMrhihhQ]ubj)r }r (hVUhWjX hXh[h]jh_}r (ha]hb]hc]hd]r j ahf]uhhMshihhQ]ubj)r }r (hVUhWjX hXh[h]jh_}r (hd]hc]ha]hb]hf]Uentries]r ((UsingleXBuildmaster Config; propertiesXcfg-propertiesr j tr (UsingleXproperties (Buildmaster Config)j j tr euhhMuhihhQ]ubj)r }r (hVUhWjX hXh[h]jh_}r (hd]hc]ha]hb]hf]jj uhhMuhihhQ]ubeubhS)r }r (hVUhWhThXh[j}h]h^h_}r (ha]hb]hc]hd]r (hDj ehf]r hauhhMwhihj}r j j shQ]r (hk)r }r (hVj6hWj hXh[h]hoh_}r (hd]hc]ha]hb]hf]jj1uhhMwhihhQ]r hrXDefining Global Propertiesr r }r (hVj6hWj ubaubhv)r }r (hVXThe :bb:cfg:`properties` configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:r hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMyhihhQ]r (hrXThe r r }r (hVXThe hWj ubj)r }r (hVX:bb:cfg:`properties`r hWj hXh[h]jh_}r (UreftypeXcfgj j X propertiesU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhMyhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r! hrX propertiesr" r# }r$ (hVUhWj ubah]jubaubhrXv configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:r% r& }r' (hVXv configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:hWj ubeubj.)r( }r) (hVXQc['properties'] = { 'Widget-version' : '1.2', 'release-stage' : 'alpha' }hWj hXh[h]j1h_}r* (j/j0Xpythonj3j4hd]hc]ha]hb]hf]uhhM{hihhQ]r+ hrXQc['properties'] = { 'Widget-version' : '1.2', 'release-stage' : 'alpha' }r, r- }r. (hVUhWj( ubaubj)r/ }r0 (hVUhWj hXh[h]jh_}r1 (hd]hc]ha]hb]hf]Uentries]r2 ((UsingleX!Buildmaster Config; debugPasswordXcfg-debugPasswordr3 j3 tr4 (UsingleX"debugPassword (Buildmaster Config)j3 j3 tr5 euhhMhihhQ]ubj)r6 }r7 (hVUhWj hXh[h]jh_}r8 (hd]hc]ha]hb]hf]jj3 uhhMhihhQ]ubj)r9 }r: (hVX.. _Debug-Options:hWj hXh[j}h]jh_}r; (hd]hc]ha]hb]hf]jhIuhhMhihj}r< j3 j6 shQ]ubeubhS)r= }r> (hVUhWhThXh[j}r? hj9 sh]h^h_}r@ (ha]hb]hc]hd]rA (hIj3 h5ehf]rB (h heuhhMhihj}rC (hIj9 j3 j6 uhQ]rD (hk)rE }rF (hVjHhWj= hXh[h]hoh_}rG (hd]hc]ha]hb]hf]jjCuhhMhihhQ]rH hrX Debug OptionsrI rJ }rK (hVjHhWjE ubaubhv)rL }rM (hVXIf you set :bb:cfg:`debugPassword`, then you can connect to the buildmaster with the diagnostic tool launched by :samp:`buildbot debugclient {MASTER}:{PORT}`. From this tool, you can reload the config file, manually force builds, and inject changes, which may be useful for testing your buildmaster without actually committing changes to your repository (or before you have the Change Sources configured.)hWj= hXh[h]hzh_}rN (ha]hb]hc]hd]hf]uhhMhihhQ]rO (hrX If you set rP rQ }rR (hVX If you set hWjL ubj)rS }rT (hVX:bb:cfg:`debugPassword`rU hWjL hXh[h]jh_}rV (UreftypeXcfgj j X debugPasswordU refdomainXbbrW hd]hc]U refexplicitha]hb]hf]j juhhMhQ]rX j)rY }rZ (hVjU h_}r[ (ha]hb]r\ (jjW Xbb-cfgr] ehc]hd]hf]uhWjS hQ]r^ hrX debugPasswordr_ r` }ra (hVUhWjY ubah]jubaubhrXO, then you can connect to the buildmaster with the diagnostic tool launched by rb rc }rd (hVXO, then you can connect to the buildmaster with the diagnostic tool launched by hWjL ubj)re }rf (hVUh_}rg (hd]hc]ha]hb]rh Xsampri aUroleji hf]uhWjL hQ]rj (hrXbuildbot debugclient rk rl }rm (hVXbuildbot debugclient hWje ubjs)rn }ro (hVXMASTERh_}rp (ha]hb]hc]hd]hf]uhWje hQ]rq hrXMASTERrr rs }rt (hVUhWjn ubah]j}ubhrX:ru }rv (hVX:hWje ubjs)rw }rx (hVXPORTh_}ry (ha]hb]hc]hd]hf]uhWje hQ]rz hrXPORTr{ r| }r} (hVUhWjw ubah]j}ubeh]jubhrX. From this tool, you can reload the config file, manually force builds, and inject changes, which may be useful for testing your buildmaster without actually committing changes to your repository (or before you have the Change Sources configured.)r~ r }r (hVX. From this tool, you can reload the config file, manually force builds, and inject changes, which may be useful for testing your buildmaster without actually committing changes to your repository (or before you have the Change Sources configured.)hWjL ubeubhv)r }r (hVXThe debug tool uses the same port number as the slaves, :bb:cfg:`protocols`, and you may configure its authentication credentials as follows::r hWj= hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (hrX8The debug tool uses the same port number as the slaves, r r }r (hVX8The debug tool uses the same port number as the slaves, hWj ubj)r }r (hVX:bb:cfg:`protocols`r hWj hXh[h]jh_}r (UreftypeXcfgj j X protocolsU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r hrX protocolsr r }r (hVUhWj ubah]jubaubhrXB, and you may configure its authentication credentials as follows:r r }r (hVXB, and you may configure its authentication credentials as follows:hWj ubeubj.)r }r (hVX$c['debugPassword'] = "debugpassword"hWj= hXh[h]j1h_}r (j3j4hd]hc]ha]hb]hf]uhhMhihhQ]r hrX$c['debugPassword'] = "debugpassword"r r }r (hVUhWj ubaubj)r }r (hVUhWj= hXh[h]jh_}r (hd]hc]ha]hb]hf]j]r (jXManholeUindex-6r Utr ajuhhMhihhQ]ubj)r }r (hVUhWj= hXh[h]jh_}r (ha]hb]hc]hd]r j ahf]uhhMhihhQ]ubj)r }r (hVUhWj= hXh[h]jh_}r (hd]hc]ha]hb]hf]Uentries]r ((UsingleXBuildmaster Config; manholeX cfg-manholer j tr (UsingleXmanhole (Buildmaster Config)j j tr euhhMhihhQ]ubj)r }r (hVUhWj= hXh[h]jh_}r (hd]hc]ha]hb]hf]jj uhhMhihhQ]ubeubhS)r }r (hVUhWhThXh[j}h]h^h_}r (ha]hb]hc]hd]r (hFj ehf]r hauhhMhihj}r j j shQ]r (hk)r }r (hVjZhWj hXh[h]hoh_}r (hd]hc]ha]hb]hf]jjUuhhMhihhQ]r hrXManholer r }r (hVjZhWj ubaubhv)r }r (hVXIf you set :bb:cfg:`manhole` to an instance of one of the classes in ``buildbot.manhole``, you can telnet or ssh into the buildmaster and get an interactive Python shell, which may be useful for debugging buildbot internals. It is probably only useful for buildbot developers. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (hrX If you set r r }r (hVX If you set hWj ubj)r }r (hVX:bb:cfg:`manhole`r hWj hXh[h]jh_}r (UreftypeXcfgj j XmanholeU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r hrXmanholer r }r (hVUhWj ubah]jubaubhrX) to an instance of one of the classes in r r }r (hVX) to an instance of one of the classes in hWj ubj)r }r (hVX``buildbot.manhole``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXbuildbot.manholer r }r (hVUhWj ubah]jubhrXi, you can telnet or ssh into the buildmaster and get an interactive Python shell, which may be useful for debugging buildbot internals. It is probably only useful for buildbot developers. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.r r }r (hVXi, you can telnet or ssh into the buildmaster and get an interactive Python shell, which may be useful for debugging buildbot internals. It is probably only useful for buildbot developers. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.hWj ubeubhv)r }r (hVX There are three separate :class:`Manhole` classes. Two of them use SSH, one uses unencrypted telnet. Two of them use a username+password combination to grant access, one of them uses an SSH-style :file:`authorized_keys` file which contains a list of ssh public keys.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (hrXThere are three separate r r }r (hVXThere are three separate hWj ubj)r }r (hVX:class:`Manhole`r hWj hXh[h]jh_}r (UreftypeXclassj j XManholeU refdomainXpyr hd]hc]U refexplicitha]hb]hf]j jj1Nj2NuhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xpy-classr ehc]hd]hf]uhWj hQ]r hrXManholer r }r (hVUhWj ubah]jubaubhrX classes. Two of them use SSH, one uses unencrypted telnet. Two of them use a username+password combination to grant access, one of them uses an SSH-style r r }r (hVX classes. Two of them use SSH, one uses unencrypted telnet. Two of them use a username+password combination to grant access, one of them uses an SSH-style hWj ubj)r }r (hVUh_}r (hd]hc]ha]hb]r Xfiler aUrolej hf]uhWj hQ]r hrXauthorized_keysr r }r (hVXauthorized_keyshWj ubah]jubhrX/ file which contains a list of ssh public keys.r r }r (hVX/ file which contains a list of ssh public keys.hWj ubeubj )r }r (hVXUsing any Manhole requires that ``pycrypto`` and ``pyasn1`` be installed. These are not part of the normal Buildbot dependencies.hWj hXh[h]j h_}r (ha]hb]hc]hd]hf]uhhNhihhQ]r hv)r }r (hVXUsing any Manhole requires that ``pycrypto`` and ``pyasn1`` be installed. These are not part of the normal Buildbot dependencies.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhQ]r (hrX Using any Manhole requires that r r }r (hVX Using any Manhole requires that hWj ubj)r }r (hVX ``pycrypto``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXpycryptor r }r (hVUhWj ubah]jubhrX and r r }r (hVX and hWj ubj)r! }r" (hVX ``pyasn1``h_}r# (ha]hb]hc]hd]hf]uhWj hQ]r$ hrXpyasn1r% r& }r' (hVUhWj! ubah]jubhrXF be installed. These are not part of the normal Buildbot dependencies.r( r) }r* (hVXF be installed. These are not part of the normal Buildbot dependencies.hWj ubeubaubj)r+ }r, (hVUhWj hXh[h]jh_}r- (ha]hb]hc]hd]hf]uhhNhihhQ]r. (j)r/ }r0 (hVX `manhole.AuthorizedKeysManhole` You construct this with the name of a file that contains one SSH public key per line, just like :file:`~/.ssh/authorized_keys`. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory. hWj+ hXh[h]jh_}r1 (ha]hb]hc]hd]hf]uhhMhQ]r2 (j)r3 }r4 (hVX`manhole.AuthorizedKeysManhole`r5 hWj/ hXh[h]j!h_}r6 (ha]hb]hc]hd]hf]uhhMhQ]r7 cdocutils.nodes title_reference r8 )r9 }r: (hVj5 h_}r; (ha]hb]hc]hd]hf]uhWj3 hQ]r< hrXmanhole.AuthorizedKeysManholer= r> }r? (hVUhWj9 ubah]Utitle_referencer@ ubaubj+)rA }rB (hVUh_}rC (ha]hb]hc]hd]hf]uhWj/ hQ]rD hv)rE }rF (hVXYou construct this with the name of a file that contains one SSH public key per line, just like :file:`~/.ssh/authorized_keys`. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory.hWjA hXh[h]hzh_}rG (ha]hb]hc]hd]hf]uhhMhQ]rH (hrX`You construct this with the name of a file that contains one SSH public key per line, just like rI rJ }rK (hVX`You construct this with the name of a file that contains one SSH public key per line, just like hWjE ubj)rL }rM (hVUh_}rN (hd]hc]ha]hb]rO XfilerP aUrolejP hf]uhWjE hQ]rQ hrX~/.ssh/authorized_keysrR rS }rT (hVX~/.ssh/authorized_keyshWjL ubah]jubhrXn. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory.rU rV }rW (hVXn. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory.hWjE ubeubah]jQubeubj)rX }rY (hVX`manhole.PasswordManhole` This one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair. hWj+ hXh[h]jh_}rZ (ha]hb]hc]hd]hf]uhhMhihhQ]r[ (j)r\ }r] (hVX`manhole.PasswordManhole`r^ hWjX hXh[h]j!h_}r_ (ha]hb]hc]hd]hf]uhhMhQ]r` j8 )ra }rb (hVj^ h_}rc (ha]hb]hc]hd]hf]uhWj\ hQ]rd hrXmanhole.PasswordManholere rf }rg (hVUhWja ubah]j@ ubaubj+)rh }ri (hVUh_}rj (ha]hb]hc]hd]hf]uhWjX hQ]rk hv)rl }rm (hVXyThis one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair.rn hWjh hXh[h]hzh_}ro (ha]hb]hc]hd]hf]uhhMhQ]rp hrXyThis one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair.rq rr }rs (hVjn hWjl ubaubah]jQubeubj)rt }ru (hVX`manhole.TelnetManhole` This accepts regular unencrypted telnet connections, and asks for a username/password pair before providing access. Because this username/password is transmitted in the clear, and because Manhole access to the buildmaster is equivalent to granting full shell privileges to both the buildmaster and all the buildslaves (and to all accounts which then run code produced by the buildslaves), it is highly recommended that you use one of the SSH manholes instead. hWj+ hXh[h]jh_}rv (ha]hb]hc]hd]hf]uhhMhihhQ]rw (j)rx }ry (hVX`manhole.TelnetManhole`rz hWjt hXh[h]j!h_}r{ (ha]hb]hc]hd]hf]uhhMhQ]r| j8 )r} }r~ (hVjz h_}r (ha]hb]hc]hd]hf]uhWjx hQ]r hrXmanhole.TelnetManholer r }r (hVUhWj} ubah]j@ ubaubj+)r }r (hVUh_}r (ha]hb]hc]hd]hf]uhWjt hQ]r hv)r }r (hVXThis accepts regular unencrypted telnet connections, and asks for a username/password pair before providing access. Because this username/password is transmitted in the clear, and because Manhole access to the buildmaster is equivalent to granting full shell privileges to both the buildmaster and all the buildslaves (and to all accounts which then run code produced by the buildslaves), it is highly recommended that you use one of the SSH manholes instead.r hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhQ]r hrXThis accepts regular unencrypted telnet connections, and asks for a username/password pair before providing access. Because this username/password is transmitted in the clear, and because Manhole access to the buildmaster is equivalent to granting full shell privileges to both the buildmaster and all the buildslaves (and to all accounts which then run code produced by the buildslaves), it is highly recommended that you use one of the SSH manholes instead.r r }r (hVj hWj ubaubah]jQubeubeubj.)r }r (hVX # some examples: from buildbot import manhole c['manhole'] = manhole.AuthorizedKeysManhole(1234, "authorized_keys") c['manhole'] = manhole.PasswordManhole(1234, "alice", "mysecretpassword") c['manhole'] = manhole.TelnetManhole(1234, "bob", "snoop_my_password_please")hWj hXh[h]j1h_}r (j3j4hd]hc]ha]hb]hf]uhhMhihhQ]r hrX # some examples: from buildbot import manhole c['manhole'] = manhole.AuthorizedKeysManhole(1234, "authorized_keys") c['manhole'] = manhole.PasswordManhole(1234, "alice", "mysecretpassword") c['manhole'] = manhole.TelnetManhole(1234, "bob", "snoop_my_password_please")r r }r (hVUhWj ubaubhv)r }r (hVXThe :class:`Manhole` instance can be configured to listen on a specific port. You may wish to have this listening port bind to the loopback interface (sometimes known as `lo0`, `localhost`, or 127.0.0.1) to restrict access to clients which are running on the same host. ::hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (hrXThe r r }r (hVXThe hWj ubj)r }r (hVX:class:`Manhole`r hWj hXh[h]jh_}r (UreftypeXclassj j XManholeU refdomainXpyr hd]hc]U refexplicitha]hb]hf]j jj1Nj2NuhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xpy-classr ehc]hd]hf]uhWj hQ]r hrXManholer r }r (hVUhWj ubah]jubaubhrX instance can be configured to listen on a specific port. You may wish to have this listening port bind to the loopback interface (sometimes known as r r }r (hVX instance can be configured to listen on a specific port. You may wish to have this listening port bind to the loopback interface (sometimes known as hWj ubj8 )r }r (hVX`lo0`h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXlo0r r }r (hVUhWj ubah]j@ ubhrX, r r }r (hVX, hWj ubj8 )r }r (hVX `localhost`h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrX localhostr r }r (hVUhWj ubah]j@ ubhrXQ, or 127.0.0.1) to restrict access to clients which are running on the same host.r r }r (hVXQ, or 127.0.0.1) to restrict access to clients which are running on the same host.hWj ubeubj.)r }r (hVX|from buildbot.manhole import PasswordManhole c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")hWj hXh[h]j1h_}r (j3j4hd]hc]ha]hb]hf]uhhMhihhQ]r hrX|from buildbot.manhole import PasswordManhole c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")r r }r (hVUhWj ubaubhv)r }r (hVXTo have the :class:`Manhole` listen on all interfaces, use ``"tcp:9999"`` or simply 9999. This port specification uses ``twisted.application.strports``, so you can make it listen on SSL or even UNIX-domain sockets if you want.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (hrX To have the r r }r (hVX To have the hWj ubj)r }r (hVX:class:`Manhole`r hWj hXh[h]jh_}r (UreftypeXclassj j XManholeU refdomainXpyr hd]hc]U refexplicitha]hb]hf]j jj1Nj2NuhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xpy-classr ehc]hd]hf]uhWj hQ]r hrXManholer r }r (hVUhWj ubah]jubaubhrX listen on all interfaces, use r r }r (hVX listen on all interfaces, use hWj ubj)r }r (hVX``"tcp:9999"``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrX "tcp:9999"r r }r (hVUhWj ubah]jubhrX. or simply 9999. This port specification uses r r }r (hVX. or simply 9999. This port specification uses hWj ubj)r }r (hVX ``twisted.application.strports``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXtwisted.application.strportsr r }r (hVUhWj ubah]jubhrXK, so you can make it listen on SSL or even UNIX-domain sockets if you want.r r }r (hVXK, so you can make it listen on SSL or even UNIX-domain sockets if you want.hWj ubeubhv)r }r (hVX\Note that using any :class:`Manhole` requires that the `TwistedConch`_ package be installed.r hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (hrXNote that using any r r }r (hVXNote that using any hWj ubj)r }r (hVX:class:`Manhole`r hWj hXh[h]jh_}r (UreftypeXclassj j XManholeU refdomainXpyr hd]hc]U refexplicitha]hb]hf]j jj1Nj2NuhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xpy-classr ehc]hd]hf]uhWj hQ]r hrXManholer r }r (hVUhWj ubah]jubaubhrX requires that the r r }r (hVX requires that the hWj ubh)r }r (hVX`TwistedConch`_Uresolvedr KhWj h]hh_}r (UnameX TwistedConchUrefurir X/http://twistedmatrix.com/trac/wiki/TwistedConchr hd]hc]ha]hb]hf]uhQ]r hrX TwistedConchr r }r (hVUhWj ubaubhrX package be installed.r r }r (hVX package be installed.hWj ubeubhv)r }r (hVX]The buildmaster's SSH server will use a different host key than the normal sshd running on a typical unix host. This will cause the ssh client to complain about a `host key mismatch`, because it does not realize there are two separate servers running on the same host. To avoid this, use a clause like the following in your :file:`.ssh/config` file:hWj hXh[h]hzh_}r! (ha]hb]hc]hd]hf]uhhMhihhQ]r" (hrXThe buildmaster's SSH server will use a different host key than the normal sshd running on a typical unix host. This will cause the ssh client to complain about a r# r$ }r% (hVXThe buildmaster's SSH server will use a different host key than the normal sshd running on a typical unix host. This will cause the ssh client to complain about a hWj ubj8 )r& }r' (hVX`host key mismatch`h_}r( (ha]hb]hc]hd]hf]uhWj hQ]r) hrXhost key mismatchr* r+ }r, (hVUhWj& ubah]j@ ubhrX, because it does not realize there are two separate servers running on the same host. To avoid this, use a clause like the following in your r- r. }r/ (hVX, because it does not realize there are two separate servers running on the same host. To avoid this, use a clause like the following in your hWj ubj)r0 }r1 (hVUh_}r2 (hd]hc]ha]hb]r3 Xfiler4 aUrolej4 hf]uhWj hQ]r5 hrX .ssh/configr6 r7 }r8 (hVX .ssh/confighWj0 ubah]jubhrX file:r9 r: }r; (hVX file:hWj ubeubj.)r< }r= (hVXHost remotehost-buildbot HostName remotehost HostKeyAlias remotehost-buildbot Port 9999 # use 'user' if you use PasswordManhole and your name is not 'admin'. # if you use AuthorizedKeysManhole, this probably doesn't matter. User adminhWj hXh[h]j1h_}r> (j/j0Xnonej3j4hd]hc]ha]hb]hf]uhhMhihhQ]r? hrXHost remotehost-buildbot HostName remotehost HostKeyAlias remotehost-buildbot Port 9999 # use 'user' if you use PasswordManhole and your name is not 'admin'. # if you use AuthorizedKeysManhole, this probably doesn't matter. User adminr@ rA }rB (hVUhWj< ubaubhS)rC }rD (hVUhWj hXh[h]h^h_}rE (ha]hb]hc]hd]rF hBahf]rG hauhhMhihhQ]rH (hk)rI }rJ (hVX Using ManholerK hWjC hXh[h]hoh_}rL (ha]hb]hc]hd]hf]uhhMhihhQ]rM hrX Using ManholerN rO }rP (hVjK hWjI ubaubhv)rQ }rR (hVXAfter you have connected to a manhole instance, you will find yourself at a Python prompt. You have access to two objects: ``master`` (the BuildMaster) and ``status`` (the master's Status object). Most interesting objects on the master can be reached from these two objects.hWjC hXh[h]hzh_}rS (ha]hb]hc]hd]hf]uhhMhihhQ]rT (hrX{After you have connected to a manhole instance, you will find yourself at a Python prompt. You have access to two objects: rU rV }rW (hVX{After you have connected to a manhole instance, you will find yourself at a Python prompt. You have access to two objects: hWjQ ubj)rX }rY (hVX ``master``h_}rZ (ha]hb]hc]hd]hf]uhWjQ hQ]r[ hrXmasterr\ r] }r^ (hVUhWjX ubah]jubhrX (the BuildMaster) and r_ r` }ra (hVX (the BuildMaster) and hWjQ ubj)rb }rc (hVX ``status``h_}rd (ha]hb]hc]hd]hf]uhWjQ hQ]re hrXstatusrf rg }rh (hVUhWjb ubah]jubhrXl (the master's Status object). Most interesting objects on the master can be reached from these two objects.ri rj }rk (hVXl (the master's Status object). Most interesting objects on the master can be reached from these two objects.hWjQ ubeubhv)rl }rm (hVXiTo aid in navigation, the ``show`` method is defined. It displays the non-method attributes of an object.hWjC hXh[h]hzh_}rn (ha]hb]hc]hd]hf]uhhMhihhQ]ro (hrXTo aid in navigation, the rp rq }rr (hVXTo aid in navigation, the hWjl ubj)rs }rt (hVX``show``h_}ru (ha]hb]hc]hd]hf]uhWjl hQ]rv hrXshowrw rx }ry (hVUhWjs ubah]jubhrXG method is defined. It displays the non-method attributes of an object.rz r{ }r| (hVXG method is defined. It displays the non-method attributes of an object.hWjl ubeubhv)r} }r~ (hVX#A manhole session might look like::r hWjC hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r hrX"A manhole session might look like:r r }r (hVX"A manhole session might look like:hWj} ubaubj.)r }r (hVX_>>> show(master) data attributes of basedir : '/home/dustin/code/buildbot/t/buildbot/'... botmaster : buildCacheSize : None buildHorizon : None buildbotURL : http://localhost:8010/ changeCacheSize : None change_svc : configFileName : master.cfg db : db_poll_interval : None db_url : sqlite:///state.sqlite ... >>> show(master.botmaster.builders['win32']) data attributes of ... >>> win32 = _ >>> win32.category = 'w32'hWjC hXh[h]j1h_}r (j3j4hd]hc]ha]hb]hf]uhhMhihhQ]r hrX_>>> show(master) data attributes of basedir : '/home/dustin/code/buildbot/t/buildbot/'... botmaster : buildCacheSize : None buildHorizon : None buildbotURL : http://localhost:8010/ changeCacheSize : None change_svc : configFileName : master.cfg db : db_poll_interval : None db_url : sqlite:///state.sqlite ... >>> show(master.botmaster.builders['win32']) data attributes of ... >>> win32 = _ >>> win32.category = 'w32'r r }r (hVUhWj ubaubj)r }r (hVUhWjC hXh[h]jh_}r (hd]hc]ha]hb]hf]Uentries]r ((UsingleXBuildmaster Config; metricsX cfg-metricsr j tr (UsingleXmetrics (Buildmaster Config)j j tr euhhMhihhQ]ubj)r }r (hVUhWjC hXh[h]jh_}r (hd]hc]ha]hb]hf]jj uhhMhihhQ]ubeubeubhS)r }r (hVUhWhThXh[j}h]h^h_}r (ha]hb]hc]hd]r (hGj ehf]r hauhhMhihj}r j j shQ]r (hk)r }r (hVjlhWj hXh[h]hoh_}r (hd]hc]ha]hb]hf]jjguhhMhihhQ]r hrXMetrics Optionsr r }r (hVjlhWj ubaubj.)r }r (hVX:c['metrics'] = dict(log_interval=10, periodic_interval=10)hWj hXh[h]j1h_}r (j3j4hd]hc]ha]hb]hf]uhhMhihhQ]r hrX:c['metrics'] = dict(log_interval=10, periodic_interval=10)r r }r (hVUhWj ubaubhv)r }r (hVX:bb:cfg:`metrics` can be a dictionary that configures various aspects of the metrics subsystem. If :bb:cfg:`metrics` is ``None``, then metrics collection, logging and reporting will be disabled.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (j)r }r (hVX:bb:cfg:`metrics`r hWj hXh[h]jh_}r (UreftypeXcfgj j XmetricsU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r hrXmetricsr r }r (hVUhWj ubah]jubaubhrXR can be a dictionary that configures various aspects of the metrics subsystem. If r r }r (hVXR can be a dictionary that configures various aspects of the metrics subsystem. If hWj ubj)r }r (hVX:bb:cfg:`metrics`r hWj hXh[h]jh_}r (UreftypeXcfgj j XmetricsU refdomainXbbr hd]hc]U refexplicitha]hb]hf]j juhhMhQ]r j)r }r (hVj h_}r (ha]hb]r (jj Xbb-cfgr ehc]hd]hf]uhWj hQ]r hrXmetricsr r }r (hVUhWj ubah]jubaubhrX is r r }r (hVX is hWj ubj)r }r (hVX``None``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXNoner r }r (hVUhWj ubah]jubhrXB, then metrics collection, logging and reporting will be disabled.r r }r (hVXB, then metrics collection, logging and reporting will be disabled.hWj ubeubhv)r }r (hVX``log_interval`` determines how often metrics should be logged to twistd.log. It defaults to 60s. If set to 0 or ``None``, then logging of metrics will be disabled. This value can be changed via a reconfig.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (j)r }r (hVX``log_interval``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrX log_intervalr r }r (hVUhWj ubah]jubhrXa determines how often metrics should be logged to twistd.log. It defaults to 60s. If set to 0 or r r }r (hVXa determines how often metrics should be logged to twistd.log. It defaults to 60s. If set to 0 or hWj ubj)r }r (hVX``None``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXNoner r }r (hVUhWj ubah]jubhrXU, then logging of metrics will be disabled. This value can be changed via a reconfig.r r }r (hVXU, then logging of metrics will be disabled. This value can be changed via a reconfig.hWj ubeubhv)r }r (hVX&``periodic_interval`` determines how often various non-event based metrics are collected, such as memory usage, uncollectable garbage, reactor delay. This defaults to 10s. If set to 0 or ``None``, then periodic collection of this data is disabled. This value can also be changed via a reconfig.hWj hXh[h]hzh_}r (ha]hb]hc]hd]hf]uhhMhihhQ]r (j)r }r (hVX``periodic_interval``h_}r (ha]hb]hc]hd]hf]uhWj hQ]r hrXperiodic_intervalr r }r (hVUhWj ubah]jubhrX determines how often various non-event based metrics are collected, such as memory usage, uncollectable garbage, reactor delay. This defaults to 10s. If set to 0 or rr}r(hVX determines how often various non-event based metrics are collected, such as memory usage, uncollectable garbage, reactor delay. This defaults to 10s. If set to 0 or hWj ubj)r}r(hVX``None``h_}r(ha]hb]hc]hd]hf]uhWj hQ]rhrXNonerr}r (hVUhWjubah]jubhrXc, then periodic collection of this data is disabled. This value can also be changed via a reconfig.r r }r (hVXc, then periodic collection of this data is disabled. This value can also be changed via a reconfig.hWj ubeubhv)r }r(hVXURead more about metrics in the :ref:`Metrics` section in the developer documentation.rhWj hXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhihhQ]r(hrXRead more about metrics in the rr}r(hVXRead more about metrics in the hWj ubj)r}r(hVX:ref:`Metrics`rhWj hXh[h]jh_}r(UreftypeXrefj j XmetricsU refdomainXstdrhd]hc]U refexplicitha]hb]hf]j juhhMhQ]rjs)r}r(hVjh_}r(ha]hb]r(jjXstd-refrehc]hd]hf]uhWjhQ]r hrXMetricsr!r"}r#(hVUhWjubah]j}ubaubhrX( section in the developer documentation.r$r%}r&(hVX( section in the developer documentation.hWj ubeubj)r'}r((hVUhWj hXh[h]jh_}r)(hd]hc]ha]hb]hf]Uentries]r*((UsingleX!Buildmaster Config; user_managersXcfg-user_managersr+j+tr,(UsingleX"user_managers (Buildmaster Config)j+j+tr-euhhMhihhQ]ubj)r.}r/(hVUhWj hXh[h]jh_}r0(hd]hc]ha]hb]hf]jj+uhhMhihhQ]ubj)r1}r2(hVX.. _Users-Options:hWj hXh[j}h]jh_}r3(hd]hc]ha]hb]hf]jhOuhhM hihj}r4j+j.shQ]ubeubhS)r5}r6(hVUhWhThXh[j}r7h%j1sh]h^h_}r8(ha]hb]hc]hd]r9(hOj+hHehf]r:(hh%euhhM hihj}r;(j+j.hOj1uhQ]r<(hk)r=}r>(hVj~hWj5hXh[h]hoh_}r?(hd]hc]ha]hb]hf]jjyuhhM hihhQ]r@hrX Users OptionsrArB}rC(hVj~hWj=ubaubj.)rD}rE(hVX from buildbot.process.users import manual c['user_managers'] = [] c['user_managers'].append(manual.CommandlineUserManager(username="user", passwd="userpw", port=9990))hWj5hXh[h]j1h_}rF(j3j4hd]hc]ha]hb]hf]uhhMhihhQ]rGhrX from buildbot.process.users import manual c['user_managers'] = [] c['user_managers'].append(manual.CommandlineUserManager(username="user", passwd="userpw", port=9990))rHrI}rJ(hVUhWjDubaubhv)rK}rL(hVX=:bb:cfg:`user_managers` contains a list of ways to manually manage User Objects within Buildbot (see :ref:`User-Objects`). Currently implemented is a commandline tool `buildbot user`, described at length in :bb:cmdline:`user`. In the future, a web client will also be able to manage User Objects and their attributes.hWj5hXh[h]hzh_}rM(ha]hb]hc]hd]hf]uhhMhihhQ]rN(j)rO}rP(hVX:bb:cfg:`user_managers`rQhWjKhXh[h]jh_}rR(UreftypeXcfgj j X user_managersU refdomainXbbrShd]hc]U refexplicitha]hb]hf]j juhhMhQ]rTj)rU}rV(hVjQh_}rW(ha]hb]rX(jjSXbb-cfgrYehc]hd]hf]uhWjOhQ]rZhrX user_managersr[r\}r](hVUhWjUubah]jubaubhrXN contains a list of ways to manually manage User Objects within Buildbot (see r^r_}r`(hVXN contains a list of ways to manually manage User Objects within Buildbot (see hWjKubj)ra}rb(hVX:ref:`User-Objects`rchWjKhXh[h]jh_}rd(UreftypeXrefj j X user-objectsU refdomainXstdrehd]hc]U refexplicitha]hb]hf]j juhhMhQ]rfjs)rg}rh(hVjch_}ri(ha]hb]rj(jjeXstd-refrkehc]hd]hf]uhWjahQ]rlhrX User-Objectsrmrn}ro(hVUhWjgubah]j}ubaubhrX/). Currently implemented is a commandline tool rprq}rr(hVX/). Currently implemented is a commandline tool hWjKubj8 )rs}rt(hVX`buildbot user`h_}ru(ha]hb]hc]hd]hf]uhWjKhQ]rvhrX buildbot userrwrx}ry(hVUhWjsubah]j@ ubhrX, described at length in rzr{}r|(hVX, described at length in hWjKubj)r}}r~(hVX:bb:cmdline:`user`rhWjKhXh[h]jh_}r(UreftypeXcmdlinej j XuserU refdomainXbbrhd]hc]U refexplicitha]hb]hf]j juhhMhQ]rj)r}r(hVjh_}r(ha]hb]r(jjX bb-cmdlinerehc]hd]hf]uhWj}hQ]rhrXuserrr}r(hVUhWjubah]jubaubhrX\. In the future, a web client will also be able to manage User Objects and their attributes.rr}r(hVX\. In the future, a web client will also be able to manage User Objects and their attributes.hWjKubeubhv)r}r(hVXAs shown above, to enable the `buildbot user` tool, you must initialize a `CommandlineUserManager` instance in your `master.cfg`. `CommandlineUserManager` instances require the following arguments:hWj5hXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhihhQ]r(hrXAs shown above, to enable the rr}r(hVXAs shown above, to enable the hWjubj8 )r}r(hVX`buildbot user`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX buildbot userrr}r(hVUhWjubah]j@ ubhrX tool, you must initialize a rr}r(hVX tool, you must initialize a hWjubj8 )r}r(hVX`CommandlineUserManager`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXCommandlineUserManagerrr}r(hVUhWjubah]j@ ubhrX instance in your rr}r(hVX instance in your hWjubj8 )r}r(hVX `master.cfg`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX master.cfgrr}r(hVUhWjubah]j@ ubhrX. rr}r(hVX. hWjubj8 )r}r(hVX`CommandlineUserManager`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXCommandlineUserManagerrr}r(hVUhWjubah]j@ ubhrX+ instances require the following arguments:rr}r(hVX+ instances require the following arguments:hWjubeubj)r}r(hVUhWj5hXh[h]jh_}r(ha]hb]hc]hd]hf]uhhNhihhQ]r(j)r}r(hVX``username`` This is the `username` that will be registered on the PB connection and need to be used when calling `buildbot user`. hWjhXh[h]jh_}r(ha]hb]hc]hd]hf]uhhMhQ]r(j)r}r(hVX ``username``rhWjhXh[h]j!h_}r(ha]hb]hc]hd]hf]uhhMhQ]rj)r}r(hVjh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXusernamerr}r(hVUhWjubah]jubaubj+)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVXuThis is the `username` that will be registered on the PB connection and need to be used when calling `buildbot user`.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhMhQ]r(hrX This is the rr}r(hVX This is the hWjubj8 )r}r(hVX `username`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXusernamerr}r(hVUhWjubah]j@ ubhrXO that will be registered on the PB connection and need to be used when calling rr}r(hVXO that will be registered on the PB connection and need to be used when calling hWjubj8 )r}r(hVX`buildbot user`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX buildbot userrr}r(hVUhWjubah]j@ ubhrX.r}r(hVX.hWjubeubah]jQubeubj)r}r(hVX``passwd`` This is the `passwd` that will be registered on the PB connection and need to be used when calling `buildbot user`. hWjhXh[h]jh_}r(ha]hb]hc]hd]hf]uhhM!hihhQ]r(j)r}r(hVX ``passwd``rhWjhXh[h]j!h_}r(ha]hb]hc]hd]hf]uhhM!hQ]rj)r}r(hVjh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXpasswdrr}r(hVUhWjubah]jubaubj+)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhv)r}r(hVXsThis is the `passwd` that will be registered on the PB connection and need to be used when calling `buildbot user`.hWjhXh[h]hzh_}r(ha]hb]hc]hd]hf]uhhM!hQ]r(hrX This is the rr }r (hVX This is the hWjubj8 )r }r (hVX`passwd`h_}r (ha]hb]hc]hd]hf]uhWjhQ]rhrXpasswdrr}r(hVUhWj ubah]j@ ubhrXO that will be registered on the PB connection and need to be used when calling rr}r(hVXO that will be registered on the PB connection and need to be used when calling hWjubj8 )r}r(hVX`buildbot user`h_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX buildbot userrr}r(hVUhWjubah]j@ ubhrX.r}r(hVX.hWjubeubah]jQubeubj)r}r(hVX``port`` The PB connection `port` must be different than `c['protocols']['pb']['port']` and be specified when calling `buildbot user` hWjhXh[h]jh_}r (ha]hb]hc]hd]hf]uhhM$hihhQ]r!(j)r"}r#(hVX``port``r$hWjhXh[h]j!h_}r%(ha]hb]hc]hd]hf]uhhM$hQ]r&j)r'}r((hVj$h_}r)(ha]hb]hc]hd]hf]uhWj"hQ]r*hrXportr+r,}r-(hVUhWj'ubah]jubaubj+)r.}r/(hVUh_}r0(ha]hb]hc]hd]hf]uhWjhQ]r1hv)r2}r3(hVX|The PB connection `port` must be different than `c['protocols']['pb']['port']` and be specified when calling `buildbot user`hWj.hXh[h]hzh_}r4(ha]hb]hc]hd]hf]uhhM$hQ]r5(hrXThe PB connection r6r7}r8(hVXThe PB connection hWj2ubj8 )r9}r:(hVX`port`h_}r;(ha]hb]hc]hd]hf]uhWj2hQ]r<hrXportr=r>}r?(hVUhWj9ubah]j@ ubhrX must be different than r@rA}rB(hVX must be different than hWj2ubj8 )rC}rD(hVX`c['protocols']['pb']['port']`h_}rE(ha]hb]hc]hd]hf]uhWj2hQ]rFhrXc['protocols']['pb']['port']rGrH}rI(hVUhWjCubah]j@ ubhrX and be specified when calling rJrK}rL(hVX and be specified when calling hWj2ubj8 )rM}rN(hVX`buildbot user`h_}rO(ha]hb]hc]hd]hf]uhWj2hQ]rPhrX buildbot userrQrR}rS(hVUhWjMubah]j@ ubeubah]jQubeubeubj)rT}rU(hVUhWj5hXh[h]jh_}rV(hd]hc]ha]hb]hf]Uentries]rW((UsingleXBuildmaster Config; validationXcfg-validationrXjXtrY(UsingleXvalidation (Buildmaster Config)jXjXtrZeuhhM'hihhQ]ubj)r[}r\(hVUhWj5hXh[h]jh_}r](hd]hc]ha]hb]hf]jjXuhhM'hihhQ]ubj)r^}r_(hVX.. _Input-Validation:hWj5hXh[j}h]jh_}r`(hd]hc]ha]hb]hf]jh1uhhM(hihj}rajXj[shQ]ubeubhS)rb}rc(hVUhWhThXh[j}rdhj^sh]h^h_}re(ha]hb]hc]hd]rf(h1jXh(hk)r?}r@(hVjhWj8hXh[h]hoh_}rA(hd]hc]ha]hb]hf]jjuhhMehihhQ]rBhrXCodebase GeneratorrCrD}rE(hVjhWj?ubaubj.)rF}rG(hVXall_repositories = { r'https://hg/hg/mailsuite/mailclient': 'mailexe', r'https://hg/hg/mailsuite/mapilib': 'mapilib', r'https://hg/hg/mailsuite/imaplib': 'imaplib', r'https://github.com/mailinc/mailsuite/mailclient': 'mailexe', r'https://github.com/mailinc/mailsuite/mapilib': 'mapilib', r'https://github.com/mailinc/mailsuite/imaplib': 'imaplib', } def codebaseGenerator(chdict): return all_repositories[chdict['repository']] c['codebaseGenerator'] = codebaseGeneratorhWj8hXh[h]j1h_}rH(j3j4hd]hc]ha]hb]hf]uhhMihihhQ]rIhrXall_repositories = { r'https://hg/hg/mailsuite/mailclient': 'mailexe', r'https://hg/hg/mailsuite/mapilib': 'mapilib', r'https://hg/hg/mailsuite/imaplib': 'imaplib', r'https://github.com/mailinc/mailsuite/mailclient': 'mailexe', r'https://github.com/mailinc/mailsuite/mapilib': 'mapilib', r'https://github.com/mailinc/mailsuite/imaplib': 'imaplib', } def codebaseGenerator(chdict): return all_repositories[chdict['repository']] c['codebaseGenerator'] = codebaseGeneratorrJrK}rL(hVUhWjFubaubhv)rM}rN(hVXFor any incoming change, the :ref:`codebase` is set to ''. This codebase value is sufficient if all changes come from the same repository (or clones). If changes come from different repositories, extra processing will be needed to determine the codebase for the incoming change. This codebase will then be a logical name for the combination of repository and or branch etc.hWj8hXh[h]hzh_}rO(ha]hb]hc]hd]hf]uhhMwhihhQ]rP(hrXFor any incoming change, the rQrR}rS(hVXFor any incoming change, the hWjMubj)rT}rU(hVX:ref:`codebase`rVhWjMhXh[h]jh_}rW(UreftypeXrefj j X attr-codebaseU refdomainXstdrXhd]hc]U refexplicitha]hb]hf]j juhhMwhQ]rYjs)rZ}r[(hVjVh_}r\(ha]hb]r](jjXXstd-refr^ehc]hd]hf]uhWjThQ]r_hrXcodebaser`ra}rb(hVUhWjZubah]j}ubaubhrXI is set to ''. This codebase value is sufficient if all changes come from the same repository (or clones). If changes come from different repositories, extra processing will be needed to determine the codebase for the incoming change. This codebase will then be a logical name for the combination of repository and or branch etc.rcrd}re(hVXI is set to ''. This codebase value is sufficient if all changes come from the same repository (or clones). If changes come from different repositories, extra processing will be needed to determine the codebase for the incoming change. This codebase will then be a logical name for the combination of repository and or branch etc.hWjMubeubhv)rf}rg(hVXThe `codebaseGenerator` accepts a change dictionary as produced by the :py:class:`buildbot.db.changes.ChangesConnectorComponent `, with a changeid equal to `None`.rhhWj8hXh[h]hzh_}ri(ha]hb]hc]hd]hf]uhhM|hihhQ]rj(hrXThe rkrl}rm(hVXThe hWjfubj8 )rn}ro(hVX`codebaseGenerator`h_}rp(ha]hb]hc]hd]hf]uhWjfhQ]rqhrXcodebaseGeneratorrrrs}rt(hVUhWjnubah]j@ ubhrX0 accepts a change dictionary as produced by the rurv}rw(hVX0 accepts a change dictionary as produced by the hWjfubj)rx}ry(hVXW:py:class:`buildbot.db.changes.ChangesConnectorComponent `rzhWjfhXh[h]jh_}r{(UreftypeXclassj j Xchanges connector componentU refdomainXpyr|hd]hc]U refexplicitha]hb]hf]j jj1Nj2NuhhM|hQ]r}j)r~}r(hVjzh_}r(ha]hb]r(jj|Xpy-classrehc]hd]hf]uhWjxhQ]rhrX-buildbot.db.changes.ChangesConnectorComponentrr}r(hVUhWj~ubah]jubaubhrX, with a changeid equal to rr}r(hVX, with a changeid equal to hWjfubj8 )r}r(hVX`None`h_}r(ha]hb]hc]hd]hf]uhWjfhQ]rhrXNonerr}r(hVUhWjubah]j@ ubhrX.r}r(hVX.hWjfubeubeubeubahVUU transformerrNU footnote_refsr}rUrefnamesr}rX twistedconch]rj asUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhihU current_linerNUtransform_messagesr]r(cdocutils.nodes system_message r)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK UtypeUINFOruhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX,Hyperlink target "cfg-db" is not referenced.rr}r(hVUhWjubah]hzubah]Usystem_messagerubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX0Hyperlink target "cfg-db_url" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX:Hyperlink target "cfg-db_poll_interval" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX<Hyperlink target "database-specification" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK,UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX-Hyperlink target "index-0" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK>UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX-Hyperlink target "index-1" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKTUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX-Hyperlink target "index-2" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK_UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX5Hyperlink target "cfg-multiMaster" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineK`UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX7Hyperlink target "multi-master-mode" is not referenced.rr}r (hVUhWjubah]hzubah]jubj)r }r (hVUh_}r (ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]r hv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWj hQ]rhrX5Hyperlink target "cfg-buildbotURL" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX2Hyperlink target "cfg-titleURL" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r }r!(hVUh_}r"(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]r#hv)r$}r%(hVUh_}r&(ha]hb]hc]hd]hf]uhWj hQ]r'hrX/Hyperlink target "cfg-title" is not referenced.r(r)}r*(hVUhWj$ubah]hzubah]jubj)r+}r,(hVUh_}r-(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]r.hv)r/}r0(hVUh_}r1(ha]hb]hc]hd]hf]uhWj+hQ]r2hrX=Hyperlink target "cfg-logCompressionLimit" is not referenced.r3r4}r5(hVUhWj/ubah]hzubah]jubj)r6}r7(hVUh_}r8(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]r9hv)r:}r;(hVUh_}r<(ha]hb]hc]hd]hf]uhWj6hQ]r=hrX>Hyperlink target "cfg-logCompressionMethod" is not referenced.r>r?}r@(hVUhWj:ubah]hzubah]jubj)rA}rB(hVUh_}rC(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rDhv)rE}rF(hVUh_}rG(ha]hb]hc]hd]hf]uhWjAhQ]rHhrX4Hyperlink target "cfg-logMaxSize" is not referenced.rIrJ}rK(hVUhWjEubah]hzubah]jubj)rL}rM(hVUh_}rN(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rOhv)rP}rQ(hVUh_}rR(ha]hb]hc]hd]hf]uhWjLhQ]rShrX8Hyperlink target "cfg-logMaxTailSize" is not referenced.rTrU}rV(hVUhWjPubah]hzubah]jubj)rW}rX(hVUh_}rY(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rZhv)r[}r\(hVUh_}r](ha]hb]hc]hd]hf]uhWjWhQ]r^hrX7Hyperlink target "cfg-changeHorizon" is not referenced.r_r`}ra(hVUhWj[ubah]hzubah]jubj)rb}rc(hVUh_}rd(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rehv)rf}rg(hVUh_}rh(ha]hb]hc]hd]hf]uhWjbhQ]rihrX6Hyperlink target "cfg-buildHorizon" is not referenced.rjrk}rl(hVUhWjfubah]hzubah]jubj)rm}rn(hVUh_}ro(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rphv)rq}rr(hVUh_}rs(ha]hb]hc]hd]hf]uhWjmhQ]rthrX6Hyperlink target "cfg-eventHorizon" is not referenced.rurv}rw(hVUhWjqubah]hzubah]jubj)rx}ry(hVUh_}rz(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]r{hv)r|}r}(hVUh_}r~(ha]hb]hc]hd]hf]uhWjxhQ]rhrX4Hyperlink target "cfg-logHorizon" is not referenced.rr}r(hVUhWj|ubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX0Hyperlink target "cfg-caches" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX9Hyperlink target "cfg-changeCacheSize" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineKUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX8Hyperlink target "cfg-buildCacheSize" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM-UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX7Hyperlink target "cfg-mergeRequests" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM/UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX-Hyperlink target "index-3" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM=UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX-Hyperlink target "index-4" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM?UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX<Hyperlink target "cfg-prioritizeBuilders" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM@UtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX;Hyperlink target "prioritizing-builders" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMTUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX3Hyperlink target "cfg-protocols" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrXDHyperlink target "setting-the-pb-port-for-slaves" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMsUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX-Hyperlink target "index-5" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMuUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX4Hyperlink target "cfg-properties" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r (ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUtypejuhQ]r hv)r }r (hVUh_}r (ha]hb]hc]hd]hf]uhWjhQ]rhrX7Hyperlink target "cfg-debugPassword" is not referenced.rr}r(hVUhWj ubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUtypejuhQ]rhv)r}r(hVUh_}r(ha]hb]hc]hd]hf]uhWjhQ]rhrX3Hyperlink target "debug-options" is not referenced.rr}r(hVUhWjubah]hzubah]jubj)r}r(hVUh_}r(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUtypejuhQ]r hv)r!}r"(hVUh_}r#(ha]hb]hc]hd]hf]uhWjhQ]r$hrX-Hyperlink target "index-6" is not referenced.r%r&}r'(hVUhWj!ubah]hzubah]jubj)r(}r)(hVUh_}r*(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUtypejuhQ]r+hv)r,}r-(hVUh_}r.(ha]hb]hc]hd]hf]uhWj(hQ]r/hrX1Hyperlink target "cfg-manhole" is not referenced.r0r1}r2(hVUhWj,ubah]hzubah]jubj)r3}r4(hVUh_}r5(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUtypejuhQ]r6hv)r7}r8(hVUh_}r9(ha]hb]hc]hd]hf]uhWj3hQ]r:hrX1Hyperlink target "cfg-metrics" is not referenced.r;r<}r=(hVUhWj7ubah]hzubah]jubj)r>}r?(hVUh_}r@(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMUtypejuhQ]rAhv)rB}rC(hVUh_}rD(ha]hb]hc]hd]hf]uhWj>hQ]rEhrX7Hyperlink target "cfg-user_managers" is not referenced.rFrG}rH(hVUhWjBubah]hzubah]jubj)rI}rJ(hVUh_}rK(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM UtypejuhQ]rLhv)rM}rN(hVUh_}rO(ha]hb]hc]hd]hf]uhWjIhQ]rPhrX3Hyperlink target "users-options" is not referenced.rQrR}rS(hVUhWjMubah]hzubah]jubj)rT}rU(hVUh_}rV(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM'UtypejuhQ]rWhv)rX}rY(hVUh_}rZ(ha]hb]hc]hd]hf]uhWjThQ]r[hrX4Hyperlink target "cfg-validation" is not referenced.r\r]}r^(hVUhWjXubah]hzubah]jubj)r_}r`(hVUh_}ra(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM(UtypejuhQ]rbhv)rc}rd(hVUh_}re(ha]hb]hc]hd]hf]uhWj_hQ]rfhrX6Hyperlink target "input-validation" is not referenced.rgrh}ri(hVUhWjcubah]hzubah]jubj)rj}rk(hVUh_}rl(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineM?UtypejuhQ]rmhv)rn}ro(hVUh_}rp(ha]hb]hc]hd]hf]uhWjjhQ]rqhrX1Hyperlink target "cfg-revlink" is not referenced.rrrs}rt(hVUhWjnubah]hzubah]jubj)ru}rv(hVUh_}rw(ha]UlevelKhd]hc]Usourceh[hb]hf]UlineMcUtypejuhQ]rxhv)ry}rz(hVUh_}r{(ha]hb]hc]hd]hf]uhWjuhQ]r|hrX;Hyperlink target "cfg-codebaseGenerator" is not referenced.r}r~}r(hVUhWjyubah]hzubah]jubeUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhoNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-global.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jjh0jj j jjjjjjjjjN jX jjjjjjh:j8j j jjh3jhDj jXjbh1jbhhh9jh6hj j jjhhj j hHj5hjh4hTj j h;jjjjjjjj j jUjQhhhhjjh=j hJjhEjjjh@jj3 j= h7jh?j hhj j hCjj j jjj j jjhFj j j jjhIj= jCj?hhj+j5hKjjjjjjgjcj1j-hMjX jjj2j8hBjC hNj(jjjjjyjujjjjhOj5hGj hPjuUsubstitution_namesr}rh]hih_}r(ha]hd]hc]Usourceh[hb]hf]uU footnotesr]rUrefidsr}r(jX]rj[aj]rjajN ]rjQ aj ]rj ah1]rj^aj]rjaj]rjah;]rjaj]rjaj]rjaj]rjaj ]rj ah=]rj aj]rjaj3 ]rj6 aj ]rj ahC]rjaj ]rj aj]rjaj ]rj aj]rjahI]rj9 aj+]rj.aj]rjahM]rjT aj2]rj5ahO]rj1auub.PK6DD)//7buildbot-v0.8.9/.doctrees/manual/cfg-properties.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xinterpolate-dictstyleqXwithpropertiesqXsource-stamp-attributesqXcommon-build-propertiesq X flattenlistq NX interpolateq Xwithproperties-dictstyleq Xcustom renderablesq NXsource stamp attributesqNXrendererqXcommon build propertiesqNXusing properties in stepsqNXpropertyqX propertiesqUcontentsqNuUsubstitution_defsq}qUparse_messagesq]q(cdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q (hUU referencedq!KhhUsourceq"cdocutils.nodes reprunicode q#XV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-properties.rstq$q%}q&bUexpect_referenced_by_nameq'}q(hcdocutils.nodes target q))q*}q+(hX.. _Properties:hhh"h%h'}Utagnameq,Utargetq-U attributesq.}q/(Uidsq0]Ubackrefsq1]Udupnamesq2]Uclassesq3]Unamesq4]Urefidq5U propertiesq6uUlineq7KUdocumentq8hUexpect_referenced_by_idq9}q:Uindex-0q;h))q<}q=(hUhhh"h%h,h-h.}q>(h0]h1]h2]h3]h4]h5h;uh7Kh8hUchildrenq?]ubsh?]ubsh,Usectionq@h.}qA(h2]qBX propertiesqCah3]h1]h0]qD(h6h;Uid1qEeh4]qFhauh7Kh8hh9}qG(h;h` -- These properties apply to all builds.hhh"h%h,hh.}q(h2]h3]h1]h0]h4]uh7Nh8hh?]qhT)q}q(hXT:bb:cfg:`global configuration ` -- These properties apply to all builds.hhh"h%h,hWh.}q(h2]h3]h1]h0]h4]uh7Kh?]q(h])q}q(hX+:bb:cfg:`global configuration `qhhh"h%h,hah.}q(UreftypeXcfghchdX propertiesU refdomainXbbqh0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]qcdocutils.nodes literal q)q}q(hhh.}q(h2]h3]q(hnhXbb-cfgqeh1]h0]h4]uhhh?]qhPXglobal configurationq酁q}q(hUhhubah,UliteralqubaubhPX) -- These properties apply to all builds.q텁q}q(hX) -- These properties apply to all builds.hhubeubaubh)q}q(hX:ref:`schedulers ` -- A scheduler can specify properties that become available to all builds it starts.hhh"h%h,hh.}q(h2]h3]h1]h0]h4]uh7Nh8hh?]qhT)q}q(hX:ref:`schedulers ` -- A scheduler can specify properties that become available to all builds it starts.hhh"h%h,hWh.}q(h2]h3]h1]h0]h4]uh7Kh?]q(h])q}q(hX*:ref:`schedulers `qhhh"h%h,hah.}q(UreftypeXrefhchdXconfiguring-schedulersU refdomainXstdqh0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]qhi)q}q(hhh.}r(h2]h3]r(hnhXstd-refreh1]h0]h4]uhhh?]rhPX schedulersrr}r(hUhhubah,htubaubhPXU -- A scheduler can specify properties that become available to all builds it starts.rr}r (hXU -- A scheduler can specify properties that become available to all builds it starts.hhubeubaubh)r }r (hX:ref:`changes ` -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the :bb:cmdline:`sendchange` command.hhh"h%h,hh.}r (h2]h3]h1]h0]h4]uh7Nh8hh?]r hT)r}r(hX:ref:`changes ` -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the :bb:cmdline:`sendchange` command.hj h"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(h])r}r(hX:ref:`changes `rhjh"h%h,hah.}r(UreftypeXrefhchdXchange-sourcesU refdomainXstdrh0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]rhi)r}r(hjh.}r(h2]h3]r(hnjXstd-refreh1]h0]h4]uhjh?]rhPXchangesrr}r (hUhjubah,htubaubhPX -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the r!r"}r#(hX -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the hjubh])r$}r%(hX:bb:cmdline:`sendchange`r&hjh"h%h,hah.}r'(UreftypeXcmdlinehchdX sendchangeU refdomainXbbr(h0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]r)h)r*}r+(hj&h.}r,(h2]h3]r-(hnj(X bb-cmdliner.eh1]h0]h4]uhj$h?]r/hPX sendchanger0r1}r2(hUhj*ubah,hubaubhPX command.r3r4}r5(hX command.hjubeubaubh)r6}r7(hXc:bb:status:`forced builds ` -- The "Force Build" form allows users to specify propertieshhh"h%h,hh.}r8(h2]h3]h1]h0]h4]uh7Nh8hh?]r9hT)r:}r;(hXc:bb:status:`forced builds ` -- The "Force Build" form allows users to specify propertieshj6h"h%h,hWh.}r<(h2]h3]h1]h0]h4]uh7Kh?]r=(h])r>}r?(hX&:bb:status:`forced builds `r@hj:h"h%h,hah.}rA(UreftypeXstatushchdX WebStatusU refdomainXbbrBh0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]rCh)rD}rE(hj@h.}rF(h2]h3]rG(hnjBX bb-statusrHeh1]h0]h4]uhj>h?]rIhPX forced buildsrJrK}rL(hUhjDubah,hubaubhPX= -- The "Force Build" form allows users to specify propertiesrMrN}rO(hX= -- The "Force Build" form allows users to specify propertieshj:ubeubaubh)rP}rQ(hX`:bb:cfg:`buildslaves ` -- A buildslave can pass properties on to the builds it performs.hhh"h%h,hh.}rR(h2]h3]h1]h0]h4]uh7Nh8hh?]rShT)rT}rU(hX`:bb:cfg:`buildslaves ` -- A buildslave can pass properties on to the builds it performs.hjPh"h%h,hWh.}rV(h2]h3]h1]h0]h4]uh7Kh?]rW(h])rX}rY(hX:bb:cfg:`buildslaves `rZhjTh"h%h,hah.}r[(UreftypeXcfghchdXslavesU refdomainXbbr\h0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]r]h)r^}r_(hjZh.}r`(h2]h3]ra(hnj\Xbb-cfgrbeh1]h0]h4]uhjXh?]rchPX buildslavesrdre}rf(hUhj^ubah,hubaubhPXB -- A buildslave can pass properties on to the builds it performs.rgrh}ri(hXB -- A buildslave can pass properties on to the builds it performs.hjTubeubaubh)rj}rk(hXg:ref:`builds ` -- A build automatically sets a number of properties on itself.hhh"h%h,hh.}rl(h2]h3]h1]h0]h4]uh7Nh8hh?]rmhT)rn}ro(hXg:ref:`builds ` -- A build automatically sets a number of properties on itself.hjjh"h%h,hWh.}rp(h2]h3]h1]h0]h4]uh7Kh?]rq(h])rr}rs(hX':ref:`builds `rthjnh"h%h,hah.}ru(UreftypeXrefhchdXcommon-build-propertiesU refdomainXstdrvh0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]rwhi)rx}ry(hjth.}rz(h2]h3]r{(hnjvXstd-refr|eh1]h0]h4]uhjrh?]r}hPXbuildsr~r}r(hUhjxubah,htubaubhPX@ -- A build automatically sets a number of properties on itself.rr}r(hX@ -- A build automatically sets a number of properties on itself.hjnubeubaubh)r}r(hXX:bb:cfg:`builders ` -- A builder can set properties on all the builds it runs.hhh"h%h,hh.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]rhT)r}r(hXX:bb:cfg:`builders ` -- A builder can set properties on all the builds it runs.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7K!h?]r(h])r}r(hX:bb:cfg:`builders `rhjh"h%h,hah.}r(UreftypeXcfghchdXbuildersU refdomainXbbrh0]h1]U refexplicith2]h3]h4]hfhguh7K!h?]rh)r}r(hjh.}r(h2]h3]r(hnjXbb-cfgreh1]h0]h4]uhjh?]rhPXbuildersrr}r(hUhjubah,hubaubhPX; -- A builder can set properties on all the builds it runs.rr}r(hX; -- A builder can set properties on all the builds it runs.hjubeubaubh)r}r(hX:ref:`steps ` -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the `got_revision` property. hhh"h%h,hh.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]rhT)r}r(hX:ref:`steps ` -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the `got_revision` property.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7K#h?]r(h])r}r(hX:ref:`steps `rhjh"h%h,hah.}r(UreftypeXrefhchdX build-stepsU refdomainXstdrh0]h1]U refexplicith2]h3]h4]hfhguh7K#h?]rhi)r}r(hjh.}r(h2]h3]r(hnjXstd-refreh1]h0]h4]uhjh?]rhPXstepsrr}r(hUhjubah,htubaubhPXx -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the rr}r(hXx -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the hjubcdocutils.nodes title_reference r)r}r(hX`got_revision`h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX got_revisionrr}r(hUhjubah,Utitle_referencerubhPX property.rr}r(hX property.hjubeubaubeubhT)r}r(hXIf the same property is supplied in multiple places, the final appearance takes precedence. For example, a property set in a builder configuration will override one supplied by a scheduler.rhhh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7K&h8hh?]rhPXIf the same property is supplied in multiple places, the final appearance takes precedence. For example, a property set in a builder configuration will override one supplied by a scheduler.rr}r(hjhjubaubhT)r}r(hXProperties are stored internally in JSON format, so they are limited to basic types of data: numbers, strings, lists, and dictionaries.rhhh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7K*h8hh?]rhPXProperties are stored internally in JSON format, so they are limited to basic types of data: numbers, strings, lists, and dictionaries.rr}r(hjhjubaubcsphinx.addnodes index r)r}r(hUhhh"h%h,Uindexrh.}r(h0]h1]h2]h3]h4]Uentriesr]r(UsinglerXProperties; Common PropertiesUindex-1rUtraUinlineruh7K-h8hh?]ubh))r}r(hUhhh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7K.h8hh?]ubh))r}r(hX.. _Common-Build-Properties:hhh"h%h'}h,h-h.}r(h0]h1]h2]h3]h4]h5huh7K/h8hh9}rjjsh?]ubh)r}r(hUhhh"h%h'}rh jsh,h@h.}r(h2]h3]h1]h0]r(hjUid2reh4]r(hh euh7K2h8hh9}r(hjjjuh?]r(hI)r}r(hhhjh"h%h,hMh.}r(h0]h1]h2]h3]h4]h5huh7K2h8hh?]rhPXCommon Build Propertiesrr}r(hhhjubaubhT)r}r(hXaThe following build properties are set when the build is started, and are available to all steps.rhjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7K4h8hh?]rhPXaThe following build properties are set when the build is started, and are available to all steps.rr}r(hjhjubaubj)r}r(hUhjh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; got_revisionUindex-2rUtrajuh7K7h8hh?]ubh))r}r(hUhjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7K8h8hh?]ubcdocutils.nodes definition_list r)r}r (hUhjh"h%h'}h,Udefinition_listr h.}r (h2]h3]h1]h0]r jah4]uh7Nh8hh9}r jjsh?]rcdocutils.nodes definition_list_item r)r}r(hX``got_revision`` This property is set when a :class:`Source` step checks out the source tree, and provides the revision that was actually obtained from the VC system. In general this should be the same as ``revision``, except for non-absolute sourcestamps, where ``got_revision`` indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later. .. note:: For some VC systems (Darcs in particular), the revision is a large string containing newlines, and is not suitable for interpolation into a filename. For multi-codebase builds (where codebase is not the default `''`), this property is a dictionary, keyed by codebase. hjh"h%h,Udefinition_list_itemrh.}r(h2]h3]h1]h0]h4]uh7KBh?]r(cdocutils.nodes term r)r}r(hX``got_revision``rhjh"h%h,Utermrh.}r(h2]h3]h1]h0]h4]uh7KBh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX got_revisionr r!}r"(hUhjubah,hubaubcdocutils.nodes definition r#)r$}r%(hUh.}r&(h2]h3]h1]h0]h4]uhjh?]r'(hT)r(}r)(hXThis property is set when a :class:`Source` step checks out the source tree, and provides the revision that was actually obtained from the VC system. In general this should be the same as ``revision``, except for non-absolute sourcestamps, where ``got_revision`` indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later.hj$h"h%h,hWh.}r*(h2]h3]h1]h0]h4]uh7K:h?]r+(hPXThis property is set when a r,r-}r.(hXThis property is set when a hj(ubh])r/}r0(hX:class:`Source`r1hj(h"h%h,hah.}r2(UreftypeXclasshchdXSourceU refdomainXpyr3h0]h1]U refexplicith2]h3]h4]hfhgUpy:classr4NU py:moduler5Nuh7K:h?]r6h)r7}r8(hj1h.}r9(h2]h3]r:(hnj3Xpy-classr;eh1]h0]h4]uhj/h?]r<hPXSourcer=r>}r?(hUhj7ubah,hubaubhPX step checks out the source tree, and provides the revision that was actually obtained from the VC system. In general this should be the same as r@rA}rB(hX step checks out the source tree, and provides the revision that was actually obtained from the VC system. In general this should be the same as hj(ubh)rC}rD(hX ``revision``h.}rE(h2]h3]h1]h0]h4]uhj(h?]rFhPXrevisionrGrH}rI(hUhjCubah,hubhPX., except for non-absolute sourcestamps, where rJrK}rL(hX., except for non-absolute sourcestamps, where hj(ubh)rM}rN(hX``got_revision``h.}rO(h2]h3]h1]h0]h4]uhj(h?]rPhPX got_revisionrQrR}rS(hUhjMubah,hubhPX} indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later.rTrU}rV(hX} indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later.hj(ubeubcdocutils.nodes note rW)rX}rY(hXFor some VC systems (Darcs in particular), the revision is a large string containing newlines, and is not suitable for interpolation into a filename.h.}rZ(h2]h3]h1]h0]h4]uhj$h?]r[hT)r\}r](hXFor some VC systems (Darcs in particular), the revision is a large string containing newlines, and is not suitable for interpolation into a filename.r^hjXh"h%h,hWh.}r_(h2]h3]h1]h0]h4]uh7K>h?]r`hPXFor some VC systems (Darcs in particular), the revision is a large string containing newlines, and is not suitable for interpolation into a filename.rarb}rc(hj^hj\ubaubah,UnoterdubhT)re}rf(hXuFor multi-codebase builds (where codebase is not the default `''`), this property is a dictionary, keyed by codebase.hj$h"h%h,hWh.}rg(h2]h3]h1]h0]h4]uh7KBh?]rh(hPX=For multi-codebase builds (where codebase is not the default rirj}rk(hX=For multi-codebase builds (where codebase is not the default hjeubj)rl}rm(hX`''`h.}rn(h2]h3]h1]h0]h4]uhjeh?]rohPX''rprq}rr(hUhjlubah,jubhPX4), this property is a dictionary, keyed by codebase.rsrt}ru(hX4), this property is a dictionary, keyed by codebase.hjeubeubeh,U definitionrvubeubaubj)rw}rx(hUhjh"h%h,jh.}ry(h0]h1]h2]h3]h4]j]rz(jXProperties; buildernameUindex-3r{Utr|ajuh7KDh8hh?]ubh))r}}r~(hUhjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5j{uh7KEh8hh?]ubj)r}r(hUhjh"h%h'}h,j h.}r(h2]h3]h1]h0]rj{ah4]uh7Nh8hh9}rj{j}sh?]rj)r}r(hX``buildername`` This is a string that indicates which :class:`Builder` the build was a part of. The combination of buildername and buildnumber uniquely identify a build. hjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7KIh?]r(j)r}r(hX``buildername``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7KIh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX buildernamerr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hXThis is a string that indicates which :class:`Builder` the build was a part of. The combination of buildername and buildnumber uniquely identify a build.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7KGh?]r(hPX&This is a string that indicates which rr}r(hX&This is a string that indicates which hjubh])r}r(hX:class:`Builder`rhjh"h%h,hah.}r(UreftypeXclasshchdXBuilderU refdomainXpyrh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7KGh?]rh)r}r(hjh.}r(h2]h3]r(hnjXpy-classreh1]h0]h4]uhjh?]rhPXBuilderrr}r(hUhjubah,hubaubhPXc the build was a part of. The combination of buildername and buildnumber uniquely identify a build.rr}r(hXc the build was a part of. The combination of buildername and buildnumber uniquely identify a build.hjubeubah,jvubeubaubj)r}r(hUhjh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; buildnumberUindex-4rUtrajuh7KKh8hh?]ubh))r}r(hUhjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7KLh8hh?]ubj)r}r(hUhjh"h%h'}h,j h.}r(h2]h3]h1]h0]rjah4]uh7Nh8hh9}rjjsh?]rj)r}r(hX``buildnumber`` Each build gets a number, scoped to the :class:`Builder` (so the first build performed on any given :class:`Builder` will have a build number of 0). This integer property contains the build's number. hjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7KPh?]r(j)r}r(hX``buildnumber``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7KPh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX buildnumberrr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hXEach build gets a number, scoped to the :class:`Builder` (so the first build performed on any given :class:`Builder` will have a build number of 0). This integer property contains the build's number.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7KNh?]r(hPX(Each build gets a number, scoped to the rr}r(hX(Each build gets a number, scoped to the hjubh])r}r(hX:class:`Builder`rhjh"h%h,hah.}r(UreftypeXclasshchdXBuilderU refdomainXpyrh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7KNh?]rh)r}r(hjh.}r(h2]h3]r(hnjXpy-classreh1]h0]h4]uhjh?]rhPXBuilderrr}r(hUhjubah,hubaubhPX, (so the first build performed on any given rr}r(hX, (so the first build performed on any given hjubh])r}r(hX:class:`Builder`rhjh"h%h,hah.}r(UreftypeXclasshchdXBuilderU refdomainXpyrh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7KNh?]rh)r}r(hjh.}r(h2]h3]r(hnjXpy-classreh1]h0]h4]uhjh?]rhPXBuilderrr}r(hUhjubah,hubaubhPXS will have a build number of 0). This integer property contains the build's number.rr}r(hXS will have a build number of 0). This integer property contains the build's number.hjubeubah,jvubeubaubj)r}r(hUhjh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; slavenameUindex-5rUtrajuh7KRh8hh?]ubh))r}r(hUhjh"h%h,h-h.}r (h0]h1]h2]h3]h4]h5juh7KSh8hh?]ubj)r }r (hUhjh"h%h'}h,j h.}r (h2]h3]h1]h0]r jah4]uh7Nh8hh9}rjjsh?]rj)r}r(hXZ``slavename`` This is a string which identifies which buildslave the build is running on. hj h"h%h,jh.}r(h2]h3]h1]h0]h4]uh7KVh?]r(j)r}r(hX ``slavename``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7KVh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX slavenamerr}r(hUhjubah,hubaubj#)r }r!(hUh.}r"(h2]h3]h1]h0]h4]uhjh?]r#hT)r$}r%(hXKThis is a string which identifies which buildslave the build is running on.r&hj h"h%h,hWh.}r'(h2]h3]h1]h0]h4]uh7KUh?]r(hPXKThis is a string which identifies which buildslave the build is running on.r)r*}r+(hj&hj$ubaubah,jvubeubaubj)r,}r-(hUhjh"h%h,jh.}r.(h0]h1]h2]h3]h4]j]r/(jXProperties; schedulerUindex-6r0Utr1ajuh7KXh8hh?]ubh))r2}r3(hUhjh"h%h,h-h.}r4(h0]h1]h2]h3]h4]h5j0uh7KYh8hh?]ubj)r5}r6(hUhjh"h%h'}h,j h.}r7(h2]h3]h1]h0]r8j0ah4]uh7Nh8hh9}r9j0j2sh?]r:(j)r;}r<(hXv``scheduler`` If the build was started from a scheduler, then this property will contain the name of that scheduler. hj5h"h%h,jh.}r=(h2]h3]h1]h0]h4]uh7K]h?]r>(j)r?}r@(hX ``scheduler``rAhj;h"h%h,jh.}rB(h2]h3]h1]h0]h4]uh7K]h?]rCh)rD}rE(hjAh.}rF(h2]h3]h1]h0]h4]uhj?h?]rGhPX schedulerrHrI}rJ(hUhjDubah,hubaubj#)rK}rL(hUh.}rM(h2]h3]h1]h0]h4]uhj;h?]rNhT)rO}rP(hXfIf the build was started from a scheduler, then this property will contain the name of that scheduler.rQhjKh"h%h,hWh.}rR(h2]h3]h1]h0]h4]uh7K[h?]rShPXfIf the build was started from a scheduler, then this property will contain the name of that scheduler.rTrU}rV(hjQhjOubaubah,jvubeubj)rW}rX(hXb``workdir`` The absolute path of the base working directory on the slave, of the current builder. hj5h"h%h,jh.}rY(h2]h3]h1]h0]h4]uh7Kah8hh?]rZ(j)r[}r\(hX ``workdir``r]hjWh"h%h,jh.}r^(h2]h3]h1]h0]h4]uh7Kah?]r_h)r`}ra(hj]h.}rb(h2]h3]h1]h0]h4]uhj[h?]rchPXworkdirrdre}rf(hUhj`ubah,hubaubj#)rg}rh(hUh.}ri(h2]h3]h1]h0]h4]uhjWh?]rjhT)rk}rl(hXUThe absolute path of the base working directory on the slave, of the current builder.rmhjgh"h%h,hWh.}rn(h2]h3]h1]h0]h4]uh7K`h?]rohPXUThe absolute path of the base working directory on the slave, of the current builder.rprq}rr(hjmhjkubaubah,jvubeubeubj)rs}rt(hUhjh"h%h,jh.}ru(h0]h1]h2]h3]h4]j]rv(jXProperties; workdirUindex-7rwUtrxajuh7Kch8hh?]ubh))ry}rz(hUhjh"h%h,h-h.}r{(h0]h1]h2]h3]h4]h5jwuh7Kdh8hh?]ubhT)r|}r}(hXFor single codebase builds, where the codebase is `''`, the following :ref:`Source-Stamp-Attributes` are also available as properties: ``branch``, ``revision``, ``repository``, and ``project`` .r~hjh"h%h'}h,hWh.}r(h2]h3]h1]h0]rjwah4]uh7Keh8hh9}rjwjysh?]r(hPX2For single codebase builds, where the codebase is rr}r(hX2For single codebase builds, where the codebase is hj|ubj)r}r(hX`''`h.}r(h2]h3]h1]h0]h4]uhj|h?]rhPX''rr}r(hUhjubah,jubhPX, the following rr}r(hX, the following hj|ubh])r}r(hX:ref:`Source-Stamp-Attributes`rhj|h"h%h,hah.}r(UreftypeXrefhchdXsource-stamp-attributesU refdomainXstdrh0]h1]U refexplicith2]h3]h4]hfhguh7Keh?]rhi)r}r(hjh.}r(h2]h3]r(hnjXstd-refreh1]h0]h4]uhjh?]rhPXSource-Stamp-Attributesrr}r(hUhjubah,htubaubhPX# are also available as properties: rr}r(hX# are also available as properties: hj|ubh)r}r(hX ``branch``h.}r(h2]h3]h1]h0]h4]uhj|h?]rhPXbranchrr}r(hUhjubah,hubhPX, rr}r(hX, hj|ubh)r}r(hX ``revision``h.}r(h2]h3]h1]h0]h4]uhj|h?]rhPXrevisionrr}r(hUhjubah,hubhPX, rr}r(hX, hj|ubh)r}r(hX``repository``h.}r(h2]h3]h1]h0]h4]uhj|h?]rhPX repositoryrr}r(hUhjubah,hubhPX, and rr}r(hX, and hj|ubh)r}r(hX ``project``h.}r(h2]h3]h1]h0]h4]uhj|h?]rhPXprojectrr}r(hUhjubah,hubhPX .rr}r(hX .hj|ubeubh))r}r(hX.. _Source-Stamp-Attributes:hjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5huh7Kgh8hh?]ubeubh)r}r(hUhhh"h%h'}rhjsh,h@h.}r(h2]h3]h1]h0]r(hUid3reh4]r(hheuh7Kjh8hh9}rhjsh?]r(hI)r}r(hhhjh"h%h,hMh.}r(h0]h1]h2]h3]h4]h5huh7Kjh8hh?]rhPXSource Stamp Attributesrr}r(hhhjubaubj)r}r(hUhjh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; branchUindex-8rUtrajuh7Klh8hh?]ubh))r}r(hUhjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7Kmh8hh?]ubhT)r}r(hX?``branch`` ``revision`` ``repository`` ``project`` ``codebase``hjh"h%h'}h,hWh.}r(h2]h3]h1]h0]rjah4]uh7Knh8hh9}rjjsh?]r(h)r}r(hX ``branch``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXbranchrr}r(hUhjubah,hubhPX r}r(hX hjubh)r}r(hX ``revision``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXrevisionrr}r(hUhjubah,hubhPX r}r(hX hjubh)r}r(hX``repository``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX repositoryrr}r(hUhjubah,hubhPX r}r(hX hjubh)r}r(hX ``project``h.}r (h2]h3]h1]h0]h4]uhjh?]r hPXprojectr r }r (hUhjubah,hubhPX r}r(hX hjubh)r}r(hX ``codebase``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXcodebaserr}r(hUhjubah,hubeubcdocutils.nodes block_quote r)r}r(hUhjh"h%h,U block_quoterh.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]rhT)r}r(hX<For details of these attributes see :doc:`/manual/concepts`.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kth?]r (hPX$For details of these attributes see r!r"}r#(hX$For details of these attributes see hjubh])r$}r%(hX:doc:`/manual/concepts`r&hjh"h%h,hah.}r'(UreftypeXdocr(hchdX/manual/conceptsU refdomainUh0]h1]U refexplicith2]h3]h4]hfhguh7Kth?]r)h)r*}r+(hj&h.}r,(h2]h3]r-(hnj(eh1]h0]h4]uhj$h?]r.hPX/manual/conceptsr/r0}r1(hUhj*ubah,hubaubhPX.r2}r3(hX.hjubeubaubhT)r4}r5(hX ``changes``r6hjh"h%h,hWh.}r7(h2]h3]h1]h0]h4]uh7Kvh8hh?]r8h)r9}r:(hj6h.}r;(h2]h3]h1]h0]h4]uhj4h?]r<hPXchangesr=r>}r?(hUhj9ubah,hubaubj)r@}rA(hUhjh"h%h,jh.}rB(h2]h3]h1]h0]h4]uh7Nh8hh?]rChT)rD}rE(hX`This attribute is a list of dictionaries reperesnting the changes that make up this sourcestamp.rFhj@h"h%h,hWh.}rG(h2]h3]h1]h0]h4]uh7Kxh?]rHhPX`This attribute is a list of dictionaries reperesnting the changes that make up this sourcestamp.rIrJ}rK(hjFhjDubaubaubeubh)rL}rM(hUhhh"h%h,h@h.}rN(h2]h3]h1]h0]rOhah4]rPhauh7K{h8hh?]rQ(hI)rR}rS(hhhjLh"h%h,hMh.}rT(h0]h1]h2]h3]h4]h5huh7K{h8hh?]rUhPXUsing Properties in StepsrVrW}rX(hhhjRubaubhT)rY}rZ(hX"For the most part, properties are used to alter the behavior of build steps during a build. This is done by annotating the step definition in ``master.cfg`` with placeholders. When the step is executed, these placeholders will be replaced using the current values of the build properties.hjLh"h%h,hWh.}r[(h2]h3]h1]h0]h4]uh7K}h8hh?]r\(hPXFor the most part, properties are used to alter the behavior of build steps during a build. This is done by annotating the step definition in r]r^}r_(hXFor the most part, properties are used to alter the behavior of build steps during a build. This is done by annotating the step definition in hjYubh)r`}ra(hX``master.cfg``h.}rb(h2]h3]h1]h0]h4]uhjYh?]rchPX master.cfgrdre}rf(hUhj`ubah,hubhPX with placeholders. When the step is executed, these placeholders will be replaced using the current values of the build properties.rgrh}ri(hX with placeholders. When the step is executed, these placeholders will be replaced using the current values of the build properties.hjYubeubjW)rj}rk(hXProperties are defined while a build is in progress; their values are not available when the configuration file is parsed. This can sometimes confuse newcomers to Buildbot! In particular, the following is a common error:: if Property('release_train') == 'alpha': f.addStep(...) This does not work because the value of the property is not available when the ``if`` statement is executed. However, Python will not detect this as an error - you will just never see the step added to the factory.hjLh"h%h,jdh.}rl(h2]h3]h1]h0]h4]uh7Nh8hh?]rm(hT)rn}ro(hXProperties are defined while a build is in progress; their values are not available when the configuration file is parsed. This can sometimes confuse newcomers to Buildbot! In particular, the following is a common error::hjjh"h%h,hWh.}rp(h2]h3]h1]h0]h4]uh7Kh?]rqhPXProperties are defined while a build is in progress; their values are not available when the configuration file is parsed. This can sometimes confuse newcomers to Buildbot! In particular, the following is a common error:rrrs}rt(hXProperties are defined while a build is in progress; their values are not available when the configuration file is parsed. This can sometimes confuse newcomers to Buildbot! In particular, the following is a common error:hjnubaubcdocutils.nodes literal_block ru)rv}rw(hX;if Property('release_train') == 'alpha': f.addStep(...)hjjh,U literal_blockrxh.}ry(U xml:spacerzUpreserver{h0]h1]h2]h3]h4]uh7Kh?]r|hPX;if Property('release_train') == 'alpha': f.addStep(...)r}r~}r(hUhjvubaubhT)r}r(hXThis does not work because the value of the property is not available when the ``if`` statement is executed. However, Python will not detect this as an error - you will just never see the step added to the factory.hjjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(hPXOThis does not work because the value of the property is not available when the rr}r(hXOThis does not work because the value of the property is not available when the hjubh)r}r(hX``if``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXifrr}r(hUhjubah,hubhPX statement is executed. However, Python will not detect this as an error - you will just never see the step added to the factory.rr}r(hX statement is executed. However, Python will not detect this as an error - you will just never see the step added to the factory.hjubeubeubhT)r}r(hXzYou can use build properties in most step parameters. Please file bugs for any parameters which do not accept properties.rhjLh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]rhPXzYou can use build properties in most step parameters. Please file bugs for any parameters which do not accept properties.rr}r(hjhjubaubj)r}r(hUhjLh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; PropertyUindex-9rUtrajuh7Kh8hh?]ubh))r}r(hUhjLh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7Kh8hh?]ubh))r}r(hX .. _Property:hjLh"h%h'}h,h-h.}r(h0]h1]h2]h3]h4]h5Upropertyruh7Kh8hh9}rjjsh?]ubh)r}r(hUh!KhjLh"h%h'}rhjsh,h@h.}r(h2]rXpropertyrah3]h1]h0]r(jjUid4reh4]rhauh7Kh8hh9}r(jjjjuh?]r(hI)r}r(hXPropertyrhjh"h%h,hMh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]rhPXPropertyrr}r(hjhjubaubhT)r}r(hXUThe simplest form of annotation is to wrap the property name with :class:`Property`::hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(hPXBThe simplest form of annotation is to wrap the property name with rr}r(hXBThe simplest form of annotation is to wrap the property name with hjubh])r}r(hX:class:`Property`rhjh"h%h,hah.}r(UreftypeXclasshchdXPropertyU refdomainXpyrh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7Kh?]rh)r}r(hjh.}r(h2]h3]r(hnjXpy-classreh1]h0]h4]uhjh?]rhPXPropertyrr}r(hUhjubah,hubaubhPX:r}r(hX:hjubeubju)r}r(hXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Property f.addStep(ShellCommand(command=[ 'echo', 'buildername:', Property('buildername') ]))hjh"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7Kh8hh?]rhPXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Property f.addStep(ShellCommand(command=[ 'echo', 'buildername:', Property('buildername') ]))rr}r(hUhjubaubhT)r}r(hXKYou can specify a default value by passing a ``default`` keyword argument::rhjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(hPX-You can specify a default value by passing a rr}r(hX-You can specify a default value by passing a hjubh)r}r(hX ``default``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXdefaultrr}r(hUhjubah,hubhPX keyword argument:rr}r(hX keyword argument:hjubeubju)r}r(hXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none') ]))hjh"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7Kh8hh?]rhPXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none') ]))rr}r(hUhjubaubhT)r}r(hXThe default value is used when the property doesn't exist, or when the value is something Python regards as ``False``. The ``defaultWhenFalse`` argument can be set to ``False`` to force buildbot to use the default argument only if the parameter is not set::hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(hPXlThe default value is used when the property doesn't exist, or when the value is something Python regards as rr}r(hXlThe default value is used when the property doesn't exist, or when the value is something Python regards as hjubh)r}r(hX ``False``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXFalserr}r(hUhjubah,hubhPX. The rr}r(hX. The hjubh)r}r(hX``defaultWhenFalse``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXdefaultWhenFalserr}r (hUhjubah,hubhPX argument can be set to r r }r (hX argument can be set to hjubh)r }r(hX ``False``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXFalserr}r(hUhj ubah,hubhPXP to force buildbot to use the default argument only if the parameter is not set:rr}r(hXP to force buildbot to use the default argument only if the parameter is not set:hjubeubju)r}r(hXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none', defaultWhenFalse=False) ]))hjh"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7Kh8hh?]rhPXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none', defaultWhenFalse=False) ]))rr}r(hUhjubaubhT)r}r(hX:The default value can reference other properties, e.g., ::r hjh"h%h,hWh.}r!(h2]h3]h1]h0]h4]uh7Kh8hh?]r"hPX7The default value can reference other properties, e.g.,r#r$}r%(hX7The default value can reference other properties, e.g.,hjubaubju)r&}r'(hX@command=Property('command', default=Property('default-command'))hjh"h%h,jxh.}r((jzj{h0]h1]h2]h3]h4]uh7Kh8hh?]r)hPX@command=Property('command', default=Property('default-command'))r*r+}r,(hUhj&ubaubj)r-}r.(hUhjh"h%h,jh.}r/(h0]h1]h2]h3]h4]j]r0(jXProperties; InterpolateUindex-10r1Utr2ajuh7Kh8hh?]ubh))r3}r4(hUhjh"h%h,h-h.}r5(h0]h1]h2]h3]h4]h5j1uh7Kh8hh?]ubh))r6}r7(hX.. _Interpolate:hjh"h%h'}h,h-h.}r8(h0]h1]h2]h3]h4]h5U interpolater9uh7Kh8hh9}r:j1j3sh?]ubeubh)r;}r<(hUh!KhjLh"h%h'}r=h j6sh,h@h.}r>(h2]r?X interpolater@ah3]h1]h0]rA(j9j1Uid5rBeh4]rCh auh7Kh8hh9}rD(j1j3j9j6uh?]rE(hI)rF}rG(hX InterpolaterHhj;h"h%h,hMh.}rI(h2]h3]h1]h0]h4]uh7Kh8hh?]rJhPX InterpolaterKrL}rM(hjHhjFubaubhT)rN}rO(hX:class:`Property` can only be used to replace an entire argument: in the example above, it replaces an argument to ``echo``. Often, properties need to be interpolated into strings, instead. The tool for that job is :ref:`Interpolate`.hj;h"h%h,hWh.}rP(h2]h3]h1]h0]h4]uh7Kh8hh?]rQ(h])rR}rS(hX:class:`Property`rThjNh"h%h,hah.}rU(UreftypeXclasshchdXPropertyU refdomainXpyrVh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7Kh?]rWh)rX}rY(hjTh.}rZ(h2]h3]r[(hnjVXpy-classr\eh1]h0]h4]uhjRh?]r]hPXPropertyr^r_}r`(hUhjXubah,hubaubhPXb can only be used to replace an entire argument: in the example above, it replaces an argument to rarb}rc(hXb can only be used to replace an entire argument: in the example above, it replaces an argument to hjNubh)rd}re(hX``echo``h.}rf(h2]h3]h1]h0]h4]uhjNh?]rghPXechorhri}rj(hUhjdubah,hubhPX^. Often, properties need to be interpolated into strings, instead. The tool for that job is rkrl}rm(hX^. Often, properties need to be interpolated into strings, instead. The tool for that job is hjNubh])rn}ro(hX:ref:`Interpolate`rphjNh"h%h,hah.}rq(UreftypeXrefhchdX interpolateU refdomainXstdrrh0]h1]U refexplicith2]h3]h4]hfhguh7Kh?]rshi)rt}ru(hjph.}rv(h2]h3]rw(hnjrXstd-refrxeh1]h0]h4]uhjnh?]ryhPX Interpolaterzr{}r|(hUhjtubah,htubaubhPX.r}}r~(hX.hjNubeubhT)r}r(hXKThe more common pattern is to use Python dictionary-style string interpolation by using the ``%(prop:)s`` syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character"). ::hj;h"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(hPX\The more common pattern is to use Python dictionary-style string interpolation by using the rr}r(hX\The more common pattern is to use Python dictionary-style string interpolation by using the hjubh)r}r(hX``%(prop:)s``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX%(prop:)srr}r(hUhjubah,hubhPX syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character").rr}r(hX syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character").hjubeubju)r}r(hXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Interpolate f.addStep(ShellCommand(command=[ 'make', Interpolate('REVISION=%(prop:got_revision)s'), 'dist' ]))hj;h"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7Kh8hh?]rhPXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Interpolate f.addStep(ShellCommand(command=[ 'make', Interpolate('REVISION=%(prop:got_revision)s'), 'dist' ]))rr}r(hUhjubaubhT)r}r(hXXThis example will result in a ``make`` command with an argument like ``REVISION=12098``.hj;h"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(hPXThis example will result in a rr}r(hXThis example will result in a hjubh)r}r(hX``make``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXmakerr}r(hUhjubah,hubhPX command with an argument like rr}r(hX command with an argument like hjubh)r}r(hX``REVISION=12098``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXREVISION=12098rr}r(hUhjubah,hubhPX.r}r(hX.hjubeubh))r}r(hX.. _Interpolate-DictStyle:hj;h"h%h,h-h.}r(h0]h1]h2]h3]h4]h5Uinterpolate-dictstyleruh7Kh8hh?]ubhT)r}r(hXThe syntax of dictionary-style interpolation is a selector, followed by a colon, followed by a selector specific key, optionally followed by a colon and a string indicating how to interpret the value produced by the key.rhj;h"h%h'}rhjsh,hWh.}r(h2]h3]h1]h0]rjah4]rhauh7Kh8hh9}rjjsh?]rhPXThe syntax of dictionary-style interpolation is a selector, followed by a colon, followed by a selector specific key, optionally followed by a colon and a string indicating how to interpret the value produced by the key.rr}r(hjhjubaubhT)r}r(hX&The following selectors are supported.rhj;h"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]rhPX&The following selectors are supported.rr}r(hjhjubaubj)r}r(hUhj;h"h%h,j h.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]r(j)r}r(hX,``prop`` The key is the name of a property. hjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(j)r}r(hX``prop``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPXproprr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hX"The key is the name of a property.rhjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]rhPX"The key is the name of a property.rr}r(hjhjubaubah,jvubeubj)r}r(hXP``src`` The key is a codebase and source stamp attribute, separated by a colon. hjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(j)r}r(hX``src``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPXsrcrr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hXGThe key is a codebase and source stamp attribute, separated by a colon.rhjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]rhPXGThe key is a codebase and source stamp attribute, separated by a colon.rr}r(hjhjubaubah,jvubeubj)r}r(hXG``kw`` The key refers to a keyword argument passed to ``Interpolate``. hjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(j)r }r (hX``kw``r hjh"h%h,jh.}r (h2]h3]h1]h0]h4]uh7Kh?]r h)r}r(hj h.}r(h2]h3]h1]h0]h4]uhj h?]rhPXkwrr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hX?The key refers to a keyword argument passed to ``Interpolate``.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(hPX/The key refers to a keyword argument passed to rr}r(hX/The key refers to a keyword argument passed to hjubh)r }r!(hX``Interpolate``h.}r"(h2]h3]h1]h0]h4]uhjh?]r#hPX Interpolater$r%}r&(hUhj ubah,hubhPX.r'}r((hX.hjubeubah,jvubeubj)r)}r*(hX``slave`` The key to the per-buildslave "info" dictionary (e.g., the "Slave information" properties shown in the buildslave web page for each buildslave) hjh"h%h,jh.}r+(h2]h3]h1]h0]h4]uh7Kh8hh?]r,(j)r-}r.(hX ``slave``r/hj)h"h%h,jh.}r0(h2]h3]h1]h0]h4]uh7Kh?]r1h)r2}r3(hj/h.}r4(h2]h3]h1]h0]h4]uhj-h?]r5hPXslaver6r7}r8(hUhj2ubah,hubaubj#)r9}r:(hUh.}r;(h2]h3]h1]h0]h4]uhj)h?]r<hT)r=}r>(hXThe key to the per-buildslave "info" dictionary (e.g., the "Slave information" properties shown in the buildslave web page for each buildslave)r?hj9h"h%h,hWh.}r@(h2]h3]h1]h0]h4]uh7Kh?]rAhPXThe key to the per-buildslave "info" dictionary (e.g., the "Slave information" properties shown in the buildslave web page for each buildslave)rBrC}rD(hj?hj=ubaubah,jvubeubeubhT)rE}rF(hX;The following ways of interpreting the value are available.rGhj;h"h%h,hWh.}rH(h2]h3]h1]h0]h4]uh7Kh8hh?]rIhPX;The following ways of interpreting the value are available.rJrK}rL(hjGhjEubaubj)rM}rN(hUhj;h"h%h,j h.}rO(h2]h3]h1]h0]h4]uh7Nh8hh?]rP(j)rQ}rR(hX``-replacement`` If the key exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(prop:propname:-)s``). This is the default. hjMh"h%h,jh.}rS(h2]h3]h1]h0]h4]uh7Kh?]rT(j)rU}rV(hX``-replacement``rWhjQh"h%h,jh.}rX(h2]h3]h1]h0]h4]uh7Kh?]rYh)rZ}r[(hjWh.}r\(h2]h3]h1]h0]h4]uhjUh?]r]hPX -replacementr^r_}r`(hUhjZubah,hubaubj#)ra}rb(hUh.}rc(h2]h3]h1]h0]h4]uhjQh?]rdhT)re}rf(hXIf the key exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(prop:propname:-)s``). This is the default.hjah"h%h,hWh.}rg(h2]h3]h1]h0]h4]uh7Kh?]rh(hPX?If the key exists, substitute its value; otherwise, substitute rirj}rk(hX?If the key exists, substitute its value; otherwise, substitute hjeubh)rl}rm(hX``replacement``h.}rn(h2]h3]h1]h0]h4]uhjeh?]rohPX replacementrprq}rr(hUhjlubah,hubhPX. rsrt}ru(hX. hjeubh)rv}rw(hX``replacement``h.}rx(h2]h3]h1]h0]h4]uhjeh?]ryhPX replacementrzr{}r|(hUhjvubah,hubhPX may be empty (r}r~}r(hX may be empty (hjeubh)r}r(hX``%(prop:propname:-)s``h.}r(h2]h3]h1]h0]h4]uhjeh?]rhPX%(prop:propname:-)srr}r(hUhjubah,hubhPX). This is the default.rr}r(hX). This is the default.hjeubeubah,jvubeubj)r}r(hX``~replacement`` Like ``-replacement``, but only substitutes the value of the key if it is something Python regards as ``True``. Python considers ``None``, 0, empty lists, and the empty string to be false, so such values will be replaced by ``replacement``. hjMh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(j)r}r(hX``~replacement``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX ~replacementrr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hXLike ``-replacement``, but only substitutes the value of the key if it is something Python regards as ``True``. Python considers ``None``, 0, empty lists, and the empty string to be false, so such values will be replaced by ``replacement``.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(hPXLike rr}r(hXLike hjubh)r}r(hX``-replacement``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX -replacementrr}r(hUhjubah,hubhPXQ, but only substitutes the value of the key if it is something Python regards as rr}r(hXQ, but only substitutes the value of the key if it is something Python regards as hjubh)r}r(hX``True``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXTruerr}r(hUhjubah,hubhPX. Python considers rr}r(hX. Python considers hjubh)r}r(hX``None``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXNonerr}r(hUhjubah,hubhPXW, 0, empty lists, and the empty string to be false, so such values will be replaced by rr}r(hXW, 0, empty lists, and the empty string to be false, so such values will be replaced by hjubh)r}r(hX``replacement``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX replacementrr}r(hUhjubah,hubhPX.r}r(hX.hjubeubah,jvubeubj)r}r(hXg``+replacement`` If the key exists, substitute ``replacement``; otherwise, substitute an empty string. hjMh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]r(j)r}r(hX``+replacement``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX +replacementrr}r(hUhjubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hXUIf the key exists, substitute ``replacement``; otherwise, substitute an empty string.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(hPXIf the key exists, substitute rr}r(hXIf the key exists, substitute hjubh)r}r(hX``replacement``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX replacementrr}r(hUhjubah,hubhPX(; otherwise, substitute an empty string.rr}r(hX(; otherwise, substitute an empty string.hjubeubah,jvubeubeubhT)r}r(hX"``?|sub_if_exists|sub_if_missing``rhj;h"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh8hh?]rh)r}r(hjh.}r(h2]h3]h1]h0]h4]uhjh?]rhPX?|sub_if_exists|sub_if_missingrr}r(hUhjubah,hubaubj)r}r(hUhj;h"h%h,j h.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]rj)r}r(hX``#?|sub_if_true|sub_if_false`` Ternary substitution, depending on either the key being present (with ``?``, similar to ``+``) or being ``True`` (with ``#?``, like ``~``). Notice that there is a pipe immediately following the question mark *and* between the two substitution alternatives. The character that follows the question mark is used as the delimiter between the two alternatives. In the above examples, it is a pipe, but any character other than ``(`` can be used. hjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(j)r}r(hX``#?|sub_if_true|sub_if_false``rhjh"h%h,jh.}r(h2]h3]h1]h0]h4]uh7Kh?]r h)r }r (hjh.}r (h2]h3]h1]h0]h4]uhjh?]r hPX#?|sub_if_true|sub_if_falserr}r(hUhj ubah,hubaubj#)r}r(hUh.}r(h2]h3]h1]h0]h4]uhjh?]rhT)r}r(hXTernary substitution, depending on either the key being present (with ``?``, similar to ``+``) or being ``True`` (with ``#?``, like ``~``). Notice that there is a pipe immediately following the question mark *and* between the two substitution alternatives. The character that follows the question mark is used as the delimiter between the two alternatives. In the above examples, it is a pipe, but any character other than ``(`` can be used.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Kh?]r(hPXFTernary substitution, depending on either the key being present (with rr}r(hXFTernary substitution, depending on either the key being present (with hjubh)r}r(hX``?``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX?r }r!(hUhjubah,hubhPX , similar to r"r#}r$(hX , similar to hjubh)r%}r&(hX``+``h.}r'(h2]h3]h1]h0]h4]uhjh?]r(hPX+r)}r*(hUhj%ubah,hubhPX ) or being r+r,}r-(hX ) or being hjubh)r.}r/(hX``True``h.}r0(h2]h3]h1]h0]h4]uhjh?]r1hPXTruer2r3}r4(hUhj.ubah,hubhPX (with r5r6}r7(hX (with hjubh)r8}r9(hX``#?``h.}r:(h2]h3]h1]h0]h4]uhjh?]r;hPX#?r<r=}r>(hUhj8ubah,hubhPX, like r?r@}rA(hX, like hjubh)rB}rC(hX``~``h.}rD(h2]h3]h1]h0]h4]uhjh?]rEhPX~rF}rG(hUhjBubah,hubhPXG). Notice that there is a pipe immediately following the question mark rHrI}rJ(hXG). Notice that there is a pipe immediately following the question mark hjubhi)rK}rL(hX*and*h.}rM(h2]h3]h1]h0]h4]uhjh?]rNhPXandrOrP}rQ(hUhjKubah,htubhPX between the two substitution alternatives. The character that follows the question mark is used as the delimiter between the two alternatives. In the above examples, it is a pipe, but any character other than rRrS}rT(hX between the two substitution alternatives. The character that follows the question mark is used as the delimiter between the two alternatives. In the above examples, it is a pipe, but any character other than hjubh)rU}rV(hX``(``h.}rW(h2]h3]h1]h0]h4]uhjh?]rXhPX(rY}rZ(hUhjUubah,hubhPX can be used.r[r\}r](hX can be used.hjubeubah,jvubeubaubhT)r^}r_(hXbAlthough these are similar to shell substitutions, no other substitutions are currently supported.r`hj;h"h%h,hWh.}ra(h2]h3]h1]h0]h4]uh7Kh8hh?]rbhPXbAlthough these are similar to shell substitutions, no other substitutions are currently supported.rcrd}re(hj`hj^ubaubhT)rf}rg(hX Example ::rhhj;h"h%h,hWh.}ri(h2]h3]h1]h0]h4]uh7Kh8hh?]rjhPXExamplerkrl}rm(hXExamplehjfubaubju)rn}ro(hXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Interpolate f.addStep(ShellCommand(command=[ 'make', Interpolate('REVISION=%(prop:got_revision:-%(src::revision:-unknown)s)s'), 'dist' ]))hj;h"h%h,jxh.}rp(jzj{h0]h1]h2]h3]h4]uh7Kh8hh?]rqhPXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Interpolate f.addStep(ShellCommand(command=[ 'make', Interpolate('REVISION=%(prop:got_revision:-%(src::revision:-unknown)s)s'), 'dist' ]))rrrs}rt(hUhjnubaubhT)ru}rv(hXIn addition, ``Interpolate`` supports using positional string interpolation. Here, ``%s`` is used as a placeholder, and the substitutions (which may themselves be placeholders), are given as subsequent arguments::hj;h"h%h,hWh.}rw(h2]h3]h1]h0]h4]uh7Mh8hh?]rx(hPX In addition, ryrz}r{(hX In addition, hjuubh)r|}r}(hX``Interpolate``h.}r~(h2]h3]h1]h0]h4]uhjuh?]rhPX Interpolaterr}r(hUhj|ubah,hubhPX7 supports using positional string interpolation. Here, rr}r(hX7 supports using positional string interpolation. Here, hjuubh)r}r(hX``%s``h.}r(h2]h3]h1]h0]h4]uhjuh?]rhPX%srr}r(hUhjubah,hubhPX{ is used as a placeholder, and the substitutions (which may themselves be placeholders), are given as subsequent arguments:rr}r(hX{ is used as a placeholder, and the substitutions (which may themselves be placeholders), are given as subsequent arguments:hjuubeubju)r}r(hXTODOhj;h"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7Mh8hh?]rhPXTODOrr}r(hUhjubaubjW)r}r(hXLike Python, you can use either positional interpolation *or* dictionary-style interpolation, not both. Thus you cannot use a string like ``Interpolate("foo-%(src::revision)s-%s", "branch")``.hj;h"h%h,jdh.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]rhT)r}r(hXLike Python, you can use either positional interpolation *or* dictionary-style interpolation, not both. Thus you cannot use a string like ``Interpolate("foo-%(src::revision)s-%s", "branch")``.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7M h?]r(hPX9Like Python, you can use either positional interpolation rr}r(hX9Like Python, you can use either positional interpolation hjubhi)r}r(hX*or*h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXorrr}r(hUhjubah,htubhPXN dictionary-style interpolation, not both. Thus you cannot use a string like rr}r(hXN dictionary-style interpolation, not both. Thus you cannot use a string like hjubh)r}r(hX5``Interpolate("foo-%(src::revision)s-%s", "branch")``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX1Interpolate("foo-%(src::revision)s-%s", "branch")rr}r(hUhjubah,hubhPX.r}r(hX.hjubeubaubj)r}r(hUhj;h"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; RendererUindex-11rUtrajuh7M h8hh?]ubh))r}r(hUhj;h"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7Mh8hh?]ubh))r}r(hX .. _Renderer:hj;h"h%h'}h,h-h.}r(h0]h1]h2]h3]h4]h5Urendererruh7Mh8hh9}rjjsh?]ubeubh)r}r(hUh!KhjLh"h%h'}rhjsh,h@h.}r(h2]rXrendererrah3]h1]h0]r(jjUid6reh4]rhauh7Mh8hh9}r(jjjjuh?]r(hI)r}r(hXRendererrhjh"h%h,hMh.}r(h2]h3]h1]h0]h4]uh7Mh8hh?]rhPXRendererrr}r(hjhjubaubhT)r}r(hXWhile Interpolate can handle many simple cases, and even some common conditionals, more complex cases are best handled with Python code. The ``renderer`` decorator creates a renderable object that will be replaced with the result of the function, called when the step it's passed to begins. The function receives an :class:`~buildbot.interfaces.IProperties` object, which it can use to examine the values of any and all properties. For example::hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7Mh8hh?]r(hPXWhile Interpolate can handle many simple cases, and even some common conditionals, more complex cases are best handled with Python code. The rr}r(hXWhile Interpolate can handle many simple cases, and even some common conditionals, more complex cases are best handled with Python code. The hjubh)r}r(hX ``renderer``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPXrendererrr}r(hUhjubah,hubhPX decorator creates a renderable object that will be replaced with the result of the function, called when the step it's passed to begins. The function receives an rr}r(hX decorator creates a renderable object that will be replaced with the result of the function, called when the step it's passed to begins. The function receives an hjubh])r}r(hX):class:`~buildbot.interfaces.IProperties`rhjh"h%h,hah.}r(UreftypeXclasshchdXbuildbot.interfaces.IPropertiesU refdomainXpyrh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7Mh?]rh)r}r(hjh.}r(h2]h3]r(hnjXpy-classreh1]h0]h4]uhjh?]rhPX IPropertiesrr}r(hUhjubah,hubaubhPXX object, which it can use to examine the values of any and all properties. For example:rr}r(hXX object, which it can use to examine the values of any and all properties. For example:hjubeubju)r}r(hXLfrom buildbot.process import properties @properties.renderer def makeCommand(props): command = [ 'make' ] cpus = props.getProperty('CPUs') if cpus: command += [ '-j', str(cpus+1) ] else: command += [ '-j', '2' ] command += [ 'all' ] return command f.addStep(ShellCommand(command=makeCommand))hjh"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7Mh8hh?]rhPXLfrom buildbot.process import properties @properties.renderer def makeCommand(props): command = [ 'make' ] cpus = props.getProperty('CPUs') if cpus: command += [ '-j', str(cpus+1) ] else: command += [ '-j', '2' ] command += [ 'all' ] return command f.addStep(ShellCommand(command=makeCommand))rr}r(hUhjubaubhT)r}r(hXRYou can think of ``renderer`` as saying "call this function when the step starts".rhjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7M%h8hh?]r(hPXYou can think of rr}r(hXYou can think of hjubh)r}r (hX ``renderer``h.}r (h2]h3]h1]h0]h4]uhjh?]r hPXrendererr r }r(hUhjubah,hubhPX5 as saying "call this function when the step starts".rr}r(hX5 as saying "call this function when the step starts".hjubeubj)r}r(hUhjh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXProperties; WithPropertiesUindex-12rUtrajuh7M'h8hh?]ubh))r}r(hUhjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7M(h8hh?]ubh))r}r(hX.. _WithProperties:hjh"h%h'}h,h-h.}r(h0]h1]h2]h3]h4]h5Uwithpropertiesruh7M)h8hh9}rjjsh?]ubeubh)r }r!(hUhjLh"h%h'}r"hjsh,h@h.}r#(h2]h3]h1]h0]r$(U flattenlistr%jjeh4]r&(h heuh7M,h8hh9}r'(jjjjuh?]r((hI)r)}r*(hX FlattenListr+hj h"h%h,hMh.}r,(h2]h3]h1]h0]h4]uh7M,h8hh?]r-hPX FlattenListr.r/}r0(hj+hj)ubaubhT)r1}r2(hX_If nested list should be flatten for some renderables, FlattenList could be used. For example::hj h"h%h,hWh.}r3(h2]h3]h1]h0]h4]uh7M.h8hh?]r4hPX^If nested list should be flatten for some renderables, FlattenList could be used. For example:r5r6}r7(hX^If nested list should be flatten for some renderables, FlattenList could be used. For example:hj1ubaubju)r8}r9(hX`f.addStep(ShellCommand(command=[ 'make' ], descriptionDone=FlattenList([ 'make ', [ 'done' ]])))hj h"h%h,jxh.}r:(jzj{h0]h1]h2]h3]h4]uh7M1h8hh?]r;hPX`f.addStep(ShellCommand(command=[ 'make' ], descriptionDone=FlattenList([ 'make ', [ 'done' ]])))r<r=}r>(hUhj8ubaubhT)r?}r@(hX``descriptionDone`` would be set to ``[ 'make', 'done' ]`` when the ``ShellCommand`` executes. This is useful when a list-returning property is used in renderables.hj h"h%h,hWh.}rA(h2]h3]h1]h0]h4]uh7M3h8hh?]rB(h)rC}rD(hX``descriptionDone``h.}rE(h2]h3]h1]h0]h4]uhj?h?]rFhPXdescriptionDonerGrH}rI(hUhjCubah,hubhPX would be set to rJrK}rL(hX would be set to hj?ubh)rM}rN(hX``[ 'make', 'done' ]``h.}rO(h2]h3]h1]h0]h4]uhj?h?]rPhPX[ 'make', 'done' ]rQrR}rS(hUhjMubah,hubhPX when the rTrU}rV(hX when the hj?ubh)rW}rX(hX``ShellCommand``h.}rY(h2]h3]h1]h0]h4]uhj?h?]rZhPX ShellCommandr[r\}r](hUhjWubah,hubhPXP executes. This is useful when a list-returning property is used in renderables.r^r_}r`(hXP executes. This is useful when a list-returning property is used in renderables.hj?ubeubjW)ra}rb(hXShellCommand automatically flattens nested lists in its ``command`` argument, so there is no need to use ``FlattenList`` for it.rchj h"h%h,jdh.}rd(h2]h3]h1]h0]h4]uh7Nh8hh?]rehT)rf}rg(hjchjah"h%h,hWh.}rh(h2]h3]h1]h0]h4]uh7M6h?]ri(hPX8ShellCommand automatically flattens nested lists in its rjrk}rl(hX8ShellCommand automatically flattens nested lists in its hjfubh)rm}rn(hX ``command``h.}ro(h2]h3]h1]h0]h4]uhjfh?]rphPXcommandrqrr}rs(hUhjmubah,hubhPX& argument, so there is no need to use rtru}rv(hX& argument, so there is no need to use hjfubh)rw}rx(hX``FlattenList``h.}ry(h2]h3]h1]h0]h4]uhjfh?]rzhPX FlattenListr{r|}r}(hUhjwubah,hubhPX for it.r~r}r(hX for it.hjfubeubaubeubh)r}r(hUh!KhjLh"h%h,h@h.}r(h2]rXwithpropertiesrah3]h1]h0]rUid7rah4]uh7M9h8hh?]r(hI)r}r(hXWithPropertiesrhjh"h%h,hMh.}r(h2]h3]h1]h0]h4]uh7M9h8hh?]rhPXWithPropertiesrr}r(hjhjubaubcdocutils.nodes warning r)r}r(hX}This placeholder is deprecated. It is an older version of :ref:`Interpolate`. It exists for compatibility with older configs.hjh"h%h,Uwarningrh.}r(h2]h3]h1]h0]h4]uh7Nh8hh?]rhT)r}r(hX}This placeholder is deprecated. It is an older version of :ref:`Interpolate`. It exists for compatibility with older configs.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7M=h?]r(hPX:This placeholder is deprecated. It is an older version of rr}r(hX:This placeholder is deprecated. It is an older version of hjubh])r}r(hX:ref:`Interpolate`rhjh"h%h,hah.}r(UreftypeXrefhchdX interpolateU refdomainXstdrh0]h1]U refexplicith2]h3]h4]hfhguh7M=h?]rhi)r}r(hjh.}r(h2]h3]r(hnjXstd-refreh1]h0]h4]uhjh?]rhPX Interpolaterr}r(hUhjubah,htubaubhPX1. It exists for compatibility with older configs.rr}r(hX1. It exists for compatibility with older configs.hjubeubaubhT)r}r(hXThe simplest use of this class is with positional string interpolation. Here, ``%s`` is used as a placeholder, and property names are given as subsequent arguments::hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7M@h8hh?]r(hPXOThe simplest use of this class is with positional string interpolation. Here, rr}r(hXOThe simplest use of this class is with positional string interpolation. Here, hjubh)r}r(hX``%s``h.}r(h2]h3]h1]h0]h4]uhjh?]rhPX%srr}r(hUhjubah,hubhPXP is used as a placeholder, and property names are given as subsequent arguments:rr}r(hXP is used as a placeholder, and property names are given as subsequent arguments:hjubeubju)r}r(hX from buildbot.steps.shell import ShellCommand from buildbot.process.properties import WithProperties f.addStep(ShellCommand( command=["tar", "czf", WithProperties("build-%s-%s.tar.gz", "branch", "revision"), "source"]))hjh"h%h,jxh.}r(jzj{h0]h1]h2]h3]h4]uh7MDh8hh?]rhPX from buildbot.steps.shell import ShellCommand from buildbot.process.properties import WithProperties f.addStep(ShellCommand( command=["tar", "czf", WithProperties("build-%s-%s.tar.gz", "branch", "revision"), "source"]))rr}r(hUhjubaubhT)r}r(hXIf this :class:`BuildStep` were used in a tree obtained from Git, it would create a tarball with a name like :file:`build-master-a7d3a333db708e786edb34b6af646edd8d4d3ad9.tar.gz`.hjh"h%h,hWh.}r(h2]h3]h1]h0]h4]uh7MKh8hh?]r(hPXIf this rr}r(hXIf this hjubh])r}r(hX:class:`BuildStep`rhjh"h%h,hah.}r(UreftypeXclasshchdX BuildStepU refdomainXpyrh0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7MKh?]rh)r}r(hjh.}r(h2]h3]r(hnjXpy-classreh1]h0]h4]uhjh?]rhPX BuildSteprr}r(hUhjubah,hubaubhPXS were used in a tree obtained from Git, it would create a tarball with a name like rr}r(hXS were used in a tree obtained from Git, it would create a tarball with a name like hjubh)r}r(hUh.}r(h0]h1]h2]h3]rXfileraUrolejh4]uhjh?]rhPX<build-master-a7d3a333db708e786edb34b6af646edd8d4d3ad9.tar.gzrr}r(hX<build-master-a7d3a333db708e786edb34b6af646edd8d4d3ad9.tar.gzhjubah,hubhPX.r}r(hX.hjubeubj)r}r(hUhjh"h%h,jh.}r(h0]h1]h2]h3]h4]j]r(jXunsupported format characterUindex-13rUtrajuh7MOh8hh?]ubh))r}r(hUhjh"h%h,h-h.}r(h0]h1]h2]h3]h4]h5juh7MPh8hh?]ubhT)r}r(hXEThe more common pattern is to use Python dictionary-style string interpolation by using the ``%(propname)s`` syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character"). ::hjh"h%h'}h,hWh.}r(h2]h3]h1]h0]rjah4]uh7MQh8hh9}rjjsh?]r(hPX\The more common pattern is to use Python dictionary-style string interpolation by using the rr}r(hX\The more common pattern is to use Python dictionary-style string interpolation by using the hjubh)r}r(hX``%(propname)s``h.}r (h2]h3]h1]h0]h4]uhjh?]r hPX %(propname)sr r }r (hUhjubah,hubhPX syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character").r r }r (hX syntax. In this form, the property name goes in the parentheses, as above. A common mistake is to omit the trailing "s", leading to a rather obscure error from Python ("ValueError: unsupported format character").hjubeubju)r }r (hXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import WithProperties f.addStep(ShellCommand(command=[ 'make', WithProperties('REVISION=%(got_revision)s'), 'dist' ]))hjh"h%h,jxh.}r (jzj{h0]h1]h2]h3]h4]uh7MWh8hh?]r hPXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import WithProperties f.addStep(ShellCommand(command=[ 'make', WithProperties('REVISION=%(got_revision)s'), 'dist' ]))r r }r (hUhj ubaubhT)r }r (hXXThis example will result in a ``make`` command with an argument like ``REVISION=12098``.hjh"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7M\h8hh?]r (hPXThis example will result in a r r }r (hXThis example will result in a hj ubh)r }r (hX``make``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXmaker r }r (hUhj ubah,hubhPX command with an argument like r r }r (hX command with an argument like hj ubh)r }r! (hX``REVISION=12098``h.}r" (h2]h3]h1]h0]h4]uhj h?]r# hPXREVISION=12098r$ r% }r& (hUhj ubah,hubhPX.r' }r( (hX.hj ubeubh))r) }r* (hX.. _WithProperties-DictStyle:hjh"h%h,h-h.}r+ (h0]h1]h2]h3]h4]h5Uwithproperties-dictstyler, uh7M_h8hh?]ubhT)r- }r. (hXbThe dictionary-style interpolation supports a number of more advanced syntaxes in the parentheses.r/ hjh"h%h'}r0 h j) sh,hWh.}r1 (h2]h3]h1]h0]r2 j, ah4]r3 h auh7Mah8hh9}r4 j, j) sh?]r5 hPXbThe dictionary-style interpolation supports a number of more advanced syntaxes in the parentheses.r6 r7 }r8 (hj/ hj- ubaubj)r9 }r: (hUhjh"h%h,j h.}r; (h2]h3]h1]h0]h4]uh7Nh8hh?]r< (j)r= }r> (hX``propname:-replacement`` If ``propname`` exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(propname:-)s``) hj9 h"h%h,jh.}r? (h2]h3]h1]h0]h4]uh7Mgh?]r@ (j)rA }rB (hX``propname:-replacement``rC hj= h"h%h,jh.}rD (h2]h3]h1]h0]h4]uh7Mgh?]rE h)rF }rG (hjC h.}rH (h2]h3]h1]h0]h4]uhjA h?]rI hPXpropname:-replacementrJ rK }rL (hUhjF ubah,hubaubj#)rM }rN (hUh.}rO (h2]h3]h1]h0]h4]uhj= h?]rP hT)rQ }rR (hXIf ``propname`` exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(propname:-)s``)hjM h"h%h,hWh.}rS (h2]h3]h1]h0]h4]uh7Meh?]rT (hPXIf rU rV }rW (hXIf hjQ ubh)rX }rY (hX ``propname``h.}rZ (h2]h3]h1]h0]h4]uhjQ h?]r[ hPXpropnamer\ r] }r^ (hUhjX ubah,hubhPX5 exists, substitute its value; otherwise, substitute r_ r` }ra (hX5 exists, substitute its value; otherwise, substitute hjQ ubh)rb }rc (hX``replacement``h.}rd (h2]h3]h1]h0]h4]uhjQ h?]re hPX replacementrf rg }rh (hUhjb ubah,hubhPX. ri rj }rk (hX. hjQ ubh)rl }rm (hX``replacement``h.}rn (h2]h3]h1]h0]h4]uhjQ h?]ro hPX replacementrp rq }rr (hUhjl ubah,hubhPX may be empty (rs rt }ru (hX may be empty (hjQ ubh)rv }rw (hX``%(propname:-)s``h.}rx (h2]h3]h1]h0]h4]uhjQ h?]ry hPX%(propname:-)srz r{ }r| (hUhjv ubah,hubhPX)r} }r~ (hX)hjQ ubeubah,jvubeubj)r }r (hX"``propname:~replacement`` Like ``propname:-replacement``, but only substitutes the value of property ``propname`` if it is something Python regards as ``True``. Python considers ``None``, 0, empty lists, and the empty string to be false, so such values will be replaced by ``replacement``. hj9 h"h%h,jh.}r (h2]h3]h1]h0]h4]uh7Mmh8hh?]r (j)r }r (hX``propname:~replacement``r hj h"h%h,jh.}r (h2]h3]h1]h0]h4]uh7Mmh?]r h)r }r (hj h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXpropname:~replacementr r }r (hUhj ubah,hubaubj#)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hT)r }r (hXLike ``propname:-replacement``, but only substitutes the value of property ``propname`` if it is something Python regards as ``True``. Python considers ``None``, 0, empty lists, and the empty string to be false, so such values will be replaced by ``replacement``.hj h"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7Mjh?]r (hPXLike r r }r (hXLike hj ubh)r }r (hX``propname:-replacement``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXpropname:-replacementr r }r (hUhj ubah,hubhPX-, but only substitutes the value of property r r }r (hX-, but only substitutes the value of property hj ubh)r }r (hX ``propname``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXpropnamer r }r (hUhj ubah,hubhPX& if it is something Python regards as r r }r (hX& if it is something Python regards as hj ubh)r }r (hX``True``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXTruer r }r (hUhj ubah,hubhPX. Python considers r r }r (hX. Python considers hj ubh)r }r (hX``None``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXNoner r }r (hUhj ubah,hubhPXW, 0, empty lists, and the empty string to be false, so such values will be replaced by r r }r (hXW, 0, empty lists, and the empty string to be false, so such values will be replaced by hj ubh)r }r (hX``replacement``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPX replacementr r }r (hUhj ubah,hubhPX.r }r (hX.hj ubeubah,jvubeubj)r }r (hXu``propname:+replacement`` If ``propname`` exists, substitute ``replacement``; otherwise, substitute an empty string. hj9 h"h%h,jh.}r (h2]h3]h1]h0]h4]uh7Mqh8hh?]r (j)r }r (hX``propname:+replacement``r hj h"h%h,jh.}r (h2]h3]h1]h0]h4]uh7Mqh?]r h)r }r (hj h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXpropname:+replacementr r }r (hUhj ubah,hubaubj#)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hT)r }r (hXZIf ``propname`` exists, substitute ``replacement``; otherwise, substitute an empty string.hj h"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7Mph?]r (hPXIf r r }r (hXIf hj ubh)r }r (hX ``propname``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXpropnamer r }r (hUhj ubah,hubhPX exists, substitute r r }r (hX exists, substitute hj ubh)r }r (hX``replacement``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPX replacementr r }r (hUhj ubah,hubhPX(; otherwise, substitute an empty string.r r }r (hX(; otherwise, substitute an empty string.hj ubeubah,jvubeubeubhT)r }r (hXAlthough these are similar to shell substitutions, no other substitutions are currently supported, and ``replacement`` in the above cannot contain more substitutions.hjh"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7Msh8hh?]r (hPXgAlthough these are similar to shell substitutions, no other substitutions are currently supported, and r r }r (hXgAlthough these are similar to shell substitutions, no other substitutions are currently supported, and hj ubh)r }r (hX``replacement``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPX replacementr r }r (hUhj ubah,hubhPX0 in the above cannot contain more substitutions.r r }r (hX0 in the above cannot contain more substitutions.hj ubeubhT)r }r (hXNote: like Python, you can use either positional interpolation *or* dictionary-style interpolation, not both. Thus you cannot use a string like ``WithProperties("foo-%(revision)s-%s", "branch")``.hjh"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7Mwh8hh?]r (hPX?Note: like Python, you can use either positional interpolation r r }r (hX?Note: like Python, you can use either positional interpolation hj ubhi)r }r (hX*or*h.}r (h2]h3]h1]h0]h4]uhj h?]r hPXorr r }r (hUhj ubah,htubhPXM dictionary-style interpolation, not both. Thus you cannot use a string like r r }r (hXM dictionary-style interpolation, not both. Thus you cannot use a string like hj ubh)r }r (hX3``WithProperties("foo-%(revision)s-%s", "branch")``h.}r (h2]h3]h1]h0]h4]uhj h?]r hPX/WithProperties("foo-%(revision)s-%s", "branch")r r! }r" (hUhj ubah,hubhPX.r# }r$ (hX.hj ubeubeubh)r% }r& (hUhjLh"h%h,h@h.}r' (h2]h3]h1]h0]r( Ucustom-renderablesr) ah4]r* h auh7M|h8hh?]r+ (hI)r, }r- (hXCustom Renderablesr. hj% h"h%h,hMh.}r/ (h2]h3]h1]h0]h4]uh7M|h8hh?]r0 hPXCustom Renderablesr1 r2 }r3 (hj. hj, ubaubhT)r4 }r5 (hX|If the options described above are not sufficient, more complex substitutions can be achieved by writing custom renderables.r6 hj% h"h%h,hWh.}r7 (h2]h3]h1]h0]h4]uh7M~h8hh?]r8 hPX|If the options described above are not sufficient, more complex substitutions can be achieved by writing custom renderables.r9 r: }r; (hj6 hj4 ubaubhT)r< }r= (hXRenderables are objects providing the :class:`~buildbot.interfaces.IRenderable` interface. That interface is simple - objects must provide a `getRenderingFor` method. The method should take one argument - an :class:`~buildbot.interfaces.IProperties` provider - and should return a string or a deferred firing with a string. Pass instances of the class anywhere other renderables are accepted. For example::hj% h"h%h,hWh.}r> (h2]h3]h1]h0]h4]uh7Mh8hh?]r? (hPX&Renderables are objects providing the r@ rA }rB (hX&Renderables are objects providing the hj< ubh])rC }rD (hX):class:`~buildbot.interfaces.IRenderable`rE hj< h"h%h,hah.}rF (UreftypeXclasshchdXbuildbot.interfaces.IRenderableU refdomainXpyrG h0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7Mh?]rH h)rI }rJ (hjE h.}rK (h2]h3]rL (hnjG Xpy-classrM eh1]h0]h4]uhjC h?]rN hPX IRenderablerO rP }rQ (hUhjI ubah,hubaubhPX> interface. That interface is simple - objects must provide a rR rS }rT (hX> interface. That interface is simple - objects must provide a hj< ubj)rU }rV (hX`getRenderingFor`h.}rW (h2]h3]h1]h0]h4]uhj< h?]rX hPXgetRenderingForrY rZ }r[ (hUhjU ubah,jubhPX2 method. The method should take one argument - an r\ r] }r^ (hX2 method. The method should take one argument - an hj< ubh])r_ }r` (hX):class:`~buildbot.interfaces.IProperties`ra hj< h"h%h,hah.}rb (UreftypeXclasshchdXbuildbot.interfaces.IPropertiesU refdomainXpyrc h0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7Mh?]rd h)re }rf (hja h.}rg (h2]h3]rh (hnjc Xpy-classri eh1]h0]h4]uhj_ h?]rj hPX IPropertiesrk rl }rm (hUhje ubah,hubaubhPX provider - and should return a string or a deferred firing with a string. Pass instances of the class anywhere other renderables are accepted. For example:rn ro }rp (hX provider - and should return a string or a deferred firing with a string. Pass instances of the class anywhere other renderables are accepted. For example:hj< ubeubju)rq }rr (hX-class DetermineFoo(object): implements(IRenderable) def getRenderingFor(self, props): if props.hasProperty('bar'): return props['bar'] elif props.hasProperty('baz'): return props['baz'] return 'qux' ShellCommand(command=['echo', DetermineFoo()])hj% h"h%h,jxh.}rs (jzj{h0]h1]h2]h3]h4]uh7Mh8hh?]rt hPX-class DetermineFoo(object): implements(IRenderable) def getRenderingFor(self, props): if props.hasProperty('bar'): return props['bar'] elif props.hasProperty('baz'): return props['baz'] return 'qux' ShellCommand(command=['echo', DetermineFoo()])ru rv }rw (hUhjq ubaubhT)rx }ry (hXor, more practically, ::rz hj% h"h%h,hWh.}r{ (h2]h3]h1]h0]h4]uh7Mh8hh?]r| hPXor, more practically,r} r~ }r (hXor, more practically,hjx ubaubju)r }r (hXclass Now(object): implements(IRenderable) def getRenderingFor(self, props): return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)s', now=Now())])hj% h"h%h,jxh.}r (jzj{h0]h1]h2]h3]h4]uh7Mh8hh?]r hPXclass Now(object): implements(IRenderable) def getRenderingFor(self, props): return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)s', now=Now())])r r }r (hUhj ubaubhT)r }r (hXThis is equivalent to::r hj% h"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7Mh8hh?]r hPXThis is equivalent to:r r }r (hXThis is equivalent to:hj ubaubju)r }r (hXy@renderer def now(props): return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)s', now=now)])hj% h"h%h,jxh.}r (jzj{h0]h1]h2]h3]h4]uh7Mh8hh?]r hPXy@renderer def now(props): return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)s', now=now)])r r }r (hUhj ubaubhT)r }r (hXNote that a custom renderable must be instantiated (and its constructor can take whatever arguments you'd like), whereas a function decorated with :func:`renderer` can be used directly.r hj% h"h%h,hWh.}r (h2]h3]h1]h0]h4]uh7Mh8hh?]r (hPXNote that a custom renderable must be instantiated (and its constructor can take whatever arguments you'd like), whereas a function decorated with r r }r (hXNote that a custom renderable must be instantiated (and its constructor can take whatever arguments you'd like), whereas a function decorated with hj ubh])r }r (hX:func:`renderer`r hj h"h%h,hah.}r (UreftypeXfunchchdXrendererU refdomainXpyr h0]h1]U refexplicith2]h3]h4]hfhgj4Nj5Nuh7Mh?]r h)r }r (hj h.}r (h2]h3]r (hnj Xpy-funcr eh1]h0]h4]uhj h?]r hPXrendererr r }r (hUhj ubah,hubaubhPX can be used directly.r r }r (hX can be used directly.hj ubeubeubeubeubh"h%h,Usystem_messager h.}r (h2]UlevelKh0]h1]r hEaUsourceh%h3]h4]UlineKUtypeUINFOr uh7Kh8hh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhhh?]r hPX-Duplicate implicit target name: "properties".r r }r (hUhj ubah,hWubaubh)r }r (hUhjh"h%h,j h.}r (h2]UlevelKh0]h1]r jaUsourceh%h3]h4]UlineKUtypej uh7Kh8hh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX+Duplicate implicit target name: "property".r r }r (hUhj ubah,hWubaubh)r }r (hUhj;h"h%h,j h.}r (h2]UlevelKh0]h1]r jBaUsourceh%h3]h4]UlineKUtypej uh7Kh8hh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Duplicate implicit target name: "interpolate".r r }r (hUhj ubah,hWubaubh)r }r (hUhjh"h%h,j h.}r (h2]UlevelKh0]h1]r jaUsourceh%h3]h4]UlineMUtypej uh7Mh8hh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX+Duplicate implicit target name: "renderer".r r }r (hUhj ubah,hWubaubh)r }r (hUhjh"h%h,j h.}r (h2]UlevelKh0]h1]r jaUsourceh%h3]h4]UlineM9Utypej uh7M9h8hh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX1Duplicate implicit target name: "withproperties".r r }r (hUhj ubah,hWubaubeUcurrent_sourcer NU decorationr NUautofootnote_startr KUnameidsr }r (hjhjhhh hh j%h j9h j, h j) hjhjhjhhhjhh6hhuh?]r (j)r }r (hUhhh"h%h,jh.}r (h0]h1]h2]h3]h4]j]r (jX Propertiesh;Utr ajuh7Kh8hh?]ubh }r? (hUh.}r@ (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKEUtypej uh?]rA hT)rB }rC (hUh.}rD (h2]h3]h1]h0]h4]uhj> h?]rE hPX-Hyperlink target "index-3" is not referenced.rF rG }rH (hUhjB ubah,hWubah,j ubh)rI }rJ (hUh.}rK (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKLUtypej uh?]rL hT)rM }rN (hUh.}rO (h2]h3]h1]h0]h4]uhjI h?]rP hPX-Hyperlink target "index-4" is not referenced.rQ rR }rS (hUhjM ubah,hWubah,j ubh)rT }rU (hUh.}rV (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKSUtypej uh?]rW hT)rX }rY (hUh.}rZ (h2]h3]h1]h0]h4]uhjT h?]r[ hPX-Hyperlink target "index-5" is not referenced.r\ r] }r^ (hUhjX ubah,hWubah,j ubh)r_ }r` (hUh.}ra (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKYUtypej uh?]rb hT)rc }rd (hUh.}re (h2]h3]h1]h0]h4]uhj_ h?]rf hPX-Hyperlink target "index-6" is not referenced.rg rh }ri (hUhjc ubah,hWubah,j ubh)rj }rk (hUh.}rl (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKdUtypej uh?]rm hT)rn }ro (hUh.}rp (h2]h3]h1]h0]h4]uhjj h?]rq hPX-Hyperlink target "index-7" is not referenced.rr rs }rt (hUhjn ubah,hWubah,j ubh)ru }rv (hUh.}rw (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKgUtypej uh?]rx hT)ry }rz (hUh.}r{ (h2]h3]h1]h0]h4]uhju h?]r| hPX=Hyperlink target "source-stamp-attributes" is not referenced.r} r~ }r (hUhjy ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKmUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX-Hyperlink target "index-8" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX-Hyperlink target "index-9" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Hyperlink target "property" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Hyperlink target "index-10" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX1Hyperlink target "interpolate" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineKUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX;Hyperlink target "interpolate-dictstyle" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineMUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Hyperlink target "index-11" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineMUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Hyperlink target "renderer" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineM(Utypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Hyperlink target "index-12" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineM)Utypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX4Hyperlink target "withproperties" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineMPUtypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX.Hyperlink target "index-13" is not referenced.r r }r (hUhj ubah,hWubah,j ubh)r }r (hUh.}r (h2]UlevelKh0]h1]Usourceh%h3]h4]UlineM_Utypej uh?]r hT)r }r (hUh.}r (h2]h3]h1]h0]h4]uhj h?]r hPX>Hyperlink target "withproperties-dictstyle" is not referenced.r r }r (hUhj ubah,hWubah,j ubeUreporterr NUid_startr K U autofootnotesr ]r U citation_refsr }r Uindirect_targetsr ]r Usettingsr (cdocutils.frontend Values r or }r (Ufootnote_backlinksr KUrecord_dependenciesr NU rfc_base_urlr Uhttp://tools.ietf.org/html/r U tracebackr Upep_referencesr NUstrip_commentsr NU toc_backlinksr Uentryr U language_coder Uenr U datestampr NU report_levelr KU _destinationr NU halt_levelr KU strip_classesr NhMNUerror_encoding_error_handlerr Ubackslashreplacer! Udebugr" NUembed_stylesheetr# Uoutput_encoding_error_handlerr$ Ustrictr% U sectnum_xformr& KUdump_transformsr' NU docinfo_xformr( KUwarning_streamr) NUpep_file_url_templater* Upep-%04dr+ Uexit_status_levelr, KUconfigr- NUstrict_visitorr. NUcloak_email_addressesr/ Utrim_footnote_reference_spacer0 Uenvr1 NUdump_pseudo_xmlr2 NUexpose_internalsr3 NUsectsubtitle_xformr4 U source_linkr5 NUrfc_referencesr6 NUoutput_encodingr7 Uutf-8r8 U source_urlr9 NUinput_encodingr: U utf-8-sigr; U_disable_configr< NU id_prefixr= UU tab_widthr> KUerror_encodingr? UUTF-8r@ U_sourcerA UV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-properties.rstrB Ugettext_compactrC U generatorrD NUdump_internalsrE NU smart_quotesrF U pep_base_urlrG Uhttp://www.python.org/dev/peps/rH Usyntax_highlightrI UlongrJ Uinput_encoding_error_handlerrK j% Uauto_id_prefixrL UidrM Udoctitle_xformrN Ustrip_elements_with_classesrO NU _config_filesrP ]Ufile_insertion_enabledrQ U raw_enabledrR KU dump_settingsrS NubUsymbol_footnote_startrT KUidsrU }rV (hjjj j) j% jjjjjjhhyhjLhhhhjjhjjjjBj;jjjjj1j;hEhjjjj j0j5jwj|h;hjjjjj{jjjjjjj j9j;j, j- h6hhhjjj%j jjjjuUsubstitution_namesrW }rX h,h8h.}rY (h2]h0]h1]Usourceh%h3]h4]uU footnotesrZ ]r[ Urefidsr\ }r] (h]r^ jaj, ]r_ j) aj]r` jah]ra jaj]rb jaj]rc jaj1]rd j3aj]re jaj]rf jaj]rg jaj0]rh j2ajw]ri jyah;]rj hX Optimizationq?q@}qA(hh:hh8ubaubcdocutils.nodes paragraph qB)qC}qD(hX}If you're feeling your Buildbot is running a bit slow, here are some tricks that may help you, but use them at your own risk.qEhhhhhU paragraphqFh!}qG(h%]h&]h$]h#]h']uh*Kh+hh,]qHh>X}If you're feeling your Buildbot is running a bit slow, here are some tricks that may help you, but use them at your own risk.qIqJ}qK(hhEhhCubaubh)qL}qM(hUhhhhhh-h!}qN(h%]h&]h$]h#]qOUproperties-load-speedupqPah']qQhauh*K h+hh,]qR(h7)qS}qT(hXProperties load speedupqUhhLhhhh;h!}qV(h%]h&]h$]h#]h']uh*K h+hh,]qWh>XProperties load speedupqXqY}qZ(hhUhhSubaubhB)q[}q\(hXFor example, if most of your build properties are strings, you can gain an approx. 30% speedup if you put this snippet of code inside your master.cfg file::hhLhhhhFh!}q](h%]h&]h$]h#]h']uh*K h+hh,]q^h>XFor example, if most of your build properties are strings, you can gain an approx. 30% speedup if you put this snippet of code inside your master.cfg file:q_q`}qa(hXFor example, if most of your build properties are strings, you can gain an approx. 30% speedup if you put this snippet of code inside your master.cfg file:hh[ubaubcdocutils.nodes literal_block qb)qc}qd(hXdef speedup_json_loads(): import json, re original_decode = json._default_decoder.decode my_regexp = re.compile(r'^\[\"([^"]*)\",\s+\"([^"]*)\"\]$') def decode_with_re(str, *args, **kw): m = my_regexp.match(str) try: return list(m.groups()) except: return original_decode(str, *args, **kw) json._default_decoder.decode = decode_with_re speedup_json_loads()hhLhhhU literal_blockqeh!}qf(U xml:spaceqgUpreserveqhh#]h$]h%]h&]h']uh*Kh+hh,]qih>Xdef speedup_json_loads(): import json, re original_decode = json._default_decoder.decode my_regexp = re.compile(r'^\[\"([^"]*)\",\s+\"([^"]*)\"\]$') def decode_with_re(str, *args, **kw): m = my_regexp.match(str) try: return list(m.groups()) except: return original_decode(str, *args, **kw) json._default_decoder.decode = decode_with_re speedup_json_loads()qjqk}ql(hUhhcubaubhB)qm}qn(hXIt patches json decoder so that it would first try to extract a value from JSON that is a list of two strings (which is the case for a property being a string), and would fallback to general JSON decoder on any errorqohhLhhhhFh!}qp(h%]h&]h$]h#]h']uh*Kh+hh,]qqh>XIt patches json decoder so that it would first try to extract a value from JSON that is a list of two strings (which is the case for a property being a string), and would fallback to general JSON decoder on any errorqrqs}qt(hhohhmubaubeubeubhhhUsystem_messagequh!}qv(h%]UlevelKh#]h$]qwh2aUsourcehh&]h']UlineKUtypeUINFOqxuh*Kh+hh,]qyhB)qz}q{(hUh!}q|(h%]h&]h$]h#]h']uhh h,]q}h>X/Duplicate implicit target name: "optimization".q~q}q(hUhhzubahhFubaubaUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hhPhh)uh,]q(hhehUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh+hU current_lineqNUtransform_messagesq]qh )q}q(hUh!}q(h%]UlevelKh#]h$]Usourcehh&]h']UlineKUtypehxuh,]qhB)q}q(hUh!}q(h%]h&]h$]h#]h']uhhh,]qh>X2Hyperlink target "optimization" is not referenced.qq}q(hUhhubahhFubahhuubaUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh;NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesq͈Utrim_footnote_reference_spaceqΉUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformq҉U source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/optimization.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}q(h)hhPhLh2huUsubstitution_namesq}qhh+h!}q(h%]h#]h$]Usourcehh&]h']uU footnotesq]qUrefidsq}qh)]qhasub.PK5D"wUigg7buildbot-v0.8.9/.doctrees/manual/cfg-buildsteps.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XepydocqX#transferring multiple files at onceqNX&windows server 2003 resource kit toolsqX visual c++q NX txrequestsq Xstep-cvsq Xsetting buildslave infoq NXrpmbuildq NX9buildbot.steps.source.buildbot.steps.master.LogRenderableqXremovedirectoryqNX?buildbot.steps.source.buildbot.steps.source.mercurial.MercurialqXtriggering-schedulersqXstep-bzrqX setslaveinfoqNXtriggering schedulersqNXrestructuredtextqX copydirectoryqNX subversionqXcvs (slave-side)qNX deblintianqNX http requestsqNX0buildbot.steps.source.buildbot.steps.source.RepoqXslave-filesystem-stepsqX3buildbot.steps.source.buildbot.steps.source.bzr.BzrqXpython buildstepsqNXsetpropertiesfromenvqNXsubunitshellcommandq NXrepoq!Xother parametersq"NX5buildbot.steps.source.buildbot.steps.source.repo.Repoq#X2buildbot.steps.source.buildbot.steps.python.Sphinxq$X buildbot tracq%X?buildbot.steps.source.buildbot.steps.slave.SetPropertiesFromEnvq&Xdarcsq'Xrobocopyq(X mercurialq)Xgerritq*NXusing shellcommandsq+NXperlmoduletestq,NXmiscellaneous buildstepsq-NX1buildbot.steps.source.buildbot.steps.source.p4.P4q.X>buildbot.steps.source.buildbot.steps.python_twisted.RemovePYCsq/X8buildbot.steps.source.buildbot.steps.master.SetSlaveInfoq0Xdebian build stepsq1NX<buildbot.steps.source.buildbot.steps.transfer.StringDownloadq2XDbuildbot.steps.source.buildbot.steps.transfer.JSONPropertiesDownloadq3X3buildbot.steps.source.buildbot.steps.mswin.Robocopyq4Xsource-checkoutq5Xbzr (slave-side)q6NXstep-subunitshellcommandq7Xbitkeeper (slave-side)q8NXsetting-propertiesq9Xstep-mercurialq:Xgit (slave-side)q;NX:buildbot.steps.source.buildbot.steps.transfer.FileDownloadqX>buildbot.steps.source.buildbot.steps.master.MasterShellCommandq?X step-sphinxq@X fileexistsqANXsource checkout (slave-side)qBNXmonotoneqCXmtr (mysql-test-run)qDNX=buildbot.steps.source.buildbot.steps.transfer.DirectoryUploadqEXstep-cvs-slave-sideqFX@buildbot.steps.source.buildbot.steps.transfer.JSONStringDownloadqGXsetting-buildslave-infoqHX7buildbot.steps.source.buildbot.steps.shell.ShellCommandqIX3buildbot.steps.source.buildbot.steps.source.cvs.CVSqJXp4 (slave-side)qKNXtrialqLNXpython-buildstepsqMXrequestsqNXmockbuildsrpm stepqONX buildepydocqPNXrepo (slave-side)qQNXsource checkoutqRNXhlintqSNX9buildbot.steps.source.buildbot.steps.source.gerrit.GerritqTX logrenderableqUNX step-gerritqVXtransferring filesqWNXgitqXX@buildbot.steps.source.buildbot.steps.subunit.SubunitShellCommandqYX configureqZNXstep-buildepydocq[Xsvn (slave-side)q\NXpylintq]NXperforceq^Xcommon parametersq_NXNbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromChangeSourceq`XLbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromPropertiesqaX3buildbot.steps.source.buildbot.steps.source.git.GitqbX step-pylintqcXp4qdNXdarcs (slave-side)qeNX9buildbot.steps.source.buildbot.steps.python_twisted.TrialqfXsetpropertyfromcommandqgNX7buildbot.steps.source.buildbot.steps.source.darcs.DarcsqhXcompileqiNX step-trialqjX debpbuilderqkNXsource-checkout-slave-sideqlXtransfering stringsqmNX step-darcsqnXtransfering directoriesqoNX makedirectoryqpNXrunning commands on the masterqqNXstep-svnqrX pycheckerqsXrpm-related stepsqtNX build stepsquNXtreesizeqvNXbuildstep-common-parametersqwXstep-setslaveinfoqxUcontentsqyNXsetting propertiesqzNX step-monotoneq{X4buildbot.steps.source.buildbot.steps.python.PyFlakesq|XAbuildbot.steps.source.buildbot.steps.shell.SetPropertyFromCommandq}X step-pyflakeq~XmaxqqNXcvsqXtestqNX removepycsqNXmonotone (slave-side)qNXstep-svn-slave-sideqX@buildbot.steps.source.buildbot.steps.transfer.MultipleFileUploadqX3buildbot.steps.source.buildbot.steps.source.svn.SVNqX8buildbot.steps.source.buildbot.steps.source.mtn.MonotoneqX7buildbot.steps.source.buildbot.steps.python.BuildEPYDocqX8buildbot.steps.source.buildbot.steps.transfer.FileUploadqX mock stepsqNX debcowbuilderqNX bitkeeperqX shellcommandqNXsvnqNX7buildbot.steps.source.buildbot.steps.master.SetPropertyqX4buildbot.steps.source.buildbot.steps.shell.ConfigureqXsphinxqXbzrqNXpyflakesqXmercurial (slave-side)qNXslave filesystem stepsqNXmockrebuild stepqNX setpropertyqNXstep-gitqX build-stepsquUsubstitution_defsq}qUparse_messagesq]q(cdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhh)q}q(hUhh)q}q(hUhhUsourceqcdocutils.nodes reprunicode qXV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-buildsteps.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q)q}q(hX.. _Build-Steps:hhhhUtagnameqUtargetqU attributesq}q(Uidsq]Ubackrefsq]Udupnamesq]Uclassesq]Unamesq]UrefidqU build-stepsquUlineqKUdocumentqhUchildrenq]ubshUsectionqh}q(h]h]h]h]q(hUid1qeh]q(huheuhKhhUexpect_referenced_by_idq}qhhsh]q(cdocutils.nodes title q)q}q(hX Build StepsqhhhhhUtitleqh}q(h]h]h]h]h]uhKhhh]qcdocutils.nodes Text qX Build StepsqӅq}q(hhhhubaubcdocutils.nodes paragraph q)q}q(hX:class:`BuildStep`\s are usually specified in the buildmaster's configuration file, in a list that goes into the :class:`BuildFactory`. The :class:`BuildStep` instances in this list are used as templates to construct new independent copies for each build (so that state can be kept on the :class:`BuildStep` in one build without affecting a later build). Each :class:`BuildFactory` can be created with a list of steps, or the factory can be created empty and then steps added to it using the :meth:`addStep` method::hhhhhU paragraphqh}q(h]h]h]h]h]uhKhhh]q(csphinx.addnodes pending_xref q)q}q(hX:class:`BuildStep`qhhhhhU pending_xrefqh}q(UreftypeXclassUrefwarnqU reftargetqX BuildStepU refdomainXpyqh]h]U refexplicith]h]h]UrefdocqXmanual/cfg-buildstepsqUpy:classqNU py:moduleqNuhKh]qcdocutils.nodes literal q)q}q(hhh}q(h]h]q(UxrefqhXpy-classqeh]h]h]uhhh]qhX BuildStepqq}q(hUhhubahUliteralqubaubhX^s are usually specified in the buildmaster's configuration file, in a list that goes into the qq}q(hX_\s are usually specified in the buildmaster's configuration file, in a list that goes into the hhubh)q}q(hX:class:`BuildFactory`qhhhhhhh}q(UreftypeXclasshhX BuildFactoryU refdomainXpyqh]h]U refexplicith]h]h]hhhNhNuhKh]qh)q}r(hhh}r(h]h]r(hhXpy-classreh]h]h]uhhh]rhX BuildFactoryrr}r(hUhhubahhubaubhX. The rr }r (hX. The hhubh)r }r (hX:class:`BuildStep`r hhhhhhh}r(UreftypeXclasshhX BuildStepU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKh]rh)r}r(hj h}r(h]h]r(hjXpy-classreh]h]h]uhj h]rhX BuildSteprr}r(hUhjubahhubaubhX instances in this list are used as templates to construct new independent copies for each build (so that state can be kept on the rr}r(hX instances in this list are used as templates to construct new independent copies for each build (so that state can be kept on the hhubh)r}r(hX:class:`BuildStep`rhhhhhhh}r (UreftypeXclasshhX BuildStepU refdomainXpyr!h]h]U refexplicith]h]h]hhhNhNuhKh]r"h)r#}r$(hjh}r%(h]h]r&(hj!Xpy-classr'eh]h]h]uhjh]r(hX BuildStepr)r*}r+(hUhj#ubahhubaubhX5 in one build without affecting a later build). Each r,r-}r.(hX5 in one build without affecting a later build). Each hhubh)r/}r0(hX:class:`BuildFactory`r1hhhhhhh}r2(UreftypeXclasshhX BuildFactoryU refdomainXpyr3h]h]U refexplicith]h]h]hhhNhNuhKh]r4h)r5}r6(hj1h}r7(h]h]r8(hj3Xpy-classr9eh]h]h]uhj/h]r:hX BuildFactoryr;r<}r=(hUhj5ubahhubaubhXo can be created with a list of steps, or the factory can be created empty and then steps added to it using the r>r?}r@(hXo can be created with a list of steps, or the factory can be created empty and then steps added to it using the hhubh)rA}rB(hX:meth:`addStep`rChhhhhhh}rD(UreftypeXmethhhXaddStepU refdomainXpyrEh]h]U refexplicith]h]h]hhhNhNuhKh]rFh)rG}rH(hjCh}rI(h]h]rJ(hjEXpy-methrKeh]h]h]uhjAh]rLhXaddSteprMrN}rO(hUhjGubahhubaubhX method:rPrQ}rR(hX method:hhubeubcdocutils.nodes literal_block rS)rT}rU(hXfrom buildbot.steps import source, shell from buildbot.process import factory f = factory.BuildFactory() f.addStep(source.SVN(svnurl="http://svn.example.org/Trunk/")) f.addStep(shell.ShellCommand(command=["make", "all"])) f.addStep(shell.ShellCommand(command=["make", "test"]))hhhhhU literal_blockrVh}rW(U xml:spacerXUpreserverYh]h]h]h]h]uhKhhh]rZhXfrom buildbot.steps import source, shell from buildbot.process import factory f = factory.BuildFactory() f.addStep(source.SVN(svnurl="http://svn.example.org/Trunk/")) f.addStep(shell.ShellCommand(command=["make", "all"])) f.addStep(shell.ShellCommand(command=["make", "test"]))r[r\}r](hUhjTubaubh)r^}r_(hX2The basic behavior for a :class:`BuildStep` is to:r`hhhhhhh}ra(h]h]h]h]h]uhKhhh]rb(hXThe basic behavior for a rcrd}re(hXThe basic behavior for a hj^ubh)rf}rg(hX:class:`BuildStep`rhhj^hhhhh}ri(UreftypeXclasshhX BuildStepU refdomainXpyrjh]h]U refexplicith]h]h]hhhNhNuhKh]rkh)rl}rm(hjhh}rn(h]h]ro(hjjXpy-classrpeh]h]h]uhjfh]rqhX BuildSteprrrs}rt(hUhjlubahhubaubhX is to:rurv}rw(hX is to:hj^ubeubcdocutils.nodes block_quote rx)ry}rz(hUhhhNhU block_quoter{h}r|(h]h]h]h]h]uhNhhh]r}cdocutils.nodes bullet_list r~)r}r(hUh}r(UbulletrX*h]h]h]h]h]uhjyh]r(cdocutils.nodes list_item r)r}r(hXrun for a while, then stoprh}r(h]h]h]h]h]uhjh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhKh]rhXrun for a while, then stoprr}r(hjhjubaubahU list_itemrubj)r}r(hX?possibly invoke some RemoteCommands on the attached build slaverh}r(h]h]h]h]h]uhjh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhKh]rhX?possibly invoke some RemoteCommands on the attached build slaverr}r(hjhjubaubahjubj)r}r(hX#possibly produce a set of log filesrh}r(h]h]h]h]h]uhjh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhKh]rhX#possibly produce a set of log filesrr}r(hjhjubaubahjubj)r}r(hXfinish with a status described by one of four values defined in :mod:`buildbot.status.builder`: ``SUCCESS``, ``WARNINGS``, ``FAILURE``, ``SKIPPED``h}r(h]h]h]h]h]uhjh]rh)r}r(hXfinish with a status described by one of four values defined in :mod:`buildbot.status.builder`: ``SUCCESS``, ``WARNINGS``, ``FAILURE``, ``SKIPPED``hjhhhhh}r(h]h]h]h]h]uhKh]r(hX@finish with a status described by one of four values defined in rr}r(hX@finish with a status described by one of four values defined in hjubh)r}r(hX:mod:`buildbot.status.builder`rhjhhhhh}r(UreftypeXmodhhXbuildbot.status.builderU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKh]rh)r}r(hjh}r(h]h]r(hjXpy-modreh]h]h]uhjh]rhXbuildbot.status.builderrr}r(hUhjubahhubaubhX: rr}r(hX: hjubh)r}r(hX ``SUCCESS``h}r(h]h]h]h]h]uhjh]rhXSUCCESSrr}r(hUhjubahhubhX, rr}r(hX, hjubh)r}r(hX ``WARNINGS``h}r(h]h]h]h]h]uhjh]rhXWARNINGSrr}r(hUhjubahhubhX, rr}r(hX, hjubh)r}r(hX ``FAILURE``h}r(h]h]h]h]h]uhjh]rhXFAILURErr}r(hUhjubahhubhX, rr}r(hX, hjubh)r}r(hX ``SKIPPED``h}r(h]h]h]h]h]uhjh]rhXSKIPPEDrr}r(hUhjubahhubeubahjubj)r}r(hX5provide a list of short strings to describe the step h}r(h]h]h]h]h]uhjh]rh)r}r(hX4provide a list of short strings to describe the steprhjhhhhh}r(h]h]h]h]h]uhKh]rhX4provide a list of short strings to describe the steprr}r(hjhjubaubahjubehU bullet_listrubaubh)r}r(hXThe rest of this section describes all the standard :class:`BuildStep` objects available for use in a :class:`Build`, and the parameters which can be used to control each. A full list of build steps is available in the :bb:index:`step`.hhhhhhh}r(h]h]h]h]h]uhK hhh]r(hX4The rest of this section describes all the standard rr}r(hX4The rest of this section describes all the standard hjubh)r}r(hX:class:`BuildStep`rhjhhhhh}r(UreftypeXclasshhX BuildStepU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK h]rh)r}r(hjh}r(h]h]r (hjXpy-classr eh]h]h]uhjh]r hX BuildStepr r }r(hUhjubahhubaubhX objects available for use in a rr}r(hX objects available for use in a hjubh)r}r(hX:class:`Build`rhjhhhhh}r(UreftypeXclasshhXBuildU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK h]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXBuildrr}r (hUhjubahhubaubhXh, and the parameters which can be used to control each. A full list of build steps is available in the r!r"}r#(hXh, and the parameters which can be used to control each. A full list of build steps is available in the hjubh)r$}r%(hX:bb:index:`step`r&hjhhhhh}r'(UreftypeXindexhhXstepU refdomainXbbr(h]h]U refexplicith]h]h]hhuhK h]r)h)r*}r+(hj&h}r,(h]h]r-(hj(Xbb-indexr.eh]h]h]uhj$h]r/hXstepr0r1}r2(hUhj*ubahhubaubhX.r3}r4(hX.hjubeubcdocutils.nodes topic r5)r6}r7(hUhhhhhUtopicr8h}r9(h]h]r:(Ucontentsr;Ulocalr<eh]h]r=Ucontentsr>ah]r?hyauhK&hhh]r@j~)rA}rB(hUhj6hNhjh}rC(h]h]h]h]h]uhNhhh]rD(j)rE}rF(hUh}rG(h]h]h]h]h]uhjAh]rHh)rI}rJ(hUh}rK(h]h]h]h]h]uhjEh]rLcdocutils.nodes reference rM)rN}rO(hUh}rP(h]rQUid26rRah]h]h]h]UrefidUcommon-parametersrSuhjIh]rThXCommon ParametersrUrV}rW(hXCommon ParametersrXhjNubahU referencerYubahhubahjubj)rZ}r[(hUh}r\(h]h]h]h]h]uhjAh]r](h)r^}r_(hUh}r`(h]h]h]h]h]uhjZh]rajM)rb}rc(hUh}rd(h]reUid27rfah]h]h]h]UrefidXmodule-buildbot.steps.sourcerguhj^h]rhhXSource Checkoutrirj}rk(hXSource CheckoutrlhjbubahjYubahhubj~)rm}rn(hUh}ro(h]h]h]h]h]uhjZh]rp(j)rq}rr(hUh}rs(h]h]h]h]h]uhjmh]rth)ru}rv(hUh}rw(h]h]h]h]h]uhjqh]rxjM)ry}rz(hUh}r{(h]r|Uid28r}ah]h]h]h]UrefidUid3r~uhjuh]rhXCommon Parametersrr}r(hXCommon ParametersrhjyubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid29rah]h]h]h]UrefidU mercurialruhjh]rhX Mercurialrr}r(hX MercurialrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid30rah]h]h]h]UrefidUgitruhjh]rhXGitrr}r(hXGitrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid31rah]h]h]h]UrefidUsvnruhjh]rhXSVNrr}r(hXSVNrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid32rah]h]h]h]UrefidUcvsruhjh]rhXCVSrr}r(hXCVSrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid33rah]h]h]h]UrefidUbzrruhjh]rhXBzrrr}r(hXBzrrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid34rah]h]h]h]UrefidUp4ruhjh]rhXP4rr}r(hXP4rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid35rah]h]h]h]UrefidUreporuhjh]rhXReporr}r(hXReporhjubahjYubahhubahjubj)r }r (hUh}r (h]h]h]h]h]uhjmh]r h)r }r(hUh}r(h]h]h]h]h]uhj h]rjM)r}r(hUh}r(h]rUid36rah]h]h]h]UrefidUgerritruhj h]rhXGerritrr}r(hXGerritrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjmh]rh)r }r!(hUh}r"(h]h]h]h]h]uhjh]r#jM)r$}r%(hUh}r&(h]r'Uid37r(ah]h]h]h]UrefidUdarcsr)uhj h]r*hXDarcsr+r,}r-(hXDarcsr.hj$ubahjYubahhubahjubj)r/}r0(hUh}r1(h]h]h]h]h]uhjmh]r2h)r3}r4(hUh}r5(h]h]h]h]h]uhj/h]r6jM)r7}r8(hUh}r9(h]r:Uid38r;ah]h]h]h]UrefidUmonotoner<uhj3h]r=hXMonotoner>r?}r@(hXMonotonerAhj7ubahjYubahhubahjubehjubehjubj)rB}rC(hUh}rD(h]h]h]h]h]uhjAh]rE(h)rF}rG(hUh}rH(h]h]h]h]h]uhjBh]rIjM)rJ}rK(hUh}rL(h]rMUid39rNah]h]h]h]UrefidUsource-checkout-slave-siderOuhjFh]rPhXSource Checkout (Slave-Side)rQrR}rS(hXSource Checkout (Slave-Side)rThjJubahjYubahhubj~)rU}rV(hUh}rW(h]h]h]h]h]uhjBh]rX(j)rY}rZ(hUh}r[(h]h]h]h]h]uhjUh]r\h)r]}r^(hUh}r_(h]h]h]h]h]uhjYh]r`jM)ra}rb(hUh}rc(h]rdUid40reah]h]h]h]UrefidUcvs-slave-siderfuhj]h]rghXCVS (Slave-Side)rhri}rj(hXCVS (Slave-Side)rkhjaubahjYubahhubahjubj)rl}rm(hUh}rn(h]h]h]h]h]uhjUh]roh)rp}rq(hUh}rr(h]h]h]h]h]uhjlh]rsjM)rt}ru(hUh}rv(h]rwUid41rxah]h]h]h]UrefidUsvn-slave-sideryuhjph]rzhXSVN (Slave-Side)r{r|}r}(hXSVN (Slave-Side)r~hjtubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid42rah]h]h]h]UrefidUdarcs-slave-sideruhjh]rhXDarcs (Slave-Side)rr}r(hXDarcs (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid43rah]h]h]h]UrefidUmercurial-slave-sideruhjh]rhXMercurial (Slave-Side)rr}r(hXMercurial (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid44rah]h]h]h]UrefidUbzr-slave-sideruhjh]rhXBzr (Slave-Side)rr}r(hXBzr (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid45rah]h]h]h]UrefidU p4-slave-sideruhjh]rhXP4 (Slave-Side)rr}r(hXP4 (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid46rah]h]h]h]UrefidUgit-slave-sideruhjh]rhXGit (Slave-Side)rr}r(hXGit (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid47rah]h]h]h]UrefidUbitkeeper-slave-sideruhjh]rhXBitKeeper (Slave-Side)rr}r(hXBitKeeper (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid48rah]h]h]h]UrefidUrepo-slave-sideruhjh]rhXRepo (Slave-Side)rr}r(hXRepo (Slave-Side)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjUh]rh)r}r (hUh}r (h]h]h]h]h]uhjh]r jM)r }r (hUh}r(h]rUid49rah]h]h]h]UrefidUmonotone-slave-sideruhjh]rhXMonotone (Slave-Side)rr}r(hXMonotone (Slave-Side)rhj ubahjYubahhubahjubehjubehjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]r(h)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r (hUh}r!(h]r"Uid50r#ah]h]h]h]UrefidU shellcommandr$uhjh]r%hX ShellCommandr&r'}r((hX ShellCommandr)hjubahjYubahhubj~)r*}r+(hUh}r,(h]h]h]h]h]uhjh]r-(j)r.}r/(hUh}r0(h]h]h]h]h]uhj*h]r1h)r2}r3(hUh}r4(h]h]h]h]h]uhj.h]r5jM)r6}r7(hUh}r8(h]r9Uid51r:ah]h]h]h]UrefidUusing-shellcommandsr;uhj2h]r<hXUsing ShellCommandsr=r>}r?(hXUsing ShellCommandsr@hj6ubahjYubahhubahjubj)rA}rB(hUh}rC(h]h]h]h]h]uhj*h]rDh)rE}rF(hUh}rG(h]h]h]h]h]uhjAh]rHjM)rI}rJ(hUh}rK(h]rLUid52rMah]h]h]h]UrefidU configurerNuhjEh]rOhX ConfigurerPrQ}rR(hX ConfigurerShjIubahjYubahhubahjubj)rT}rU(hUh}rV(h]h]h]h]h]uhj*h]rWh)rX}rY(hUh}rZ(h]h]h]h]h]uhjTh]r[jM)r\}r](hUh}r^(h]r_Uid53r`ah]h]h]h]UrefidUcompilerauhjXh]rbhXCompilercrd}re(hXCompilerfhj\ubahjYubahhubahjubj)rg}rh(hUh}ri(h]h]h]h]h]uhj*h]rjh)rk}rl(hUh}rm(h]h]h]h]h]uhjgh]rnjM)ro}rp(hUh}rq(h]rrUid54rsah]h]h]h]UrefidUvisual-crtuhjkh]ruhX Visual C++rvrw}rx(hX Visual C++ryhjoubahjYubahhubahjubj)rz}r{(hUh}r|(h]h]h]h]h]uhj*h]r}h)r~}r(hUh}r(h]h]h]h]h]uhjzh]rjM)r}r(hUh}r(h]rUid55rah]h]h]h]UrefidUrobocopyruhj~h]rhXRobocopyrr}r(hXRobocopyrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj*h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid56rah]h]h]h]UrefidUtestruhjh]rhXTestrr}r(hXTestrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj*h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid57rah]h]h]h]UrefidUtreesizeruhjh]rhXTreeSizerr}r(hXTreeSizerhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj*h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid58rah]h]h]h]UrefidUperlmoduletestruhjh]rhXPerlModuleTestrr}r(hXPerlModuleTestrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj*h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid59rah]h]h]h]UrefidUmtr-mysql-test-runruhjh]rhXMTR (mysql-test-run)rr}r(hXMTR (mysql-test-run)rhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj*h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid60rah]h]h]h]UrefidUsubunitshellcommandruhjh]rhXSubunitShellCommandrr}r(hXSubunitShellCommandrhjubahjYubahhubahjubehjubehjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]r(h)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid61rah]h]h]h]UrefidUslave-filesystem-stepsruhjh]rhXSlave Filesystem Stepsrr}r(hXSlave Filesystem StepsrhjubahjYubahhubj~)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r (h]h]h]h]h]uhjh]r jM)r }r (hUh}r (h]rUid62rah]h]h]h]UrefidU fileexistsruhjh]rhX FileExistsrr}r(hX FileExistsrhj ubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r (h]r!Uid63r"ah]h]h]h]UrefidU copydirectoryr#uhjh]r$hX CopyDirectoryr%r&}r'(hX CopyDirectoryr(hjubahjYubahhubahjubj)r)}r*(hUh}r+(h]h]h]h]h]uhjh]r,h)r-}r.(hUh}r/(h]h]h]h]h]uhj)h]r0jM)r1}r2(hUh}r3(h]r4Uid64r5ah]h]h]h]UrefidUremovedirectoryr6uhj-h]r7hXRemoveDirectoryr8r9}r:(hXRemoveDirectoryr;hj1ubahjYubahhubahjubj)r<}r=(hUh}r>(h]h]h]h]h]uhjh]r?h)r@}rA(hUh}rB(h]h]h]h]h]uhj<h]rCjM)rD}rE(hUh}rF(h]rGUid65rHah]h]h]h]UrefidU makedirectoryrIuhj@h]rJhX MakeDirectoryrKrL}rM(hX MakeDirectoryrNhjDubahjYubahhubahjubehjubehjubj)rO}rP(hUh}rQ(h]h]h]h]h]uhjAh]rR(h)rS}rT(hUh}rU(h]h]h]h]h]uhjOh]rVjM)rW}rX(hUh}rY(h]rZUid66r[ah]h]h]h]UrefidUpython-buildstepsr\uhjSh]r]hXPython BuildStepsr^r_}r`(hXPython BuildStepsrahjWubahjYubahhubj~)rb}rc(hUh}rd(h]h]h]h]h]uhjOh]re(j)rf}rg(hUh}rh(h]h]h]h]h]uhjbh]rih)rj}rk(hUh}rl(h]h]h]h]h]uhjfh]rmjM)rn}ro(hUh}rp(h]rqUid67rrah]h]h]h]UrefidU buildepydocrsuhjjh]rthX BuildEPYDocrurv}rw(hX BuildEPYDocrxhjnubahjYubahhubahjubj)ry}rz(hUh}r{(h]h]h]h]h]uhjbh]r|h)r}}r~(hUh}r(h]h]h]h]h]uhjyh]rjM)r}r(hUh}r(h]rUid68rah]h]h]h]UrefidUpyflakesruhj}h]rhXPyFlakesrr}r(hXPyFlakesrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjbh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid69rah]h]h]h]UrefidUsphinxruhjh]rhXSphinxrr}r(hXSphinxrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjbh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid70rah]h]h]h]UrefidUpylintruhjh]rhXPyLintrr}r(hXPyLintrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjbh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid71rah]h]h]h]UrefidUtrialruhjh]rhXTrialrr}r(hXTrialrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjbh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid72rah]h]h]h]UrefidU removepycsruhjh]rhX RemovePYCsrr}r(hX RemovePYCsrhjubahjYubahhubahjubehjubehjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]r(h)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid73rah]h]h]h]UrefidUtransferring-filesruhjh]rhXTransferring Filesrr}r(hXTransferring FilesrhjubahjYubahhubj~)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid74rah]h]h]h]UrefidUother-parametersruhjh]rhXOther Parametersrr}r(hXOther ParametersrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]r jM)r }r (hUh}r (h]r Uid75rah]h]h]h]UrefidUtransfering-directoriesruhjh]rhXTransfering Directoriesrr}r(hXTransfering Directoriesrhj ubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]r Uid76r!ah]h]h]h]UrefidU#transferring-multiple-files-at-oncer"uhjh]r#hX#Transferring Multiple Files At Oncer$r%}r&(hX#Transferring Multiple Files At Oncer'hjubahjYubahhubahjubehjubehjubj)r(}r)(hUh}r*(h]h]h]h]h]uhjAh]r+h)r,}r-(hUh}r.(h]h]h]h]h]uhj(h]r/jM)r0}r1(hUh}r2(h]r3Uid77r4ah]h]h]h]UrefidUtransfering-stringsr5uhj,h]r6hXTransfering Stringsr7r8}r9(hXTransfering Stringsr:hj0ubahjYubahhubahjubj)r;}r<(hUh}r=(h]h]h]h]h]uhjAh]r>(h)r?}r@(hUh}rA(h]h]h]h]h]uhj;h]rBjM)rC}rD(hUh}rE(h]rFUid78rGah]h]h]h]UrefidUrunning-commands-on-the-masterrHuhj?h]rIhXRunning Commands on the MasterrJrK}rL(hXRunning Commands on the MasterrMhjCubahjYubahhubj~)rN}rO(hUh}rP(h]h]h]h]h]uhj;h]rQj)rR}rS(hUh}rT(h]h]h]h]h]uhjNh]rUh)rV}rW(hUh}rX(h]h]h]h]h]uhjRh]rYjM)rZ}r[(hUh}r\(h]r]Uid79r^ah]h]h]h]UrefidU logrenderabler_uhjVh]r`hX LogRenderablerarb}rc(hX LogRenderablerdhjZubahjYubahhubahjubahjubehjubj)re}rf(hUh}rg(h]h]h]h]h]uhjAh]rh(h)ri}rj(hUh}rk(h]h]h]h]h]uhjeh]rljM)rm}rn(hUh}ro(h]rpUid80rqah]h]h]h]UrefidUsetting-propertiesrruhjih]rshXSetting Propertiesrtru}rv(hXSetting PropertiesrwhjmubahjYubahhubj~)rx}ry(hUh}rz(h]h]h]h]h]uhjeh]r{(j)r|}r}(hUh}r~(h]h]h]h]h]uhjxh]rh)r}r(hUh}r(h]h]h]h]h]uhj|h]rjM)r}r(hUh}r(h]rUid81rah]h]h]h]UrefidU setpropertyruhjh]rhX SetPropertyrr}r(hX SetPropertyrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjxh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid82rah]h]h]h]UrefidUsetpropertyfromcommandruhjh]rhXSetPropertyFromCommandrr}r(hXSetPropertyFromCommandrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjxh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid83rah]h]h]h]UrefidUsetpropertiesfromenvruhjh]rhXSetPropertiesFromEnvrr}r(hXSetPropertiesFromEnvrhjubahjYubahhubahjubehjubehjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]r(h)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid84rah]h]h]h]UrefidUsetting-buildslave-inforuhjh]rhXSetting Buildslave Inforr}r(hXSetting Buildslave InforhjubahjYubahhubj~)r}r(hUh}r(h]h]h]h]h]uhjh]rj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid85rah]h]h]h]UrefidU setslaveinforuhjh]rhX SetSlaveInforr}r(hX SetSlaveInforhjubahjYubahhubahjubahjubehjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid86rah]h]h]h]UrefidUtriggering-schedulersruhjh]rhXTriggering Schedulersrr}r(hXTriggering SchedulersrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]r(h)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid87rah]h]h]h]UrefidUrpm-related-stepsruhjh]rhXRPM-Related Stepsrr}r(hXRPM-Related StepsrhjubahjYubahhubj~)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r }r (hUh}r (h]h]h]h]h]uhjh]r h)r }r(hUh}r(h]h]h]h]h]uhj h]rjM)r}r(hUh}r(h]rUid88rah]h]h]h]UrefidUrpmbuildruhj h]rhXRpmBuildrr}r(hXRpmBuildrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r }r!(hUh}r"(h]h]h]h]h]uhjh]r#jM)r$}r%(hUh}r&(h]r'Uid89r(ah]h]h]h]UrefidUrpmlintr)uhj h]r*hXRpmLintr+r,}r-(hXRpmLintr.hj$ubahjYubahhubahjubj)r/}r0(hUh}r1(h]h]h]h]h]uhjh]r2h)r3}r4(hUh}r5(h]h]h]h]h]uhj/h]r6jM)r7}r8(hUh}r9(h]r:Uid90r;ah]h]h]h]UrefidU mock-stepsr<uhj3h]r=hX Mock Stepsr>r?}r@(hX Mock StepsrAhj7ubahjYubahhubahjubj)rB}rC(hUh}rD(h]h]h]h]h]uhjh]rEh)rF}rG(hUh}rH(h]h]h]h]h]uhjBh]rIjM)rJ}rK(hUh}rL(h]rMUid91rNah]h]h]h]UrefidUmockbuildsrpm-steprOuhjFh]rPhXMockBuildSRPM SteprQrR}rS(hXMockBuildSRPM SteprThjJubahjYubahhubahjubj)rU}rV(hUh}rW(h]h]h]h]h]uhjh]rXh)rY}rZ(hUh}r[(h]h]h]h]h]uhjUh]r\jM)r]}r^(hUh}r_(h]r`Uid92raah]h]h]h]UrefidUmockrebuild-steprbuhjYh]rchXMockRebuild Steprdre}rf(hXMockRebuild Steprghj]ubahjYubahhubahjubehjubehjubj)rh}ri(hUh}rj(h]h]h]h]h]uhjAh]rk(h)rl}rm(hUh}rn(h]h]h]h]h]uhjhh]rojM)rp}rq(hUh}rr(h]rsUid93rtah]h]h]h]UrefidUdebian-build-stepsruuhjlh]rvhXDebian Build Stepsrwrx}ry(hXDebian Build StepsrzhjpubahjYubahhubj~)r{}r|(hUh}r}(h]h]h]h]h]uhjhh]r~(j)r}r(hUh}r(h]h]h]h]h]uhj{h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid94rah]h]h]h]UrefidU debpbuilderruhjh]rhX DebPbuilderrr}r(hX DebPbuilderrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj{h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid95rah]h]h]h]UrefidU debcowbuilderruhjh]rhX DebCowbuilderrr}r(hX DebCowbuilderrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhj{h]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid96rah]h]h]h]UrefidU deblintianruhjh]rhX DebLintianrr}r(hX DebLintianrhjubahjYubahhubahjubehjubehjubj)r}r(hUh}r(h]h]h]h]h]uhjAh]r(h)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid97rah]h]h]h]UrefidUmiscellaneous-buildstepsruhjh]rhXMiscellaneous BuildStepsrr}r(hXMiscellaneous BuildStepsrhjubahjYubahhubj~)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid98rah]h]h]h]UrefidUhlintruhjh]rhXHLintrr}r(hXHLintrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid99rah]h]h]h]UrefidUmaxqruhjh]rhXMaxQrr}r(hXMaxQrhjubahjYubahhubahjubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hUh}r(h]h]h]h]h]uhjh]rjM)r}r(hUh}r(h]rUid100rah]h]h]h]UrefidU http-requestsruhjh]rhX HTTP Requestsrr}r(hX HTTP RequestsrhjubahjYubahhubahjubehjubehjubeubaubcsphinx.addnodes index r)r }r (hUhhhhhUindexr h}r (h]h]h]h]h]Uentriesr ]r(UsinglerXBuildstep ParameterUindex-0rUtraUinlineruhK(hhh]ubh)r}r(hUhhhhhhh}r(h]h]h]h]h]hjuhK)hhh]ubh)r}r(hX .. _Buildstep-Common-Parameters:hhhhh}hhh}r(h]h]h]h]h]hUbuildstep-common-parametersruhK*hhh}rjjsh]ubh)r}r(hUhKhhhhh}rhwjshhh}r(h]rXcommon parametersr ah]h]h]r!(jSjjeh]r"hwauhK-hhh}r#(jjjjuh]r$(h)r%}r&(hjXhjhhhhh}r'(h]h]h]h]h]hjRuhK-hhh]r(hXCommon Parametersr)r*}r+(hjXhj%ubaubh)r,}r-(hXAll :class:`BuildStep`\s accept some common parameters. Some of these control how their individual status affects the overall build. Others are used to specify which `Locks` (see :ref:`Interlocks`) should be acquired before allowing the step to run.hjhhhhh}r.(h]h]h]h]h]uhK/hhh]r/(hXAll r0r1}r2(hXAll hj,ubh)r3}r4(hX:class:`BuildStep`r5hj,hhhhh}r6(UreftypeXclasshhX BuildStepU refdomainXpyr7h]h]U refexplicith]h]h]hhhNhNuhK/h]r8h)r9}r:(hj5h}r;(h]h]r<(hj7Xpy-classr=eh]h]h]uhj3h]r>hX BuildStepr?r@}rA(hUhj9ubahhubaubhXs accept some common parameters. Some of these control how their individual status affects the overall build. Others are used to specify which rBrC}rD(hX\s accept some common parameters. Some of these control how their individual status affects the overall build. Others are used to specify which hj,ubcdocutils.nodes title_reference rE)rF}rG(hX`Locks`h}rH(h]h]h]h]h]uhj,h]rIhXLocksrJrK}rL(hUhjFubahUtitle_referencerMubhX (see rNrO}rP(hX (see hj,ubh)rQ}rR(hX:ref:`Interlocks`rShj,hhhhh}rT(UreftypeXrefhhX interlocksU refdomainXstdrUh]h]U refexplicith]h]h]hhuhK/h]rVcdocutils.nodes emphasis rW)rX}rY(hjSh}rZ(h]h]r[(hjUXstd-refr\eh]h]h]uhjQh]r]hX Interlocksr^r_}r`(hUhjXubahUemphasisraubaubhX5) should be acquired before allowing the step to run.rbrc}rd(hX5) should be acquired before allowing the step to run.hj,ubeubh)re}rf(hX6Arguments common to all :class:`BuildStep` subclasses:rghjhhhhh}rh(h]h]h]h]h]uhK4hhh]ri(hXArguments common to all rjrk}rl(hXArguments common to all hjeubh)rm}rn(hX:class:`BuildStep`rohjehhhhh}rp(UreftypeXclasshhX BuildStepU refdomainXpyrqh]h]U refexplicith]h]h]hhhNhNuhK4h]rrh)rs}rt(hjoh}ru(h]h]rv(hjqXpy-classrweh]h]h]uhjmh]rxhX BuildStepryrz}r{(hUhjsubahhubaubhX subclasses:r|r}}r~(hX subclasses:hjeubeubcdocutils.nodes definition_list r)r}r(hUhjhhhUdefinition_listrh}r(h]h]h]h]h]uhNhhh]rcdocutils.nodes definition_list_item r)r}r(hX``name`` the name used to describe the step on the status display. It is also used to give a name to any :class:`LogFile`\s created by this step. hjhhhUdefinition_list_itemrh}r(h]h]h]h]h]uhK8h]r(cdocutils.nodes term r)r}r(hX``name``rhjhhhUtermrh}r(h]h]h]h]h]uhK8h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXnamerr}r(hUhjubahhubaubcdocutils.nodes definition r)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXthe name used to describe the step on the status display. It is also used to give a name to any :class:`LogFile`\s created by this step.hjhhhhh}r(h]h]h]h]h]uhK7h]r(hX`the name used to describe the step on the status display. It is also used to give a name to any rr}r(hX`the name used to describe the step on the status display. It is also used to give a name to any hjubh)r}r(hX:class:`LogFile`rhjhhhhh}r(UreftypeXclasshhXLogFileU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK7h]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXLogFilerr}r(hUhjubahhubaubhXs created by this step.rr}r(hX\s created by this step.hjubeubahU definitionrubeubaubj)r}r(hUhjhhhj h}r(h]h]h]h]h]j ]r(jX"Buildstep Parameter; haltOnFailureUindex-1rUtrajuhK:hhh]ubh)r}r(hUhjhhhhh}r(h]h]h]h]h]hjuhK;hhh]ubj)r}r(hUhjhhh}hjh}r(h]h]h]h]rjah]uhNhhh}rjjsh]rj)r}r(hX``haltOnFailure`` if ``True``, a ``FAILURE`` of this build step will cause the build to halt immediately. Steps with ``alwaysRun=True`` are still run. Generally speaking, ``haltOnFailure`` implies ``flunkOnFailure`` (the default for most :class:`BuildStep`\s). In some cases, particularly series of tests, it makes sense to ``haltOnFailure`` if something fails early on but not ``flunkOnFailure``. This can be achieved with ``haltOnFailure=True``, ``flunkOnFailure=False``. hjhhhjh}r(h]h]h]h]h]uhKBh]r(j)r}r(hX``haltOnFailure``rhjhhhjh}r(h]h]h]h]h]uhKBh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX haltOnFailurerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXif ``True``, a ``FAILURE`` of this build step will cause the build to halt immediately. Steps with ``alwaysRun=True`` are still run. Generally speaking, ``haltOnFailure`` implies ``flunkOnFailure`` (the default for most :class:`BuildStep`\s). In some cases, particularly series of tests, it makes sense to ``haltOnFailure`` if something fails early on but not ``flunkOnFailure``. This can be achieved with ``haltOnFailure=True``, ``flunkOnFailure=False``.hjhhhhh}r(h]h]h]h]h]uhK=h]r(hXif rr}r(hXif hjubh)r}r(hX``True``h}r(h]h]h]h]h]uhjh]rhXTruerr}r(hUhjubahhubhX, a rr}r(hX, a hjubh)r}r(hX ``FAILURE``h}r(h]h]h]h]h]uhjh]rhXFAILURErr}r(hUhjubahhubhXI of this build step will cause the build to halt immediately. Steps with rr}r(hXI of this build step will cause the build to halt immediately. Steps with hjubh)r}r(hX``alwaysRun=True``h}r(h]h]h]h]h]uhjh]rhXalwaysRun=Truerr}r(hUhjubahhubhX$ are still run. Generally speaking, rr}r(hX$ are still run. Generally speaking, hjubh)r }r (hX``haltOnFailure``h}r (h]h]h]h]h]uhjh]r hX haltOnFailurer r }r (hUhj ubahhubhX implies r r }r (hX implies hjubh)r }r (hX``flunkOnFailure``h}r (h]h]h]h]h]uhjh]r hXflunkOnFailurer r }r (hUhj ubahhubhX (the default for most r r }r (hX (the default for most hjubh)r }r (hX:class:`BuildStep`r hjhhhhh}r (UreftypeXclasshhX BuildStepU refdomainXpyr h]h]U refexplicith]h]h]hhhNhNuhK=h]r h)r }r (hj h}r (h]h]r (hj Xpy-classr eh]h]h]uhj h]r hX BuildStepr r! }r" (hUhj ubahhubaubhXCs). In some cases, particularly series of tests, it makes sense to r# r$ }r% (hXD\s). In some cases, particularly series of tests, it makes sense to hjubh)r& }r' (hX``haltOnFailure``h}r( (h]h]h]h]h]uhjh]r) hX haltOnFailurer* r+ }r, (hUhj& ubahhubhX% if something fails early on but not r- r. }r/ (hX% if something fails early on but not hjubh)r0 }r1 (hX``flunkOnFailure``h}r2 (h]h]h]h]h]uhjh]r3 hXflunkOnFailurer4 r5 }r6 (hUhj0 ubahhubhX. This can be achieved with r7 r8 }r9 (hX. This can be achieved with hjubh)r: }r; (hX``haltOnFailure=True``h}r< (h]h]h]h]h]uhjh]r= hXhaltOnFailure=Truer> r? }r@ (hUhj: ubahhubhX, rA rB }rC (hX, hjubh)rD }rE (hX``flunkOnFailure=False``h}rF (h]h]h]h]h]uhjh]rG hXflunkOnFailure=FalserH rI }rJ (hUhjD ubahhubhX.rK }rL (hX.hjubeubahjubeubaubj)rM }rN (hUhjhhhj h}rO (h]h]h]h]h]j ]rP (jX$Buildstep Parameter; flunkOnWarningsUindex-2rQ UtrR ajuhKDhhh]ubh)rS }rT (hUhjhhhhh}rU (h]h]h]h]h]hjQ uhKEhhh]ubj)rV }rW (hUhjhhh}hjh}rX (h]h]h]h]rY jQ ah]uhNhhh}rZ jQ jS sh]r[ j)r\ }r] (hX``flunkOnWarnings`` when ``True``, a ``WARNINGS`` or ``FAILURE`` of this build step will mark the overall build as ``FAILURE``. The remaining steps will still be executed. hjV hhhjh}r^ (h]h]h]h]h]uhKHh]r_ (j)r` }ra (hX``flunkOnWarnings``rb hj\ hhhjh}rc (h]h]h]h]h]uhKHh]rd h)re }rf (hjb h}rg (h]h]h]h]h]uhj` h]rh hXflunkOnWarningsri rj }rk (hUhje ubahhubaubj)rl }rm (hUh}rn (h]h]h]h]h]uhj\ h]ro h)rp }rq (hXwhen ``True``, a ``WARNINGS`` or ``FAILURE`` of this build step will mark the overall build as ``FAILURE``. The remaining steps will still be executed.hjl hhhhh}rr (h]h]h]h]h]uhKGh]rs (hXwhen rt ru }rv (hXwhen hjp ubh)rw }rx (hX``True``h}ry (h]h]h]h]h]uhjp h]rz hXTruer{ r| }r} (hUhjw ubahhubhX, a r~ r }r (hX, a hjp ubh)r }r (hX ``WARNINGS``h}r (h]h]h]h]h]uhjp h]r hXWARNINGSr r }r (hUhj ubahhubhX or r r }r (hX or hjp ubh)r }r (hX ``FAILURE``h}r (h]h]h]h]h]uhjp h]r hXFAILUREr r }r (hUhj ubahhubhX3 of this build step will mark the overall build as r r }r (hX3 of this build step will mark the overall build as hjp ubh)r }r (hX ``FAILURE``h}r (h]h]h]h]h]uhjp h]r hXFAILUREr r }r (hUhj ubahhubhX-. The remaining steps will still be executed.r r }r (hX-. The remaining steps will still be executed.hjp ubeubahjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jX#Buildstep Parameter; flunkOnFailureUindex-3r Utr ajuhKJhhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhKKhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX``flunkOnFailure`` when ``True``, a ``FAILURE`` of this build step will mark the overall build as a ``FAILURE``. The remaining steps will still be executed. hj hhhjh}r (h]h]h]h]h]uhKNh]r (j)r }r (hX``flunkOnFailure``r hj hhhjh}r (h]h]h]h]h]uhKNh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXflunkOnFailurer r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hXwhen ``True``, a ``FAILURE`` of this build step will mark the overall build as a ``FAILURE``. The remaining steps will still be executed.hj hhhhh}r (h]h]h]h]h]uhKMh]r (hXwhen r r }r (hXwhen hj ubh)r }r (hX``True``h}r (h]h]h]h]h]uhj h]r hXTruer r }r (hUhj ubahhubhX, a r r }r (hX, a hj ubh)r }r (hX ``FAILURE``h}r (h]h]h]h]h]uhj h]r hXFAILUREr r }r (hUhj ubahhubhX5 of this build step will mark the overall build as a r r }r (hX5 of this build step will mark the overall build as a hj ubh)r }r (hX ``FAILURE``h}r (h]h]h]h]h]uhj h]r hXFAILUREr r }r (hUhj ubahhubhX-. The remaining steps will still be executed.r r }r (hX-. The remaining steps will still be executed.hj ubeubahjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jX#Buildstep Parameter; warnOnWarningsUindex-4r Utr ajuhKPhhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhKQhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX``warnOnWarnings`` when ``True``, a ``WARNINGS`` or ``FAILURE`` of this build step will mark the overall build as having ``WARNINGS``. The remaining steps will still be executed. hj hhhjh}r (h]h]h]h]h]uhKUh]r (j)r }r (hX``warnOnWarnings``r hj hhhjh}r (h]h]h]h]h]uhKUh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXwarnOnWarningsr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hXwhen ``True``, a ``WARNINGS`` or ``FAILURE`` of this build step will mark the overall build as having ``WARNINGS``. The remaining steps will still be executed.hj hhhhh}r (h]h]h]h]h]uhKSh]r (hXwhen r r }r (hXwhen hj ubh)r }r (hX``True``h}r (h]h]h]h]h]uhj h]r hXTruer r }r (hUhj ubahhubhX, a r r }r (hX, a hj ubh)r }r (hX ``WARNINGS``h}r (h]h]h]h]h]uhj h]r hXWARNINGSr r }r! (hUhj ubahhubhX or r" r# }r$ (hX or hj ubh)r% }r& (hX ``FAILURE``h}r' (h]h]h]h]h]uhj h]r( hXFAILUREr) r* }r+ (hUhj% ubahhubhX: of this build step will mark the overall build as having r, r- }r. (hX: of this build step will mark the overall build as having hj ubh)r/ }r0 (hX ``WARNINGS``h}r1 (h]h]h]h]h]uhj h]r2 hXWARNINGSr3 r4 }r5 (hUhj/ ubahhubhX-. The remaining steps will still be executed.r6 r7 }r8 (hX-. The remaining steps will still be executed.hj ubeubahjubeubaubj)r9 }r: (hUhjhhhj h}r; (h]h]h]h]h]j ]r< (jX"Buildstep Parameter; warnOnFailureUindex-5r= Utr> ajuhKWhhh]ubh)r? }r@ (hUhjhhhhh}rA (h]h]h]h]h]hj= uhKXhhh]ubj)rB }rC (hUhjhhh}hjh}rD (h]h]h]h]rE j= ah]uhNhhh}rF j= j? sh]rG j)rH }rI (hX``warnOnFailure`` when ``True``, a ``FAILURE`` of this build step will mark the overall build as having ``WARNINGS``. The remaining steps will still be executed. hjB hhhjh}rJ (h]h]h]h]h]uhK[h]rK (j)rL }rM (hX``warnOnFailure``rN hjH hhhjh}rO (h]h]h]h]h]uhK[h]rP h)rQ }rR (hjN h}rS (h]h]h]h]h]uhjL h]rT hX warnOnFailurerU rV }rW (hUhjQ ubahhubaubj)rX }rY (hUh}rZ (h]h]h]h]h]uhjH h]r[ h)r\ }r] (hXwhen ``True``, a ``FAILURE`` of this build step will mark the overall build as having ``WARNINGS``. The remaining steps will still be executed.hjX hhhhh}r^ (h]h]h]h]h]uhKZh]r_ (hXwhen r` ra }rb (hXwhen hj\ ubh)rc }rd (hX``True``h}re (h]h]h]h]h]uhj\ h]rf hXTruerg rh }ri (hUhjc ubahhubhX, a rj rk }rl (hX, a hj\ ubh)rm }rn (hX ``FAILURE``h}ro (h]h]h]h]h]uhj\ h]rp hXFAILURErq rr }rs (hUhjm ubahhubhX: of this build step will mark the overall build as having rt ru }rv (hX: of this build step will mark the overall build as having hj\ ubh)rw }rx (hX ``WARNINGS``h}ry (h]h]h]h]h]uhj\ h]rz hXWARNINGSr{ r| }r} (hUhjw ubahhubhX-. The remaining steps will still be executed.r~ r }r (hX-. The remaining steps will still be executed.hj\ ubeubahjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jXBuildstep Parameter; alwaysRunUindex-6r Utr ajuhK]hhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhK^hhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX``alwaysRun`` if ``True``, this build step will always be run, even if a previous buildstep with ``haltOnFailure=True`` has failed. hj hhhjh}r (h]h]h]h]h]uhKah]r (j)r }r (hX ``alwaysRun``r hj hhhjh}r (h]h]h]h]h]uhKah]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hX alwaysRunr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hXuif ``True``, this build step will always be run, even if a previous buildstep with ``haltOnFailure=True`` has failed.hj hhhhh}r (h]h]h]h]h]uhK`h]r (hXif r r }r (hXif hj ubh)r }r (hX``True``h}r (h]h]h]h]h]uhj h]r hXTruer r }r (hUhj ubahhubhXH, this build step will always be run, even if a previous buildstep with r r }r (hXH, this build step will always be run, even if a previous buildstep with hj ubh)r }r (hX``haltOnFailure=True``h}r (h]h]h]h]h]uhj h]r hXhaltOnFailure=Truer r }r (hUhj ubahhubhX has failed.r r }r (hX has failed.hj ubeubahjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jX Buildstep Parameter; descriptionUindex-7r Utr ajuhKchhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhKdhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX}``description`` This will be used to describe the command (on the Waterfall display) while the command is still running. It should be a single imperfect-tense verb, like `compiling` or `testing`. The preferred form is a list of short strings, which allows the HTML displays to create narrower columns by emitting a
tag between each word. You may also provide a single string. hj hhhjh}r (h]h]h]h]h]uhKkh]r (j)r }r (hX``description``r hj hhhjh}r (h]h]h]h]h]uhKkh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hX descriptionr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hXlThis will be used to describe the command (on the Waterfall display) while the command is still running. It should be a single imperfect-tense verb, like `compiling` or `testing`. The preferred form is a list of short strings, which allows the HTML displays to create narrower columns by emitting a
tag between each word. You may also provide a single string.hj hhhhh}r (h]h]h]h]h]uhKfh]r (hXThis will be used to describe the command (on the Waterfall display) while the command is still running. It should be a single imperfect-tense verb, like r r }r (hXThis will be used to describe the command (on the Waterfall display) while the command is still running. It should be a single imperfect-tense verb, like hj ubjE)r }r (hX `compiling`h}r (h]h]h]h]h]uhj h]r hX compilingr r }r (hUhj ubahjMubhX or r r }r (hX or hj ubjE)r }r (hX `testing`h}r (h]h]h]h]h]uhj h]r hXtestingr r }r (hUhj ubahjMubhX. The preferred form is a list of short strings, which allows the HTML displays to create narrower columns by emitting a
tag between each word. You may also provide a single string.r r }r (hX. The preferred form is a list of short strings, which allows the HTML displays to create narrower columns by emitting a
tag between each word. You may also provide a single string.hj ubeubahjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jX$Buildstep Parameter; descriptionDoneUindex-8r Utr ajuhKmhhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhKnhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX``descriptionDone`` This will be used to describe the command once it has finished. A simple noun like `compile` or `tests` should be used. Like ``description``, this may either be a list of short strings or a single string. If neither ``description`` nor ``descriptionDone`` are set, the actual command arguments will be used to construct the description. This may be a bit too wide to fit comfortably on the Waterfall display. All subclasses of :py:class:`BuildStep` will contain the description attributes. Consequently, you could add a :py:class:`ShellCommand` step like so: :: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], description=["testing"], descriptionDone=["tests"])) hj hhhjh}r (h]h]h]h]h]uhKh]r (j)r }r (hX``descriptionDone``r hj hhhjh}r (h]h]h]h]h]uhKh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXdescriptionDoner r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r (h)r }r! (hXThis will be used to describe the command once it has finished. A simple noun like `compile` or `tests` should be used. Like ``description``, this may either be a list of short strings or a single string.hj hhhhh}r" (h]h]h]h]h]uhKph]r# (hXSThis will be used to describe the command once it has finished. A simple noun like r$ r% }r& (hXSThis will be used to describe the command once it has finished. A simple noun like hj ubjE)r' }r( (hX `compile`h}r) (h]h]h]h]h]uhj h]r* hXcompiler+ r, }r- (hUhj' ubahjMubhX or r. r/ }r0 (hX or hj ubjE)r1 }r2 (hX`tests`h}r3 (h]h]h]h]h]uhj h]r4 hXtestsr5 r6 }r7 (hUhj1 ubahjMubhX should be used. Like r8 r9 }r: (hX should be used. Like hj ubh)r; }r< (hX``description``h}r= (h]h]h]h]h]uhj h]r> hX descriptionr? r@ }rA (hUhj; ubahhubhX@, this may either be a list of short strings or a single string.rB rC }rD (hX@, this may either be a list of short strings or a single string.hj ubeubh)rE }rF (hXIf neither ``description`` nor ``descriptionDone`` are set, the actual command arguments will be used to construct the description. This may be a bit too wide to fit comfortably on the Waterfall display.hj hhhhh}rG (h]h]h]h]h]uhKuh]rH (hX If neither rI rJ }rK (hX If neither hjE ubh)rL }rM (hX``description``h}rN (h]h]h]h]h]uhjE h]rO hX descriptionrP rQ }rR (hUhjL ubahhubhX nor rS rT }rU (hX nor hjE ubh)rV }rW (hX``descriptionDone``h}rX (h]h]h]h]h]uhjE h]rY hXdescriptionDonerZ r[ }r\ (hUhjV ubahhubhX are set, the actual command arguments will be used to construct the description. This may be a bit too wide to fit comfortably on the Waterfall display.r] r^ }r_ (hX are set, the actual command arguments will be used to construct the description. This may be a bit too wide to fit comfortably on the Waterfall display.hjE ubeubh)r` }ra (hXAll subclasses of :py:class:`BuildStep` will contain the description attributes. Consequently, you could add a :py:class:`ShellCommand` step like so:hj hhhhh}rb (h]h]h]h]h]uhKzh]rc (hXAll subclasses of rd re }rf (hXAll subclasses of hj` ubh)rg }rh (hX:py:class:`BuildStep`ri hj` hhhhh}rj (UreftypeXclasshhX BuildStepU refdomainXpyrk h]h]U refexplicith]h]h]hhhNhNuhKzh]rl h)rm }rn (hji h}ro (h]h]rp (hjk Xpy-classrq eh]h]h]uhjg h]rr hX BuildSteprs rt }ru (hUhjm ubahhubaubhXH will contain the description attributes. Consequently, you could add a rv rw }rx (hXH will contain the description attributes. Consequently, you could add a hj` ubh)ry }rz (hX:py:class:`ShellCommand`r{ hj` hhhhh}r| (UreftypeXclasshhX ShellCommandU refdomainXpyr} h]h]U refexplicith]h]h]hhhNhNuhKzh]r~ h)r }r (hj{ h}r (h]h]r (hj} Xpy-classr eh]h]h]uhjy h]r hX ShellCommandr r }r (hUhj ubahhubaubhX step like so:r r }r (hX step like so:hj` ubeubjS)r }r (hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], description=["testing"], descriptionDone=["tests"]))hj hjVh}r (jXjYh]h]h]h]h]uhKh]r hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], description=["testing"], descriptionDone=["tests"]))r r }r (hUhj ubaubehjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jX&Buildstep Parameter; descriptionSuffixUindex-9r Utr ajuhKhhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhKhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX``descriptionSuffix`` This is an optional suffix appended to the end of the description (ie, after ``description`` and ``descriptionDone``). This can be used to distinguish between build steps that would display the same descriptions in the waterfall. This parameter may be set to list of short strings, a single string, or ``None``. For example, a builder might use the ``Compile`` step to build two different codebases. The ``descriptionSuffix`` could be set to `projectFoo` and `projectBar`, respectively for each step, which will result in the full descriptions `compiling projectFoo` and `compiling projectBar` to be shown in the waterfall. hj hhhjh}r (h]h]h]h]h]uhKh]r (j)r }r (hX``descriptionSuffix``r hj hhhjh}r (h]h]h]h]h]uhKh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXdescriptionSuffixr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r (h)r }r (hX7This is an optional suffix appended to the end of the description (ie, after ``description`` and ``descriptionDone``). This can be used to distinguish between build steps that would display the same descriptions in the waterfall. This parameter may be set to list of short strings, a single string, or ``None``.hj hhhhh}r (h]h]h]h]h]uhKh]r (hXMThis is an optional suffix appended to the end of the description (ie, after r r }r (hXMThis is an optional suffix appended to the end of the description (ie, after hj ubh)r }r (hX``description``h}r (h]h]h]h]h]uhj h]r hX descriptionr r }r (hUhj ubahhubhX and r r }r (hX and hj ubh)r }r (hX``descriptionDone``h}r (h]h]h]h]h]uhj h]r hXdescriptionDoner r }r (hUhj ubahhubhX). This can be used to distinguish between build steps that would display the same descriptions in the waterfall. This parameter may be set to list of short strings, a single string, or r r }r (hX). This can be used to distinguish between build steps that would display the same descriptions in the waterfall. This parameter may be set to list of short strings, a single string, or hj ubh)r }r (hX``None``h}r (h]h]h]h]h]uhj h]r hXNoner r }r (hUhj ubahhubhX.r }r (hX.hj ubeubh)r }r (hX7For example, a builder might use the ``Compile`` step to build two different codebases. The ``descriptionSuffix`` could be set to `projectFoo` and `projectBar`, respectively for each step, which will result in the full descriptions `compiling projectFoo` and `compiling projectBar` to be shown in the waterfall.hj hhhhh}r (h]h]h]h]h]uhKh]r (hX%For example, a builder might use the r r }r (hX%For example, a builder might use the hj ubh)r }r (hX ``Compile``h}r (h]h]h]h]h]uhj h]r hXCompiler r }r (hUhj ubahhubhX, step to build two different codebases. The r r }r (hX, step to build two different codebases. The hj ubh)r }r (hX``descriptionSuffix``h}r (h]h]h]h]h]uhj h]r hXdescriptionSuffixr r }r (hUhj ubahhubhX could be set to r r }r (hX could be set to hj ubjE)r }r (hX `projectFoo`h}r (h]h]h]h]h]uhj h]r hX projectFoor r }r (hUhj ubahjMubhX and r r }r (hX and hj ubjE)r }r (hX `projectBar`h}r (h]h]h]h]h]uhj h]r hX projectBarr r }r (hUhj ubahjMubhXI, respectively for each step, which will result in the full descriptions r r }r (hXI, respectively for each step, which will result in the full descriptions hj ubjE)r }r (hX`compiling projectFoo`h}r (h]h]h]h]h]uhj h]r hXcompiling projectFoor r }r (hUhj ubahjMubhX and r r }r (hX and hj ubjE)r }r (hX`compiling projectBar`h}r (h]h]h]h]h]uhj h]r hXcompiling projectBarr r }r (hUhj ubahjMubhX to be shown in the waterfall.r r }r (hX to be shown in the waterfall.hj ubeubehjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jXBuildstep Parameter; doStepIfUindex-10r Utr! ajuhKhhh]ubh)r" }r# (hUhjhhhhh}r$ (h]h]h]h]h]hj uhKhhh]ubj)r% }r& (hUhjhhh}hjh}r' (h]h]h]h]r( j ah]uhNhhh}r) j j" sh]r* j)r+ }r, (hX``doStepIf`` A step can be configured to only run under certain conditions. To do this, set the step's ``doStepIf`` to a boolean value, or to a function that returns a boolean value or Deferred. If the value or function result is false, then the step will return ``SKIPPED`` without doing anything. Otherwise, the step will be executed normally. If you set ``doStepIf`` to a function, that function should accept one parameter, which will be the :class:`Step` object itself. hj% hhhjh}r- (h]h]h]h]h]uhKh]r. (j)r/ }r0 (hX ``doStepIf``r1 hj+ hhhjh}r2 (h]h]h]h]h]uhKh]r3 h)r4 }r5 (hj1 h}r6 (h]h]h]h]h]uhj/ h]r7 hXdoStepIfr8 r9 }r: (hUhj4 ubahhubaubj)r; }r< (hUh}r= (h]h]h]h]h]uhj+ h]r> h)r? }r@ (hXA step can be configured to only run under certain conditions. To do this, set the step's ``doStepIf`` to a boolean value, or to a function that returns a boolean value or Deferred. If the value or function result is false, then the step will return ``SKIPPED`` without doing anything. Otherwise, the step will be executed normally. If you set ``doStepIf`` to a function, that function should accept one parameter, which will be the :class:`Step` object itself.hj; hhhhh}rA (h]h]h]h]h]uhKh]rB (hX[A step can be configured to only run under certain conditions. To do this, set the step's rC rD }rE (hX[A step can be configured to only run under certain conditions. To do this, set the step's hj? ubh)rF }rG (hX ``doStepIf``h}rH (h]h]h]h]h]uhj? h]rI hXdoStepIfrJ rK }rL (hUhjF ubahhubhX to a boolean value, or to a function that returns a boolean value or Deferred. If the value or function result is false, then the step will return rM rN }rO (hX to a boolean value, or to a function that returns a boolean value or Deferred. If the value or function result is false, then the step will return hj? ubh)rP }rQ (hX ``SKIPPED``h}rR (h]h]h]h]h]uhj? h]rS hXSKIPPEDrT rU }rV (hUhjP ubahhubhXU without doing anything. Otherwise, the step will be executed normally. If you set rW rX }rY (hXU without doing anything. Otherwise, the step will be executed normally. If you set hj? ubh)rZ }r[ (hX ``doStepIf``h}r\ (h]h]h]h]h]uhj? h]r] hXdoStepIfr^ r_ }r` (hUhjZ ubahhubhXM to a function, that function should accept one parameter, which will be the ra rb }rc (hXM to a function, that function should accept one parameter, which will be the hj? ubh)rd }re (hX :class:`Step`rf hj? hhhhh}rg (UreftypeXclasshhXStepU refdomainXpyrh h]h]U refexplicith]h]h]hhhNhNuhKh]ri h)rj }rk (hjf h}rl (h]h]rm (hjh Xpy-classrn eh]h]h]uhjd h]ro hXSteprp rq }rr (hUhjj ubahhubaubhX object itself.rs rt }ru (hX object itself.hj? ubeubahjubeubaubj)rv }rw (hUhjhhhj h}rx (h]h]h]h]h]j ]ry (jXBuildstep Parameter; hideStepIfUindex-11rz Utr{ ajuhKhhh]ubh)r| }r} (hUhjhhhhh}r~ (h]h]h]h]h]hjz uhKhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r jz ah]uhNhhh}r jz j| sh]r j)r }r (hXR``hideStepIf`` A step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's ``hideStepIf`` to a boolean value, or to a function that takes two parameters -- the results and the :class:`BuildStep` -- and returns a boolean value. Steps are always shown while they execute, however after the step as finished, this parameter is evaluated (if a function) and if the value is True, the step is hidden. For example, in order to hide the step if the step has been skipped, :: factory.addStep(Foo(..., hideStepIf=lambda results, s: results==SKIPPED)) hj hhhjh}r (h]h]h]h]h]uhKh]r (j)r }r (hX``hideStepIf``r hj hhhjh}r (h]h]h]h]h]uhKh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hX hideStepIfr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r (h)r }r (hXA step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's ``hideStepIf`` to a boolean value, or to a function that takes two parameters -- the results and the :class:`BuildStep` -- and returns a boolean value. Steps are always shown while they execute, however after the step as finished, this parameter is evaluated (if a function) and if the value is True, the step is hidden. For example, in order to hide the step if the step has been skipped, ::hj hhhhh}r (h]h]h]h]h]uhKh]r (hXkA step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's r r }r (hXkA step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's hj ubh)r }r (hX``hideStepIf``h}r (h]h]h]h]h]uhj h]r hX hideStepIfr r }r (hUhj ubahhubhXW to a boolean value, or to a function that takes two parameters -- the results and the r r }r (hXW to a boolean value, or to a function that takes two parameters -- the results and the hj ubh)r }r (hX:class:`BuildStep`r hj hhhhh}r (UreftypeXclasshhX BuildStepU refdomainXpyr h]h]U refexplicith]h]h]hhhNhNuhKh]r h)r }r (hj h}r (h]h]r (hj Xpy-classr eh]h]h]uhj h]r hX BuildStepr r }r (hUhj ubahhubaubhX -- and returns a boolean value. Steps are always shown while they execute, however after the step as finished, this parameter is evaluated (if a function) and if the value is True, the step is hidden. For example, in order to hide the step if the step has been skipped,r r }r (hX -- and returns a boolean value. Steps are always shown while they execute, however after the step as finished, this parameter is evaluated (if a function) and if the value is True, the step is hidden. For example, in order to hide the step if the step has been skipped,hj ubeubjS)r }r (hXIfactory.addStep(Foo(..., hideStepIf=lambda results, s: results==SKIPPED))hj hjVh}r (jXjYh]h]h]h]h]uhKh]r hXIfactory.addStep(Foo(..., hideStepIf=lambda results, s: results==SKIPPED))r r }r (hUhj ubaubehjubeubaubj)r }r (hUhjhhhj h}r (h]h]h]h]h]j ]r (jXBuildstep Parameter; locksUindex-12r Utr ajuhKhhh]ubh)r }r (hUhjhhhhh}r (h]h]h]h]h]hj uhKhhh]ubj)r }r (hUhjhhh}hjh}r (h]h]h]h]r j ah]uhNhhh}r j j sh]r j)r }r (hX{``locks`` a list of ``Locks`` (instances of :class:`buildbot.locks.SlaveLock` or :class:`buildbot.locks.MasterLock`) that should be acquired before starting this :class:`Step`. The ``Locks`` will be released when the step is complete. Note that this is a list of actual :class:`Lock` instances, not names. Also note that all Locks must have unique names. See :ref:`Interlocks`. hj hhhjh}r (h]h]h]h]h]uhKh]r (j)r }r (hX ``locks``r hj hhhjh}r (h]h]h]h]h]uhKh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXlocksr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hXpa list of ``Locks`` (instances of :class:`buildbot.locks.SlaveLock` or :class:`buildbot.locks.MasterLock`) that should be acquired before starting this :class:`Step`. The ``Locks`` will be released when the step is complete. Note that this is a list of actual :class:`Lock` instances, not names. Also note that all Locks must have unique names. See :ref:`Interlocks`.hj hhhhh}r (h]h]h]h]h]uhKh]r (hX a list of r r }r (hX a list of hj ubh)r }r (hX ``Locks``h}r (h]h]h]h]h]uhj h]r hXLocksr r }r (hUhj ubahhubhX (instances of r r }r (hX (instances of hj ubh)r }r (hX!:class:`buildbot.locks.SlaveLock`r hj hhhhh}r (UreftypeXclasshhXbuildbot.locks.SlaveLockU refdomainXpyr h]h]U refexplicith]h]h]hhhNhNuhKh]r h)r }r (hj h}r (h]h]r (hj Xpy-classr eh]h]h]uhj h]r hXbuildbot.locks.SlaveLockr r }r (hUhj ubahhubaubhX or r r }r (hX or hj ubh)r }r (hX":class:`buildbot.locks.MasterLock`r hj hhhhh}r (UreftypeXclasshhXbuildbot.locks.MasterLockU refdomainXpyr h]h]U refexplicith]h]h]hhhNhNuhKh]r h)r }r (hj h}r (h]h]r (hj Xpy-classr eh]h]h]uhj h]r hXbuildbot.locks.MasterLockr r }r (hUhj ubahhubaubhX/) that should be acquired before starting this r r }r (hX/) that should be acquired before starting this hj ubh)r }r (hX :class:`Step`r hj hhhhh}r (UreftypeXclasshhXStepU refdomainXpyr h]h]U refexplicith]h]h]hhhNhNuhKh]r h)r! }r" (hj h}r# (h]h]r$ (hj Xpy-classr% eh]h]h]uhj h]r& hXStepr' r( }r) (hUhj! ubahhubaubhX. The r* r+ }r, (hX. The hj ubh)r- }r. (hX ``Locks``h}r/ (h]h]h]h]h]uhj h]r0 hXLocksr1 r2 }r3 (hUhj- ubahhubhXP will be released when the step is complete. Note that this is a list of actual r4 r5 }r6 (hXP will be released when the step is complete. Note that this is a list of actual hj ubh)r7 }r8 (hX :class:`Lock`r9 hj hhhhh}r: (UreftypeXclasshhXLockU refdomainXpyr; h]h]U refexplicith]h]h]hhhNhNuhKh]r< h)r= }r> (hj9 h}r? (h]h]r@ (hj; Xpy-classrA eh]h]h]uhj7 h]rB hXLockrC rD }rE (hUhj= ubahhubaubhXM instances, not names. Also note that all Locks must have unique names. See rF rG }rH (hXM instances, not names. Also note that all Locks must have unique names. See hj ubh)rI }rJ (hX:ref:`Interlocks`rK hj hhhhh}rL (UreftypeXrefhhX interlocksU refdomainXstdrM h]h]U refexplicith]h]h]hhuhKh]rN jW)rO }rP (hjK h}rQ (h]h]rR (hjM Xstd-refrS eh]h]h]uhjI h]rT hX InterlocksrU rV }rW (hUhjO ubahjaubaubhX.rX }rY (hX.hj ubeubahjubeubaubh)rZ }r[ (hX.. _Source-Checkout:hjhhhhh}r\ (h]h]h]h]h]hUsource-checkoutr] uhKhhh]ubeubhh)r^ }r_ (hUhhhhh}r` hlh)ra }rb (hX.. _Source-Checkout-Slave-Side:hh)rc }rd (hUhKhhhhh}re h{h)rf }rg (hX.. _Step-Monotone:hh)rh }ri (hUhKhhhhh}rj hnh)rk }rl (hX.. _Step-Darcs:hh)rm }rn (hUhhhhh}ro hVh)rp }rq (hX.. _Step-Gerrit:hh)rr }rs (hUhKhhhhh}hhh}rt (h]ru Xreporv ah]h]h]rw (jX step-Reporx eh]uhMihhh}ry jx h)rz }r{ (hUhh)r| }r} (hUhhhhh}hhh}r~ (h]h]h]h]r (jXstep-P4r eh]r hdauhMhhh}r j h)r }r (hUhh)r }r (hUhhhhh}r hh)r }r (hX .. _Step-Bzr:hh)r }r (hUhKhhhhh}r h h)r }r (hX .. _Step-CVS:hh)r }r (hUhhhhh}r hrh)r }r (hX .. _Step-SVN:hh)r }r (hUhKhhhhh}r hh)r }r (hX .. _Step-Git:hh)r }r (hUhKhhhhh}r h:h)r }r (hX.. _Step-Mercurial:hhhhh}hhh}r (h]h]h]h]h]hUstep-mercurialr uhM1hhh}r Xstep-Mercurialr h)r }r (hUhhhhhhh}r (h]h]h]h]h]hj uhM0hhh]ubsh]ubshhh}r (h]r X mercurialr ah]h]h]r (jj j eh]r h:auhM4hhh}r (j j j j uh]r (h)r }r (hjhj hhhhh}r (h]h]h]h]h]hjuhM4hhh]r hX Mercurialr r }r (hjhj ubaubj)r }r (hUhj hNhj h}r (h]h]h]h]h]Uentries]r (jXJbuildbot.steps.source.mercurial.Mercurial (class in buildbot.steps.source)hUtr auhNhhh]ubcsphinx.addnodes desc r )r }r (hUhj hNhUdescr h}r (Unoindexr Udomainr Xpyh]h]h]h]h]Uobjtyper Xclassr Udesctyper j uhNhhh]r (csphinx.addnodes desc_signature r )r }r (hX)buildbot.steps.source.mercurial.Mercurialhj hhhUdesc_signaturer h}r (h]r haUmoduler Xbuildbot.steps.sourcer h]h]h]h]r haUfullnamer X)buildbot.steps.source.mercurial.MercurialUclassr Xbuildbot.steps.source.mercurialUfirstr uhM7hhh]r (csphinx.addnodes desc_annotation r )r }r (hXclass hj hhhUdesc_annotationr h}r (h]h]h]h]h]uhM7hhh]r hXclass r r }r (hUhj ubaubcsphinx.addnodes desc_addname r )r }r (hX buildbot.steps.source.mercurial.hj hhhU desc_addnamer h}r (h]h]h]h]h]uhM7hhh]r hX buildbot.steps.source.mercurial.r r }r (hUhj ubaubcsphinx.addnodes desc_name r )r }r (hX Mercurialhj hhhU desc_namer h}r (h]h]h]h]h]uhM7hhh]r hX Mercurialr r }r (hUhj ubaubeubcsphinx.addnodes desc_content r )r }r (hUhj hhhU desc_contentr h}r (h]h]h]h]h]uhM7hhh]ubeubh)r }r (hX{The :bb:step:`Mercurial` build step performs a `Mercurial `_ (aka ``hg``) checkout or update.hj hhhhh}r (h]h]h]h]h]uhM8hhh]r (hXThe r r }r (hXThe hj ubh)r }r (hX:bb:step:`Mercurial`r hj hhhhh}r (UreftypeXstephhX MercurialU refdomainXbbr h]h]U refexplicith]h]h]hhuhM8h]r h)r }r (hj h}r (h]h]r(hj Xbb-stepreh]h]h]uhj h]rhX Mercurialrr}r(hUhj ubahhubaubhX build step performs a rr}r(hX build step performs a hj ubjM)r }r (hX+`Mercurial `_h}r (UnameX MercurialUrefurir Xhttp://selenic.com/mercurialr h]h]h]h]h]uhj h]rhX Mercurialrr}r(hUhj ubahjYubh)r}r(hX hKhj hhh}r(Urefurij h]rUid4rah]h]h]h]rj auh]ubhX (aka rr}r(hX (aka hj ubh)r}r(hX``hg``h}r(h]h]h]h]h]uhj h]rhXhgrr }r!(hUhjubahhubhX) checkout or update.r"r#}r$(hX) checkout or update.hj ubeubh)r%}r&(hXBranches are available in two modes: ``dirname``, where the name of the branch is a suffix of the name of the repository, or ``inrepo``, which uses Hg's named-branches support. Make sure this setting matches your changehook, if you have that installed. ::hj hhhhh}r'(h]h]h]h]h]uhM;hhh]r((hX%Branches are available in two modes: r)r*}r+(hX%Branches are available in two modes: hj%ubh)r,}r-(hX ``dirname``h}r.(h]h]h]h]h]uhj%h]r/hXdirnamer0r1}r2(hUhj,ubahhubhXM, where the name of the branch is a suffix of the name of the repository, or r3r4}r5(hXM, where the name of the branch is a suffix of the name of the repository, or hj%ubh)r6}r7(hX ``inrepo``h}r8(h]h]h]h]h]uhj%h]r9hXinrepor:r;}r<(hUhj6ubahhubhXu, which uses Hg's named-branches support. Make sure this setting matches your changehook, if you have that installed.r=r>}r?(hXu, which uses Hg's named-branches support. Make sure this setting matches your changehook, if you have that installed.hj%ubeubjS)r@}rA(hXfrom buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh', branchType='inrepo'))hj hhhjVh}rB(jXjYh]h]h]h]h]uhM@hhh]rChXfrom buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh', branchType='inrepo'))rDrE}rF(hUhj@ubaubh)rG}rH(hX1The Mercurial step takes the following arguments:rIhj hhhhh}rJ(h]h]h]h]h]uhMDhhh]rKhX1The Mercurial step takes the following arguments:rLrM}rN(hjIhjGubaubj)rO}rP(hUhj hhhjh}rQ(h]h]h]h]h]uhNhhh]rR(j)rS}rT(hX@``repourl`` where the Mercurial source repository is available. hjOhhhjh}rU(h]h]h]h]h]uhMGh]rV(j)rW}rX(hX ``repourl``rYhjShhhjh}rZ(h]h]h]h]h]uhMGh]r[h)r\}r](hjYh}r^(h]h]h]h]h]uhjWh]r_hXrepourlr`ra}rb(hUhj\ubahhubaubj)rc}rd(hUh}re(h]h]h]h]h]uhjSh]rfh)rg}rh(hX3where the Mercurial source repository is available.rihjchhhhh}rj(h]h]h]h]h]uhMGh]rkhX3where the Mercurial source repository is available.rlrm}rn(hjihjgubaubahjubeubj)ro}rp(hX``defaultBranch`` this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``repourl`` to create the string that will be passed to the ``hg clone`` command. hjOhhhjh}rq(h]h]h]h]h]uhMLhhh]rr(j)rs}rt(hX``defaultBranch``ruhjohhhjh}rv(h]h]h]h]h]uhMLh]rwh)rx}ry(hjuh}rz(h]h]h]h]h]uhjsh]r{hX defaultBranchr|r}}r~(hUhjxubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjoh]rh)r}r(hXthis specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``repourl`` to create the string that will be passed to the ``hg clone`` command.hjhhhhh}r(h]h]h]h]h]uhMJh]r(hXtthis specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to rr}r(hXtthis specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhX1 to create the string that will be passed to the rr}r(hX1 to create the string that will be passed to the hjubh)r}r(hX ``hg clone``h}r(h]h]h]h]h]uhjh]rhXhg clonerr}r(hUhjubahhubhX command.rr}r(hX command.hjubeubahjubeubj)r}r(hX``branchType`` either 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the ``repourl`` or the branch is a Mercurial named branch and can be found within the ``repourl``. hjOhhhjh}r(h]h]h]h]h]uhMQhhh]r(j)r}r(hX``branchType``rhjhhhjh}r(h]h]h]h]h]uhMQh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX branchTyperr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the ``repourl`` or the branch is a Mercurial named branch and can be found within the ``repourl``.hjhhhhh}r(h]h]h]h]h]uhMOh]r(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the rr}r(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhXG or the branch is a Mercurial named branch and can be found within the rr}r(hXG or the branch is a Mercurial named branch and can be found within the hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(hX``clobberOnBranchChange`` boolean, defaults to ``True``. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch. hjOhhhjh}r(h]h]h]h]h]uhMVhhh]r(j)r}r(hX``clobberOnBranchChange``rhjhhhjh}r(h]h]h]h]h]uhMVh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXclobberOnBranchChangerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXboolean, defaults to ``True``. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.hjhhhhh}r(h]h]h]h]h]uhMTh]r(hXboolean, defaults to rr}r(hXboolean, defaults to hjubh)r}r(hX``True``h}r(h]h]h]h]h]uhjh]rhXTruerr}r(hUhjubahhubhXr. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.rr}r(hXr. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.hjubeubahjubeubeubh)r}r(hX``mode`` ``method``hj hhhhh}r(h]h]h]h]h]uhMXhhh]r(h)r}r(hX``mode``h}r(h]h]h]h]h]uhjh]rhXmoderr}r(hUhjubahhubhX r}r(hX hjubh)r}r(hX ``method``h}r(h]h]h]h]h]uhjh]rhXmethodrr}r(hUhjubahhubeubjx)r}r(hUhj hNhj{h}r(h]h]h]h]h]uhNhhh]r(h)r }r (hXaMercurial's incremental mode does not require a method. The full mode has three methods defined:r hjhhhhh}r (h]h]h]h]h]uhM[h]r hXaMercurial's incremental mode does not require a method. The full mode has three methods defined:rr}r(hj hj ubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hX``clobber`` It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository hjhhhjh}r(h]h]h]h]h]uhMah]r(j)r}r(hX ``clobber``rhjhhhjh}r(h]h]h]h]h]uhMah]rh)r}r(hjh}r (h]h]h]h]h]uhjh]r!hXclobberr"r#}r$(hUhjubahhubaubj)r%}r&(hUh}r'(h]h]h]h]h]uhjh]r(h)r)}r*(hX~It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repositoryr+hj%hhhhh}r,(h]h]h]h]h]uhM`h]r-hX~It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repositoryr.r/}r0(hj+hj)ubaubahjubeubj)r1}r2(hX|``fresh`` This remove all other files except those tracked by VCS. First it does :command:`hg purge --all` then pull/update hjhhhjh}r3(h]h]h]h]h]uhMeh]r4(j)r5}r6(hX ``fresh``r7hj1hhhjh}r8(h]h]h]h]h]uhMeh]r9h)r:}r;(hj7h}r<(h]h]h]h]h]uhj5h]r=hXfreshr>r?}r@(hUhj:ubahhubaubj)rA}rB(hUh}rC(h]h]h]h]h]uhj1h]rDh)rE}rF(hXqThis remove all other files except those tracked by VCS. First it does :command:`hg purge --all` then pull/updatehjAhhhhh}rG(h]h]h]h]h]uhMdh]rH(hXGThis remove all other files except those tracked by VCS. First it does rIrJ}rK(hXGThis remove all other files except those tracked by VCS. First it does hjEubcdocutils.nodes strong rL)rM}rN(hX:command:`hg purge --all`h}rO(h]h]rPUcommandrQah]h]h]uhjEh]rRhXhg purge --allrSrT}rU(hUhjMubahUstrongrVubhX then pull/updaterWrX}rY(hX then pull/updatehjEubeubahjubeubj)rZ}r[(hX``clean`` All the files which are tracked by Mercurial and listed ignore files are not deleted. Remaining all other files will be deleted before pull/update. This is equivalent to :command:`hg purge` then pull/update. hjhhhjh}r\(h]h]h]h]h]uhMkh]r](j)r^}r_(hX ``clean``r`hjZhhhjh}ra(h]h]h]h]h]uhMkh]rbh)rc}rd(hj`h}re(h]h]h]h]h]uhj^h]rfhXcleanrgrh}ri(hUhjcubahhubaubj)rj}rk(hUh}rl(h]h]h]h]h]uhjZh]rmh)rn}ro(hXAll the files which are tracked by Mercurial and listed ignore files are not deleted. Remaining all other files will be deleted before pull/update. This is equivalent to :command:`hg purge` then pull/update.hjjhhhhh}rp(h]h]h]h]h]uhMhh]rq(hXAll the files which are tracked by Mercurial and listed ignore files are not deleted. Remaining all other files will be deleted before pull/update. This is equivalent to rrrs}rt(hXAll the files which are tracked by Mercurial and listed ignore files are not deleted. Remaining all other files will be deleted before pull/update. This is equivalent to hjnubjL)ru}rv(hX:command:`hg purge`h}rw(h]h]rxjQah]h]h]uhjnh]ryhXhg purgerzr{}r|(hUhjuubahjVubhX then pull/update.r}r~}r(hX then pull/update.hjnubeubahjubeubehjubeubj)r}r(hUhj hhhj h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; GitXstep-Gitrjtr(UsingleXGit Build StepjjtreuhMnhhh]ubh)r}r(hUhj hhhhh}r(h]h]h]h]h]hjuhMnhhh]ubj eubhhh}hhh}r(h]h]h]h]h]hUstep-gitruhMohhh}rjjsh]ubshhh}r(h]rXgitrah]h]h]r(jjjeh]rhauhMrhhh}r(jj jjuh]r(h)r}r(hjhj hhhhh}r(h]h]h]h]h]hjuhMrhhh]rhXGitrr}r(hjhjubaubj)r}r(hUhj hNhj h}r(h]h]h]h]h]Uentries]r(jX>buildbot.steps.source.git.Git (class in buildbot.steps.source)hbUtrauhNhhh]ubj )r}r(hUhj hNhj h}r(j j Xpyh]h]h]h]h]j Xclassrj juhNhhh]r(j )r}r(hXbuildbot.steps.source.git.Githjhhhj h}r(h]rhbaj j h]h]h]h]rhbaj Xbuildbot.steps.source.git.Gitj Xbuildbot.steps.source.gitj uhMuhhh]r(j )r}r(hXclass hjhhhj h}r(h]h]h]h]h]uhMuhhh]rhXclass rr}r(hUhjubaubj )r}r(hXbuildbot.steps.source.git.hjhhhj h}r(h]h]h]h]h]uhMuhhh]rhXbuildbot.steps.source.git.rr}r(hUhjubaubj )r}r(hXGithjhhhj h}r(h]h]h]h]h]uhMuhhh]rhXGitrr}r(hUhjubaubeubj )r}r(hUhjhhhj h}r(h]h]h]h]h]uhMuhhh]ubeubh)r}r(hXFThe ``Git`` build step clones or updates a `Git `_ repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the :command:`git init` command that the buildbot uses. ::hj hhhhh}r(h]h]h]h]h]uhMvhhh]r(hXThe rr}r(hXThe hjubh)r}r(hX``Git``h}r(h]h]h]h]h]uhjh]rhXGitrr}r(hUhjubahhubhX build step clones or updates a rr}r(hX build step clones or updates a hjubjM)r}r(hX`Git `_h}r(UnameXGitj Xhttp://git.or.cz/rh]h]h]h]h]uhjh]rhXGitrr}r(hUhjubahjYubh)r}r(hX hKhjhhh}r(Urefurijh]rUid5rah]h]h]h]rjauh]ubhX repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the rr}r(hX repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the hjubjL)r}r(hX:command:`git init`h}r(h]h]rjQah]h]h]uhjh]rhXgit initrr}r(hUhjubahjVubhX command that the buildbot uses.rr}r(hX command that the buildbot uses.hjubeubjS)r}r(hXfrom buildbot.steps.source.git import Git factory.addStep(Git(repourl='git://path/to/repo', mode='full', method='clobber', submodules=True))hj hhhjVh}r(jXjYh]h]h]h]h]uhM|hhh]rhXfrom buildbot.steps.source.git import Git factory.addStep(Git(repourl='git://path/to/repo', mode='full', method='clobber', submodules=True))rr}r(hUhjubaubh)r}r(hX+The Git step takes the following arguments:rhj hhhhh}r(h]h]h]h]h]uhMhhh]rhX+The Git step takes the following arguments:rr}r(hjhjubaubj)r}r(hUhj hhhjh}r(h]h]h]h]h]uhNhhh]r(j)r}r(hX@``repourl`` (required): the URL of the upstream Git repository. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``repourl``r hjhhhjh}r (h]h]h]h]h]uhMh]r h)r }r (hj h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhj ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX3(required): the URL of the upstream Git repository.rhjhhhhh}r(h]h]h]h]h]uhMh]rhX3(required): the URL of the upstream Git repository.rr}r(hjhjubaubahjubeubj)r}r (hX``branch`` (optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the Build does not provide a branch, the default branch of the remote repository will be used. hjhhhjh}r!(h]h]h]h]h]uhMhhh]r"(j)r#}r$(hX ``branch``r%hjhhhjh}r&(h]h]h]h]h]uhMh]r'h)r(}r)(hj%h}r*(h]h]h]h]h]uhj#h]r+hXbranchr,r-}r.(hUhj(ubahhubaubj)r/}r0(hUh}r1(h]h]h]h]h]uhjh]r2h)r3}r4(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the Build does not provide a branch, the default branch of the remote repository will be used.r5hj/hhhhh}r6(h]h]h]h]h]uhMh]r7hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the Build does not provide a branch, the default branch of the remote repository will be used.r8r9}r:(hj5hj3ubaubahjubeubj)r;}r<(hX``submodules`` (optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``. hjhhhjh}r=(h]h]h]h]h]uhMhhh]r>(j)r?}r@(hX``submodules``rAhj;hhhjh}rB(h]h]h]h]h]uhMh]rCh)rD}rE(hjAh}rF(h]h]h]h]h]uhj?h]rGhX submodulesrHrI}rJ(hUhjDubahhubaubj)rK}rL(hUh}rM(h]h]h]h]h]uhj;h]rNh)rO}rP(hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``.hjKhhhhh}rQ(h]h]h]h]h]uhMh]rR(hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: rSrT}rU(hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: hjOubh)rV}rW(hX ``False``h}rX(h]h]h]h]h]uhjOh]rYhXFalserZr[}r\(hUhjVubahhubhX.r]}r^(hX.hjOubeubahjubeubj)r_}r`(hX``shallow`` (optional): instructs git to attempt shallow clones (``--depth 1``). This option can be used only in full builds with clobber method. hjhhhjh}ra(h]h]h]h]h]uhMhhh]rb(j)rc}rd(hX ``shallow``rehj_hhhjh}rf(h]h]h]h]h]uhMh]rgh)rh}ri(hjeh}rj(h]h]h]h]h]uhjch]rkhXshallowrlrm}rn(hUhjhubahhubaubj)ro}rp(hUh}rq(h]h]h]h]h]uhj_h]rrh)rs}rt(hX(optional): instructs git to attempt shallow clones (``--depth 1``). This option can be used only in full builds with clobber method.hjohhhhh}ru(h]h]h]h]h]uhMh]rv(hX5(optional): instructs git to attempt shallow clones (rwrx}ry(hX5(optional): instructs git to attempt shallow clones (hjsubh)rz}r{(hX ``--depth 1``h}r|(h]h]h]h]h]uhjsh]r}hX --depth 1r~r}r(hUhjzubahhubhXC). This option can be used only in full builds with clobber method.rr}r(hXC). This option can be used only in full builds with clobber method.hjsubeubahjubeubj)r}r(hX``reference`` (optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``reference``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX referencerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist.rhjhhhhh}r(h]h]h]h]h]uhMh]rhX(optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist.rr}r(hjhjubaubahjubeubj)r}r(hX``progress`` (optional): passes the (``--progress``) flag to (:command:`git fetch`). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``progress``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXprogressrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional): passes the (``--progress``) flag to (:command:`git fetch`). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(optional): passes the (rr}r(hX(optional): passes the (hjubh)r}r(hX``--progress``h}r(h]h]h]h]h]uhjh]rhX --progressrr}r(hUhjubahhubhX ) flag to (rr}r(hX ) flag to (hjubjL)r}r(hX:command:`git fetch`h}r(h]h]rjQah]h]h]uhjh]rhX git fetchrr}r(hUhjubahjVubhXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.rr}r(hXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.hjubeubahjubeubj)r}r(hX``retryFetch`` (optional): defaults to ``False``. If true, if the ``git fetch`` fails then buildbot retries to fetch again instead of failing the entire source checkout. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``retryFetch``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX retryFetchrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional): defaults to ``False``. If true, if the ``git fetch`` fails then buildbot retries to fetch again instead of failing the entire source checkout.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(optional): defaults to rr}r(hX(optional): defaults to hjubh)r}r(hX ``False``h}r(h]h]h]h]h]uhjh]rhXFalserr}r(hUhjubahhubhX. If true, if the rr}r(hX. If true, if the hjubh)r}r(hX ``git fetch``h}r(h]h]h]h]h]uhjh]rhX git fetchrr}r(hUhjubahhubhXZ fails then buildbot retries to fetch again instead of failing the entire source checkout.rr}r(hXZ fails then buildbot retries to fetch again instead of failing the entire source checkout.hjubeubahjubeubj)r}r(hX``clobberOnFailure`` (optional): defaults to ``False``. If a fetch or full clone fails we can checkout source removing everything. This way new repository will be cloned. If retry fails it fails the source checkout step. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``clobberOnFailure``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r (hjh}r (h]h]h]h]h]uhjh]r hXclobberOnFailurer r }r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional): defaults to ``False``. If a fetch or full clone fails we can checkout source removing everything. This way new repository will be cloned. If retry fails it fails the source checkout step.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(optional): defaults to rr}r(hX(optional): defaults to hjubh)r}r(hX ``False``h}r(h]h]h]h]h]uhjh]rhXFalserr}r (hUhjubahhubhX. If a fetch or full clone fails we can checkout source removing everything. This way new repository will be cloned. If retry fails it fails the source checkout step.r!r"}r#(hX. If a fetch or full clone fails we can checkout source removing everything. This way new repository will be cloned. If retry fails it fails the source checkout step.hjubeubahjubeubeubh)r$}r%(hX``mode``r&hj hhhhh}r'(h]h]h]h]h]uhMhhh]r(h)r)}r*(hj&h}r+(h]h]h]h]h]uhj$h]r,hXmoder-r.}r/(hUhj)ubahhubaubjx)r0}r1(hUhj hhhj{h}r2(h]h]h]h]h]uhNhhh]r3(h)r4}r5(hX\(optional): defaults to ``'incremental'``. Specifies whether to clean the build tree or not.hj0hhhhh}r6(h]h]h]h]h]uhMh]r7(hX(optional): defaults to r8r9}r:(hX(optional): defaults to hj4ubh)r;}r<(hX``'incremental'``h}r=(h]h]h]h]h]uhj4h]r>hX 'incremental'r?r@}rA(hUhj;ubahhubhX3. Specifies whether to clean the build tree or not.rBrC}rD(hX3. Specifies whether to clean the build tree or not.hj4ubeubjx)rE}rF(hUh}rG(h]h]h]h]h]uhj0h]rHj)rI}rJ(hUh}rK(h]h]h]h]h]uhjEh]rL(j)rM}rN(hXN``incremental`` The source is update, but any built files are left untouched. hjIhhhjh}rO(h]h]h]h]h]uhMh]rP(j)rQ}rR(hX``incremental``rShjMhhhjh}rT(h]h]h]h]h]uhMh]rUh)rV}rW(hjSh}rX(h]h]h]h]h]uhjQh]rYhX incrementalrZr[}r\(hUhjVubahhubaubj)r]}r^(hUh}r_(h]h]h]h]h]uhjMh]r`h)ra}rb(hX=The source is update, but any built files are left untouched.rchj]hhhhh}rd(h]h]h]h]h]uhMh]rehX=The source is update, but any built files are left untouched.rfrg}rh(hjchjaubaubahjubeubj)ri}rj(hX``full`` The build tree is clean of any built files. The exact method for doing this is controlled by the ``method`` argument. hjIhhhjh}rk(h]h]h]h]h]uhMh]rl(j)rm}rn(hX``full``rohjihhhjh}rp(h]h]h]h]h]uhMh]rqh)rr}rs(hjoh}rt(h]h]h]h]h]uhjmh]ruhXfullrvrw}rx(hUhjrubahhubaubj)ry}rz(hUh}r{(h]h]h]h]h]uhjih]r|h)r}}r~(hXuThe build tree is clean of any built files. The exact method for doing this is controlled by the ``method`` argument.hjyhhhhh}r(h]h]h]h]h]uhMh]r(hXaThe build tree is clean of any built files. The exact method for doing this is controlled by the rr}r(hXaThe build tree is clean of any built files. The exact method for doing this is controlled by the hj}ubh)r}r(hX ``method``h}r(h]h]h]h]h]uhj}h]rhXmethodrr}r(hUhjubahhubhX argument.rr}r(hX argument.hj}ubeubahjubeubehjubahj{ubeubh)r}r(hX ``method``rhj hhhhh}r(h]h]h]h]h]uhMhhh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXmethodrr}r(hUhjubahhubaubjx)r}r(hUhj hNhj{h}r(h]h]h]h]h]uhNhhh]r(h)r}r(hX(optional): defaults to ``fresh`` when mode is ``full``. Git's incremental mode does not require a method. The full mode has four methods defined:hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(optional): defaults to rr}r(hX(optional): defaults to hjubh)r}r(hX ``fresh``h}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhjubahhubhX when mode is rr}r(hX when mode is hjubh)r}r(hX``full``h}r(h]h]h]h]h]uhjh]rhXfullrr}r(hUhjubahhubhX[. Git's incremental mode does not require a method. The full mode has four methods defined:rr}r(hX[. Git's incremental mode does not require a method. The full mode has four methods defined:hjubeubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hX ``clobber`` It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository. To make faster clones enable ``shallow`` option. If shallow options is enabled and build request have unknown revision value, then this step fails. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``clobber``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXclobberrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXIt removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository. To make faster clones enable ``shallow`` option. If shallow options is enabled and build request have unknown revision value, then this step fails.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXIt removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository. To make faster clones enable rr}r(hXIt removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository. To make faster clones enable hjubh)r}r(hX ``shallow``h}r(h]h]h]h]h]uhjh]rhXshallowrr}r(hUhjubahhubhXk option. If shallow options is enabled and build request have unknown revision value, then this step fails.rr}r(hXk option. If shallow options is enabled and build request have unknown revision value, then this step fails.hjubeubahjubeubj)r}r(hX``fresh`` This remove all other files except those tracked by Git. First it does :command:`git clean -d -f -f -x` then fetch/checkout to a specified revision(if any). This option is equal to update mode with ``ignore_ignores=True`` in old steps. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``fresh``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXThis remove all other files except those tracked by Git. First it does :command:`git clean -d -f -f -x` then fetch/checkout to a specified revision(if any). This option is equal to update mode with ``ignore_ignores=True`` in old steps.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXGThis remove all other files except those tracked by Git. First it does rr}r(hXGThis remove all other files except those tracked by Git. First it does hjubjL)r}r(hX :command:`git clean -d -f -f -x`h}r(h]h]rjQah]h]h]uhjh]rhXgit clean -d -f -f -xrr}r(hUhjubahjVubhX_ then fetch/checkout to a specified revision(if any). This option is equal to update mode with rr}r(hX_ then fetch/checkout to a specified revision(if any). This option is equal to update mode with hjubh)r}r (hX``ignore_ignores=True``h}r (h]h]h]h]h]uhjh]r hXignore_ignores=Truer r }r(hUhjubahhubhX in old steps.rr}r(hX in old steps.hjubeubahjubeubj)r}r(hX``clean`` All the files which are tracked by Git and listed ignore files are not deleted. Remaining all other files will be deleted before fetch/checkout. This is equivalent to :command:`git clean -d -f -f` then fetch. This is equivalent to ``ignore_ignores=False`` in old steps. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``clean``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXcleanrr }r!(hUhjubahhubaubj)r"}r#(hUh}r$(h]h]h]h]h]uhjh]r%h)r&}r'(hX All the files which are tracked by Git and listed ignore files are not deleted. Remaining all other files will be deleted before fetch/checkout. This is equivalent to :command:`git clean -d -f -f` then fetch. This is equivalent to ``ignore_ignores=False`` in old steps.hj"hhhhh}r((h]h]h]h]h]uhMh]r)(hXAll the files which are tracked by Git and listed ignore files are not deleted. Remaining all other files will be deleted before fetch/checkout. This is equivalent to r*r+}r,(hXAll the files which are tracked by Git and listed ignore files are not deleted. Remaining all other files will be deleted before fetch/checkout. This is equivalent to hj&ubjL)r-}r.(hX:command:`git clean -d -f -f`h}r/(h]h]r0jQah]h]h]uhj&h]r1hXgit clean -d -f -fr2r3}r4(hUhj-ubahjVubhX# then fetch. This is equivalent to r5r6}r7(hX# then fetch. This is equivalent to hj&ubh)r8}r9(hX``ignore_ignores=False``h}r:(h]h]h]h]h]uhj&h]r;hXignore_ignores=Falser<r=}r>(hUhj8ubahhubhX in old steps.r?r@}rA(hX in old steps.hj&ubeubahjubeubj)rB}rC(hX``copy`` This first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory. hjhhhjh}rD(h]h]h]h]h]uhMh]rE(j)rF}rG(hX``copy``rHhjBhhhjh}rI(h]h]h]h]h]uhMh]rJh)rK}rL(hjHh}rM(h]h]h]h]h]uhjFh]rNhXcopyrOrP}rQ(hUhjKubahhubaubj)rR}rS(hUh}rT(h]h]h]h]h]uhjBh]rUh)rV}rW(hXThis first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory.hjRhhhhh}rX(h]h]h]h]h]uhMh]rY(hX?This first checkout source into source directory then copy the rZr[}r\(hX?This first checkout source into source directory then copy the hjVubh)r]}r^(hX ``source``h}r_(h]h]h]h]h]uhjVh]r`hXsourcerarb}rc(hUhj]ubahhubhX directory to rdre}rf(hX directory to hjVubh)rg}rh(hX ``build``h}ri(h]h]h]h]h]uhjVh]rjhXbuildrkrl}rm(hUhjgubahhubhX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in rnro}rp(hX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in hjVubh)rq}rr(hX ``source``h}rs(h]h]h]h]h]uhjVh]rthXsourcerurv}rw(hUhjqubahhubhX directory.rxry}rz(hX directory.hjVubeubahjubeubehjubeubh)r{}r|(hX``getDescription``r}hj hhhhh}r~(h]h]h]h]h]uhMhhh]rh)r}r(hj}h}r(h]h]h]h]h]uhj{h]rhXgetDescriptionrr}r(hUhjubahhubaubjx)r}r(hUhj hNhj{h}r(h]h]h]h]h]uhNhhh]r(h)r}r(hX_(optional) After checkout, invoke a `git describe` on the revision and save the result in a property; the property's name is either ``commit-description`` or ``commit-description-foo``, depending on whether the ``codebase`` argument was also provided. The argument should either be a ``bool`` or ``dict``, and will change how `git describe` is called:hjhhhhh}r(h]h]h]h]h]uhMh]r(hX$(optional) After checkout, invoke a rr}r(hX$(optional) After checkout, invoke a hjubjE)r}r(hX`git describe`h}r(h]h]h]h]h]uhjh]rhX git describerr}r(hUhjubahjMubhXR on the revision and save the result in a property; the property's name is either rr}r(hXR on the revision and save the result in a property; the property's name is either hjubh)r}r(hX``commit-description``h}r(h]h]h]h]h]uhjh]rhXcommit-descriptionrr}r(hUhjubahhubhX or rr}r(hX or hjubh)r}r(hX``commit-description-foo``h}r(h]h]h]h]h]uhjh]rhXcommit-description-foorr}r(hUhjubahhubhX, depending on whether the rr}r(hX, depending on whether the hjubh)r}r(hX ``codebase``h}r(h]h]h]h]h]uhjh]rhXcodebaserr}r(hUhjubahhubhX= argument was also provided. The argument should either be a rr}r(hX= argument was also provided. The argument should either be a hjubh)r}r(hX``bool``h}r(h]h]h]h]h]uhjh]rhXboolrr}r(hUhjubahhubhX or rr}r(hX or hjubh)r}r(hX``dict``h}r(h]h]h]h]h]uhjh]rhXdictrr}r(hUhjubahhubhX, and will change how rr}r(hX, and will change how hjubjE)r}r(hX`git describe`h}r(h]h]h]h]h]uhjh]rhX git describerr}r(hUhjubahjMubhX is called:rr}r(hX is called:hjubeubj~)r}r(hUh}r(jX*h]h]h]h]h]uhjh]r(j)r}r(hX:``getDescription=False``: disables this feature explicitlyrh}r(h]h]h]h]h]uhjh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``getDescription=False``h}r(h]h]h]h]h]uhjh]rhXgetDescription=Falserr}r(hUhjubahhubhX": disables this feature explicitlyrr}r(hX": disables this feature explicitlyhjubeubahjubj)r}r(hXL``getDescription=True`` or empty ``dict()``: Run `git describe` with no argsrh}r(h]h]h]h]h]uhjh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``getDescription=True``h}r(h]h]h]h]h]uhjh]rhXgetDescription=Truerr}r(hUhjubahhubhX or empty rr}r(hX or empty hjubh)r}r(hX ``dict()``h}r(h]h]h]h]h]uhjh]rhXdict()rr}r(hUhjubahhubhX: Run r r }r (hX: Run hjubjE)r }r (hX`git describe`h}r(h]h]h]h]h]uhjh]rhX git describerr}r(hUhj ubahjMubhX with no argsrr}r(hX with no argshjubeubahjubj)r}r(hX``getDescription={...}``: a dict with keys named the same as the Git option. Each key's value can be ``False`` or ``None`` to explicitly skip that argument. For the following keys, a value of ``True`` appends the same-named Git argument: * ``all`` : `--all` * ``always``: `--always` * ``contains``: `--contains` * ``debug``: `--debug` * ``long``: `--long`` * ``exact-match``: `--exact-match` * ``tags``: `--tags` * ``dirty``: `--dirty` For the following keys, an integer or string value (depending on what Git expects) will set the argument's parameter appropriately. Examples show the key-value pair: * ``match=foo``: `--match foo` * ``abbrev=7``: `--abbrev=7` * ``candidates=7``: `--candidates=7` * ``dirty=foo``: `--dirty=foo` h}r(h]h]h]h]h]uhjh]r(h)r}r(hX``getDescription={...}``: a dict with keys named the same as the Git option. Each key's value can be ``False`` or ``None`` to explicitly skip that argument.hjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``getDescription={...}``h}r (h]h]h]h]h]uhjh]r!hXgetDescription={...}r"r#}r$(hUhjubahhubhXM: a dict with keys named the same as the Git option. Each key's value can be r%r&}r'(hXM: a dict with keys named the same as the Git option. Each key's value can be hjubh)r(}r)(hX ``False``h}r*(h]h]h]h]h]uhjh]r+hXFalser,r-}r.(hUhj(ubahhubhX or r/r0}r1(hX or hjubh)r2}r3(hX``None``h}r4(h]h]h]h]h]uhjh]r5hXNoner6r7}r8(hUhj2ubahhubhX" to explicitly skip that argument.r9r:}r;(hX" to explicitly skip that argument.hjubeubh)r<}r=(hXPFor the following keys, a value of ``True`` appends the same-named Git argument:r>hjhhhhh}r?(h]h]h]h]h]uhMh]r@(hX#For the following keys, a value of rArB}rC(hX#For the following keys, a value of hj<ubh)rD}rE(hX``True``h}rF(h]h]h]h]h]uhj<h]rGhXTruerHrI}rJ(hUhjDubahhubhX% appends the same-named Git argument:rKrL}rM(hX% appends the same-named Git argument:hj<ubeubjx)rN}rO(hUh}rP(h]h]h]h]h]uhjh]rQj~)rR}rS(hUh}rT(jX*h]h]h]h]h]uhjNh]rU(j)rV}rW(hX``all`` : `--all`rXh}rY(h]h]h]h]h]uhjRh]rZh)r[}r\(hjXhjVhhhhh}r](h]h]h]h]h]uhMh]r^(h)r_}r`(hX``all``h}ra(h]h]h]h]h]uhj[h]rbhXallrcrd}re(hUhj_ubahhubhX : rfrg}rh(hX : hj[ubjE)ri}rj(hX`--all`h}rk(h]h]h]h]h]uhj[h]rlhX--allrmrn}ro(hUhjiubahjMubeubahjubj)rp}rq(hX``always``: `--always`rrh}rs(h]h]h]h]h]uhjRh]rth)ru}rv(hjrhjphhhhh}rw(h]h]h]h]h]uhMh]rx(h)ry}rz(hX ``always``h}r{(h]h]h]h]h]uhjuh]r|hXalwaysr}r~}r(hUhjyubahhubhX: rr}r(hX: hjuubjE)r}r(hX `--always`h}r(h]h]h]h]h]uhjuh]rhX--alwaysrr}r(hUhjubahjMubeubahjubj)r}r(hX``contains``: `--contains`rh}r(h]h]h]h]h]uhjRh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX ``contains``h}r(h]h]h]h]h]uhjh]rhXcontainsrr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX `--contains`h}r(h]h]h]h]h]uhjh]rhX --containsrr}r(hUhjubahjMubeubahjubj)r}r(hX``debug``: `--debug`rh}r(h]h]h]h]h]uhjRh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX ``debug``h}r(h]h]h]h]h]uhjh]rhXdebugrr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX `--debug`h}r(h]h]h]h]h]uhjh]rhX--debugrr}r(hUhjubahjMubeubahjubj)r}r(hX``long``: `--long``rh}r(h]h]h]h]h]uhjRh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``long``h}r(h]h]h]h]h]uhjh]rhXlongrr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX `--long``h}r(h]h]h]h]h]uhjh]rhX--long`rr}r(hUhjubahjMubeubahjubj)r}r(hX ``exact-match``: `--exact-match`rh}r(h]h]h]h]h]uhjRh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``exact-match``h}r(h]h]h]h]h]uhjh]rhX exact-matchrr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX`--exact-match`h}r(h]h]h]h]h]uhjh]rhX --exact-matchrr}r(hUhjubahjMubeubahjubj)r}r(hX``tags``: `--tags`rh}r(h]h]h]h]h]uhjRh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``tags``h}r(h]h]h]h]h]uhjh]rhXtagsrr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX`--tags`h}r(h]h]h]h]h]uhjh]rhX--tagsr r }r (hUhjubahjMubeubahjubj)r }r (hX``dirty``: `--dirty` h}r(h]h]h]h]h]uhjRh]rh)r}r(hX``dirty``: `--dirty`hj hhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX ``dirty``h}r(h]h]h]h]h]uhjh]rhXdirtyrr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX `--dirty`h}r (h]h]h]h]h]uhjh]r!hX--dirtyr"r#}r$(hUhjubahjMubeubahjubehjubahj{ubh)r%}r&(hXFor the following keys, an integer or string value (depending on what Git expects) will set the argument's parameter appropriately. Examples show the key-value pair:r'hjhhhhh}r((h]h]h]h]h]uhMh]r)hXFor the following keys, an integer or string value (depending on what Git expects) will set the argument's parameter appropriately. Examples show the key-value pair:r*r+}r,(hj'hj%ubaubjx)r-}r.(hUh}r/(h]h]h]h]h]uhjh]r0j~)r1}r2(hUh}r3(jX*h]h]h]h]h]uhj-h]r4(j)r5}r6(hX``match=foo``: `--match foo`r7h}r8(h]h]h]h]h]uhj1h]r9h)r:}r;(hj7hj5hhhhh}r<(h]h]h]h]h]uhMh]r=(h)r>}r?(hX ``match=foo``h}r@(h]h]h]h]h]uhj:h]rAhX match=foorBrC}rD(hUhj>ubahhubhX: rErF}rG(hX: hj:ubjE)rH}rI(hX `--match foo`h}rJ(h]h]h]h]h]uhj:h]rKhX --match foorLrM}rN(hUhjHubahjMubeubahjubj)rO}rP(hX``abbrev=7``: `--abbrev=7`rQh}rR(h]h]h]h]h]uhj1h]rSh)rT}rU(hjQhjOhhhhh}rV(h]h]h]h]h]uhMh]rW(h)rX}rY(hX ``abbrev=7``h}rZ(h]h]h]h]h]uhjTh]r[hXabbrev=7r\r]}r^(hUhjXubahhubhX: r_r`}ra(hX: hjTubjE)rb}rc(hX `--abbrev=7`h}rd(h]h]h]h]h]uhjTh]rehX --abbrev=7rfrg}rh(hUhjbubahjMubeubahjubj)ri}rj(hX"``candidates=7``: `--candidates=7`rkh}rl(h]h]h]h]h]uhj1h]rmh)rn}ro(hjkhjihhhhh}rp(h]h]h]h]h]uhMh]rq(h)rr}rs(hX``candidates=7``h}rt(h]h]h]h]h]uhjnh]ruhX candidates=7rvrw}rx(hUhjrubahhubhX: ryrz}r{(hX: hjnubjE)r|}r}(hX`--candidates=7`h}r~(h]h]h]h]h]uhjnh]rhX--candidates=7rr}r(hUhj|ubahjMubeubahjubj)r}r(hX``dirty=foo``: `--dirty=foo` h}r(h]h]h]h]h]uhj1h]rh)r}r(hX``dirty=foo``: `--dirty=foo`rhjhhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX ``dirty=foo``h}r(h]h]h]h]h]uhjh]rhX dirty=foorr}r(hUhjubahhubhX: rr}r(hX: hjubjE)r}r(hX `--dirty=foo`h}r(h]h]h]h]h]uhjh]rhX --dirty=foorr}r(hUhjubahjMubeubahjubehjubahj{ubehjubehjubeubh)r}r(hX ``config``rhj hhhhh}r(h]h]h]h]h]uhMhhh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXconfigrr}r(hUhjubahhubaubjx)r}r(hUhj hhhj{h}r(h]h]h]h]h]uhNhhh]rh)r}r(hXS(optional) A dict of git configuration settings to pass to the remote git commands.rhjhhhhh}r(h]h]h]h]h]uhMh]rhXS(optional) A dict of git configuration settings to pass to the remote git commands.rr}r(hjhjubaubaubj)r}r(hUhj hhhj h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; SVNXstep-SVNrjtr(UsingleXSVN Build StepjjtreuhMhhh]ubh)r}r(hUhj hhhhh}r(h]h]h]h]h]hjuhMhhh]ubj eubhhh}hhh}r(h]h]h]h]h]hUstep-svnruhMhhh}rjjsh]ubshhh}r(h]h]h]h]r(jjjeh]r(hhreuhMhhh}r(jj jjuh]r(h)r}r(hjhj hhhhh}r(h]h]h]h]h]hjuhMhhh]rhXSVNrr}r(hjhjubaubj)r}r(hUhj hNhj h}r(h]h]h]h]h]Uentries]r(jX>buildbot.steps.source.svn.SVN (class in buildbot.steps.source)hUtrauhNhhh]ubj )r}r(hUhj hNhj h}r(j j Xpyh]h]h]h]h]j Xclassrj juhNhhh]r(j )r}r(hXbuildbot.steps.source.svn.SVNhjhhhj h}r(h]rhaj j h]h]h]h]rhaj Xbuildbot.steps.source.svn.SVNj Xbuildbot.steps.source.svnj uhMhhh]r(j )r}r(hXclass hjhhhj h}r(h]h]h]h]h]uhMhhh]rhXclass rr}r(hUhjubaubj )r}r(hXbuildbot.steps.source.svn.hjhhhj h}r(h]h]h]h]h]uhMhhh]rhXbuildbot.steps.source.svn.rr}r(hUhjubaubj )r}r(hXSVNhjhhhj h}r(h]h]h]h]h]uhMhhh]rhXSVNrr}r(hUhjubaubeubj )r}r(hUhjhhhj h}r(h]h]h]h]h]uhMhhh]ubeubh)r}r(hXThe :bb:step:`SVN` build step performs a `Subversion `_ checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.hj hhhhh}r(h]h]h]h]h]uhMhhh]r(hXThe rr}r(hXThe hjubh)r}r(hX:bb:step:`SVN`rhjhhhhh}r(UreftypeXstephhXSVNU refdomainXbbrh]h]U refexplicith]h]h]hhuhMh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXSVNr r }r (hUhjubahhubaubhX build step performs a r r }r(hX build step performs a hjubjM)r}r(hX,`Subversion `_h}r(UnameX Subversionj Xhttp://subversion.tigris.orgrh]h]h]h]h]uhjh]rhX Subversionrr}r(hUhjubahjYubh)r}r(hX hKhjhhh}r(Urefurijh]rU subversionrah]h]h]h]rhauh]ubhX checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.rr}r(hX checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.hjubeubh)r }r!(hXHThe :bb:step:`SVN` step should be created with the ``repourl`` argument:hj hhhhh}r"(h]h]h]h]h]uhMhhh]r#(hXThe r$r%}r&(hXThe hj ubh)r'}r((hX:bb:step:`SVN`r)hj hhhhh}r*(UreftypeXstephhXSVNU refdomainXbbr+h]h]U refexplicith]h]h]hhuhMh]r,h)r-}r.(hj)h}r/(h]h]r0(hj+Xbb-stepr1eh]h]h]uhj'h]r2hXSVNr3r4}r5(hUhj-ubahhubaubhX! step should be created with the r6r7}r8(hX! step should be created with the hj ubh)r9}r:(hX ``repourl``h}r;(h]h]h]h]h]uhj h]r<hXrepourlr=r>}r?(hUhj9ubahhubhX argument:r@rA}rB(hX argument:hj ubeubj)rC}rD(hUhj hhhjh}rE(h]h]h]h]h]uhNhhh]rFj)rG}rH(hX``repourl`` (required): this specifies the ``URL`` argument that will be given to the :command:`svn checkout` command. It dictates both where the repository is located and which sub-tree should be extracted. One way to specify the branch is to use ``Interpolate``. For example, if you wanted to check out the trunk repository, you could use ``repourl=Interpolate("http://svn.example.com/repos/%(src::branch)s")`` Alternatively, if you are using a remote Subversion repository which is accessible through HTTP at a URL of ``http://svn.example.com/repos``, and you wanted to check out the ``trunk/calc`` sub-tree, you would directly use ``repourl="http://svn.example.com/repos/trunk/calc"`` as an argument to your :bb:step:`SVN` step. hjChhhjh}rI(h]h]h]h]h]uhMh]rJ(j)rK}rL(hX ``repourl``rMhjGhhhjh}rN(h]h]h]h]h]uhMh]rOh)rP}rQ(hjMh}rR(h]h]h]h]h]uhjKh]rShXrepourlrTrU}rV(hUhjPubahhubaubj)rW}rX(hUh}rY(h]h]h]h]h]uhjGh]rZh)r[}r\(hX(required): this specifies the ``URL`` argument that will be given to the :command:`svn checkout` command. It dictates both where the repository is located and which sub-tree should be extracted. One way to specify the branch is to use ``Interpolate``. For example, if you wanted to check out the trunk repository, you could use ``repourl=Interpolate("http://svn.example.com/repos/%(src::branch)s")`` Alternatively, if you are using a remote Subversion repository which is accessible through HTTP at a URL of ``http://svn.example.com/repos``, and you wanted to check out the ``trunk/calc`` sub-tree, you would directly use ``repourl="http://svn.example.com/repos/trunk/calc"`` as an argument to your :bb:step:`SVN` step.hjWhhhhh}r](h]h]h]h]h]uhM h]r^(hX(required): this specifies the r_r`}ra(hX(required): this specifies the hj[ubh)rb}rc(hX``URL``h}rd(h]h]h]h]h]uhj[h]rehXURLrfrg}rh(hUhjbubahhubhX$ argument that will be given to the rirj}rk(hX$ argument that will be given to the hj[ubjL)rl}rm(hX:command:`svn checkout`h}rn(h]h]rojQah]h]h]uhj[h]rphX svn checkoutrqrr}rs(hUhjlubahjVubhX command. It dictates both where the repository is located and which sub-tree should be extracted. One way to specify the branch is to use rtru}rv(hX command. It dictates both where the repository is located and which sub-tree should be extracted. One way to specify the branch is to use hj[ubh)rw}rx(hX``Interpolate``h}ry(h]h]h]h]h]uhj[h]rzhX Interpolater{r|}r}(hUhjwubahhubhXN. For example, if you wanted to check out the trunk repository, you could use r~r}r(hXN. For example, if you wanted to check out the trunk repository, you could use hj[ubh)r}r(hXG``repourl=Interpolate("http://svn.example.com/repos/%(src::branch)s")``h}r(h]h]h]h]h]uhj[h]rhXCrepourl=Interpolate("http://svn.example.com/repos/%(src::branch)s")rr}r(hUhjubahhubhXm Alternatively, if you are using a remote Subversion repository which is accessible through HTTP at a URL of rr}r(hXm Alternatively, if you are using a remote Subversion repository which is accessible through HTTP at a URL of hj[ubh)r}r(hX ``http://svn.example.com/repos``h}r(h]h]h]h]h]uhj[h]rhXhttp://svn.example.com/reposrr}r(hUhjubahhubhX", and you wanted to check out the rr}r(hX", and you wanted to check out the hj[ubh)r}r(hX``trunk/calc``h}r(h]h]h]h]h]uhj[h]rhX trunk/calcrr}r(hUhjubahhubhX" sub-tree, you would directly use rr}r(hX" sub-tree, you would directly use hj[ubh)r}r(hX5``repourl="http://svn.example.com/repos/trunk/calc"``h}r(h]h]h]h]h]uhj[h]rhX1repourl="http://svn.example.com/repos/trunk/calc"rr}r(hUhjubahhubhX as an argument to your rr}r(hX as an argument to your hj[ubh)r}r(hX:bb:step:`SVN`rhj[hhhhh}r(UreftypeXstephhXSVNU refdomainXbbrh]h]U refexplicith]h]h]hhuhM h]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXSVNrr}r(hUhjubahhubaubhX step.rr}r(hX step.hj[ubeubahjubeubaubh)r}r(hXIf you are building from multiple branches, then you should create the :bb:step:`SVN` step with the ``repourl`` and provide branch information with ``Interpolate``::hj hhhhh}r(h]h]h]h]h]uhMhhh]r(hXGIf you are building from multiple branches, then you should create the rr}r(hXGIf you are building from multiple branches, then you should create the hjubh)r}r(hX:bb:step:`SVN`rhjhhhhh}r(UreftypeXstephhXSVNU refdomainXbbrh]h]U refexplicith]h]h]hhuhMh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXSVNrr}r(hUhjubahhubaubhX step with the rr}r(hX step with the hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhX% and provide branch information with rr}r(hX% and provide branch information with hjubh)r}r(hX``Interpolate``h}r(h]h]h]h]h]uhjh]rhX Interpolaterr}r(hUhjubahhubhX:r}r(hX:hjubeubjS)r}r(hXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='incremental', repourl=Interpolate('svn://svn.example.org/svn/%(src::branch)s/myproject')))hj hhhjVh}r(jXjYh]h]h]h]h]uhMhhh]rhXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='incremental', repourl=Interpolate('svn://svn.example.org/svn/%(src::branch)s/myproject')))rr}r(hUhjubaubh)r}r(hXoAlternatively, the ``repourl`` argument can be used to create the :bb:step:`SVN` step without ``Interpolate``::hj hhhhh}r(h]h]h]h]h]uhM hhh]r(hXAlternatively, the rr}r(hXAlternatively, the hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhX$ argument can be used to create the rr}r(hX$ argument can be used to create the hjubh)r}r(hX:bb:step:`SVN`rhjhhhhh}r(UreftypeXstephhXSVNU refdomainXbbrh]h]U refexplicith]h]h]hhuhM h]rh)r}r(hjh}r(h]h]r(hjXbb-stepr eh]h]h]uhjh]r hXSVNr r }r (hUhjubahhubaubhX step without rr}r(hX step without hjubh)r}r(hX``Interpolate``h}r(h]h]h]h]h]uhjh]rhX Interpolaterr}r(hUhjubahhubhX:r}r(hX:hjubeubjS)r}r(hXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='full', repourl='svn://svn.example.org/svn/myproject/trunk'))hj hhhjVh}r(jXjYh]h]h]h]h]uhM#hhh]rhXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='full', repourl='svn://svn.example.org/svn/myproject/trunk'))rr}r (hUhjubaubj)r!}r"(hUhj hhhjh}r#(h]h]h]h]h]uhNhhh]r$(j)r%}r&(hXo``username`` (optional): if specified, this will be passed to the ``svn`` binary with a ``--username`` option. hj!hhhjh}r'(h]h]h]h]h]uhM)h]r((j)r)}r*(hX ``username``r+hj%hhhjh}r,(h]h]h]h]h]uhM)h]r-h)r.}r/(hj+h}r0(h]h]h]h]h]uhj)h]r1hXusernamer2r3}r4(hUhj.ubahhubaubj)r5}r6(hUh}r7(h]h]h]h]h]uhj%h]r8h)r9}r:(hXa(optional): if specified, this will be passed to the ``svn`` binary with a ``--username`` option.hj5hhhhh}r;(h]h]h]h]h]uhM(h]r<(hX5(optional): if specified, this will be passed to the r=r>}r?(hX5(optional): if specified, this will be passed to the hj9ubh)r@}rA(hX``svn``h}rB(h]h]h]h]h]uhj9h]rChXsvnrDrE}rF(hUhj@ubahhubhX binary with a rGrH}rI(hX binary with a hj9ubh)rJ}rK(hX``--username``h}rL(h]h]h]h]h]uhj9h]rMhX --usernamerNrO}rP(hUhjJubahhubhX option.rQrR}rS(hX option.hj9ubeubahjubeubj)rT}rU(hXo``password`` (optional): if specified, this will be passed to the ``svn`` binary with a ``--password`` option. hj!hhhjh}rV(h]h]h]h]h]uhM-hhh]rW(j)rX}rY(hX ``password``rZhjThhhjh}r[(h]h]h]h]h]uhM-h]r\h)r]}r^(hjZh}r_(h]h]h]h]h]uhjXh]r`hXpasswordrarb}rc(hUhj]ubahhubaubj)rd}re(hUh}rf(h]h]h]h]h]uhjTh]rgh)rh}ri(hXa(optional): if specified, this will be passed to the ``svn`` binary with a ``--password`` option.hjdhhhhh}rj(h]h]h]h]h]uhM,h]rk(hX5(optional): if specified, this will be passed to the rlrm}rn(hX5(optional): if specified, this will be passed to the hjhubh)ro}rp(hX``svn``h}rq(h]h]h]h]h]uhjhh]rrhXsvnrsrt}ru(hUhjoubahhubhX binary with a rvrw}rx(hX binary with a hjhubh)ry}rz(hX``--password``h}r{(h]h]h]h]h]uhjhh]r|hX --passwordr}r~}r(hUhjyubahhubhX option.rr}r(hX option.hjhubeubahjubeubj)r}r(hX{``extra_args`` (optional): if specified, an array of strings that will be passed as extra arguments to the ``svn`` binary. hj!hhhjh}r(h]h]h]h]h]uhM1hhh]r(j)r}r(hX``extra_args``rhjhhhjh}r(h]h]h]h]h]uhM1h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX extra_argsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXk(optional): if specified, an array of strings that will be passed as extra arguments to the ``svn`` binary.hjhhhhh}r(h]h]h]h]h]uhM0h]r(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the rr}r(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the hjubh)r}r(hX``svn``h}r(h]h]h]h]h]uhjh]rhXsvnrr}r(hUhjubahhubhX binary.rr}r(hX binary.hjubeubahjubeubj)r}r(hX``keep_on_purge`` (optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds. hj!hhhjh}r(h]h]h]h]h]uhM5hhh]r(j)r}r(hX``keep_on_purge``rhjhhhjh}r(h]h]h]h]h]uhM5h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX keep_on_purgerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.rhjhhhhh}r(h]h]h]h]h]uhM4h]rhX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.rr}r(hjhjubaubahjubeubj)r}r(hX``depth`` (optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher. If set to ``empty`` updates will not pull in any files or subdirectories not already present. If set to ``files``, updates will pull in any files not already present, but not directories. If set to ``immediates``, updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to ``infinity``, updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument. hj!hhhjh}r(h]h]h]h]h]uhMChhh]r(j)r}r(hX ``depth``rhjhhhjh}r(h]h]h]h]h]uhMCh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXdepthrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(h)r}r(hXt(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.rhjhhhhh}r(h]h]h]h]h]uhM8h]rhXt(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.rr}r(hjhjubaubh)r}r(hX8If set to ``empty`` updates will not pull in any files or subdirectories not already present. If set to ``files``, updates will pull in any files not already present, but not directories. If set to ``immediates``, updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to ``infinity``, updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.hjhhhhh}r(h]h]h]h]h]uhM;h]r(hX If set to rr}r(hX If set to hjubh)r}r(hX ``empty``h}r(h]h]h]h]h]uhjh]rhXemptyrr}r(hUhjubahhubhXU updates will not pull in any files or subdirectories not already present. If set to rr}r(hXU updates will not pull in any files or subdirectories not already present. If set to hjubh)r}r(hX ``files``h}r(h]h]h]h]h]uhjh]rhXfilesrr}r(hUhjubahhubhXV, updates will pull in any files not already present, but not directories. If set to rr}r(hXV, updates will pull in any files not already present, but not directories. If set to hjubh)r}r(hX``immediates``h}r(h]h]h]h]h]uhjh]rhX immediatesrr}r(hUhjubahhubhX, updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to rr}r(hX, updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to hjubh)r}r(hX ``infinity``h}r(h]h]h]h]h]uhjh]rhXinfinityr r }r (hUhjubahhubhX, updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.r r }r(hX, updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.hjubeubehjubeubj)r}r(hX``preferLastChangedRev`` (optional): By default, the ``got_revision`` property is set to the repository's global revision ("Revision" in the `svn info` output). Set this parameter to ``True`` to have it set to the "Last Changed Rev" instead. hj!hhhjh}r(h]h]h]h]h]uhMHhhh]r(j)r}r(hX``preferLastChangedRev``rhjhhhjh}r(h]h]h]h]h]uhMHh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXpreferLastChangedRevrr}r(hUhjubahhubaubj)r}r (hUh}r!(h]h]h]h]h]uhjh]r"h)r#}r$(hX(optional): By default, the ``got_revision`` property is set to the repository's global revision ("Revision" in the `svn info` output). Set this parameter to ``True`` to have it set to the "Last Changed Rev" instead.hjhhhhh}r%(h]h]h]h]h]uhMFh]r&(hX(optional): By default, the r'r(}r)(hX(optional): By default, the hj#ubh)r*}r+(hX``got_revision``h}r,(h]h]h]h]h]uhj#h]r-hX got_revisionr.r/}r0(hUhj*ubahhubhXH property is set to the repository's global revision ("Revision" in the r1r2}r3(hXH property is set to the repository's global revision ("Revision" in the hj#ubjE)r4}r5(hX `svn info`h}r6(h]h]h]h]h]uhj#h]r7hXsvn infor8r9}r:(hUhj4ubahjMubhX output). Set this parameter to r;r<}r=(hX output). Set this parameter to hj#ubh)r>}r?(hX``True``h}r@(h]h]h]h]h]uhj#h]rAhXTruerBrC}rD(hUhj>ubahhubhX2 to have it set to the "Last Changed Rev" instead.rErF}rG(hX2 to have it set to the "Last Changed Rev" instead.hj#ubeubahjubeubeubh)rH}rI(hX``mode`` ``method``hj hhhhh}rJ(h]h]h]h]h]uhMJhhh]rK(h)rL}rM(hX``mode``h}rN(h]h]h]h]h]uhjHh]rOhXmoderPrQ}rR(hUhjLubahhubhX rS}rT(hX hjHubh)rU}rV(hX ``method``h}rW(h]h]h]h]h]uhjHh]rXhXmethodrYrZ}r[(hUhjUubahhubeubjx)r\}r](hUhj hNhj{h}r^(h]h]h]h]h]uhNhhh]r_(h)r`}ra(hXZSVN's incremental mode does not require a method. The full mode has five methods defined:rbhj\hhhhh}rc(h]h]h]h]h]uhMMh]rdhXZSVN's incremental mode does not require a method. The full mode has five methods defined:rerf}rg(hjbhj`ubaubj)rh}ri(hUh}rj(h]h]h]h]h]uhj\h]rk(j)rl}rm(hXV``clobber`` It removes the working directory for each build then makes full checkout. hjhhhhjh}rn(h]h]h]h]h]uhMQh]ro(j)rp}rq(hX ``clobber``rrhjlhhhjh}rs(h]h]h]h]h]uhMQh]rth)ru}rv(hjrh}rw(h]h]h]h]h]uhjph]rxhXclobberryrz}r{(hUhjuubahhubaubj)r|}r}(hUh}r~(h]h]h]h]h]uhjlh]rh)r}r(hXIIt removes the working directory for each build then makes full checkout.rhj|hhhhh}r(h]h]h]h]h]uhMQh]rhXIIt removes the working directory for each build then makes full checkout.rr}r(hjhjubaubahjubeubj)r}r(hX``fresh`` This always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a :command:`svn status --no-ignore`. This is equivalent to the old update mode with ``always_purge``. hjhhhhjh}r(h]h]h]h]h]uhMWh]r(j)r}r(hX ``fresh``rhjhhhjh}r(h]h]h]h]h]uhMWh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXThis always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a :command:`svn status --no-ignore`. This is equivalent to the old update mode with ``always_purge``.hjhhhhh}r(h]h]h]h]h]uhMTh]r(hXThis always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a rr}r(hXThis always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a hjubjL)r}r(hX!:command:`svn status --no-ignore`h}r(h]h]rjQah]h]h]uhjh]rhXsvn status --no-ignorerr}r(hUhjubahjVubhX1. This is equivalent to the old update mode with rr}r(hX1. This is equivalent to the old update mode with hjubh)r}r(hX``always_purge``h}r(h]h]h]h]h]uhjh]rhX always_purgerr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(hXq``clean`` This is same as fresh except that it deletes all unversioned files generated by :command:`svn status`. hjhhhhjh}r(h]h]h]h]h]uhM[h]r(j)r}r(hX ``clean``rhjhhhjh}r(h]h]h]h]h]uhM[h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXcleanrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXfThis is same as fresh except that it deletes all unversioned files generated by :command:`svn status`.hjhhhhh}r(h]h]h]h]h]uhMZh]r(hXPThis is same as fresh except that it deletes all unversioned files generated by rr}r(hXPThis is same as fresh except that it deletes all unversioned files generated by hjubjL)r}r(hX:command:`svn status`h}r(h]h]rjQah]h]h]uhjh]rhX svn statusrr}r(hUhjubahjVubhX.r}r(hX.hjubeubahjubeubj)r}r(hX``copy`` This first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory. hjhhhhjh}r(h]h]h]h]h]uhMdh]r(j)r}r(hX``copy``rhjhhhjh}r(h]h]h]h]h]uhMdh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXcopyrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXThis first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory.hjhhhhh}r(h]h]h]h]h]uhM^h]r(hX?This first checkout source into source directory then copy the rr}r(hX?This first checkout source into source directory then copy the hjubh)r}r(hX ``source``h}r(h]h]h]h]h]uhjh]rhXsourcerr}r(hUhjubahhubhX directory to rr}r(hX directory to hjubh)r}r(hX ``build``h}r(h]h]h]h]h]uhjh]rhXbuildrr}r(hUhjubahhubhX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in rr }r (hX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in hjubh)r }r (hX ``source``h}r (h]h]h]h]h]uhjh]rhXsourcerr}r(hUhj ubahhubhX directory.rr}r(hX directory.hjubeubahjubeubj)r}r(hX``export`` Similar to ``method='copy'``, except using ``svn export`` to create build directory so that there are no ``.svn`` directories in the build directory. hjhhhhjh}r(h]h]h]h]h]uhMih]r(j)r}r(hX ``export``rhjhhhjh}r(h]h]h]h]h]uhMih]rh)r}r(hjh}r (h]h]h]h]h]uhjh]r!hXexportr"r#}r$(hUhjubahhubaubj)r%}r&(hUh}r'(h]h]h]h]h]uhjh]r(h)r)}r*(hXSimilar to ``method='copy'``, except using ``svn export`` to create build directory so that there are no ``.svn`` directories in the build directory.hj%hhhhh}r+(h]h]h]h]h]uhMgh]r,(hX Similar to r-r.}r/(hX Similar to hj)ubh)r0}r1(hX``method='copy'``h}r2(h]h]h]h]h]uhj)h]r3hX method='copy'r4r5}r6(hUhj0ubahhubhX, except using r7r8}r9(hX, except using hj)ubh)r:}r;(hX``svn export``h}r<(h]h]h]h]h]uhj)h]r=hX svn exportr>r?}r@(hUhj:ubahhubhX0 to create build directory so that there are no rArB}rC(hX0 to create build directory so that there are no hj)ubh)rD}rE(hX``.svn``h}rF(h]h]h]h]h]uhj)h]rGhX.svnrHrI}rJ(hUhjDubahhubhX$ directories in the build directory.rKrL}rM(hX$ directories in the build directory.hj)ubeubahjubeubehjubeubh)rN}rO(hXnIf you are using branches, you must also make sure your ``ChangeSource`` will report the correct branch names.hj hhhhh}rP(h]h]h]h]h]uhMkhhh]rQ(hX8If you are using branches, you must also make sure your rRrS}rT(hX8If you are using branches, you must also make sure your hjNubh)rU}rV(hX``ChangeSource``h}rW(h]h]h]h]h]uhjNh]rXhX ChangeSourcerYrZ}r[(hUhjUubahhubhX& will report the correct branch names.r\r]}r^(hX& will report the correct branch names.hjNubeubj)r_}r`(hUhj hhhj h}ra(h]h]h]h]h]Uentries]rb((UsingleXBuild Steps; CVSXstep-CVSrcjctrd(UsingleXCVS Build StepjcjctreeuhMohhh]ubh)rf}rg(hUhj hhhhh}rh(h]h]h]h]h]hjcuhMohhh]ubj eubhhh}hhh}ri(h]h]h]h]h]hUstep-cvsrjuhMphhh}rkjcjfsh]ubshhh}rl(h]rmXcvsrnah]h]h]ro(jjjjceh]rph auhMshhh}rq(jcjfjjj uh]rr(h)rs}rt(hjhj hhhhh}ru(h]h]h]h]h]hjuhMshhh]rvhXCVSrwrx}ry(hjhjsubaubj)rz}r{(hUhj hNhj h}r|(h]h]h]h]h]Uentries]r}(jX>buildbot.steps.source.cvs.CVS (class in buildbot.steps.source)hJUtr~auhNhhh]ubj )r}r(hUhj hNhj h}r(j j Xpyh]h]h]h]h]j Xclassrj juhNhhh]r(j )r}r(hXbuildbot.steps.source.cvs.CVShjhhhj h}r(h]rhJaj j h]h]h]h]rhJaj Xbuildbot.steps.source.cvs.CVSj Xbuildbot.steps.source.cvsj uhMvhhh]r(j )r}r(hXclass hjhhhj h}r(h]h]h]h]h]uhMvhhh]rhXclass rr}r(hUhjubaubj )r}r(hXbuildbot.steps.source.cvs.hjhhhj h}r(h]h]h]h]h]uhMvhhh]rhXbuildbot.steps.source.cvs.rr}r(hUhjubaubj )r}r(hXCVShjhhhj h}r(h]h]h]h]h]uhMvhhh]rhXCVSrr}r(hUhjubaubeubj )r}r(hUhjhhhj h}r(h]h]h]h]h]uhMvhhh]ubeubh)r}r(hXcThe :bb:step:`CVS` build step performs a `CVS `_ checkout or update. ::hj hhhhh}r(h]h]h]h]h]uhMwhhh]r(hXThe rr}r(hXThe hjubh)r}r(hX:bb:step:`CVS`rhjhhhhh}r(UreftypeXstephhXCVSU refdomainXbbrh]h]U refexplicith]h]h]hhuhMwh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXCVSrr}r(hUhjubahhubaubhX build step performs a rr}r(hX build step performs a hjubjM)r}r(hX#`CVS `_h}r(UnameXCVSj Xhttp://www.nongnu.org/cvs/rh]h]h]h]h]uhjh]rhXCVSrr}r(hUhjubahjYubh)r}r(hX hKhjhhh}r(Urefurijh]rUid6rah]h]h]h]rjnauh]ubhX checkout or update.rr}r(hX checkout or update.hjubeubjS)r}r(hXfrom buildbot.steps.source.cvs import CVS factory.addStep(CVS(mode='incremental', cvsroot=':pserver:me@cvs.sourceforge.net:/cvsroot/myproj', cvsmodule='buildbot'))hj hhhjVh}r(jXjYh]h]h]h]h]uhMzhhh]rhXfrom buildbot.steps.source.cvs import CVS factory.addStep(CVS(mode='incremental', cvsroot=':pserver:me@cvs.sourceforge.net:/cvsroot/myproj', cvsmodule='buildbot'))rr}r(hUhjubaubh)r}r(hX(This step takes the following arguments:rhj hhhhh}r(h]h]h]h]h]uhMhhh]rhX(This step takes the following arguments:rr}r(hjhjubaubj)r}r(hUhj hhhjh}r(h]h]h]h]h]uhNhhh]r(j)r}r(hX4``cvsroot`` (required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, if Buildbot was hosted in CVS then the cvsroot value you would use to get a copy of the Buildbot source code might be ``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot``. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``cvsroot``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXcvsrootrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX'(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, if Buildbot was hosted in CVS then the cvsroot value you would use to get a copy of the Buildbot source code might be ``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot``.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, if Buildbot was hosted in CVS then the cvsroot value you would use to get a copy of the Buildbot source code might be rr}r(hX(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, if Buildbot was hosted in CVS then the cvsroot value you would use to get a copy of the Buildbot source code might be hjubh)r}r(hX<``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot``h}r(h]h]h]h]h]uhjh]rhX8:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbotrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(hX``cvsmodule`` (required): specify the cvs ``module``, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is ``buildbot``. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``cvsmodule``r hjhhhjh}r (h]h]h]h]h]uhMh]r h)r }r (hj h}r(h]h]h]h]h]uhjh]rhX cvsmodulerr}r(hUhj ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(required): specify the cvs ``module``, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is ``buildbot``.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(required): specify the cvs rr}r(hX(required): specify the cvs hjubh)r}r(hX ``module``h}r (h]h]h]h]h]uhjh]r!hXmoduler"r#}r$(hUhjubahhubhXb, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is r%r&}r'(hXb, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is hjubh)r(}r)(hX ``buildbot``h}r*(h]h]h]h]h]uhjh]r+hXbuildbotr,r-}r.(hUhj(ubahhubhX.r/}r0(hX.hjubeubahjubeubj)r1}r2(hX``branch`` a string which will be used in a ``-r`` argument. This is most useful for specifying a branch to work on. Defaults to ``HEAD``. hjhhhjh}r3(h]h]h]h]h]uhMhhh]r4(j)r5}r6(hX ``branch``r7hj1hhhjh}r8(h]h]h]h]h]uhMh]r9h)r:}r;(hj7h}r<(h]h]h]h]h]uhj5h]r=hXbranchr>r?}r@(hUhj:ubahhubaubj)rA}rB(hUh}rC(h]h]h]h]h]uhj1h]rDh)rE}rF(hXa string which will be used in a ``-r`` argument. This is most useful for specifying a branch to work on. Defaults to ``HEAD``.hjAhhhhh}rG(h]h]h]h]h]uhMh]rH(hX!a string which will be used in a rIrJ}rK(hX!a string which will be used in a hjEubh)rL}rM(hX``-r``h}rN(h]h]h]h]h]uhjEh]rOhX-rrPrQ}rR(hUhjLubahhubhXO argument. This is most useful for specifying a branch to work on. Defaults to rSrT}rU(hXO argument. This is most useful for specifying a branch to work on. Defaults to hjEubh)rV}rW(hX``HEAD``h}rX(h]h]h]h]h]uhjEh]rYhXHEADrZr[}r\(hUhjVubahhubhX.r]}r^(hX.hjEubeubahjubeubj)r_}r`(hXb``global_options`` a list of flags to be put before the argument ``checkout`` in the CVS command. hjhhhjh}ra(h]h]h]h]h]uhMhhh]rb(j)rc}rd(hX``global_options``rehj_hhhjh}rf(h]h]h]h]h]uhMh]rgh)rh}ri(hjeh}rj(h]h]h]h]h]uhjch]rkhXglobal_optionsrlrm}rn(hUhjhubahhubaubj)ro}rp(hUh}rq(h]h]h]h]h]uhj_h]rrh)rs}rt(hXNa list of flags to be put before the argument ``checkout`` in the CVS command.hjohhhhh}ru(h]h]h]h]h]uhMh]rv(hX.a list of flags to be put before the argument rwrx}ry(hX.a list of flags to be put before the argument hjsubh)rz}r{(hX ``checkout``h}r|(h]h]h]h]h]uhjsh]r}hXcheckoutr~r}r(hUhjzubahhubhX in the CVS command.rr}r(hX in the CVS command.hjsubeubahjubeubj)r}r(hXW``extra_options`` a list of flags to be put after the ``checkout`` in the CVS command. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``extra_options``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX extra_optionsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXDa list of flags to be put after the ``checkout`` in the CVS command.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX$a list of flags to be put after the rr}r(hX$a list of flags to be put after the hjubh)r}r(hX ``checkout``h}r(h]h]h]h]h]uhjh]rhXcheckoutrr}r(hUhjubahhubhX in the CVS command.rr}r(hX in the CVS command.hjubeubahjubeubeubh)r}r(hX``mode`` ``method``hj hhhhh}r(h]h]h]h]h]uhMhhh]r(h)r}r(hX``mode``h}r(h]h]h]h]h]uhjh]rhXmoderr}r(hUhjubahhubhX r}r(hX hjubh)r}r(hX ``method``h}r(h]h]h]h]h]uhjh]rhXmethodrr}r(hUhjubahhubeubjx)r}r(hUhj hNhj{h}r(h]h]h]h]h]uhNhhh]r(h)r}r(hXNo method is needed for incremental mode. For full mode, ``method`` can take the values shown below. If no value is given, it defaults to ``fresh``.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX:No method is needed for incremental mode. For full mode, rr}r(hX:No method is needed for incremental mode. For full mode, hjubh)r}r(hX ``method``h}r(h]h]h]h]h]uhjh]rhXmethodrr}r(hUhjubahhubhXG can take the values shown below. If no value is given, it defaults to rr}r(hXG can take the values shown below. If no value is given, it defaults to hjubh)r}r(hX ``fresh``h}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhjubahhubhX.r}r(hX.hjubeubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hXO``clobber`` This specifies to remove the ``workdir`` and make a full checkout. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``clobber``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXclobberrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXBThis specifies to remove the ``workdir`` and make a full checkout.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXThis specifies to remove the rr}r(hXThis specifies to remove the hjubh)r}r(hX ``workdir``h}r(h]h]h]h]h]uhjh]rhXworkdirrr}r(hUhjubahhubhX and make a full checkout.rr}r(hX and make a full checkout.hjubeubahjubeubj)r}r(hX``fresh`` This method first runs ``cvsdisard`` in the build directory, then updates it. This requires ``cvsdiscard`` which is a part of the cvsutil package. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r (hX ``fresh``r hjhhhjh}r (h]h]h]h]h]uhMh]r h)r }r(hj h}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhj ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXThis method first runs ``cvsdisard`` in the build directory, then updates it. This requires ``cvsdiscard`` which is a part of the cvsutil package.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXThis method first runs rr}r(hXThis method first runs hjubh)r}r (hX ``cvsdisard``h}r!(h]h]h]h]h]uhjh]r"hX cvsdisardr#r$}r%(hUhjubahhubhX9 in the build directory, then updates it. This requires r&r'}r((hX9 in the build directory, then updates it. This requires hjubh)r)}r*(hX``cvsdiscard``h}r+(h]h]h]h]h]uhjh]r,hX cvsdiscardr-r.}r/(hUhj)ubahhubhX( which is a part of the cvsutil package.r0r1}r2(hX( which is a part of the cvsutil package.hjubeubahjubeubj)r3}r4(hXx``clean`` This method is the same as ``method='fresh'``, but it runs ``cvsdiscard --ignore`` instead of ``cvsdiscard``. hjhhhjh}r5(h]h]h]h]h]uhMh]r6(j)r7}r8(hX ``clean``r9hj3hhhjh}r:(h]h]h]h]h]uhMh]r;h)r<}r=(hj9h}r>(h]h]h]h]h]uhj7h]r?hXcleanr@rA}rB(hUhj<ubahhubaubj)rC}rD(hUh}rE(h]h]h]h]h]uhj3h]rFh)rG}rH(hXmThis method is the same as ``method='fresh'``, but it runs ``cvsdiscard --ignore`` instead of ``cvsdiscard``.hjChhhhh}rI(h]h]h]h]h]uhMh]rJ(hXThis method is the same as rKrL}rM(hXThis method is the same as hjGubh)rN}rO(hX``method='fresh'``h}rP(h]h]h]h]h]uhjGh]rQhXmethod='fresh'rRrS}rT(hUhjNubahhubhX, but it runs rUrV}rW(hX, but it runs hjGubh)rX}rY(hX``cvsdiscard --ignore``h}rZ(h]h]h]h]h]uhjGh]r[hXcvsdiscard --ignorer\r]}r^(hUhjXubahhubhX instead of r_r`}ra(hX instead of hjGubh)rb}rc(hX``cvsdiscard``h}rd(h]h]h]h]h]uhjGh]rehX cvsdiscardrfrg}rh(hUhjbubahhubhX.ri}rj(hX.hjGubeubahjubeubj)rk}rl(hX``copy`` This maintains a ``source`` directory for source, which it updates copies to the build directory. This allows Buildbot to start with a fresh directory, without downloading the entire repository on every build. hjhhhjh}rm(h]h]h]h]h]uhMh]rn(j)ro}rp(hX``copy``rqhjkhhhjh}rr(h]h]h]h]h]uhMh]rsh)rt}ru(hjqh}rv(h]h]h]h]h]uhjoh]rwhXcopyrxry}rz(hUhjtubahhubaubj)r{}r|(hUh}r}(h]h]h]h]h]uhjkh]r~h)r}r(hXThis maintains a ``source`` directory for source, which it updates copies to the build directory. This allows Buildbot to start with a fresh directory, without downloading the entire repository on every build.hj{hhhhh}r(h]h]h]h]h]uhMh]r(hXThis maintains a rr}r(hXThis maintains a hjubh)r}r(hX ``source``h}r(h]h]h]h]h]uhjh]rhXsourcerr}r(hUhjubahhubhX directory for source, which it updates copies to the build directory. This allows Buildbot to start with a fresh directory, without downloading the entire repository on every build.rr}r(hX directory for source, which it updates copies to the build directory. This allows Buildbot to start with a fresh directory, without downloading the entire repository on every build.hjubeubahjubeubehjubeubj)r}r(hUhj hhhj h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; BzrXstep-Bzrrjtr(UsingleXBzr Build StepjjtreuhMhhh]ubh)r}r(hUhj hhhhh}r(h]h]h]h]h]hjuhMhhh]ubj eubhhh}hhh}r(h]h]h]h]h]hUstep-bzrruhMhhh}rjjsh]ubshhh}r(h]h]h]h]r(jjjeh]r(hheuhMhhh}r(jjjj uh]r(h)r}r(hjhj hhhhh}r(h]h]h]h]h]hjuhMhhh]rhXBzrrr}r(hjhjubaubj)r}r(hUhj hNhj h}r(h]h]h]h]h]Uentries]r(jX>buildbot.steps.source.bzr.Bzr (class in buildbot.steps.source)hUtrauhNhhh]ubj )r}r(hUhj hNhj h}r(j j Xpyh]h]h]h]h]j Xclassrj juhNhhh]r(j )r}r(hXbuildbot.steps.source.bzr.Bzrhjhhhj h}r(h]rhaj j h]h]h]h]rhaj Xbuildbot.steps.source.bzr.Bzrj Xbuildbot.steps.source.bzrj uhMhhh]r(j )r}r(hXclass hjhhhj h}r(h]h]h]h]h]uhMhhh]rhXclass rr}r(hUhjubaubj )r}r(hXbuildbot.steps.source.bzr.hjhhhj h}r(h]h]h]h]h]uhMhhh]rhXbuildbot.steps.source.bzr.rr}r(hUhjubaubj )r}r(hXBzrhjhhhj h}r(h]h]h]h]h]uhMhhh]rhXBzrrr}r(hUhjubaubeubj )r}r(hUhjhhhj h}r(h]h]h]h]h]uhMhhh]ubeubh)r}r(hX5bzr is a descendant of Arch/Baz, and is frequently referred to as simply `Bazaar`. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial. ::hj hhhhh}r(h]h]h]h]h]uhMhhh]r(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply rr}r(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply hjubjE)r}r(hX`Bazaar`h}r(h]h]h]h]h]uhjh]rhXBazaarrr}r(hUhjubahjMubhX. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial.rr}r(hX. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial.hjubeubjS)r}r(hXfrom buildbot.steps.source.bzr import Bzr factory.addStep(Bzr(mode='incremental', repourl='lp:~knielsen/maria/tmp-buildbot-test'))hj hhhjVh}r(jXjYh]h]h]h]h]uhMhhh]rhXfrom buildbot.steps.source.bzr import Bzr factory.addStep(Bzr(mode='incremental', repourl='lp:~knielsen/maria/tmp-buildbot-test'))rr}r(hUhjubaubh)r}r(hX'The step takes the following arguments:rhj hhhhh}r(h]h]h]h]h]uhMhhh]rhX'The step takes the following arguments:rr}r(hjhjubaubj)r}r(hUhj hhhjh}r(h]h]h]h]h]uhNhhh]r(j)r}r(hXp``repourl`` (required unless ``baseURL`` is provided): the URL at which the Bzr source repository is available. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``repourl``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r }r (hXc(required unless ``baseURL`` is provided): the URL at which the Bzr source repository is available.hjhhhhh}r (h]h]h]h]h]uhMh]r (hX(required unless r r}r(hX(required unless hj ubh)r}r(hX ``baseURL``h}r(h]h]h]h]h]uhj h]rhXbaseURLrr}r(hUhjubahhubhXG is provided): the URL at which the Bzr source repository is available.rr}r(hXG is provided): the URL at which the Bzr source repository is available.hj ubeubahjubeubj)r}r(hX``baseURL`` (required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``baseURL``r hjhhhjh}r!(h]h]h]h]h]uhMh]r"h)r#}r$(hj h}r%(h]h]h]h]h]uhjh]r&hXbaseURLr'r(}r)(hUhj#ubahhubaubj)r*}r+(hUh}r,(h]h]h]h]h]uhjh]r-h)r.}r/(hX(required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj*hhhhh}r0(h]h]h]h]h]uhMh]r1(hX(required unless r2r3}r4(hX(required unless hj.ubh)r5}r6(hX ``repourl``h}r7(h]h]h]h]h]uhj.h]r8hXrepourlr9r:}r;(hUhj5ubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.r<r=}r>(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj.ubeubahjubeubj)r?}r@(hX``defaultBranch`` (allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``bzr checkout`` command. hjhhhjh}rA(h]h]h]h]h]uhMhhh]rB(j)rC}rD(hX``defaultBranch``rEhj?hhhjh}rF(h]h]h]h]h]uhMh]rGh)rH}rI(hjEh}rJ(h]h]h]h]h]uhjCh]rKhX defaultBranchrLrM}rN(hUhjHubahhubaubj)rO}rP(hUh}rQ(h]h]h]h]h]uhj?h]rRh)rS}rT(hX(allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``bzr checkout`` command.hjOhhhhh}rU(h]h]h]h]h]uhMh]rV(hX(allowed if and only if rWrX}rY(hX(allowed if and only if hjSubh)rZ}r[(hX ``baseURL``h}r\(h]h]h]h]h]uhjSh]r]hXbaseURLr^r_}r`(hUhjZubahhubhX is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to rarb}rc(hX is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to hjSubh)rd}re(hX ``baseURL``h}rf(h]h]h]h]h]uhjSh]rghXbaseURLrhri}rj(hUhjdubahhubhX1 to create the string that will be passed to the rkrl}rm(hX1 to create the string that will be passed to the hjSubh)rn}ro(hX``bzr checkout``h}rp(h]h]h]h]h]uhjSh]rqhX bzr checkoutrrrs}rt(hUhjnubahhubhX command.rurv}rw(hX command.hjSubeubahjubeubeubh)rx}ry(hX``mode`` ``method``hj hhhhh}rz(h]h]h]h]h]uhMhhh]r{(h)r|}r}(hX``mode``h}r~(h]h]h]h]h]uhjxh]rhXmoderr}r(hUhj|ubahhubhX r}r(hX hjxubh)r}r(hX ``method``h}r(h]h]h]h]h]uhjxh]rhXmethodrr}r(hUhjubahhubeubjx)r}r(hUhj hNhj{h}r(h]h]h]h]h]uhNhhh]r(h)r}r(hXNo method is needed for incremental mode. For full mode, ``method`` can take the values shown below. If no value is given, it defaults to ``fresh``.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX:No method is needed for incremental mode. For full mode, rr}r(hX:No method is needed for incremental mode. For full mode, hjubh)r}r(hX ``method``h}r(h]h]h]h]h]uhjh]rhXmethodrr}r(hUhjubahhubhXG can take the values shown below. If no value is given, it defaults to rr}r(hXG can take the values shown below. If no value is given, it defaults to hjubh)r}r(hX ``fresh``h}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhjubahhubhX.r}r(hX.hjubeubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hXO``clobber`` This specifies to remove the ``workdir`` and make a full checkout. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``clobber``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXclobberrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXBThis specifies to remove the ``workdir`` and make a full checkout.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXThis specifies to remove the rr}r(hXThis specifies to remove the hjubh)r}r(hX ``workdir``h}r(h]h]h]h]h]uhjh]rhXworkdirrr}r(hUhjubahhubhX and make a full checkout.rr}r(hX and make a full checkout.hjubeubahjubeubj)r}r(hX``fresh`` This method first runs ``bzr clean-tree`` to remove all the unversioned files then ``update`` the repo. This remove all unversioned files including those in .bzrignore. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``fresh``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXfreshrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXThis method first runs ``bzr clean-tree`` to remove all the unversioned files then ``update`` the repo. This remove all unversioned files including those in .bzrignore.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXThis method first runs rr}r(hXThis method first runs hjubh)r}r(hX``bzr clean-tree``h}r(h]h]h]h]h]uhjh]rhXbzr clean-treerr}r(hUhjubahhubhX* to remove all the unversioned files then rr}r(hX* to remove all the unversioned files then hjubh)r}r(hX ``update``h}r(h]h]h]h]h]uhjh]rhXupdaterr}r(hUhjubahhubhXK the repo. This remove all unversioned files including those in .bzrignore.rr}r(hXK the repo. This remove all unversioned files including those in .bzrignore.hjubeubahjubeubj)r}r(hX``clean`` This is same as fresh except that it doesn't remove the files mentioned in .bzrginore i.e, by running ``bzr clean-tree --ignore``. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``clean``rhjhhhjh}r (h]h]h]h]h]uhMh]r h)r }r (hjh}r (h]h]h]h]h]uhjh]rhXcleanrr}r(hUhj ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXThis is same as fresh except that it doesn't remove the files mentioned in .bzrginore i.e, by running ``bzr clean-tree --ignore``.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXfThis is same as fresh except that it doesn't remove the files mentioned in .bzrginore i.e, by running rr}r(hXfThis is same as fresh except that it doesn't remove the files mentioned in .bzrginore i.e, by running hjubh)r}r(hX``bzr clean-tree --ignore``h}r(h]h]h]h]h]uhjh]r hXbzr clean-tree --ignorer!r"}r#(hUhjubahhubhX.r$}r%(hX.hjubeubahjubeubj)r&}r'(hX``copy`` A local bzr repository is maintained and the repo is copied to ``build`` directory for each build. Before each build the local bzr repo is updated then copied to ``build`` for next steps. hjhhhjh}r((h]h]h]h]h]uhMh]r)(j)r*}r+(hX``copy``r,hj&hhhjh}r-(h]h]h]h]h]uhMh]r.h)r/}r0(hj,h}r1(h]h]h]h]h]uhj*h]r2hXcopyr3r4}r5(hUhj/ubahhubaubj)r6}r7(hUh}r8(h]h]h]h]h]uhj&h]r9h)r:}r;(hXA local bzr repository is maintained and the repo is copied to ``build`` directory for each build. Before each build the local bzr repo is updated then copied to ``build`` for next steps.hj6hhhhh}r<(h]h]h]h]h]uhMh]r=(hX?A local bzr repository is maintained and the repo is copied to r>r?}r@(hX?A local bzr repository is maintained and the repo is copied to hj:ubh)rA}rB(hX ``build``h}rC(h]h]h]h]h]uhj:h]rDhXbuildrErF}rG(hUhjAubahhubhXZ directory for each build. Before each build the local bzr repo is updated then copied to rHrI}rJ(hXZ directory for each build. Before each build the local bzr repo is updated then copied to hj:ubh)rK}rL(hX ``build``h}rM(h]h]h]h]h]uhj:h]rNhXbuildrOrP}rQ(hUhjKubahhubhX for next steps.rRrS}rT(hX for next steps.hj:ubeubahjubeubehjubeubj)rU}rV(hUhj hhhj h}rW(h]h]h]h]h]Uentries]rX((UsingleXBuild Steps; P4j j trY(UsingleX P4 Build Stepj j trZeuhMhhh]ubj eubhhhhh}r[(h]h]h]h]h]hj uhMhhh]ubsh]r\(h)r]}r^(hjhj| hhhhh}r_(h]h]h]h]h]hjuhMhhh]r`hXP4rarb}rc(hjhj]ubaubj)rd}re(hUhj| hNhj h}rf(h]h]h]h]h]Uentries]rg(jX<buildbot.steps.source.p4.P4 (class in buildbot.steps.source)h.UtrhauhNhhh]ubj )ri}rj(hUhj| hNhj h}rk(j j Xpyh]h]h]h]h]j Xclassrlj jluhNhhh]rm(j )rn}ro(hXbuildbot.steps.source.p4.P4hjihhhj h}rp(h]rqh.aj j h]h]h]h]rrh.aj Xbuildbot.steps.source.p4.P4j Xbuildbot.steps.source.p4j uhMhhh]rs(j )rt}ru(hXclass hjnhhhj h}rv(h]h]h]h]h]uhMhhh]rwhXclass rxry}rz(hUhjtubaubj )r{}r|(hXbuildbot.steps.source.p4.hjnhhhj h}r}(h]h]h]h]h]uhMhhh]r~hXbuildbot.steps.source.p4.rr}r(hUhj{ubaubj )r}r(hXP4hjnhhhj h}r(h]h]h]h]h]uhMhhh]rhXP4rr}r(hUhjubaubeubj )r}r(hUhjihhhj h}r(h]h]h]h]h]uhMhhh]ubeubh)r}r(hX}The :bb:step:`P4` build step creates a `Perforce `_ client specification and performs an update. ::hj| hhhhh}r(h]h]h]h]h]uhMhhh]r(hXThe rr}r(hXThe hjubh)r}r(hX :bb:step:`P4`rhjhhhhh}r(UreftypeXstephhXP4U refdomainXbbrh]h]U refexplicith]h]h]hhuhMh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXP4rr}r(hUhjubahhubaubhX build step creates a rr}r(hX build step creates a hjubjM)r}r(hX&`Perforce `_h}r(UnameXPerforcej Xhttp://www.perforce.com/rh]h]h]h]h]uhjh]rhXPerforcerr}r(hUhjubahjYubh)r}r(hX hKhjhhh}r(Urefurijh]rUperforcerah]h]h]h]rh^auh]ubhX- client specification and performs an update.rr}r(hX- client specification and performs an update.hjubeubjS)r}r(hXOfrom buildbot.steps.source.p4 import P4 factory.addStep(P4(p4port=p4port, p4client=WithProperties('%(P4USER)s-%(slavename)s-%(buildername)s'), p4user=p4user, p4base='//depot', p4viewspec=p4viewspec, mode='incremental', ))hj| hhhjVh}r(jXjYh]h]h]h]h]uhMhhh]rhXOfrom buildbot.steps.source.p4 import P4 factory.addStep(P4(p4port=p4port, p4client=WithProperties('%(P4USER)s-%(slavename)s-%(buildername)s'), p4user=p4user, p4base='//depot', p4viewspec=p4viewspec, mode='incremental', ))rr}r(hUhjubaubh)r}r(hXYou can specify the client spec in two different ways. You can use the ``p4base``, ``p4branch``, and (optionally) ``p4extra_views`` to build up the viewspec, or you can utilize the ``p4viewspec`` to specify the whole viewspec as a set of tuples.hj| hhhhh}r(h]h]h]h]h]uhMhhh]r(hXGYou can specify the client spec in two different ways. You can use the rr}r(hXGYou can specify the client spec in two different ways. You can use the hjubh)r}r(hX ``p4base``h}r(h]h]h]h]h]uhjh]rhXp4baserr}r(hUhjubahhubhX, rr}r(hX, hjubh)r}r(hX ``p4branch``h}r(h]h]h]h]h]uhjh]rhXp4branchrr}r(hUhjubahhubhX, and (optionally) rr}r(hX, and (optionally) hjubh)r}r(hX``p4extra_views``h}r(h]h]h]h]h]uhjh]rhX p4extra_viewsrr}r(hUhjubahhubhX2 to build up the viewspec, or you can utilize the rr}r(hX2 to build up the viewspec, or you can utilize the hjubh)r}r(hX``p4viewspec``h}r(h]h]h]h]h]uhjh]rhX p4viewspecrr}r(hUhjubahhubhX2 to specify the whole viewspec as a set of tuples.rr}r(hX2 to specify the whole viewspec as a set of tuples.hjubeubh)r}r(hX5Using p4viewspec will allow you to add lines such as:rhj| hhhhh}r(h]h]h]h]h]uhMhhh]rhX5Using p4viewspec will allow you to add lines such as:rr}r(hjhjubaubjS)r}r(hX|//depot/branch/mybranch/... ///... -//depot/branch/mybranch/notthisdir/... ///notthisdir/...hj| hhhjVh}r(UlinenosrUlanguagerXnonejXjYh]h]h]h]h]uhMhhh]rhX|//depot/branch/mybranch/... ///... -//depot/branch/mybranch/notthisdir/... ///notthisdir/...rr}r(hUhjubaubh)r}r(hXIf you specify ``p4viewspec`` and any of ``p4base``, ``p4branch``, and/or ``p4extra_views`` you will receive a configuration error exception.hj| hhhhh}r(h]h]h]h]h]uhM hhh]r(hXIf you specify rr}r(hXIf you specify hjubh)r}r(hX``p4viewspec``h}r(h]h]h]h]h]uhjh]rhX p4viewspecrr }r (hUhjubahhubhX and any of r r }r (hX and any of hjubh)r}r(hX ``p4base``h}r(h]h]h]h]h]uhjh]rhXp4baserr}r(hUhjubahhubhX, rr}r(hX, hjubh)r}r(hX ``p4branch``h}r(h]h]h]h]h]uhjh]rhXp4branchrr}r(hUhjubahhubhX , and/or rr }r!(hX , and/or hjubh)r"}r#(hX``p4extra_views``h}r$(h]h]h]h]h]uhjh]r%hX p4extra_viewsr&r'}r((hUhj"ubahhubhX2 you will receive a configuration error exception.r)r*}r+(hX2 you will receive a configuration error exception.hjubeubj)r,}r-(hUhj| hhhjh}r.(h]h]h]h]h]uhNhhh]r/(j)r0}r1(hXn``p4base`` A view into the Perforce depot without branch name or trailing "/...". Typically ``//depot/proj``. hj,hhhjh}r2(h]h]h]h]h]uhMh]r3(j)r4}r5(hX ``p4base``r6hj0hhhjh}r7(h]h]h]h]h]uhMh]r8h)r9}r:(hj6h}r;(h]h]h]h]h]uhj4h]r<hXp4baser=r>}r?(hUhj9ubahhubaubj)r@}rA(hUh}rB(h]h]h]h]h]uhj0h]rCh)rD}rE(hXbA view into the Perforce depot without branch name or trailing "/...". Typically ``//depot/proj``.hj@hhhhh}rF(h]h]h]h]h]uhMh]rG(hXQA view into the Perforce depot without branch name or trailing "/...". Typically rHrI}rJ(hXQA view into the Perforce depot without branch name or trailing "/...". Typically hjDubh)rK}rL(hX``//depot/proj``h}rM(h]h]h]h]h]uhjDh]rNhX //depot/projrOrP}rQ(hUhjKubahhubhX.rR}rS(hX.hjDubeubahjubeubj)rT}rU(hX``p4branch`` (optional): A single string, which is appended to the p4base as follows ``//...`` to form the first line in the viewspec hj,hhhjh}rV(h]h]h]h]h]uhMhhh]rW(j)rX}rY(hX ``p4branch``rZhjThhhjh}r[(h]h]h]h]h]uhMh]r\h)r]}r^(hjZh}r_(h]h]h]h]h]uhjXh]r`hXp4branchrarb}rc(hUhj]ubahhubaubj)rd}re(hUh}rf(h]h]h]h]h]uhjTh]rgj)rh}ri(hUh}rj(h]h]h]h]h]uhjdh]rkj)rl}rm(hX(optional): A single string, which is appended to the p4base as follows ``//...`` to form the first line in the viewspec hjhhhhjh}rn(h]h]h]h]h]uhMh]ro(j)rp}rq(hXG(optional): A single string, which is appended to the p4base as followsrrhjlhhhjh}rs(h]h]h]h]h]uhMh]rthXG(optional): A single string, which is appended to the p4base as followsrurv}rw(hjrhjpubaubj)rx}ry(hUh}rz(h]h]h]h]h]uhjlh]r{h)r|}r}(hXB``//...`` to form the first line in the viewspechjxhhhhh}r~(h]h]h]h]h]uhMh]r(h)r}r(hX``//...``h}r(h]h]h]h]h]uhj|h]rhX//...rr}r(hUhjubahhubhX' to form the first line in the viewspecrr}r(hX' to form the first line in the viewspechj|ubeubahjubeubahjubahjubeubj)r}r(hX ``p4extra_views`` (optional): a list of ``(depotpath, clientpath)`` tuples containing extra views to be mapped into the client specification. Both will have ``/...`` appended automatically. The client name and source directory will be prepended to the client path. hj,hhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``p4extra_views``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX p4extra_viewsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional): a list of ``(depotpath, clientpath)`` tuples containing extra views to be mapped into the client specification. Both will have ``/...`` appended automatically. The client name and source directory will be prepended to the client path.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(optional): a list of rr}r(hX(optional): a list of hjubh)r}r(hX``(depotpath, clientpath)``h}r(h]h]h]h]h]uhjh]rhX(depotpath, clientpath)rr}r(hUhjubahhubhXZ tuples containing extra views to be mapped into the client specification. Both will have rr}r(hXZ tuples containing extra views to be mapped into the client specification. Both will have hjubh)r}r(hX``/...``h}r(h]h]h]h]h]uhjh]rhX/...rr}r(hUhjubahhubhXc appended automatically. The client name and source directory will be prepended to the client path.rr}r(hXc appended automatically. The client name and source directory will be prepended to the client path.hjubeubahjubeubj)r}r(hX``p4viewspec`` This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows:: [('//depot/main/','')] It yields a viewspec with just: .. code-block:: none //depot/main/... ///... hj,hhhjh}r(h]h]h]h]h]uhM'hhh]r(j)r}r(hX``p4viewspec``rhjhhhjh}r(h]h]h]h]h]uhM'h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX p4viewspecrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(h)r}r(hX}This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows::hjhhhhh}r(h]h]h]h]h]uhMh]rhX|This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows:rr}r(hX|This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows:hjubaubjS)r}r(hX[('//depot/main/','')]hjhjVh}r(jXjYh]h]h]h]h]uhM!h]rhX[('//depot/main/','')]rr}r(hUhjubaubh)r}r(hXIt yields a viewspec with just:rhjhhhhh}r(h]h]h]h]h]uhM#h]rhXIt yields a viewspec with just:rr}r(hjhjubaubjS)r}r(hX!//depot/main/... ///...hjhhhjVh}r(jjXnonejXjYh]h]h]h]h]uhM%h]rhX!//depot/main/... ///...rr}r(hUhjubaubehjubeubj)r}r(hX ``p4viewspec_suffix`` (optional): The ``p4viewspec`` lets you customize the client spec for a builder but, as the previous example shows, it automatically adds ``...`` at the end of each line. If you need to also specify file-level remappings, you can set the ``p4viewspec_suffix`` to ``None`` so that nothing is added to your viewspec:: [('//depot/main/...', '...'), ('-//depot/main/config.xml', 'config.xml'), ('//depot/main/config.vancouver.xml', 'config.xml')] It yields a viewspec with: .. code-block:: none //depot/main/... ///... -//depot/main/config.xml ///main/config.xml Note how, with ``p4viewspec_suffix`` set to ``None``, you need to manually add ``...`` where you need it. hj,hhhjh}r(h]h]h]h]h]uhM<hhh]r(j)r}r(hX``p4viewspec_suffix``rhjhhhjh}r(h]h]h]h]h]uhM<h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXp4viewspec_suffixrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(h)r}r(hX;(optional): The ``p4viewspec`` lets you customize the client spec for a builder but, as the previous example shows, it automatically adds ``...`` at the end of each line. If you need to also specify file-level remappings, you can set the ``p4viewspec_suffix`` to ``None`` so that nothing is added to your viewspec::hjhhhhh}r(h]h]h]h]h]uhM*h]r(hX(optional): The rr}r(hX(optional): The hjubh)r}r(hX``p4viewspec``h}r(h]h]h]h]h]uhjh]rhX p4viewspecr r }r (hUhjubahhubhXl lets you customize the client spec for a builder but, as the previous example shows, it automatically adds r r }r(hXl lets you customize the client spec for a builder but, as the previous example shows, it automatically adds hjubh)r}r(hX``...``h}r(h]h]h]h]h]uhjh]rhX...rr}r(hUhjubahhubhX] at the end of each line. If you need to also specify file-level remappings, you can set the rr}r(hX] at the end of each line. If you need to also specify file-level remappings, you can set the hjubh)r}r(hX``p4viewspec_suffix``h}r(h]h]h]h]h]uhjh]rhXp4viewspec_suffixrr}r(hUhjubahhubhX to r r!}r"(hX to hjubh)r#}r$(hX``None``h}r%(h]h]h]h]h]uhjh]r&hXNoner'r(}r)(hUhj#ubahhubhX+ so that nothing is added to your viewspec:r*r+}r,(hX+ so that nothing is added to your viewspec:hjubeubjS)r-}r.(hX[('//depot/main/...', '...'), ('-//depot/main/config.xml', 'config.xml'), ('//depot/main/config.vancouver.xml', 'config.xml')]hjhjVh}r/(jXjYh]h]h]h]h]uhM/h]r0hX[('//depot/main/...', '...'), ('-//depot/main/config.xml', 'config.xml'), ('//depot/main/config.vancouver.xml', 'config.xml')]r1r2}r3(hUhj-ubaubh)r4}r5(hXIt yields a viewspec with:r6hjhhhhh}r7(h]h]h]h]h]uhM3h]r8hXIt yields a viewspec with:r9r:}r;(hj6hj4ubaubjS)r<}r=(hX//depot/main/... ///... -//depot/main/config.xml ///main/config.xmlhjhhhjVh}r>(jjXnonejXjYh]h]h]h]h]uhM5h]r?hX//depot/main/... ///... -//depot/main/config.xml ///main/config.xmlr@rA}rB(hUhj<ubaubh)rC}rD(hXiNote how, with ``p4viewspec_suffix`` set to ``None``, you need to manually add ``...`` where you need it.hjhhhhh}rE(h]h]h]h]h]uhM;h]rF(hXNote how, with rGrH}rI(hXNote how, with hjCubh)rJ}rK(hX``p4viewspec_suffix``h}rL(h]h]h]h]h]uhjCh]rMhXp4viewspec_suffixrNrO}rP(hUhjJubahhubhX set to rQrR}rS(hX set to hjCubh)rT}rU(hX``None``h}rV(h]h]h]h]h]uhjCh]rWhXNonerXrY}rZ(hUhjTubahhubhX, you need to manually add r[r\}r](hX, you need to manually add hjCubh)r^}r_(hX``...``h}r`(h]h]h]h]h]uhjCh]rahX...rbrc}rd(hUhj^ubahhubhX where you need it.rerf}rg(hX where you need it.hjCubeubehjubeubj)rh}ri(hX``p4client_spec_options`` (optional): By default, clients are created with the ``allwrite rmdir`` options. This string lets you change that. hj,hhhjh}rj(h]h]h]h]h]uhM@hhh]rk(j)rl}rm(hX``p4client_spec_options``rnhjhhhhjh}ro(h]h]h]h]h]uhM@h]rph)rq}rr(hjnh}rs(h]h]h]h]h]uhjlh]rthXp4client_spec_optionsrurv}rw(hUhjqubahhubaubj)rx}ry(hUh}rz(h]h]h]h]h]uhjhh]r{h)r|}r}(hXr(optional): By default, clients are created with the ``allwrite rmdir`` options. This string lets you change that.hjxhhhhh}r~(h]h]h]h]h]uhM?h]r(hX5(optional): By default, clients are created with the rr}r(hX5(optional): By default, clients are created with the hj|ubh)r}r(hX``allwrite rmdir``h}r(h]h]h]h]h]uhj|h]rhXallwrite rmdirrr}r(hUhjubahhubhX+ options. This string lets you change that.rr}r(hX+ options. This string lets you change that.hj|ubeubahjubeubj)r}r(hX``p4port`` (optional): the :samp:`{host}:{port}` string describing how to get to the P4 Depot (repository), used as the :option:`-p` argument for all p4 commands. hj,hhhjh}r(h]h]h]h]h]uhMDhhh]r(j)r}r(hX ``p4port``rhjhhhjh}r(h]h]h]h]h]uhMDh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXp4portrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional): the :samp:`{host}:{port}` string describing how to get to the P4 Depot (repository), used as the :option:`-p` argument for all p4 commands.hjhhhhh}r(h]h]h]h]h]uhMCh]r(hX(optional): the rr}r(hX(optional): the hjubh)r}r(hUh}r(h]h]h]h]rXsampraUrolejh]uhjh]r(jW)r}r(hXhosth}r(h]h]h]h]h]uhjh]rhXhostrr}r(hUhjubahjaubhX:r}r(hX:hjubjW)r}r(hXporth}r(h]h]h]h]h]uhjh]rhXportrr}r(hUhjubahjaubehhubhXH string describing how to get to the P4 Depot (repository), used as the rr}r(hXH string describing how to get to the P4 Depot (repository), used as the hjubh)r}r(hX :option:`-p`rhjhhhhh}r(UreftypeXoptionhhX-pU refdomainXstdrU refprogramrNh]h]U refexplicith]h]h]hhuhMCh]rcsphinx.addnodes literal_emphasis r)r}r(hjh}r(h]h]r(hjX std-optionreh]h]h]uhjh]rhX-prr}r(hUhjubahUliteral_emphasisrubaubhX argument for all p4 commands.rr}r(hX argument for all p4 commands.hjubeubahjubeubj)r}r(hX```p4user`` (optional): the Perforce user, used as the :option:`-u` argument to all p4 commands. hj,hhhjh}r(h]h]h]h]h]uhMHhhh]r(j)r}r(hX ``p4user``rhjhhhjh}r(h]h]h]h]h]uhMHh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXp4userrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXT(optional): the Perforce user, used as the :option:`-u` argument to all p4 commands.hjhhhhh}r(h]h]h]h]h]uhMGh]r(hX+(optional): the Perforce user, used as the rr}r(hX+(optional): the Perforce user, used as the hjubh)r}r(hX :option:`-u`rhjhhhhh}r(UreftypeXoptionhhX-uU refdomainXstdrjNh]h]U refexplicith]h]h]hhuhMGh]rj)r}r(hjh}r(h]h]r(hjX std-optionreh]h]h]uhjh]rhX-urr}r(hUhjubahjubaubhX argument to all p4 commands.rr}r(hX argument to all p4 commands.hjubeubahjubeubj)r}r(hXf``p4passwd`` (optional): the Perforce password, used as the :option:`-p` argument to all p4 commands. hj,hhhjh}r(h]h]h]h]h]uhMLhhh]r(j)r}r(hX ``p4passwd``r hjhhhjh}r (h]h]h]h]h]uhMLh]r h)r }r (hj h}r(h]h]h]h]h]uhjh]rhXp4passwdrr}r(hUhj ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXX(optional): the Perforce password, used as the :option:`-p` argument to all p4 commands.hjhhhhh}r(h]h]h]h]h]uhMKh]r(hX/(optional): the Perforce password, used as the rr}r(hX/(optional): the Perforce password, used as the hjubh)r}r(hX :option:`-p`r hjhhhhh}r!(UreftypeXoptionhhX-pU refdomainXstdr"jNh]h]U refexplicith]h]h]hhuhMKh]r#j)r$}r%(hj h}r&(h]h]r'(hj"X std-optionr(eh]h]h]uhjh]r)hX-pr*r+}r,(hUhj$ubahjubaubhX argument to all p4 commands.r-r.}r/(hX argument to all p4 commands.hjubeubahjubeubj)r0}r1(hX``p4client`` (optional): The name of the client to use. In ``mode='full'`` and ``mode='incremental'``, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is `buildbot_%(slave)s_%(build)s`. hj,hhhjh}r2(h]h]h]h]h]uhMThhh]r3(j)r4}r5(hX ``p4client``r6hj0hhhjh}r7(h]h]h]h]h]uhMTh]r8h)r9}r:(hj6h}r;(h]h]h]h]h]uhj4h]r<hXp4clientr=r>}r?(hUhj9ubahhubaubj)r@}rA(hUh}rB(h]h]h]h]h]uhj0h]rCh)rD}rE(hX(optional): The name of the client to use. In ``mode='full'`` and ``mode='incremental'``, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is `buildbot_%(slave)s_%(build)s`.hj@hhhhh}rF(h]h]h]h]h]uhMOh]rG(hX.(optional): The name of the client to use. In rHrI}rJ(hX.(optional): The name of the client to use. In hjDubh)rK}rL(hX``mode='full'``h}rM(h]h]h]h]h]uhjDh]rNhX mode='full'rOrP}rQ(hUhjKubahhubhX and rRrS}rT(hX and hjDubh)rU}rV(hX``mode='incremental'``h}rW(h]h]h]h]h]uhjDh]rXhXmode='incremental'rYrZ}r[(hUhjUubahhubhX%, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is r\r]}r^(hX%, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is hjDubjE)r_}r`(hX`buildbot_%(slave)s_%(build)s`h}ra(h]h]h]h]h]uhjDh]rbhXbuildbot_%(slave)s_%(build)srcrd}re(hUhj_ubahjMubhX.rf}rg(hX.hjDubeubahjubeubj)rh}ri(hX``p4line_end`` (optional): The type of line ending handling P4 should use. This is added directly to the client spec's ``LineEnd`` property. The default is ``local``. hj,hhhjh}rj(h]h]h]h]h]uhMYhhh]rk(j)rl}rm(hX``p4line_end``rnhjhhhhjh}ro(h]h]h]h]h]uhMYh]rph)rq}rr(hjnh}rs(h]h]h]h]h]uhjlh]rthX p4line_endrurv}rw(hUhjqubahhubaubj)rx}ry(hUh}rz(h]h]h]h]h]uhjhh]r{h)r|}r}(hX(optional): The type of line ending handling P4 should use. This is added directly to the client spec's ``LineEnd`` property. The default is ``local``.hjxhhhhh}r~(h]h]h]h]h]uhMWh]r(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's rr}r(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's hj|ubh)r}r(hX ``LineEnd``h}r(h]h]h]h]h]uhj|h]rhXLineEndrr}r(hUhjubahhubhX property. The default is rr}r(hX property. The default is hj|ubh)r}r(hX ``local``h}r(h]h]h]h]h]uhj|h]rhXlocalrr}r(hUhjubahhubhX.r}r(hX.hj|ubeubahjubeubj)r}r(hX``p4extra_args`` (optional): Extra arguments to be added to the P4 command-line for the ``sync`` command. So for instance if you want to sync only to populate a Perforce proxy (without actually syncing files to disk), you can do:: P4(p4extra_args=['-Zproxyload'], ...) hj,hhhjh}r(h]h]h]h]h]uhMbhhh]r(j)r}r(hX``p4extra_args``rhjhhhjh}r(h]h]h]h]h]uhMbh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX p4extra_argsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(h)r}r(hX(optional): Extra arguments to be added to the P4 command-line for the ``sync`` command. So for instance if you want to sync only to populate a Perforce proxy (without actually syncing files to disk), you can do::hjhhhhh}r(h]h]h]h]h]uhM\h]r(hXG(optional): Extra arguments to be added to the P4 command-line for the rr}r(hXG(optional): Extra arguments to be added to the P4 command-line for the hjubh)r}r(hX``sync``h}r(h]h]h]h]h]uhjh]rhXsyncrr}r(hUhjubahhubhX command. So for instance if you want to sync only to populate a Perforce proxy (without actually syncing files to disk), you can do:rr}r(hX command. So for instance if you want to sync only to populate a Perforce proxy (without actually syncing files to disk), you can do:hjubeubjS)r}r(hX%P4(p4extra_args=['-Zproxyload'], ...)hjhjVh}r(jXjYh]h]h]h]h]uhM`h]rhX%P4(p4extra_args=['-Zproxyload'], ...)rr}r(hUhjubaubehjubeubeubj)r}r(hUhj| hhhj h}r(h]h]h]h]h]j ]r(UpairrX#Gerrit integration; Repo Build StepUindex-13rUtrajuhMdhhh]ubh)r}r(hUhj| hhhhh}r(h]h]h]h]rjah]uhMehhh]ubj)r}r(hUhj| hhhj h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; Repojx jx tr(UsingleXRepo Build Stepjx jx treuhMghhh]ubjz eubhhhhh}r(h]h]h]h]h]hjx uhMghhh]ubsh]r(h)r}r(hjhjr hhhhh}r(h]h]h]h]h]hjuhMihhh]rhXReporr}r(hjhjubaubj)r}r(hUhjr hNhj h}r(h]h]h]h]h]Uentries]r(jX@buildbot.steps.source.repo.Repo (class in buildbot.steps.source)h#UtrauhNhhh]ubj )r}r(hUhjr hNhj h}r(j j Xpyh]h]h]h]h]j Xclassrj juhNhhh]r(j )r}r(hXbuildbot.steps.source.repo.Repohjhhhj h}r(h]rh#aj j h]h]h]h]rh#aj Xbuildbot.steps.source.repo.Repoj Xbuildbot.steps.source.repoj uhMlhhh]r(j )r}r(hXclass hjhhhj h}r(h]h]h]h]h]uhMlhhh]rhXclass rr}r(hUhjubaubj )r}r(hXbuildbot.steps.source.repo.hjhhhj h}r(h]h]h]h]h]uhMlhhh]rhXbuildbot.steps.source.repo.rr}r(hUhjubaubj )r}r(hXRepohjhhhj h}r(h]h]h]h]h]uhMlhhh]rhXReporr}r (hUhjubaubeubj )r }r (hUhjhhhj h}r (h]h]h]h]h]uhMlhhh]ubeubh)r }r (hXbThe :bb:step:`Repo` build step performs a `Repo `_ init and sync.hjr hhhhh}r (h]h]h]h]h]uhMmhhh]r (hXThe r r }r (hXThe hj ubh)r }r (hX:bb:step:`Repo`r hj hhhhh}r (UreftypeXstephhXRepoU refdomainXbbr h]h]U refexplicith]h]h]hhuhMmh]r h)r }r (hj h}r (h]h]r (hj Xbb-stepr eh]h]h]uhj h]r hXRepor r }r (hUhj ubahhubaubhX build step performs a r r }r (hX build step performs a hj ubjM)r }r (hX)`Repo `_h}r (UnameXRepoj Xhttp://lwn.net/Articles/304488/r h]h]h]h]h]uhj h]r! hXRepor" r# }r$ (hUhj ubahjYubh)r% }r& (hX" hKhj hhh}r' (Urefurij h]r( Uid7r) ah]h]h]h]r* jv auh]ubhX init and sync.r+ r, }r- (hX init and sync.hj ubeubh)r. }r/ (hXoIt is a drop-in replacement for `Repo (Slave-Side)`, which should not be used anymore for new and old projects.hjr hhhhh}r0 (h]h]h]h]h]uhMphhh]r1 (hX It is a drop-in replacement for r2 r3 }r4 (hX It is a drop-in replacement for hj. ubjE)r5 }r6 (hX`Repo (Slave-Side)`h}r7 (h]h]h]h]h]uhj. h]r8 hXRepo (Slave-Side)r9 r: }r; (hUhj5 ubahjMubhX<, which should not be used anymore for new and old projects.r< r= }r> (hX<, which should not be used anymore for new and old projects.hj. ubeubh)r? }r@ (hX,The Repo step takes the following arguments:rA hjr hhhhh}rB (h]h]h]h]h]uhMshhh]rC hX,The Repo step takes the following arguments:rD rE }rF (hjA hj? ubaubj)rG }rH (hUhjr hhhjh}rI (h]h]h]h]h]uhNhhh]rJ (j)rK }rL (hXb``manifestURL`` (required): the URL at which the Repo's manifests source repository is available. hjG hhhjh}rM (h]h]h]h]h]uhMvh]rN (j)rO }rP (hX``manifestURL``rQ hjK hhhjh}rR (h]h]h]h]h]uhMvh]rS h)rT }rU (hjQ h}rV (h]h]h]h]h]uhjO h]rW hX manifestURLrX rY }rZ (hUhjT ubahhubaubj)r[ }r\ (hUh}r] (h]h]h]h]h]uhjK h]r^ h)r_ }r` (hXQ(required): the URL at which the Repo's manifests source repository is available.ra hj[ hhhhh}rb (h]h]h]h]h]uhMvh]rc hXQ(required): the URL at which the Repo's manifests source repository is available.rd re }rf (hja hj_ ubaubahjubeubj)rg }rh (hX``manifestBranch`` (optional, defaults to ``master``): the manifest repository branch on which repo will take its manifest. Corresponds to the ``-b`` argument to the :command:`repo init` command. hjG hhhjh}ri (h]h]h]h]h]uhM{hhh]rj (j)rk }rl (hX``manifestBranch``rm hjg hhhjh}rn (h]h]h]h]h]uhM{h]ro h)rp }rq (hjm h}rr (h]h]h]h]h]uhjk h]rs hXmanifestBranchrt ru }rv (hUhjp ubahhubaubj)rw }rx (hUh}ry (h]h]h]h]h]uhjg h]rz h)r{ }r| (hX(optional, defaults to ``master``): the manifest repository branch on which repo will take its manifest. Corresponds to the ``-b`` argument to the :command:`repo init` command.hjw hhhhh}r} (h]h]h]h]h]uhMyh]r~ (hX(optional, defaults to r r }r (hX(optional, defaults to hj{ ubh)r }r (hX ``master``h}r (h]h]h]h]h]uhj{ h]r hXmasterr r }r (hUhj ubahhubhX[): the manifest repository branch on which repo will take its manifest. Corresponds to the r r }r (hX[): the manifest repository branch on which repo will take its manifest. Corresponds to the hj{ ubh)r }r (hX``-b``h}r (h]h]h]h]h]uhj{ h]r hX-br r }r (hUhj ubahhubhX argument to the r r }r (hX argument to the hj{ ubjL)r }r (hX:command:`repo init`h}r (h]h]r jQah]h]h]uhj{ h]r hX repo initr r }r (hUhj ubahjVubhX command.r r }r (hX command.hj{ ubeubahjubeubj)r }r (hX``manifestFile`` (optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command. hjG hhhjh}r (h]h]h]h]h]uhMhhh]r (j)r }r (hX``manifestFile``r hj hhhjh}r (h]h]h]h]h]uhMh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hX manifestFiler r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hX(optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command.hj hhhhh}r (h]h]h]h]h]uhM~h]r (hX(optional, defaults to r r }r (hX(optional, defaults to hj ubh)r }r (hX``default.xml``h}r (h]h]h]h]h]uhj h]r hX default.xmlr r }r (hUhj ubahhubhX-): the manifest filename. Corresponds to the r r }r (hX-): the manifest filename. Corresponds to the hj ubh)r }r (hX``-m``h}r (h]h]h]h]h]uhj h]r hX-mr r }r (hUhj ubahhubhX argument to the r r }r (hX argument to the hj ubjL)r }r (hX:command:`repo init`h}r (h]h]r jQah]h]h]uhj h]r hX repo initr r }r (hUhj ubahjVubhX command.r r }r (hX command.hj ubeubahjubeubj)r }r (hXF``tarball`` (optional, defaults to ``None``): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the ``.repo`` directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves. hjG hhhjh}r (h]h]h]h]h]uhMhhh]r (j)r }r (hX ``tarball``r hj hhhjh}r (h]h]h]h]h]uhMh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXtarballr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hX9(optional, defaults to ``None``): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the ``.repo`` directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves.hj hhhhh}r (h]h]h]h]h]uhMh]r (hX(optional, defaults to r r }r (hX(optional, defaults to hj ubh)r }r (hX``None``h}r (h]h]h]h]h]uhj h]r hXNoner r }r (hUhj ubahhubhX): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the r r }r (hX): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the hj ubh)r!}r!(hX ``.repo``h}r!(h]h]h]h]h]uhj h]r!hX.repor!r!}r!(hUhj!ubahhubhX directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves.r!r!}r !(hX directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves.hj ubeubahjubeubj)r !}r !(hX``jobs`` (optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j". hjG hhhjh}r !(h]h]h]h]h]uhMhhh]r !(j)r!}r!(hX``jobs``r!hj !hhhjh}r!(h]h]h]h]h]uhMh]r!h)r!}r!(hj!h}r!(h]h]h]h]h]uhj!h]r!hXjobsr!r!}r!(hUhj!ubahhubaubj)r!}r!(hUh}r!(h]h]h]h]h]uhj !h]r!h)r!}r!(hX(optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hj!hhhhh}r !(h]h]h]h]h]uhMh]r!!(hX(optional, defaults to r"!r#!}r$!(hX(optional, defaults to hj!ubh)r%!}r&!(hX``None``h}r'!(h]h]h]h]h]uhj!h]r(!hXNoner)!r*!}r+!(hUhj%!ubahhubhXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".r,!r-!}r.!(hXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hj!ubeubahjubeubj)r/!}r0!(hX``syncAllBranches`` (optional, defaults to ``False``): renderable boolean to control whether ``repo`` syncs all branches. i.e. ``repo sync -c`` hjG hhhjh}r1!(h]h]h]h]h]uhMhhh]r2!(j)r3!}r4!(hX``syncAllBranches``r5!hj/!hhhjh}r6!(h]h]h]h]h]uhMh]r7!h)r8!}r9!(hj5!h}r:!(h]h]h]h]h]uhj3!h]r;!hXsyncAllBranchesr!(hUhj8!ubahhubaubj)r?!}r@!(hUh}rA!(h]h]h]h]h]uhj/!h]rB!h)rC!}rD!(hX{(optional, defaults to ``False``): renderable boolean to control whether ``repo`` syncs all branches. i.e. ``repo sync -c``hj?!hhhhh}rE!(h]h]h]h]h]uhMh]rF!(hX(optional, defaults to rG!rH!}rI!(hX(optional, defaults to hjC!ubh)rJ!}rK!(hX ``False``h}rL!(h]h]h]h]h]uhjC!h]rM!hXFalserN!rO!}rP!(hUhjJ!ubahhubhX)): renderable boolean to control whether rQ!rR!}rS!(hX)): renderable boolean to control whether hjC!ubh)rT!}rU!(hX``repo``h}rV!(h]h]h]h]h]uhjC!h]rW!hXreporX!rY!}rZ!(hUhjT!ubahhubhX syncs all branches. i.e. r[!r\!}r]!(hX syncs all branches. i.e. hjC!ubh)r^!}r_!(hX``repo sync -c``h}r`!(h]h]h]h]h]uhjC!h]ra!hX repo sync -crb!rc!}rd!(hUhj^!ubahhubeubahjubeubj)re!}rf!(hX``depth`` (optional, defaults to 0): Depth argument passed to repo init. Specifies the amount of git history to store. A depth of 1 is useful for shallow clones. This can save considerable disk space on very large projects. hjG hhhjh}rg!(h]h]h]h]h]uhMhhh]rh!(j)ri!}rj!(hX ``depth``rk!hje!hhhjh}rl!(h]h]h]h]h]uhMh]rm!h)rn!}ro!(hjk!h}rp!(h]h]h]h]h]uhji!h]rq!hXdepthrr!rs!}rt!(hUhjn!ubahhubaubj)ru!}rv!(hUh}rw!(h]h]h]h]h]uhje!h]rx!h)ry!}rz!(hX(optional, defaults to 0): Depth argument passed to repo init. Specifies the amount of git history to store. A depth of 1 is useful for shallow clones. This can save considerable disk space on very large projects.r{!hju!hhhhh}r|!(h]h]h]h]h]uhMh]r}!hX(optional, defaults to 0): Depth argument passed to repo init. Specifies the amount of git history to store. A depth of 1 is useful for shallow clones. This can save considerable disk space on very large projects.r~!r!}r!(hj{!hjy!ubaubahjubeubj)r!}r!(hXV``updateTarballAge`` (optional, defaults to "one week"): renderable to control the policy of updating of the tarball given properties Returns: max age of tarball in seconds, or None, if we want to skip tarball update The default value should be good trade off on size of the tarball, and update frequency compared to cost of tarball creation hjG hhhjh}r!(h]h]h]h]h]uhMhhh]r!(j)r!}r!(hX``updateTarballAge``r!hj!hhhjh}r!(h]h]h]h]h]uhMh]r!h)r!}r!(hj!h}r!(h]h]h]h]h]uhj!h]r!hXupdateTarballAger!r!}r!(hUhj!ubahhubaubj)r!}r!(hUh}r!(h]h]h]h]h]uhj!h]r!h)r!}r!(hX@(optional, defaults to "one week"): renderable to control the policy of updating of the tarball given properties Returns: max age of tarball in seconds, or None, if we want to skip tarball update The default value should be good trade off on size of the tarball, and update frequency compared to cost of tarball creationr!hj!hhhhh}r!(h]h]h]h]h]uhMh]r!hX@(optional, defaults to "one week"): renderable to control the policy of updating of the tarball given properties Returns: max age of tarball in seconds, or None, if we want to skip tarball update The default value should be good trade off on size of the tarball, and update frequency compared to cost of tarball creationr!r!}r!(hj!hj!ubaubahjubeubj)r!}r!(hX``repoDownloads`` (optional, defaults to None): list of ``repo download`` commands to perform at the end of the Repo step each string in the list will be prefixed ``repo download``, and run as is. This means you can include parameter in the string. e.g: - ``["-c project 1234/4"]`` will cherry-pick patchset 4 of patch 1234 in project ``project`` - ``["-f project 1234/4"]`` will enforce fast-forward on patchset 4 of patch 1234 in project ``project`` hjG hhhjh}r!(h]h]h]h]h]uhMhhh]r!(j)r!}r!(hX``repoDownloads``r!hj!hhhjh}r!(h]h]h]h]h]uhMh]r!h)r!}r!(hj!h}r!(h]h]h]h]h]uhj!h]r!hX repoDownloadsr!r!}r!(hUhj!ubahhubaubj)r!}r!(hUh}r!(h]h]h]h]h]uhj!h]r!(h)r!}r!(hX(optional, defaults to None): list of ``repo download`` commands to perform at the end of the Repo step each string in the list will be prefixed ``repo download``, and run as is. This means you can include parameter in the string. e.g:hj!hhhhh}r!(h]h]h]h]h]uhMh]r!(hX&(optional, defaults to None): list of r!r!}r!(hX&(optional, defaults to None): list of hj!ubh)r!}r!(hX``repo download``h}r!(h]h]h]h]h]uhj!h]r!hX repo downloadr!r!}r!(hUhj!ubahhubhXZ commands to perform at the end of the Repo step each string in the list will be prefixed r!r!}r!(hXZ commands to perform at the end of the Repo step each string in the list will be prefixed hj!ubh)r!}r!(hX``repo download``h}r!(h]h]h]h]h]uhj!h]r!hX repo downloadr!r!}r!(hUhj!ubahhubhXI, and run as is. This means you can include parameter in the string. e.g:r!r!}r!(hXI, and run as is. This means you can include parameter in the string. e.g:hj!ubeubjx)r!}r!(hUh}r!(h]h]h]h]h]uhj!h]r!j~)r!}r!(hUh}r!(jX-h]h]h]h]h]uhj!h]r!(j)r!}r!(hX[``["-c project 1234/4"]`` will cherry-pick patchset 4 of patch 1234 in project ``project`` h}r!(h]h]h]h]h]uhj!h]r!h)r!}r!(hXZ``["-c project 1234/4"]`` will cherry-pick patchset 4 of patch 1234 in project ``project``hj!hhhhh}r!(h]h]h]h]h]uhMh]r!(h)r!}r!(hX``["-c project 1234/4"]``h}r!(h]h]h]h]h]uhj!h]r!hX["-c project 1234/4"]r!r!}r!(hUhj!ubahhubhX6 will cherry-pick patchset 4 of patch 1234 in project r!r!}r!(hX6 will cherry-pick patchset 4 of patch 1234 in project hj!ubh)r!}r!(hX ``project``h}r!(h]h]h]h]h]uhj!h]r!hXprojectr!r!}r!(hUhj!ubahhubeubahjubj)r!}r!(hXg``["-f project 1234/4"]`` will enforce fast-forward on patchset 4 of patch 1234 in project ``project`` h}r!(h]h]h]h]h]uhj!h]r!h)r!}r!(hXf``["-f project 1234/4"]`` will enforce fast-forward on patchset 4 of patch 1234 in project ``project``hj!hhhhh}r!(h]h]h]h]h]uhMh]r!(h)r!}r!(hX``["-f project 1234/4"]``h}r!(h]h]h]h]h]uhj!h]r!hX["-f project 1234/4"]r!r!}r!(hUhj!ubahhubhXB will enforce fast-forward on patchset 4 of patch 1234 in project r!r!}r!(hXB will enforce fast-forward on patchset 4 of patch 1234 in project hj!ubh)r!}r"(hX ``project``h}r"(h]h]h]h]h]uhj!h]r"hXprojectr"r"}r"(hUhj!ubahhubeubahjubehjubahj{ubehjubeubeubj)r"}r"(hUhjr hNhj h}r"(h]h]h]h]h]Uentries]r "(jXWbuildbot.steps.source.repo.RepoDownloadsFromProperties (class in buildbot.steps.source)haUtr "auhNhhh]ubj )r "}r "(hUhjr hNhj h}r "(j j Xpyh]h]h]h]h]j Xclassr"j j"uhNhhh]r"(j )r"}r"(hX6buildbot.steps.source.repo.RepoDownloadsFromPropertieshj "hhhj h}r"(h]r"haaj j h]h]h]h]r"haaj X6buildbot.steps.source.repo.RepoDownloadsFromPropertiesj Xbuildbot.steps.source.repoj uhMhhh]r"(j )r"}r"(hXclass hj"hhhj h}r"(h]h]h]h]h]uhMhhh]r"hXclass r"r"}r"(hUhj"ubaubj )r"}r"(hXbuildbot.steps.source.repo.hj"hhhj h}r"(h]h]h]h]h]uhMhhh]r "hXbuildbot.steps.source.repo.r!"r""}r#"(hUhj"ubaubj )r$"}r%"(hXRepoDownloadsFromPropertieshj"hhhj h}r&"(h]h]h]h]h]uhMhhh]r'"hXRepoDownloadsFromPropertiesr("r)"}r*"(hUhj$"ubaubeubj )r+"}r,"(hUhj "hhhj h}r-"(h]h]h]h]h]uhMhhh]ubeubh)r."}r/"(hX``RepoDownloadsFromProperties`` can be used as a renderable of the ``repoDownload`` parameter it will look in passed properties for string with following possible format:hjr hhhhh}r0"(h]h]h]h]h]uhMhhh]r1"(h)r2"}r3"(hX``RepoDownloadsFromProperties``h}r4"(h]h]h]h]h]uhj."h]r5"hXRepoDownloadsFromPropertiesr6"r7"}r8"(hUhj2"ubahhubhX$ can be used as a renderable of the r9"r:"}r;"(hX$ can be used as a renderable of the hj."ubh)r<"}r="(hX``repoDownload``h}r>"(h]h]h]h]h]uhj."h]r?"hX repoDownloadr@"rA"}rB"(hUhj<"ubahhubhXW parameter it will look in passed properties for string with following possible format:rC"rD"}rE"(hXW parameter it will look in passed properties for string with following possible format:hj."ubeubjx)rF"}rG"(hUhjr hNhj{h}rH"(h]h]h]h]h]uhNhhh]rI"j~)rJ"}rK"(hUh}rL"(jX-h]h]h]h]h]uhjF"h]rM"(j)rN"}rO"(hX9``repo download project change_number/patchset_number``. h}rP"(h]h]h]h]h]uhjJ"h]rQ"h)rR"}rS"(hX8``repo download project change_number/patchset_number``.hjN"hhhhh}rT"(h]h]h]h]h]uhMh]rU"(h)rV"}rW"(hX7``repo download project change_number/patchset_number``h}rX"(h]h]h]h]h]uhjR"h]rY"hX3repo download project change_number/patchset_numberrZ"r["}r\"(hUhjV"ubahhubhX.r]"}r^"(hX.hjR"ubeubahjubj)r_"}r`"(hX+``project change_number/patchset_number``. h}ra"(h]h]h]h]h]uhjJ"h]rb"h)rc"}rd"(hX*``project change_number/patchset_number``.hj_"hhhhh}re"(h]h]h]h]h]uhMh]rf"(h)rg"}rh"(hX)``project change_number/patchset_number``h}ri"(h]h]h]h]h]uhjc"h]rj"hX%project change_number/patchset_numberrk"rl"}rm"(hUhjg"ubahhubhX.rn"}ro"(hX.hjc"ubeubahjubj)rp"}rq"(hX+``project/change_number/patchset_number``. h}rr"(h]h]h]h]h]uhjJ"h]rs"h)rt"}ru"(hX*``project/change_number/patchset_number``.hjp"hhhhh}rv"(h]h]h]h]h]uhMh]rw"(h)rx"}ry"(hX)``project/change_number/patchset_number``h}rz"(h]h]h]h]h]uhjt"h]r{"hX%project/change_number/patchset_numberr|"r}"}r~"(hUhjx"ubahhubhX.r"}r"(hX.hjt"ubeubahjubehjubaubh)r"}r"(hXAll of these properties will be translated into a :command:`repo download`. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.hjr hhhhh}r"(h]h]h]h]h]uhMhhh]r"(hX2All of these properties will be translated into a r"r"}r"(hX2All of these properties will be translated into a hj"ubjL)r"}r"(hX:command:`repo download`h}r"(h]h]r"jQah]h]h]uhj"h]r"hX repo downloadr"r"}r"(hUhj"ubahjVubhX. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.r"r"}r"(hX. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.hj"ubeubj)r"}r"(hUhjr hNhj h}r"(h]h]h]h]h]Uentries]r"(jXYbuildbot.steps.source.repo.RepoDownloadsFromChangeSource (class in buildbot.steps.source)h`Utr"auhNhhh]ubj )r"}r"(hUhjr hNhj h}r"(j j Xpyh]h]h]h]h]j Xclassr"j j"uhNhhh]r"(j )r"}r"(hX8buildbot.steps.source.repo.RepoDownloadsFromChangeSourcehj"hhhj h}r"(h]r"h`aj j h]h]h]h]r"h`aj X8buildbot.steps.source.repo.RepoDownloadsFromChangeSourcej Xbuildbot.steps.source.repoj uhMhhh]r"(j )r"}r"(hXclass hj"hhhj h}r"(h]h]h]h]h]uhMhhh]r"hXclass r"r"}r"(hUhj"ubaubj )r"}r"(hXbuildbot.steps.source.repo.hj"hhhj h}r"(h]h]h]h]h]uhMhhh]r"hXbuildbot.steps.source.repo.r"r"}r"(hUhj"ubaubj )r"}r"(hXRepoDownloadsFromChangeSourcehj"hhhj h}r"(h]h]h]h]h]uhMhhh]r"hXRepoDownloadsFromChangeSourcer"r"}r"(hUhj"ubaubeubj )r"}r"(hUhj"hhhj h}r"(h]h]h]h]h]uhMhhh]ubeubh)r"}r"(hX_``RepoDownloadsFromChangeSource`` can be used as a renderable of the ``repoDownload`` parameterr"hjr hhhhh}r"(h]h]h]h]h]uhMhhh]r"(h)r"}r"(hX!``RepoDownloadsFromChangeSource``h}r"(h]h]h]h]h]uhj"h]r"hXRepoDownloadsFromChangeSourcer"r"}r"(hUhj"ubahhubhX$ can be used as a renderable of the r"r"}r"(hX$ can be used as a renderable of the hj"ubh)r"}r"(hX``repoDownload``h}r"(h]h]h]h]h]uhj"h]r"hX repoDownloadr"r"}r"(hUhj"ubahhubhX parameterr"r"}r"(hX parameterhj"ubeubh)r"}r"(hXThis rendereable integrates with :bb:chsrc:`GerritChangeSource`, and will automatically use the :command:`repo download` command of repo to download the additionnal changes introduced by a pending changeset.hjr hhhhh}r"(h]h]h]h]h]uhMhhh]r"(hX!This rendereable integrates with r"r"}r"(hX!This rendereable integrates with hj"ubh)r"}r"(hX:bb:chsrc:`GerritChangeSource`r"hj"hhhhh}r"(UreftypeXchsrchhXGerritChangeSourceU refdomainXbbr"h]h]U refexplicith]h]h]hhuhMh]r"h)r"}r"(hj"h}r"(h]h]r"(hj"Xbb-chsrcr"eh]h]h]uhj"h]r"hXGerritChangeSourcer"r"}r"(hUhj"ubahhubaubhX!, and will automatically use the r"r"}r"(hX!, and will automatically use the hj"ubjL)r"}r"(hX:command:`repo download`h}r"(h]h]r"jQah]h]h]uhj"h]r"hX repo downloadr"r"}r"(hUhj"ubahjVubhXW command of repo to download the additionnal changes introduced by a pending changeset.r"r"}r"(hXW command of repo to download the additionnal changes introduced by a pending changeset.hj"ubeubcdocutils.nodes note r")r"}r"(hXryou can use the two above Rendereable in conjuction by using the class ``buildbot.process.properties.FlattenList``r"hjr hhhUnoter"h}r"(h]h]h]h]h]uhNhhh]r"h)r"}r#(hj"hj"hhhhh}r#(h]h]h]h]h]uhMh]r#(hXGyou can use the two above Rendereable in conjuction by using the class r#r#}r#(hXGyou can use the two above Rendereable in conjuction by using the class hj"ubh)r#}r#(hX+``buildbot.process.properties.FlattenList``h}r#(h]h]h]h]h]uhj"h]r #hX'buildbot.process.properties.FlattenListr #r #}r #(hUhj#ubahhubeubaubh)r #}r#(hX for example::r#hjr hhhhh}r#(h]h]h]h]h]uhMhhh]r#hX for example:r#r#}r#(hX for example:hj #ubaubjS)r#}r#(hX1from buildbot.steps.source.repo import Repo, RepoDownloadsFromChangeSource, from buildbot.steps.source.repo import RepoDownloadsFromProperties from buildbot.process.properties import FlattenList factory.addStep(Repo(manifestURL='git://mygerrit.org/manifest.git', repoDownloads=FlattenList([RepoDownloadsFromChangeSource(), RepoDownloadsFromProperties("repo_downloads") ] ) ))hjr hhhjVh}r#(jXjYh]h]h]h]h]uhMhhh]r#hX1from buildbot.steps.source.repo import Repo, RepoDownloadsFromChangeSource, from buildbot.steps.source.repo import RepoDownloadsFromProperties from buildbot.process.properties import FlattenList factory.addStep(Repo(manifestURL='git://mygerrit.org/manifest.git', repoDownloads=FlattenList([RepoDownloadsFromChangeSource(), RepoDownloadsFromProperties("repo_downloads") ] ) ))r#r#}r#(hUhj#ubaubj)r#}r#(hUhjr hhhj h}r#(h]h]h]h]h]Uentries]r#((UsingleXBuild Steps; GerritX step-Gerritr #j #tr!#(UsingleXGerrit Build Stepj #j #tr"#euhMhhh]ubh)r##}r$#(hUhjr hhhhh}r%#(h]h]h]h]h]hj #uhMhhh]ubjp eubhhh}hhh}r&#(h]h]h]h]h]hU step-gerritr'#uhMhhh}r(#j #j##sh]ubshhh}r)#(h]h]h]h]r*#(jj'#j #eh]r+#(h*hVeuhMhhh}r,#(j #j##j'#jp uh]r-#(h)r.#}r/#(hjhjm hhhhh}r0#(h]h]h]h]h]hjuhMhhh]r1#hXGerritr2#r3#}r4#(hjhj.#ubaubj)r5#}r6#(hUhjm hNhj h}r7#(h]h]h]h]h]Uentries]r8#(jXDbuildbot.steps.source.gerrit.Gerrit (class in buildbot.steps.source)hTUtr9#auhNhhh]ubj )r:#}r;#(hUhjm hNhj h}r<#(j j Xpyh]h]h]h]h]j Xclassr=#j j=#uhNhhh]r>#(j )r?#}r@#(hX#buildbot.steps.source.gerrit.Gerrithj:#hhhj h}rA#(h]rB#hTaj j h]h]h]h]rC#hTaj X#buildbot.steps.source.gerrit.Gerritj Xbuildbot.steps.source.gerritj uhMhhh]rD#(j )rE#}rF#(hXclass hj?#hhhj h}rG#(h]h]h]h]h]uhMhhh]rH#hXclass rI#rJ#}rK#(hUhjE#ubaubj )rL#}rM#(hXbuildbot.steps.source.gerrit.hj?#hhhj h}rN#(h]h]h]h]h]uhMhhh]rO#hXbuildbot.steps.source.gerrit.rP#rQ#}rR#(hUhjL#ubaubj )rS#}rT#(hXGerrithj?#hhhj h}rU#(h]h]h]h]h]uhMhhh]rV#hXGerritrW#rX#}rY#(hUhjS#ubaubeubj )rZ#}r[#(hUhj:#hhhj h}r\#(h]h]h]h]h]uhMhhh]ubeubh)r]#}r^#(hXThis Source step is exactly like the :bb:step:`Git` checkout step , except that it integrates with :bb:chsrc:`GerritChangeSource`, and will automatically checkout the additional changes.hjm hhhhh}r_#(h]h]h]h]h]uhMhhh]r`#(hX%This Source step is exactly like the ra#rb#}rc#(hX%This Source step is exactly like the hj]#ubh)rd#}re#(hX:bb:step:`Git`rf#hj]#hhhhh}rg#(UreftypeXstephhXGitU refdomainXbbrh#h]h]U refexplicith]h]h]hhuhMh]ri#h)rj#}rk#(hjf#h}rl#(h]h]rm#(hjh#Xbb-steprn#eh]h]h]uhjd#h]ro#hXGitrp#rq#}rr#(hUhjj#ubahhubaubhX0 checkout step , except that it integrates with rs#rt#}ru#(hX0 checkout step , except that it integrates with hj]#ubh)rv#}rw#(hX:bb:chsrc:`GerritChangeSource`rx#hj]#hhhhh}ry#(UreftypeXchsrchhXGerritChangeSourceU refdomainXbbrz#h]h]U refexplicith]h]h]hhuhMh]r{#h)r|#}r}#(hjx#h}r~#(h]h]r#(hjz#Xbb-chsrcr#eh]h]h]uhjv#h]r#hXGerritChangeSourcer#r#}r#(hUhj|#ubahhubaubhX9, and will automatically checkout the additional changes.r#r#}r#(hX9, and will automatically checkout the additional changes.hj]#ubeubh)r#}r#(hXGerrit integration can be also triggered using forced build with property named ``gerrit_change`` with values in format ``change_number/patchset_number``. This property will be translated into a branch name. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.hjm hhhhh}r#(h]h]h]h]h]uhMhhh]r#(hXPGerrit integration can be also triggered using forced build with property named r#r#}r#(hXPGerrit integration can be also triggered using forced build with property named hj#ubh)r#}r#(hX``gerrit_change``h}r#(h]h]h]h]h]uhj#h]r#hX gerrit_changer#r#}r#(hUhj#ubahhubhX with values in format r#r#}r#(hX with values in format hj#ubh)r#}r#(hX!``change_number/patchset_number``h}r#(h]h]h]h]h]uhj#h]r#hXchange_number/patchset_numberr#r#}r#(hUhj#ubahhubhX. This property will be translated into a branch name. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.r#r#}r#(hX. This property will be translated into a branch name. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.hj#ubeubj)r#}r#(hUhjm hhhj h}r#(h]h]h]h]h]Uentries]r#((UsingleXBuild Steps; DarcsX step-Darcsr#j#tr#(UsingleXDarcs Build Stepj#j#tr#euhMhhh]ubh)r#}r#(hUhjm hhhhh}r#(h]h]h]h]h]hj#uhMhhh]ubjk eubhhh}hhh}r#(h]h]h]h]h]hU step-darcsr#uhMhhh}r#j#j#sh]ubshhh}r#(h]r#Xdarcsr#ah]h]h]r#(j)j#j#eh]r#hnauhMhhh}r#(j#j#j#jk uh]r#(h)r#}r#(hj.hjh hhhhh}r#(h]h]h]h]h]hj(uhMhhh]r#hXDarcsr#r#}r#(hj.hj#ubaubj)r#}r#(hUhjh hNhj h}r#(h]h]h]h]h]Uentries]r#(jXBbuildbot.steps.source.darcs.Darcs (class in buildbot.steps.source)hhUtr#auhNhhh]ubj )r#}r#(hUhjh hNhj h}r#(j j Xpyh]h]h]h]h]j Xclassr#j j#uhNhhh]r#(j )r#}r#(hX!buildbot.steps.source.darcs.Darcshj#hhhj h}r#(h]r#hhaj j h]h]h]h]r#hhaj X!buildbot.steps.source.darcs.Darcsj Xbuildbot.steps.source.darcsj uhMhhh]r#(j )r#}r#(hXclass hj#hhhj h}r#(h]h]h]h]h]uhMhhh]r#hXclass r#r#}r#(hUhj#ubaubj )r#}r#(hXbuildbot.steps.source.darcs.hj#hhhj h}r#(h]h]h]h]h]uhMhhh]r#hXbuildbot.steps.source.darcs.r#r#}r#(hUhj#ubaubj )r#}r#(hXDarcshj#hhhj h}r#(h]h]h]h]h]uhMhhh]r#hXDarcsr#r#}r#(hUhj#ubaubeubj )r#}r#(hUhj#hhhj h}r#(h]h]h]h]h]uhMhhh]ubeubh)r#}r#(hX]The :bb:step`Darcs` build step performs a `Darcs `_ checkout or update. ::hjh hhhhh}r#(h]h]h]h]h]uhMhhh]r#(hX*The :bb:step`Darcs` build step performs a r#r#}r#(hX*The :bb:step`Darcs` build step performs a hj#ubjM)r#}r#(hX`Darcs `_h}r#(UnameXDarcsj Xhttp://darcs.net/r#h]h]h]h]h]uhj#h]r#hXDarcsr#r#}r#(hUhj#ubahjYubh)r#}r#(hX hKhj#hhh}r#(Urefurij#h]r#Uid8r#ah]h]h]h]r#j#auh]ubhX checkout or update.r#r#}r#(hX checkout or update.hj#ubeubjS)r#}r#(hXfrom buildbot.steps.source.darcs import Darcs factory.addStep(Darcs(repourl='http://path/to/repo', mode='full', method='clobber', retry=(10, 1)))hjh hhhjVh}r$(jXjYh]h]h]h]h]uhMhhh]r$hXfrom buildbot.steps.source.darcs import Darcs factory.addStep(Darcs(repourl='http://path/to/repo', mode='full', method='clobber', retry=(10, 1)))r$r$}r$(hUhj#ubaubh)r$}r$(hX)Darcs step takes the following arguments:r$hjh hhhhh}r$(h]h]h]h]h]uhMhhh]r $hX)Darcs step takes the following arguments:r $r $}r $(hj$hj$ubaubj)r $}r$(hUhjh hhhjh}r$(h]h]h]h]h]uhNhhh]r$j)r$}r$(hXS``repourl`` (required): The URL at which the Darcs source repository is available. hj $hhhjh}r$(h]h]h]h]h]uhMh]r$(j)r$}r$(hX ``repourl``r$hj$hhhjh}r$(h]h]h]h]h]uhMh]r$h)r$}r$(hj$h}r$(h]h]h]h]h]uhj$h]r$hXrepourlr$r$}r $(hUhj$ubahhubaubj)r!$}r"$(hUh}r#$(h]h]h]h]h]uhj$h]r$$h)r%$}r&$(hXF(required): The URL at which the Darcs source repository is available.r'$hj!$hhhhh}r($(h]h]h]h]h]uhMh]r)$hXF(required): The URL at which the Darcs source repository is available.r*$r+$}r,$(hj'$hj%$ubaubahjubeubaubh)r-$}r.$(hX``mode``r/$hjh hhhhh}r0$(h]h]h]h]h]uhMhhh]r1$h)r2$}r3$(hj/$h}r4$(h]h]h]h]h]uhj-$h]r5$hXmoder6$r7$}r8$(hUhj2$ubahhubaubjx)r9$}r:$(hUhjh hhhj{h}r;$(h]h]h]h]h]uhNhhh]r<$(h)r=$}r>$(hX\(optional): defaults to ``'incremental'``. Specifies whether to clean the build tree or not.hj9$hhhhh}r?$(h]h]h]h]h]uhMh]r@$(hX(optional): defaults to rA$rB$}rC$(hX(optional): defaults to hj=$ubh)rD$}rE$(hX``'incremental'``h}rF$(h]h]h]h]h]uhj=$h]rG$hX 'incremental'rH$rI$}rJ$(hUhjD$ubahhubhX3. Specifies whether to clean the build tree or not.rK$rL$}rM$(hX3. Specifies whether to clean the build tree or not.hj=$ubeubjx)rN$}rO$(hUh}rP$(h]h]h]h]h]uhj9$h]rQ$j)rR$}rS$(hUh}rT$(h]h]h]h]h]uhjN$h]rU$(j)rV$}rW$(hXN``incremental`` The source is update, but any built files are left untouched. hjR$hhhjh}rX$(h]h]h]h]h]uhMh]rY$(j)rZ$}r[$(hX``incremental``r\$hjV$hhhjh}r]$(h]h]h]h]h]uhMh]r^$h)r_$}r`$(hj\$h}ra$(h]h]h]h]h]uhjZ$h]rb$hX incrementalrc$rd$}re$(hUhj_$ubahhubaubj)rf$}rg$(hUh}rh$(h]h]h]h]h]uhjV$h]ri$h)rj$}rk$(hX=The source is update, but any built files are left untouched.rl$hjf$hhhhh}rm$(h]h]h]h]h]uhMh]rn$hX=The source is update, but any built files are left untouched.ro$rp$}rq$(hjl$hjj$ubaubahjubeubj)rr$}rs$(hX``full`` The build tree is clean of any built files. The exact method for doing this is controlled by the ``method`` argument. hjR$hhhjh}rt$(h]h]h]h]h]uhMh]ru$(j)rv$}rw$(hX``full``rx$hjr$hhhjh}ry$(h]h]h]h]h]uhMh]rz$h)r{$}r|$(hjx$h}r}$(h]h]h]h]h]uhjv$h]r~$hXfullr$r$}r$(hUhj{$ubahhubaubj)r$}r$(hUh}r$(h]h]h]h]h]uhjr$h]r$h)r$}r$(hXuThe build tree is clean of any built files. The exact method for doing this is controlled by the ``method`` argument.hj$hhhhh}r$(h]h]h]h]h]uhMh]r$(hXaThe build tree is clean of any built files. The exact method for doing this is controlled by the r$r$}r$(hXaThe build tree is clean of any built files. The exact method for doing this is controlled by the hj$ubh)r$}r$(hX ``method``h}r$(h]h]h]h]h]uhj$h]r$hXmethodr$r$}r$(hUhj$ubahhubhX argument.r$r$}r$(hX argument.hj$ubeubahjubeubehjubahj{ubeubj)r$}r$(hUhjh hNhjh}r$(h]h]h]h]h]uhNhhh]r$j)r$}r$(hX``method`` (optional): defaults to ``copy`` when mode is ``full``. Darcs' incremental mode does not require a method. The full mode has two methods defined: ``clobber`` It removes the working directory for each build then makes full checkout. ``copy`` This first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory. hj$hhhjh}r$(h]h]h]h]h]uhMh]r$(j)r$}r$(hX ``method``r$hj$hhhjh}r$(h]h]h]h]h]uhMh]r$h)r$}r$(hj$h}r$(h]h]h]h]h]uhj$h]r$hXmethodr$r$}r$(hUhj$ubahhubaubj)r$}r$(hUh}r$(h]h]h]h]h]uhj$h]r$(h)r$}r$(hX(optional): defaults to ``copy`` when mode is ``full``. Darcs' incremental mode does not require a method. The full mode has two methods defined:hj$hhhhh}r$(h]h]h]h]h]uhMh]r$(hX(optional): defaults to r$r$}r$(hX(optional): defaults to hj$ubh)r$}r$(hX``copy``h}r$(h]h]h]h]h]uhj$h]r$hXcopyr$r$}r$(hUhj$ubahhubhX when mode is r$r$}r$(hX when mode is hj$ubh)r$}r$(hX``full``h}r$(h]h]h]h]h]uhj$h]r$hXfullr$r$}r$(hUhj$ubahhubhX[. Darcs' incremental mode does not require a method. The full mode has two methods defined:r$r$}r$(hX[. Darcs' incremental mode does not require a method. The full mode has two methods defined:hj$ubeubj)r$}r$(hUh}r$(h]h]h]h]h]uhj$h]r$(j)r$}r$(hXV``clobber`` It removes the working directory for each build then makes full checkout. hj$hhhjh}r$(h]h]h]h]h]uhM h]r$(j)r$}r$(hX ``clobber``r$hj$hhhjh}r$(h]h]h]h]h]uhM h]r$h)r$}r$(hj$h}r$(h]h]h]h]h]uhj$h]r$hXclobberr$r$}r$(hUhj$ubahhubaubj)r$}r$(hUh}r$(h]h]h]h]h]uhj$h]r$h)r$}r$(hXIIt removes the working directory for each build then makes full checkout.r$hj$hhhhh}r$(h]h]h]h]h]uhM h]r$hXIIt removes the working directory for each build then makes full checkout.r$r$}r$(hj$hj$ubaubahjubeubj)r$}r$(hX``copy`` This first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory. hj$hhhjh}r$(h]h]h]h]h]uhMh]r$(j)r$}r$(hX``copy``r$hj$hhhjh}r$(h]h]h]h]h]uhMh]r$h)r$}r$(hj$h}r$(h]h]h]h]h]uhj$h]r$hXcopyr$r$}r$(hUhj$ubahhubaubj)r$}r$(hUh}r$(h]h]h]h]h]uhj$h]r$h)r$}r$(hXThis first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory.hj$hhhhh}r%(h]h]h]h]h]uhMh]r%(hX?This first checkout source into source directory then copy the r%r%}r%(hX?This first checkout source into source directory then copy the hj$ubh)r%}r%(hX ``source``h}r%(h]h]h]h]h]uhj$h]r%hXsourcer %r %}r %(hUhj%ubahhubhX directory to r %r %}r%(hX directory to hj$ubh)r%}r%(hX ``build``h}r%(h]h]h]h]h]uhj$h]r%hXbuildr%r%}r%(hUhj%ubahhubhX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in r%r%}r%(hX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in hj$ubh)r%}r%(hX ``source``h}r%(h]h]h]h]h]uhj$h]r%hXsourcer%r%}r%(hUhj%ubahhubhX directory.r %r!%}r"%(hX directory.hj$ubeubahjubeubehjubehjubeubaubj)r#%}r$%(hUhjh hhhj h}r%%(h]h]h]h]h]Uentries]r&%((UsingleXBuild Steps; MonotoneX step-Monotoner'%j'%tr(%(UsingleXMonotone Build Stepj'%j'%tr)%euhMhhh]ubh)r*%}r+%(hUhjh hhhhh}r,%(h]h]h]h]h]hj'%uhMhhh]ubjf eubhhh}hhh}r-%(h]h]h]h]h]hU step-monotoner.%uhMhhh}r/%j'%j*%sh]ubshhh}r0%(h]r1%Xmonotoner2%ah]h]h]r3%(j<j.%j'%eh]r4%h{auhMhhh}r5%(j'%j*%j.%jf uh]r6%(h)r7%}r8%(hjAhjc hhhhh}r9%(h]h]h]h]h]hj;uhMhhh]r:%hXMonotoner;%r<%}r=%(hjAhj7%ubaubj)r>%}r?%(hUhjc hNhj h}r@%(h]h]h]h]h]Uentries]rA%(jXCbuildbot.steps.source.mtn.Monotone (class in buildbot.steps.source)hUtrB%auhNhhh]ubj )rC%}rD%(hUhjc hNhj h}rE%(j j Xpyh]h]h]h]h]j XclassrF%j jF%uhNhhh]rG%(j )rH%}rI%(hX"buildbot.steps.source.mtn.MonotonehjC%hhhj h}rJ%(h]rK%haj j h]h]h]h]rL%haj X"buildbot.steps.source.mtn.Monotonej Xbuildbot.steps.source.mtnj uhMhhh]rM%(j )rN%}rO%(hXclass hjH%hhhj h}rP%(h]h]h]h]h]uhMhhh]rQ%hXclass rR%rS%}rT%(hUhjN%ubaubj )rU%}rV%(hXbuildbot.steps.source.mtn.hjH%hhhj h}rW%(h]h]h]h]h]uhMhhh]rX%hXbuildbot.steps.source.mtn.rY%rZ%}r[%(hUhjU%ubaubj )r\%}r]%(hXMonotonehjH%hhhj h}r^%(h]h]h]h]h]uhMhhh]r_%hXMonotoner`%ra%}rb%(hUhj\%ubaubeubj )rc%}rd%(hUhjC%hhhj h}re%(h]h]h]h]h]uhMhhh]ubeubh)rf%}rg%(hXuThe :bb:step:`Monotone ` build step performs a `Monotone `_ checkout or update. ::hjc hhhhh}rh%(h]h]h]h]h]uhM hhh]ri%(hXThe rj%rk%}rl%(hXThe hjf%ubh)rm%}rn%(hX:bb:step:`Monotone `ro%hjf%hhhhh}rp%(UreftypeXstephhXMonotoneU refdomainXbbrq%h]h]U refexplicith]h]h]hhuhM h]rr%h)rs%}rt%(hjo%h}ru%(h]h]rv%(hjq%Xbb-steprw%eh]h]h]uhjm%h]rx%hXMonotonery%rz%}r{%(hUhjs%ubahhubaubhX build step performs a r|%r}%}r~%(hX build step performs a hjf%ubjM)r%}r%(hX%`Monotone `_h}r%(UnameXMonotonej Xhttp://www.monotone.ca/r%h]h]h]h]h]uhjf%h]r%hXMonotoner%r%}r%(hUhj%ubahjYubh)r%}r%(hX hKhjf%hhh}r%(Urefurij%h]r%Uid9r%ah]h]h]h]r%j2%auh]ubhX checkout or update.r%r%}r%(hX checkout or update.hjf%ubeubjS)r%}r%(hXfrom buildbot.steps.source.mtn import Monotone factory.addStep(Darcs(repourl='http://path/to/repo', mode='full', method='clobber', branch='some.branch.name', retry=(10, 1)))hjc hhhjVh}r%(jXjYh]h]h]h]h]uhM#hhh]r%hXfrom buildbot.steps.source.mtn import Monotone factory.addStep(Darcs(repourl='http://path/to/repo', mode='full', method='clobber', branch='some.branch.name', retry=(10, 1)))r%r%}r%(hUhj%ubaubh)r%}r%(hX,Monotone step takes the following arguments:r%hjc hhhhh}r%(h]h]h]h]h]uhM)hhh]r%hX,Monotone step takes the following arguments:r%r%}r%(hj%hj%ubaubj)r%}r%(hUhjc hhhjh}r%(h]h]h]h]h]uhNhhh]r%(j)r%}r%(hXJ``repourl`` the URL at which the Monotone source repository is available. hj%hhhjh}r%(h]h]h]h]h]uhM,h]r%(j)r%}r%(hX ``repourl``r%hj%hhhjh}r%(h]h]h]h]h]uhM,h]r%h)r%}r%(hj%h}r%(h]h]h]h]h]uhj%h]r%hXrepourlr%r%}r%(hUhj%ubahhubaubj)r%}r%(hUh}r%(h]h]h]h]h]uhj%h]r%h)r%}r%(hX=the URL at which the Monotone source repository is available.r%hj%hhhhh}r%(h]h]h]h]h]uhM,h]r%hX=the URL at which the Monotone source repository is available.r%r%}r%(hj%hj%ubaubahjubeubj)r%}r%(hXf``branch`` this specifies the name of the branch to use when a Build does not provide one of its own. hj%hhhjh}r%(h]h]h]h]h]uhM0hhh]r%(j)r%}r%(hX ``branch``r%hj%hhhjh}r%(h]h]h]h]h]uhM0h]r%h)r%}r%(hj%h}r%(h]h]h]h]h]uhj%h]r%hXbranchr%r%}r%(hUhj%ubahhubaubj)r%}r%(hUh}r%(h]h]h]h]h]uhj%h]r%h)r%}r%(hXZthis specifies the name of the branch to use when a Build does not provide one of its own.r%hj%hhhhh}r%(h]h]h]h]h]uhM/h]r%hXZthis specifies the name of the branch to use when a Build does not provide one of its own.r%r%}r%(hj%hj%ubaubahjubeubj)r%}r%(hX``progress`` this is a boolean that has a pull from the repository use ``--ticker=dot`` instead of the default ``--ticker=none``. hj%hhhjh}r%(h]h]h]h]h]uhM5hhh]r%(j)r%}r%(hX ``progress``r%hj%hhhjh}r%(h]h]h]h]h]uhM5h]r%h)r%}r%(hj%h}r%(h]h]h]h]h]uhj%h]r%hXprogressr%r%}r%(hUhj%ubahhubaubj)r%}r%(hUh}r%(h]h]h]h]h]uhj%h]r%h)r%}r%(hXtthis is a boolean that has a pull from the repository use ``--ticker=dot`` instead of the default ``--ticker=none``.hj%hhhhh}r%(h]h]h]h]h]uhM3h]r%(hX:this is a boolean that has a pull from the repository use r%r%}r%(hX:this is a boolean that has a pull from the repository use hj%ubh)r%}r%(hX``--ticker=dot``h}r%(h]h]h]h]h]uhj%h]r%hX --ticker=dotr%r%}r%(hUhj%ubahhubhX instead of the default r%r%}r%(hX instead of the default hj%ubh)r&}r&(hX``--ticker=none``h}r&(h]h]h]h]h]uhj%h]r&hX --ticker=noner&r&}r&(hUhj&ubahhubhX.r&}r&(hX.hj%ubeubahjubeubeubh)r &}r &(hX``mode``r &hjc hhhhh}r &(h]h]h]h]h]uhM7hhh]r &h)r&}r&(hj &h}r&(h]h]h]h]h]uhj &h]r&hXmoder&r&}r&(hUhj&ubahhubaubjx)r&}r&(hUhjc hhhj{h}r&(h]h]h]h]h]uhNhhh]r&(h)r&}r&(hX\(optional): defaults to ``'incremental'``. Specifies whether to clean the build tree or not.hj&hhhhh}r&(h]h]h]h]h]uhM9h]r&(hX(optional): defaults to r&r&}r&(hX(optional): defaults to hj&ubh)r &}r!&(hX``'incremental'``h}r"&(h]h]h]h]h]uhj&h]r#&hX 'incremental'r$&r%&}r&&(hUhj &ubahhubhX3. Specifies whether to clean the build tree or not.r'&r(&}r)&(hX3. Specifies whether to clean the build tree or not.hj&ubeubjx)r*&}r+&(hUh}r,&(h]h]h]h]h]uhj&h]r-&j)r.&}r/&(hUh}r0&(h]h]h]h]h]uhj*&h]r1&(j)r2&}r3&(hXN``incremental`` The source is update, but any built files are left untouched. hj.&hhhjh}r4&(h]h]h]h]h]uhM=h]r5&(j)r6&}r7&(hX``incremental``r8&hj2&hhhjh}r9&(h]h]h]h]h]uhM=h]r:&h)r;&}r<&(hj8&h}r=&(h]h]h]h]h]uhj6&h]r>&hX incrementalr?&r@&}rA&(hUhj;&ubahhubaubj)rB&}rC&(hUh}rD&(h]h]h]h]h]uhj2&h]rE&h)rF&}rG&(hX=The source is update, but any built files are left untouched.rH&hjB&hhhhh}rI&(h]h]h]h]h]uhM=h]rJ&hX=The source is update, but any built files are left untouched.rK&rL&}rM&(hjH&hjF&ubaubahjubeubj)rN&}rO&(hX``full`` The build tree is clean of any built files. The exact method for doing this is controlled by the ``method`` argument. hj.&hhhjh}rP&(h]h]h]h]h]uhMBh]rQ&(j)rR&}rS&(hX``full``rT&hjN&hhhjh}rU&(h]h]h]h]h]uhMBh]rV&h)rW&}rX&(hjT&h}rY&(h]h]h]h]h]uhjR&h]rZ&hXfullr[&r\&}r]&(hUhjW&ubahhubaubj)r^&}r_&(hUh}r`&(h]h]h]h]h]uhjN&h]ra&h)rb&}rc&(hXuThe build tree is clean of any built files. The exact method for doing this is controlled by the ``method`` argument.hj^&hhhhh}rd&(h]h]h]h]h]uhM@h]re&(hXaThe build tree is clean of any built files. The exact method for doing this is controlled by the rf&rg&}rh&(hXaThe build tree is clean of any built files. The exact method for doing this is controlled by the hjb&ubh)ri&}rj&(hX ``method``h}rk&(h]h]h]h]h]uhjb&h]rl&hXmethodrm&rn&}ro&(hUhji&ubahhubhX argument.rp&rq&}rr&(hX argument.hjb&ubeubahjubeubehjubahj{ubeubh)rs&}rt&(hX ``method``ru&hjc hhhhh}rv&(h]h]h]h]h]uhMDhhh]rw&h)rx&}ry&(hju&h}rz&(h]h]h]h]h]uhjs&h]r{&hXmethodr|&r}&}r~&(hUhjx&ubahhubaubjx)r&}r&(hUhjc hNhj{h}r&(h]h]h]h]h]uhNhhh]r&(h)r&}r&(hX(optional): defaults to ``copy`` when mode is ``full``. Monotone's incremental mode does not require a method. The full mode has four methods defined:hj&hhhhh}r&(h]h]h]h]h]uhMFh]r&(hX(optional): defaults to r&r&}r&(hX(optional): defaults to hj&ubh)r&}r&(hX``copy``h}r&(h]h]h]h]h]uhj&h]r&hXcopyr&r&}r&(hUhj&ubahhubhX when mode is r&r&}r&(hX when mode is hj&ubh)r&}r&(hX``full``h}r&(h]h]h]h]h]uhj&h]r&hXfullr&r&}r&(hUhj&ubahhubhX`. Monotone's incremental mode does not require a method. The full mode has four methods defined:r&r&}r&(hX`. Monotone's incremental mode does not require a method. The full mode has four methods defined:hj&ubeubj)r&}r&(hUh}r&(h]h]h]h]h]uhj&h]r&(j)r&}r&(hX``clobber`` It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository. hj&hhhjh}r&(h]h]h]h]h]uhMLh]r&(j)r&}r&(hX ``clobber``r&hj&hhhjh}r&(h]h]h]h]h]uhMLh]r&h)r&}r&(hj&h}r&(h]h]h]h]h]uhj&h]r&hXclobberr&r&}r&(hUhj&ubahhubaubj)r&}r&(hUh}r&(h]h]h]h]h]uhj&h]r&h)r&}r&(hXIt removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository.r&hj&hhhhh}r&(h]h]h]h]h]uhMKh]r&hXIt removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repository.r&r&}r&(hj&hj&ubaubahjubeubj)r&}r&(hX``clean`` This remove all other files except those tracked and ignored by Monotone. It will remove all the files that appear in :command:`mtn ls unknown`. Then it will pull from remote and update the working directory. hj&hhhjh}r&(h]h]h]h]h]uhMQh]r&(j)r&}r&(hX ``clean``r&hj&hhhjh}r&(h]h]h]h]h]uhMQh]r&h)r&}r&(hj&h}r&(h]h]h]h]h]uhj&h]r&hXcleanr&r&}r&(hUhj&ubahhubaubj)r&}r&(hUh}r&(h]h]h]h]h]uhj&h]r&h)r&}r&(hXThis remove all other files except those tracked and ignored by Monotone. It will remove all the files that appear in :command:`mtn ls unknown`. Then it will pull from remote and update the working directory.hj&hhhhh}r&(h]h]h]h]h]uhMOh]r&(hXvThis remove all other files except those tracked and ignored by Monotone. It will remove all the files that appear in r&r&}r&(hXvThis remove all other files except those tracked and ignored by Monotone. It will remove all the files that appear in hj&ubjL)r&}r&(hX:command:`mtn ls unknown`h}r&(h]h]r&jQah]h]h]uhj&h]r&hXmtn ls unknownr&r&}r&(hUhj&ubahjVubhXA. Then it will pull from remote and update the working directory.r&r&}r&(hXA. Then it will pull from remote and update the working directory.hj&ubeubahjubeubj)r&}r&(hX``fresh`` This remove all other files except those tracked by Monotone. It will remove all the files that appear in :command:`mtn ls ignored` and :command:`mtn ls unknows`. Then pull and update similar to ``clean`` hj&hhhjh}r&(h]h]h]h]h]uhMVh]r&(j)r&}r&(hX ``fresh``r&hj&hhhjh}r&(h]h]h]h]h]uhMVh]r&h)r&}r&(hj&h}r&(h]h]h]h]h]uhj&h]r&hXfreshr&r&}r&(hUhj&ubahhubaubj)r&}r&(hUh}r&(h]h]h]h]h]uhj&h]r&h)r&}r&(hXThis remove all other files except those tracked by Monotone. It will remove all the files that appear in :command:`mtn ls ignored` and :command:`mtn ls unknows`. Then pull and update similar to ``clean``hj&hhhhh}r&(h]h]h]h]h]uhMTh]r&(hXjThis remove all other files except those tracked by Monotone. It will remove all the files that appear in r&r&}r&(hXjThis remove all other files except those tracked by Monotone. It will remove all the files that appear in hj&ubjL)r&}r'(hX:command:`mtn ls ignored`h}r'(h]h]r'jQah]h]h]uhj&h]r'hXmtn ls ignoredr'r'}r'(hUhj&ubahjVubhX and r'r'}r '(hX and hj&ubjL)r '}r '(hX:command:`mtn ls unknows`h}r '(h]h]r 'jQah]h]h]uhj&h]r'hXmtn ls unknowsr'r'}r'(hUhj 'ubahjVubhX". Then pull and update similar to r'r'}r'(hX". Then pull and update similar to hj&ubh)r'}r'(hX ``clean``h}r'(h]h]h]h]h]uhj&h]r'hXcleanr'r'}r'(hUhj'ubahhubeubahjubeubj)r'}r'(hX``copy`` This first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory. hj&hhhjh}r'(h]h]h]h]h]uhM_h]r'(j)r '}r!'(hX``copy``r"'hj'hhhjh}r#'(h]h]h]h]h]uhM_h]r$'h)r%'}r&'(hj"'h}r''(h]h]h]h]h]uhj 'h]r('hXcopyr)'r*'}r+'(hUhj%'ubahhubaubj)r,'}r-'(hUh}r.'(h]h]h]h]h]uhj'h]r/'h)r0'}r1'(hXThis first checkout source into source directory then copy the ``source`` directory to ``build`` directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in ``source`` directory.hj,'hhhhh}r2'(h]h]h]h]h]uhMYh]r3'(hX?This first checkout source into source directory then copy the r4'r5'}r6'(hX?This first checkout source into source directory then copy the hj0'ubh)r7'}r8'(hX ``source``h}r9'(h]h]h]h]h]uhj0'h]r:'hXsourcer;'r<'}r='(hUhj7'ubahhubhX directory to r>'r?'}r@'(hX directory to hj0'ubh)rA'}rB'(hX ``build``h}rC'(h]h]h]h]h]uhj0'h]rD'hXbuildrE'rF'}rG'(hUhjA'ubahhubhX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in rH'rI'}rJ'(hX  directory then performs the build operation in the copied directory. This way we make fresh builds with very less bandwidth to download source. The behavior of source checkout follows exactly same as incremental. It performs all the incremental checkout behavior in hj0'ubh)rK'}rL'(hX ``source``h}rM'(h]h]h]h]h]uhj0'h]rN'hXsourcerO'rP'}rQ'(hUhjK'ubahhubhX directory.rR'rS'}rT'(hX directory.hj0'ubeubahjubeubehjubeubja eubhhhhh}rU'(h]h]h]h]h]hjOuhMahhh]ubshhh}rV'(h]h]h]h]rW'(jOUid10rX'eh]rY'(hBhleuhMdhhh}rZ'jOja sh]r['(h)r\'}r]'(hjThj^ hhhhh}r^'(h]h]h]h]h]hjNuhMdhhh]r_'hXSource Checkout (Slave-Side)r`'ra'}rb'(hjThj\'ubaubh)rc'}rd'(hXThis section describes the more mature slave-side source steps. Where possible, new users should use the master-side source checkout steps, as the slave-side steps will be removed in a future version. See :ref:`Source-Checkout`.hj^ hhhhh}re'(h]h]h]h]h]uhMfhhh]rf'(hXThis section describes the more mature slave-side source steps. Where possible, new users should use the master-side source checkout steps, as the slave-side steps will be removed in a future version. See rg'rh'}ri'(hXThis section describes the more mature slave-side source steps. Where possible, new users should use the master-side source checkout steps, as the slave-side steps will be removed in a future version. See hjc'ubh)rj'}rk'(hX:ref:`Source-Checkout`rl'hjc'hhhhh}rm'(UreftypeXrefhhXsource-checkoutU refdomainXstdrn'h]h]U refexplicith]h]h]hhuhMfh]ro'jW)rp'}rq'(hjl'h}rr'(h]h]rs'(hjn'Xstd-refrt'eh]h]h]uhjj'h]ru'hXSource-Checkoutrv'rw'}rx'(hUhjp'ubahjaubaubhX.ry'}rz'(hX.hjc'ubeubh)r{'}r|'(hXLThe first step of any build is typically to acquire the source code from which the build will be performed. There are several classes to handle this, one for each of the different source control system that Buildbot knows about. For a description of how Buildbot treats source control in general, see :ref:`Version-Control-Systems`.hj^ hhhhh}r}'(h]h]h]h]h]uhMkhhh]r~'(hX-The first step of any build is typically to acquire the source code from which the build will be performed. There are several classes to handle this, one for each of the different source control system that Buildbot knows about. For a description of how Buildbot treats source control in general, see r'r'}r'(hX-The first step of any build is typically to acquire the source code from which the build will be performed. There are several classes to handle this, one for each of the different source control system that Buildbot knows about. For a description of how Buildbot treats source control in general, see hj{'ubh)r'}r'(hX:ref:`Version-Control-Systems`r'hj{'hhhhh}r'(UreftypeXrefhhXversion-control-systemsU refdomainXstdr'h]h]U refexplicith]h]h]hhuhMkh]r'jW)r'}r'(hj'h}r'(h]h]r'(hj'Xstd-refr'eh]h]h]uhj'h]r'hXVersion-Control-Systemsr'r'}r'(hUhj'ubahjaubaubhX.r'}r'(hX.hj{'ubeubh)r'}r'(hXAll source checkout steps accept some common parameters to control how they get the sources and where they should be placed. The remaining per-VC-system parameters are mostly to specify where exactly the sources are coming from.r'hj^ hhhhh}r'(h]h]h]h]h]uhMqhhh]r'hXAll source checkout steps accept some common parameters to control how they get the sources and where they should be placed. The remaining per-VC-system parameters are mostly to specify where exactly the sources are coming from.r'r'}r'(hj'hj'ubaubj)r'}r'(hUhj^ hNhjh}r'(h]h]h]h]h]uhNhhh]r'(j)r'}r'(hXT ``mode`` a string describing the kind of VC operation that is desired. Defaults to ``update``. ``update`` specifies that the CVS checkout/update should be performed directly into the workdir. Each build is performed in the same directory, allowing for incremental builds. This minimizes disk space, bandwidth, and CPU time. However, it may encounter problems if the build process does not handle dependencies properly (sometimes you must do a *clean build* to make sure everything gets compiled), or if source files are deleted but generated files can influence test behavior (e.g. Python's .pyc files), or when source directories are deleted but generated files prevent CVS from removing them. Builds ought to be correct regardless of whether they are done *from scratch* or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style. ``copy`` specifies that the CVS workspace should be maintained in a separate directory (called the :file:`copydir`), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (``rm -rf workdir; cp -r copydir workdir``). This doubles the disk space required, but keeps the bandwidth low (update instead of a full checkout). A full 'clean' build is performed each time. This avoids any generated-file build problems, but is still occasionally vulnerable to CVS problems such as a repository being manually rearranged, causing CVS errors on update which are not an issue with a full checkout. .. TODO: something is screwy about this, revisit. Is it the source directory or the working directory that is deleted each time? ``clobber`` specifies that the working directory should be deleted each time, necessitating a full checkout for each build. This insures a clean build off a complete checkout, avoiding any of the problems described above. This mode exercises the *from-scratch* build style. ``export`` this is like ``clobber``, except that the ``cvs export`` command is used to create the working directory. This command removes all CVS metadata files (the :file:`CVS/` directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file). hj'hhhjh}r'(h]h]h]h]h]uhMh]r'(j)r'}r'(hX``mode``r'hj'hhhjh}r'(h]h]h]h]h]uhMh]r'h)r'}r'(hj'h}r'(h]h]h]h]h]uhj'h]r'hXmoder'r'}r'(hUhj'ubahhubaubj)r'}r'(hUh}r'(h]h]h]h]h]uhj'h]r'(h)r'}r'(hXUa string describing the kind of VC operation that is desired. Defaults to ``update``.hj'hhhhh}r'(h]h]h]h]h]uhMwh]r'(hXJa string describing the kind of VC operation that is desired. Defaults to r'r'}r'(hXJa string describing the kind of VC operation that is desired. Defaults to hj'ubh)r'}r'(hX ``update``h}r'(h]h]h]h]h]uhj'h]r'hXupdater'r'}r'(hUhj'ubahhubhX.r'}r'(hX.hj'ubeubj)r'}r'(hUh}r'(h]h]h]h]h]uhj'h]r'(j)r'}r'(hX``update`` specifies that the CVS checkout/update should be performed directly into the workdir. Each build is performed in the same directory, allowing for incremental builds. This minimizes disk space, bandwidth, and CPU time. However, it may encounter problems if the build process does not handle dependencies properly (sometimes you must do a *clean build* to make sure everything gets compiled), or if source files are deleted but generated files can influence test behavior (e.g. Python's .pyc files), or when source directories are deleted but generated files prevent CVS from removing them. Builds ought to be correct regardless of whether they are done *from scratch* or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style. hj'hhhjh}r'(h]h]h]h]h]uhMh]r'(j)r'}r'(hX ``update``r'hj'hhhjh}r'(h]h]h]h]h]uhMh]r'h)r'}r'(hj'h}r'(h]h]h]h]h]uhj'h]r'hXupdater'r'}r'(hUhj'ubahhubaubj)r'}r'(hUh}r'(h]h]h]h]h]uhj'h]r'h)r'}r'(hXspecifies that the CVS checkout/update should be performed directly into the workdir. Each build is performed in the same directory, allowing for incremental builds. This minimizes disk space, bandwidth, and CPU time. However, it may encounter problems if the build process does not handle dependencies properly (sometimes you must do a *clean build* to make sure everything gets compiled), or if source files are deleted but generated files can influence test behavior (e.g. Python's .pyc files), or when source directories are deleted but generated files prevent CVS from removing them. Builds ought to be correct regardless of whether they are done *from scratch* or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style.hj'hhhhh}r'(h]h]h]h]h]uhM{h]r'(hXQspecifies that the CVS checkout/update should be performed directly into the workdir. Each build is performed in the same directory, allowing for incremental builds. This minimizes disk space, bandwidth, and CPU time. However, it may encounter problems if the build process does not handle dependencies properly (sometimes you must do a r'r'}r'(hXQspecifies that the CVS checkout/update should be performed directly into the workdir. Each build is performed in the same directory, allowing for incremental builds. This minimizes disk space, bandwidth, and CPU time. However, it may encounter problems if the build process does not handle dependencies properly (sometimes you must do a hj'ubjW)r'}r'(hX *clean build*h}r'(h]h]h]h]h]uhj'h]r'hX clean buildr'r'}r'(hUhj'ubahjaubhX. to make sure everything gets compiled), or if source files are deleted but generated files can influence test behavior (e.g. Python's .pyc files), or when source directories are deleted but generated files prevent CVS from removing them. Builds ought to be correct regardless of whether they are done r'r'}r'(hX. to make sure everything gets compiled), or if source files are deleted but generated files can influence test behavior (e.g. Python's .pyc files), or when source directories are deleted but generated files prevent CVS from removing them. Builds ought to be correct regardless of whether they are done hj'ubjW)r'}r'(hX*from scratch*h}r'(h]h]h]h]h]uhj'h]r'hX from scratchr'r'}r'(hUhj'ubahjaubhXh or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style.r'r'}r'(hXh or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style.hj'ubeubahjubeubj)r'}r'(hX``copy`` specifies that the CVS workspace should be maintained in a separate directory (called the :file:`copydir`), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (``rm -rf workdir; cp -r copydir workdir``). This doubles the disk space required, but keeps the bandwidth low (update instead of a full checkout). A full 'clean' build is performed each time. This avoids any generated-file build problems, but is still occasionally vulnerable to CVS problems such as a repository being manually rearranged, causing CVS errors on update which are not an issue with a full checkout. .. TODO: something is screwy about this, revisit. Is it the source directory or the working directory that is deleted each time? hj'hhhjh}r'(h]h]h]h]h]uhMh]r'(j)r'}r'(hX``copy``r'hj'hhhjh}r'(h]h]h]h]h]uhMh]r'h)r'}r((hj'h}r((h]h]h]h]h]uhj'h]r(hXcopyr(r(}r((hUhj'ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj'h]r ((h)r (}r ((hXyspecifies that the CVS workspace should be maintained in a separate directory (called the :file:`copydir`), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (``rm -rf workdir; cp -r copydir workdir``). This doubles the disk space required, but keeps the bandwidth low (update instead of a full checkout). A full 'clean' build is performed each time. This avoids any generated-file build problems, but is still occasionally vulnerable to CVS problems such as a repository being manually rearranged, causing CVS errors on update which are not an issue with a full checkout.hj(hhhhh}r ((h]h]h]h]h]uhMh]r ((hXZspecifies that the CVS workspace should be maintained in a separate directory (called the r(r(}r((hXZspecifies that the CVS workspace should be maintained in a separate directory (called the hj (ubh)r(}r((hUh}r((h]h]h]h]r(Xfiler(aUrolej(h]uhj (h]r(hXcopydirr(r(}r((hXcopydirhj(ubahhubhXs), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (r(r(}r((hXs), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (hj (ubh)r(}r((hX)``rm -rf workdir; cp -r copydir workdir``h}r((h]h]h]h]h]uhj (h]r (hX%rm -rf workdir; cp -r copydir workdirr!(r"(}r#((hUhj(ubahhubhXt). This doubles the disk space required, but keeps the bandwidth low (update instead of a full checkout). A full 'clean' build is performed each time. This avoids any generated-file build problems, but is still occasionally vulnerable to CVS problems such as a repository being manually rearranged, causing CVS errors on update which are not an issue with a full checkout.r$(r%(}r&((hXt). This doubles the disk space required, but keeps the bandwidth low (update instead of a full checkout). A full 'clean' build is performed each time. This avoids any generated-file build problems, but is still occasionally vulnerable to CVS problems such as a repository being manually rearranged, causing CVS errors on update which are not an issue with a full checkout.hj (ubeubcdocutils.nodes comment r'()r((}r)((hX}TODO: something is screwy about this, revisit. Is it the source directory or the working directory that is deleted each time?h}r*((jXjYh]h]h]h]h]uhj(h]r+(hX}TODO: something is screwy about this, revisit. Is it the source directory or the working directory that is deleted each time?r,(r-(}r.((hUhj((ubahUcommentr/(ubehjubeubj)r0(}r1((hX``clobber`` specifies that the working directory should be deleted each time, necessitating a full checkout for each build. This insures a clean build off a complete checkout, avoiding any of the problems described above. This mode exercises the *from-scratch* build style. hj'hhhjh}r2((h]h]h]h]h]uhMh]r3((j)r4(}r5((hX ``clobber``r6(hj0(hhhjh}r7((h]h]h]h]h]uhMh]r8(h)r9(}r:((hj6(h}r;((h]h]h]h]h]uhj4(h]r<(hXclobberr=(r>(}r?((hUhj9(ubahhubaubj)r@(}rA((hUh}rB((h]h]h]h]h]uhj0(h]rC(h)rD(}rE((hXspecifies that the working directory should be deleted each time, necessitating a full checkout for each build. This insures a clean build off a complete checkout, avoiding any of the problems described above. This mode exercises the *from-scratch* build style.hj@(hhhhh}rF((h]h]h]h]h]uhMh]rG((hXspecifies that the working directory should be deleted each time, necessitating a full checkout for each build. This insures a clean build off a complete checkout, avoiding any of the problems described above. This mode exercises the rH(rI(}rJ((hXspecifies that the working directory should be deleted each time, necessitating a full checkout for each build. This insures a clean build off a complete checkout, avoiding any of the problems described above. This mode exercises the hjD(ubjW)rK(}rL((hX*from-scratch*h}rM((h]h]h]h]h]uhjD(h]rN(hX from-scratchrO(rP(}rQ((hUhjK(ubahjaubhX build style.rR(rS(}rT((hX build style.hjD(ubeubahjubeubj)rU(}rV((hX9``export`` this is like ``clobber``, except that the ``cvs export`` command is used to create the working directory. This command removes all CVS metadata files (the :file:`CVS/` directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file). hj'hhhjh}rW((h]h]h]h]h]uhMh]rX((j)rY(}rZ((hX ``export``r[(hjU(hhhjh}r\((h]h]h]h]h]uhMh]r](h)r^(}r_((hj[(h}r`((h]h]h]h]h]uhjY(h]ra(hXexportrb(rc(}rd((hUhj^(ubahhubaubj)re(}rf((hUh}rg((h]h]h]h]h]uhjU(h]rh(h)ri(}rj((hX-this is like ``clobber``, except that the ``cvs export`` command is used to create the working directory. This command removes all CVS metadata files (the :file:`CVS/` directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file).hje(hhhhh}rk((h]h]h]h]h]uhMh]rl((hX this is like rm(rn(}ro((hX this is like hji(ubh)rp(}rq((hX ``clobber``h}rr((h]h]h]h]h]uhji(h]rs(hXclobberrt(ru(}rv((hUhjp(ubahhubhX, except that the rw(rx(}ry((hX, except that the hji(ubh)rz(}r{((hX``cvs export``h}r|((h]h]h]h]h]uhji(h]r}(hX cvs exportr~(r(}r((hUhjz(ubahhubhXc command is used to create the working directory. This command removes all CVS metadata files (the r(r(}r((hXc command is used to create the working directory. This command removes all CVS metadata files (the hji(ubh)r(}r((hUh}r((h]h]h]h]r(Xfiler(aUrolej(h]uhji(h]r(hXCVS/r(r(}r((hXCVS/hj(ubahhubhX directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file).r(r(}r((hX directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file).hji(ubeubahjubeubehjubehjubeubj)r(}r((hX``workdir`` As for all steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself). hj'hhhjh}r((h]h]h]h]h]uhMhhh]r((j)r(}r((hX ``workdir``r(hj(hhhjh}r((h]h]h]h]h]uhMh]r(h)r(}r((hj(h}r((h]h]h]h]h]uhj(h]r(hXworkdirr(r(}r((hUhj(ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj(h]r(h)r(}r((hXAs for all steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself).r(hj(hhhhh}r((h]h]h]h]h]uhMh]r(hXAs for all steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself).r(r(}r((hj(hj(ubaubahjubeubj)r(}r((hX``alwaysUseLatest`` if ``True``, bypass the usual `update to the last Change` behavior, and always update to the latest changes instead. hj'hhhjh}r((h]h]h]h]h]uhMhhh]r((j)r(}r((hX``alwaysUseLatest``r(hj(hhhjh}r((h]h]h]h]h]uhMh]r(h)r(}r((hj(h}r((h]h]h]h]h]uhj(h]r(hXalwaysUseLatestr(r(}r((hUhj(ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj(h]r(h)r(}r((hXtif ``True``, bypass the usual `update to the last Change` behavior, and always update to the latest changes instead.hj(hhhhh}r((h]h]h]h]h]uhMh]r((hXif r(r(}r((hXif hj(ubh)r(}r((hX``True``h}r((h]h]h]h]h]uhj(h]r(hXTruer(r(}r((hUhj(ubahhubhX, bypass the usual r(r(}r((hX, bypass the usual hj(ubjE)r(}r((hX`update to the last Change`h}r((h]h]h]h]h]uhj(h]r(hXupdate to the last Changer(r(}r((hUhj(ubahjMubhX; behavior, and always update to the latest changes instead.r(r(}r((hX; behavior, and always update to the latest changes instead.hj(ubeubahjubeubj)r(}r((hX``retry`` If set, this specifies a tuple of ``(delay, repeats)`` which means that when a full VC checkout fails, it should be retried up to `repeats` times, waiting `delay` seconds between attempts. If you don't provide this, it defaults to ``None``, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections. hj'hhhjh}r((h]h]h]h]h]uhMhhh]r((j)r(}r((hX ``retry``r(hj(hhhjh}r((h]h]h]h]h]uhMh]r(h)r(}r((hj(h}r((h]h]h]h]h]uhj(h]r(hXretryr(r(}r((hUhj(ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj(h]r(h)r(}r((hXIf set, this specifies a tuple of ``(delay, repeats)`` which means that when a full VC checkout fails, it should be retried up to `repeats` times, waiting `delay` seconds between attempts. If you don't provide this, it defaults to ``None``, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.hj(hhhhh}r((h]h]h]h]h]uhMh]r((hX"If set, this specifies a tuple of r(r(}r((hX"If set, this specifies a tuple of hj(ubh)r(}r((hX``(delay, repeats)``h}r((h]h]h]h]h]uhj(h]r(hX(delay, repeats)r(r(}r((hUhj(ubahhubhXL which means that when a full VC checkout fails, it should be retried up to r(r(}r((hXL which means that when a full VC checkout fails, it should be retried up to hj(ubjE)r)}r)(hX `repeats`h}r)(h]h]h]h]h]uhj(h]r)hXrepeatsr)r)}r)(hUhj)ubahjMubhX times, waiting r)r)}r )(hX times, waiting hj(ubjE)r )}r )(hX`delay`h}r )(h]h]h]h]h]uhj(h]r )hXdelayr)r)}r)(hUhj )ubahjMubhXE seconds between attempts. If you don't provide this, it defaults to r)r)}r)(hXE seconds between attempts. If you don't provide this, it defaults to hj(ubh)r)}r)(hX``None``h}r)(h]h]h]h]h]uhj(h]r)hXNoner)r)}r)(hUhj)ubahhubhX, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.r)r)}r)(hX, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.hj(ubeubahjubeubj)r)}r)(hX``repository`` The name of this parameter might varies depending on the Source step you are running. The concept explained here is common to all steps and applies to ``repourl`` as well as for ``baseURL`` (when applicable). Buildbot, now being aware of the repository name via the change source, might in some cases not need the repository url. There are multiple way to pass it through to this step, those correspond to the type of the parameter given to this step: ``None`` In the case where no parameter is specified, the repository url will be taken exactly from the Change attribute. You are looking for that one if your ChangeSource step has all information about how to reach the Change. string The parameter might be a string, in this case, this string will be taken as the repository url, and nothing more. the value coming from the ChangeSource step will be forgotten. format string If the parameter is a string containing ``%s``, then this the repository attribute from the :class:`Change` will be place in place of the ``%s``. This is useful when the change source knows where the repository resides locally, but don't know the scheme used to access it. For instance ``ssh://server/%s`` makes sense if the the repository attribute is the local path of the repository. dict In this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter. callable The callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL. .. note:: this is quite similar to the mechanism used by the WebStatus for the ``changecommentlink``, ``projects`` or ``repositories`` parameter. hj'hhhjh}r )(h]h]h]h]h]uhMhhh]r!)(j)r")}r#)(hX``repository``r$)hj)hhhjh}r%)(h]h]h]h]h]uhMh]r&)h)r')}r()(hj$)h}r))(h]h]h]h]h]uhj")h]r*)hX repositoryr+)r,)}r-)(hUhj')ubahhubaubj)r.)}r/)(hUh}r0)(h]h]h]h]h]uhj)h]r1)(h)r2)}r3)(hXThe name of this parameter might varies depending on the Source step you are running. The concept explained here is common to all steps and applies to ``repourl`` as well as for ``baseURL`` (when applicable). Buildbot, now being aware of the repository name via the change source, might in some cases not need the repository url. There are multiple way to pass it through to this step, those correspond to the type of the parameter given to this step:hj.)hhhhh}r4)(h]h]h]h]h]uhMh]r5)(hXThe name of this parameter might varies depending on the Source step you are running. The concept explained here is common to all steps and applies to r6)r7)}r8)(hXThe name of this parameter might varies depending on the Source step you are running. The concept explained here is common to all steps and applies to hj2)ubh)r9)}r:)(hX ``repourl``h}r;)(h]h]h]h]h]uhj2)h]r<)hXrepourlr=)r>)}r?)(hUhj9)ubahhubhX as well as for r@)rA)}rB)(hX as well as for hj2)ubh)rC)}rD)(hX ``baseURL``h}rE)(h]h]h]h]h]uhj2)h]rF)hXbaseURLrG)rH)}rI)(hUhjC)ubahhubhX (when applicable). Buildbot, now being aware of the repository name via the change source, might in some cases not need the repository url. There are multiple way to pass it through to this step, those correspond to the type of the parameter given to this step:rJ)rK)}rL)(hX (when applicable). Buildbot, now being aware of the repository name via the change source, might in some cases not need the repository url. There are multiple way to pass it through to this step, those correspond to the type of the parameter given to this step:hj2)ubeubj)rM)}rN)(hUh}rO)(h]h]h]h]h]uhj.)h]rP)(j)rQ)}rR)(hX``None`` In the case where no parameter is specified, the repository url will be taken exactly from the Change attribute. You are looking for that one if your ChangeSource step has all information about how to reach the Change. hjM)hhhjh}rS)(h]h]h]h]h]uhMh]rT)(j)rU)}rV)(hX``None``rW)hjQ)hhhjh}rX)(h]h]h]h]h]uhMh]rY)h)rZ)}r[)(hjW)h}r\)(h]h]h]h]h]uhjU)h]r])hXNoner^)r_)}r`)(hUhjZ)ubahhubaubj)ra)}rb)(hUh}rc)(h]h]h]h]h]uhjQ)h]rd)h)re)}rf)(hXIn the case where no parameter is specified, the repository url will be taken exactly from the Change attribute. You are looking for that one if your ChangeSource step has all information about how to reach the Change.rg)hja)hhhhh}rh)(h]h]h]h]h]uhMh]ri)hXIn the case where no parameter is specified, the repository url will be taken exactly from the Change attribute. You are looking for that one if your ChangeSource step has all information about how to reach the Change.rj)rk)}rl)(hjg)hje)ubaubahjubeubj)rm)}rn)(hXstring The parameter might be a string, in this case, this string will be taken as the repository url, and nothing more. the value coming from the ChangeSource step will be forgotten. hjM)hhhjh}ro)(h]h]h]h]h]uhMh]rp)(j)rq)}rr)(hXstringrs)hjm)hhhjh}rt)(h]h]h]h]h]uhMh]ru)hXstringrv)rw)}rx)(hjs)hjq)ubaubj)ry)}rz)(hUh}r{)(h]h]h]h]h]uhjm)h]r|)h)r})}r~)(hXThe parameter might be a string, in this case, this string will be taken as the repository url, and nothing more. the value coming from the ChangeSource step will be forgotten.r)hjy)hhhhh}r)(h]h]h]h]h]uhMh]r)hXThe parameter might be a string, in this case, this string will be taken as the repository url, and nothing more. the value coming from the ChangeSource step will be forgotten.r)r)}r)(hj)hj})ubaubahjubeubj)r)}r)(hXformat string If the parameter is a string containing ``%s``, then this the repository attribute from the :class:`Change` will be place in place of the ``%s``. This is useful when the change source knows where the repository resides locally, but don't know the scheme used to access it. For instance ``ssh://server/%s`` makes sense if the the repository attribute is the local path of the repository. hjM)hhhjh}r)(h]h]h]h]h]uhMh]r)(j)r)}r)(hX format stringr)hj)hhhjh}r)(h]h]h]h]h]uhMh]r)hX format stringr)r)}r)(hj)hj)ubaubj)r)}r)(hUh}r)(h]h]h]h]h]uhj)h]r)h)r)}r)(hXIf the parameter is a string containing ``%s``, then this the repository attribute from the :class:`Change` will be place in place of the ``%s``. This is useful when the change source knows where the repository resides locally, but don't know the scheme used to access it. For instance ``ssh://server/%s`` makes sense if the the repository attribute is the local path of the repository.hj)hhhhh}r)(h]h]h]h]h]uhMh]r)(hX(If the parameter is a string containing r)r)}r)(hX(If the parameter is a string containing hj)ubh)r)}r)(hX``%s``h}r)(h]h]h]h]h]uhj)h]r)hX%sr)r)}r)(hUhj)ubahhubhX., then this the repository attribute from the r)r)}r)(hX., then this the repository attribute from the hj)ubh)r)}r)(hX:class:`Change`r)hj)hhhhh}r)(UreftypeXclasshhXChangeU refdomainXpyr)h]h]U refexplicith]h]h]hhhNhj uhMh]r)h)r)}r)(hj)h}r)(h]h]r)(hj)Xpy-classr)eh]h]h]uhj)h]r)hXChanger)r)}r)(hUhj)ubahhubaubhX will be place in place of the r)r)}r)(hX will be place in place of the hj)ubh)r)}r)(hX``%s``h}r)(h]h]h]h]h]uhj)h]r)hX%sr)r)}r)(hUhj)ubahhubhX. This is useful when the change source knows where the repository resides locally, but don't know the scheme used to access it. For instance r)r)}r)(hX. This is useful when the change source knows where the repository resides locally, but don't know the scheme used to access it. For instance hj)ubh)r)}r)(hX``ssh://server/%s``h}r)(h]h]h]h]h]uhj)h]r)hXssh://server/%sr)r)}r)(hUhj)ubahhubhXQ makes sense if the the repository attribute is the local path of the repository.r)r)}r)(hXQ makes sense if the the repository attribute is the local path of the repository.hj)ubeubahjubeubj)r)}r)(hX|dict In this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter. hjM)hhhjh}r)(h]h]h]h]h]uhMh]r)(j)r)}r)(hXdictr)hj)hhhjh}r)(h]h]h]h]h]uhMh]r)hXdictr)r)}r)(hj)hj)ubaubj)r)}r)(hUh}r)(h]h]h]h]h]uhj)h]r)h)r)}r)(hXvIn this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter.r)hj)hhhhh}r)(h]h]h]h]h]uhMh]r)hXvIn this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter.r)r)}r)(hj)hj)ubaubahjubeubj)r)}r)(hXcallable The callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL. hjM)hhhjh}r)(h]h]h]h]h]uhMh]r)(j)r)}r)(hXcallabler)hj)hhhjh}r)(h]h]h]h]h]uhMh]r)hXcallabler)r)}r)(hj)hj)ubaubj)r)}r)(hUh}r)(h]h]h]h]h]uhj)h]r)h)r)}r)(hXThe callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL.r)hj)hhhhh}r)(h]h]h]h]h]uhMh]r)hXThe callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL.r)r)}r)(hj)hj)ubaubahjubeubehjubj")r)}r)(hXthis is quite similar to the mechanism used by the WebStatus for the ``changecommentlink``, ``projects`` or ``repositories`` parameter.h}r)(h]h]h]h]h]uhj.)h]r)h)r*}r*(hXthis is quite similar to the mechanism used by the WebStatus for the ``changecommentlink``, ``projects`` or ``repositories`` parameter.hj)hhhhh}r*(h]h]h]h]h]uhMh]r*(hXEthis is quite similar to the mechanism used by the WebStatus for the r*r*}r*(hXEthis is quite similar to the mechanism used by the WebStatus for the hj*ubh)r*}r*(hX``changecommentlink``h}r *(h]h]h]h]h]uhj*h]r *hXchangecommentlinkr *r *}r *(hUhj*ubahhubhX, r*r*}r*(hX, hj*ubh)r*}r*(hX ``projects``h}r*(h]h]h]h]h]uhj*h]r*hXprojectsr*r*}r*(hUhj*ubahhubhX or r*r*}r*(hX or hj*ubh)r*}r*(hX``repositories``h}r*(h]h]h]h]h]uhj*h]r*hX repositoriesr*r *}r!*(hUhj*ubahhubhX parameter.r"*r#*}r$*(hX parameter.hj*ubeubahj"ubehjubeubj)r%*}r&*(hX``timeout`` Specifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes). hj'hhhjh}r'*(h]h]h]h]h]uhMhhh]r(*(j)r)*}r**(hX ``timeout``r+*hj%*hhhjh}r,*(h]h]h]h]h]uhMh]r-*h)r.*}r/*(hj+*h}r0*(h]h]h]h]h]uhj)*h]r1*hXtimeoutr2*r3*}r4*(hUhj.*ubahhubaubj)r5*}r6*(hUh}r7*(h]h]h]h]h]uhj%*h]r8*h)r9*}r:*(hXSpecifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes).r;*hj5*hhhhh}r<*(h]h]h]h]h]uhMh]r=*hXSpecifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes).r>*r?*}r@*(hj;*hj9*ubaubahjubeubeubh)rA*}rB*(hXoMy habit as a developer is to do a ``cvs update`` and :command:`make` each morning. Problems can occur, either because of bad code being checked in, or by incomplete dependencies causing a partial rebuild to fail where a complete from-scratch build might succeed. A quick Builder which emulates this incremental-build behavior would use the ``mode='update'`` setting.hj^ hhhhh}rC*(h]h]h]h]h]uhMhhh]rD*(hX#My habit as a developer is to do a rE*rF*}rG*(hX#My habit as a developer is to do a hjA*ubh)rH*}rI*(hX``cvs update``h}rJ*(h]h]h]h]h]uhjA*h]rK*hX cvs updaterL*rM*}rN*(hUhjH*ubahhubhX and rO*rP*}rQ*(hX and hjA*ubjL)rR*}rS*(hX:command:`make`h}rT*(h]h]rU*jQah]h]h]uhjA*h]rV*hXmakerW*rX*}rY*(hUhjR*ubahjVubhX each morning. Problems can occur, either because of bad code being checked in, or by incomplete dependencies causing a partial rebuild to fail where a complete from-scratch build might succeed. A quick Builder which emulates this incremental-build behavior would use the rZ*r[*}r\*(hX each morning. Problems can occur, either because of bad code being checked in, or by incomplete dependencies causing a partial rebuild to fail where a complete from-scratch build might succeed. A quick Builder which emulates this incremental-build behavior would use the hjA*ubh)r]*}r^*(hX``mode='update'``h}r_*(h]h]h]h]h]uhjA*h]r`*hX mode='update'ra*rb*}rc*(hUhj]*ubahhubhX setting.rd*re*}rf*(hX setting.hjA*ubeubh)rg*}rh*(hXiOn the other hand, other kinds of dependency problems can cause a clean build to fail where a partial build might succeed. This frequently results from a link step that depends upon an object file that was removed from a later version of the tree: in the partial tree, the object file is still around (even though the Makefiles no longer know how to create it).ri*hj^ hhhhh}rj*(h]h]h]h]h]uhMhhh]rk*hXiOn the other hand, other kinds of dependency problems can cause a clean build to fail where a partial build might succeed. This frequently results from a link step that depends upon an object file that was removed from a later version of the tree: in the partial tree, the object file is still around (even though the Makefiles no longer know how to create it).rl*rm*}rn*(hji*hjg*ubaubh)ro*}rp*(hXB`official` builds (traceable builds performed from a known set of source revisions) are always done as clean builds, to make sure it is not influenced by any uncontrolled factors (like leftover files from a previous build). A `full` :class:`Builder` which behaves this way would want to use the ``mode='clobber'`` setting.hj^ hhhhh}rq*(h]h]h]h]h]uhMhhh]rr*(jE)rs*}rt*(hX `official`h}ru*(h]h]h]h]h]uhjo*h]rv*hXofficialrw*rx*}ry*(hUhjs*ubahjMubhX builds (traceable builds performed from a known set of source revisions) are always done as clean builds, to make sure it is not influenced by any uncontrolled factors (like leftover files from a previous build). A rz*r{*}r|*(hX builds (traceable builds performed from a known set of source revisions) are always done as clean builds, to make sure it is not influenced by any uncontrolled factors (like leftover files from a previous build). A hjo*ubjE)r}*}r~*(hX`full`h}r*(h]h]h]h]h]uhjo*h]r*hXfullr*r*}r*(hUhj}*ubahjMubhX r*}r*(hX hjo*ubh)r*}r*(hX:class:`Builder`r*hjo*hhhhh}r*(UreftypeXclasshhXBuilderU refdomainXpyr*h]h]U refexplicith]h]h]hhhNhj uhMh]r*h)r*}r*(hj*h}r*(h]h]r*(hj*Xpy-classr*eh]h]h]uhj*h]r*hXBuilderr*r*}r*(hUhj*ubahhubaubhX. which behaves this way would want to use the r*r*}r*(hX. which behaves this way would want to use the hjo*ubh)r*}r*(hX``mode='clobber'``h}r*(h]h]h]h]h]uhjo*h]r*hXmode='clobber'r*r*}r*(hUhj*ubahhubhX setting.r*r*}r*(hX setting.hjo*ubeubh)r*}r*(hXoEach VC system has a corresponding source checkout class: their arguments are described on the following pages.r*hj^ hhhhh}r*(h]h]h]h]h]uhMhhh]r*hXoEach VC system has a corresponding source checkout class: their arguments are described on the following pages.r*r*}r*(hj*hj*ubaubj)r*}r*(hUhj^ hhhj h}r*(h]h]h]h]h]Uentries]r*((UsingleXBuild Steps; CVS (Slave-Side)Xstep-CVS (Slave-Side)r*j*tr*(UsingleXCVS (Slave-Side) Build Stepj*j*tr*euhMhhh]ubh)r*}r*(hUhj^ hhhhh}r*(h]h]h]h]h]hj*uhMhhh]ubh)r*}r*(hX.. _Step-CVS-Slave-Side:hj^ hhh}hhh}r*(h]h]h]h]h]hUstep-cvs-slave-sider*uhMhhh}r*j*j*sh]ubh)r*}r*(hUhj^ hhh}r*hFj*shhh}r*(h]h]h]h]r*(jfj*j*eh]r*(hhFeuhMhhh}r*(j*j*j*j*uh]r*(h)r*}r*(hjkhj*hhhhh}r*(h]h]h]h]h]hjeuhMhhh]r*hXCVS (Slave-Side)r*r*}r*(hjkhj*ubaubh)r*}r*(hXThe :class:`CVS ` build step performs a `CVS `_ checkout or update. It takes the following arguments:hj*hhhhh}r*(h]h]h]h]h]uhMhhh]r*(hXThe r*r*}r*(hXThe hj*ubh)r*}r*(hX:class:`CVS `r*hj*hhhhh}r*(UreftypeXclasshhXCVS (Slave-Side)U refdomainXpyr*h]h]U refexplicith]h]h]hhhNhj uhMh]r*h)r*}r*(hj*h}r*(h]h]r*(hj*Xpy-classr*eh]h]h]uhj*h]r*hXCVSr*r*}r*(hUhj*ubahhubaubhX build step performs a r*r*}r*(hX build step performs a hj*ubjM)r*}r*(hX#`CVS `_h}r*(UnameXCVSj Xhttp://www.nongnu.org/cvs/r*h]h]h]h]h]uhj*h]r*hXCVSr*r*}r*(hUhj*ubahjYubh)r*}r*(hX hKhj*hhh}r*(Urefurij*h]r*Uid11r*ah]h]r*Xcvsr*ah]h]uh]ubhX6 checkout or update. It takes the following arguments:r*r*}r*(hX6 checkout or update. It takes the following arguments:hj*ubeubj)r*}r*(hUhj*hhhjh}r*(h]h]h]h]h]uhNhhh]r*(j)r*}r*(hX ``cvsroot`` (required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, the cvsroot value you would use to get a copy of the Buildbot source code is ``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot`` hj*hhhjh}r*(h]h]h]h]h]uhM h]r*(j)r*}r*(hX ``cvsroot``r*hj*hhhjh}r*(h]h]h]h]h]uhM h]r*h)r+}r+(hj*h}r+(h]h]h]h]h]uhj*h]r+hXcvsrootr+r+}r+(hUhj+ubahhubaubj)r+}r+(hUh}r +(h]h]h]h]h]uhj*h]r +h)r +}r +(hX(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, the cvsroot value you would use to get a copy of the Buildbot source code is ``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot``hj+hhhhh}r +(h]h]h]h]h]uhMh]r+(hX(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, the cvsroot value you would use to get a copy of the Buildbot source code is r+r+}r+(hX(required): specify the CVSROOT value, which points to a CVS repository, probably on a remote machine. For example, the cvsroot value you would use to get a copy of the Buildbot source code is hj +ubh)r+}r+(hX<``:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbot``h}r+(h]h]h]h]h]uhj +h]r+hX8:pserver:anonymous@cvs.sourceforge.net:/cvsroot/buildbotr+r+}r+(hUhj+ubahhubeubahjubeubj)r+}r+(hX``cvsmodule`` (required): specify the cvs ``module``, which is generally a subdirectory of the CVSROOT. The `cvsmodule` for the Buildbot source code is ``buildbot``. hj*hhhjh}r+(h]h]h]h]h]uhMhhh]r+(j)r+}r+(hX ``cvsmodule``r+hj+hhhjh}r +(h]h]h]h]h]uhMh]r!+h)r"+}r#+(hj+h}r$+(h]h]h]h]h]uhj+h]r%+hX cvsmoduler&+r'+}r(+(hUhj"+ubahhubaubj)r)+}r*+(hUh}r++(h]h]h]h]h]uhj+h]r,+h)r-+}r.+(hX(required): specify the cvs ``module``, which is generally a subdirectory of the CVSROOT. The `cvsmodule` for the Buildbot source code is ``buildbot``.hj)+hhhhh}r/+(h]h]h]h]h]uhM h]r0+(hX(required): specify the cvs r1+r2+}r3+(hX(required): specify the cvs hj-+ubh)r4+}r5+(hX ``module``h}r6+(h]h]h]h]h]uhj-+h]r7+hXmoduler8+r9+}r:+(hUhj4+ubahhubhX8, which is generally a subdirectory of the CVSROOT. The r;+r<+}r=+(hX8, which is generally a subdirectory of the CVSROOT. The hj-+ubjE)r>+}r?+(hX `cvsmodule`h}r@+(h]h]h]h]h]uhj-+h]rA+hX cvsmodulerB+rC+}rD+(hUhj>+ubahjMubhX! for the Buildbot source code is rE+rF+}rG+(hX! for the Buildbot source code is hj-+ubh)rH+}rI+(hX ``buildbot``h}rJ+(h]h]h]h]h]uhj-+h]rK+hXbuildbotrL+rM+}rN+(hUhjH+ubahhubhX.rO+}rP+(hX.hj-+ubeubahjubeubj)rQ+}rR+(hX``branch`` a string which will be used in a :option:`-r` argument. This is most useful for specifying a branch to work on. Defaults to ``HEAD``. hj*hhhjh}rS+(h]h]h]h]h]uhMhhh]rT+(j)rU+}rV+(hX ``branch``rW+hjQ+hhhjh}rX+(h]h]h]h]h]uhMh]rY+h)rZ+}r[+(hjW+h}r\+(h]h]h]h]h]uhjU+h]r]+hXbranchr^+r_+}r`+(hUhjZ+ubahhubaubj)ra+}rb+(hUh}rc+(h]h]h]h]h]uhjQ+h]rd+h)re+}rf+(hXa string which will be used in a :option:`-r` argument. This is most useful for specifying a branch to work on. Defaults to ``HEAD``.hja+hhhhh}rg+(h]h]h]h]h]uhMh]rh+(hX!a string which will be used in a ri+rj+}rk+(hX!a string which will be used in a hje+ubh)rl+}rm+(hX :option:`-r`rn+hje+hhhhh}ro+(UreftypeXoptionhhX-rU refdomainXstdrp+jNh]h]U refexplicith]h]h]hhuhMh]rq+j)rr+}rs+(hjn+h}rt+(h]h]ru+(hjp+X std-optionrv+eh]h]h]uhjl+h]rw+hX-rrx+ry+}rz+(hUhjr+ubahjubaubhXO argument. This is most useful for specifying a branch to work on. Defaults to r{+r|+}r}+(hXO argument. This is most useful for specifying a branch to work on. Defaults to hje+ubh)r~+}r+(hX``HEAD``h}r+(h]h]h]h]h]uhje+h]r+hXHEADr+r+}r+(hUhj~+ubahhubhX.r+}r+(hX.hje+ubeubahjubeubj)r+}r+(hXQ``global_options`` a list of flags to be put before the verb in the CVS command. hj*hhhjh}r+(h]h]h]h]h]uhMhhh]r+(j)r+}r+(hX``global_options``r+hj+hhhjh}r+(h]h]h]h]h]uhMh]r+h)r+}r+(hj+h}r+(h]h]h]h]h]uhj+h]r+hXglobal_optionsr+r+}r+(hUhj+ubahhubaubj)r+}r+(hUh}r+(h]h]h]h]h]uhj+h]r+h)r+}r+(hX=a list of flags to be put before the verb in the CVS command.r+hj+hhhhh}r+(h]h]h]h]h]uhMh]r+hX=a list of flags to be put before the verb in the CVS command.r+r+}r+(hj+hj+ubaubahjubeubeubh)r+}r+(hX``checkout_options``r+hj*hhhhh}r+(h]h]h]h]h]uhMhhh]r+h)r+}r+(hj+h}r+(h]h]h]h]h]uhj+h]r+hXcheckout_optionsr+r+}r+(hUhj+ubahhubaubh)r+}r+(hX``export_options``r+hj*hhhhh}r+(h]h]h]h]h]uhMhhh]r+h)r+}r+(hj+h}r+(h]h]h]h]h]uhj+h]r+hXexport_optionsr+r+}r+(hUhj+ubahhubaubj)r+}r+(hUhj*hhhjh}r+(h]h]h]h]h]uhNhhh]r+(j)r+}r+(hX``extra_options`` a list of flags to be put after the verb in the CVS command. ``checkout_options`` is only used for checkout operations, ``export_options`` is only used for export operations, and ``extra_options`` is used for both. hj+hhhjh}r+(h]h]h]h]h]uhM h]r+(j)r+}r+(hX``extra_options``r+hj+hhhjh}r+(h]h]h]h]h]uhM h]r+h)r+}r+(hj+h}r+(h]h]h]h]h]uhj+h]r+hX extra_optionsr+r+}r+(hUhj+ubahhubaubj)r+}r+(hUh}r+(h]h]h]h]h]uhj+h]r+h)r+}r+(hXa list of flags to be put after the verb in the CVS command. ``checkout_options`` is only used for checkout operations, ``export_options`` is only used for export operations, and ``extra_options`` is used for both.hj+hhhhh}r+(h]h]h]h]h]uhMh]r+(hX=a list of flags to be put after the verb in the CVS command. r+r+}r+(hX=a list of flags to be put after the verb in the CVS command. hj+ubh)r+}r+(hX``checkout_options``h}r+(h]h]h]h]h]uhj+h]r+hXcheckout_optionsr+r+}r+(hUhj+ubahhubhX' is only used for checkout operations, r+r+}r+(hX' is only used for checkout operations, hj+ubh)r+}r+(hX``export_options``h}r+(h]h]h]h]h]uhj+h]r+hXexport_optionsr+r+}r+(hUhj+ubahhubhX) is only used for export operations, and r+r+}r+(hX) is only used for export operations, and hj+ubh)r+}r+(hX``extra_options``h}r+(h]h]h]h]h]uhj+h]r+hX extra_optionsr+r+}r+(hUhj+ubahhubhX is used for both.r+r+}r+(hX is used for both.hj+ubeubahjubeubj)r+}r+(hX``checkoutDelay`` if set, the number of seconds to put between the timestamp of the last known Change and the value used for the :option:`-D` option. Defaults to half of the parent :class:`Build`\'s ``treeStableTimer``. hj+hhhjh}r+(h]h]h]h]h]uhM%hhh]r+(j)r+}r+(hX``checkoutDelay``r+hj+hhhjh}r+(h]h]h]h]h]uhM%h]r,h)r,}r,(hj+h}r,(h]h]h]h]h]uhj+h]r,hX checkoutDelayr,r,}r,(hUhj,ubahhubaubj)r,}r ,(hUh}r ,(h]h]h]h]h]uhj+h]r ,h)r ,}r ,(hXif set, the number of seconds to put between the timestamp of the last known Change and the value used for the :option:`-D` option. Defaults to half of the parent :class:`Build`\'s ``treeStableTimer``.hj,hhhhh}r,(h]h]h]h]h]uhM#h]r,(hXoif set, the number of seconds to put between the timestamp of the last known Change and the value used for the r,r,}r,(hXoif set, the number of seconds to put between the timestamp of the last known Change and the value used for the hj ,ubh)r,}r,(hX :option:`-D`r,hj ,hhhhh}r,(UreftypeXoptionhhX-DU refdomainXstdr,jNh]h]U refexplicith]h]h]hhuhM#h]r,j)r,}r,(hj,h}r,(h]h]r,(hj,X std-optionr,eh]h]h]uhj,h]r,hX-Dr,r ,}r!,(hUhj,ubahjubaubhX( option. Defaults to half of the parent r",r#,}r$,(hX( option. Defaults to half of the parent hj ,ubh)r%,}r&,(hX:class:`Build`r',hj ,hhhhh}r(,(UreftypeXclasshhXBuildU refdomainXpyr),h]h]U refexplicith]h]h]hhhNhj uhM#h]r*,h)r+,}r,,(hj',h}r-,(h]h]r.,(hj),Xpy-classr/,eh]h]h]uhj%,h]r0,hXBuildr1,r2,}r3,(hUhj+,ubahhubaubhX's r4,r5,}r6,(hX\'s hj ,ubh)r7,}r8,(hX``treeStableTimer``h}r9,(h]h]h]h]h]uhj ,h]r:,hXtreeStableTimerr;,r<,}r=,(hUhj7,ubahhubhX.r>,}r?,(hX.hj ,ubeubahjubeubeubj)r@,}rA,(hUhj*hhhj h}rB,(h]h]h]h]h]Uentries]rC,((UsingleXBuild Steps; SVN (Slave-Side)Xstep-SVN (Slave-Side)rD,jD,trE,(UsingleXSVN (Slave-Side) Build StepjD,jD,trF,euhM(hhh]ubh)rG,}rH,(hUhj*hhhhh}rI,(h]h]h]h]h]hjD,uhM(hhh]ubh)rJ,}rK,(hX.. _Step-SVN-Slave-Side:hj*hhh}hhh}rL,(h]h]h]h]h]hUstep-svn-slave-siderM,uhM)hhh}rN,jD,jG,sh]ubeubh)rO,}rP,(hUhj^ hhh}rQ,hjJ,shhh}rR,(h]h]h]h]rS,(jyjM,jD,eh]rT,(h\heuhM,hhh}rU,(jM,jJ,jD,jG,uh]rV,(h)rW,}rX,(hj~hjO,hhhhh}rY,(h]h]h]h]h]hjxuhM,hhh]rZ,hXSVN (Slave-Side)r[,r\,}r],(hj~hjW,ubaubh)r^,}r_,(hXThe :bb:step:`SVN ` build step performs a `Subversion `_ checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.hjO,hhhhh}r`,(h]h]h]h]h]uhM.hhh]ra,(hXThe rb,rc,}rd,(hXThe hj^,ubh)re,}rf,(hX!:bb:step:`SVN `rg,hj^,hhhhh}rh,(UreftypeXstephhXSVN (Slave-Side)U refdomainXbbri,h]h]U refexplicith]h]h]hhuhM.h]rj,h)rk,}rl,(hjg,h}rm,(h]h]rn,(hji,Xbb-stepro,eh]h]h]uhje,h]rp,hXSVNrq,rr,}rs,(hUhjk,ubahhubaubhX build step performs a rt,ru,}rv,(hX build step performs a hj^,ubjM)rw,}rx,(hX,`Subversion `_h}ry,(UnameX Subversionj Xhttp://subversion.tigris.orgrz,h]h]h]h]h]uhj^,h]r{,hX Subversionr|,r},}r~,(hUhjw,ubahjYubh)r,}r,(hX hKhj^,hhh}r,(Urefurijz,h]r,Uid12r,ah]h]r,X subversionr,ah]h]uh]ubhX checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.r,r,}r,(hX checkout or update. There are two basic ways of setting up the checkout step, depending upon whether you are using multiple branches or not.hj^,ubeubh)r,}r,(hXRThe most versatile way to create the ``SVN`` step is with the ``svnurl`` argument:hjO,hhhhh}r,(h]h]h]h]h]uhM3hhh]r,(hX%The most versatile way to create the r,r,}r,(hX%The most versatile way to create the hj,ubh)r,}r,(hX``SVN``h}r,(h]h]h]h]h]uhj,h]r,hXSVNr,r,}r,(hUhj,ubahhubhX step is with the r,r,}r,(hX step is with the hj,ubh)r,}r,(hX ``svnurl``h}r,(h]h]h]h]h]uhj,h]r,hXsvnurlr,r,}r,(hUhj,ubahhubhX argument:r,r,}r,(hX argument:hj,ubeubj)r,}r,(hUhjO,hhhjh}r,(h]h]h]h]h]uhNhhh]r,j)r,}r,(hXS``svnurl`` (required): this specifies the ``URL`` argument that will be given to the ``svn checkout`` command. It dictates both where the repository is located and which sub-tree should be extracted. In this respect, it is like a combination of the CVS ``cvsroot`` and ``cvsmodule`` arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of ``http://svn.example.com/repos``, and you wanted to check out the ``trunk/calc`` sub-tree, you would use ``svnurl="http://svn.example.com/repos/trunk/calc"`` as an argument to your ``SVN`` step. hj,hhhjh}r,(h]h]h]h]h]uhM@h]r,(j)r,}r,(hX ``svnurl``r,hj,hhhjh}r,(h]h]h]h]h]uhM@h]r,h)r,}r,(hj,h}r,(h]h]h]h]h]uhj,h]r,hXsvnurlr,r,}r,(hUhj,ubahhubaubj)r,}r,(hUh}r,(h]h]h]h]h]uhj,h]r,h)r,}r,(hXG(required): this specifies the ``URL`` argument that will be given to the ``svn checkout`` command. It dictates both where the repository is located and which sub-tree should be extracted. In this respect, it is like a combination of the CVS ``cvsroot`` and ``cvsmodule`` arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of ``http://svn.example.com/repos``, and you wanted to check out the ``trunk/calc`` sub-tree, you would use ``svnurl="http://svn.example.com/repos/trunk/calc"`` as an argument to your ``SVN`` step.hj,hhhhh}r,(h]h]h]h]h]uhM7h]r,(hX(required): this specifies the r,r,}r,(hX(required): this specifies the hj,ubh)r,}r,(hX``URL``h}r,(h]h]h]h]h]uhj,h]r,hXURLr,r,}r,(hUhj,ubahhubhX$ argument that will be given to the r,r,}r,(hX$ argument that will be given to the hj,ubh)r,}r,(hX``svn checkout``h}r,(h]h]h]h]h]uhj,h]r,hX svn checkoutr,r,}r,(hUhj,ubahhubhX command. It dictates both where the repository is located and which sub-tree should be extracted. In this respect, it is like a combination of the CVS r,r,}r,(hX command. It dictates both where the repository is located and which sub-tree should be extracted. In this respect, it is like a combination of the CVS hj,ubh)r,}r,(hX ``cvsroot``h}r,(h]h]h]h]h]uhj,h]r,hXcvsrootr,r,}r,(hUhj,ubahhubhX and r,r,}r,(hX and hj,ubh)r,}r,(hX ``cvsmodule``h}r,(h]h]h]h]h]uhj,h]r,hX cvsmoduler,r,}r,(hUhj,ubahhubhXv arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of r,r,}r,(hXv arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of hj,ubh)r,}r,(hX ``http://svn.example.com/repos``h}r,(h]h]h]h]h]uhj,h]r,hXhttp://svn.example.com/reposr,r,}r,(hUhj,ubahhubhX", and you wanted to check out the r,r,}r,(hX", and you wanted to check out the hj,ubh)r,}r,(hX``trunk/calc``h}r,(h]h]h]h]h]uhj,h]r,hX trunk/calcr,r,}r,(hUhj,ubahhubhX sub-tree, you would use r,r,}r,(hX sub-tree, you would use hj,ubh)r,}r-(hX4``svnurl="http://svn.example.com/repos/trunk/calc"``h}r-(h]h]h]h]h]uhj,h]r-hX0svnurl="http://svn.example.com/repos/trunk/calc"r-r-}r-(hUhj,ubahhubhX as an argument to your r-r-}r-(hX as an argument to your hj,ubh)r -}r -(hX``SVN``h}r -(h]h]h]h]h]uhj,h]r -hXSVNr -r-}r-(hUhj -ubahhubhX step.r-r-}r-(hX step.hj,ubeubahjubeubaubh)r-}r-(hXThe ``svnurl`` argument can be considered as a universal means to create the ``SVN`` step as it ignores the branch information in the SourceStamp.hjO,hhhhh}r-(h]h]h]h]h]uhMBhhh]r-(hXThe r-r-}r-(hXThe hj-ubh)r-}r-(hX ``svnurl``h}r-(h]h]h]h]h]uhj-h]r-hXsvnurlr-r-}r -(hUhj-ubahhubhX? argument can be considered as a universal means to create the r!-r"-}r#-(hX? argument can be considered as a universal means to create the hj-ubh)r$-}r%-(hX``SVN``h}r&-(h]h]h]h]h]uhj-h]r'-hXSVNr(-r)-}r*-(hUhj$-ubahhubhX> step as it ignores the branch information in the SourceStamp.r+-r,-}r--(hX> step as it ignores the branch information in the SourceStamp.hj-ubeubh)r.-}r/-(hXAlternatively, if you are building from multiple branches, then you should preferentially create the ``SVN`` step with the ``baseURL`` and ``defaultBranch`` arguments instead:hjO,hhhhh}r0-(h]h]h]h]h]uhMFhhh]r1-(hXeAlternatively, if you are building from multiple branches, then you should preferentially create the r2-r3-}r4-(hXeAlternatively, if you are building from multiple branches, then you should preferentially create the hj.-ubh)r5-}r6-(hX``SVN``h}r7-(h]h]h]h]h]uhj.-h]r8-hXSVNr9-r:-}r;-(hUhj5-ubahhubhX step with the r<-r=-}r>-(hX step with the hj.-ubh)r?-}r@-(hX ``baseURL``h}rA-(h]h]h]h]h]uhj.-h]rB-hXbaseURLrC-rD-}rE-(hUhj?-ubahhubhX and rF-rG-}rH-(hX and hj.-ubh)rI-}rJ-(hX``defaultBranch``h}rK-(h]h]h]h]h]uhj.-h]rL-hX defaultBranchrM-rN-}rO-(hUhjI-ubahhubhX arguments instead:rP-rQ-}rR-(hX arguments instead:hj.-ubeubj)rS-}rT-(hUhjO,hhhjh}rU-(h]h]h]h]h]uhNhhh]rV-(j)rW-}rX-(hX``baseURL`` (required): this specifies the base repository URL, to which a branch name will be appended. It should probably end in a slash. hjS-hhhjh}rY-(h]h]h]h]h]uhMLh]rZ-(j)r[-}r\-(hX ``baseURL``r]-hjW-hhhjh}r^-(h]h]h]h]h]uhMLh]r_-h)r`-}ra-(hj]-h}rb-(h]h]h]h]h]uhj[-h]rc-hXbaseURLrd-re-}rf-(hUhj`-ubahhubaubj)rg-}rh-(hUh}ri-(h]h]h]h]h]uhjW-h]rj-h)rk-}rl-(hX(required): this specifies the base repository URL, to which a branch name will be appended. It should probably end in a slash.rm-hjg-hhhhh}rn-(h]h]h]h]h]uhMKh]ro-hX(required): this specifies the base repository URL, to which a branch name will be appended. It should probably end in a slash.rp-rq-}rr-(hjm-hjk-ubaubahjubeubj)rs-}rt-(hXv``defaultBranch`` (optional): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``svn checkout`` command. It is possible to mix to have a mix of ``SVN`` steps that use either the ``svnurl`` or ``baseURL`` arguments but not both at the same time. hjS-hhhjh}ru-(h]h]h]h]h]uhMVhhh]rv-(j)rw-}rx-(hX``defaultBranch``ry-hjs-hhhjh}rz-(h]h]h]h]h]uhMVh]r{-h)r|-}r}-(hjy-h}r~-(h]h]h]h]h]uhjw-h]r-hX defaultBranchr-r-}r-(hUhj|-ubahhubaubj)r-}r-(hUh}r-(h]h]h]h]h]uhjs-h]r-(h)r-}r-(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``svn checkout`` command.hj-hhhhh}r-(h]h]h]h]h]uhMOh]r-(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to r-r-}r-(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to hj-ubh)r-}r-(hX ``baseURL``h}r-(h]h]h]h]h]uhj-h]r-hXbaseURLr-r-}r-(hUhj-ubahhubhX1 to create the string that will be passed to the r-r-}r-(hX1 to create the string that will be passed to the hj-ubh)r-}r-(hX``svn checkout``h}r-(h]h]h]h]h]uhj-h]r-hX svn checkoutr-r-}r-(hUhj-ubahhubhX command.r-r-}r-(hX command.hj-ubeubh)r-}r-(hXIt is possible to mix to have a mix of ``SVN`` steps that use either the ``svnurl`` or ``baseURL`` arguments but not both at the same time.hj-hhhhh}r-(h]h]h]h]h]uhMTh]r-(hX'It is possible to mix to have a mix of r-r-}r-(hX'It is possible to mix to have a mix of hj-ubh)r-}r-(hX``SVN``h}r-(h]h]h]h]h]uhj-h]r-hXSVNr-r-}r-(hUhj-ubahhubhX steps that use either the r-r-}r-(hX steps that use either the hj-ubh)r-}r-(hX ``svnurl``h}r-(h]h]h]h]h]uhj-h]r-hXsvnurlr-r-}r-(hUhj-ubahhubhX or r-r-}r-(hX or hj-ubh)r-}r-(hX ``baseURL``h}r-(h]h]h]h]h]uhj-h]r-hXbaseURLr-r-}r-(hUhj-ubahhubhX) arguments but not both at the same time.r-r-}r-(hX) arguments but not both at the same time.hj-ubeubehjubeubj)r-}r-(hX|``username`` (optional): if specified, this will be passed to the :command:`svn` binary with a :option:`--username` option. hjS-hhhjh}r-(h]h]h]h]h]uhMZhhh]r-(j)r-}r-(hX ``username``r-hj-hhhjh}r-(h]h]h]h]h]uhMZh]r-h)r-}r-(hj-h}r-(h]h]h]h]h]uhj-h]r-hXusernamer-r-}r-(hUhj-ubahhubaubj)r-}r-(hUh}r-(h]h]h]h]h]uhj-h]r-h)r-}r-(hXn(optional): if specified, this will be passed to the :command:`svn` binary with a :option:`--username` option.hj-hhhhh}r-(h]h]h]h]h]uhMYh]r-(hX5(optional): if specified, this will be passed to the r-r-}r-(hX5(optional): if specified, this will be passed to the hj-ubjL)r-}r-(hX:command:`svn`h}r-(h]h]r-jQah]h]h]uhj-h]r-hXsvnr-r-}r-(hUhj-ubahjVubhX binary with a r-r-}r-(hX binary with a hj-ubh)r-}r-(hX:option:`--username`r-hj-hhhhh}r-(UreftypeXoptionhhX --usernameU refdomainXstdr-jNh]h]U refexplicith]h]h]hhuhMYh]r-j)r-}r-(hj-h}r-(h]h]r-(hj-X std-optionr-eh]h]h]uhj-h]r-hX --usernamer-r-}r-(hUhj-ubahjubaubhX option.r-r-}r-(hX option.hj-ubeubahjubeubj)r-}r.(hX``password`` (optional): if specified, this will be passed to the ``svn`` binary with a :option:`--password` option. The password itself will be suitably obfuscated in the logs. hjS-hhhjh}r.(h]h]h]h]h]uhM_hhh]r.(j)r.}r.(hX ``password``r.hj-hhhjh}r.(h]h]h]h]h]uhM_h]r.h)r.}r .(hj.h}r .(h]h]h]h]h]uhj.h]r .hXpasswordr .r .}r.(hUhj.ubahhubaubj)r.}r.(hUh}r.(h]h]h]h]h]uhj-h]r.h)r.}r.(hX(optional): if specified, this will be passed to the ``svn`` binary with a :option:`--password` option. The password itself will be suitably obfuscated in the logs.hj.hhhhh}r.(h]h]h]h]h]uhM]h]r.(hX5(optional): if specified, this will be passed to the r.r.}r.(hX5(optional): if specified, this will be passed to the hj.ubh)r.}r.(hX``svn``h}r.(h]h]h]h]h]uhj.h]r.hXsvnr.r.}r .(hUhj.ubahhubhX binary with a r!.r".}r#.(hX binary with a hj.ubh)r$.}r%.(hX:option:`--password`r&.hj.hhhhh}r'.(UreftypeXoptionhhX --passwordU refdomainXstdr(.jNh]h]U refexplicith]h]h]hhuhM]h]r).j)r*.}r+.(hj&.h}r,.(h]h]r-.(hj(.X std-optionr..eh]h]h]uhj$.h]r/.hX --passwordr0.r1.}r2.(hUhj*.ubahjubaubhXF option. The password itself will be suitably obfuscated in the logs.r3.r4.}r5.(hXF option. The password itself will be suitably obfuscated in the logs.hj.ubeubahjubeubj)r6.}r7.(hX``extra_args`` (optional): if specified, an array of strings that will be passed as extra arguments to the :command:`svn` binary. hjS-hhhjh}r8.(h]h]h]h]h]uhMchhh]r9.(j)r:.}r;.(hX``extra_args``r<.hj6.hhhjh}r=.(h]h]h]h]h]uhMch]r>.h)r?.}r@.(hj<.h}rA.(h]h]h]h]h]uhj:.h]rB.hX extra_argsrC.rD.}rE.(hUhj?.ubahhubaubj)rF.}rG.(hUh}rH.(h]h]h]h]h]uhj6.h]rI.h)rJ.}rK.(hXr(optional): if specified, an array of strings that will be passed as extra arguments to the :command:`svn` binary.hjF.hhhhh}rL.(h]h]h]h]h]uhMbh]rM.(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the rN.rO.}rP.(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the hjJ.ubjL)rQ.}rR.(hX:command:`svn`h}rS.(h]h]rT.jQah]h]h]uhjJ.h]rU.hXsvnrV.rW.}rX.(hUhjQ.ubahjVubhX binary.rY.rZ.}r[.(hX binary.hjJ.ubeubahjubeubj)r\.}r].(hX``keep_on_purge`` (optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds. hjS-hhhjh}r^.(h]h]h]h]h]uhMghhh]r_.(j)r`.}ra.(hX``keep_on_purge``rb.hj\.hhhjh}rc.(h]h]h]h]h]uhMgh]rd.h)re.}rf.(hjb.h}rg.(h]h]h]h]h]uhj`.h]rh.hX keep_on_purgeri.rj.}rk.(hUhje.ubahhubaubj)rl.}rm.(hUh}rn.(h]h]h]h]h]uhj\.h]ro.h)rp.}rq.(hX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.rr.hjl.hhhhh}rs.(h]h]h]h]h]uhMfh]rt.hX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.ru.rv.}rw.(hjr.hjp.ubaubahjubeubj)rx.}ry.(hX``ignore_ignores`` (optional): when purging changes, don't use rules defined in ``svn:ignore`` properties and global-ignores in subversion/config. hjS-hhhjh}rz.(h]h]h]h]h]uhMkhhh]r{.(j)r|.}r}.(hX``ignore_ignores``r~.hjx.hhhjh}r.(h]h]h]h]h]uhMkh]r.h)r.}r.(hj~.h}r.(h]h]h]h]h]uhj|.h]r.hXignore_ignoresr.r.}r.(hUhj.ubahhubaubj)r.}r.(hUh}r.(h]h]h]h]h]uhjx.h]r.h)r.}r.(hX(optional): when purging changes, don't use rules defined in ``svn:ignore`` properties and global-ignores in subversion/config.hj.hhhhh}r.(h]h]h]h]h]uhMjh]r.(hX=(optional): when purging changes, don't use rules defined in r.r.}r.(hX=(optional): when purging changes, don't use rules defined in hj.ubh)r.}r.(hX``svn:ignore``h}r.(h]h]h]h]h]uhj.h]r.hX svn:ignorer.r.}r.(hUhj.ubahhubhX4 properties and global-ignores in subversion/config.r.r.}r.(hX4 properties and global-ignores in subversion/config.hj.ubeubahjubeubj)r.}r.(hX``always_purge`` (optional): if set to ``True``, always purge local changes before updating. This deletes unversioned files and reverts everything that would appear in a ``svn status``. hjS-hhhjh}r.(h]h]h]h]h]uhMphhh]r.(j)r.}r.(hX``always_purge``r.hj.hhhjh}r.(h]h]h]h]h]uhMph]r.h)r.}r.(hj.h}r.(h]h]h]h]h]uhj.h]r.hX always_purger.r.}r.(hUhj.ubahhubaubj)r.}r.(hUh}r.(h]h]h]h]h]uhj.h]r.h)r.}r.(hX(optional): if set to ``True``, always purge local changes before updating. This deletes unversioned files and reverts everything that would appear in a ``svn status``.hj.hhhhh}r.(h]h]h]h]h]uhMnh]r.(hX(optional): if set to r.r.}r.(hX(optional): if set to hj.ubh)r.}r.(hX``True``h}r.(h]h]h]h]h]uhj.h]r.hXTruer.r.}r.(hUhj.ubahhubhX{, always purge local changes before updating. This deletes unversioned files and reverts everything that would appear in a r.r.}r.(hX{, always purge local changes before updating. This deletes unversioned files and reverts everything that would appear in a hj.ubh)r.}r.(hX``svn status``h}r.(h]h]h]h]h]uhj.h]r.hX svn statusr.r.}r.(hUhj.ubahhubhX.r.}r.(hX.hj.ubeubahjubeubj)r.}r.(hX``depth`` (optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher. If set to "empty" updates will not pull in any files or subdirectories not already present. If set to "files", updates will pull in any files not already present, but not directories. If set to "immediates", updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to "infinity", updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument. hjS-hhhjh}r.(h]h]h]h]h]uhM}hhh]r.(j)r.}r.(hX ``depth``r.hj.hhhjh}r.(h]h]h]h]h]uhM}h]r.h)r.}r.(hj.h}r.(h]h]h]h]h]uhj.h]r.hXdepthr.r.}r.(hUhj.ubahhubaubj)r.}r.(hUh}r.(h]h]h]h]h]uhj.h]r.(h)r.}r.(hXu(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.r.hj.hhhhh}r.(h]h]h]h]h]uhMsh]r.hXu(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.r.r.}r.(hj.hj.ubaubh)r.}r.(hX/If set to "empty" updates will not pull in any files or subdirectories not already present. If set to "files", updates will pull in any files not already present, but not directories. If set to "immediates", updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to "infinity", updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.r.hj.hhhhh}r.(h]h]h]h]h]uhMvh]r.hX/If set to "empty" updates will not pull in any files or subdirectories not already present. If set to "files", updates will pull in any files not already present, but not directories. If set to "immediates", updates will pull in any files or subdirectories not already present, the new subdirectories will have depth: empty. If set to "infinity", updates will pull in any files or subdirectories not already present; the new subdirectories will have depth-infinity. Infinity is equivalent to SVN default update behavior, without specifying any depth argument.r.r.}r.(hj.hj.ubaubehjubeubeubh)r.}r.(hXsIf you are using branches, you must also make sure your :class:`ChangeSource` will report the correct branch names.hjO,hhhhh}r.(h]h]h]h]h]uhMhhh]r.(hX8If you are using branches, you must also make sure your r.r.}r.(hX8If you are using branches, you must also make sure your hj.ubh)r.}r.(hX:class:`ChangeSource`r.hj.hhhhh}r.(UreftypeXclasshhX ChangeSourceU refdomainXpyr.h]h]U refexplicith]h]h]hhhNhj uhMh]r.h)r.}r.(hj.h}r.(h]h]r.(hj.Xpy-classr/eh]h]h]uhj.h]r/hX ChangeSourcer/r/}r/(hUhj.ubahhubaubhX& will report the correct branch names.r/r/}r/(hX& will report the correct branch names.hj.ubeubj)r/}r /(hUhjO,hhhj h}r /(h]h]h]h]h]Uentries]r /((UsingleXBuild Steps; Darcs (Slave-Side)Xstep-Darcs (Slave-Side)r /j /tr /(UsingleXDarcs (Slave-Side) Build Stepj /j /tr/euhMhhh]ubh)r/}r/(hUhjO,hhhhh}r/(h]h]h]h]h]hj /uhMhhh]ubeubh)r/}r/(hUhj^ hhh}hhh}r/(h]h]h]h]r/(jj /eh]r/heauhMhhh}r/j /j/sh]r/(h)r/}r/(hjhj/hhhhh}r/(h]h]h]h]h]hjuhMhhh]r/hXDarcs (Slave-Side)r/r/}r/(hjhj/ubaubh)r /}r!/(hXpThe :bb:step:`Darcs ` build step performs a `Darcs `_ checkout or update.hj/hhhhh}r"/(h]h]h]h]h]uhMhhh]r#/(hXThe r$/r%/}r&/(hXThe hj /ubh)r'/}r(/(hX%:bb:step:`Darcs `r)/hj /hhhhh}r*/(UreftypeXstephhXDarcs (Slave-Side)U refdomainXbbr+/h]h]U refexplicith]h]h]hhuhMh]r,/h)r-/}r./(hj)/h}r//(h]h]r0/(hj+/Xbb-stepr1/eh]h]h]uhj'/h]r2/hXDarcsr3/r4/}r5/(hUhj-/ubahhubaubhX build step performs a r6/r7/}r8/(hX build step performs a hj /ubjM)r9/}r:/(hX`Darcs `_h}r;/(UnameXDarcsj Xhttp://darcs.net/r/r?/}r@/(hUhj9/ubahjYubh)rA/}rB/(hX hKhj /hhh}rC/(Urefurij`, this step can either be configured to always check out a specific tree, or set up to pull from a particular branch that gets specified separately for each build. Also like SVN, the repository URL given to Darcs is created by concatenating a ``baseURL`` with the branch name, and if no particular branch is requested, it uses a ``defaultBranch``. The only difference in usage is that each potential Darcs repository URL must point to a fully-fledged repository, whereas SVN URLs usually point to sub-trees of the main Subversion repository. In other words, doing an SVN checkout of ``baseURL`` is legal, but silly, since you'd probably wind up with a copy of every single branch in the whole repository. Doing a Darcs checkout of ``baseURL`` is just plain wrong, since the parent directory of a collection of Darcs repositories is not itself a valid repository.hj/hhhhh}rM/(h]h]h]h]h]uhMhhh]rN/(hXLike rO/rP/}rQ/(hXLike hjK/ubh)rR/}rS/(hX!:bb:step:`SVN `rT/hjK/hhhhh}rU/(UreftypeXstephhXSVN (Slave-Side)U refdomainXbbrV/h]h]U refexplicith]h]h]hhuhMh]rW/h)rX/}rY/(hjT/h}rZ/(h]h]r[/(hjV/Xbb-stepr\/eh]h]h]uhjR/h]r]/hXSVNr^/r_/}r`/(hUhjX/ubahhubaubhX, this step can either be configured to always check out a specific tree, or set up to pull from a particular branch that gets specified separately for each build. Also like SVN, the repository URL given to Darcs is created by concatenating a ra/rb/}rc/(hX, this step can either be configured to always check out a specific tree, or set up to pull from a particular branch that gets specified separately for each build. Also like SVN, the repository URL given to Darcs is created by concatenating a hjK/ubh)rd/}re/(hX ``baseURL``h}rf/(h]h]h]h]h]uhjK/h]rg/hXbaseURLrh/ri/}rj/(hUhjd/ubahhubhXK with the branch name, and if no particular branch is requested, it uses a rk/rl/}rm/(hXK with the branch name, and if no particular branch is requested, it uses a hjK/ubh)rn/}ro/(hX``defaultBranch``h}rp/(h]h]h]h]h]uhjK/h]rq/hX defaultBranchrr/rs/}rt/(hUhjn/ubahhubhX. The only difference in usage is that each potential Darcs repository URL must point to a fully-fledged repository, whereas SVN URLs usually point to sub-trees of the main Subversion repository. In other words, doing an SVN checkout of ru/rv/}rw/(hX. The only difference in usage is that each potential Darcs repository URL must point to a fully-fledged repository, whereas SVN URLs usually point to sub-trees of the main Subversion repository. In other words, doing an SVN checkout of hjK/ubh)rx/}ry/(hX ``baseURL``h}rz/(h]h]h]h]h]uhjK/h]r{/hXbaseURLr|/r}/}r~/(hUhjx/ubahhubhX is legal, but silly, since you'd probably wind up with a copy of every single branch in the whole repository. Doing a Darcs checkout of r/r/}r/(hX is legal, but silly, since you'd probably wind up with a copy of every single branch in the whole repository. Doing a Darcs checkout of hjK/ubh)r/}r/(hX ``baseURL``h}r/(h]h]h]h]h]uhjK/h]r/hXbaseURLr/r/}r/(hUhj/ubahhubhXx is just plain wrong, since the parent directory of a collection of Darcs repositories is not itself a valid repository.r/r/}r/(hXx is just plain wrong, since the parent directory of a collection of Darcs repositories is not itself a valid repository.hjK/ubeubh)r/}r/(hX-The Darcs step takes the following arguments:r/hj/hhhhh}r/(h]h]h]h]h]uhMhhh]r/hX-The Darcs step takes the following arguments:r/r/}r/(hj/hj/ubaubj)r/}r/(hUhj/hhhjh}r/(h]h]h]h]h]uhNhhh]r/(j)r/}r/(hXr``repourl`` (required unless ``baseURL`` is provided): the URL at which the Darcs source repository is available. hj/hhhjh}r/(h]h]h]h]h]uhMh]r/(j)r/}r/(hX ``repourl``r/hj/hhhjh}r/(h]h]h]h]h]uhMh]r/h)r/}r/(hj/h}r/(h]h]h]h]h]uhj/h]r/hXrepourlr/r/}r/(hUhj/ubahhubaubj)r/}r/(hUh}r/(h]h]h]h]h]uhj/h]r/h)r/}r/(hXe(required unless ``baseURL`` is provided): the URL at which the Darcs source repository is available.hj/hhhhh}r/(h]h]h]h]h]uhMh]r/(hX(required unless r/r/}r/(hX(required unless hj/ubh)r/}r/(hX ``baseURL``h}r/(h]h]h]h]h]uhj/h]r/hXbaseURLr/r/}r/(hUhj/ubahhubhXI is provided): the URL at which the Darcs source repository is available.r/r/}r/(hXI is provided): the URL at which the Darcs source repository is available.hj/ubeubahjubeubj)r/}r/(hX``baseURL`` (required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash. hj/hhhjh}r/(h]h]h]h]h]uhMhhh]r/(j)r/}r/(hX ``baseURL``r/hj/hhhjh}r/(h]h]h]h]h]uhMh]r/h)r/}r/(hj/h}r/(h]h]h]h]h]uhj/h]r/hXbaseURLr/r/}r/(hUhj/ubahhubaubj)r/}r/(hUh}r/(h]h]h]h]h]uhj/h]r/h)r/}r/(hX(required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj/hhhhh}r/(h]h]h]h]h]uhMh]r/(hX(required unless r/r/}r/(hX(required unless hj/ubh)r/}r/(hX ``repourl``h}r/(h]h]h]h]h]uhj/h]r/hXrepourlr/r/}r/(hUhj/ubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.r/r/}r/(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj/ubeubahjubeubj)r/}r/(hX ``defaultBranch`` (allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``darcs get`` command. hj/hhhjh}r/(h]h]h]h]h]uhMhhh]r/(j)r/}r/(hX``defaultBranch``r/hj/hhhjh}r/(h]h]h]h]h]uhMh]r/h)r/}r/(hj/h}r/(h]h]h]h]h]uhj/h]r/hX defaultBranchr/r/}r/(hUhj/ubahhubaubj)r/}r/(hUh}r/(h]h]h]h]h]uhj/h]r/h)r/}r/(hX(allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``darcs get`` command.hj/hhhhh}r/(h]h]h]h]h]uhMh]r/(hX(allowed if and only if r/r/}r/(hX(allowed if and only if hj/ubh)r/}r/(hX ``baseURL``h}r/(h]h]h]h]h]uhj/h]r0hXbaseURLr0r0}r0(hUhj/ubahhubhX is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to r0r0}r0(hX is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to hj/ubh)r0}r0(hX ``baseURL``h}r 0(h]h]h]h]h]uhj/h]r 0hXbaseURLr 0r 0}r 0(hUhj0ubahhubhX1 to create the string that will be passed to the r0r0}r0(hX1 to create the string that will be passed to the hj/ubh)r0}r0(hX ``darcs get``h}r0(h]h]h]h]h]uhj/h]r0hX darcs getr0r0}r0(hUhj0ubahhubhX command.r0r0}r0(hX command.hj/ubeubahjubeubeubj)r0}r0(hUhj/hhhj h}r0(h]h]h]h]h]Uentries]r0((UsingleX#Build Steps; Mercurial (Slave-Side)Xstep-Mercurial (Slave-Side)r0j0tr 0(UsingleX!Mercurial (Slave-Side) Build Stepj0j0tr!0euhMhhh]ubh)r"0}r#0(hUhj/hhhhh}r$0(h]h]h]h]h]hj0uhMhhh]ubeubh)r%0}r&0(hUhj^ hhh}hhh}r'0(h]h]h]h]r(0(jj0eh]r)0hauhMhhh}r*0j0j"0sh]r+0(h)r,0}r-0(hjhj%0hhhhh}r.0(h]h]h]h]h]hjuhMhhh]r/0hXMercurial (Slave-Side)r00r10}r20(hjhj,0ubaubh)r30}r40(hXThe :bb:step:`Mercurial ` build step performs a `Mercurial `_ (aka `hg`) checkout or update.hj%0hhhhh}r50(h]h]h]h]h]uhMhhh]r60(hXThe r70r80}r90(hXThe hj30ubh)r:0}r;0(hX-:bb:step:`Mercurial `r<0hj30hhhhh}r=0(UreftypeXstephhXMercurial (Slave-Side)U refdomainXbbr>0h]h]U refexplicith]h]h]hhuhMh]r?0h)r@0}rA0(hj<0h}rB0(h]h]rC0(hj>0Xbb-steprD0eh]h]h]uhj:0h]rE0hX MercurialrF0rG0}rH0(hUhj@0ubahhubaubhX build step performs a rI0rJ0}rK0(hX build step performs a hj30ubjM)rL0}rM0(hX+`Mercurial `_h}rN0(UnameX Mercurialj Xhttp://selenic.com/mercurialrO0h]h]h]h]h]uhj30h]rP0hX MercurialrQ0rR0}rS0(hUhjL0ubahjYubh)rT0}rU0(hX hKhj30hhh}rV0(UrefurijO0h]rW0Uid14rX0ah]h]rY0X mercurialrZ0ah]h]uh]ubhX (aka r[0r\0}r]0(hX (aka hj30ubjE)r^0}r_0(hX`hg`h}r`0(h]h]h]h]h]uhj30h]ra0hXhgrb0rc0}rd0(hUhj^0ubahjMubhX) checkout or update.re0rf0}rg0(hX) checkout or update.hj30ubeubh)rh0}ri0(hXBranches are available in two modes: `dirname` like :bb:step:`Darcs `, or `inrepo`, which uses the repository internal branches. Make sure this setting matches your changehook, if you have that installed.hj%0hhhhh}rj0(h]h]h]h]h]uhMhhh]rk0(hX%Branches are available in two modes: rl0rm0}rn0(hX%Branches are available in two modes: hjh0ubjE)ro0}rp0(hX `dirname`h}rq0(h]h]h]h]h]uhjh0h]rr0hXdirnamers0rt0}ru0(hUhjo0ubahjMubhX like rv0rw0}rx0(hX like hjh0ubh)ry0}rz0(hX%:bb:step:`Darcs `r{0hjh0hhhhh}r|0(UreftypeXstephhXDarcs (Slave-Side)U refdomainXbbr}0h]h]U refexplicith]h]h]hhuhMh]r~0h)r0}r0(hj{0h}r0(h]h]r0(hj}0Xbb-stepr0eh]h]h]uhjy0h]r0hXDarcsr0r0}r0(hUhj0ubahhubaubhX, or r0r0}r0(hX, or hjh0ubjE)r0}r0(hX`inrepo`h}r0(h]h]h]h]h]uhjh0h]r0hXinrepor0r0}r0(hUhj0ubahjMubhXz, which uses the repository internal branches. Make sure this setting matches your changehook, if you have that installed.r0r0}r0(hXz, which uses the repository internal branches. Make sure this setting matches your changehook, if you have that installed.hjh0ubeubh)r0}r0(hX1The Mercurial step takes the following arguments:r0hj%0hhhhh}r0(h]h]h]h]h]uhMhhh]r0hX1The Mercurial step takes the following arguments:r0r0}r0(hj0hj0ubaubj)r0}r0(hUhj%0hhhjh}r0(h]h]h]h]h]uhNhhh]r0(j)r0}r0(hXv``repourl`` (required unless ``baseURL`` is provided): the URL at which the Mercurial source repository is available. hj0hhhjh}r0(h]h]h]h]h]uhMh]r0(j)r0}r0(hX ``repourl``r0hj0hhhjh}r0(h]h]h]h]h]uhMh]r0h)r0}r0(hj0h}r0(h]h]h]h]h]uhj0h]r0hXrepourlr0r0}r0(hUhj0ubahhubaubj)r0}r0(hUh}r0(h]h]h]h]h]uhj0h]r0h)r0}r0(hXi(required unless ``baseURL`` is provided): the URL at which the Mercurial source repository is available.hj0hhhhh}r0(h]h]h]h]h]uhMh]r0(hX(required unless r0r0}r0(hX(required unless hj0ubh)r0}r0(hX ``baseURL``h}r0(h]h]h]h]h]uhj0h]r0hXbaseURLr0r0}r0(hUhj0ubahhubhXM is provided): the URL at which the Mercurial source repository is available.r0r0}r0(hXM is provided): the URL at which the Mercurial source repository is available.hj0ubeubahjubeubj)r0}r0(hX``baseURL`` (required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash. hj0hhhjh}r0(h]h]h]h]h]uhMhhh]r0(j)r0}r0(hX ``baseURL``r0hj0hhhjh}r0(h]h]h]h]h]uhMh]r0h)r0}r0(hj0h}r0(h]h]h]h]h]uhj0h]r0hXbaseURLr0r0}r0(hUhj0ubahhubaubj)r0}r0(hUh}r0(h]h]h]h]h]uhj0h]r0h)r0}r0(hX(required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj0hhhhh}r0(h]h]h]h]h]uhMh]r0(hX(required unless r0r0}r0(hX(required unless hj0ubh)r0}r0(hX ``repourl``h}r0(h]h]h]h]h]uhj0h]r0hXrepourlr0r0}r0(hUhj0ubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.r0r0}r0(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj0ubeubahjubeubj)r0}r0(hX``defaultBranch`` (allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a :class:`Build` does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``hg clone`` command. hj0hhhjh}r0(h]h]h]h]h]uhMhhh]r0(j)r0}r0(hX``defaultBranch``r0hj0hhhjh}r0(h]h]h]h]h]uhMh]r0h)r0}r0(hj0h}r0(h]h]h]h]h]uhj0h]r0hX defaultBranchr0r0}r0(hUhj0ubahhubaubj)r0}r0(hUh}r0(h]h]h]h]h]uhj0h]r0h)r0}r1(hX(allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a :class:`Build` does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``hg clone`` command.hj0hhhhh}r1(h]h]h]h]h]uhMh]r1(hX(allowed if and only if r1r1}r1(hX(allowed if and only if hj0ubh)r1}r1(hX ``baseURL``h}r1(h]h]h]h]h]uhj0h]r 1hXbaseURLr 1r 1}r 1(hUhj1ubahhubhXC is provided): this specifies the name of the branch to use when a r 1r1}r1(hXC is provided): this specifies the name of the branch to use when a hj0ubh)r1}r1(hX:class:`Build`r1hj0hhhhh}r1(UreftypeXclasshhXBuildU refdomainXpyr1h]h]U refexplicith]h]h]hhhNhj uhMh]r1h)r1}r1(hj1h}r1(h]h]r1(hj1Xpy-classr1eh]h]h]uhj1h]r1hXBuildr1r1}r1(hUhj1ubahhubaubhX; does not provide one of its own. This will be appended to r1r 1}r!1(hX; does not provide one of its own. This will be appended to hj0ubh)r"1}r#1(hX ``baseURL``h}r$1(h]h]h]h]h]uhj0h]r%1hXbaseURLr&1r'1}r(1(hUhj"1ubahhubhX1 to create the string that will be passed to the r)1r*1}r+1(hX1 to create the string that will be passed to the hj0ubh)r,1}r-1(hX ``hg clone``h}r.1(h]h]h]h]h]uhj0h]r/1hXhg cloner01r11}r21(hUhj,1ubahhubhX command.r31r41}r51(hX command.hj0ubeubahjubeubj)r61}r71(hX``branchType`` either 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the ``baseURL`` or the branch is a Mercurial named branch and can be found within the ``repourl``. hj0hhhjh}r81(h]h]h]h]h]uhMhhh]r91(j)r:1}r;1(hX``branchType``r<1hj61hhhjh}r=1(h]h]h]h]h]uhMh]r>1h)r?1}r@1(hj<1h}rA1(h]h]h]h]h]uhj:1h]rB1hX branchTyperC1rD1}rE1(hUhj?1ubahhubaubj)rF1}rG1(hUh}rH1(h]h]h]h]h]uhj61h]rI1h)rJ1}rK1(hXeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the ``baseURL`` or the branch is a Mercurial named branch and can be found within the ``repourl``.hjF1hhhhh}rL1(h]h]h]h]h]uhMh]rM1(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the rN1rO1}rP1(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the hjJ1ubh)rQ1}rR1(hX ``baseURL``h}rS1(h]h]h]h]h]uhjJ1h]rT1hXbaseURLrU1rV1}rW1(hUhjQ1ubahhubhXG or the branch is a Mercurial named branch and can be found within the rX1rY1}rZ1(hXG or the branch is a Mercurial named branch and can be found within the hjJ1ubh)r[1}r\1(hX ``repourl``h}r]1(h]h]h]h]h]uhjJ1h]r^1hXrepourlr_1r`1}ra1(hUhj[1ubahhubhX.rb1}rc1(hX.hjJ1ubeubahjubeubj)rd1}re1(hX``clobberOnBranchChange`` boolean, defaults to ``True``. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch. hj0hhhjh}rf1(h]h]h]h]h]uhMhhh]rg1(j)rh1}ri1(hX``clobberOnBranchChange``rj1hjd1hhhjh}rk1(h]h]h]h]h]uhMh]rl1h)rm1}rn1(hjj1h}ro1(h]h]h]h]h]uhjh1h]rp1hXclobberOnBranchChangerq1rr1}rs1(hUhjm1ubahhubaubj)rt1}ru1(hUh}rv1(h]h]h]h]h]uhjd1h]rw1h)rx1}ry1(hXboolean, defaults to ``True``. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.hjt1hhhhh}rz1(h]h]h]h]h]uhMh]r{1(hXboolean, defaults to r|1r}1}r~1(hXboolean, defaults to hjx1ubh)r1}r1(hX``True``h}r1(h]h]h]h]h]uhjx1h]r1hXTruer1r1}r1(hUhj1ubahhubhXr. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.r1r1}r1(hXr. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.hjx1ubeubahjubeubeubj)r1}r1(hUhj%0hhhj h}r1(h]h]h]h]h]Uentries]r1((UsingleXBuild Steps; Bzr (Slave-Side)Xstep-Bzr (Slave-Side)r1j1tr1(UsingleXBzr (Slave-Side) Build Stepj1j1tr1euhMhhh]ubh)r1}r1(hUhj%0hhhhh}r1(h]h]h]h]h]hj1uhMhhh]ubeubh)r1}r1(hUhj^ hhh}hhh}r1(h]h]h]h]r1(jj1eh]r1h6auhMhhh}r1j1j1sh]r1(h)r1}r1(hjhj1hhhhh}r1(h]h]h]h]h]hjuhMhhh]r1hXBzr (Slave-Side)r1r1}r1(hjhj1ubaubh)r1}r1(hXTbzr is a descendant of Arch/Baz, and is frequently referred to as simply `Bazaar`. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial. It takes the following arguments:hj1hhhhh}r1(h]h]h]h]h]uhMhhh]r1(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply r1r1}r1(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply hj1ubjE)r1}r1(hX`Bazaar`h}r1(h]h]h]h]h]uhj1h]r1hXBazaarr1r1}r1(hUhj1ubahjMubhX. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial. It takes the following arguments:r1r1}r1(hX. The repository-vs-workspace model is similar to Darcs, but it uses a strictly linear sequence of revisions (one history per branch) like Arch. Branches are put in subdirectories. This makes it look very much like Mercurial. It takes the following arguments:hj1ubeubj)r1}r1(hUhj1hhhjh}r1(h]h]h]h]h]uhNhhh]r1(j)r1}r1(hXp``repourl`` (required unless ``baseURL`` is provided): the URL at which the Bzr source repository is available. hj1hhhjh}r1(h]h]h]h]h]uhMh]r1(j)r1}r1(hX ``repourl``r1hj1hhhjh}r1(h]h]h]h]h]uhMh]r1h)r1}r1(hj1h}r1(h]h]h]h]h]uhj1h]r1hXrepourlr1r1}r1(hUhj1ubahhubaubj)r1}r1(hUh}r1(h]h]h]h]h]uhj1h]r1h)r1}r1(hXc(required unless ``baseURL`` is provided): the URL at which the Bzr source repository is available.hj1hhhhh}r1(h]h]h]h]h]uhMh]r1(hX(required unless r1r1}r1(hX(required unless hj1ubh)r1}r1(hX ``baseURL``h}r1(h]h]h]h]h]uhj1h]r1hXbaseURLr1r1}r1(hUhj1ubahhubhXG is provided): the URL at which the Bzr source repository is available.r1r1}r1(hXG is provided): the URL at which the Bzr source repository is available.hj1ubeubahjubeubj)r1}r1(hX``baseURL`` (required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash. hj1hhhjh}r1(h]h]h]h]h]uhMhhh]r1(j)r1}r1(hX ``baseURL``r1hj1hhhjh}r1(h]h]h]h]h]uhMh]r1h)r1}r1(hj1h}r1(h]h]h]h]h]uhj1h]r1hXbaseURLr1r1}r1(hUhj1ubahhubaubj)r1}r1(hUh}r1(h]h]h]h]h]uhj1h]r1h)r1}r1(hX(required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj1hhhhh}r1(h]h]h]h]h]uhMh]r1(hX(required unless r1r1}r1(hX(required unless hj1ubh)r1}r1(hX ``repourl``h}r1(h]h]h]h]h]uhj1h]r1hXrepourlr1r1}r1(hUhj1ubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.r1r1}r1(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj1ubeubahjubeubj)r2}r2(hX``defaultBranch`` (allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``bzr checkout`` command. hj1hhhjh}r2(h]h]h]h]h]uhMhhh]r2(j)r2}r2(hX``defaultBranch``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r 2}r 2(hj2h}r 2(h]h]h]h]h]uhj2h]r 2hX defaultBranchr 2r2}r2(hUhj 2ubahhubaubj)r2}r2(hUh}r2(h]h]h]h]h]uhj2h]r2h)r2}r2(hX(allowed if and only if ``baseURL`` is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to ``baseURL`` to create the string that will be passed to the ``bzr checkout`` command.hj2hhhhh}r2(h]h]h]h]h]uhMh]r2(hX(allowed if and only if r2r2}r2(hX(allowed if and only if hj2ubh)r2}r2(hX ``baseURL``h}r2(h]h]h]h]h]uhj2h]r2hXbaseURLr2r 2}r!2(hUhj2ubahhubhX is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to r"2r#2}r$2(hX is provided): this specifies the name of the branch to use when a Build does not provide one of its own. This will be appended to hj2ubh)r%2}r&2(hX ``baseURL``h}r'2(h]h]h]h]h]uhj2h]r(2hXbaseURLr)2r*2}r+2(hUhj%2ubahhubhX1 to create the string that will be passed to the r,2r-2}r.2(hX1 to create the string that will be passed to the hj2ubh)r/2}r02(hX``bzr checkout``h}r12(h]h]h]h]h]uhj2h]r22hX bzr checkoutr32r42}r52(hUhj/2ubahhubhX command.r62r72}r82(hX command.hj2ubeubahjubeubj)r92}r:2(hXW``forceSharedRepo`` (boolean, optional, defaults to ``False``): If set to ``True``, the working directory will be made into a bzr shared repository if it is not already. Shared repository greatly reduces the amount of history data that needs to be downloaded if not using update/copy mode, or if using update/copy mode with multiple branches. hj1hhhjh}r;2(h]h]h]h]h]uhMhhh]r<2(j)r=2}r>2(hX``forceSharedRepo``r?2hj92hhhjh}r@2(h]h]h]h]h]uhMh]rA2h)rB2}rC2(hj?2h}rD2(h]h]h]h]h]uhj=2h]rE2hXforceSharedReporF2rG2}rH2(hUhjB2ubahhubaubj)rI2}rJ2(hUh}rK2(h]h]h]h]h]uhj92h]rL2h)rM2}rN2(hXB(boolean, optional, defaults to ``False``): If set to ``True``, the working directory will be made into a bzr shared repository if it is not already. Shared repository greatly reduces the amount of history data that needs to be downloaded if not using update/copy mode, or if using update/copy mode with multiple branches.hjI2hhhhh}rO2(h]h]h]h]h]uhMh]rP2(hX (boolean, optional, defaults to rQ2rR2}rS2(hX (boolean, optional, defaults to hjM2ubh)rT2}rU2(hX ``False``h}rV2(h]h]h]h]h]uhjM2h]rW2hXFalserX2rY2}rZ2(hUhjT2ubahhubhX ): If set to r[2r\2}r]2(hX ): If set to hjM2ubh)r^2}r_2(hX``True``h}r`2(h]h]h]h]h]uhjM2h]ra2hXTruerb2rc2}rd2(hUhj^2ubahhubhX, the working directory will be made into a bzr shared repository if it is not already. Shared repository greatly reduces the amount of history data that needs to be downloaded if not using update/copy mode, or if using update/copy mode with multiple branches.re2rf2}rg2(hX, the working directory will be made into a bzr shared repository if it is not already. Shared repository greatly reduces the amount of history data that needs to be downloaded if not using update/copy mode, or if using update/copy mode with multiple branches.hjM2ubeubahjubeubeubj)rh2}ri2(hUhj1hhhj h}rj2(h]h]h]h]h]Uentries]rk2((UsingleXBuild Steps; P4 (Slave-Side)Xstep-P4 (Slave-Side)rl2jl2trm2(UsingleXP4 (Slave-Side) Build Stepjl2jl2trn2euhMhhh]ubh)ro2}rp2(hUhj1hhhhh}rq2(h]h]h]h]h]hjl2uhMhhh]ubeubh)rr2}rs2(hUhj^ hhh}hhh}rt2(h]h]h]h]ru2(jjl2eh]rv2hKauhMhhh}rw2jl2jo2sh]rx2(h)ry2}rz2(hjhjr2hhhhh}r{2(h]h]h]h]h]hjuhMhhh]r|2hXP4 (Slave-Side)r}2r~2}r2(hjhjy2ubaubh)r2}r2(hXThe :bb:step:`P4 (Slave-Side)` build step creates a `Perforce `_ client specification and performs an update.hjr2hhhhh}r2(h]h]h]h]h]uhMhhh]r2(hXThe r2r2}r2(hXThe hj2ubh)r2}r2(hX:bb:step:`P4 (Slave-Side)`r2hj2hhhhh}r2(UreftypeXstephhXP4 (Slave-Side)U refdomainXbbr2h]h]U refexplicith]h]h]hhuhMh]r2h)r2}r2(hj2h}r2(h]h]r2(hj2Xbb-stepr2eh]h]h]uhj2h]r2hXP4 (Slave-Side)r2r2}r2(hUhj2ubahhubaubhX build step creates a r2r2}r2(hX build step creates a hj2ubjM)r2}r2(hX&`Perforce `_h}r2(UnameXPerforcej Xhttp://www.perforce.com/r2h]h]h]h]h]uhj2h]r2hXPerforcer2r2}r2(hUhj2ubahjYubh)r2}r2(hX hKhj2hhh}r2(Urefurij2h]r2Uid15r2ah]h]r2Xperforcer2ah]h]uh]ubhX- client specification and performs an update.r2r2}r2(hX- client specification and performs an update.hj2ubeubj)r2}r2(hUhjr2hhhjh}r2(h]h]h]h]h]uhNhhh]r2(j)r2}r2(hXn``p4base`` A view into the Perforce depot without branch name or trailing "...". Typically ``//depot/proj/``. hj2hhhjh}r2(h]h]h]h]h]uhMh]r2(j)r2}r2(hX ``p4base``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r2}r2(hj2h}r2(h]h]h]h]h]uhj2h]r2hXp4baser2r2}r2(hUhj2ubahhubaubj)r2}r2(hUh}r2(h]h]h]h]h]uhj2h]r2h)r2}r2(hXbA view into the Perforce depot without branch name or trailing "...". Typically ``//depot/proj/``.hj2hhhhh}r2(h]h]h]h]h]uhMh]r2(hXPA view into the Perforce depot without branch name or trailing "...". Typically r2r2}r2(hXPA view into the Perforce depot without branch name or trailing "...". Typically hj2ubh)r2}r2(hX``//depot/proj/``h}r2(h]h]h]h]h]uhj2h]r2hX //depot/proj/r2r2}r2(hUhj2ubahhubhX.r2}r2(hX.hj2ubeubahjubeubj)r2}r2(hXg``defaultBranch`` A branch name to append on build requests if none is specified. Typically ``trunk``. hj2hhhjh}r2(h]h]h]h]h]uhMhhh]r2(j)r2}r2(hX``defaultBranch``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r2}r2(hj2h}r2(h]h]h]h]h]uhj2h]r2hX defaultBranchr2r2}r2(hUhj2ubahhubaubj)r2}r2(hUh}r2(h]h]h]h]h]uhj2h]r2h)r2}r2(hXTA branch name to append on build requests if none is specified. Typically ``trunk``.hj2hhhhh}r2(h]h]h]h]h]uhMh]r2(hXJA branch name to append on build requests if none is specified. Typically r2r2}r2(hXJA branch name to append on build requests if none is specified. Typically hj2ubh)r2}r2(hX ``trunk``h}r2(h]h]h]h]h]uhj2h]r2hXtrunkr2r2}r2(hUhj2ubahhubhX.r2}r2(hX.hj2ubeubahjubeubj)r2}r2(hX``p4port`` (optional): the :samp:`{host}:{port}` string describing how to get to the P4 Depot (repository), used as the :option:`-p` argument for all p4 commands. hj2hhhjh}r2(h]h]h]h]h]uhMhhh]r2(j)r2}r2(hX ``p4port``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r3}r3(hj2h}r3(h]h]h]h]h]uhj2h]r3hXp4portr3r3}r3(hUhj3ubahhubaubj)r3}r3(hUh}r 3(h]h]h]h]h]uhj2h]r 3h)r 3}r 3(hX(optional): the :samp:`{host}:{port}` string describing how to get to the P4 Depot (repository), used as the :option:`-p` argument for all p4 commands.hj3hhhhh}r 3(h]h]h]h]h]uhMh]r3(hX(optional): the r3r3}r3(hX(optional): the hj 3ubh)r3}r3(hUh}r3(h]h]h]h]r3Xsampr3aUrolej3h]uhj 3h]r3(jW)r3}r3(hXhosth}r3(h]h]h]h]h]uhj3h]r3hXhostr3r3}r3(hUhj3ubahjaubhX:r3}r 3(hX:hj3ubjW)r!3}r"3(hXporth}r#3(h]h]h]h]h]uhj3h]r$3hXportr%3r&3}r'3(hUhj!3ubahjaubehhubhXH string describing how to get to the P4 Depot (repository), used as the r(3r)3}r*3(hXH string describing how to get to the P4 Depot (repository), used as the hj 3ubh)r+3}r,3(hX :option:`-p`r-3hj 3hhhhh}r.3(UreftypeXoptionhhX-pU refdomainXstdr/3jNh]h]U refexplicith]h]h]hhuhMh]r03j)r13}r23(hj-3h}r33(h]h]r43(hj/3X std-optionr53eh]h]h]uhj+3h]r63hX-pr73r83}r93(hUhj13ubahjubaubhX argument for all p4 commands.r:3r;3}r<3(hX argument for all p4 commands.hj 3ubeubahjubeubj)r=3}r>3(hX```p4user`` (optional): the Perforce user, used as the :option:`-u` argument to all p4 commands. hj2hhhjh}r?3(h]h]h]h]h]uhM hhh]r@3(j)rA3}rB3(hX ``p4user``rC3hj=3hhhjh}rD3(h]h]h]h]h]uhM h]rE3h)rF3}rG3(hjC3h}rH3(h]h]h]h]h]uhjA3h]rI3hXp4userrJ3rK3}rL3(hUhjF3ubahhubaubj)rM3}rN3(hUh}rO3(h]h]h]h]h]uhj=3h]rP3h)rQ3}rR3(hXT(optional): the Perforce user, used as the :option:`-u` argument to all p4 commands.hjM3hhhhh}rS3(h]h]h]h]h]uhM h]rT3(hX+(optional): the Perforce user, used as the rU3rV3}rW3(hX+(optional): the Perforce user, used as the hjQ3ubh)rX3}rY3(hX :option:`-u`rZ3hjQ3hhhhh}r[3(UreftypeXoptionhhX-uU refdomainXstdr\3jNh]h]U refexplicith]h]h]hhuhM h]r]3j)r^3}r_3(hjZ3h}r`3(h]h]ra3(hj\3X std-optionrb3eh]h]h]uhjX3h]rc3hX-urd3re3}rf3(hUhj^3ubahjubaubhX argument to all p4 commands.rg3rh3}ri3(hX argument to all p4 commands.hjQ3ubeubahjubeubj)rj3}rk3(hXf``p4passwd`` (optional): the Perforce password, used as the :option:`-p` argument to all p4 commands. hj2hhhjh}rl3(h]h]h]h]h]uhMhhh]rm3(j)rn3}ro3(hX ``p4passwd``rp3hjj3hhhjh}rq3(h]h]h]h]h]uhMh]rr3h)rs3}rt3(hjp3h}ru3(h]h]h]h]h]uhjn3h]rv3hXp4passwdrw3rx3}ry3(hUhjs3ubahhubaubj)rz3}r{3(hUh}r|3(h]h]h]h]h]uhjj3h]r}3h)r~3}r3(hXX(optional): the Perforce password, used as the :option:`-p` argument to all p4 commands.hjz3hhhhh}r3(h]h]h]h]h]uhMh]r3(hX/(optional): the Perforce password, used as the r3r3}r3(hX/(optional): the Perforce password, used as the hj~3ubh)r3}r3(hX :option:`-p`r3hj~3hhhhh}r3(UreftypeXoptionhhX-pU refdomainXstdr3jNh]h]U refexplicith]h]h]hhuhMh]r3j)r3}r3(hj3h}r3(h]h]r3(hj3X std-optionr3eh]h]h]uhj3h]r3hX-pr3r3}r3(hUhj3ubahjubaubhX argument to all p4 commands.r3r3}r3(hX argument to all p4 commands.hj~3ubeubahjubeubj)r3}r3(hX``p4extra_views`` (optional): a list of ``(depotpath, clientpath)`` tuples containing extra views to be mapped into the client specification. Both will have "/..." appended automatically. The client name and source directory will be prepended to the client path. hj2hhhjh}r3(h]h]h]h]h]uhMhhh]r3(j)r3}r3(hX``p4extra_views``r3hj3hhhjh}r3(h]h]h]h]h]uhMh]r3h)r3}r3(hj3h}r3(h]h]h]h]h]uhj3h]r3hX p4extra_viewsr3r3}r3(hUhj3ubahhubaubj)r3}r3(hUh}r3(h]h]h]h]h]uhj3h]r3h)r3}r3(hX(optional): a list of ``(depotpath, clientpath)`` tuples containing extra views to be mapped into the client specification. Both will have "/..." appended automatically. The client name and source directory will be prepended to the client path.hj3hhhhh}r3(h]h]h]h]h]uhMh]r3(hX(optional): a list of r3r3}r3(hX(optional): a list of hj3ubh)r3}r3(hX``(depotpath, clientpath)``h}r3(h]h]h]h]h]uhj3h]r3hX(depotpath, clientpath)r3r3}r3(hUhj3ubahhubhX tuples containing extra views to be mapped into the client specification. Both will have "/..." appended automatically. The client name and source directory will be prepended to the client path.r3r3}r3(hX tuples containing extra views to be mapped into the client specification. Both will have "/..." appended automatically. The client name and source directory will be prepended to the client path.hj3ubeubahjubeubj)r3}r3(hX``p4client`` (optional): The name of the client to use. In ``mode='copy'`` and ``mode='update'``, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is `buildbot_%(slave)s_%(build)s`. hj2hhhjh}r3(h]h]h]h]h]uhMhhh]r3(j)r3}r3(hX ``p4client``r3hj3hhhjh}r3(h]h]h]h]h]uhMh]r3h)r3}r3(hj3h}r3(h]h]h]h]h]uhj3h]r3hXp4clientr3r3}r3(hUhj3ubahhubaubj)r3}r3(hUh}r3(h]h]h]h]h]uhj3h]r3h)r3}r3(hX(optional): The name of the client to use. In ``mode='copy'`` and ``mode='update'``, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is `buildbot_%(slave)s_%(build)s`.hj3hhhhh}r3(h]h]h]h]h]uhMh]r3(hX.(optional): The name of the client to use. In r3r3}r3(hX.(optional): The name of the client to use. In hj3ubh)r3}r3(hX``mode='copy'``h}r3(h]h]h]h]h]uhj3h]r3hX mode='copy'r3r3}r3(hUhj3ubahhubhX and r3r3}r3(hX and hj3ubh)r3}r3(hX``mode='update'``h}r3(h]h]h]h]h]uhj3h]r3hX mode='update'r3r3}r3(hUhj3ubahhubhX%, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is r3r3}r3(hX%, it's particularly important that a unique name is used for each checkout directory to avoid incorrect synchronization. For this reason, Python percent substitution will be performed on this value to replace %(slave)s with the slave name and %(builder)s with the builder name. The default is hj3ubjE)r3}r3(hX`buildbot_%(slave)s_%(build)s`h}r3(h]h]h]h]h]uhj3h]r3hXbuildbot_%(slave)s_%(build)sr3r3}r3(hUhj3ubahjMubhX.r3}r3(hX.hj3ubeubahjubeubj)r3}r3(hX``p4line_end`` (optional): The type of line ending handling P4 should use. This is added directly to the client spec's ``LineEnd`` property. The default is ``local``. hj2hhhjh}r3(h]h]h]h]h]uhM#hhh]r3(j)r3}r3(hX``p4line_end``r3hj3hhhjh}r3(h]h]h]h]h]uhM#h]r3h)r3}r3(hj3h}r3(h]h]h]h]h]uhj3h]r4hX p4line_endr4r4}r4(hUhj3ubahhubaubj)r4}r4(hUh}r4(h]h]h]h]h]uhj3h]r4h)r4}r 4(hX(optional): The type of line ending handling P4 should use. This is added directly to the client spec's ``LineEnd`` property. The default is ``local``.hj4hhhhh}r 4(h]h]h]h]h]uhM!h]r 4(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's r 4r 4}r4(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's hj4ubh)r4}r4(hX ``LineEnd``h}r4(h]h]h]h]h]uhj4h]r4hXLineEndr4r4}r4(hUhj4ubahhubhX property. The default is r4r4}r4(hX property. The default is hj4ubh)r4}r4(hX ``local``h}r4(h]h]h]h]h]uhj4h]r4hXlocalr4r4}r4(hUhj4ubahhubhX.r 4}r!4(hX.hj4ubeubahjubeubeubj)r"4}r#4(hUhjr2hhhj h}r$4(h]h]h]h]h]Uentries]r%4((UsingleXBuild Steps; Git (Slave-Side)Xstep-Git (Slave-Side)r&4j&4tr'4(UsingleXGit (Slave-Side) Build Stepj&4j&4tr(4euhM&hhh]ubh)r)4}r*4(hUhjr2hhhhh}r+4(h]h]h]h]h]hj&4uhM&hhh]ubeubh)r,4}r-4(hUhj^ hhh}hhh}r.4(h]h]h]h]r/4(jj&4eh]r04h;auhM(hhh}r14j&4j)4sh]r24(h)r34}r44(hjhj,4hhhhh}r54(h]h]h]h]h]hjuhM(hhh]r64hXGit (Slave-Side)r74r84}r94(hjhj34ubaubh)r:4}r;4(hXVThe :bb:step:`Git ` build step clones or updates a `Git `_ repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the ``git init`` command that the buildbot uses.hj,4hhhhh}r<4(h]h]h]h]h]uhM*hhh]r=4(hXThe r>4r?4}r@4(hXThe hj:4ubh)rA4}rB4(hX!:bb:step:`Git `rC4hj:4hhhhh}rD4(UreftypeXstephhXGit (Slave-Side)U refdomainXbbrE4h]h]U refexplicith]h]h]hhuhM*h]rF4h)rG4}rH4(hjC4h}rI4(h]h]rJ4(hjE4Xbb-steprK4eh]h]h]uhjA4h]rL4hXGitrM4rN4}rO4(hUhjG4ubahhubaubhX build step clones or updates a rP4rQ4}rR4(hX build step clones or updates a hj:4ubjM)rS4}rT4(hX`Git `_h}rU4(UnameXGitj Xhttp://git.or.cz/rV4h]h]h]h]h]uhj:4h]rW4hXGitrX4rY4}rZ4(hUhjS4ubahjYubh)r[4}r\4(hX hKhj:4hhh}r]4(UrefurijV4h]r^4Uid16r_4ah]h]r`4Xgitra4ah]h]uh]ubhX repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the rb4rc4}rd4(hX repository and checks out the specified branch or revision. Note that the buildbot supports Git version 1.2.0 and later: earlier versions (such as the one shipped in Ubuntu 'Dapper') do not support the hj:4ubh)re4}rf4(hX ``git init``h}rg4(h]h]h]h]h]uhj:4h]rh4hXgit initri4rj4}rk4(hUhje4ubahhubhX command that the buildbot uses.rl4rm4}rn4(hX command that the buildbot uses.hj:4ubeubh)ro4}rp4(hX/The ``Git`` step takes the following arguments:rq4hj,4hhhhh}rr4(h]h]h]h]h]uhM0hhh]rs4(hXThe rt4ru4}rv4(hXThe hjo4ubh)rw4}rx4(hX``Git``h}ry4(h]h]h]h]h]uhjo4h]rz4hXGitr{4r|4}r}4(hUhjw4ubahhubhX$ step takes the following arguments:r~4r4}r4(hX$ step takes the following arguments:hjo4ubeubj)r4}r4(hUhj,4hhhjh}r4(h]h]h]h]h]uhNhhh]r4(j)r4}r4(hX@``repourl`` (required): the URL of the upstream Git repository. hj4hhhjh}r4(h]h]h]h]h]uhM3h]r4(j)r4}r4(hX ``repourl``r4hj4hhhjh}r4(h]h]h]h]h]uhM3h]r4h)r4}r4(hj4h}r4(h]h]h]h]h]uhj4h]r4hXrepourlr4r4}r4(hUhj4ubahhubaubj)r4}r4(hUh}r4(h]h]h]h]h]uhj4h]r4h)r4}r4(hX3(required): the URL of the upstream Git repository.r4hj4hhhhh}r4(h]h]h]h]h]uhM3h]r4hX3(required): the URL of the upstream Git repository.r4r4}r4(hj4hj4ubaubahjubeubj)r4}r4(hX``branch`` (optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the :class:`Build` does not provide a branch, the `master` branch will be used. hj4hhhjh}r4(h]h]h]h]h]uhM9hhh]r4(j)r4}r4(hX ``branch``r4hj4hhhjh}r4(h]h]h]h]h]uhM9h]r4h)r4}r4(hj4h}r4(h]h]h]h]h]uhj4h]r4hXbranchr4r4}r4(hUhj4ubahhubaubj)r4}r4(hUh}r4(h]h]h]h]h]uhj4h]r4h)r4}r4(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the :class:`Build` does not provide a branch, the `master` branch will be used.hj4hhhhh}r4(h]h]h]h]h]uhM6h]r4(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the r4r4}r4(hX(optional): this specifies the name of the branch to use when a Build does not provide one of its own. If this this parameter is not specified, and the hj4ubh)r4}r4(hX:class:`Build`r4hj4hhhhh}r4(UreftypeXclasshhXBuildU refdomainXpyr4h]h]U refexplicith]h]h]hhhNhj uhM6h]r4h)r4}r4(hj4h}r4(h]h]r4(hj4Xpy-classr4eh]h]h]uhj4h]r4hXBuildr4r4}r4(hUhj4ubahhubaubhX does not provide a branch, the r4r4}r4(hX does not provide a branch, the hj4ubjE)r4}r4(hX`master`h}r4(h]h]h]h]h]uhj4h]r4hXmasterr4r4}r4(hUhj4ubahjMubhX branch will be used.r4r4}r4(hX branch will be used.hj4ubeubahjubeubj)r4}r4(hXq``ignore_ignores`` (optional): when purging changes, don't use :file:`.gitignore` and :file:`.git/info/exclude`. hj4hhhjh}r4(h]h]h]h]h]uhM=hhh]r4(j)r4}r4(hX``ignore_ignores``r4hj4hhhjh}r4(h]h]h]h]h]uhM=h]r4h)r4}r4(hj4h}r4(h]h]h]h]h]uhj4h]r4hXignore_ignoresr4r4}r4(hUhj4ubahhubaubj)r4}r4(hUh}r4(h]h]h]h]h]uhj4h]r4h)r4}r4(hX](optional): when purging changes, don't use :file:`.gitignore` and :file:`.git/info/exclude`.hj4hhhhh}r4(h]h]h]h]h]uhM<h]r4(hX,(optional): when purging changes, don't use r4r4}r4(hX,(optional): when purging changes, don't use hj4ubh)r4}r4(hUh}r4(h]h]h]h]r4Xfiler4aUrolej4h]uhj4h]r4hX .gitignorer4r4}r4(hX .gitignorehj4ubahhubhX and r4r4}r4(hX and hj4ubh)r4}r5(hUh}r5(h]h]h]h]r5Xfiler5aUrolej5h]uhj4h]r5hX.git/info/excluder5r5}r5(hX.git/info/excludehj4ubahhubhX.r5}r 5(hX.hj4ubeubahjubeubj)r 5}r 5(hX``submodules`` (optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``. hj4hhhjh}r 5(h]h]h]h]h]uhMAhhh]r 5(j)r5}r5(hX``submodules``r5hj 5hhhjh}r5(h]h]h]h]h]uhMAh]r5h)r5}r5(hj5h}r5(h]h]h]h]h]uhj5h]r5hX submodulesr5r5}r5(hUhj5ubahhubaubj)r5}r5(hUh}r5(h]h]h]h]h]uhj 5h]r5h)r5}r5(hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``.hj5hhhhh}r 5(h]h]h]h]h]uhM@h]r!5(hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: r"5r#5}r$5(hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: hj5ubh)r%5}r&5(hX ``False``h}r'5(h]h]h]h]h]uhj5h]r(5hXFalser)5r*5}r+5(hUhj%5ubahhubhX.r,5}r-5(hX.hj5ubeubahjubeubj)r.5}r/5(hX``reference`` (optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist. hj4hhhjh}r05(h]h]h]h]h]uhMFhhh]r15(j)r25}r35(hX ``reference``r45hj.5hhhjh}r55(h]h]h]h]h]uhMFh]r65h)r75}r85(hj45h}r95(h]h]h]h]h]uhj25h]r:5hX referencer;5r<5}r=5(hUhj75ubahhubaubj)r>5}r?5(hUh}r@5(h]h]h]h]h]uhj.5h]rA5h)rB5}rC5(hX(optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist.rD5hj>5hhhhh}rE5(h]h]h]h]h]uhMDh]rF5hX(optional): use the specified string as a path to a reference repository on the local machine. Git will try to grab objects from this path first instead of the main repository, if they exist.rG5rH5}rI5(hjD5hjB5ubaubahjubeubj)rJ5}rK5(hX``shallow`` (optional): instructs Git to attempt shallow clones (``--depth 1``). If the user/scheduler asks for a specific revision, this parameter is ignored. hj4hhhjh}rL5(h]h]h]h]h]uhMJhhh]rM5(j)rN5}rO5(hX ``shallow``rP5hjJ5hhhjh}rQ5(h]h]h]h]h]uhMJh]rR5h)rS5}rT5(hjP5h}rU5(h]h]h]h]h]uhjN5h]rV5hXshallowrW5rX5}rY5(hUhjS5ubahhubaubj)rZ5}r[5(hUh}r\5(h]h]h]h]h]uhjJ5h]r]5h)r^5}r_5(hX(optional): instructs Git to attempt shallow clones (``--depth 1``). If the user/scheduler asks for a specific revision, this parameter is ignored.hjZ5hhhhh}r`5(h]h]h]h]h]uhMIh]ra5(hX5(optional): instructs Git to attempt shallow clones (rb5rc5}rd5(hX5(optional): instructs Git to attempt shallow clones (hj^5ubh)re5}rf5(hX ``--depth 1``h}rg5(h]h]h]h]h]uhj^5h]rh5hX --depth 1ri5rj5}rk5(hUhje5ubahhubhXR). If the user/scheduler asks for a specific revision, this parameter is ignored.rl5rm5}rn5(hXR). If the user/scheduler asks for a specific revision, this parameter is ignored.hj^5ubeubahjubeubj)ro5}rp5(hX``progress`` (optional): passes the (``--progress``) flag to (``git fetch``). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later. hj4hhhjh}rq5(h]h]h]h]h]uhMOhhh]rr5(j)rs5}rt5(hX ``progress``ru5hjo5hhhjh}rv5(h]h]h]h]h]uhMOh]rw5h)rx5}ry5(hju5h}rz5(h]h]h]h]h]uhjs5h]r{5hXprogressr|5r}5}r~5(hUhjx5ubahhubaubj)r5}r5(hUh}r5(h]h]h]h]h]uhjo5h]r5h)r5}r5(hX(optional): passes the (``--progress``) flag to (``git fetch``). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.hj5hhhhh}r5(h]h]h]h]h]uhMMh]r5(hX(optional): passes the (r5r5}r5(hX(optional): passes the (hj5ubh)r5}r5(hX``--progress``h}r5(h]h]h]h]h]uhj5h]r5hX --progressr5r5}r5(hUhj5ubahhubhX ) flag to (r5r5}r5(hX ) flag to (hj5ubh)r5}r5(hX ``git fetch``h}r5(h]h]h]h]h]uhj5h]r5hX git fetchr5r5}r5(hUhj5ubahhubhXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.r5r5}r5(hXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.hj5ubeubahjubeubeubh)r5}r5(hXThis Source step integrates with :bb:chsrc:`GerritChangeSource`, and will automatically use Gerrit's "virtual branch" (``refs/changes/*``) to download the additionnal changes introduced by a pending changeset.hj,4hhhhh}r5(h]h]h]h]h]uhMQhhh]r5(hX!This Source step integrates with r5r5}r5(hX!This Source step integrates with hj5ubh)r5}r5(hX:bb:chsrc:`GerritChangeSource`r5hj5hhhhh}r5(UreftypeXchsrchhXGerritChangeSourceU refdomainXbbr5h]h]U refexplicith]h]h]hhuhMQh]r5h)r5}r5(hj5h}r5(h]h]r5(hj5Xbb-chsrcr5eh]h]h]uhj5h]r5hXGerritChangeSourcer5r5}r5(hUhj5ubahhubaubhX8, and will automatically use Gerrit's "virtual branch" (r5r5}r5(hX8, and will automatically use Gerrit's "virtual branch" (hj5ubh)r5}r5(hX``refs/changes/*``h}r5(h]h]h]h]h]uhj5h]r5hXrefs/changes/*r5r5}r5(hUhj5ubahhubhXH) to download the additionnal changes introduced by a pending changeset.r5r5}r5(hXH) to download the additionnal changes introduced by a pending changeset.hj5ubeubj)r5}r5(hUhj,4hhhj h}r5(h]h]h]h]h]j ]r5(jX/Gerrit integration; Git (Slave-Side) Build StepUindex-14r5Utr5ajuhMUhhh]ubh)r5}r5(hUhj,4hhhhh}r5(h]h]h]h]h]hj5uhMVhhh]ubh)r5}r5(hXGerrit integration can be also triggered using forced build with ``gerrit_change`` property with value in format: ``change_number/patchset_number``.hj,4hhh}hhh}r5(h]h]h]h]r5j5ah]uhMWhhh}r5j5j5sh]r5(hXAGerrit integration can be also triggered using forced build with r5r5}r5(hXAGerrit integration can be also triggered using forced build with hj5ubh)r5}r5(hX``gerrit_change``h}r5(h]h]h]h]h]uhj5h]r5hX gerrit_changer5r5}r5(hUhj5ubahhubhX property with value in format: r5r5}r5(hX property with value in format: hj5ubh)r5}r5(hX!``change_number/patchset_number``h}r5(h]h]h]h]h]uhj5h]r5hXchange_number/patchset_numberr5r5}r5(hUhj5ubahhubhX.r5}r5(hX.hj5ubeubj)r5}r5(hUhj,4hhhj h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; BK (Slave-Side)Xstep-BK (Slave-Side)r5j5tr5(UsingleXBK (Slave-Side) Build Stepj5j5tr5euhM[hhh]ubh)r5}r5(hUhj,4hhhhh}r5(h]h]h]h]h]hj5uhM[hhh]ubeubh)r5}r5(hUhj^ hhh}hhh}r5(h]h]h]h]r5(jj5eh]r5h8auhM]hhh}r5j5j5sh]r5(h)r5}r5(hjhj5hhhhh}r5(h]h]h]h]h]hjuhM]hhh]r5hXBitKeeper (Slave-Side)r5r5}r5(hjhj5ubaubh)r5}r5(hXvThe :bb:step:`BK ` build step performs a `BitKeeper `_ checkout or update.hj5hhhhh}r6(h]h]h]h]h]uhM_hhh]r6(hXThe r6r6}r6(hXThe hj5ubh)r6}r6(hX:bb:step:`BK `r6hj5hhhhh}r6(UreftypeXstephhXBK (Slave-Side)U refdomainXbbr 6h]h]U refexplicith]h]h]hhuhM_h]r 6h)r 6}r 6(hj6h}r 6(h]h]r6(hj 6Xbb-stepr6eh]h]h]uhj6h]r6hXBKr6r6}r6(hUhj 6ubahhubaubhX build step performs a r6r6}r6(hX build step performs a hj5ubjM)r6}r6(hX(`BitKeeper `_h}r6(UnameX BitKeeperj Xhttp://www.bitkeeper.com/r6h]h]h]h]h]uhj5h]r6hX BitKeeperr6r6}r6(hUhj6ubahjYubh)r6}r 6(hX hKhj5hhh}r!6(Urefurij6h]r"6U bitkeeperr#6ah]h]h]h]r$6hauh]ubhX checkout or update.r%6r&6}r'6(hX checkout or update.hj5ubeubh)r(6}r)6(hX1The BitKeeper step takes the following arguments:r*6hj5hhhhh}r+6(h]h]h]h]h]uhMbhhh]r,6hX1The BitKeeper step takes the following arguments:r-6r.6}r/6(hj*6hj(6ubaubj)r06}r16(hUhj5hhhjh}r26(h]h]h]h]h]uhNhhh]r36(j)r46}r56(hXv``repourl`` (required unless ``baseURL`` is provided): the URL at which the BitKeeper source repository is available. hj06hhhjh}r66(h]h]h]h]h]uhMfh]r76(j)r86}r96(hX ``repourl``r:6hj46hhhjh}r;6(h]h]h]h]h]uhMfh]r<6h)r=6}r>6(hj:6h}r?6(h]h]h]h]h]uhj86h]r@6hXrepourlrA6rB6}rC6(hUhj=6ubahhubaubj)rD6}rE6(hUh}rF6(h]h]h]h]h]uhj46h]rG6h)rH6}rI6(hXi(required unless ``baseURL`` is provided): the URL at which the BitKeeper source repository is available.hjD6hhhhh}rJ6(h]h]h]h]h]uhMeh]rK6(hX(required unless rL6rM6}rN6(hX(required unless hjH6ubh)rO6}rP6(hX ``baseURL``h}rQ6(h]h]h]h]h]uhjH6h]rR6hXbaseURLrS6rT6}rU6(hUhjO6ubahhubhXM is provided): the URL at which the BitKeeper source repository is available.rV6rW6}rX6(hXM is provided): the URL at which the BitKeeper source repository is available.hjH6ubeubahjubeubj)rY6}rZ6(hX``baseURL`` (required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash. hj06hhhjh}r[6(h]h]h]h]h]uhMkhhh]r\6(j)r]6}r^6(hX ``baseURL``r_6hjY6hhhjh}r`6(h]h]h]h]h]uhMkh]ra6h)rb6}rc6(hj_6h}rd6(h]h]h]h]h]uhj]6h]re6hXbaseURLrf6rg6}rh6(hUhjb6ubahhubaubj)ri6}rj6(hUh}rk6(h]h]h]h]h]uhjY6h]rl6h)rm6}rn6(hX(required unless ``repourl`` is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hji6hhhhh}ro6(h]h]h]h]h]uhMih]rp6(hX(required unless rq6rr6}rs6(hX(required unless hjm6ubh)rt6}ru6(hX ``repourl``h}rv6(h]h]h]h]h]uhjm6h]rw6hXrepourlrx6ry6}rz6(hUhjt6ubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.r{6r|6}r}6(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hjm6ubeubahjubeubeubj)r~6}r6(hUhj5hhhj h}r6(h]h]h]h]h]Uentries]r6((UsingleXBuild Steps; Repo (Slave-Side)Xstep-Repo (Slave-Side)r6j6tr6(UsingleXRepo (Slave-Side) Build Stepj6j6tr6euhMnhhh]ubh)r6}r6(hUhj5hhhhh}r6(h]h]h]h]h]hj6uhMnhhh]ubeubh)r6}r6(hUhj^ hhh}hhh}r6(h]h]h]h]r6(jj6eh]r6hQauhMphhh}r6j6j6sh]r6(h)r6}r6(hjhj6hhhhh}r6(h]h]h]h]h]hjuhMphhh]r6hXRepo (Slave-Side)r6r6}r6(hjhj6ubaubj)r6}r6(hUhj6hNhj h}r6(h]h]h]h]h]Uentries]r6(jX;buildbot.steps.source.Repo (class in buildbot.steps.source)hUtr6auhNhhh]ubj )r6}r6(hUhj6hNhj h}r6(j j Xpyh]h]h]h]h]j Xclassr6j j6uhNhhh]r6(j )r6}r6(hXbuildbot.steps.source.Repohj6hhhj h}r6(h]r6haj j h]h]h]h]r6haj Xbuildbot.steps.source.Repoj Xbuildbot.steps.sourcej uhMshhh]r6(j )r6}r6(hXclass hj6hhhj h}r6(h]h]h]h]h]uhMshhh]r6hXclass r6r6}r6(hUhj6ubaubj )r6}r6(hXbuildbot.steps.source.hj6hhhj h}r6(h]h]h]h]h]uhMshhh]r6hXbuildbot.steps.source.r6r6}r6(hUhj6ubaubj )r6}r6(hXRepohj6hhhj h}r6(h]h]h]h]h]uhMshhh]r6hXRepor6r6}r6(hUhj6ubaubeubj )r6}r6(hUhj6hhhj h}r6(h]h]h]h]h]uhMshhh]ubeubh)r6}r6(hXoThe :bb:step:`Repo (Slave-Side)` build step performs a `Repo `_ init and sync.hj6hhhhh}r6(h]h]h]h]h]uhMthhh]r6(hXThe r6r6}r6(hXThe hj6ubh)r6}r6(hX:bb:step:`Repo (Slave-Side)`r6hj6hhhhh}r6(UreftypeXstephhXRepo (Slave-Side)U refdomainXbbr6h]h]U refexplicith]h]h]hhuhMth]r6h)r6}r6(hj6h}r6(h]h]r6(hj6Xbb-stepr6eh]h]h]uhj6h]r6hXRepo (Slave-Side)r6r6}r6(hUhj6ubahhubaubhX build step performs a r6r6}r6(hX build step performs a hj6ubjM)r6}r6(hX)`Repo `_h}r6(UnameXRepoj Xhttp://lwn.net/Articles/304488/r6h]h]h]h]h]uhj6h]r6hXRepor6r6}r6(hUhj6ubahjYubh)r6}r6(hX" hKhj6hhh}r6(Urefurij6h]r6Uid17r6ah]h]r6Xrepor6ah]h]uh]ubhX init and sync.r6r6}r6(hX init and sync.hj6ubeubh)r6}r6(hXPThis step is obsolete and should not be used anymore. please use: `Repo` insteadr6hj6hhhhh}r6(h]h]h]h]h]uhMwhhh]r6(hXBThis step is obsolete and should not be used anymore. please use: r6r6}r6(hXBThis step is obsolete and should not be used anymore. please use: hj6ubjE)r6}r6(hX`Repo`h}r6(h]h]h]h]h]uhj6h]r6hXRepor6r6}r6(hUhj6ubahjMubhX insteadr6r6}r6(hX insteadhj6ubeubh)r6}r6(hX,The Repo step takes the following arguments:r6hj6hhhhh}r6(h]h]h]h]h]uhMyhhh]r6hX,The Repo step takes the following arguments:r7r7}r7(hj6hj6ubaubj)r7}r7(hUhj6hhhjh}r7(h]h]h]h]h]uhNhhh]r7(j)r7}r7(hXc``manifest_url`` (required): the URL at which the Repo's manifests source repository is available. hj7hhhjh}r 7(h]h]h]h]h]uhM|h]r 7(j)r 7}r 7(hX``manifest_url``r 7hj7hhhjh}r7(h]h]h]h]h]uhM|h]r7h)r7}r7(hj 7h}r7(h]h]h]h]h]uhj 7h]r7hX manifest_urlr7r7}r7(hUhj7ubahhubaubj)r7}r7(hUh}r7(h]h]h]h]h]uhj7h]r7h)r7}r7(hXQ(required): the URL at which the Repo's manifests source repository is available.r7hj7hhhhh}r7(h]h]h]h]h]uhM|h]r7hXQ(required): the URL at which the Repo's manifests source repository is available.r 7r!7}r"7(hj7hj7ubaubahjubeubj)r#7}r$7(hX``manifest_branch`` (optional, defaults to ``master``): the manifest repository branch on which repo will take its manifest. Corresponds to the ``-b`` argument to the :command:`repo init` command. hj7hhhjh}r%7(h]h]h]h]h]uhMhhh]r&7(j)r'7}r(7(hX``manifest_branch``r)7hj#7hhhjh}r*7(h]h]h]h]h]uhMh]r+7h)r,7}r-7(hj)7h}r.7(h]h]h]h]h]uhj'7h]r/7hXmanifest_branchr07r17}r27(hUhj,7ubahhubaubj)r37}r47(hUh}r57(h]h]h]h]h]uhj#7h]r67h)r77}r87(hX(optional, defaults to ``master``): the manifest repository branch on which repo will take its manifest. Corresponds to the ``-b`` argument to the :command:`repo init` command.hj37hhhhh}r97(h]h]h]h]h]uhMh]r:7(hX(optional, defaults to r;7r<7}r=7(hX(optional, defaults to hj77ubh)r>7}r?7(hX ``master``h}r@7(h]h]h]h]h]uhj77h]rA7hXmasterrB7rC7}rD7(hUhj>7ubahhubhX[): the manifest repository branch on which repo will take its manifest. Corresponds to the rE7rF7}rG7(hX[): the manifest repository branch on which repo will take its manifest. Corresponds to the hj77ubh)rH7}rI7(hX``-b``h}rJ7(h]h]h]h]h]uhj77h]rK7hX-brL7rM7}rN7(hUhjH7ubahhubhX argument to the rO7rP7}rQ7(hX argument to the hj77ubjL)rR7}rS7(hX:command:`repo init`h}rT7(h]h]rU7jQah]h]h]uhj77h]rV7hX repo initrW7rX7}rY7(hUhjR7ubahjVubhX command.rZ7r[7}r\7(hX command.hj77ubeubahjubeubj)r]7}r^7(hX``manifest_file`` (optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command. hj7hhhjh}r_7(h]h]h]h]h]uhMhhh]r`7(j)ra7}rb7(hX``manifest_file``rc7hj]7hhhjh}rd7(h]h]h]h]h]uhMh]re7h)rf7}rg7(hjc7h}rh7(h]h]h]h]h]uhja7h]ri7hX manifest_filerj7rk7}rl7(hUhjf7ubahhubaubj)rm7}rn7(hUh}ro7(h]h]h]h]h]uhj]7h]rp7h)rq7}rr7(hX(optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command.hjm7hhhhh}rs7(h]h]h]h]h]uhMh]rt7(hX(optional, defaults to ru7rv7}rw7(hX(optional, defaults to hjq7ubh)rx7}ry7(hX``default.xml``h}rz7(h]h]h]h]h]uhjq7h]r{7hX default.xmlr|7r}7}r~7(hUhjx7ubahhubhX-): the manifest filename. Corresponds to the r7r7}r7(hX-): the manifest filename. Corresponds to the hjq7ubh)r7}r7(hX``-m``h}r7(h]h]h]h]h]uhjq7h]r7hX-mr7r7}r7(hUhj7ubahhubhX argument to the r7r7}r7(hX argument to the hjq7ubjL)r7}r7(hX:command:`repo init`h}r7(h]h]r7jQah]h]h]uhjq7h]r7hX repo initr7r7}r7(hUhj7ubahjVubhX command.r7r7}r7(hX command.hjq7ubeubahjubeubj)r7}r7(hX2``tarball`` (optional, defaults to ``None``): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the ``.repo`` directory which contains all the Git objects. This feature helps to minimize network usage on very big projects. hj7hhhjh}r7(h]h]h]h]h]uhMhhh]r7(j)r7}r7(hX ``tarball``r7hj7hhhjh}r7(h]h]h]h]h]uhMh]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hXtarballr7r7}r7(hUhj7ubahhubaubj)r7}r7(hUh}r7(h]h]h]h]h]uhj7h]r7h)r7}r7(hX%(optional, defaults to ``None``): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the ``.repo`` directory which contains all the Git objects. This feature helps to minimize network usage on very big projects.hj7hhhhh}r7(h]h]h]h]h]uhMh]r7(hX(optional, defaults to r7r7}r7(hX(optional, defaults to hj7ubh)r7}r7(hX``None``h}r7(h]h]h]h]h]uhj7h]r7hXNoner7r7}r7(hUhj7ubahhubhX): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the r7r7}r7(hX): the repo tarball used for fast bootstrap. If not present the tarball will be created automatically after first sync. It is a copy of the hj7ubh)r7}r7(hX ``.repo``h}r7(h]h]h]h]h]uhj7h]r7hX.repor7r7}r7(hUhj7ubahhubhXq directory which contains all the Git objects. This feature helps to minimize network usage on very big projects.r7r7}r7(hXq directory which contains all the Git objects. This feature helps to minimize network usage on very big projects.hj7ubeubahjubeubj)r7}r7(hX``jobs`` (optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j". hj7hhhjh}r7(h]h]h]h]h]uhMhhh]r7(j)r7}r7(hX``jobs``r7hj7hhhjh}r7(h]h]h]h]h]uhMh]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hXjobsr7r7}r7(hUhj7ubahhubaubj)r7}r7(hUh}r7(h]h]h]h]h]uhj7h]r7h)r7}r7(hX(optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hj7hhhhh}r7(h]h]h]h]h]uhMh]r7(hX(optional, defaults to r7r7}r7(hX(optional, defaults to hj7ubh)r7}r7(hX``None``h}r7(h]h]h]h]h]uhj7h]r7hXNoner7r7}r7(hUhj7ubahhubhXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".r7r7}r7(hXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hj7ubeubahjubeubeubh)r7}r7(hXThis Source step integrates with :bb:chsrc:`GerritChangeSource`, and will automatically use the :command:`repo download` command of repo to download the additionnal changes introduced by a pending changeset.hj6hhhhh}r7(h]h]h]h]h]uhMhhh]r7(hX!This Source step integrates with r7r7}r7(hX!This Source step integrates with hj7ubh)r7}r7(hX:bb:chsrc:`GerritChangeSource`r7hj7hhhhh}r7(UreftypeXchsrchhXGerritChangeSourceU refdomainXbbr7h]h]U refexplicith]h]h]hhuhMh]r7h)r7}r7(hj7h}r7(h]h]r7(hj7Xbb-chsrcr7eh]h]h]uhj7h]r7hXGerritChangeSourcer7r7}r8(hUhj7ubahhubaubhX!, and will automatically use the r8r8}r8(hX!, and will automatically use the hj7ubjL)r8}r8(hX:command:`repo download`h}r8(h]h]r8jQah]h]h]uhj7h]r8hX repo downloadr 8r 8}r 8(hUhj8ubahjVubhXW command of repo to download the additionnal changes introduced by a pending changeset.r 8r 8}r8(hXW command of repo to download the additionnal changes introduced by a pending changeset.hj7ubeubj)r8}r8(hUhj6hhhj h}r8(h]h]h]h]h]j ]r8(jX0Gerrit integration; Repo (Slave-Side) Build StepUindex-15r8Utr8ajuhMhhh]ubh)r8}r8(hUhj6hhhhh}r8(h]h]h]h]h]hj8uhMhhh]ubh)r8}r8(hXGerrit integration can be also triggered using forced build with following properties: ``repo_d``, ``repo_d[0-9]``, ``repo_download``, ``repo_download[0-9]`` with values in format: ``project/change_number/patchset_number``. All of these properties will be translated into a :command:`repo download`. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.hj6hhh}hhh}r8(h]h]h]h]r8j8ah]uhMhhh}r8j8j8sh]r8(hXWGerrit integration can be also triggered using forced build with following properties: r8r8}r 8(hXWGerrit integration can be also triggered using forced build with following properties: hj8ubh)r!8}r"8(hX ``repo_d``h}r#8(h]h]h]h]h]uhj8h]r$8hXrepo_dr%8r&8}r'8(hUhj!8ubahhubhX, r(8r)8}r*8(hX, hj8ubh)r+8}r,8(hX``repo_d[0-9]``h}r-8(h]h]h]h]h]uhj8h]r.8hX repo_d[0-9]r/8r08}r18(hUhj+8ubahhubhX, r28r38}r48(hX, hj8ubh)r58}r68(hX``repo_download``h}r78(h]h]h]h]h]uhj8h]r88hX repo_downloadr98r:8}r;8(hUhj58ubahhubhX, r<8r=8}r>8(hX, hj8ubh)r?8}r@8(hX``repo_download[0-9]``h}rA8(h]h]h]h]h]uhj8h]rB8hXrepo_download[0-9]rC8rD8}rE8(hUhj?8ubahhubhX with values in format: rF8rG8}rH8(hX with values in format: hj8ubh)rI8}rJ8(hX)``project/change_number/patchset_number``h}rK8(h]h]h]h]h]uhj8h]rL8hX%project/change_number/patchset_numberrM8rN8}rO8(hUhjI8ubahhubhX4. All of these properties will be translated into a rP8rQ8}rR8(hX4. All of these properties will be translated into a hj8ubjL)rS8}rT8(hX:command:`repo download`h}rU8(h]h]rV8jQah]h]h]uhj8h]rW8hX repo downloadrX8rY8}rZ8(hUhjS8ubahjVubhX. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.r[8r\8}r]8(hX. This feature allows integrators to build with several pending interdependent changes, which at the moment cannot be described properly in Gerrit, and can only be described by humans.hj8ubeubj)r^8}r_8(hUhj6hhhj h}r`8(h]h]h]h]h]Uentries]ra8((UsingleX"Build Steps; Monotone (Slave-Side)Xstep-Monotone (Slave-Side)rb8jb8trc8(UsingleX Monotone (Slave-Side) Build Stepjb8jb8trd8euhMhhh]ubh)re8}rf8(hUhj6hhhhh}rg8(h]h]h]h]h]hjb8uhMhhh]ubeubh)rh8}ri8(hUhj^ hhh}hhh}rj8(h]h]h]h]rk8(jjb8eh]rl8hauhMhhh}rm8jb8je8sh]rn8(h)ro8}rp8(hjhjh8hhhhh}rq8(h]h]h]h]h]hjuhMhhh]rr8hXMonotone (Slave-Side)rs8rt8}ru8(hjhjo8ubaubh)rv8}rw8(hXThe :bb:step:`Monotone ` build step performs a `Monotone `__, (aka ``mtn``) checkout or update.hjh8hhhhh}rx8(h]h]h]h]h]uhMhhh]ry8(hXThe rz8r{8}r|8(hXThe hjv8ubh)r}8}r~8(hX+:bb:step:`Monotone `r8hjv8hhhhh}r8(UreftypeXstephhXMonotone (Slave-Side)U refdomainXbbr8h]h]U refexplicith]h]h]hhuhMh]r8h)r8}r8(hj8h}r8(h]h]r8(hj8Xbb-stepr8eh]h]h]uhj}8h]r8hXMonotoner8r8}r8(hUhj8ubahhubaubhX build step performs a r8r8}r8(hX build step performs a hjv8ubjM)r8}r8(hX%`Monotone `__h}r8(UnameXMonotonej Xhttp://www.monotone.cah]h]h]h]h]uhjv8h]r8hXMonotoner8r8}r8(hUhj8ubahjYubhX, (aka r8r8}r8(hX, (aka hjv8ubh)r8}r8(hX``mtn``h}r8(h]h]h]h]h]uhjv8h]r8hXmtnr8r8}r8(hUhj8ubahhubhX) checkout or update.r8r8}r8(hX) checkout or update.hjv8ubeubh)r8}r8(hX0The Monotone step takes the following arguments:r8hjh8hhhhh}r8(h]h]h]h]h]uhMhhh]r8hX0The Monotone step takes the following arguments:r8r8}r8(hj8hj8ubaubj)r8}r8(hUhjh8hhhjh}r8(h]h]h]h]h]uhNhhh]r8(j)r8}r8(hXJ``repourl`` the URL at which the Monotone source repository is available. hj8hhhjh}r8(h]h]h]h]h]uhMh]r8(j)r8}r8(hX ``repourl``r8hj8hhhjh}r8(h]h]h]h]h]uhMh]r8h)r8}r8(hj8h}r8(h]h]h]h]h]uhj8h]r8hXrepourlr8r8}r8(hUhj8ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj8h]r8h)r8}r8(hX=the URL at which the Monotone source repository is available.r8hj8hhhhh}r8(h]h]h]h]h]uhMh]r8hX=the URL at which the Monotone source repository is available.r8r8}r8(hj8hj8ubaubahjubeubj)r8}r8(hXf``branch`` this specifies the name of the branch to use when a Build does not provide one of its own. hj8hhhjh}r8(h]h]h]h]h]uhMhhh]r8(j)r8}r8(hX ``branch``r8hj8hhhjh}r8(h]h]h]h]h]uhMh]r8h)r8}r8(hj8h}r8(h]h]h]h]h]uhj8h]r8hXbranchr8r8}r8(hUhj8ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj8h]r8h)r8}r8(hXZthis specifies the name of the branch to use when a Build does not provide one of its own.r8hj8hhhhh}r8(h]h]h]h]h]uhMh]r8hXZthis specifies the name of the branch to use when a Build does not provide one of its own.r8r8}r8(hj8hj8ubaubahjubeubj)r8}r8(hX``progress`` this is a boolean that has a pull from the repository use ``--ticker=dot`` instead of the default ``--ticker=none``. hj8hhhjh}r8(h]h]h]h]h]uhMhhh]r8(j)r8}r8(hX ``progress``r8hj8hhhjh}r8(h]h]h]h]h]uhMh]r8h)r8}r8(hj8h}r8(h]h]h]h]h]uhj8h]r8hXprogressr8r8}r8(hUhj8ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj8h]r8h)r8}r8(hXtthis is a boolean that has a pull from the repository use ``--ticker=dot`` instead of the default ``--ticker=none``.hj8hhhhh}r8(h]h]h]h]h]uhMh]r8(hX:this is a boolean that has a pull from the repository use r8r9}r9(hX:this is a boolean that has a pull from the repository use hj8ubh)r9}r9(hX``--ticker=dot``h}r9(h]h]h]h]h]uhj8h]r9hX --ticker=dotr9r9}r9(hUhj9ubahhubhX instead of the default r 9r 9}r 9(hX instead of the default hj8ubh)r 9}r 9(hX``--ticker=none``h}r9(h]h]h]h]h]uhj8h]r9hX --ticker=noner9r9}r9(hUhj 9ubahhubhX.r9}r9(hX.hj8ubeubahjubeubeubj)r9}r9(hUhjh8hhhj h}r9(h]h]h]h]h]Uentries]r9((UsingleXBuild Steps; ShellCommandXstep-ShellCommandr9j9tr9(UsingleXShellCommand Build Stepj9j9tr9euhMhhh]ubh)r9}r9(hUhjh8hhhhh}r9(h]h]h]h]h]hj9uhMhhh]ubeubeubh)r9}r 9(hUhhhhh}hhh}r!9(h]h]h]h]r"9(j$j9eh]r#9hauhMhhh}r$9j9j9sh]r%9(h)r&9}r'9(hj)hj9hhhhh}r(9(h]h]h]h]h]hj#uhMhhh]r)9hX ShellCommandr*9r+9}r,9(hj)hj&9ubaubh)r-9}r.9(hXMost interesting steps involve executing a process of some sort on the buildslave. The :bb:step:`ShellCommand` class handles this activity.hj9hhhhh}r/9(h]h]h]h]h]uhMhhh]r09(hXXMost interesting steps involve executing a process of some sort on the buildslave. The r19r29}r39(hXXMost interesting steps involve executing a process of some sort on the buildslave. The hj-9ubh)r49}r59(hX:bb:step:`ShellCommand`r69hj-9hhhhh}r79(UreftypeXstephhX ShellCommandU refdomainXbbr89h]h]U refexplicith]h]h]hhuhMh]r99h)r:9}r;9(hj69h}r<9(h]h]r=9(hj89Xbb-stepr>9eh]h]h]uhj49h]r?9hX ShellCommandr@9rA9}rB9(hUhj:9ubahhubaubhX class handles this activity.rC9rD9}rE9(hX class handles this activity.hj-9ubeubh)rF9}rG9(hXeSeveral subclasses of :bb:step:`ShellCommand` are provided as starting points for common build steps.hj9hhhhh}rH9(h]h]h]h]h]uhMhhh]rI9(hXSeveral subclasses of rJ9rK9}rL9(hXSeveral subclasses of hjF9ubh)rM9}rN9(hX:bb:step:`ShellCommand`rO9hjF9hhhhh}rP9(UreftypeXstephhX ShellCommandU refdomainXbbrQ9h]h]U refexplicith]h]h]hhuhMh]rR9h)rS9}rT9(hjO9h}rU9(h]h]rV9(hjQ9Xbb-steprW9eh]h]h]uhjM9h]rX9hX ShellCommandrY9rZ9}r[9(hUhjS9ubahhubaubhX8 are provided as starting points for common build steps.r\9r]9}r^9(hX8 are provided as starting points for common build steps.hjF9ubeubh)r_9}r`9(hUhj9hhhhh}ra9(h]h]h]h]rb9j;ah]rc9h+auhMhhh]rd9(h)re9}rf9(hj@hj_9hhhhh}rg9(h]h]h]h]h]hj:uhMhhh]rh9hXUsing ShellCommandsri9rj9}rk9(hj@hje9ubaubj)rl9}rm9(hUhj_9hNhj h}rn9(h]h]h]h]h]Uentries]ro9(jXBbuildbot.steps.shell.ShellCommand (class in buildbot.steps.source)hIUtrp9auhNhhh]ubj )rq9}rr9(hUhj_9hNhj h}rs9(j j Xpyh]h]h]h]h]j Xclassrt9j jt9uhNhhh]ru9(j )rv9}rw9(hX!buildbot.steps.shell.ShellCommandhjq9hhhj h}rx9(h]ry9hIaj j h]h]h]h]rz9hIaj X!buildbot.steps.shell.ShellCommandj Xbuildbot.steps.shellj uhMhhh]r{9(j )r|9}r}9(hXclass hjv9hhhj h}r~9(h]h]h]h]h]uhMhhh]r9hXclass r9r9}r9(hUhj|9ubaubj )r9}r9(hXbuildbot.steps.shell.hjv9hhhj h}r9(h]h]h]h]h]uhMhhh]r9hXbuildbot.steps.shell.r9r9}r9(hUhj9ubaubj )r9}r9(hX ShellCommandhjv9hhhj h}r9(h]h]h]h]h]uhMhhh]r9hX ShellCommandr9r9}r9(hUhj9ubaubeubj )r9}r9(hUhjq9hhhj h}r9(h]h]h]h]h]uhMhhh]ubeubh)r9}r9(hXThis is a useful base class for just about everything you might want to do during a build (except for the initial source checkout). It runs a single command in a child shell on the buildslave. All stdout/stderr is recorded into a :class:`LogFile`. The step usually finishes with a status of ``FAILURE`` if the command's exit code is non-zero, otherwise it has a status of ``SUCCESS``.hj_9hhhhh}r9(h]h]h]h]h]uhMhhh]r9(hXThis is a useful base class for just about everything you might want to do during a build (except for the initial source checkout). It runs a single command in a child shell on the buildslave. All stdout/stderr is recorded into a r9r9}r9(hXThis is a useful base class for just about everything you might want to do during a build (except for the initial source checkout). It runs a single command in a child shell on the buildslave. All stdout/stderr is recorded into a hj9ubh)r9}r9(hX:class:`LogFile`r9hj9hhhhh}r9(UreftypeXclasshhXLogFileU refdomainXpyr9h]h]U refexplicith]h]h]hhhNhj uhMh]r9h)r9}r9(hj9h}r9(h]h]r9(hj9Xpy-classr9eh]h]h]uhj9h]r9hXLogFiler9r9}r9(hUhj9ubahhubaubhX-. The step usually finishes with a status of r9r9}r9(hX-. The step usually finishes with a status of hj9ubh)r9}r9(hX ``FAILURE``h}r9(h]h]h]h]h]uhj9h]r9hXFAILUREr9r9}r9(hUhj9ubahhubhXF if the command's exit code is non-zero, otherwise it has a status of r9r9}r9(hXF if the command's exit code is non-zero, otherwise it has a status of hj9ubh)r9}r9(hX ``SUCCESS``h}r9(h]h]h]h]h]uhj9h]r9hXSUCCESSr9r9}r9(hUhj9ubahhubhX.r9}r9(hX.hj9ubeubh)r9}r9(hX%The preferred way to specify the command is with a list of argv strings, since this allows for spaces in filenames and avoids doing any fragile shell-escaping. You can also specify the command with a single string, in which case the string is given to :samp:`/bin/sh -c {COMMAND}` for parsing.hj_9hhhhh}r9(h]h]h]h]h]uhMhhh]r9(hXThe preferred way to specify the command is with a list of argv strings, since this allows for spaces in filenames and avoids doing any fragile shell-escaping. You can also specify the command with a single string, in which case the string is given to r9r9}r9(hXThe preferred way to specify the command is with a list of argv strings, since this allows for spaces in filenames and avoids doing any fragile shell-escaping. You can also specify the command with a single string, in which case the string is given to hj9ubh)r9}r9(hUh}r9(h]h]h]h]r9Xsampr9aUrolej9h]uhj9h]r9(hX /bin/sh -c r9r9}r9(hX /bin/sh -c hj9ubjW)r9}r9(hXCOMMANDh}r9(h]h]h]h]h]uhj9h]r9hXCOMMANDr9r9}r9(hUhj9ubahjaubehhubhX for parsing.r9r9}r9(hX for parsing.hj9ubeubh)r9}r9(hXOn Windows, commands are run via ``cmd.exe /c`` which works well. However, if you're running a batch file, the error level does not get propagated correctly unless you add 'call' before your batch file's name: ``cmd=['call', 'myfile.bat', ...]``.hj_9hhhhh}r9(h]h]h]h]h]uhMhhh]r9(hX!On Windows, commands are run via r9r9}r9(hX!On Windows, commands are run via hj9ubh)r9}r9(hX``cmd.exe /c``h}r9(h]h]h]h]h]uhj9h]r9hX cmd.exe /cr9r9}r9(hUhj9ubahhubhX which works well. However, if you're running a batch file, the error level does not get propagated correctly unless you add 'call' before your batch file's name: r9r9}r9(hX which works well. However, if you're running a batch file, the error level does not get propagated correctly unless you add 'call' before your batch file's name: hj9ubh)r9}r9(hX#``cmd=['call', 'myfile.bat', ...]``h}r9(h]h]h]h]h]uhj9h]r9hXcmd=['call', 'myfile.bat', ...]r9r9}r9(hUhj9ubahhubhX.r9}r9(hX.hj9ubeubh)r9}r9(hX*The :bb:step:`ShellCommand` arguments are:r9hj_9hhhhh}r9(h]h]h]h]h]uhMhhh]r9(hXThe r9r9}r9(hXThe hj9ubh)r9}r9(hX:bb:step:`ShellCommand`r9hj9hhhhh}r9(UreftypeXstephhX ShellCommandU refdomainXbbr:h]h]U refexplicith]h]h]hhuhMh]r:h)r:}r:(hj9h}r:(h]h]r:(hj:Xbb-stepr:eh]h]h]uhj9h]r:hX ShellCommandr:r :}r :(hUhj:ubahhubaubhX arguments are:r :r :}r :(hX arguments are:hj9ubeubj)r:}r:(hUhj_9hhhjh}r:(h]h]h]h]h]uhNhhh]r:(j)r:}r:(hXW``command`` a list of strings (preferred) or single string (discouraged) which specifies the command to be run. A list of strings is preferred because it can be used directly as an argv array. Using a single string (with embedded spaces) requires the buildslave to pass the string to :command:`/bin/sh` for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters. If ``command`` contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed. On the topic of shell metacharacters, note that in DOS the pipe character (``|``) is conditionally escaped (to ``^|``) when it occurs inside a more complex string in a list of strings. It remains unescaped when it occurs as part of a single string or as a lone pipe in a list of strings. hj:hhhjh}r:(h]h]h]h]h]uhMh]r:(j)r:}r:(hX ``command``r:hj:hhhjh}r:(h]h]h]h]h]uhMh]r:h)r:}r:(hj:h}r:(h]h]h]h]h]uhj:h]r:hXcommandr:r :}r!:(hUhj:ubahhubaubj)r":}r#:(hUh}r$:(h]h]h]h]h]uhj:h]r%:(h)r&:}r':(hXa list of strings (preferred) or single string (discouraged) which specifies the command to be run. A list of strings is preferred because it can be used directly as an argv array. Using a single string (with embedded spaces) requires the buildslave to pass the string to :command:`/bin/sh` for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters.hj":hhhhh}r(:(h]h]h]h]h]uhMh]r):(hXa list of strings (preferred) or single string (discouraged) which specifies the command to be run. A list of strings is preferred because it can be used directly as an argv array. Using a single string (with embedded spaces) requires the buildslave to pass the string to r*:r+:}r,:(hXa list of strings (preferred) or single string (discouraged) which specifies the command to be run. A list of strings is preferred because it can be used directly as an argv array. Using a single string (with embedded spaces) requires the buildslave to pass the string to hj&:ubjL)r-:}r.:(hX:command:`/bin/sh`h}r/:(h]h]r0:jQah]h]h]uhj&:h]r1:hX/bin/shr2:r3:}r4:(hUhj-:ubahjVubhXy for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters.r5:r6:}r7:(hXy for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters.hj&:ubeubh)r8:}r9:(hXIf ``command`` contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed.hj":hhhhh}r::(h]h]h]h]h]uhMh]r;:(hXIf r<:r=:}r>:(hXIf hj8:ubh)r?:}r@:(hX ``command``h}rA:(h]h]h]h]h]uhj8:h]rB:hXcommandrC:rD:}rE:(hUhj?:ubahhubhX} contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed.rF:rG:}rH:(hX} contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed.hj8:ubeubh)rI:}rJ:(hX On the topic of shell metacharacters, note that in DOS the pipe character (``|``) is conditionally escaped (to ``^|``) when it occurs inside a more complex string in a list of strings. It remains unescaped when it occurs as part of a single string or as a lone pipe in a list of strings.hj":hhhhh}rK:(h]h]h]h]h]uhMh]rL:(hXKOn the topic of shell metacharacters, note that in DOS the pipe character (rM:rN:}rO:(hXKOn the topic of shell metacharacters, note that in DOS the pipe character (hjI:ubh)rP:}rQ:(hX``|``h}rR:(h]h]h]h]h]uhjI:h]rS:hX|rT:}rU:(hUhjP:ubahhubhX) is conditionally escaped (to rV:rW:}rX:(hX) is conditionally escaped (to hjI:ubh)rY:}rZ:(hX``^|``h}r[:(h]h]h]h]h]uhjI:h]r\:hX^|r]:r^:}r_:(hUhjY:ubahhubhX) when it occurs inside a more complex string in a list of strings. It remains unescaped when it occurs as part of a single string or as a lone pipe in a list of strings.r`:ra:}rb:(hX) when it occurs inside a more complex string in a list of strings. It remains unescaped when it occurs as part of a single string or as a lone pipe in a list of strings.hjI:ubeubehjubeubj)rc:}rd:(hX``workdir`` All ShellCommands are run by default in the ``workdir``, which defaults to the :file:`build` subdirectory of the slave builder's base directory. The absolute path of the workdir will thus be the slave's basedir (set as an option to ``buildslave create-slave``, :ref:`Creating-a-buildslave`) plus the builder's basedir (set in the builder's ``builddir`` key in :file:`master.cfg`) plus the workdir itself (a class-level attribute of the BuildFactory, defaults to :file:`build`). For example:: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], workdir="build/tests")) hj:hhhjh}re:(h]h]h]h]h]uhMhhh]rf:(j)rg:}rh:(hX ``workdir``ri:hjc:hhhjh}rj:(h]h]h]h]h]uhMh]rk:h)rl:}rm:(hji:h}rn:(h]h]h]h]h]uhjg:h]ro:hXworkdirrp:rq:}rr:(hUhjl:ubahhubaubj)rs:}rt:(hUh}ru:(h]h]h]h]h]uhjc:h]rv:(h)rw:}rx:(hXAll ShellCommands are run by default in the ``workdir``, which defaults to the :file:`build` subdirectory of the slave builder's base directory. The absolute path of the workdir will thus be the slave's basedir (set as an option to ``buildslave create-slave``, :ref:`Creating-a-buildslave`) plus the builder's basedir (set in the builder's ``builddir`` key in :file:`master.cfg`) plus the workdir itself (a class-level attribute of the BuildFactory, defaults to :file:`build`).hjs:hhhhh}ry:(h]h]h]h]h]uhMh]rz:(hX,All ShellCommands are run by default in the r{:r|:}r}:(hX,All ShellCommands are run by default in the hjw:ubh)r~:}r:(hX ``workdir``h}r:(h]h]h]h]h]uhjw:h]r:hXworkdirr:r:}r:(hUhj~:ubahhubhX, which defaults to the r:r:}r:(hX, which defaults to the hjw:ubh)r:}r:(hUh}r:(h]h]h]h]r:Xfiler:aUrolej:h]uhjw:h]r:hXbuildr:r:}r:(hXbuildhj:ubahhubhX subdirectory of the slave builder's base directory. The absolute path of the workdir will thus be the slave's basedir (set as an option to r:r:}r:(hX subdirectory of the slave builder's base directory. The absolute path of the workdir will thus be the slave's basedir (set as an option to hjw:ubh)r:}r:(hX``buildslave create-slave``h}r:(h]h]h]h]h]uhjw:h]r:hXbuildslave create-slaver:r:}r:(hUhj:ubahhubhX, r:r:}r:(hX, hjw:ubh)r:}r:(hX:ref:`Creating-a-buildslave`r:hjw:hhhhh}r:(UreftypeXrefhhXcreating-a-buildslaveU refdomainXstdr:h]h]U refexplicith]h]h]hhuhMh]r:jW)r:}r:(hj:h}r:(h]h]r:(hj:Xstd-refr:eh]h]h]uhj:h]r:hXCreating-a-buildslaver:r:}r:(hUhj:ubahjaubaubhX3) plus the builder's basedir (set in the builder's r:r:}r:(hX3) plus the builder's basedir (set in the builder's hjw:ubh)r:}r:(hX ``builddir``h}r:(h]h]h]h]h]uhjw:h]r:hXbuilddirr:r:}r:(hUhj:ubahhubhX key in r:r:}r:(hX key in hjw:ubh)r:}r:(hUh}r:(h]h]h]h]r:Xfiler:aUrolej:h]uhjw:h]r:hX master.cfgr:r:}r:(hX master.cfghj:ubahhubhXT) plus the workdir itself (a class-level attribute of the BuildFactory, defaults to r:r:}r:(hXT) plus the workdir itself (a class-level attribute of the BuildFactory, defaults to hjw:ubh)r:}r:(hUh}r:(h]h]h]h]r:Xfiler:aUrolej:h]uhjw:h]r:hXbuildr:r:}r:(hXbuildhj:ubahhubhX).r:r:}r:(hX).hjw:ubeubh)r:}r:(hX For example::hjs:hhhhh}r:(h]h]h]h]h]uhMh]r:hX For example:r:r:}r:(hX For example:hj:ubaubjS)r:}r:(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], workdir="build/tests"))hjs:hjVh}r:(jXjYh]h]h]h]h]uhMh]r:hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], workdir="build/tests"))r:r:}r:(hUhj:ubaubehjubeubj)r:}r:(hX``env`` a dictionary of environment strings which will be added to the child command's environment. For example, to run tests with a different i18n language setting, you might use :: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], env={'LANG': 'fr_FR'})) These variable settings will override any existing ones in the buildslave's environment or the environment specified in the :class:`Builder`. The exception is :envvar:`PYTHONPATH`, which is merged with (actually prepended to) any existing :envvar:`PYTHONPATH` setting. The following example will prepend :file:`/home/buildbot/lib/python` to any existing :envvar:`PYTHONPATH`:: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PYTHONPATH': "/home/buildbot/lib/python"})) To avoid the need of concatenating path together in the master config file, if the value is a list, it will be joined together using the right platform dependant separator. Those variables support expansion so that if you just want to prepend :file:`/home/buildbot/bin` to the :envvar:`PATH` environment variable, you can do it by putting the value ``${PATH}`` at the end of the value like in the example below. Variables that don't exist on the slave will be replaced by ``""``. :: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]})) Note that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as ``buildnumber`` must be substituted using :ref:`Interpolate`. hj:hhhjh}r:(h]h]h]h]h]uhM#hhh]r:(j)r:}r:(hX``env``r:hj:hhhjh}r:(h]h]h]h]h]uhM#h]r:h)r:}r:(hj:h}r:(h]h]h]h]h]uhj:h]r:hXenvr:r:}r:(hUhj:ubahhubaubj)r:}r:(hUh}r:(h]h]h]h]h]uhj:h]r:(h)r:}r:(hXa dictionary of environment strings which will be added to the child command's environment. For example, to run tests with a different i18n language setting, you might use ::hj:hhhhh}r:(h]h]h]h]h]uhMh]r:hXa dictionary of environment strings which will be added to the child command's environment. For example, to run tests with a different i18n language setting, you might user:r:}r:(hXa dictionary of environment strings which will be added to the child command's environment. For example, to run tests with a different i18n language setting, you might usehj:ubaubjS)r:}r:(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], env={'LANG': 'fr_FR'}))hj:hjVh}r:(jXjYh]h]h]h]h]uhMh]r:hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], env={'LANG': 'fr_FR'}))r:r;}r;(hUhj:ubaubh)r;}r;(hXxThese variable settings will override any existing ones in the buildslave's environment or the environment specified in the :class:`Builder`. The exception is :envvar:`PYTHONPATH`, which is merged with (actually prepended to) any existing :envvar:`PYTHONPATH` setting. The following example will prepend :file:`/home/buildbot/lib/python` to any existing :envvar:`PYTHONPATH`::hj:hhhhh}r;(h]h]h]h]h]uhMh]r;(hX|These variable settings will override any existing ones in the buildslave's environment or the environment specified in the r;r;}r;(hX|These variable settings will override any existing ones in the buildslave's environment or the environment specified in the hj;ubh)r ;}r ;(hX:class:`Builder`r ;hj;hhhhh}r ;(UreftypeXclasshhXBuilderU refdomainXpyr ;h]h]U refexplicith]h]h]hhhNhj uhMh]r;h)r;}r;(hj ;h}r;(h]h]r;(hj ;Xpy-classr;eh]h]h]uhj ;h]r;hXBuilderr;r;}r;(hUhj;ubahhubaubhX. The exception is r;r;}r;(hX. The exception is hj;ubj)r;}r;(hUh}r;(h]h]h]h]h]j ]r;((jX PYTHONPATHr;Uindex-16r ;Utr!;(jX environment variable; PYTHONPATHj ;Utr";euhj;h]hj ubh)r#;}r$;(hUh}r%;(h]h]h]h]r&;j ;ah]uhj;h]hhubh)r';}r(;(hX:envvar:`PYTHONPATH`r);hj;hhhhh}r*;(UreftypeXenvvarhhj;U refdomainXstdr+;h]h]U refexplicith]h]h]hhuhMh]r,;h)r-;}r.;(hj);h}r/;(h]h]r0;(hj+;X std-envvarr1;eh]h]h]uhj';h]r2;hX PYTHONPATHr3;r4;}r5;(hUhj-;ubahhubaubhX<, which is merged with (actually prepended to) any existing r6;r7;}r8;(hX<, which is merged with (actually prepended to) any existing hj;ubj)r9;}r:;(hUh}r;;(h]h]h]h]h]j ]r<;((jX PYTHONPATHr=;Uindex-17r>;Utr?;(jX environment variable; PYTHONPATHj>;Utr@;euhj;h]hj ubh)rA;}rB;(hUh}rC;(h]h]h]h]rD;j>;ah]uhj;h]hhubh)rE;}rF;(hX:envvar:`PYTHONPATH`rG;hj;hhhhh}rH;(UreftypeXenvvarhhj=;U refdomainXstdrI;h]h]U refexplicith]h]h]hhuhMh]rJ;h)rK;}rL;(hjG;h}rM;(h]h]rN;(hjI;X std-envvarrO;eh]h]h]uhjE;h]rP;hX PYTHONPATHrQ;rR;}rS;(hUhjK;ubahhubaubhX- setting. The following example will prepend rT;rU;}rV;(hX- setting. The following example will prepend hj;ubh)rW;}rX;(hUh}rY;(h]h]h]h]rZ;Xfiler[;aUrolej[;h]uhj;h]r\;hX/home/buildbot/lib/pythonr];r^;}r_;(hX/home/buildbot/lib/pythonhjW;ubahhubhX to any existing r`;ra;}rb;(hX to any existing hj;ubj)rc;}rd;(hUh}re;(h]h]h]h]h]j ]rf;((jX PYTHONPATHrg;Uindex-18rh;Utri;(jX environment variable; PYTHONPATHjh;Utrj;euhj;h]hj ubh)rk;}rl;(hUh}rm;(h]h]h]h]rn;jh;ah]uhj;h]hhubh)ro;}rp;(hX:envvar:`PYTHONPATH`rq;hj;hhhhh}rr;(UreftypeXenvvarhhjg;U refdomainXstdrs;h]h]U refexplicith]h]h]hhuhMh]rt;h)ru;}rv;(hjq;h}rw;(h]h]rx;(hjs;X std-envvarry;eh]h]h]uhjo;h]rz;hX PYTHONPATHr{;r|;}r};(hUhju;ubahhubaubhX:r~;}r;(hX:hj;ubeubjS)r;}r;(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PYTHONPATH': "/home/buildbot/lib/python"}))hj:hjVh}r;(jXjYh]h]h]h]h]uhM h]r;hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PYTHONPATH': "/home/buildbot/lib/python"}))r;r;}r;(hUhj;ubaubh)r;}r;(hXTo avoid the need of concatenating path together in the master config file, if the value is a list, it will be joined together using the right platform dependant separator.r;hj:hhhhh}r;(h]h]h]h]h]uhMh]r;hXTo avoid the need of concatenating path together in the master config file, if the value is a list, it will be joined together using the right platform dependant separator.r;r;}r;(hj;hj;ubaubh)r;}r;(hX5Those variables support expansion so that if you just want to prepend :file:`/home/buildbot/bin` to the :envvar:`PATH` environment variable, you can do it by putting the value ``${PATH}`` at the end of the value like in the example below. Variables that don't exist on the slave will be replaced by ``""``. ::hj:hhhhh}r;(h]h]h]h]h]uhMh]r;(hXFThose variables support expansion so that if you just want to prepend r;r;}r;(hXFThose variables support expansion so that if you just want to prepend hj;ubh)r;}r;(hUh}r;(h]h]h]h]r;Xfiler;aUrolej;h]uhj;h]r;hX/home/buildbot/binr;r;}r;(hX/home/buildbot/binhj;ubahhubhX to the r;r;}r;(hX to the hj;ubj)r;}r;(hUh}r;(h]h]h]h]h]j ]r;((jXPATHr;Uindex-19r;Utr;(jXenvironment variable; PATHj;Utr;euhj;h]hj ubh)r;}r;(hUh}r;(h]h]h]h]r;j;ah]uhj;h]hhubh)r;}r;(hX:envvar:`PATH`r;hj;hhhhh}r;(UreftypeXenvvarhhj;U refdomainXstdr;h]h]U refexplicith]h]h]hhuhMh]r;h)r;}r;(hj;h}r;(h]h]r;(hj;X std-envvarr;eh]h]h]uhj;h]r;hXPATHr;r;}r;(hUhj;ubahhubaubhX: environment variable, you can do it by putting the value r;r;}r;(hX: environment variable, you can do it by putting the value hj;ubh)r;}r;(hX ``${PATH}``h}r;(h]h]h]h]h]uhj;h]r;hX${PATH}r;r;}r;(hUhj;ubahhubhXp at the end of the value like in the example below. Variables that don't exist on the slave will be replaced by r;r;}r;(hXp at the end of the value like in the example below. Variables that don't exist on the slave will be replaced by hj;ubh)r;}r;(hX``""``h}r;(h]h]h]h]h]uhj;h]r;hX""r;r;}r;(hUhj;ubahhubhX.r;}r;(hX.hj;ubeubjS)r;}r;(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))hj:hjVh}r;(jXjYh]h]h]h]h]uhMh]r;hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))r;r;}r;(hUhj;ubaubh)r;}r;(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as ``buildnumber`` must be substituted using :ref:`Interpolate`.hj:hhhhh}r;(h]h]h]h]h]uhM!h]r;(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as r;r;}r;(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as hj;ubh)r;}r;(hX``buildnumber``h}r;(h]h]h]h]h]uhj;h]r;hX buildnumberr;r;}r;(hUhj;ubahhubhX must be substituted using r;r;}r;(hX must be substituted using hj;ubh)r;}r;(hX:ref:`Interpolate`r;hj;hhhhh}r;(UreftypeXrefhhX interpolateU refdomainXstdr;h]h]U refexplicith]h]h]hhuhM!h]r;jW)r;}r;(hj;h}r;(h]h]r;(hj;Xstd-refr;eh]h]h]uhj;h]r;hX Interpolater;r;}r;(hUhj;ubahjaubaubhX.r;}r;(hX.hj;ubeubehjubeubj)r;}r;(hX``want_stdout`` if ``False``, stdout from the child process is discarded rather than being sent to the buildmaster for inclusion in the step's :class:`LogFile`. hj:hhhjh}r;(h]h]h]h]h]uhM'hhh]r;(j)r<}r<(hX``want_stdout``r<hj;hhhjh}r<(h]h]h]h]h]uhM'h]r<h)r<}r<(hj<h}r<(h]h]h]h]h]uhj<h]r<hX want_stdoutr <r <}r <(hUhj<ubahhubaubj)r <}r <(hUh}r<(h]h]h]h]h]uhj;h]r<h)r<}r<(hXif ``False``, stdout from the child process is discarded rather than being sent to the buildmaster for inclusion in the step's :class:`LogFile`.hj <hhhhh}r<(h]h]h]h]h]uhM&h]r<(hXif r<r<}r<(hXif hj<ubh)r<}r<(hX ``False``h}r<(h]h]h]h]h]uhj<h]r<hXFalser<r<}r<(hUhj<ubahhubhXs, stdout from the child process is discarded rather than being sent to the buildmaster for inclusion in the step's r<r<}r <(hXs, stdout from the child process is discarded rather than being sent to the buildmaster for inclusion in the step's hj<ubh)r!<}r"<(hX:class:`LogFile`r#<hj<hhhhh}r$<(UreftypeXclasshhXLogFileU refdomainXpyr%<h]h]U refexplicith]h]h]hhhNhj uhM&h]r&<h)r'<}r(<(hj#<h}r)<(h]h]r*<(hj%<Xpy-classr+<eh]h]h]uhj!<h]r,<hXLogFiler-<r.<}r/<(hUhj'<ubahhubaubhX.r0<}r1<(hX.hj<ubeubahjubeubj)r2<}r3<(hX``want_stderr`` like ``want_stdout`` but for :file:`stderr`. Note that commands run through a PTY do not have separate :file:`stdout`/:file:`stderr` streams: both are merged into :file:`stdout`. hj:hhhjh}r4<(h]h]h]h]h]uhM,hhh]r5<(j)r6<}r7<(hX``want_stderr``r8<hj2<hhhjh}r9<(h]h]h]h]h]uhM,h]r:<h)r;<}r<<(hj8<h}r=<(h]h]h]h]h]uhj6<h]r><hX want_stderrr?<r@<}rA<(hUhj;<ubahhubaubj)rB<}rC<(hUh}rD<(h]h]h]h]h]uhj2<h]rE<h)rF<}rG<(hXlike ``want_stdout`` but for :file:`stderr`. Note that commands run through a PTY do not have separate :file:`stdout`/:file:`stderr` streams: both are merged into :file:`stdout`.hjB<hhhhh}rH<(h]h]h]h]h]uhM*h]rI<(hXlike rJ<rK<}rL<(hXlike hjF<ubh)rM<}rN<(hX``want_stdout``h}rO<(h]h]h]h]h]uhjF<h]rP<hX want_stdoutrQ<rR<}rS<(hUhjM<ubahhubhX but for rT<rU<}rV<(hX but for hjF<ubh)rW<}rX<(hUh}rY<(h]h]h]h]rZ<Xfiler[<aUrolej[<h]uhjF<h]r\<hXstderrr]<r^<}r_<(hXstderrhjW<ubahhubhX<. Note that commands run through a PTY do not have separate r`<ra<}rb<(hX<. Note that commands run through a PTY do not have separate hjF<ubh)rc<}rd<(hUh}re<(h]h]h]h]rf<Xfilerg<aUrolejg<h]uhjF<h]rh<hXstdoutri<rj<}rk<(hXstdouthjc<ubahhubhX/rl<}rm<(hX/hjF<ubh)rn<}ro<(hUh}rp<(h]h]h]h]rq<Xfilerr<aUrolejr<h]uhjF<h]rs<hXstderrrt<ru<}rv<(hXstderrhjn<ubahhubhX streams: both are merged into rw<rx<}ry<(hX streams: both are merged into hjF<ubh)rz<}r{<(hUh}r|<(h]h]h]h]r}<Xfiler~<aUrolej~<h]uhjF<h]r<hXstdoutr<r<}r<(hXstdouthjz<ubahhubhX.r<}r<(hX.hjF<ubeubahjubeubj)r<}r<(hX``usePTY`` Should this command be run in a ``pty``? The default is to observe the configuration of the client (:ref:`Buildslave-Options`), but specifying ``True`` or ``False`` here will override the default. This option is not available on Windows. In general, you do not want to use a pseudo-terminal. This is is *only* useful for running commands that require a terminal - for example, testing a command-line application that will only accept passwords read from a terminal. Using a pseudo-terminal brings lots of compatibility problems, and prevents Buildbot from distinguishing the standard error (red) and standard output (black) streams. In previous versions, the advantage of using a pseudo-terminal was that ``grandchild`` processes were more likely to be cleaned up if the build was interrupted or times out. This occurred because using a pseudo-terminal incidentally puts the command into its own process group. As of Buildbot-0.8.4, all commands are placed in process groups, and thus grandchild processes will be cleaned up properly. hj:hhhjh}r<(h]h]h]h]h]uhMChhh]r<(j)r<}r<(hX ``usePTY``r<hj<hhhjh}r<(h]h]h]h]h]uhMCh]r<h)r<}r<(hj<h}r<(h]h]h]h]h]uhj<h]r<hXusePTYr<r<}r<(hUhj<ubahhubaubj)r<}r<(hUh}r<(h]h]h]h]h]uhj<h]r<(h)r<}r<(hXShould this command be run in a ``pty``? The default is to observe the configuration of the client (:ref:`Buildslave-Options`), but specifying ``True`` or ``False`` here will override the default. This option is not available on Windows.hj<hhhhh}r<(h]h]h]h]h]uhM/h]r<(hX Should this command be run in a r<r<}r<(hX Should this command be run in a hj<ubh)r<}r<(hX``pty``h}r<(h]h]h]h]h]uhj<h]r<hXptyr<r<}r<(hUhj<ubahhubhX>? The default is to observe the configuration of the client (r<r<}r<(hX>? The default is to observe the configuration of the client (hj<ubh)r<}r<(hX:ref:`Buildslave-Options`r<hj<hhhhh}r<(UreftypeXrefhhXbuildslave-optionsU refdomainXstdr<h]h]U refexplicith]h]h]hhuhM/h]r<jW)r<}r<(hj<h}r<(h]h]r<(hj<Xstd-refr<eh]h]h]uhj<h]r<hXBuildslave-Optionsr<r<}r<(hUhj<ubahjaubaubhX), but specifying r<r<}r<(hX), but specifying hj<ubh)r<}r<(hX``True``h}r<(h]h]h]h]h]uhj<h]r<hXTruer<r<}r<(hUhj<ubahhubhX or r<r<}r<(hX or hj<ubh)r<}r<(hX ``False``h}r<(h]h]h]h]h]uhj<h]r<hXFalser<r<}r<(hUhj<ubahhubhXI here will override the default. This option is not available on Windows.r<r<}r<(hXI here will override the default. This option is not available on Windows.hj<ubeubh)r<}r<(hXIn general, you do not want to use a pseudo-terminal. This is is *only* useful for running commands that require a terminal - for example, testing a command-line application that will only accept passwords read from a terminal. Using a pseudo-terminal brings lots of compatibility problems, and prevents Buildbot from distinguishing the standard error (red) and standard output (black) streams.hj<hhhhh}r<(h]h]h]h]h]uhM4h]r<(hXBIn general, you do not want to use a pseudo-terminal. This is is r<r<}r<(hXBIn general, you do not want to use a pseudo-terminal. This is is hj<ubjW)r<}r<(hX*only*h}r<(h]h]h]h]h]uhj<h]r<hXonlyr<r<}r<(hUhj<ubahjaubhXC useful for running commands that require a terminal - for example, testing a command-line application that will only accept passwords read from a terminal. Using a pseudo-terminal brings lots of compatibility problems, and prevents Buildbot from distinguishing the standard error (red) and standard output (black) streams.r<r<}r<(hXC useful for running commands that require a terminal - for example, testing a command-line application that will only accept passwords read from a terminal. Using a pseudo-terminal brings lots of compatibility problems, and prevents Buildbot from distinguishing the standard error (red) and standard output (black) streams.hj<ubeubh)r<}r<(hXIn previous versions, the advantage of using a pseudo-terminal was that ``grandchild`` processes were more likely to be cleaned up if the build was interrupted or times out. This occurred because using a pseudo-terminal incidentally puts the command into its own process group.hj<hhhhh}r<(h]h]h]h]h]uhM<h]r<(hXHIn previous versions, the advantage of using a pseudo-terminal was that r<r<}r<(hXHIn previous versions, the advantage of using a pseudo-terminal was that hj<ubh)r<}r<(hX``grandchild``h}r<(h]h]h]h]h]uhj<h]r<hX grandchildr<r<}r<(hUhj<ubahhubhX processes were more likely to be cleaned up if the build was interrupted or times out. This occurred because using a pseudo-terminal incidentally puts the command into its own process group.r<r<}r<(hX processes were more likely to be cleaned up if the build was interrupted or times out. This occurred because using a pseudo-terminal incidentally puts the command into its own process group.hj<ubeubh)r<}r<(hX{As of Buildbot-0.8.4, all commands are placed in process groups, and thus grandchild processes will be cleaned up properly.r<hj<hhhhh}r<(h]h]h]h]h]uhMBh]r<hX{As of Buildbot-0.8.4, all commands are placed in process groups, and thus grandchild processes will be cleaned up properly.r<r<}r<(hj<hj<ubaubehjubeubj)r<}r<(hX``logfiles`` Sometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's :command:`trial` command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named :file:`_trial_temp/test.log`. It is often useful to watch these files as the command runs, rather than using :command:`/bin/cat` to dump their contents afterwards. The ``logfiles=`` argument allows you to collect data from these secondary logfiles in near-real-time, as the step is running. It accepts a dictionary which maps from a local Log name (which is how the log data is presented in the build results) to either a remote filename (interpreted relative to the build's working directory), or a dictionary of options. Each named file will be polled on a regular basis (every couple of seconds) as the build runs, and any new text will be sent over to the buildmaster. If you provide a dictionary of options instead of a string, you must specify the ``filename`` key. You can optionally provide a ``follow`` key which is a boolean controlling whether a logfile is followed or concatenated in its entirety. Following is appropriate for logfiles to which the build step will append, where the pre-existing contents are not interesting. The default value for ``follow`` is ``False``, which gives the same behavior as just providing a string filename. :: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": "_trial_temp/test.log"})) The above example will add a log named 'triallog' on the master, based on :file:`_trial_temp/test.log` on the slave. :: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": {"filename": "_trial_temp/test.log", "follow": True,}})) hj:hhhjh}r<(h]h]h]h]h]uhMlhhh]r<(j)r<}r<(hX ``logfiles``r=hj<hhhjh}r=(h]h]h]h]h]uhMlh]r=h)r=}r=(hj=h}r=(h]h]h]h]h]uhj<h]r=hXlogfilesr=r=}r =(hUhj=ubahhubaubj)r =}r =(hUh}r =(h]h]h]h]h]uhj<h]r =(h)r=}r=(hXSometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's :command:`trial` command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named :file:`_trial_temp/test.log`. It is often useful to watch these files as the command runs, rather than using :command:`/bin/cat` to dump their contents afterwards.hj =hhhhh}r=(h]h]h]h]h]uhMFh]r=(hXSometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's r=r=}r=(hXSometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's hj=ubjL)r=}r=(hX:command:`trial`h}r=(h]h]r=jQah]h]h]uhj=h]r=hXtrialr=r=}r=(hUhj=ubahjVubhXr command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named r=r=}r=(hXr command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named hj=ubh)r =}r!=(hUh}r"=(h]h]h]h]r#=Xfiler$=aUrolej$=h]uhj=h]r%=hX_trial_temp/test.logr&=r'=}r(=(hX_trial_temp/test.loghj =ubahhubhXQ. It is often useful to watch these files as the command runs, rather than using r)=r*=}r+=(hXQ. It is often useful to watch these files as the command runs, rather than using hj=ubjL)r,=}r-=(hX:command:`/bin/cat`h}r.=(h]h]r/=jQah]h]h]uhj=h]r0=hX/bin/catr1=r2=}r3=(hUhj,=ubahjVubhX# to dump their contents afterwards.r4=r5=}r6=(hX# to dump their contents afterwards.hj=ubeubh)r7=}r8=(hXThe ``logfiles=`` argument allows you to collect data from these secondary logfiles in near-real-time, as the step is running. It accepts a dictionary which maps from a local Log name (which is how the log data is presented in the build results) to either a remote filename (interpreted relative to the build's working directory), or a dictionary of options. Each named file will be polled on a regular basis (every couple of seconds) as the build runs, and any new text will be sent over to the buildmaster.hj =hhhhh}r9=(h]h]h]h]h]uhMNh]r:=(hXThe r;=r<=}r==(hXThe hj7=ubh)r>=}r?=(hX ``logfiles=``h}r@=(h]h]h]h]h]uhj7=h]rA=hX logfiles=rB=rC=}rD=(hUhj>=ubahhubhX argument allows you to collect data from these secondary logfiles in near-real-time, as the step is running. It accepts a dictionary which maps from a local Log name (which is how the log data is presented in the build results) to either a remote filename (interpreted relative to the build's working directory), or a dictionary of options. Each named file will be polled on a regular basis (every couple of seconds) as the build runs, and any new text will be sent over to the buildmaster.rE=rF=}rG=(hX argument allows you to collect data from these secondary logfiles in near-real-time, as the step is running. It accepts a dictionary which maps from a local Log name (which is how the log data is presented in the build results) to either a remote filename (interpreted relative to the build's working directory), or a dictionary of options. Each named file will be polled on a regular basis (every couple of seconds) as the build runs, and any new text will be sent over to the buildmaster.hj7=ubeubh)rH=}rI=(hXIf you provide a dictionary of options instead of a string, you must specify the ``filename`` key. You can optionally provide a ``follow`` key which is a boolean controlling whether a logfile is followed or concatenated in its entirety. Following is appropriate for logfiles to which the build step will append, where the pre-existing contents are not interesting. The default value for ``follow`` is ``False``, which gives the same behavior as just providing a string filename. ::hj =hhhhh}rJ=(h]h]h]h]h]uhMWh]rK=(hXQIf you provide a dictionary of options instead of a string, you must specify the rL=rM=}rN=(hXQIf you provide a dictionary of options instead of a string, you must specify the hjH=ubh)rO=}rP=(hX ``filename``h}rQ=(h]h]h]h]h]uhjH=h]rR=hXfilenamerS=rT=}rU=(hUhjO=ubahhubhX# key. You can optionally provide a rV=rW=}rX=(hX# key. You can optionally provide a hjH=ubh)rY=}rZ=(hX ``follow``h}r[=(h]h]h]h]h]uhjH=h]r\=hXfollowr]=r^=}r_=(hUhjY=ubahhubhX key which is a boolean controlling whether a logfile is followed or concatenated in its entirety. Following is appropriate for logfiles to which the build step will append, where the pre-existing contents are not interesting. The default value for r`=ra=}rb=(hX key which is a boolean controlling whether a logfile is followed or concatenated in its entirety. Following is appropriate for logfiles to which the build step will append, where the pre-existing contents are not interesting. The default value for hjH=ubh)rc=}rd=(hX ``follow``h}re=(h]h]h]h]h]uhjH=h]rf=hXfollowrg=rh=}ri=(hUhjc=ubahhubhX is rj=rk=}rl=(hX is hjH=ubh)rm=}rn=(hX ``False``h}ro=(h]h]h]h]h]uhjH=h]rp=hXFalserq=rr=}rs=(hUhjm=ubahhubhXD, which gives the same behavior as just providing a string filename.rt=ru=}rv=(hXD, which gives the same behavior as just providing a string filename.hjH=ubeubjS)rw=}rx=(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": "_trial_temp/test.log"}))hj =hjVh}ry=(jXjYh]h]h]h]h]uhM_h]rz=hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": "_trial_temp/test.log"}))r{=r|=}r}=(hUhjw=ubaubh)r~=}r=(hXwThe above example will add a log named 'triallog' on the master, based on :file:`_trial_temp/test.log` on the slave. ::hj =hhhhh}r=(h]h]h]h]h]uhMdh]r=(hXJThe above example will add a log named 'triallog' on the master, based on r=r=}r=(hXJThe above example will add a log named 'triallog' on the master, based on hj~=ubh)r=}r=(hUh}r=(h]h]h]h]r=Xfiler=aUrolej=h]uhj~=h]r=hX_trial_temp/test.logr=r=}r=(hX_trial_temp/test.loghj=ubahhubhX on the slave.r=r=}r=(hX on the slave.hj~=ubeubjS)r=}r=(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": {"filename": "_trial_temp/test.log", "follow": True,}}))hj =hjVh}r=(jXjYh]h]h]h]h]uhMgh]r=hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": {"filename": "_trial_temp/test.log", "follow": True,}}))r=r=}r=(hUhj=ubaubehjubeubj)r=}r=(hX``lazylogfiles`` If set to ``True``, logfiles will be tracked lazily, meaning that they will only be added when and if something is written to them. This can be used to suppress the display of empty or missing log files. The default is ``False``. hj:hhhjh}r=(h]h]h]h]h]uhMrhhh]r=(j)r=}r=(hX``lazylogfiles``r=hj=hhhjh}r=(h]h]h]h]h]uhMrh]r=h)r=}r=(hj=h}r=(h]h]h]h]h]uhj=h]r=hX lazylogfilesr=r=}r=(hUhj=ubahhubaubj)r=}r=(hUh}r=(h]h]h]h]h]uhj=h]r=h)r=}r=(hXIf set to ``True``, logfiles will be tracked lazily, meaning that they will only be added when and if something is written to them. This can be used to suppress the display of empty or missing log files. The default is ``False``.hj=hhhhh}r=(h]h]h]h]h]uhMoh]r=(hX If set to r=r=}r=(hX If set to hj=ubh)r=}r=(hX``True``h}r=(h]h]h]h]h]uhj=h]r=hXTruer=r=}r=(hUhj=ubahhubhX, logfiles will be tracked lazily, meaning that they will only be added when and if something is written to them. This can be used to suppress the display of empty or missing log files. The default is r=r=}r=(hX, logfiles will be tracked lazily, meaning that they will only be added when and if something is written to them. This can be used to suppress the display of empty or missing log files. The default is hj=ubh)r=}r=(hX ``False``h}r=(h]h]h]h]h]uhj=h]r=hXFalser=r=}r=(hUhj=ubahhubhX.r=}r=(hX.hj=ubeubahjubeubj)r=}r=(hX``timeout`` if the command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 1200 seconds. Pass ``None`` to disable. hj:hhhjh}r=(h]h]h]h]h]uhMxhhh]r=(j)r=}r=(hX ``timeout``r=hj=hhhjh}r=(h]h]h]h]h]uhMxh]r=h)r=}r=(hj=h}r=(h]h]h]h]h]uhj=h]r=hXtimeoutr=r=}r=(hUhj=ubahhubaubj)r=}r=(hUh}r=(h]h]h]h]h]uhj=h]r=h)r=}r=(hXif the command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 1200 seconds. Pass ``None`` to disable.hj=hhhhh}r=(h]h]h]h]h]uhMuh]r=(hXif the command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 1200 seconds. Pass r=r=}r=(hXif the command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 1200 seconds. Pass hj=ubh)r=}r=(hX``None``h}r=(h]h]h]h]h]uhj=h]r=hXNoner=r=}r=(hUhj=ubahhubhX to disable.r=r=}r=(hX to disable.hj=ubeubahjubeubj)r=}r=(hXp``maxTime`` if the command takes longer than this many seconds, it will be killed. This is disabled by default. hj:hhhjh}r=(h]h]h]h]h]uhM|hhh]r=(j)r=}r=(hX ``maxTime``r=hj=hhhjh}r=(h]h]h]h]h]uhM|h]r=h)r=}r=(hj=h}r=(h]h]h]h]h]uhj=h]r=hXmaxTimer=r=}r=(hUhj=ubahhubaubj)r=}r=(hUh}r=(h]h]h]h]h]uhj=h]r=h)r=}r>(hXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.r>hj=hhhhh}r>(h]h]h]h]h]uhM{h]r>hXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.r>r>}r>(hj>hj=ubaubahjubeubj)r>}r>(hX``logEnviron`` If this option is ``True`` (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set ``logEnviron=False``. hj:hhhjh}r >(h]h]h]h]h]uhMhhh]r >(j)r >}r >(hX``logEnviron``r >hj>hhhjh}r>(h]h]h]h]h]uhMh]r>h)r>}r>(hj >h}r>(h]h]h]h]h]uhj >h]r>hX logEnvironr>r>}r>(hUhj>ubahhubaubj)r>}r>(hUh}r>(h]h]h]h]h]uhj>h]r>h)r>}r>(hXIf this option is ``True`` (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set ``logEnviron=False``.hj>hhhhh}r>(h]h]h]h]h]uhMh]r>(hXIf this option is r>r >}r!>(hXIf this option is hj>ubh)r">}r#>(hX``True``h}r$>(h]h]h]h]h]uhj>h]r%>hXTruer&>r'>}r(>(hUhj">ubahhubhX (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set r)>r*>}r+>(hX (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set hj>ubh)r,>}r->(hX``logEnviron=False``h}r.>(h]h]h]h]h]uhj>h]r/>hXlogEnviron=Falser0>r1>}r2>(hUhj,>ubahhubhX.r3>}r4>(hX.hj>ubeubahjubeubj)r5>}r6>(hX1``interruptSignal`` If the command should be interrupted (either by buildmaster or timeout etc.), what signal should be sent to the process, specified by name. By default this is "KILL" (9). Specify "TERM" (15) to give the process a chance to cleanup. This functionality requires a 0.8.6 slave or newer. hj:hhhjh}r7>(h]h]h]h]h]uhMhhh]r8>(j)r9>}r:>(hX``interruptSignal``r;>hj5>hhhjh}r<>(h]h]h]h]h]uhMh]r=>h)r>>}r?>(hj;>h}r@>(h]h]h]h]h]uhj9>h]rA>hXinterruptSignalrB>rC>}rD>(hUhj>>ubahhubaubj)rE>}rF>(hUh}rG>(h]h]h]h]h]uhj5>h]rH>h)rI>}rJ>(hXIf the command should be interrupted (either by buildmaster or timeout etc.), what signal should be sent to the process, specified by name. By default this is "KILL" (9). Specify "TERM" (15) to give the process a chance to cleanup. This functionality requires a 0.8.6 slave or newer.rK>hjE>hhhhh}rL>(h]h]h]h]h]uhMh]rM>hXIf the command should be interrupted (either by buildmaster or timeout etc.), what signal should be sent to the process, specified by name. By default this is "KILL" (9). Specify "TERM" (15) to give the process a chance to cleanup. This functionality requires a 0.8.6 slave or newer.rN>rO>}rP>(hjK>hjI>ubaubahjubeubeubh)rQ>}rR>(hX``sigtermTime``rS>hj_9hhhhh}rT>(h]h]h]h]h]uhMhhh]rU>h)rV>}rW>(hjS>h}rX>(h]h]h]h]h]uhjQ>h]rY>hX sigtermTimerZ>r[>}r\>(hUhjV>ubahhubaubjx)r]>}r^>(hUhj_9hhhj{h}r_>(h]h]h]h]h]uhNhhh]r`>h)ra>}rb>(hXIf set, when interrupting, try to kill the command with SIGTERM and wait for sigtermTime seconds before firing ``interuptSignal``. If None, ``interruptSignal`` will be fired immediately on interrupt.hj]>hhhhh}rc>(h]h]h]h]h]uhMh]rd>(hXoIf set, when interrupting, try to kill the command with SIGTERM and wait for sigtermTime seconds before firing re>rf>}rg>(hXoIf set, when interrupting, try to kill the command with SIGTERM and wait for sigtermTime seconds before firing hja>ubh)rh>}ri>(hX``interuptSignal``h}rj>(h]h]h]h]h]uhja>h]rk>hXinteruptSignalrl>rm>}rn>(hUhjh>ubahhubhX . If None, ro>rp>}rq>(hX . If None, hja>ubh)rr>}rs>(hX``interruptSignal``h}rt>(h]h]h]h]h]uhja>h]ru>hXinterruptSignalrv>rw>}rx>(hUhjr>ubahhubhX( will be fired immediately on interrupt.ry>rz>}r{>(hX( will be fired immediately on interrupt.hja>ubeubaubj)r|>}r}>(hUhj_9hhhjh}r~>(h]h]h]h]h]uhNhhh]r>(j)r>}r>(hX``initialStdin`` If the command expects input on stdin, that can be supplied a a string with this parameter. This value should not be excessively large, as it is handled as a single string throughout Buildbot -- for example, do not pass the contents of a tarball with this parameter. hj|>hhhjh}r>(h]h]h]h]h]uhMh]r>(j)r>}r>(hX``initialStdin``r>hj>hhhjh}r>(h]h]h]h]h]uhMh]r>h)r>}r>(hj>h}r>(h]h]h]h]h]uhj>h]r>hX initialStdinr>r>}r>(hUhj>ubahhubaubj)r>}r>(hUh}r>(h]h]h]h]h]uhj>h]r>h)r>}r>(hX If the command expects input on stdin, that can be supplied a a string with this parameter. This value should not be excessively large, as it is handled as a single string throughout Buildbot -- for example, do not pass the contents of a tarball with this parameter.r>hj>hhhhh}r>(h]h]h]h]h]uhMh]r>hX If the command expects input on stdin, that can be supplied a a string with this parameter. This value should not be excessively large, as it is handled as a single string throughout Buildbot -- for example, do not pass the contents of a tarball with this parameter.r>r>}r>(hj>hj>ubaubahjubeubj)r>}r>(hX0``decodeRC`` This is a dictionary that decodes exit codes into results value. e.g: ``{0:SUCCESS,1:FAILURE,2:WARNINGS}``, will treat the exit code ``2`` as WARNINGS. The default is to treat just 0 as successful. (``{0:SUCCESS}``) any exit code not present in the dictionary will be treated as ``FAILURE`` hj|>hhhjh}r>(h]h]h]h]h]uhMhhh]r>(j)r>}r>(hX ``decodeRC``r>hj>hhhjh}r>(h]h]h]h]h]uhMh]r>h)r>}r>(hj>h}r>(h]h]h]h]h]uhj>h]r>hXdecodeRCr>r>}r>(hUhj>ubahhubaubj)r>}r>(hUh}r>(h]h]h]h]h]uhj>h]r>h)r>}r>(hX"This is a dictionary that decodes exit codes into results value. e.g: ``{0:SUCCESS,1:FAILURE,2:WARNINGS}``, will treat the exit code ``2`` as WARNINGS. The default is to treat just 0 as successful. (``{0:SUCCESS}``) any exit code not present in the dictionary will be treated as ``FAILURE``hj>hhhhh}r>(h]h]h]h]h]uhMh]r>(hXFThis is a dictionary that decodes exit codes into results value. e.g: r>r>}r>(hXFThis is a dictionary that decodes exit codes into results value. e.g: hj>ubh)r>}r>(hX$``{0:SUCCESS,1:FAILURE,2:WARNINGS}``h}r>(h]h]h]h]h]uhj>h]r>hX {0:SUCCESS,1:FAILURE,2:WARNINGS}r>r>}r>(hUhj>ubahhubhX, will treat the exit code r>r>}r>(hX, will treat the exit code hj>ubh)r>}r>(hX``2``h}r>(h]h]h]h]h]uhj>h]r>hX2r>}r>(hUhj>ubahhubhX= as WARNINGS. The default is to treat just 0 as successful. (r>r>}r>(hX= as WARNINGS. The default is to treat just 0 as successful. (hj>ubh)r>}r>(hX``{0:SUCCESS}``h}r>(h]h]h]h]h]uhj>h]r>hX {0:SUCCESS}r>r>}r>(hUhj>ubahhubhXA) any exit code not present in the dictionary will be treated as r>r>}r>(hXA) any exit code not present in the dictionary will be treated as hj>ubh)r>}r>(hX ``FAILURE``h}r>(h]h]h]h]h]uhj>h]r>hXFAILUREr>r>}r>(hUhj>ubahhubeubahjubeubeubj)r>}r>(hUhj_9hhhj h}r>(h]h]h]h]h]Uentries]r>((UsingleXBuild Steps; ConfigureXstep-Configurer>j>tr>(UsingleXConfigure Build Stepj>j>tr>euhMhhh]ubh)r>}r>(hUhj_9hhhhh}r>(h]h]h]h]h]hj>uhMhhh]ubeubh)r>}r>(hUhj9hhh}hhh}r>(h]h]h]h]r>(jNj>eh]r>hZauhMhhh}r>j>j>sh]r>(h)r>}r>(hjShj>hhhhh}r>(h]h]h]h]h]hjMuhMhhh]r>hX Configurer>r>}r>(hjShj>ubaubj)r>}r>(hUhj>hNhj h}r>(h]h]h]h]h]Uentries]r>(jX?buildbot.steps.shell.Configure (class in buildbot.steps.source)hUtr>auhNhhh]ubj )r>}r>(hUhj>hNhj h}r>(j j Xpyh]h]h]h]h]j Xclassr>j j>uhNhhh]r>(j )r>}r>(hXbuildbot.steps.shell.Configurehj>hhhj h}r>(h]r?haj j h]h]h]h]r?haj Xbuildbot.steps.shell.Configurej Xbuildbot.steps.shellj uhMhhh]r?(j )r?}r?(hXclass hj>hhhj h}r?(h]h]h]h]h]uhMhhh]r?hXclass r?r?}r ?(hUhj?ubaubj )r ?}r ?(hXbuildbot.steps.shell.hj>hhhj h}r ?(h]h]h]h]h]uhMhhh]r ?hXbuildbot.steps.shell.r?r?}r?(hUhj ?ubaubj )r?}r?(hX Configurehj>hhhj h}r?(h]h]h]h]h]uhMhhh]r?hX Configurer?r?}r?(hUhj?ubaubeubj )r?}r?(hUhj>hhhj h}r?(h]h]h]h]h]uhMhhh]ubeubh)r?}r?(hXOThis is intended to handle the :command:`./configure` step from autoconf-style projects, or the ``perl Makefile.PL`` step from perl :file:`MakeMaker.pm`-style modules. The default command is :command:`./configure` but you can change this by providing a ``command=`` parameter. The arguments are identical to :bb:step:`ShellCommand`. ::hj>hhhhh}r?(h]h]h]h]h]uhMhhh]r?(hXThis is intended to handle the r?r ?}r!?(hXThis is intended to handle the hj?ubjL)r"?}r#?(hX:command:`./configure`h}r$?(h]h]r%?jQah]h]h]uhj?h]r&?hX ./configurer'?r(?}r)?(hUhj"?ubahjVubhX+ step from autoconf-style projects, or the r*?r+?}r,?(hX+ step from autoconf-style projects, or the hj?ubh)r-?}r.?(hX``perl Makefile.PL``h}r/?(h]h]h]h]h]uhj?h]r0?hXperl Makefile.PLr1?r2?}r3?(hUhj-?ubahhubhX step from perl r4?r5?}r6?(hX step from perl hj?ubh)r7?}r8?(hUh}r9?(h]h]h]h]r:?Xfiler;?aUrolej;?h]uhj?h]r?}r??(hX MakeMaker.pmhj7?ubahhubhX'-style modules. The default command is r@?rA?}rB?(hX'-style modules. The default command is hj?ubjL)rC?}rD?(hX:command:`./configure`h}rE?(h]h]rF?jQah]h]h]uhj?h]rG?hX ./configurerH?rI?}rJ?(hUhjC?ubahjVubhX( but you can change this by providing a rK?rL?}rM?(hX( but you can change this by providing a hj?ubh)rN?}rO?(hX ``command=``h}rP?(h]h]h]h]h]uhj?h]rQ?hXcommand=rR?rS?}rT?(hUhjN?ubahhubhX+ parameter. The arguments are identical to rU?rV?}rW?(hX+ parameter. The arguments are identical to hj?ubh)rX?}rY?(hX:bb:step:`ShellCommand`rZ?hj?hhhhh}r[?(UreftypeXstephhX ShellCommandU refdomainXbbr\?h]h]U refexplicith]h]h]hhuhMh]r]?h)r^?}r_?(hjZ?h}r`?(h]h]ra?(hj\?Xbb-steprb?eh]h]h]uhjX?h]rc?hX ShellCommandrd?re?}rf?(hUhj^?ubahhubaubhX.rg?}rh?(hX.hj?ubeubjS)ri?}rj?(hXAfrom buildbot.steps.shell import Configure f.addStep(Configure())hj>hhhjVh}rk?(jXjYh]h]h]h]h]uhMhhh]rl?hXAfrom buildbot.steps.shell import Configure f.addStep(Configure())rm?rn?}ro?(hUhji?ubaubj)rp?}rq?(hUhj>hhhj h}rr?(h]h]h]h]h]Uentries]rs?((UsingleXBuild Steps; CompileX step-Compilert?jt?tru?(UsingleXCompile Build Stepjt?jt?trv?euhMhhh]ubh)rw?}rx?(hUhj>hhhhh}ry?(h]h]h]h]h]hjt?uhMhhh]ubeubh)rz?}r{?(hUhj9hhh}hhh}r|?(h]h]h]h]r}?(jajt?eh]r~?hiauhMhhh}r?jt?jw?sh]r?(h)r?}r?(hjfhjz?hhhhh}r?(h]h]h]h]h]hj`uhMhhh]r?hXCompiler?r?}r?(hjfhj?ubaubj)r?}r?(hUhjz?hhhj h}r?(h]h]h]h]h]j ]r?(jXProperties; warnings-countUindex-20r?Utr?ajuhMhhh]ubh)r?}r?(hUhjz?hhhhh}r?(h]h]h]h]h]hj?uhMhhh]ubh)r?}r?(hX This is meant to handle compiling or building a project written in C. The default command is ``make all``. When the compile is finished, the log file is scanned for GCC warning messages, a summary log is created with any problems that were seen, and the step is marked as WARNINGS if any were discovered. Through the :class:`WarningCountingShellCommand` superclass, the number of warnings is stored in a Build Property named `warnings-count`, which is accumulated over all :bb:step:`Compile` steps (so if two warnings are found in one step, and three are found in another step, the overall build will have a `warnings-count` property of 5). Each step can be optionally given a maximum number of warnings via the maxWarnCount parameter. If this limit is exceeded, the step will be marked as a failure.hjz?hhh}hhh}r?(h]h]h]h]r?j?ah]uhMhhh}r?j?j?sh]r?(hX]This is meant to handle compiling or building a project written in C. The default command is r?r?}r?(hX]This is meant to handle compiling or building a project written in C. The default command is hj?ubh)r?}r?(hX ``make all``h}r?(h]h]h]h]h]uhj?h]r?hXmake allr?r?}r?(hUhj?ubahhubhX. When the compile is finished, the log file is scanned for GCC warning messages, a summary log is created with any problems that were seen, and the step is marked as WARNINGS if any were discovered. Through the r?r?}r?(hX. When the compile is finished, the log file is scanned for GCC warning messages, a summary log is created with any problems that were seen, and the step is marked as WARNINGS if any were discovered. Through the hj?ubh)r?}r?(hX$:class:`WarningCountingShellCommand`r?hj?hhhhh}r?(UreftypeXclasshhXWarningCountingShellCommandU refdomainXpyr?h]h]U refexplicith]h]h]hhhNhj uhMh]r?h)r?}r?(hj?h}r?(h]h]r?(hj?Xpy-classr?eh]h]h]uhj?h]r?hXWarningCountingShellCommandr?r?}r?(hUhj?ubahhubaubhXH superclass, the number of warnings is stored in a Build Property named r?r?}r?(hXH superclass, the number of warnings is stored in a Build Property named hj?ubjE)r?}r?(hX`warnings-count`h}r?(h]h]h]h]h]uhj?h]r?hXwarnings-countr?r?}r?(hUhj?ubahjMubhX , which is accumulated over all r?r?}r?(hX , which is accumulated over all hj?ubh)r?}r?(hX:bb:step:`Compile`r?hj?hhhhh}r?(UreftypeXstephhXCompileU refdomainXbbr?h]h]U refexplicith]h]h]hhuhMh]r?h)r?}r?(hj?h}r?(h]h]r?(hj?Xbb-stepr?eh]h]h]uhj?h]r?hXCompiler?r?}r?(hUhj?ubahhubaubhXu steps (so if two warnings are found in one step, and three are found in another step, the overall build will have a r?r?}r?(hXu steps (so if two warnings are found in one step, and three are found in another step, the overall build will have a hj?ubjE)r?}r?(hX`warnings-count`h}r?(h]h]h]h]h]uhj?h]r?hXwarnings-countr?r?}r?(hUhj?ubahjMubhX property of 5). Each step can be optionally given a maximum number of warnings via the maxWarnCount parameter. If this limit is exceeded, the step will be marked as a failure.r?r?}r?(hX property of 5). Each step can be optionally given a maximum number of warnings via the maxWarnCount parameter. If this limit is exceeded, the step will be marked as a failure.hj?ubeubh)r?}r?(hX The default regular expression used to detect a warning is ``'.*warning[: ].*'`` , which is fairly liberal and may cause false-positives. To use a different regexp, provide a ``warningPattern=`` argument, or use a subclass which sets the ``warningPattern`` attribute::hjz?hhhhh}r?(h]h]h]h]h]uhMhhh]r?(hX;The default regular expression used to detect a warning is r?r?}r?(hX;The default regular expression used to detect a warning is hj?ubh)r?}r?(hX``'.*warning[: ].*'``h}r?(h]h]h]h]h]uhj?h]r?hX'.*warning[: ].*'r?r?}r?(hUhj?ubahhubhX_ , which is fairly liberal and may cause false-positives. To use a different regexp, provide a r?r?}r?(hX_ , which is fairly liberal and may cause false-positives. To use a different regexp, provide a hj?ubh)r?}r?(hX``warningPattern=``h}r?(h]h]h]h]h]uhj?h]r?hXwarningPattern=r?r?}r?(hUhj?ubahhubhX, argument, or use a subclass which sets the r?r?}r?(hX, argument, or use a subclass which sets the hj?ubh)r?}r?(hX``warningPattern``h}r?(h]h]h]h]h]uhj?h]r?hXwarningPatternr?r?}r?(hUhj?ubahhubhX attribute:r?r?}r@(hX attribute:hj?ubeubjS)r@}r@(hXfrom buildbot.steps.shell import Compile f.addStep(Compile(command=["make", "test"], warningPattern="^Warning: "))hjz?hhhjVh}r@(jXjYh]h]h]h]h]uhMhhh]r@hXfrom buildbot.steps.shell import Compile f.addStep(Compile(command=["make", "test"], warningPattern="^Warning: "))r@r@}r@(hUhj@ubaubh)r@}r @(hXThe ``warningPattern=`` can also be a pre-compiled Python regexp object: this makes it possible to add flags like ``re.I`` (to use case-insensitive matching).hjz?hhhhh}r @(h]h]h]h]h]uhMhhh]r @(hXThe r @r @}r@(hXThe hj@ubh)r@}r@(hX``warningPattern=``h}r@(h]h]h]h]h]uhj@h]r@hXwarningPattern=r@r@}r@(hUhj@ubahhubhX[ can also be a pre-compiled Python regexp object: this makes it possible to add flags like r@r@}r@(hX[ can also be a pre-compiled Python regexp object: this makes it possible to add flags like hj@ubh)r@}r@(hX``re.I``h}r@(h]h]h]h]h]uhj@h]r@hXre.Ir@r@}r@(hUhj@ubahhubhX$ (to use case-insensitive matching).r @r!@}r"@(hX$ (to use case-insensitive matching).hj@ubeubh)r#@}r$@(hXRNote that the compiled ``warningPattern`` will have its :meth:`match` method called, which is subtly different from a :meth:`search`. Your regular expression must match the from the beginning of the line. This means that to look for the word "warning" in the middle of a line, you will need to prepend ``'.*'`` to your regular expression.hjz?hhhhh}r%@(h]h]h]h]h]uhMhhh]r&@(hXNote that the compiled r'@r(@}r)@(hXNote that the compiled hj#@ubh)r*@}r+@(hX``warningPattern``h}r,@(h]h]h]h]h]uhj#@h]r-@hXwarningPatternr.@r/@}r0@(hUhj*@ubahhubhX will have its r1@r2@}r3@(hX will have its hj#@ubh)r4@}r5@(hX :meth:`match`r6@hj#@hhhhh}r7@(UreftypeXmethhhXmatchU refdomainXpyr8@h]h]U refexplicith]h]h]hhhNhj uhMh]r9@h)r:@}r;@(hj6@h}r<@(h]h]r=@(hj8@Xpy-methr>@eh]h]h]uhj4@h]r?@hXmatchr@@rA@}rB@(hUhj:@ubahhubaubhX1 method called, which is subtly different from a rC@rD@}rE@(hX1 method called, which is subtly different from a hj#@ubh)rF@}rG@(hX:meth:`search`rH@hj#@hhhhh}rI@(UreftypeXmethhhXsearchU refdomainXpyrJ@h]h]U refexplicith]h]h]hhhNhj uhMh]rK@h)rL@}rM@(hjH@h}rN@(h]h]rO@(hjJ@Xpy-methrP@eh]h]h]uhjF@h]rQ@hXsearchrR@rS@}rT@(hUhjL@ubahhubaubhX. Your regular expression must match the from the beginning of the line. This means that to look for the word "warning" in the middle of a line, you will need to prepend rU@rV@}rW@(hX. Your regular expression must match the from the beginning of the line. This means that to look for the word "warning" in the middle of a line, you will need to prepend hj#@ubh)rX@}rY@(hX``'.*'``h}rZ@(h]h]h]h]h]uhj#@h]r[@hX'.*'r\@r]@}r^@(hUhjX@ubahhubhX to your regular expression.r_@r`@}ra@(hX to your regular expression.hj#@ubeubh)rb@}rc@(hX)The ``suppressionFile=`` argument can be specified as the (relative) path of a file inside the workdir defining warnings to be suppressed from the warning counting and log file. The file will be uploaded to the master from the slave before compiling, and any warning matched by a line in the suppression file will be ignored. This is useful to accept certain warnings (eg. in some special module of the source tree or in cases where the compiler is being particularly stupid), yet still be able to easily detect and fix the introduction of new warnings.hjz?hhhhh}rd@(h]h]h]h]h]uhMhhh]re@(hXThe rf@rg@}rh@(hXThe hjb@ubh)ri@}rj@(hX``suppressionFile=``h}rk@(h]h]h]h]h]uhjb@h]rl@hXsuppressionFile=rm@rn@}ro@(hUhji@ubahhubhX argument can be specified as the (relative) path of a file inside the workdir defining warnings to be suppressed from the warning counting and log file. The file will be uploaded to the master from the slave before compiling, and any warning matched by a line in the suppression file will be ignored. This is useful to accept certain warnings (eg. in some special module of the source tree or in cases where the compiler is being particularly stupid), yet still be able to easily detect and fix the introduction of new warnings.rp@rq@}rr@(hX argument can be specified as the (relative) path of a file inside the workdir defining warnings to be suppressed from the warning counting and log file. The file will be uploaded to the master from the slave before compiling, and any warning matched by a line in the suppression file will be ignored. This is useful to accept certain warnings (eg. in some special module of the source tree or in cases where the compiler is being particularly stupid), yet still be able to easily detect and fix the introduction of new warnings.hjb@ubeubh)rs@}rt@(hXaThe file must contain one line per pattern of warnings to ignore. Empty lines and lines beginning with ``#`` are ignored. Other lines must consist of a regexp matching the file name, followed by a colon (``:``), followed by a regexp matching the text of the warning. Optionally this may be followed by another colon and a line number range. For example:hjz?hhhhh}ru@(h]h]h]h]h]uhMhhh]rv@(hXgThe file must contain one line per pattern of warnings to ignore. Empty lines and lines beginning with rw@rx@}ry@(hXgThe file must contain one line per pattern of warnings to ignore. Empty lines and lines beginning with hjs@ubh)rz@}r{@(hX``#``h}r|@(h]h]h]h]h]uhjs@h]r}@hX#r~@}r@(hUhjz@ubahhubhX` are ignored. Other lines must consist of a regexp matching the file name, followed by a colon (r@r@}r@(hX` are ignored. Other lines must consist of a regexp matching the file name, followed by a colon (hjs@ubh)r@}r@(hX``:``h}r@(h]h]h]h]h]uhjs@h]r@hX:r@}r@(hUhj@ubahhubhX), followed by a regexp matching the text of the warning. Optionally this may be followed by another colon and a line number range. For example:r@r@}r@(hX), followed by a regexp matching the text of the warning. Optionally this may be followed by another colon and a line number range. For example:hjs@ubeubjS)r@}r@(hX# Sample warning suppression file mi_packrec.c : .*result of 32-bit shift implicitly converted to 64 bits.* : 560-600 DictTabInfo.cpp : .*invalid access to non-static.* kernel_types.h : .*only defines private constructors and has no friends.* : 51hjz?hhhjVh}r@(jjXnonejXjYh]h]h]h]h]uhMhhh]r@hX# Sample warning suppression file mi_packrec.c : .*result of 32-bit shift implicitly converted to 64 bits.* : 560-600 DictTabInfo.cpp : .*invalid access to non-static.* kernel_types.h : .*only defines private constructors and has no friends.* : 51r@r@}r@(hUhj@ubaubh)r@}r@(hXIf no line number range is specified, the pattern matches the whole file; if only one number is given it matches only on that line.r@hjz?hhhhh}r@(h]h]h]h]h]uhMhhh]r@hXIf no line number range is specified, the pattern matches the whole file; if only one number is given it matches only on that line.r@r@}r@(hj@hj@ubaubh)r@}r@(hXThe default warningPattern regexp only matches the warning text, so line numbers and file names are ignored. To enable line number and file name matching, provide a different regexp and provide a function (callable) as the argument of ``warningExtractor=``. The function is called with three arguments: the :class:`BuildStep` object, the line in the log file with the warning, and the ``SRE_Match`` object of the regexp search for ``warningPattern``. It should return a tuple ``(filename, linenumber, warning_test)``. For example::hjz?hhhhh}r@(h]h]h]h]h]uhMhhh]r@(hXThe default warningPattern regexp only matches the warning text, so line numbers and file names are ignored. To enable line number and file name matching, provide a different regexp and provide a function (callable) as the argument of r@r@}r@(hXThe default warningPattern regexp only matches the warning text, so line numbers and file names are ignored. To enable line number and file name matching, provide a different regexp and provide a function (callable) as the argument of hj@ubh)r@}r@(hX``warningExtractor=``h}r@(h]h]h]h]h]uhj@h]r@hXwarningExtractor=r@r@}r@(hUhj@ubahhubhX3. The function is called with three arguments: the r@r@}r@(hX3. The function is called with three arguments: the hj@ubh)r@}r@(hX:class:`BuildStep`r@hj@hhhhh}r@(UreftypeXclasshhX BuildStepU refdomainXpyr@h]h]U refexplicith]h]h]hhhNhj uhMh]r@h)r@}r@(hj@h}r@(h]h]r@(hj@Xpy-classr@eh]h]h]uhj@h]r@hX BuildStepr@r@}r@(hUhj@ubahhubaubhX< object, the line in the log file with the warning, and the r@r@}r@(hX< object, the line in the log file with the warning, and the hj@ubh)r@}r@(hX ``SRE_Match``h}r@(h]h]h]h]h]uhj@h]r@hX SRE_Matchr@r@}r@(hUhj@ubahhubhX! object of the regexp search for r@r@}r@(hX! object of the regexp search for hj@ubh)r@}r@(hX``warningPattern``h}r@(h]h]h]h]h]uhj@h]r@hXwarningPatternr@r@}r@(hUhj@ubahhubhX. It should return a tuple r@r@}r@(hX. It should return a tuple hj@ubh)r@}r@(hX(``(filename, linenumber, warning_test)``h}r@(h]h]h]h]h]uhj@h]r@hX$(filename, linenumber, warning_test)r@r@}r@(hUhj@ubahhubhX. For example:r@r@}r@(hX. For example:hj@ubeubjS)r@}r@(hXf.addStep(Compile(command=["make"], warningPattern="^(.\*?):([0-9]+): [Ww]arning: (.\*)$", warningExtractor=Compile.warnExtractFromRegexpGroups, suppressionFile="support-files/compiler_warnings.supp"))hjz?hhhjVh}r@(jXjYh]h]h]h]h]uhMhhh]r@hXf.addStep(Compile(command=["make"], warningPattern="^(.\*?):([0-9]+): [Ww]arning: (.\*)$", warningExtractor=Compile.warnExtractFromRegexpGroups, suppressionFile="support-files/compiler_warnings.supp"))r@r@}r@(hUhj@ubaubh)r@}r@(hX(``Compile.warnExtractFromRegexpGroups`` is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).hjz?hhhhh}r@(h]h]h]h]h]uhMhhh]r@(hX(r@}r@(hX(hj@ubh)r@}r@(hX'``Compile.warnExtractFromRegexpGroups``h}r@(h]h]h]h]h]uhj@h]r@hX#Compile.warnExtractFromRegexpGroupsr@r@}r@(hUhj@ubahhubhXt is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).r@r@}r@(hXt is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).hj@ubeubh)r@}r@(hXIn projects with source files in multiple directories, it is possible to get full path names for file names matched in the suppression file, as long as the build command outputs the names of directories as they are entered into and left again. For this, specify regexps for the arguments ``directoryEnterPattern=`` and ``directoryLeavePattern=``. The ``directoryEnterPattern=`` regexp should return the name of the directory entered into in the first matched group. The defaults, which are suitable for .. GNU Make, are these::hjz?hhhhh}r@(h]h]h]h]h]uhMhhh]r@(hX In projects with source files in multiple directories, it is possible to get full path names for file names matched in the suppression file, as long as the build command outputs the names of directories as they are entered into and left again. For this, specify regexps for the arguments r@r@}r@(hX In projects with source files in multiple directories, it is possible to get full path names for file names matched in the suppression file, as long as the build command outputs the names of directories as they are entered into and left again. For this, specify regexps for the arguments hj@ubh)r@}r@(hX``directoryEnterPattern=``h}r@(h]h]h]h]h]uhj@h]r@hXdirectoryEnterPattern=r@r@}rA(hUhj@ubahhubhX and rArA}rA(hX and hj@ubh)rA}rA(hX``directoryLeavePattern=``h}rA(h]h]h]h]h]uhj@h]rAhXdirectoryLeavePattern=rAr A}r A(hUhjAubahhubhX. The r Ar A}r A(hX. The hj@ubh)rA}rA(hX``directoryEnterPattern=``h}rA(h]h]h]h]h]uhj@h]rAhXdirectoryEnterPattern=rArA}rA(hUhjAubahhubhX regexp should return the name of the directory entered into in the first matched group. The defaults, which are suitable for .. GNU Make, are these:rArA}rA(hX regexp should return the name of the directory entered into in the first matched group. The defaults, which are suitable for .. GNU Make, are these:hj@ubeubjS)rA}rA(hXydirectoryEnterPattern = "make.*: Entering directory [\"`'](.*)['`\"]" directoryLeavePattern = "make.*: Leaving directory"hjz?hhhjVh}rA(jXjYh]h]h]h]h]uhMhhh]rAhXydirectoryEnterPattern = "make.*: Entering directory [\"`'](.*)['`\"]" directoryLeavePattern = "make.*: Leaving directory"rArA}rA(hUhjAubaubh)rA}r A(hX(TODO: this step needs to be extended to look for GCC error messages as well, and collect them into a separate logfile, along with the source code filenames involved).r!Ahjz?hhhhh}r"A(h]h]h]h]h]uhM hhh]r#AhX(TODO: this step needs to be extended to look for GCC error messages as well, and collect them into a separate logfile, along with the source code filenames involved).r$Ar%A}r&A(hj!AhjAubaubj)r'A}r(A(hUhjz?hhhj h}r)A(h]h]h]h]h]j ]r*A((jX Visual StudioUindex-21r+AUtr,A(jX Visual C++j+AUtr-AejuhMhhh]ubh)r.A}r/A(hUhjz?hhhhh}r0A(h]h]h]h]r1Aj+Aah]uhMhhh]ubj)r2A}r3A(hUhjz?hhhj h}r4A(h]h]h]h]h]Uentries]r5A((UsingleXBuild Steps; VC6Xstep-VC6r6Aj6Atr7A(UsingleXVC6 Build Stepj6Aj6Atr8AeuhMhhh]ubh)r9A}r:A(hUhjz?hhhhh}r;A(h]h]h]h]rA(hUhjz?hhhj h}r?A(h]h]h]h]h]Uentries]r@A((UsingleXBuild Steps; VC7Xstep-VC7rAAjAAtrBA(UsingleXVC7 Build StepjAAjAAtrCAeuhMhhh]ubh)rDA}rEA(hUhjz?hhhhh}rFA(h]h]h]h]rGAjAAah]uhMhhh]ubj)rHA}rIA(hUhjz?hhhj h}rJA(h]h]h]h]h]Uentries]rKA((UsingleXBuild Steps; VC8Xstep-VC8rLAjLAtrMA(UsingleXVC8 Build StepjLAjLAtrNAeuhMhhh]ubh)rOA}rPA(hUhjz?hhhhh}rQA(h]h]h]h]rRAjLAah]uhMhhh]ubj)rSA}rTA(hUhjz?hhhj h}rUA(h]h]h]h]h]Uentries]rVA((UsingleXBuild Steps; VC9Xstep-VC9rWAjWAtrXA(UsingleXVC9 Build StepjWAjWAtrYAeuhMhhh]ubh)rZA}r[A(hUhjz?hhhhh}r\A(h]h]h]h]r]AjWAah]uhMhhh]ubj)r^A}r_A(hUhjz?hhhj h}r`A(h]h]h]h]h]Uentries]raA((UsingleXBuild Steps; VC10X step-VC10rbAjbAtrcA(UsingleXVC10 Build StepjbAjbAtrdAeuhMhhh]ubh)reA}rfA(hUhjz?hhhhh}rgA(h]h]h]h]rhAjbAah]uhMhhh]ubj)riA}rjA(hUhjz?hhhj h}rkA(h]h]h]h]h]Uentries]rlA((UsingleXBuild Steps; VC11X step-VC11rmAjmAtrnA(UsingleXVC11 Build StepjmAjmAtroAeuhMhhh]ubh)rpA}rqA(hUhjz?hhhhh}rrA(h]h]h]h]rsAjmAah]uhMhhh]ubj)rtA}ruA(hUhjz?hhhj h}rvA(h]h]h]h]h]Uentries]rwA((UsingleXBuild Steps; VC12X step-VC12rxAjxAtryA(UsingleXVC12 Build StepjxAjxAtrzAeuhMhhh]ubh)r{A}r|A(hUhjz?hhhhh}r}A(h]h]h]h]r~AjxAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VS2003X step-VS2003rAjAtrA(UsingleXVS2003 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VS2005X step-VS2005rAjAtrA(UsingleXVS2005 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VS2008X step-VS2008rAjAtrA(UsingleXVS2008 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VS2010X step-VS2010rAjAtrA(UsingleXVS2010 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VS2012X step-VS2012rAjAtrA(UsingleXVS2012 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VS2013X step-VS2013rAjAtrA(UsingleXVS2013 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; VCExpress9Xstep-VCExpress9rAjAtrA(UsingleXVCExpress9 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; MsBuild4X step-MsBuild4rAjAtrA(UsingleXMsBuild4 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]rAjAah]uhMhhh]ubj)rA}rA(hUhjz?hhhj h}rA(h]h]h]h]h]Uentries]rA((UsingleXBuild Steps; MsBuild12Xstep-MsBuild12rAjAtrA(UsingleXMsBuild12 Build StepjAjAtrAeuhMhhh]ubh)rA}rA(hUhjz?hhhhh}rA(h]h]h]h]h]hjAuhMhhh]ubeubh)rA}rA(hUhj9hhh}hhh}rA(h]h]h]h]rA(jtjAeh]rAh auhM!hhh}rAjAjAsh]rA(h)rA}rA(hjyhjAhhhhh}rA(h]h]h]h]h]hjsuhM!hhh]rAhX Visual C++rArA}rA(hjyhjAubaubh)rA}rA(hXThese steps are meant to handle compilation using Microsoft compilers. VC++ 6-12 (aka Visual Studio 2003-2013 and VCExpress9) are supported via calling ``devenv``. Msbuild as well as Windows Driver Kit 8 are supported via the ``MsBuild4`` and ``MsBuild12`` steps. These steps will take care of setting up a clean compilation environment, parsing the generated output in real time, and delivering as detailed as possible information about the compilation executed.hjAhhhhh}rA(h]h]h]h]h]uhM#hhh]rA(hXThese steps are meant to handle compilation using Microsoft compilers. VC++ 6-12 (aka Visual Studio 2003-2013 and VCExpress9) are supported via calling rArA}rA(hXThese steps are meant to handle compilation using Microsoft compilers. VC++ 6-12 (aka Visual Studio 2003-2013 and VCExpress9) are supported via calling hjAubh)rA}rA(hX ``devenv``h}rA(h]h]h]h]h]uhjAh]rAhXdevenvrArA}rA(hUhjAubahhubhX@. Msbuild as well as Windows Driver Kit 8 are supported via the rArA}rA(hX@. Msbuild as well as Windows Driver Kit 8 are supported via the hjAubh)rB}rB(hX ``MsBuild4``h}rB(h]h]h]h]h]uhjAh]rBhXMsBuild4rBrB}rB(hUhjBubahhubhX and rBrB}r B(hX and hjAubh)r B}r B(hX ``MsBuild12``h}r B(h]h]h]h]h]uhjAh]r BhX MsBuild12rBrB}rB(hUhj BubahhubhX steps. These steps will take care of setting up a clean compilation environment, parsing the generated output in real time, and delivering as detailed as possible information about the compilation executed.rBrB}rB(hX steps. These steps will take care of setting up a clean compilation environment, parsing the generated output in real time, and delivering as detailed as possible information about the compilation executed.hjAubeubh)rB}rB(hXTAll of the classes are in :mod:`buildbot.steps.vstudio`. The available classes are:rBhjAhhhhh}rB(h]h]h]h]h]uhM*hhh]rB(hXAll of the classes are in rBrB}rB(hXAll of the classes are in hjBubh)rB}rB(hX:mod:`buildbot.steps.vstudio`rBhjBhhhhh}rB(UreftypeXmodhhXbuildbot.steps.vstudioU refdomainXpyr Bh]h]U refexplicith]h]h]hhhNhj uhM*h]r!Bh)r"B}r#B(hjBh}r$B(h]h]r%B(hj BXpy-modr&Beh]h]h]uhjBh]r'BhXbuildbot.steps.vstudior(Br)B}r*B(hUhj"BubahhubaubhX. The available classes are:r+Br,B}r-B(hX. The available classes are:hjBubeubjx)r.B}r/B(hUhjAhNhj{h}r0B(h]h]h]h]h]uhNhhh]r1Bj~)r2B}r3B(hUh}r4B(jX*h]h]h]h]h]uhj.Bh]r5B(j)r6B}r7B(hX``VC6``r8Bh}r9B(h]h]h]h]h]uhj2Bh]r:Bh)r;B}rBh)r?B}r@B(hj8Bh}rAB(h]h]h]h]h]uhj;Bh]rBBhXVC6rCBrDB}rEB(hUhj?Bubahhubaubahjubj)rFB}rGB(hX``VC7``rHBh}rIB(h]h]h]h]h]uhj2Bh]rJBh)rKB}rLB(hjHBhjFBhhhhh}rMB(h]h]h]h]h]uhM-h]rNBh)rOB}rPB(hjHBh}rQB(h]h]h]h]h]uhjKBh]rRBhXVC7rSBrTB}rUB(hUhjOBubahhubaubahjubj)rVB}rWB(hX``VC8``rXBh}rYB(h]h]h]h]h]uhj2Bh]rZBh)r[B}r\B(hjXBhjVBhhhhh}r]B(h]h]h]h]h]uhM.h]r^Bh)r_B}r`B(hjXBh}raB(h]h]h]h]h]uhj[Bh]rbBhXVC8rcBrdB}reB(hUhj_Bubahhubaubahjubj)rfB}rgB(hX``VC9``rhBh}riB(h]h]h]h]h]uhj2Bh]rjBh)rkB}rlB(hjhBhjfBhhhhh}rmB(h]h]h]h]h]uhM/h]rnBh)roB}rpB(hjhBh}rqB(h]h]h]h]h]uhjkBh]rrBhXVC9rsBrtB}ruB(hUhjoBubahhubaubahjubj)rvB}rwB(hX``VC10``rxBh}ryB(h]h]h]h]h]uhj2Bh]rzBh)r{B}r|B(hjxBhjvBhhhhh}r}B(h]h]h]h]h]uhM0h]r~Bh)rB}rB(hjxBh}rB(h]h]h]h]h]uhj{Bh]rBhXVC10rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX``VC11``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM1h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVC11rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX``VC12``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM2h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVC12rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX ``VS2003``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM3h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVS2003rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX ``VS2005``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM4h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVS2005rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX ``VS2008``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM5h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVS2008rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX ``VS2010``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM6h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVS2010rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX ``VS2012``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM7h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXVS2012rBrB}rB(hUhjBubahhubaubahjubj)rB}rB(hX ``VS2013``rBh}rB(h]h]h]h]h]uhj2Bh]rBh)rB}rB(hjBhjBhhhhh}rB(h]h]h]h]h]uhM8h]rBh)rB}rC(hjBh}rC(h]h]h]h]h]uhjBh]rChXVS2013rCrC}rC(hUhjBubahhubaubahjubj)rC}rC(hX``VCExpress9``rCh}r C(h]h]h]h]h]uhj2Bh]r Ch)r C}r C(hjChjChhhhh}r C(h]h]h]h]h]uhM9h]rCh)rC}rC(hjCh}rC(h]h]h]h]h]uhj Ch]rChX VCExpress9rCrC}rC(hUhjCubahhubaubahjubj)rC}rC(hX ``MsBuild4``rCh}rC(h]h]h]h]h]uhj2Bh]rCh)rC}rC(hjChjChhhhh}rC(h]h]h]h]h]uhM:h]rCh)rC}r C(hjCh}r!C(h]h]h]h]h]uhjCh]r"ChXMsBuild4r#Cr$C}r%C(hUhjCubahhubaubahjubj)r&C}r'C(hX``MsBuild12`` h}r(C(h]h]h]h]h]uhj2Bh]r)Ch)r*C}r+C(hX ``MsBuild12``r,Chj&Chhhhh}r-C(h]h]h]h]h]uhM;h]r.Ch)r/C}r0C(hj,Ch}r1C(h]h]h]h]h]uhj*Ch]r2ChX MsBuild12r3Cr4C}r5C(hUhj/Cubahhubaubahjubehjubaubh)r6C}r7C(hX'The available constructor arguments arer8ChjAhhhhh}r9C(h]h]h]h]h]uhM=hhh]r:ChX'The available constructor arguments arer;CrC}r?C(hUhjAhhhjh}r@C(h]h]h]h]h]uhNhhh]rAC(j)rBC}rCC(hX*``mode`` The mode default to ``rebuild``, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are ``build``, where only the updated files will be recompiled, and ``clean``, where the current build files are removed and no compilation occurs. hj>Chhhjh}rDC(h]h]h]h]h]uhMDh]rEC(j)rFC}rGC(hX``mode``rHChjBChhhjh}rIC(h]h]h]h]h]uhMDh]rJCh)rKC}rLC(hjHCh}rMC(h]h]h]h]h]uhjFCh]rNChXmoderOCrPC}rQC(hUhjKCubahhubaubj)rRC}rSC(hUh}rTC(h]h]h]h]h]uhjBCh]rUCh)rVC}rWC(hX The mode default to ``rebuild``, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are ``build``, where only the updated files will be recompiled, and ``clean``, where the current build files are removed and no compilation occurs.hjRChhhhh}rXC(h]h]h]h]h]uhM@h]rYC(hXThe mode default to rZCr[C}r\C(hXThe mode default to hjVCubh)r]C}r^C(hX ``rebuild``h}r_C(h]h]h]h]h]uhjVCh]r`ChXrebuildraCrbC}rcC(hUhj]CubahhubhXr, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are rdCreC}rfC(hXr, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are hjVCubh)rgC}rhC(hX ``build``h}riC(h]h]h]h]h]uhjVCh]rjChXbuildrkCrlC}rmC(hUhjgCubahhubhX7, where only the updated files will be recompiled, and rnCroC}rpC(hX7, where only the updated files will be recompiled, and hjVCubh)rqC}rrC(hX ``clean``h}rsC(h]h]h]h]h]uhjVCh]rtChXcleanruCrvC}rwC(hUhjqCubahhubhXF, where the current build files are removed and no compilation occurs.rxCryC}rzC(hXF, where the current build files are removed and no compilation occurs.hjVCubeubahjubeubj)r{C}r|C(hXq``projectfile`` This is a mandatory argument which specifies the project file to be used during the compilation. hj>Chhhjh}r}C(h]h]h]h]h]uhMHhhh]r~C(j)rC}rC(hX``projectfile``rChj{Chhhjh}rC(h]h]h]h]h]uhMHh]rCh)rC}rC(hjCh}rC(h]h]h]h]h]uhjCh]rChX projectfilerCrC}rC(hUhjCubahhubaubj)rC}rC(hUh}rC(h]h]h]h]h]uhj{Ch]rCh)rC}rC(hX`This is a mandatory argument which specifies the project file to be used during the compilation.rChjChhhhh}rC(h]h]h]h]h]uhMGh]rChX`This is a mandatory argument which specifies the project file to be used during the compilation.rCrC}rC(hjChjCubaubahjubeubj)rC}rC(hXd``config`` This argument defaults to ``release`` an gives to the compiler the configuration to use. hj>Chhhjh}rC(h]h]h]h]h]uhMLhhh]rC(j)rC}rC(hX ``config``rChjChhhjh}rC(h]h]h]h]h]uhMLh]rCh)rC}rC(hjCh}rC(h]h]h]h]h]uhjCh]rChXconfigrCrC}rC(hUhjCubahhubaubj)rC}rC(hUh}rC(h]h]h]h]h]uhjCh]rCh)rC}rC(hXXThis argument defaults to ``release`` an gives to the compiler the configuration to use.hjChhhhh}rC(h]h]h]h]h]uhMKh]rC(hXThis argument defaults to rCrC}rC(hXThis argument defaults to hjCubh)rC}rC(hX ``release``h}rC(h]h]h]h]h]uhjCh]rChXreleaserCrC}rC(hUhjCubahhubhX3 an gives to the compiler the configuration to use.rCrC}rC(hX3 an gives to the compiler the configuration to use.hjCubeubahjubeubj)rC}rC(hX``installdir`` This is the place where the compiler is installed. The default value is compiler specific and is the default place where the compiler is installed. hj>Chhhjh}rC(h]h]h]h]h]uhMPhhh]rC(j)rC}rC(hX``installdir``rChjChhhjh}rC(h]h]h]h]h]uhMPh]rCh)rC}rC(hjCh}rC(h]h]h]h]h]uhjCh]rChX installdirrCrC}rC(hUhjCubahhubaubj)rC}rC(hUh}rC(h]h]h]h]h]uhjCh]rCh)rC}rC(hXThis is the place where the compiler is installed. The default value is compiler specific and is the default place where the compiler is installed.rChjChhhhh}rC(h]h]h]h]h]uhMOh]rChXThis is the place where the compiler is installed. The default value is compiler specific and is the default place where the compiler is installed.rCrC}rC(hjChjCubaubahjubeubj)rC}rC(hXC``useenv`` This boolean parameter, defaulting to ``False`` instruct the compiler to use its own settings or the one defined through the environment variables :envvar:`PATH`, :envvar:`INCLUDE`, and :envvar:`LIB`. If any of the ``INCLUDE`` or ``LIB`` parameter is defined, this parameter automatically switches to ``True``. hj>Chhhjh}rC(h]h]h]h]h]uhMWhhh]rC(j)rC}rC(hX ``useenv``rChjChhhjh}rC(h]h]h]h]h]uhMWh]rCh)rC}rC(hjCh}rC(h]h]h]h]h]uhjCh]rChXuseenvrCrC}rC(hUhjCubahhubaubj)rC}rC(hUh}rC(h]h]h]h]h]uhjCh]rCh)rC}rC(hX7This boolean parameter, defaulting to ``False`` instruct the compiler to use its own settings or the one defined through the environment variables :envvar:`PATH`, :envvar:`INCLUDE`, and :envvar:`LIB`. If any of the ``INCLUDE`` or ``LIB`` parameter is defined, this parameter automatically switches to ``True``.hjChhhhh}rC(h]h]h]h]h]uhMSh]rC(hX&This boolean parameter, defaulting to rCrC}rC(hX&This boolean parameter, defaulting to hjCubh)rC}rC(hX ``False``h}rC(h]h]h]h]h]uhjCh]rChXFalserCrC}rC(hUhjCubahhubhXd instruct the compiler to use its own settings or the one defined through the environment variables rCrC}rC(hXd instruct the compiler to use its own settings or the one defined through the environment variables hjCubj)rC}rC(hUh}rC(h]h]h]h]h]j ]rD((jXPATHrDUindex-22rDUtrD(jXenvironment variable; PATHjDUtrDeuhjCh]hj ubh)rD}rD(hUh}rD(h]h]h]h]rDjDah]uhjCh]hhubh)r D}r D(hX:envvar:`PATH`r DhjChhhhh}r D(UreftypeXenvvarhhjDU refdomainXstdr Dh]h]U refexplicith]h]h]hhuhMSh]rDh)rD}rD(hj Dh}rD(h]h]rD(hj DX std-envvarrDeh]h]h]uhj Dh]rDhXPATHrDrD}rD(hUhjDubahhubaubhX, rDrD}rD(hX, hjCubj)rD}rD(hUh}rD(h]h]h]h]h]j ]rD((jXINCLUDErDUindex-23r DUtr!D(jXenvironment variable; INCLUDEj DUtr"DeuhjCh]hj ubh)r#D}r$D(hUh}r%D(h]h]h]h]r&Dj Dah]uhjCh]hhubh)r'D}r(D(hX:envvar:`INCLUDE`r)DhjChhhhh}r*D(UreftypeXenvvarhhjDU refdomainXstdr+Dh]h]U refexplicith]h]h]hhuhMSh]r,Dh)r-D}r.D(hj)Dh}r/D(h]h]r0D(hj+DX std-envvarr1Deh]h]h]uhj'Dh]r2DhXINCLUDEr3Dr4D}r5D(hUhj-DubahhubaubhX, and r6Dr7D}r8D(hX, and hjCubj)r9D}r:D(hUh}r;D(h]h]h]h]h]j ]rDUtr?D(jXenvironment variable; LIBj>DUtr@DeuhjCh]hj ubh)rAD}rBD(hUh}rCD(h]h]h]h]rDDj>Dah]uhjCh]hhubh)rED}rFD(hX :envvar:`LIB`rGDhjChhhhh}rHD(UreftypeXenvvarhhj=DU refdomainXstdrIDh]h]U refexplicith]h]h]hhuhMSh]rJDh)rKD}rLD(hjGDh}rMD(h]h]rND(hjIDX std-envvarrODeh]h]h]uhjEDh]rPDhXLIBrQDrRD}rSD(hUhjKDubahhubaubhX. If any of the rTDrUD}rVD(hX. If any of the hjCubh)rWD}rXD(hX ``INCLUDE``h}rYD(h]h]h]h]h]uhjCh]rZDhXINCLUDEr[Dr\D}r]D(hUhjWDubahhubhX or r^Dr_D}r`D(hX or hjCubh)raD}rbD(hX``LIB``h}rcD(h]h]h]h]h]uhjCh]rdDhXLIBreDrfD}rgD(hUhjaDubahhubhX@ parameter is defined, this parameter automatically switches to rhDriD}rjD(hX@ parameter is defined, this parameter automatically switches to hjCubh)rkD}rlD(hX``True``h}rmD(h]h]h]h]h]uhjCh]rnDhXTrueroDrpD}rqD(hUhjkDubahhubhX.rrD}rsD(hX.hjCubeubahjubeubj)rtD}ruD(hX``PATH`` This is a list of path to be added to the :envvar:`PATH` environment variable. The default value is the one defined in the compiler options. hj>Chhhjh}rvD(h]h]h]h]h]uhM[hhh]rwD(j)rxD}ryD(hX``PATH``rzDhjtDhhhjh}r{D(h]h]h]h]h]uhM[h]r|Dh)r}D}r~D(hjzDh}rD(h]h]h]h]h]uhjxDh]rDhXPATHrDrD}rD(hUhj}Dubahhubaubj)rD}rD(hUh}rD(h]h]h]h]h]uhjtDh]rDh)rD}rD(hXThis is a list of path to be added to the :envvar:`PATH` environment variable. The default value is the one defined in the compiler options.hjDhhhhh}rD(h]h]h]h]h]uhMZh]rD(hX*This is a list of path to be added to the rDrD}rD(hX*This is a list of path to be added to the hjDubj)rD}rD(hUh}rD(h]h]h]h]h]j ]rD((jXPATHrDUindex-25rDUtrD(jXenvironment variable; PATHjDUtrDeuhjDh]hj ubh)rD}rD(hUh}rD(h]h]h]h]rDjDah]uhjDh]hhubh)rD}rD(hX:envvar:`PATH`rDhjDhhhhh}rD(UreftypeXenvvarhhjDU refdomainXstdrDh]h]U refexplicith]h]h]hhuhMZh]rDh)rD}rD(hjDh}rD(h]h]rD(hjDX std-envvarrDeh]h]h]uhjDh]rDhXPATHrDrD}rD(hUhjDubahhubaubhXT environment variable. The default value is the one defined in the compiler options.rDrD}rD(hXT environment variable. The default value is the one defined in the compiler options.hjDubeubahjubeubj)rD}rD(hX``INCLUDE`` This is a list of path where the compiler will first look for include files. Then comes the default paths defined in the compiler options. hj>Chhhjh}rD(h]h]h]h]h]uhM_hhh]rD(j)rD}rD(hX ``INCLUDE``rDhjDhhhjh}rD(h]h]h]h]h]uhM_h]rDh)rD}rD(hjDh}rD(h]h]h]h]h]uhjDh]rDhXINCLUDErDrD}rD(hUhjDubahhubaubj)rD}rD(hUh}rD(h]h]h]h]h]uhjDh]rDh)rD}rD(hXThis is a list of path where the compiler will first look for include files. Then comes the default paths defined in the compiler options.rDhjDhhhhh}rD(h]h]h]h]h]uhM^h]rDhXThis is a list of path where the compiler will first look for include files. Then comes the default paths defined in the compiler options.rDrD}rD(hjDhjDubaubahjubeubj)rD}rD(hX``LIB`` This is a list of path where the compiler will first look for libraries. Then comes the default path defined in the compiler options. hj>Chhhjh}rD(h]h]h]h]h]uhMchhh]rD(j)rD}rD(hX``LIB``rDhjDhhhjh}rD(h]h]h]h]h]uhMch]rDh)rD}rD(hjDh}rD(h]h]h]h]h]uhjDh]rDhXLIBrDrD}rD(hUhjDubahhubaubj)rD}rD(hUh}rD(h]h]h]h]h]uhjDh]rDh)rD}rD(hXThis is a list of path where the compiler will first look for libraries. Then comes the default path defined in the compiler options.rDhjDhhhhh}rD(h]h]h]h]h]uhMbh]rDhXThis is a list of path where the compiler will first look for libraries. Then comes the default path defined in the compiler options.rDrD}rD(hjDhjDubaubahjubeubj)rD}rD(hX``arch`` That one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to ``x86`` and does not apply to ``MsBuild4`` or ``MsBuild12``. Please see ``platform`` below. hj>Chhhjh}rD(h]h]h]h]h]uhMhhhh]rD(j)rD}rD(hX``arch``rDhjDhhhjh}rD(h]h]h]h]h]uhMhh]rDh)rD}rD(hjDh}rD(h]h]h]h]h]uhjDh]rDhXarchrDrD}rD(hUhjDubahhubaubj)rD}rD(hUh}rD(h]h]h]h]h]uhjDh]rDh)rD}rD(hXThat one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to ``x86`` and does not apply to ``MsBuild4`` or ``MsBuild12``. Please see ``platform`` below.hjDhhhhh}rD(h]h]h]h]h]uhMfh]rD(hXThat one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to rDrD}rD(hXThat one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to hjDubh)rE}rE(hX``x86``h}rE(h]h]h]h]h]uhjDh]rEhXx86rErE}rE(hUhjEubahhubhX and does not apply to rErE}r E(hX and does not apply to hjDubh)r E}r E(hX ``MsBuild4``h}r E(h]h]h]h]h]uhjDh]r EhXMsBuild4rErE}rE(hUhj EubahhubhX or rErE}rE(hX or hjDubh)rE}rE(hX ``MsBuild12``h}rE(h]h]h]h]h]uhjDh]rEhX MsBuild12rErE}rE(hUhjEubahhubhX . Please see rErE}rE(hX . Please see hjDubh)rE}rE(hX ``platform``h}r E(h]h]h]h]h]uhjDh]r!EhXplatformr"Er#E}r$E(hUhjEubahhubhX below.r%Er&E}r'E(hX below.hjDubeubahjubeubj)r(E}r)E(hX``project`` This gives the specific project to build from within a workspace. It defaults to building all projects. This is useful for building cmake generate projects. hj>Chhhjh}r*E(h]h]h]h]h]uhMmhhh]r+E(j)r,E}r-E(hX ``project``r.Ehj(Ehhhjh}r/E(h]h]h]h]h]uhMmh]r0Eh)r1E}r2E(hj.Eh}r3E(h]h]h]h]h]uhj,Eh]r4EhXprojectr5Er6E}r7E(hUhj1Eubahhubaubj)r8E}r9E(hUh}r:E(h]h]h]h]h]uhj(Eh]r;Eh)rEhj8Ehhhhh}r?E(h]h]h]h]h]uhMkh]r@EhXThis gives the specific project to build from within a workspace. It defaults to building all projects. This is useful for building cmake generate projects.rAErBE}rCE(hj>EhjChhhjh}rFE(h]h]h]h]h]uhMshhh]rGE(j)rHE}rIE(hX ``platform``rJEhjDEhhhjh}rKE(h]h]h]h]h]uhMsh]rLEh)rME}rNE(hjJEh}rOE(h]h]h]h]h]uhjHEh]rPEhXplatformrQErRE}rSE(hUhjMEubahhubaubj)rTE}rUE(hUh}rVE(h]h]h]h]h]uhjDEh]rWEh)rXE}rYE(hXThis is a mandatory argument for ``MsBuild4`` and ``MsBuild12`` specifying the target platform such as 'Win32', 'x64' or 'Vista Debug'. The last one is an example of driver targets that appear once Windows Driver Kit 8 is installed.hjTEhhhhh}rZE(h]h]h]h]h]uhMph]r[E(hX!This is a mandatory argument for r\Er]E}r^E(hX!This is a mandatory argument for hjXEubh)r_E}r`E(hX ``MsBuild4``h}raE(h]h]h]h]h]uhjXEh]rbEhXMsBuild4rcErdE}reE(hUhj_EubahhubhX and rfErgE}rhE(hX and hjXEubh)riE}rjE(hX ``MsBuild12``h}rkE(h]h]h]h]h]uhjXEh]rlEhX MsBuild12rmErnE}roE(hUhjiEubahhubhX specifying the target platform such as 'Win32', 'x64' or 'Vista Debug'. The last one is an example of driver targets that appear once Windows Driver Kit 8 is installed.rpErqE}rrE(hX specifying the target platform such as 'Win32', 'x64' or 'Vista Debug'. The last one is an example of driver targets that appear once Windows Driver Kit 8 is installed.hjXEubeubahjubeubeubh)rsE}rtE(hXHHere is an example on how to drive compilation with Visual Studio 2013::ruEhjAhhhhh}rvE(h]h]h]h]h]uhMuhhh]rwEhXGHere is an example on how to drive compilation with Visual Studio 2013:rxEryE}rzE(hXGHere is an example on how to drive compilation with Visual Studio 2013:hjsEubaubjS)r{E}r|E(hXfrom buildbot.steps.vstudio import VS2013 f.addStep( VS2013(projectfile="project.sln", config="release", arch="x64", mode="build", INCLUDE=[r'C:\3rd-pary\libmagic\include'], LIB=[r'C:\3rd-party\libmagic\lib-x64']))hjAhhhjVh}r}E(jXjYh]h]h]h]h]uhMwhhh]r~EhXfrom buildbot.steps.vstudio import VS2013 f.addStep( VS2013(projectfile="project.sln", config="release", arch="x64", mode="build", INCLUDE=[r'C:\3rd-pary\libmagic\include'], LIB=[r'C:\3rd-party\libmagic\lib-x64']))rErE}rE(hUhj{Eubaubh)rE}rE(hX-Here is a similar example using "MsBuild12"::rEhjAhhhhh}rE(h]h]h]h]h]uhMhhh]rEhX,Here is a similar example using "MsBuild12":rErE}rE(hX,Here is a similar example using "MsBuild12":hjEubaubjS)rE}rE(hXfrom buildbot.steps.vstudio import MsBuild12 # Build one project in Release mode for Win32 f.addStep( MsBuild12(projectfile="trunk.sln", config="Release", platform="Win32", workdir="trunk", project="tools\\protoc")) # Build the entire solution in Debug mode for x64 f.addStep( MsBuild12(projectfile="trunk.sln", config='Debug', platform='x64', workdir="trunk"))hjAhhhjVh}rE(jXjYh]h]h]h]h]uhMhhh]rEhXfrom buildbot.steps.vstudio import MsBuild12 # Build one project in Release mode for Win32 f.addStep( MsBuild12(projectfile="trunk.sln", config="Release", platform="Win32", workdir="trunk", project="tools\\protoc")) # Build the entire solution in Debug mode for x64 f.addStep( MsBuild12(projectfile="trunk.sln", config='Debug', platform='x64', workdir="trunk"))rErE}rE(hUhjEubaubj)rE}rE(hUhjAhhhj h}rE(h]h]h]h]h]Uentries]rE((UsingleXBuild Steps; RobocopyX step-RobocopyrEjEtrE(UsingleXRobocopy Build StepjEjEtrEeuhMhhh]ubh)rE}rE(hUhjAhhhhh}rE(h]h]h]h]h]hjEuhMhhh]ubeubh)rE}rE(hUhKhj9hhh}hhh}rE(h]rEXrobocopyrEah]h]h]rE(jjEeh]uhMhhh}rEjEjEsh]rE(h)rE}rE(hjhjEhhhhh}rE(h]h]h]h]h]hjuhMhhh]rEhXRobocopyrErE}rE(hjhjEubaubj)rE}rE(hUhjEhNhj h}rE(h]h]h]h]h]Uentries]rE(jX>buildbot.steps.mswin.Robocopy (class in buildbot.steps.source)h4UtrEauhNhhh]ubj )rE}rE(hUhjEhNhj h}rE(j j Xpyh]h]h]h]h]j XclassrEj jEuhNhhh]rE(j )rE}rE(hXbuildbot.steps.mswin.RobocopyhjEhhhj h}rE(h]rEh4aj j h]h]h]h]rEh4aj Xbuildbot.steps.mswin.Robocopyj Xbuildbot.steps.mswinj uhMhhh]rE(j )rE}rE(hXclass hjEhhhj h}rE(h]h]h]h]h]uhMhhh]rEhXclass rErE}rE(hUhjEubaubj )rE}rE(hXbuildbot.steps.mswin.hjEhhhj h}rE(h]h]h]h]h]uhMhhh]rEhXbuildbot.steps.mswin.rErE}rE(hUhjEubaubj )rE}rE(hXRobocopyhjEhhhj h}rE(h]h]h]h]h]uhMhhh]rEhXRobocopyrErE}rE(hUhjEubaubeubj )rE}rE(hUhjEhhhj h}rE(h]h]h]h]h]uhMhhh]ubeubh)rE}rE(hX'This step runs ``robocopy`` on Windows.rEhjEhhhhh}rE(h]h]h]h]h]uhMhhh]rE(hXThis step runs rErE}rE(hXThis step runs hjEubh)rE}rE(hX ``robocopy``h}rE(h]h]h]h]h]uhjEh]rEhXrobocopyrErE}rE(hUhjEubahhubhX on Windows.rErE}rE(hX on Windows.hjEubeubh)rE}rE(hXJ`Robocopy `_ is available in versions of Windows starting with Windows Vista and Windows Server 2008. For previous versions of Windows, it's available as part of the `Windows Server 2003 Resource Kit Tools `_.hjEhhhhh}rE(h]h]h]h]h]uhMhhh]rE(jM)rE}rE(hXF`Robocopy `_h}rE(UnameXRobocopyj X8http://technet.microsoft.com/en-us/library/cc733145.aspxrEh]h]h]h]h]uhjEh]rEhXRobocopyrErE}rE(hUhjEubahjYubh)rE}rE(hX; hKhjEhhh}rE(UrefurijEh]rEUid18rEah]h]h]h]rEjEauh]ubhX is available in versions of Windows starting with Windows Vista and Windows Server 2008. For previous versions of Windows, it's available as part of the rErE}rE(hX is available in versions of Windows starting with Windows Vista and Windows Server 2008. For previous versions of Windows, it's available as part of the hjEubjM)rE}rE(hXi`Windows Server 2003 Resource Kit Tools `_h}rE(UnameX&Windows Server 2003 Resource Kit Toolsj X=http://www.microsoft.com/en-us/download/details.aspx?id=17657rEh]h]h]h]h]uhjEh]rEhX&Windows Server 2003 Resource Kit ToolsrErE}rF(hUhjEubahjYubh)rF}rF(hX@ hKhjEhhh}rF(UrefurijEh]rFU&windows-server-2003-resource-kit-toolsrFah]h]h]h]rFhauh]ubhX.rF}rF(hX.hjEubeubjS)r F}r F(hXfrom buildbot.steps.mswin import Robocopy f.addStep(Robocopy( name='deploy_binaries', description='Deploying binaries...', descriptionDone='Deployed binaries.', source=Interpolate('Build\\Bin\\%(prop:configuration)s'), destination=Interpolate('%(prop:deploy_dir)\\Bin\\%(prop:configuration)s'), mirror=True ))hjEhhhjVh}r F(jXjYh]h]h]h]h]uhMhhh]r FhXfrom buildbot.steps.mswin import Robocopy f.addStep(Robocopy( name='deploy_binaries', description='Deploying binaries...', descriptionDone='Deployed binaries.', source=Interpolate('Build\\Bin\\%(prop:configuration)s'), destination=Interpolate('%(prop:deploy_dir)\\Bin\\%(prop:configuration)s'), mirror=True ))r FrF}rF(hUhj Fubaubh)rF}rF(hX$Available constructor arguments are:rFhjEhhhhh}rF(h]h]h]h]h]uhMhhh]rFhX$Available constructor arguments are:rFrF}rF(hjFhjFubaubj)rF}rF(hUhjEhhhjh}rF(h]h]h]h]h]uhNhhh]rF(j)rF}rF(hX9``source`` The path to the source directory (mandatory). hjFhhhjh}rF(h]h]h]h]h]uhMh]rF(j)r F}r!F(hX ``source``r"FhjFhhhjh}r#F(h]h]h]h]h]uhMh]r$Fh)r%F}r&F(hj"Fh}r'F(h]h]h]h]h]uhj Fh]r(FhXsourcer)Fr*F}r+F(hUhj%Fubahhubaubj)r,F}r-F(hUh}r.F(h]h]h]h]h]uhjFh]r/Fh)r0F}r1F(hX-The path to the source directory (mandatory).r2Fhj,Fhhhhh}r3F(h]h]h]h]h]uhMh]r4FhX-The path to the source directory (mandatory).r5Fr6F}r7F(hj2Fhj0Fubaubahjubeubj)r8F}r9F(hXC``destination`` The path to the destination directory (mandatory). hjFhhhjh}r:F(h]h]h]h]h]uhMhhh]r;F(j)rFhj8Fhhhjh}r?F(h]h]h]h]h]uhMh]r@Fh)rAF}rBF(hj>Fh}rCF(h]h]h]h]h]uhjG(hXKAn array of custom parameters to pass directly to the ``robocopy`` command.hj9Ghhhhh}r?G(h]h]h]h]h]uhMh]r@G(hX6An array of custom parameters to pass directly to the rAGrBG}rCG(hX6An array of custom parameters to pass directly to the hj=Gubh)rDG}rEG(hX ``robocopy``h}rFG(h]h]h]h]h]uhj=Gh]rGGhXrobocopyrHGrIG}rJG(hUhjDGubahhubhX command.rKGrLG}rMG(hX command.hj=Gubeubahjubeubj)rNG}rOG(hXO``verbose`` Whether to output verbose information (``/V /TS /TP`` parameters). hjFhhhjh}rPG(h]h]h]h]h]uhMhhh]rQG(j)rRG}rSG(hX ``verbose``rTGhjNGhhhjh}rUG(h]h]h]h]h]uhMh]rVGh)rWG}rXG(hjTGh}rYG(h]h]h]h]h]uhjRGh]rZGhXverboser[Gr\G}r]G(hUhjWGubahhubaubj)r^G}r_G(hUh}r`G(h]h]h]h]h]uhjNGh]raGh)rbG}rcG(hXBWhether to output verbose information (``/V /TS /TP`` parameters).hj^Ghhhhh}rdG(h]h]h]h]h]uhMh]reG(hX'Whether to output verbose information (rfGrgG}rhG(hX'Whether to output verbose information (hjbGubh)riG}rjG(hX``/V /TS /TP``h}rkG(h]h]h]h]h]uhjbGh]rlGhX /V /TS /TPrmGrnG}roG(hUhjiGubahhubhX parameters).rpGrqG}rrG(hX parameters).hjbGubeubahjubeubeubh)rsG}rtG(hXNote that parameters ``/TEE /NP`` will always be appended to the command to signify, respectively, to output logging to the console, use Unicode logging, and not print any percentage progress information for each file.hjEhhhhh}ruG(h]h]h]h]h]uhMhhh]rvG(hXNote that parameters rwGrxG}ryG(hXNote that parameters hjsGubh)rzG}r{G(hX ``/TEE /NP``h}r|G(h]h]h]h]h]uhjsGh]r}GhX/TEE /NPr~GrG}rG(hUhjzGubahhubhX will always be appended to the command to signify, respectively, to output logging to the console, use Unicode logging, and not print any percentage progress information for each file.rGrG}rG(hX will always be appended to the command to signify, respectively, to output logging to the console, use Unicode logging, and not print any percentage progress information for each file.hjsGubeubj)rG}rG(hUhjEhhhj h}rG(h]h]h]h]h]Uentries]rG((UsingleXBuild Steps; TestX step-TestrGjGtrG(UsingleXTest Build StepjGjGtrGeuhMhhh]ubh)rG}rG(hUhjEhhhhh}rG(h]h]h]h]h]hjGuhMhhh]ubeubh)rG}rG(hUhj9hhh}hhh}rG(h]h]h]h]rG(jjGeh]rGhauhMhhh}rGjGjGsh]rG(h)rG}rG(hjhjGhhhhh}rG(h]h]h]h]h]hjuhMhhh]rGhXTestrGrG}rG(hjhjGubaubjS)rG}rG(hX7from buildbot.steps.shell import Test f.addStep(Test())hjGhhhjVh}rG(jXjYh]h]h]h]h]uhMhhh]rGhX7from buildbot.steps.shell import Test f.addStep(Test())rGrG}rG(hUhjGubaubh)rG}rG(hXThis is meant to handle unit tests. The default command is :command:`make test`, and the ``warnOnFailure`` flag is set. The other arguments are identical to :bb:step:`ShellCommand`.hjGhhhhh}rG(h]h]h]h]h]uhMhhh]rG(hX;This is meant to handle unit tests. The default command is rGrG}rG(hX;This is meant to handle unit tests. The default command is hjGubjL)rG}rG(hX:command:`make test`h}rG(h]h]rGjQah]h]h]uhjGh]rGhX make testrGrG}rG(hUhjGubahjVubhX , and the rGrG}rG(hX , and the hjGubh)rG}rG(hX``warnOnFailure``h}rG(h]h]h]h]h]uhjGh]rGhX warnOnFailurerGrG}rG(hUhjGubahhubhX3 flag is set. The other arguments are identical to rGrG}rG(hX3 flag is set. The other arguments are identical to hjGubh)rG}rG(hX:bb:step:`ShellCommand`rGhjGhhhhh}rG(UreftypeXstephhX ShellCommandU refdomainXbbrGh]h]U refexplicith]h]h]hhuhMh]rGh)rG}rG(hjGh}rG(h]h]rG(hjGXbb-steprGeh]h]h]uhjGh]rGhX ShellCommandrGrG}rG(hUhjGubahhubaubhX.rG}rG(hX.hjGubeubj)rG}rG(hUhjGhhhj h}rG(h]h]h]h]h]Uentries]rG((UsingleXBuild Steps; TreeSizeX step-TreeSizerGjGtrG(UsingleXTreeSize Build StepjGjGtrGeuhMhhh]ubh)rG}rG(hUhjGhhhhh}rG(h]h]h]h]rGjGah]uhMhhh]ubj)rG}rG(hUhjGhhhj h}rG(h]h]h]h]h]j ]rG(jXProperties; tree-size-KiBUindex-26rGUtrGajuhMhhh]ubh)rG}rG(hUhjGhhhhh}rG(h]h]h]h]h]hjGuhMhhh]ubeubh)rG}rG(hUhj9hhh}hhh}rG(h]h]h]h]rG(jjGeh]rGhvauhMhhh}rGjGjGsh]rG(h)rG}rG(hjhjGhhhhh}rG(h]h]h]h]h]hjuhMhhh]rGhXTreeSizerGrG}rG(hjhjGubaubjS)rG}rG(hX?from buildbot.steps.shell import TreeSize f.addStep(TreeSize())hjGhhhjVh}rG(jXjYh]h]h]h]h]uhMhhh]rGhX?from buildbot.steps.shell import TreeSize f.addStep(TreeSize())rGrG}rG(hUhjGubaubh)rG}rG(hXFThis is a simple command that uses the :command:`du` tool to measure the size of the code tree. It puts the size (as a count of 1024-byte blocks, aka 'KiB' or 'kibibytes') on the step's status text, and sets a build property named ``tree-size-KiB`` with the same value. All arguments are identical to :bb:step:`ShellCommand`.hjGhhhhh}rG(h]h]h]h]h]uhMhhh]rG(hX'This is a simple command that uses the rGrG}rG(hX'This is a simple command that uses the hjGubjL)rH}rH(hX :command:`du`h}rH(h]h]rHjQah]h]h]uhjGh]rHhXdurHrH}rH(hUhjHubahjVubhX tool to measure the size of the code tree. It puts the size (as a count of 1024-byte blocks, aka 'KiB' or 'kibibytes') on the step's status text, and sets a build property named rHr H}r H(hX tool to measure the size of the code tree. It puts the size (as a count of 1024-byte blocks, aka 'KiB' or 'kibibytes') on the step's status text, and sets a build property named hjGubh)r H}r H(hX``tree-size-KiB``h}r H(h]h]h]h]h]uhjGh]rHhX tree-size-KiBrHrH}rH(hUhj HubahhubhX6 with the same value. All arguments are identical to rHrH}rH(hX6 with the same value. All arguments are identical to hjGubh)rH}rH(hX:bb:step:`ShellCommand`rHhjGhhhhh}rH(UreftypeXstephhX ShellCommandU refdomainXbbrHh]h]U refexplicith]h]h]hhuhMh]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXbb-steprHeh]h]h]uhjHh]r HhX ShellCommandr!Hr"H}r#H(hUhjHubahhubaubhX.r$H}r%H(hX.hjGubeubj)r&H}r'H(hUhjGhhhj h}r(H(h]h]h]h]h]Uentries]r)H((UsingleXBuild Steps; PerlModuleTestXstep-PerlModuleTestr*Hj*Htr+H(UsingleXPerlModuleTest Build Stepj*Hj*Htr,HeuhMhhh]ubh)r-H}r.H(hUhjGhhhhh}r/H(h]h]h]h]h]hj*HuhMhhh]ubeubh)r0H}r1H(hUhj9hhh}hhh}r2H(h]h]h]h]r3H(jj*Heh]r4Hh,auhMhhh}r5Hj*Hj-Hsh]r6H(h)r7H}r8H(hjhj0Hhhhhh}r9H(h]h]h]h]h]hjuhMhhh]r:HhXPerlModuleTestr;HrH}r?H(hXKfrom buildbot.steps.shell import PerlModuleTest f.addStep(PerlModuleTest())hj0HhhhjVh}r@H(jXjYh]h]h]h]h]uhMhhh]rAHhXKfrom buildbot.steps.shell import PerlModuleTest f.addStep(PerlModuleTest())rBHrCH}rDH(hUhj>Hubaubh)rEH}rFH(hXThis is a simple command that knows how to run tests of perl modules. It parses the output to determine the number of tests passed and failed and total number executed, saving the results for later query. The command is ``prove --lib lib -r t``, although this can be overridden with the ``command`` argument. All other arguments are identical to those for :bb:step:`ShellCommand`.hj0Hhhhhh}rGH(h]h]h]h]h]uhMhhh]rHH(hXThis is a simple command that knows how to run tests of perl modules. It parses the output to determine the number of tests passed and failed and total number executed, saving the results for later query. The command is rIHrJH}rKH(hXThis is a simple command that knows how to run tests of perl modules. It parses the output to determine the number of tests passed and failed and total number executed, saving the results for later query. The command is hjEHubh)rLH}rMH(hX``prove --lib lib -r t``h}rNH(h]h]h]h]h]uhjEHh]rOHhXprove --lib lib -r trPHrQH}rRH(hUhjLHubahhubhX+, although this can be overridden with the rSHrTH}rUH(hX+, although this can be overridden with the hjEHubh)rVH}rWH(hX ``command``h}rXH(h]h]h]h]h]uhjEHh]rYHhXcommandrZHr[H}r\H(hUhjVHubahhubhX; argument. All other arguments are identical to those for r]Hr^H}r_H(hX; argument. All other arguments are identical to those for hjEHubh)r`H}raH(hX:bb:step:`ShellCommand`rbHhjEHhhhhh}rcH(UreftypeXstephhX ShellCommandU refdomainXbbrdHh]h]U refexplicith]h]h]hhuhMh]reHh)rfH}rgH(hjbHh}rhH(h]h]riH(hjdHXbb-steprjHeh]h]h]uhj`Hh]rkHhX ShellCommandrlHrmH}rnH(hUhjfHubahhubaubhX.roH}rpH(hX.hjEHubeubj)rqH}rrH(hUhj0Hhhhj h}rsH(h]h]h]h]h]Uentries]rtH((UsingleXBuild Steps; MTRXstep-MTRruHjuHtrvH(UsingleXMTR Build StepjuHjuHtrwHeuhM hhh]ubh)rxH}ryH(hUhj0Hhhhhh}rzH(h]h]h]h]h]hjuHuhM hhh]ubeubh)r{H}r|H(hUhj9hhh}hhh}r}H(h]h]h]h]r~H(jjuHeh]rHhDauhM hhh}rHjuHjxHsh]rH(h)rH}rH(hjhj{Hhhhhh}rH(h]h]h]h]h]hjuhM hhh]rHhXMTR (mysql-test-run)rHrH}rH(hjhjHubaubh)rH}rH(hXThe :bb:step:`MTR` class is a subclass of :bb:step:`Test`. It is used to run test suites using the mysql-test-run program, as used in MySQL, Drizzle, MariaDB, and MySQL storage engine plugins.hj{Hhhhhh}rH(h]h]h]h]h]uhM hhh]rH(hXThe rHrH}rH(hXThe hjHubh)rH}rH(hX:bb:step:`MTR`rHhjHhhhhh}rH(UreftypeXstephhXMTRU refdomainXbbrHh]h]U refexplicith]h]h]hhuhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXbb-steprHeh]h]h]uhjHh]rHhXMTRrHrH}rH(hUhjHubahhubaubhX class is a subclass of rHrH}rH(hX class is a subclass of hjHubh)rH}rH(hX:bb:step:`Test`rHhjHhhhhh}rH(UreftypeXstephhXTestU refdomainXbbrHh]h]U refexplicith]h]h]hhuhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXbb-steprHeh]h]h]uhjHh]rHhXTestrHrH}rH(hUhjHubahhubaubhX. It is used to run test suites using the mysql-test-run program, as used in MySQL, Drizzle, MariaDB, and MySQL storage engine plugins.rHrH}rH(hX. It is used to run test suites using the mysql-test-run program, as used in MySQL, Drizzle, MariaDB, and MySQL storage engine plugins.hjHubeubh)rH}rH(hXeThe shell command to run the test suite is specified in the same way as for the :bb:step:`Test` class. The :bb:step:`MTR` class will parse the output of running the test suite, and use the count of tests executed so far to provide more accurate completion time estimates. Any test failures that occur during the test are summarized on the Waterfall Display.hj{Hhhhhh}rH(h]h]h]h]h]uhM hhh]rH(hXPThe shell command to run the test suite is specified in the same way as for the rHrH}rH(hXPThe shell command to run the test suite is specified in the same way as for the hjHubh)rH}rH(hX:bb:step:`Test`rHhjHhhhhh}rH(UreftypeXstephhXTestU refdomainXbbrHh]h]U refexplicith]h]h]hhuhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXbb-steprHeh]h]h]uhjHh]rHhXTestrHrH}rH(hUhjHubahhubaubhX class. The rHrH}rH(hX class. The hjHubh)rH}rH(hX:bb:step:`MTR`rHhjHhhhhh}rH(UreftypeXstephhXMTRU refdomainXbbrHh]h]U refexplicith]h]h]hhuhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXbb-steprHeh]h]h]uhjHh]rHhXMTRrHrH}rH(hUhjHubahhubaubhX class will parse the output of running the test suite, and use the count of tests executed so far to provide more accurate completion time estimates. Any test failures that occur during the test are summarized on the Waterfall Display.rHrH}rH(hX class will parse the output of running the test suite, and use the count of tests executed so far to provide more accurate completion time estimates. Any test failures that occur during the test are summarized on the Waterfall Display.hjHubeubh)rH}rH(hXSServer error logs are added as additional log files, useful to debug test failures.rHhj{Hhhhhh}rH(h]h]h]h]h]uhM hhh]rHhXSServer error logs are added as additional log files, useful to debug test failures.rHrH}rH(hjHhjHubaubh)rH}rH(hXOptionally, data about the test run and any test failures can be inserted into a database for further analysis and report generation. To use this facility, create an instance of :class:`twisted.enterprise.adbapi.ConnectionPool` with connections to the database. The necessary tables can be created automatically by setting ``autoCreateTables`` to ``True``, or manually using the SQL found in the :file:`mtrlogobserver.py` source file.hj{Hhhhhh}rH(h]h]h]h]h]uhM hhh]rH(hXOptionally, data about the test run and any test failures can be inserted into a database for further analysis and report generation. To use this facility, create an instance of rHrH}rH(hXOptionally, data about the test run and any test failures can be inserted into a database for further analysis and report generation. To use this facility, create an instance of hjHubh)rH}rH(hX1:class:`twisted.enterprise.adbapi.ConnectionPool`rHhjHhhhhh}rH(UreftypeXclasshhX(twisted.enterprise.adbapi.ConnectionPoolU refdomainXpyrHh]h]U refexplicith]h]h]hhhNhj uhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXpy-classrHeh]h]h]uhjHh]rHhX(twisted.enterprise.adbapi.ConnectionPoolrHrH}rH(hUhjHubahhubaubhX` with connections to the database. The necessary tables can be created automatically by setting rHrH}rH(hX` with connections to the database. The necessary tables can be created automatically by setting hjHubh)rI}rI(hX``autoCreateTables``h}rI(h]h]h]h]h]uhjHh]rIhXautoCreateTablesrIrI}rI(hUhjIubahhubhX to rIrI}r I(hX to hjHubh)r I}r I(hX``True``h}r I(h]h]h]h]h]uhjHh]r IhXTruerIrI}rI(hUhj IubahhubhX), or manually using the SQL found in the rIrI}rI(hX), or manually using the SQL found in the hjHubh)rI}rI(hUh}rI(h]h]h]h]rIXfilerIaUrolejIh]uhjHh]rIhXmtrlogobserver.pyrIrI}rI(hXmtrlogobserver.pyhjIubahhubhX source file.rIrI}rI(hX source file.hjHubeubh)r I}r!I(hXOne problem with specifying a database is that each reload of the configuration will get a new instance of ``ConnectionPool`` (even if the connection parameters are the same). To avoid that Buildbot thinks the builder configuration has changed because of this, use the :class:`steps.mtrlogobserver.EqConnectionPool` subclass of :class:`ConnectionPool`, which implements an equiality operation that avoids this problem.hj{Hhhhhh}r"I(h]h]h]h]h]uhM hhh]r#I(hXkOne problem with specifying a database is that each reload of the configuration will get a new instance of r$Ir%I}r&I(hXkOne problem with specifying a database is that each reload of the configuration will get a new instance of hj Iubh)r'I}r(I(hX``ConnectionPool``h}r)I(h]h]h]h]h]uhj Ih]r*IhXConnectionPoolr+Ir,I}r-I(hUhj'IubahhubhX (even if the connection parameters are the same). To avoid that Buildbot thinks the builder configuration has changed because of this, use the r.Ir/I}r0I(hX (even if the connection parameters are the same). To avoid that Buildbot thinks the builder configuration has changed because of this, use the hj Iubh)r1I}r2I(hX.:class:`steps.mtrlogobserver.EqConnectionPool`r3Ihj Ihhhhh}r4I(UreftypeXclasshhX%steps.mtrlogobserver.EqConnectionPoolU refdomainXpyr5Ih]h]U refexplicith]h]h]hhhNhj uhM h]r6Ih)r7I}r8I(hj3Ih}r9I(h]h]r:I(hj5IXpy-classr;Ieh]h]h]uhj1Ih]rI}r?I(hUhj7IubahhubaubhX subclass of r@IrAI}rBI(hX subclass of hj Iubh)rCI}rDI(hX:class:`ConnectionPool`rEIhj Ihhhhh}rFI(UreftypeXclasshhXConnectionPoolU refdomainXpyrGIh]h]U refexplicith]h]h]hhhNhj uhM h]rHIh)rII}rJI(hjEIh}rKI(h]h]rLI(hjGIXpy-classrMIeh]h]h]uhjCIh]rNIhXConnectionPoolrOIrPI}rQI(hUhjIIubahhubaubhXC, which implements an equiality operation that avoids this problem.rRIrSI}rTI(hXC, which implements an equiality operation that avoids this problem.hj Iubeubh)rUI}rVI(hX Example use::rWIhj{Hhhhhh}rXI(h]h]h]h]h]uhM" hhh]rYIhX Example use:rZIr[I}r\I(hX Example use:hjUIubaubjS)r]I}r^I(hXfrom buildbot.steps.mtrlogobserver import MTR, EqConnectionPool myPool = EqConnectionPool("MySQLdb", "host", "buildbot", "password", "db") myFactory.addStep(MTR(workdir="mysql-test", dbpool=myPool, command=["perl", "mysql-test-run.pl", "--force"]))hj{HhhhjVh}r_I(jXjYh]h]h]h]h]uhM$ hhh]r`IhXfrom buildbot.steps.mtrlogobserver import MTR, EqConnectionPool myPool = EqConnectionPool("MySQLdb", "host", "buildbot", "password", "db") myFactory.addStep(MTR(workdir="mysql-test", dbpool=myPool, command=["perl", "mysql-test-run.pl", "--force"]))raIrbI}rcI(hUhj]Iubaubh)rdI}reI(hX(The :bb:step:`MTR` step's arguments are:rfIhj{Hhhhhh}rgI(h]h]h]h]h]uhM) hhh]rhI(hXThe riIrjI}rkI(hXThe hjdIubh)rlI}rmI(hX:bb:step:`MTR`rnIhjdIhhhhh}roI(UreftypeXstephhXMTRU refdomainXbbrpIh]h]U refexplicith]h]h]hhuhM) h]rqIh)rrI}rsI(hjnIh}rtI(h]h]ruI(hjpIXbb-steprvIeh]h]h]uhjlIh]rwIhXMTRrxIryI}rzI(hUhjrIubahhubaubhX step's arguments are:r{Ir|I}r}I(hX step's arguments are:hjdIubeubj)r~I}rI(hUhj{Hhhhjh}rI(h]h]h]h]h]uhNhhh]rI(j)rI}rI(hX``textLimit`` Maximum number of test failures to show on the waterfall page (to not flood the page in case of a large number of test failures. Defaults to 5. hj~Ihhhjh}rI(h]h]h]h]h]uhM- h]rI(j)rI}rI(hX ``textLimit``rIhjIhhhjh}rI(h]h]h]h]h]uhM- h]rIh)rI}rI(hjIh}rI(h]h]h]h]h]uhjIh]rIhX textLimitrIrI}rI(hUhjIubahhubaubj)rI}rI(hUh}rI(h]h]h]h]h]uhjIh]rIh)rI}rI(hXMaximum number of test failures to show on the waterfall page (to not flood the page in case of a large number of test failures. Defaults to 5.rIhjIhhhhh}rI(h]h]h]h]h]uhM, h]rIhXMaximum number of test failures to show on the waterfall page (to not flood the page in case of a large number of test failures. Defaults to 5.rIrI}rI(hjIhjIubaubahjubeubj)rI}rI(hX``testNameLimit`` Maximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16. hj~Ihhhjh}rI(h]h]h]h]h]uhM1 hhh]rI(j)rI}rI(hX``testNameLimit``rIhjIhhhjh}rI(h]h]h]h]h]uhM1 h]rIh)rI}rI(hjIh}rI(h]h]h]h]h]uhjIh]rIhX testNameLimitrIrI}rI(hUhjIubahhubaubj)rI}rI(hUh}rI(h]h]h]h]h]uhjIh]rIh)rI}rI(hXzMaximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16.rIhjIhhhhh}rI(h]h]h]h]h]uhM0 h]rIhXzMaximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16.rIrI}rI(hjIhjIubaubahjubeubj)rI}rI(hX``parallel`` Value of :option:`--parallel` option used for :file:`mysql-test-run.pl` (number of processes used to run the test suite in parallel). Defaults to 4. This is used to determine the number of server error log files to download from the slave. Specifying a too high value does not hurt (as nonexisting error logs will be ignored), however if using :option:`--parallel` value greater than the default it needs to be specified, or some server error logs will be missing. hj~Ihhhjh}rI(h]h]h]h]h]uhM9 hhh]rI(j)rI}rI(hX ``parallel``rIhjIhhhjh}rI(h]h]h]h]h]uhM9 h]rIh)rI}rI(hjIh}rI(h]h]h]h]h]uhjIh]rIhXparallelrIrI}rI(hUhjIubahhubaubj)rI}rI(hUh}rI(h]h]h]h]h]uhjIh]rIh)rI}rI(hXValue of :option:`--parallel` option used for :file:`mysql-test-run.pl` (number of processes used to run the test suite in parallel). Defaults to 4. This is used to determine the number of server error log files to download from the slave. Specifying a too high value does not hurt (as nonexisting error logs will be ignored), however if using :option:`--parallel` value greater than the default it needs to be specified, or some server error logs will be missing.hjIhhhhh}rI(h]h]h]h]h]uhM4 h]rI(hX Value of rIrI}rI(hX Value of hjIubh)rI}rI(hX:option:`--parallel`rIhjIhhhhh}rI(UreftypeXoptionhhX --parallelU refdomainXstdrIjNh]h]U refexplicith]h]h]hhuhM4 h]rIj)rI}rI(hjIh}rI(h]h]rI(hjIX std-optionrIeh]h]h]uhjIh]rIhX --parallelrIrI}rI(hUhjIubahjubaubhX option used for rIrI}rI(hX option used for hjIubh)rI}rI(hUh}rI(h]h]h]h]rIXfilerIaUrolejIh]uhjIh]rIhXmysql-test-run.plrIrI}rI(hXmysql-test-run.plhjIubahhubhX (number of processes used to run the test suite in parallel). Defaults to 4. This is used to determine the number of server error log files to download from the slave. Specifying a too high value does not hurt (as nonexisting error logs will be ignored), however if using rIrI}rI(hX (number of processes used to run the test suite in parallel). Defaults to 4. This is used to determine the number of server error log files to download from the slave. Specifying a too high value does not hurt (as nonexisting error logs will be ignored), however if using hjIubh)rI}rI(hX:option:`--parallel`rIhjIhhhhh}rI(UreftypeXoptionhhX --parallelU refdomainXstdrIjNh]h]U refexplicith]h]h]hhuhM4 h]rIj)rI}rI(hjIh}rI(h]h]rI(hjIX std-optionrIeh]h]h]uhjIh]rIhX --parallelrIrJ}rJ(hUhjIubahjubaubhXd value greater than the default it needs to be specified, or some server error logs will be missing.rJrJ}rJ(hXd value greater than the default it needs to be specified, or some server error logs will be missing.hjIubeubahjubeubj)rJ}rJ(hX``dbpool`` An instance of :class:`twisted.enterprise.adbapi.ConnectionPool`, or ``None``. Defaults to ``None``. If specified, results are inserted into the database using the :class:`ConnectionPool`. hj~Ihhhjh}rJ(h]h]h]h]h]uhM> hhh]rJ(j)r J}r J(hX ``dbpool``r JhjJhhhjh}r J(h]h]h]h]h]uhM> h]r Jh)rJ}rJ(hj Jh}rJ(h]h]h]h]h]uhj Jh]rJhXdbpoolrJrJ}rJ(hUhjJubahhubaubj)rJ}rJ(hUh}rJ(h]h]h]h]h]uhjJh]rJh)rJ}rJ(hXAn instance of :class:`twisted.enterprise.adbapi.ConnectionPool`, or ``None``. Defaults to ``None``. If specified, results are inserted into the database using the :class:`ConnectionPool`.hjJhhhhh}rJ(h]h]h]h]h]uhM< h]rJ(hXAn instance of rJrJ}rJ(hXAn instance of hjJubh)r J}r!J(hX1:class:`twisted.enterprise.adbapi.ConnectionPool`r"JhjJhhhhh}r#J(UreftypeXclasshhX(twisted.enterprise.adbapi.ConnectionPoolU refdomainXpyr$Jh]h]U refexplicith]h]h]hhhNhj uhM< h]r%Jh)r&J}r'J(hj"Jh}r(J(h]h]r)J(hj$JXpy-classr*Jeh]h]h]uhj Jh]r+JhX(twisted.enterprise.adbapi.ConnectionPoolr,Jr-J}r.J(hUhj&JubahhubaubhX, or r/Jr0J}r1J(hX, or hjJubh)r2J}r3J(hX``None``h}r4J(h]h]h]h]h]uhjJh]r5JhXNoner6Jr7J}r8J(hUhj2JubahhubhX. Defaults to r9Jr:J}r;J(hX. Defaults to hjJubh)rJ(h]h]h]h]h]uhjJh]r?JhXNoner@JrAJ}rBJ(hUhjKhXclass r?Kr@K}rAK(hUhj;Kubaubj )rBK}rCK(hXbuildbot.steps.subunit.hj5Khhhj h}rDK(h]h]h]h]h]uhM\ hhh]rEKhXbuildbot.steps.subunit.rFKrGK}rHK(hUhjBKubaubj )rIK}rJK(hXSubunitShellCommandhj5Khhhj h}rKK(h]h]h]h]h]uhM\ hhh]rLKhXSubunitShellCommandrMKrNK}rOK(hUhjIKubaubeubj )rPK}rQK(hUhj0Khhhj h}rRK(h]h]h]h]h]uhM\ hhh]ubeubh)rSK}rTK(hXThis buildstep is similar to :bb:step:`ShellCommand`, except that it runs the log content through a subunit filter to extract test and failure counts. ::hjKhhhhh}rUK(h]h]h]h]h]uhM] hhh]rVK(hXThis buildstep is similar to rWKrXK}rYK(hXThis buildstep is similar to hjSKubh)rZK}r[K(hX:bb:step:`ShellCommand`r\KhjSKhhhhh}r]K(UreftypeXstephhX ShellCommandU refdomainXbbr^Kh]h]U refexplicith]h]h]hhuhM] h]r_Kh)r`K}raK(hj\Kh}rbK(h]h]rcK(hj^KXbb-steprdKeh]h]h]uhjZKh]reKhX ShellCommandrfKrgK}rhK(hUhj`KubahhubaubhXb, except that it runs the log content through a subunit filter to extract test and failure counts.riKrjK}rkK(hXb, except that it runs the log content through a subunit filter to extract test and failure counts.hjSKubeubjS)rlK}rmK(hXjfrom buildbot.steps.subunit import SubunitShellCommand f.addStep(SubunitShellCommand(command="make test"))hjKhhhjVh}rnK(jXjYh]h]h]h]h]uhM` hhh]roKhXjfrom buildbot.steps.subunit import SubunitShellCommand f.addStep(SubunitShellCommand(command="make test"))rpKrqK}rrK(hUhjlKubaubh)rsK}rtK(hXThis runs ``make test`` and filters it through subunit. The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run.hjKhhhhh}ruK(h]h]h]h]h]uhMc hhh]rvK(hX This runs rwKrxK}ryK(hX This runs hjsKubh)rzK}r{K(hX ``make test``h}r|K(h]h]h]h]h]uhjsKh]r}KhX make testr~KrK}rK(hUhjzKubahhubhX and filters it through subunit. The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run.rKrK}rK(hX and filters it through subunit. The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run.hjsKubeubh)rK}rK(hXuIf ``failureOnNoTests`` is ``True``, this step will fail if no test is run. By default ``failureOnNoTests`` is False.hjKhhhhh}rK(h]h]h]h]h]uhMf hhh]rK(hXIf rKrK}rK(hXIf hjKubh)rK}rK(hX``failureOnNoTests``h}rK(h]h]h]h]h]uhjKh]rKhXfailureOnNoTestsrKrK}rK(hUhjKubahhubhX is rKrK}rK(hX is hjKubh)rK}rK(hX``True``h}rK(h]h]h]h]h]uhjKh]rKhXTruerKrK}rK(hUhjKubahhubhX4, this step will fail if no test is run. By default rKrK}rK(hX4, this step will fail if no test is run. By default hjKubh)rK}rK(hX``failureOnNoTests``h}rK(h]h]h]h]h]uhjKh]rKhXfailureOnNoTestsrKrK}rK(hUhjKubahhubhX is False.rKrK}rK(hX is False.hjKubeubh)rK}rK(hX.. _Slave-Filesystem-Steps:hjKhhhhh}rK(h]h]h]h]h]hjuhMi hhh]ubeubeubh)rK}rK(hUhhhhh}rKhjKshhh}rK(h]h]h]h]rK(jUid19rKeh]rK(hheuhMl hhh}rKjjKsh]rK(h)rK}rK(hjhjKhhhhh}rK(h]h]h]h]h]hjuhMl hhh]rKhXSlave Filesystem StepsrKrK}rK(hjhjKubaubh)rK}rK(hXAHere are some buildsteps for manipulating the slave's filesystem.rKhjKhhhhh}rK(h]h]h]h]h]uhMn hhh]rKhXAHere are some buildsteps for manipulating the slave's filesystem.rKrK}rK(hjKhjKubaubj)rK}rK(hUhjKhhhj h}rK(h]h]h]h]h]Uentries]rK((UsingleXBuild Steps; FileExistsXstep-FileExistsrKjKtrK(UsingleXFileExists Build StepjKjKtrKeuhMq hhh]ubh)rK}rK(hUhjKhhhhh}rK(h]h]h]h]h]hjKuhMq hhh]ubh)rK}rK(hUhjKhhh}hhh}rK(h]h]h]h]rK(jjKeh]rKhAauhMs hhh}rKjKjKsh]rK(h)rK}rK(hjhjKhhhhh}rK(h]h]h]h]h]hjuhMs hhh]rKhX FileExistsrKrK}rK(hjhjKubaubh)rK}rK(hXzThis step will assert that a given file exists, failing if it does not. The filename can be specified with a property. ::hjKhhhhh}rK(h]h]h]h]h]uhMu hhh]rKhXwThis step will assert that a given file exists, failing if it does not. The filename can be specified with a property.rKrK}rK(hXwThis step will assert that a given file exists, failing if it does not. The filename can be specified with a property.hjKubaubjS)rK}rK(hXSfrom buildbot.steps.slave import FileExists f.addStep(FileExists(file='test_data'))hjKhhhjVh}rK(jXjYh]h]h]h]h]uhMx hhh]rKhXSfrom buildbot.steps.slave import FileExists f.addStep(FileExists(file='test_data'))rKrK}rK(hUhjKubaubh)rK}rK(hX0This step requires slave version 0.8.4 or later.rKhjKhhhhh}rK(h]h]h]h]h]uhM{ hhh]rKhX0This step requires slave version 0.8.4 or later.rKrK}rK(hjKhjKubaubj)rK}rK(hUhjKhhhj h}rK(h]h]h]h]h]Uentries]rK((UsingleXBuild Steps; CopyDirectoryXstep-CopyDirectoryrKjKtrK(UsingleXCopyDirectory Build StepjKjKtrKeuhM~ hhh]ubh)rK}rK(hUhjKhhhhh}rK(h]h]h]h]h]hjKuhM~ hhh]ubeubh)rK}rK(hUhjKhhh}hhh}rK(h]h]h]h]rK(j#jKeh]rLhauhM hhh}rLjKjKsh]rL(h)rL}rL(hj(hjKhhhhh}rL(h]h]h]h]h]hj"uhM hhh]rLhX CopyDirectoryrLrL}r L(hj(hjLubaubh)r L}r L(hX0This command copies a directory on the slave. ::r LhjKhhhhh}r L(h]h]h]h]h]uhM hhh]rLhX-This command copies a directory on the slave.rLrL}rL(hX-This command copies a directory on the slave.hj LubaubjS)rL}rL(hXjfrom buildbot.steps.slave import CopyDirectory f.addStep(CopyDirectory(src="build/data", dest="tmp/data"))hjKhhhjVh}rL(jXjYh]h]h]h]h]uhM hhh]rLhXjfrom buildbot.steps.slave import CopyDirectory f.addStep(CopyDirectory(src="build/data", dest="tmp/data"))rLrL}rL(hUhjLubaubh)rL}rL(hX0This step requires slave version 0.8.5 or later.rLhjKhhhhh}rL(h]h]h]h]h]uhM hhh]rLhX0This step requires slave version 0.8.5 or later.rLrL}r L(hjLhjLubaubh)r!L}r"L(hX5The CopyDirectory step takes the following arguments:r#LhjKhhhhh}r$L(h]h]h]h]h]uhM hhh]r%LhX5The CopyDirectory step takes the following arguments:r&Lr'L}r(L(hj#Lhj!Lubaubj)r)L}r*L(hUhjKhhhjh}r+L(h]h]h]h]h]uhNhhh]r,L(j)r-L}r.L(hX``timeout`` if the copy command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 120 seconds. Pass ``None`` to disable. hj)Lhhhjh}r/L(h]h]h]h]h]uhM h]r0L(j)r1L}r2L(hX ``timeout``r3Lhj-Lhhhjh}r4L(h]h]h]h]h]uhM h]r5Lh)r6L}r7L(hj3Lh}r8L(h]h]h]h]h]uhj1Lh]r9LhXtimeoutr:Lr;L}rL(hUh}r?L(h]h]h]h]h]uhj-Lh]r@Lh)rAL}rBL(hXif the copy command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 120 seconds. Pass ``None`` to disable.hj=Lhhhhh}rCL(h]h]h]h]h]uhM h]rDL(hXif the copy command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 120 seconds. Pass rELrFL}rGL(hXif the copy command fails to produce any output for this many seconds, it is assumed to be locked up and will be killed. This defaults to 120 seconds. Pass hjALubh)rHL}rIL(hX``None``h}rJL(h]h]h]h]h]uhjALh]rKLhXNonerLLrML}rNL(hUhjHLubahhubhX to disable.rOLrPL}rQL(hX to disable.hjALubeubahjubeubj)rRL}rSL(hXp``maxTime`` if the command takes longer than this many seconds, it will be killed. This is disabled by default. hj)Lhhhjh}rTL(h]h]h]h]h]uhM hhh]rUL(j)rVL}rWL(hX ``maxTime``rXLhjRLhhhjh}rYL(h]h]h]h]h]uhM h]rZLh)r[L}r\L(hjXLh}r]L(h]h]h]h]h]uhjVLh]r^LhXmaxTimer_Lr`L}raL(hUhj[Lubahhubaubj)rbL}rcL(hUh}rdL(h]h]h]h]h]uhjRLh]reLh)rfL}rgL(hXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.rhLhjbLhhhhh}riL(h]h]h]h]h]uhM h]rjLhXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.rkLrlL}rmL(hjhLhjfLubaubahjubeubeubj)rnL}roL(hUhjKhhhj h}rpL(h]h]h]h]h]Uentries]rqL((UsingleXBuild Steps; RemoveDirectoryXstep-RemoveDirectoryrrLjrLtrsL(UsingleXRemoveDirectory Build StepjrLjrLtrtLeuhM hhh]ubh)ruL}rvL(hUhjKhhhhh}rwL(h]h]h]h]h]hjrLuhM hhh]ubeubh)rxL}ryL(hUhjKhhh}hhh}rzL(h]h]h]h]r{L(j6jrLeh]r|LhauhM hhh}r}LjrLjuLsh]r~L(h)rL}rL(hj;hjxLhhhhh}rL(h]h]h]h]h]hj5uhM hhh]rLhXRemoveDirectoryrLrL}rL(hj;hjLubaubh)rL}rL(hX=This command recursively deletes a directory on the slave. ::rLhjxLhhhhh}rL(h]h]h]h]h]uhM hhh]rLhX:This command recursively deletes a directory on the slave.rLrL}rL(hX:This command recursively deletes a directory on the slave.hjLubaubjS)rL}rL(hX^from buildbot.steps.slave import RemoveDirectory f.addStep(RemoveDirectory(dir="build/build"))hjxLhhhjVh}rL(jXjYh]h]h]h]h]uhM hhh]rLhX^from buildbot.steps.slave import RemoveDirectory f.addStep(RemoveDirectory(dir="build/build"))rLrL}rL(hUhjLubaubh)rL}rL(hX0This step requires slave version 0.8.4 or later.rLhjxLhhhhh}rL(h]h]h]h]h]uhM hhh]rLhX0This step requires slave version 0.8.4 or later.rLrL}rL(hjLhjLubaubj)rL}rL(hUhjxLhhhj h}rL(h]h]h]h]h]Uentries]rL((UsingleXBuild Steps; MakeDirectoryXstep-MakeDirectoryrLjLtrL(UsingleXMakeDirectory Build StepjLjLtrLeuhM hhh]ubh)rL}rL(hUhjxLhhhhh}rL(h]h]h]h]h]hjLuhM hhh]ubeubh)rL}rL(hUhjKhhh}hhh}rL(h]h]h]h]rL(jIjLeh]rLhpauhM hhh}rLjLjLsh]rL(h)rL}rL(hjNhjLhhhhh}rL(h]h]h]h]h]hjHuhM hhh]rLhX MakeDirectoryrLrL}rL(hjNhjLubaubh)rL}rL(hX1This command creates a directory on the slave. ::rLhjLhhhhh}rL(h]h]h]h]h]uhM hhh]rLhX.This command creates a directory on the slave.rLrL}rL(hX.This command creates a directory on the slave.hjLubaubjS)rL}rL(hXZfrom buildbot.steps.slave import MakeDirectory f.addStep(MakeDirectory(dir="build/build"))hjLhhhjVh}rL(jXjYh]h]h]h]h]uhM hhh]rLhXZfrom buildbot.steps.slave import MakeDirectory f.addStep(MakeDirectory(dir="build/build"))rLrL}rL(hUhjLubaubh)rL}rL(hX0This step requires slave version 0.8.5 or later.rLhjLhhhhh}rL(h]h]h]h]h]uhM hhh]rLhX0This step requires slave version 0.8.5 or later.rLrL}rL(hjLhjLubaubh)rL}rL(hX.. _Python-BuildSteps:hjLhhhhh}rL(h]h]h]h]h]hj\uhM hhh]ubeubeubh)rL}rL(hUhhhhh}rLhMjLshhh}rL(h]h]h]h]rL(j\Uid20rLeh]rL(hhMeuhM hhh}rLj\jLsh]rL(h)rL}rL(hjahjLhhhhh}rL(h]h]h]h]h]hj[uhM hhh]rLhXPython BuildStepsrLrL}rL(hjahjLubaubh)rL}rL(hXcHere are some :class:`BuildStep`\s that are specifically useful for projects implemented in Python.hjLhhhhh}rL(h]h]h]h]h]uhM hhh]rL(hXHere are some rLrL}rL(hXHere are some hjLubh)rL}rL(hX:class:`BuildStep`rLhjLhhhhh}rL(UreftypeXclasshhX BuildStepU refdomainXpyrLh]h]U refexplicith]h]h]hhhNhj uhM h]rLh)rL}rL(hjLh}rL(h]h]rL(hjLXpy-classrLeh]h]h]uhjLh]rLhX BuildSteprLrL}rL(hUhjLubahhubaubhXBs that are specifically useful for projects implemented in Python.rLrL}rL(hXC\s that are specifically useful for projects implemented in Python.hjLubeubj)rL}rL(hUhjLhhhj h}rL(h]h]h]h]h]Uentries]rL((UsingleXBuild Steps; BuildEPYDocXstep-BuildEPYDocrLjLtrL(UsingleXBuildEPYDoc Build StepjLjLtrLeuhM hhh]ubh)rL}rM(hUhjLhhhhh}rM(h]h]h]h]h]hjLuhM hhh]ubh)rM}rM(hX.. _Step-BuildEPYDoc:hjLhhh}hhh}rM(h]h]h]h]h]hUstep-buildepydocrMuhM hhh}rMjLjLsh]ubh)rM}rM(hUhjLhhh}r Mh[jMshhh}r M(h]h]h]h]r M(jsjMjLeh]r M(hPh[euhM hhh}r M(jLjLjMjMuh]rM(h)rM}rM(hjxhjMhhhhh}rM(h]h]h]h]h]hjruhM hhh]rMhX BuildEPYDocrMrM}rM(hjxhjMubaubj)rM}rM(hUhjMhNhj h}rM(h]h]h]h]h]Uentries]rM(jXBbuildbot.steps.python.BuildEPYDoc (class in buildbot.steps.source)hUtrMauhNhhh]ubj )rM}rM(hUhjMhNhj h}rM(j j Xpyh]h]h]h]h]j XclassrMj jMuhNhhh]rM(j )r M}r!M(hX!buildbot.steps.python.BuildEPYDochjMhhhj h}r"M(h]r#Mhaj j h]h]h]h]r$Mhaj X!buildbot.steps.python.BuildEPYDocj Xbuildbot.steps.pythonj uhM hhh]r%M(j )r&M}r'M(hXclass hj Mhhhj h}r(M(h]h]h]h]h]uhM hhh]r)MhXclass r*Mr+M}r,M(hUhj&Mubaubj )r-M}r.M(hXbuildbot.steps.python.hj Mhhhj h}r/M(h]h]h]h]h]uhM hhh]r0MhXbuildbot.steps.python.r1Mr2M}r3M(hUhj-Mubaubj )r4M}r5M(hX BuildEPYDochj Mhhhj h}r6M(h]h]h]h]h]uhM hhh]r7MhX BuildEPYDocr8Mr9M}r:M(hUhj4Mubaubeubj )r;M}rM}r?M(hX,`epydoc `_ is a tool for generating API documentation for Python modules from their docstrings. It reads all the :file:`.py` files from your source tree, processes the docstrings therein, and creates a large tree of :file:`.html` files (or a single :file:`.pdf` file).hjMhhhhh}r@M(h]h]h]h]h]uhM hhh]rAM(jM)rBM}rCM(hX*`epydoc `_h}rDM(Unamehj Xhttp://epydoc.sourceforge.net/rEMh]h]h]h]h]uhj>Mh]rFMhXepydocrGMrHM}rIM(hUhjBMubahjYubh)rJM}rKM(hX! hKhj>Mhhh}rLM(UrefurijEMh]rMMUepydocrNMah]h]h]h]rOMhauh]ubhXg is a tool for generating API documentation for Python modules from their docstrings. It reads all the rPMrQM}rRM(hXg is a tool for generating API documentation for Python modules from their docstrings. It reads all the hj>Mubh)rSM}rTM(hUh}rUM(h]h]h]h]rVMXfilerWMaUrolejWMh]uhj>Mh]rXMhX.pyrYMrZM}r[M(hX.pyhjSMubahhubhX\ files from your source tree, processes the docstrings therein, and creates a large tree of r\Mr]M}r^M(hX\ files from your source tree, processes the docstrings therein, and creates a large tree of hj>Mubh)r_M}r`M(hUh}raM(h]h]h]h]rbMXfilercMaUrolejcMh]uhj>Mh]rdMhX.htmlreMrfM}rgM(hX.htmlhj_MubahhubhX files (or a single rhMriM}rjM(hX files (or a single hj>Mubh)rkM}rlM(hUh}rmM(h]h]h]h]rnMXfileroMaUrolejoMh]uhj>Mh]rpMhX.pdfrqMrrM}rsM(hX.pdfhjkMubahhubhX file).rtMruM}rvM(hX file).hj>Mubeubh)rwM}rxM(hXThe :bb:step:`BuildEPYDoc` step will run :command:`epydoc` to produce this API documentation, and will count the errors and warnings from its output.hjMhhhhh}ryM(h]h]h]h]h]uhM hhh]rzM(hXThe r{Mr|M}r}M(hXThe hjwMubh)r~M}rM(hX:bb:step:`BuildEPYDoc`rMhjwMhhhhh}rM(UreftypeXstephhX BuildEPYDocU refdomainXbbrMh]h]U refexplicith]h]h]hhuhM h]rMh)rM}rM(hjMh}rM(h]h]rM(hjMXbb-steprMeh]h]h]uhj~Mh]rMhX BuildEPYDocrMrM}rM(hUhjMubahhubaubhX step will run rMrM}rM(hX step will run hjwMubjL)rM}rM(hX:command:`epydoc`h}rM(h]h]rMjQah]h]h]uhjwMh]rMhXepydocrMrM}rM(hUhjMubahjVubhX[ to produce this API documentation, and will count the errors and warnings from its output.rMrM}rM(hX[ to produce this API documentation, and will count the errors and warnings from its output.hjwMubeubh)rM}rM(hX_You must supply the command line to be used. The default is ``make epydocs``, which assumes that your project has a :file:`Makefile` with an `epydocs` target. You might wish to use something like :samp:`epydoc -o apiref source/{PKGNAME}` instead. You might also want to add :option:`--pdf` to generate a PDF file instead of a large tree of HTML files.hjMhhhhh}rM(h]h]h]h]h]uhM hhh]rM(hX<You must supply the command line to be used. The default is rMrM}rM(hX<You must supply the command line to be used. The default is hjMubh)rM}rM(hX``make epydocs``h}rM(h]h]h]h]h]uhjMh]rMhX make epydocsrMrM}rM(hUhjMubahhubhX(, which assumes that your project has a rMrM}rM(hX(, which assumes that your project has a hjMubh)rM}rM(hUh}rM(h]h]h]h]rMXfilerMaUrolejMh]uhjMh]rMhXMakefilerMrM}rM(hXMakefilehjMubahhubhX with an rMrM}rM(hX with an hjMubjE)rM}rM(hX `epydocs`h}rM(h]h]h]h]h]uhjMh]rMhXepydocsrMrM}rM(hUhjMubahjMubhX. target. You might wish to use something like rMrM}rM(hX. target. You might wish to use something like hjMubh)rM}rM(hUh}rM(h]h]h]h]rMXsamprMaUrolejMh]uhjMh]rM(hXepydoc -o apiref source/rMrM}rM(hXepydoc -o apiref source/hjMubjW)rM}rM(hXPKGNAMEh}rM(h]h]h]h]h]uhjMh]rMhXPKGNAMErMrM}rM(hUhjMubahjaubehhubhX% instead. You might also want to add rMrM}rM(hX% instead. You might also want to add hjMubh)rM}rM(hX:option:`--pdf`rMhjMhhhhh}rM(UreftypeXoptionhhX--pdfU refdomainXstdrMjNh]h]U refexplicith]h]h]hhuhM h]rMj)rM}rM(hjMh}rM(h]h]rM(hjMX std-optionrMeh]h]h]uhjMh]rMhX--pdfrMrM}rM(hUhjMubahjubaubhX> to generate a PDF file instead of a large tree of HTML files.rMrM}rM(hX> to generate a PDF file instead of a large tree of HTML files.hjMubeubh)rM}rM(hXThe API docs are generated in-place in the build tree (under the workdir, in the subdirectory controlled by the :option:`-o` argument). To make them useful, you will probably have to copy them to somewhere they can be read. A command like ``rsync -ad apiref/ dev.example.com:~public_html/current-apiref/`` might be useful. You might instead want to bundle them into a tarball and publish it in the same place where the generated install tarball is placed. ::hjMhhhhh}rM(h]h]h]h]h]uhM hhh]rM(hXpThe API docs are generated in-place in the build tree (under the workdir, in the subdirectory controlled by the rMrM}rM(hXpThe API docs are generated in-place in the build tree (under the workdir, in the subdirectory controlled by the hjMubh)rM}rM(hX :option:`-o`rMhjMhhhhh}rM(UreftypeXoptionhhX-oU refdomainXstdrMjNh]h]U refexplicith]h]h]hhuhM h]rMj)rM}rM(hjMh}rM(h]h]rM(hjMX std-optionrMeh]h]h]uhjMh]rMhX-orMrM}rM(hUhjMubahjubaubhXs argument). To make them useful, you will probably have to copy them to somewhere they can be read. A command like rMrM}rM(hXs argument). To make them useful, you will probably have to copy them to somewhere they can be read. A command like hjMubh)rN}rN(hXB``rsync -ad apiref/ dev.example.com:~public_html/current-apiref/``h}rN(h]h]h]h]h]uhjMh]rNhX>rsync -ad apiref/ dev.example.com:~public_html/current-apiref/rNrN}rN(hUhjNubahhubhX might be useful. You might instead want to bundle them into a tarball and publish it in the same place where the generated install tarball is placed.rNrN}r N(hX might be useful. You might instead want to bundle them into a tarball and publish it in the same place where the generated install tarball is placed.hjMubeubjS)r N}r N(hXxfrom buildbot.steps.python import BuildEPYDoc f.addStep(BuildEPYDoc(command=["epydoc", "-o", "apiref", "source/mypkg"]))hjMhhhjVh}r N(jXjYh]h]h]h]h]uhM hhh]r NhXxfrom buildbot.steps.python import BuildEPYDoc f.addStep(BuildEPYDoc(command=["epydoc", "-o", "apiref", "source/mypkg"]))rNrN}rN(hUhj Nubaubj)rN}rN(hUhjMhhhj h}rN(h]h]h]h]h]Uentries]rN((UsingleXBuild Steps; PyFlakesX step-PyFlakesrNjNtrN(UsingleXPyFlakes Build StepjNjNtrNeuhM hhh]ubh)rN}rN(hUhjMhhhhh}rN(h]h]h]h]h]hjNuhM hhh]ubh)rN}rN(hX.. _Step-PyFlake:hjMhhh}hhh}rN(h]h]h]h]h]hU step-pyflakerNuhM hhh}rNjNjNsh]ubeubh)r N}r!N(hUhKhjLhhh}r"Nh~jNshhh}r#N(h]r$NXpyflakesr%Nah]h]h]r&N(jjNjNeh]r'Nh~auhM hhh}r(N(jNjNjNjNuh]r)N(h)r*N}r+N(hjhj Nhhhhh}r,N(h]h]h]h]h]hjuhM hhh]r-NhXPyFlakesr.Nr/N}r0N(hjhj*Nubaubj)r1N}r2N(hUhj NhNhj h}r3N(h]h]h]h]h]Uentries]r4N(jX?buildbot.steps.python.PyFlakes (class in buildbot.steps.source)h|Utr5NauhNhhh]ubj )r6N}r7N(hUhj NhNhj h}r8N(j j Xpyh]h]h]h]h]j Xclassr9Nj j9NuhNhhh]r:N(j )r;N}rNh|aj j h]h]h]h]r?Nh|aj Xbuildbot.steps.python.PyFlakesj Xbuildbot.steps.pythonj uhM hhh]r@N(j )rAN}rBN(hXclass hj;Nhhhj h}rCN(h]h]h]h]h]uhM hhh]rDNhXclass rENrFN}rGN(hUhjANubaubj )rHN}rIN(hXbuildbot.steps.python.hj;Nhhhj h}rJN(h]h]h]h]h]uhM hhh]rKNhXbuildbot.steps.python.rLNrMN}rNN(hUhjHNubaubj )rON}rPN(hXPyFlakeshj;Nhhhj h}rQN(h]h]h]h]h]uhM hhh]rRNhXPyFlakesrSNrTN}rUN(hUhjONubaubeubj )rVN}rWN(hUhj6Nhhhj h}rXN(h]h]h]h]h]uhM hhh]ubeubh)rYN}rZN(hX`PyFlakes `_ is a tool to perform basic static analysis of Python code to look for simple errors, like missing imports and references of undefined names. It is like a fast and simple form of the C :command:`lint` program. Other tools (like `pychecker `_\) provide more detailed results but take longer to run.hj Nhhhhh}r[N(h]h]h]h]h]uhM hhh]r\N(jM)r]N}r^N(hX8`PyFlakes `_h}r_N(UnameXPyFlakesj X*http://divmod.org/trac/wiki/DivmodPyflakesr`Nh]h]h]h]h]uhjYNh]raNhXPyFlakesrbNrcN}rdN(hUhj]NubahjYubh)reN}rfN(hX- hKhjYNhhh}rgN(Urefurij`Nh]rhNUid21riNah]h]h]h]rjNj%Nauh]ubhX is a tool to perform basic static analysis of Python code to look for simple errors, like missing imports and references of undefined names. It is like a fast and simple form of the C rkNrlN}rmN(hX is a tool to perform basic static analysis of Python code to look for simple errors, like missing imports and references of undefined names. It is like a fast and simple form of the C hjYNubjL)rnN}roN(hX:command:`lint`h}rpN(h]h]rqNjQah]h]h]uhjYNh]rrNhXlintrsNrtN}ruN(hUhjnNubahjVubhX program. Other tools (like rvNrwN}rxN(hX program. Other tools (like hjYNubjM)ryN}rzN(hX0`pychecker `_h}r{N(Unamehsj X!http://pychecker.sourceforge.net/r|Nh]h]h]h]h]uhjYNh]r}NhX pycheckerr~NrN}rN(hUhjyNubahjYubh)rN}rN(hX$ hKhjYNhhh}rN(Urefurij|Nh]rNU pycheckerrNah]h]h]h]rNhsauh]ubhX7) provide more detailed results but take longer to run.rNrN}rN(hX8\) provide more detailed results but take longer to run.hjYNubeubh)rN}rN(hXmThe :bb:step:`PyFlakes` step will run pyflakes and count the various kinds of errors and warnings it detects.hj Nhhhhh}rN(h]h]h]h]h]uhM hhh]rN(hXThe rNrN}rN(hXThe hjNubh)rN}rN(hX:bb:step:`PyFlakes`rNhjNhhhhh}rN(UreftypeXstephhXPyFlakesU refdomainXbbrNh]h]U refexplicith]h]h]hhuhM h]rNh)rN}rN(hjNh}rN(h]h]rN(hjNXbb-steprNeh]h]h]uhjNh]rNhXPyFlakesrNrN}rN(hUhjNubahhubaubhXV step will run pyflakes and count the various kinds of errors and warnings it detects.rNrN}rN(hXV step will run pyflakes and count the various kinds of errors and warnings it detects.hjNubeubh)rN}rN(hXYou must supply the command line to be used. The default is ``make pyflakes``, which assumes you have a top-level :file:`Makefile` with a ``pyflakes`` target. You might want to use something like ``pyflakes .`` or ``pyflakes src``. ::hj Nhhhhh}rN(h]h]h]h]h]uhM hhh]rN(hX<You must supply the command line to be used. The default is rNrN}rN(hX<You must supply the command line to be used. The default is hjNubh)rN}rN(hX``make pyflakes``h}rN(h]h]h]h]h]uhjNh]rNhX make pyflakesrNrN}rN(hUhjNubahhubhX%, which assumes you have a top-level rNrN}rN(hX%, which assumes you have a top-level hjNubh)rN}rN(hUh}rN(h]h]h]h]rNXfilerNaUrolejNh]uhjNh]rNhXMakefilerNrN}rN(hXMakefilehjNubahhubhX with a rNrN}rN(hX with a hjNubh)rN}rN(hX ``pyflakes``h}rN(h]h]h]h]h]uhjNh]rNhXpyflakesrNrN}rN(hUhjNubahhubhX. target. You might want to use something like rNrN}rN(hX. target. You might want to use something like hjNubh)rN}rN(hX``pyflakes .``h}rN(h]h]h]h]h]uhjNh]rNhX pyflakes .rNrN}rN(hUhjNubahhubhX or rNrN}rN(hX or hjNubh)rN}rN(hX``pyflakes src``h}rN(h]h]h]h]h]uhjNh]rNhX pyflakes srcrNrN}rN(hUhjNubahhubhX.rN}rN(hX.hjNubeubjS)rN}rN(hX[from buildbot.steps.python import PyFlakes f.addStep(PyFlakes(command=["pyflakes", "src"]))hj NhhhjVh}rN(jXjYh]h]h]h]h]uhM hhh]rNhX[from buildbot.steps.python import PyFlakes f.addStep(PyFlakes(command=["pyflakes", "src"]))rNrN}rN(hUhjNubaubj)rN}rN(hUhj Nhhhj h}rN(h]h]h]h]h]Uentries]rN((UsingleXBuild Steps; SphinxX step-SphinxrNjNtrN(UsingleXSphinx Build StepjNjNtrNeuhM hhh]ubh)rN}rN(hUhj Nhhhhh}rN(h]h]h]h]h]hjNuhM hhh]ubh)rN}rN(hX.. _Step-Sphinx:hj Nhhh}hhh}rN(h]h]h]h]h]hU step-sphinxrNuhM hhh}rNjNjNsh]ubeubh)rN}rN(hUhKhjLhhh}rNh@jNshhh}rN(h]rNXsphinxrNah]h]h]rN(jjNjNeh]rNh@auhM hhh}rN(jNjNjNjNuh]rN(h)rN}rN(hjhjNhhhhh}rN(h]h]h]h]h]hjuhM hhh]rOhXSphinxrOrO}rO(hjhjNubaubj)rO}rO(hUhjNhNhj h}rO(h]h]h]h]h]Uentries]rO(jX=buildbot.steps.python.Sphinx (class in buildbot.steps.source)h$UtrOauhNhhh]ubj )r O}r O(hUhjNhNhj h}r O(j j Xpyh]h]h]h]h]j Xclassr Oj j OuhNhhh]r O(j )rO}rO(hXbuildbot.steps.python.Sphinxhj Ohhhj h}rO(h]rOh$aj j h]h]h]h]rOh$aj Xbuildbot.steps.python.Sphinxj Xbuildbot.steps.pythonj uhM hhh]rO(j )rO}rO(hXclass hjOhhhj h}rO(h]h]h]h]h]uhM hhh]rOhXclass rOrO}rO(hUhjOubaubj )rO}rO(hXbuildbot.steps.python.hjOhhhj h}rO(h]h]h]h]h]uhM hhh]rOhXbuildbot.steps.python.rOr O}r!O(hUhjOubaubj )r"O}r#O(hXSphinxhjOhhhj h}r$O(h]h]h]h]h]uhM hhh]r%OhXSphinxr&Or'O}r(O(hUhj"Oubaubeubj )r)O}r*O(hUhj Ohhhj h}r+O(h]h]h]h]h]uhM hhh]ubeubh)r,O}r-O(hX`Sphinx `_ is the Python Documentation Generator. It uses `RestructuredText `_ as input format.hjNhhhhh}r.O(h]h]h]h]h]uhM hhh]r/O(jM)r0O}r1O(hX$`Sphinx `_h}r2O(UnameXSphinxj Xhttp://sphinx.pocoo.org/r3Oh]h]h]h]h]uhj,Oh]r4OhXSphinxr5Or6O}r7O(hUhj0OubahjYubh)r8O}r9O(hX hKhj,Ohhh}r:O(Urefurij3Oh]r;OUid22rOr?O}r@O(hX1 is the Python Documentation Generator. It uses hj,OubjM)rAO}rBO(hX>`RestructuredText `_h}rCO(UnameXRestructuredTextj X(http://docutils.sourceforge.net/rst.htmlrDOh]h]h]h]h]uhj,Oh]rEOhXRestructuredTextrFOrGO}rHO(hUhjAOubahjYubh)rIO}rJO(hX+ hKhj,Ohhh}rKO(UrefurijDOh]rLOUrestructuredtextrMOah]h]h]h]rNOhauh]ubhX as input format.rOOrPO}rQO(hX as input format.hj,Oubeubh)rRO}rSO(hXThe :bb:step:`Sphinx` step will run :program:`sphinx-build` or any other program specified in its ``sphinx`` argument and count the various warnings and error it detects. ::hjNhhhhh}rTO(h]h]h]h]h]uhM hhh]rUO(hXThe rVOrWO}rXO(hXThe hjROubh)rYO}rZO(hX:bb:step:`Sphinx`r[OhjROhhhhh}r\O(UreftypeXstephhXSphinxU refdomainXbbr]Oh]h]U refexplicith]h]h]hhuhM h]r^Oh)r_O}r`O(hj[Oh}raO(h]h]rbO(hj]OXbb-steprcOeh]h]h]uhjYOh]rdOhXSphinxreOrfO}rgO(hUhj_OubahhubaubhX step will run rhOriO}rjO(hX step will run hjROubjL)rkO}rlO(hX:program:`sphinx-build`h}rmO(h]h]rnOUprogramroOah]h]h]uhjROh]rpOhX sphinx-buildrqOrrO}rsO(hUhjkOubahjVubhX' or any other program specified in its rtOruO}rvO(hX' or any other program specified in its hjROubh)rwO}rxO(hX ``sphinx``h}ryO(h]h]h]h]h]uhjROh]rzOhXsphinxr{Or|O}r}O(hUhjwOubahhubhX> argument and count the various warnings and error it detects.r~OrO}rO(hX> argument and count the various warnings and error it detects.hjROubeubjS)rO}rO(hXTfrom buildbot.steps.python import Sphinx f.addStep(Sphinx(sphinx_builddir="_build"))hjNhhhjVh}rO(jXjYh]h]h]h]h]uhM hhh]rOhXTfrom buildbot.steps.python import Sphinx f.addStep(Sphinx(sphinx_builddir="_build"))rOrO}rO(hUhjOubaubh)rO}rO(hX(This step takes the following arguments:rOhjNhhhhh}rO(h]h]h]h]h]uhM hhh]rOhX(This step takes the following arguments:rOrO}rO(hjOhjOubaubj)rO}rO(hUhjNhhhjh}rO(h]h]h]h]h]uhNhhh]rO(j)rO}rO(hX```sphinx_builddir`` (required) Name of the directory where the documentation will be generated. hjOhhhjh}rO(h]h]h]h]h]uhM h]rO(j)rO}rO(hX``sphinx_builddir``rOhjOhhhjh}rO(h]h]h]h]h]uhM h]rOh)rO}rO(hjOh}rO(h]h]h]h]h]uhjOh]rOhXsphinx_builddirrOrO}rO(hUhjOubahhubaubj)rO}rO(hUh}rO(h]h]h]h]h]uhjOh]rOh)rO}rO(hXK(required) Name of the directory where the documentation will be generated.rOhjOhhhhh}rO(h]h]h]h]h]uhM h]rOhXK(required) Name of the directory where the documentation will be generated.rOrO}rO(hjOhjOubaubahjubeubj)rO}rO(hXv``sphinx_sourcedir`` (optional, defaulting to ``.``), Name the directory where the :file:`conf.py` file will be found hjOhhhjh}rO(h]h]h]h]h]uhM hhh]rO(j)rO}rO(hX``sphinx_sourcedir``rOhjOhhhjh}rO(h]h]h]h]h]uhM h]rOh)rO}rO(hjOh}rO(h]h]h]h]h]uhjOh]rOhXsphinx_sourcedirrOrO}rO(hUhjOubahhubaubj)rO}rO(hUh}rO(h]h]h]h]h]uhjOh]rOh)rO}rO(hX`(optional, defaulting to ``.``), Name the directory where the :file:`conf.py` file will be foundhjOhhhhh}rO(h]h]h]h]h]uhM h]rO(hX(optional, defaulting to rOrO}rO(hX(optional, defaulting to hjOubh)rO}rO(hX``.``h}rO(h]h]h]h]h]uhjOh]rOhX.rO}rO(hUhjOubahhubhX ), Name the directory where the rOrO}rO(hX ), Name the directory where the hjOubh)rO}rO(hUh}rO(h]h]h]h]rOXfilerOaUrolejOh]uhjOh]rOhXconf.pyrOrO}rO(hXconf.pyhjOubahhubhX file will be foundrOrO}rO(hX file will be foundhjOubeubahjubeubj)rO}rO(hX<``sphinx_builder`` (optional) Indicates the builder to use. hjOhhhjh}rO(h]h]h]h]h]uhM hhh]rO(j)rO}rO(hX``sphinx_builder``rOhjOhhhjh}rO(h]h]h]h]h]uhM h]rOh)rO}rO(hjOh}rO(h]h]h]h]h]uhjOh]rOhXsphinx_builderrOrO}rO(hUhjOubahhubaubj)rO}rO(hUh}rO(h]h]h]h]h]uhjOh]rOh)rO}rO(hX((optional) Indicates the builder to use.rOhjOhhhhh}rO(h]h]h]h]h]uhM h]rOhX((optional) Indicates the builder to use.rOrO}rO(hjOhjOubaubahjubeubj)rO}rO(hX^``sphinx`` (optional, defaulting to :program:`sphinx-build`) Indicates the executable to run. hjOhhhjh}rO(h]h]h]h]h]uhM hhh]rO(j)rP}rP(hX ``sphinx``rPhjOhhhjh}rP(h]h]h]h]h]uhM h]rPh)rP}rP(hjPh}rP(h]h]h]h]h]uhjPh]rPhXsphinxr Pr P}r P(hUhjPubahhubaubj)r P}r P(hUh}rP(h]h]h]h]h]uhjOh]rPh)rP}rP(hXR(optional, defaulting to :program:`sphinx-build`) Indicates the executable to run.hj Phhhhh}rP(h]h]h]h]h]uhM h]rP(hX(optional, defaulting to rPrP}rP(hX(optional, defaulting to hjPubjL)rP}rP(hX:program:`sphinx-build`h}rP(h]h]rPjoOah]h]h]uhjPh]rPhX sphinx-buildrPrP}rP(hUhjPubahjVubhX") Indicates the executable to run.rPr P}r!P(hX") Indicates the executable to run.hjPubeubahjubeubj)r"P}r#P(hXH``tags`` (optional) List of ``tags`` to pass to :program:`sphinx-build` hjOhhhjh}r$P(h]h]h]h]h]uhM hhh]r%P(j)r&P}r'P(hX``tags``r(Phj"Phhhjh}r)P(h]h]h]h]h]uhM h]r*Ph)r+P}r,P(hj(Ph}r-P(h]h]h]h]h]uhj&Ph]r.PhXtagsr/Pr0P}r1P(hUhj+Pubahhubaubj)r2P}r3P(hUh}r4P(h]h]h]h]h]uhj"Ph]r5Ph)r6P}r7P(hX>(optional) List of ``tags`` to pass to :program:`sphinx-build`hj2Phhhhh}r8P(h]h]h]h]h]uhM h]r9P(hX(optional) List of r:Pr;P}rP(hX``tags``h}r?P(h]h]h]h]h]uhj6Ph]r@PhXtagsrAPrBP}rCP(hUhj=PubahhubhX to pass to rDPrEP}rFP(hX to pass to hj6PubjL)rGP}rHP(hX:program:`sphinx-build`h}rIP(h]h]rJPjoOah]h]h]uhj6Ph]rKPhX sphinx-buildrLPrMP}rNP(hUhjGPubahjVubeubahjubeubj)rOP}rPP(hX^``defines`` (optional) Dictionary of defines to overwrite values of the :file:`conf.py` file. hjOhhhjh}rQP(h]h]h]h]h]uhM hhh]rRP(j)rSP}rTP(hX ``defines``rUPhjOPhhhjh}rVP(h]h]h]h]h]uhM h]rWPh)rXP}rYP(hjUPh}rZP(h]h]h]h]h]uhjSPh]r[PhXdefinesr\Pr]P}r^P(hUhjXPubahhubaubj)r_P}r`P(hUh}raP(h]h]h]h]h]uhjOPh]rbPh)rcP}rdP(hXQ(optional) Dictionary of defines to overwrite values of the :file:`conf.py` file.hj_Phhhhh}reP(h]h]h]h]h]uhM h]rfP(hX<(optional) Dictionary of defines to overwrite values of the rgPrhP}riP(hX<(optional) Dictionary of defines to overwrite values of the hjcPubh)rjP}rkP(hUh}rlP(h]h]h]h]rmPXfilernPaUrolejnPh]uhjcPh]roPhXconf.pyrpPrqP}rrP(hXconf.pyhjjPubahhubhX file.rsPrtP}ruP(hX file.hjcPubeubahjubeubj)rvP}rwP(hX``mode`` (optional) String, one of ``full`` or ``incremental`` (the default). If set to ``full``, indicates to Sphinx to rebuild everything without re-using the previous build results. hjOhhhjh}rxP(h]h]h]h]h]uhM# hhh]ryP(j)rzP}r{P(hX``mode``r|PhjvPhhhjh}r}P(h]h]h]h]h]uhM# h]r~Ph)rP}rP(hj|Ph}rP(h]h]h]h]h]uhjzPh]rPhXmoderPrP}rP(hUhjPubahhubaubj)rP}rP(hUh}rP(h]h]h]h]h]uhjvPh]rPh)rP}rP(hX(optional) String, one of ``full`` or ``incremental`` (the default). If set to ``full``, indicates to Sphinx to rebuild everything without re-using the previous build results.hjPhhhhh}rP(h]h]h]h]h]uhM! h]rP(hX(optional) String, one of rPrP}rP(hX(optional) String, one of hjPubh)rP}rP(hX``full``h}rP(h]h]h]h]h]uhjPh]rPhXfullrPrP}rP(hUhjPubahhubhX or rPrP}rP(hX or hjPubh)rP}rP(hX``incremental``h}rP(h]h]h]h]h]uhjPh]rPhX incrementalrPrP}rP(hUhjPubahhubhX (the default). If set to rPrP}rP(hX (the default). If set to hjPubh)rP}rP(hX``full``h}rP(h]h]h]h]h]uhjPh]rPhXfullrPrP}rP(hUhjPubahhubhXX, indicates to Sphinx to rebuild everything without re-using the previous build results.rPrP}rP(hXX, indicates to Sphinx to rebuild everything without re-using the previous build results.hjPubeubahjubeubeubj)rP}rP(hUhjNhhhj h}rP(h]h]h]h]h]Uentries]rP((UsingleXBuild Steps; PyLintX step-PyLintrPjPtrP(UsingleXPyLint Build StepjPjPtrPeuhM& hhh]ubh)rP}rP(hUhjNhhhhh}rP(h]h]h]h]h]hjPuhM& hhh]ubh)rP}rP(hX.. _Step-PyLint:hjNhhh}hhh}rP(h]h]h]h]h]hU step-pylintrPuhM' hhh}rPjPjPsh]ubeubh)rP}rP(hUhjLhhh}rPhcjPshhh}rP(h]h]h]h]rP(jjPjPeh]rP(h]hceuhM* hhh}rP(jPjPjPjPuh]rP(h)rP}rP(hjhjPhhhhh}rP(h]h]h]h]h]hjuhM* hhh]rPhXPyLintrPrP}rP(hjhjPubaubh)rP}rP(hXYSimilarly, the :bb:step:`PyLint` step will run :command:`pylint` and analyze the results.hjPhhhhh}rP(h]h]h]h]h]uhM, hhh]rP(hXSimilarly, the rPrP}rP(hXSimilarly, the hjPubh)rP}rP(hX:bb:step:`PyLint`rPhjPhhhhh}rP(UreftypeXstephhXPyLintU refdomainXbbrPh]h]U refexplicith]h]h]hhuhM, h]rPh)rP}rP(hjPh}rP(h]h]rP(hjPXbb-steprPeh]h]h]uhjPh]rPhXPyLintrPrP}rP(hUhjPubahhubaubhX step will run rPrP}rP(hX step will run hjPubjL)rP}rP(hX:command:`pylint`h}rP(h]h]rPjQah]h]h]uhjPh]rPhXpylintrPrP}rP(hUhjPubahjVubhX and analyze the results.rPrP}rP(hX and analyze the results.hjPubeubh)rP}rP(hXDYou must supply the command line to be used. There is no default. ::rPhjPhhhhh}rP(h]h]h]h]h]uhM/ hhh]rPhXAYou must supply the command line to be used. There is no default.rPrP}rP(hXAYou must supply the command line to be used. There is no default.hjPubaubjS)rP}rP(hXUfrom buildbot.steps.python import PyLint f.addStep(PyLint(command=["pylint", "src"]))hjPhhhjVh}rP(jXjYh]h]h]h]h]uhM1 hhh]rPhXUfrom buildbot.steps.python import PyLint f.addStep(PyLint(command=["pylint", "src"]))rPrP}rP(hUhjPubaubj)rQ}rQ(hUhjPhhhj h}rQ(h]h]h]h]h]Uentries]rQ((UsingleXBuild Steps; TrialX step-TrialrQjQtrQ(UsingleXTrial Build StepjQjQtrQeuhM5 hhh]ubh)rQ}rQ(hUhjPhhhhh}r Q(h]h]h]h]h]hjQuhM5 hhh]ubh)r Q}r Q(hX.. _Step-Trial:hjPhhh}hhh}r Q(h]h]h]h]h]hU step-trialr QuhM6 hhh}rQjQjQsh]ubeubh)rQ}rQ(hUhjLhhh}rQhjj Qshhh}rQ(h]h]h]h]rQ(jj QjQeh]rQ(hLhjeuhM9 hhh}rQ(jQjQj Qj Quh]rQ(h)rQ}rQ(hjhjQhhhhh}rQ(h]h]h]h]h]hjuhM9 hhh]rQhXTrialrQrQ}rQ(hjhjQubaubj)rQ}rQ(hUhjQhNhj h}r Q(h]h]h]h]h]Uentries]r!Q(jXDbuildbot.steps.python_twisted.Trial (class in buildbot.steps.source)hfUtr"QauhNhhh]ubj )r#Q}r$Q(hUhjQhNhj h}r%Q(j j Xpyh]h]h]h]h]j Xclassr&Qj j&QuhNhhh]r'Q(j )r(Q}r)Q(hX#buildbot.steps.python_twisted.Trialhj#Qhhhj h}r*Q(h]r+Qhfaj j h]h]h]h]r,Qhfaj X#buildbot.steps.python_twisted.Trialj Xbuildbot.steps.python_twistedj uhM< hhh]r-Q(j )r.Q}r/Q(hXclass hj(Qhhhj h}r0Q(h]h]h]h]h]uhM< hhh]r1QhXclass r2Qr3Q}r4Q(hUhj.Qubaubj )r5Q}r6Q(hXbuildbot.steps.python_twisted.hj(Qhhhj h}r7Q(h]h]h]h]h]uhM< hhh]r8QhXbuildbot.steps.python_twisted.r9Qr:Q}r;Q(hUhj5Qubaubj )rQ(h]h]h]h]h]uhM< hhh]r?QhXTrialr@QrAQ}rBQ(hUhjR(hX:envvar:`PYTHONPATH`r?RhjQhhhhh}r@R(UreftypeXenvvarhhj5RU refdomainXstdrARh]h]U refexplicith]h]h]hhuhMS h]rBRh)rCR}rDR(hj?Rh}rER(h]h]rFR(hjARX std-envvarrGReh]h]h]uhj=Rh]rHRhX PYTHONPATHrIRrJR}rKR(hUhjCRubahhubaubhX is set to before running rLRrMR}rNR(hX is set to before running hjQubjL)rOR}rPR(hX:command:`trial`h}rQR(h]h]rRRjQah]h]h]uhjQh]rSRhXtrialrTRrUR}rVR(hUhjORubahjVubhX.rWR}rXR(hX.hjQubeubh)rYR}rZR(hXTrial has the ability, through the ``--testmodule`` flag, to run only the set of test cases named by special ``test-case-name`` tags in source files. We can get the list of changed source files from our parent Build and provide them to trial, thus running the minimal set of test cases needed to cover the Changes. This is useful for quick builds, especially in trees with a lot of test cases. The ``testChanges`` parameter controls this feature: if set, it will override ``tests``.hjQhhhhh}r[R(h]h]h]h]h]uhM\ hhh]r\R(hX#Trial has the ability, through the r]Rr^R}r_R(hX#Trial has the ability, through the hjYRubh)r`R}raR(hX``--testmodule``h}rbR(h]h]h]h]h]uhjYRh]rcRhX --testmodulerdRreR}rfR(hUhj`RubahhubhX: flag, to run only the set of test cases named by special rgRrhR}riR(hX: flag, to run only the set of test cases named by special hjYRubh)rjR}rkR(hX``test-case-name``h}rlR(h]h]h]h]h]uhjYRh]rmRhXtest-case-namernRroR}rpR(hUhjjRubahhubhX tags in source files. We can get the list of changed source files from our parent Build and provide them to trial, thus running the minimal set of test cases needed to cover the Changes. This is useful for quick builds, especially in trees with a lot of test cases. The rqRrrR}rsR(hX tags in source files. We can get the list of changed source files from our parent Build and provide them to trial, thus running the minimal set of test cases needed to cover the Changes. This is useful for quick builds, especially in trees with a lot of test cases. The hjYRubh)rtR}ruR(hX``testChanges``h}rvR(h]h]h]h]h]uhjYRh]rwRhX testChangesrxRryR}rzR(hUhjtRubahhubhX; parameter controls this feature: if set, it will override r{Rr|R}r}R(hX; parameter controls this feature: if set, it will override hjYRubh)r~R}rR(hX ``tests``h}rR(h]h]h]h]h]uhjYRh]rRhXtestsrRrR}rR(hUhj~RubahhubhX.rR}rR(hX.hjYRubeubh)rR}rR(hXThe trial executable itself is typically just :command:`trial`, and is typically found in the shell search path. It can be overridden with the ``trial`` parameter. This is useful for Twisted's own unittests, which want to use the copy of bin/trial that comes with the sources.hjQhhhhh}rR(h]h]h]h]h]uhMd hhh]rR(hX.The trial executable itself is typically just rRrR}rR(hX.The trial executable itself is typically just hjRubjL)rR}rR(hX:command:`trial`h}rR(h]h]rRjQah]h]h]uhjRh]rRhXtrialrRrR}rR(hUhjRubahjVubhXR, and is typically found in the shell search path. It can be overridden with the rRrR}rR(hXR, and is typically found in the shell search path. It can be overridden with the hjRubh)rR}rR(hX ``trial``h}rR(h]h]h]h]h]uhjRh]rRhXtrialrRrR}rR(hUhjRubahhubhX} parameter. This is useful for Twisted's own unittests, which want to use the copy of bin/trial that comes with the sources.rRrR}rR(hX} parameter. This is useful for Twisted's own unittests, which want to use the copy of bin/trial that comes with the sources.hjRubeubh)rR}rR(hXTo influence the version of Python being used for the tests, or to add flags to the command, set the ``python`` parameter. This can be a string (like ``python2.2``) or a list (like ``['python2.3', '-Wall']``).hjQhhhhh}rR(h]h]h]h]h]uhMi hhh]rR(hXeTo influence the version of Python being used for the tests, or to add flags to the command, set the rRrR}rR(hXeTo influence the version of Python being used for the tests, or to add flags to the command, set the hjRubh)rR}rR(hX ``python``h}rR(h]h]h]h]h]uhjRh]rRhXpythonrRrR}rR(hUhjRubahhubhX' parameter. This can be a string (like rRrR}rR(hX' parameter. This can be a string (like hjRubh)rR}rR(hX ``python2.2``h}rR(h]h]h]h]h]uhjRh]rRhX python2.2rRrR}rR(hUhjRubahhubhX) or a list (like rRrR}rR(hX) or a list (like hjRubh)rR}rR(hX``['python2.3', '-Wall']``h}rR(h]h]h]h]h]uhjRh]rRhX['python2.3', '-Wall']rRrR}rR(hUhjRubahhubhX).rRrR}rR(hX).hjRubeubh)rR}rR(hXTrial creates and switches into a directory named :file:`_trial_temp/` before running the tests, and sends the twisted log (which includes all exceptions) to a file named :file:`test.log`. This file will be pulled up to the master where it can be seen as part of the status output. ::hjQhhhhh}rR(h]h]h]h]h]uhMm hhh]rR(hX2Trial creates and switches into a directory named rRrR}rR(hX2Trial creates and switches into a directory named hjRubh)rR}rR(hUh}rR(h]h]h]h]rRXfilerRaUrolejRh]uhjRh]rRhX _trial_temp/rRrR}rR(hX _trial_temp/hjRubahhubhXe before running the tests, and sends the twisted log (which includes all exceptions) to a file named rRrR}rR(hXe before running the tests, and sends the twisted log (which includes all exceptions) to a file named hjRubh)rR}rR(hUh}rR(h]h]h]h]rRXfilerRaUrolejRh]uhjRh]rRhXtest.logrRrR}rR(hXtest.loghjRubahhubhX^. This file will be pulled up to the master where it can be seen as part of the status output.rRrR}rR(hX^. This file will be pulled up to the master where it can be seen as part of the status output.hjRubeubjS)rR}rR(hXVfrom buildbot.steps.python_twisted import Trial f.addStep(Trial(tests='petmail.test'))hjQhhhjVh}rR(jXjYh]h]h]h]h]uhMr hhh]rRhXVfrom buildbot.steps.python_twisted import Trial f.addStep(Trial(tests='petmail.test'))rRrR}rR(hUhjRubaubh)rR}rR(hXjTrial has the ability to run tests on several workers in parallel (beginning with Twisted 12.3.0). Set ``jobs`` to the number of workers you want to run. Note that running :command:`trial` in this way will create multiple log files (named :file:`test.N.log`, :file:`err.N.log` and :file:`out.N.log` starting with ``N=0``) rather than a single :file:`test.log`.hjQhhhhh}rR(h]h]h]h]h]uhMu hhh]rR(hXhTrial has the ability to run tests on several workers in parallel (beginning with Twisted 12.3.0). Set rRrR}rR(hXhTrial has the ability to run tests on several workers in parallel (beginning with Twisted 12.3.0). Set hjRubh)rR}rR(hX``jobs``h}rR(h]h]h]h]h]uhjRh]rRhXjobsrRrR}rR(hUhjRubahhubhX> to the number of workers you want to run. Note that running rRrR}rR(hX> to the number of workers you want to run. Note that running hjRubjL)rR}rS(hX:command:`trial`h}rS(h]h]rSjQah]h]h]uhjRh]rShXtrialrSrS}rS(hUhjRubahjVubhX3 in this way will create multiple log files (named rSrS}r S(hX3 in this way will create multiple log files (named hjRubh)r S}r S(hUh}r S(h]h]h]h]r SXfilerSaUrolejSh]uhjRh]rShX test.N.logrSrS}rS(hX test.N.loghj SubahhubhX, rSrS}rS(hX, hjRubh)rS}rS(hUh}rS(h]h]h]h]rSXfilerSaUrolejSh]uhjRh]rShX err.N.logrSrS}rS(hX err.N.loghjSubahhubhX and rSr S}r!S(hX and hjRubh)r"S}r#S(hUh}r$S(h]h]h]h]r%SXfiler&SaUrolej&Sh]uhjRh]r'ShX out.N.logr(Sr)S}r*S(hX out.N.loghj"SubahhubhX starting with r+Sr,S}r-S(hX starting with hjRubh)r.S}r/S(hX``N=0``h}r0S(h]h]h]h]h]uhjRh]r1ShXN=0r2Sr3S}r4S(hUhj.SubahhubhX) rather than a single r5Sr6S}r7S(hX) rather than a single hjRubh)r8S}r9S(hUh}r:S(h]h]h]h]r;SXfilerSr?S}r@S(hXtest.loghj8SubahhubhX.rAS}rBS(hX.hjRubeubh)rCS}rDS(hX(This step takes the following arguments:rEShjQhhhhh}rFS(h]h]h]h]h]uhM{ hhh]rGShX(This step takes the following arguments:rHSrIS}rJS(hjEShjCSubaubj)rKS}rLS(hUhjQhhhjh}rMS(h]h]h]h]h]uhNhhh]rNSj)rOS}rPS(hX``jobs`` (optional) Number of slave-resident workers to use when running the tests. Defaults to 1 worker. Only works with Twisted>=12.3.0. hjKShhhjh}rQS(h]h]h]h]h]uhM h]rRS(j)rSS}rTS(hX``jobs``rUShjOShhhjh}rVS(h]h]h]h]h]uhM h]rWSh)rXS}rYS(hjUSh}rZS(h]h]h]h]h]uhjSSh]r[ShXjobsr\Sr]S}r^S(hUhjXSubahhubaubj)r_S}r`S(hUh}raS(h]h]h]h]h]uhjOSh]rbSh)rcS}rdS(hX(optional) Number of slave-resident workers to use when running the tests. Defaults to 1 worker. Only works with Twisted>=12.3.0.reShj_Shhhhh}rfS(h]h]h]h]h]uhM~ h]rgShX(optional) Number of slave-resident workers to use when running the tests. Defaults to 1 worker. Only works with Twisted>=12.3.0.rhSriS}rjS(hjeShjcSubaubahjubeubaubj)rkS}rlS(hUhjQhhhj h}rmS(h]h]h]h]h]Uentries]rnS((UsingleXBuild Steps; RemovePYCsXstep-RemovePYCsroSjoStrpS(UsingleXRemovePYCs Build StepjoSjoStrqSeuhM hhh]ubh)rrS}rsS(hUhjQhhhhh}rtS(h]h]h]h]h]hjoSuhM hhh]ubeubh)ruS}rvS(hUhjLhhh}hhh}rwS(h]h]h]h]rxS(jjoSeh]ryShauhM hhh}rzSjoSjrSsh]r{S(h)r|S}r}S(hjhjuShhhhh}r~S(h]h]h]h]h]hjuhM hhh]rShX RemovePYCsrSrS}rS(hjhj|Subaubj)rS}rS(hUhjuShNhj h}rS(h]h]h]h]h]Uentries]rS(jXIbuildbot.steps.python_twisted.RemovePYCs (class in buildbot.steps.source)h/UtrSauhNhhh]ubj )rS}rS(hUhjuShNhj h}rS(j j Xpyh]h]h]h]h]j XclassrSj jSuhNhhh]rS(j )rS}rS(hX(buildbot.steps.python_twisted.RemovePYCshjShhhj h}rS(h]rSh/aj j h]h]h]h]rSh/aj X(buildbot.steps.python_twisted.RemovePYCsj Xbuildbot.steps.python_twistedj uhM hhh]rS(j )rS}rS(hXclass hjShhhj h}rS(h]h]h]h]h]uhM hhh]rShXclass rSrS}rS(hUhjSubaubj )rS}rS(hXbuildbot.steps.python_twisted.hjShhhj h}rS(h]h]h]h]h]uhM hhh]rShXbuildbot.steps.python_twisted.rSrS}rS(hUhjSubaubj )rS}rS(hX RemovePYCshjShhhj h}rS(h]h]h]h]h]uhM hhh]rShX RemovePYCsrSrS}rS(hUhjSubaubeubj )rS}rS(hUhjShhhj h}rS(h]h]h]h]h]uhM hhh]ubeubh)rS}rS(hXOThis is a simple built-in step that will remove ``.pyc`` files from the workdir. This is useful in builds that update their source (and thus do not automatically delete ``.pyc`` files) but where some part of the build process is dynamically searching for Python modules. Notably, trial has a bad habit of finding old test modules. ::hjuShhhhh}rS(h]h]h]h]h]uhM hhh]rS(hX0This is a simple built-in step that will remove rSrS}rS(hX0This is a simple built-in step that will remove hjSubh)rS}rS(hX``.pyc``h}rS(h]h]h]h]h]uhjSh]rShX.pycrSrS}rS(hUhjSubahhubhXr files from the workdir. This is useful in builds that update their source (and thus do not automatically delete rSrS}rS(hXr files from the workdir. This is useful in builds that update their source (and thus do not automatically delete hjSubh)rS}rS(hX``.pyc``h}rS(h]h]h]h]h]uhjSh]rShX.pycrSrS}rS(hUhjSubahhubhX files) but where some part of the build process is dynamically searching for Python modules. Notably, trial has a bad habit of finding old test modules.rSrS}rS(hX files) but where some part of the build process is dynamically searching for Python modules. Notably, trial has a bad habit of finding old test modules.hjSubeubjS)rS}rS(hXLfrom buildbot.steps.python_twisted import RemovePYCs f.addStep(RemovePYCs())hjuShhhjVh}rS(jXjYh]h]h]h]h]uhM hhh]rShXLfrom buildbot.steps.python_twisted import RemovePYCs f.addStep(RemovePYCs())rSrS}rS(hUhjSubaubj)rS}rS(hUhjuShhhj h}rS(h]h]h]h]h]j ]rS(jX File TransferUindex-28rSUtrSajuhM hhh]ubh)rS}rS(hUhjuShhhhh}rS(h]h]h]h]rSjSah]uhM hhh]ubj)rS}rS(hUhjuShhhj h}rS(h]h]h]h]h]Uentries]rS((UsingleXBuild Steps; FileUploadXstep-FileUploadrSjStrS(UsingleXFileUpload Build StepjSjStrSeuhM hhh]ubh)rS}rS(hUhjuShhhhh}rS(h]h]h]h]rSjSah]uhM hhh]ubj)rS}rS(hUhjuShhhj h}rS(h]h]h]h]h]Uentries]rS((UsingleXBuild Steps; FileDownloadXstep-FileDownloadrSjStrS(UsingleXFileDownload Build StepjSjStrSeuhM hhh]ubh)rS}rS(hUhjuShhhhh}rS(h]h]h]h]h]hjSuhM hhh]ubeubeubh)rS}rS(hUhhhhh}hhh}rS(h]h]h]h]rS(jjSeh]rShWauhM hhh}rSjSjSsh]rS(h)rS}rS(hjhjShhhhh}rS(h]h]h]h]h]hjuhM hhh]rShXTransferring FilesrSrS}rS(hjhjSubaubj)rS}rS(hUhjShNhj h}rS(h]h]h]h]h]Uentries]rS(jXCbuildbot.steps.transfer.FileUpload (class in buildbot.steps.source)hUtrSauhNhhh]ubj )rS}rT(hUhjShNhj h}rT(j j Xpyh]h]h]h]h]j XclassrTj jTuhNhhh]rT(j )rT}rT(hX"buildbot.steps.transfer.FileUploadhjShhhj h}rT(h]rThaj j h]h]h]h]rThaj X"buildbot.steps.transfer.FileUploadj Xbuildbot.steps.transferj uhM hhh]r T(j )r T}r T(hXclass hjThhhj h}r T(h]h]h]h]h]uhM hhh]r ThXclass rTrT}rT(hUhj Tubaubj )rT}rT(hXbuildbot.steps.transfer.hjThhhj h}rT(h]h]h]h]h]uhM hhh]rThXbuildbot.steps.transfer.rTrT}rT(hUhjTubaubj )rT}rT(hX FileUploadhjThhhj h}rT(h]h]h]h]h]uhM hhh]rThX FileUploadrTrT}rT(hUhjTubaubeubj )rT}r T(hUhjShhhj h}r!T(h]h]h]h]h]uhM hhh]ubeubj)r"T}r#T(hUhjShNhj h}r$T(h]h]h]h]h]Uentries]r%T(jXEbuildbot.steps.transfer.FileDownload (class in buildbot.steps.source)hT}r?T(hUhj9Tubaubj )r@T}rAT(hX FileDownloadhj,Thhhj h}rBT(h]h]h]h]h]uhM hhh]rCThX FileDownloadrDTrET}rFT(hUhj@Tubaubeubj )rGT}rHT(hUhj'Thhhj h}rIT(h]h]h]h]h]uhM hhh]ubeubh)rJT}rKT(hXMost of the work involved in a build will take place on the buildslave. But occasionally it is useful to do some work on the buildmaster side. The most basic way to involve the buildmaster is simply to move a file from the slave to the master, or vice versa. There are a pair of steps named :bb:step:`FileUpload` and :bb:step:`FileDownload` to provide this functionality. :bb:step:`FileUpload` moves a file *up to* the master, while :bb:step:`FileDownload` moves a file *down from* the master.hjShhhhh}rLT(h]h]h]h]h]uhM hhh]rMT(hX#Most of the work involved in a build will take place on the buildslave. But occasionally it is useful to do some work on the buildmaster side. The most basic way to involve the buildmaster is simply to move a file from the slave to the master, or vice versa. There are a pair of steps named rNTrOT}rPT(hX#Most of the work involved in a build will take place on the buildslave. But occasionally it is useful to do some work on the buildmaster side. The most basic way to involve the buildmaster is simply to move a file from the slave to the master, or vice versa. There are a pair of steps named hjJTubh)rQT}rRT(hX:bb:step:`FileUpload`rSThjJThhhhh}rTT(UreftypeXstephhX FileUploadU refdomainXbbrUTh]h]U refexplicith]h]h]hhuhM h]rVTh)rWT}rXT(hjSTh}rYT(h]h]rZT(hjUTXbb-stepr[Teh]h]h]uhjQTh]r\ThX FileUploadr]Tr^T}r_T(hUhjWTubahhubaubhX and r`TraT}rbT(hX and hjJTubh)rcT}rdT(hX:bb:step:`FileDownload`reThjJThhhhh}rfT(UreftypeXstephhX FileDownloadU refdomainXbbrgTh]h]U refexplicith]h]h]hhuhM h]rhTh)riT}rjT(hjeTh}rkT(h]h]rlT(hjgTXbb-steprmTeh]h]h]uhjcTh]rnThX FileDownloadroTrpT}rqT(hUhjiTubahhubaubhX to provide this functionality. rrTrsT}rtT(hX to provide this functionality. hjJTubh)ruT}rvT(hX:bb:step:`FileUpload`rwThjJThhhhh}rxT(UreftypeXstephhX FileUploadU refdomainXbbryTh]h]U refexplicith]h]h]hhuhM h]rzTh)r{T}r|T(hjwTh}r}T(h]h]r~T(hjyTXbb-steprTeh]h]h]uhjuTh]rThX FileUploadrTrT}rT(hUhj{TubahhubaubhX moves a file rTrT}rT(hX moves a file hjJTubjW)rT}rT(hX*up to*h}rT(h]h]h]h]h]uhjJTh]rThXup torTrT}rT(hUhjTubahjaubhX the master, while rTrT}rT(hX the master, while hjJTubh)rT}rT(hX:bb:step:`FileDownload`rThjJThhhhh}rT(UreftypeXstephhX FileDownloadU refdomainXbbrTh]h]U refexplicith]h]h]hhuhM h]rTh)rT}rT(hjTh}rT(h]h]rT(hjTXbb-steprTeh]h]h]uhjTh]rThX FileDownloadrTrT}rT(hUhjTubahhubaubhX moves a file rTrT}rT(hX moves a file hjJTubjW)rT}rT(hX *down from*h}rT(h]h]h]h]h]uhjJTh]rThX down fromrTrT}rT(hUhjTubahjaubhX the master.rTrT}rT(hX the master.hjJTubeubh)rT}rT(hXAs an example, let's assume that there is a step which produces an HTML file within the source tree that contains some sort of generated project documentation. We want to move this file to the buildmaster, into a :file:`~/public_html` directory, so it can be visible to developers. This file will wind up in the slave-side working directory under the name :file:`docs/reference.html`. We want to put it into the master-side :file:`~/public_html/ref.html`, and add a link to the HTML status to the uploaded file. ::hjShhhhh}rT(h]h]h]h]h]uhM hhh]rT(hXAs an example, let's assume that there is a step which produces an HTML file within the source tree that contains some sort of generated project documentation. We want to move this file to the buildmaster, into a rTrT}rT(hXAs an example, let's assume that there is a step which produces an HTML file within the source tree that contains some sort of generated project documentation. We want to move this file to the buildmaster, into a hjTubh)rT}rT(hUh}rT(h]h]h]h]rTXfilerTaUrolejTh]uhjTh]rThX ~/public_htmlrTrT}rT(hX ~/public_htmlhjTubahhubhXz directory, so it can be visible to developers. This file will wind up in the slave-side working directory under the name rTrT}rT(hXz directory, so it can be visible to developers. This file will wind up in the slave-side working directory under the name hjTubh)rT}rT(hUh}rT(h]h]h]h]rTXfilerTaUrolejTh]uhjTh]rThXdocs/reference.htmlrTrT}rT(hXdocs/reference.htmlhjTubahhubhX). We want to put it into the master-side rTrT}rT(hX). We want to put it into the master-side hjTubh)rT}rT(hUh}rT(h]h]h]h]rTXfilerTaUrolejTh]uhjTh]rThX~/public_html/ref.htmlrTrT}rT(hX~/public_html/ref.htmlhjTubahhubhX9, and add a link to the HTML status to the uploaded file.rTrT}rT(hX9, and add a link to the HTML status to the uploaded file.hjTubeubjS)rT}rT(hXEfrom buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import FileUpload f.addStep(ShellCommand(command=["make", "docs"])) f.addStep(FileUpload(slavesrc="docs/reference.html", masterdest="/home/bb/public_html/ref.html", url="http://somesite/~buildbot/ref.html"))hjShhhjVh}rT(jXjYh]h]h]h]h]uhM hhh]rThXEfrom buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import FileUpload f.addStep(ShellCommand(command=["make", "docs"])) f.addStep(FileUpload(slavesrc="docs/reference.html", masterdest="/home/bb/public_html/ref.html", url="http://somesite/~buildbot/ref.html"))rTrT}rT(hUhjTubaubh)rT}rT(hXBThe ``masterdest=`` argument will be passed to :meth:`os.path.expanduser`, so things like ``~`` will be expanded properly. Non-absolute paths will be interpreted relative to the buildmaster's base directory. Likewise, the ``slavesrc=`` argument will be expanded and interpreted relative to the builder's working directory.hjShhhhh}rT(h]h]h]h]h]uhM hhh]rT(hXThe rTrT}rT(hXThe hjTubh)rT}rT(hX``masterdest=``h}rT(h]h]h]h]h]uhjTh]rThX masterdest=rTrT}rT(hUhjTubahhubhX argument will be passed to rTrT}rT(hX argument will be passed to hjTubh)rT}rT(hX:meth:`os.path.expanduser`rThjThhhhh}rT(UreftypeXmethhhXos.path.expanduserU refdomainXpyrTh]h]U refexplicith]h]h]hhhNhj uhM h]rTh)rT}rT(hjTh}rT(h]h]rT(hjTXpy-methrTeh]h]h]uhjTh]rThXos.path.expanduserrTrT}rT(hUhjTubahhubaubhX, so things like rTrU}rU(hX, so things like hjTubh)rU}rU(hX``~``h}rU(h]h]h]h]h]uhjTh]rUhX~rU}rU(hUhjUubahhubhX will be expanded properly. Non-absolute paths will be interpreted relative to the buildmaster's base directory. Likewise, the rUr U}r U(hX will be expanded properly. Non-absolute paths will be interpreted relative to the buildmaster's base directory. Likewise, the hjTubh)r U}r U(hX ``slavesrc=``h}r U(h]h]h]h]h]uhjTh]rUhX slavesrc=rUrU}rU(hUhj UubahhubhXW argument will be expanded and interpreted relative to the builder's working directory.rUrU}rU(hXW argument will be expanded and interpreted relative to the builder's working directory.hjTubeubj")rU}rU(hXThe copied file will have the same permissions on the master as on the slave, look at the ``mode=`` parameter to set it differently.hjShhhj"h}rU(h]h]h]h]h]uhNhhh]rUh)rU}rU(hXThe copied file will have the same permissions on the master as on the slave, look at the ``mode=`` parameter to set it differently.hjUhhhhh}rU(h]h]h]h]h]uhM h]rU(hXZThe copied file will have the same permissions on the master as on the slave, look at the rUrU}rU(hXZThe copied file will have the same permissions on the master as on the slave, look at the hjUubh)r U}r!U(hX ``mode=``h}r"U(h]h]h]h]h]uhjUh]r#UhXmode=r$Ur%U}r&U(hUhj UubahhubhX! parameter to set it differently.r'Ur(U}r)U(hX! parameter to set it differently.hjUubeubaubh)r*U}r+U(hXTo move a file from the master to the slave, use the :bb:step:`FileDownload` command. For example, let's assume that some step requires a configuration file that, for whatever reason, could not be recorded in the source code repository or generated on the buildslave side::hjShhhhh}r,U(h]h]h]h]h]uhM hhh]r-U(hX5To move a file from the master to the slave, use the r.Ur/U}r0U(hX5To move a file from the master to the slave, use the hj*Uubh)r1U}r2U(hX:bb:step:`FileDownload`r3Uhj*Uhhhhh}r4U(UreftypeXstephhX FileDownloadU refdomainXbbr5Uh]h]U refexplicith]h]h]hhuhM h]r6Uh)r7U}r8U(hj3Uh}r9U(h]h]r:U(hj5UXbb-stepr;Ueh]h]h]uhj1Uh]rU}r?U(hUhj7UubahhubaubhX command. For example, let's assume that some step requires a configuration file that, for whatever reason, could not be recorded in the source code repository or generated on the buildslave side:r@UrAU}rBU(hX command. For example, let's assume that some step requires a configuration file that, for whatever reason, could not be recorded in the source code repository or generated on the buildslave side:hj*UubeubjS)rCU}rDU(hXfrom buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import FileDownload f.addStep(FileDownload(mastersrc="~/todays_build_config.txt", slavedest="build_config.txt")) f.addStep(ShellCommand(command=["make", "config"]))hjShhhjVh}rEU(jXjYh]h]h]h]h]uhM hhh]rFUhXfrom buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import FileDownload f.addStep(FileDownload(mastersrc="~/todays_build_config.txt", slavedest="build_config.txt")) f.addStep(ShellCommand(command=["make", "config"]))rGUrHU}rIU(hUhjCUubaubh)rJU}rKU(hX<Like :bb:step:`FileUpload`, the ``mastersrc=`` argument is interpreted relative to the buildmaster's base directory, and the ``slavedest=`` argument is relative to the builder's working directory. If the buildslave is running in :file:`~buildslave`, and the builder's ``builddir`` is something like :file:`tests-i386`, then the workdir is going to be :file:`~buildslave/tests-i386/build`, and a ``slavedest=`` of :file:`foo/bar.html` will get put in :file:`~buildslave/tests-i386/build/foo/bar.html`. Both of these commands will create any missing intervening directories.hjShhhhh}rLU(h]h]h]h]h]uhM hhh]rMU(hXLike rNUrOU}rPU(hXLike hjJUubh)rQU}rRU(hX:bb:step:`FileUpload`rSUhjJUhhhhh}rTU(UreftypeXstephhX FileUploadU refdomainXbbrUUh]h]U refexplicith]h]h]hhuhM h]rVUh)rWU}rXU(hjSUh}rYU(h]h]rZU(hjUUXbb-stepr[Ueh]h]h]uhjQUh]r\UhX FileUploadr]Ur^U}r_U(hUhjWUubahhubaubhX, the r`UraU}rbU(hX, the hjJUubh)rcU}rdU(hX``mastersrc=``h}reU(h]h]h]h]h]uhjJUh]rfUhX mastersrc=rgUrhU}riU(hUhjcUubahhubhXO argument is interpreted relative to the buildmaster's base directory, and the rjUrkU}rlU(hXO argument is interpreted relative to the buildmaster's base directory, and the hjJUubh)rmU}rnU(hX``slavedest=``h}roU(h]h]h]h]h]uhjJUh]rpUhX slavedest=rqUrrU}rsU(hUhjmUubahhubhXZ argument is relative to the builder's working directory. If the buildslave is running in rtUruU}rvU(hXZ argument is relative to the builder's working directory. If the buildslave is running in hjJUubh)rwU}rxU(hUh}ryU(h]h]h]h]rzUXfiler{UaUrolej{Uh]uhjJUh]r|UhX ~buildslaver}Ur~U}rU(hX ~buildslavehjwUubahhubhX, and the builder's rUrU}rU(hX, and the builder's hjJUubh)rU}rU(hX ``builddir``h}rU(h]h]h]h]h]uhjJUh]rUhXbuilddirrUrU}rU(hUhjUubahhubhX is something like rUrU}rU(hX is something like hjJUubh)rU}rU(hUh}rU(h]h]h]h]rUXfilerUaUrolejUh]uhjJUh]rUhX tests-i386rUrU}rU(hX tests-i386hjUubahhubhX", then the workdir is going to be rUrU}rU(hX", then the workdir is going to be hjJUubh)rU}rU(hUh}rU(h]h]h]h]rUXfilerUaUrolejUh]uhjJUh]rUhX~buildslave/tests-i386/buildrUrU}rU(hX~buildslave/tests-i386/buildhjUubahhubhX, and a rUrU}rU(hX, and a hjJUubh)rU}rU(hX``slavedest=``h}rU(h]h]h]h]h]uhjJUh]rUhX slavedest=rUrU}rU(hUhjUubahhubhX of rUrU}rU(hX of hjJUubh)rU}rU(hUh}rU(h]h]h]h]rUXfilerUaUrolejUh]uhjJUh]rUhX foo/bar.htmlrUrU}rU(hX foo/bar.htmlhjUubahhubhX will get put in rUrU}rU(hX will get put in hjJUubh)rU}rU(hUh}rU(h]h]h]h]rUXfilerUaUrolejUh]uhjJUh]rUhX)~buildslave/tests-i386/build/foo/bar.htmlrUrU}rU(hX)~buildslave/tests-i386/build/foo/bar.htmlhjUubahhubhXI. Both of these commands will create any missing intervening directories.rUrU}rU(hXI. Both of these commands will create any missing intervening directories.hjJUubeubh)rU}rU(hUhjShhhhh}rU(h]h]h]h]rUjah]rUh"auhM hhh]rU(h)rU}rU(hjhjUhhhhh}rU(h]h]h]h]h]hjuhM hhh]rUhXOther ParametersrUrU}rU(hjhjUubaubh)rU}rU(hXThe ``maxsize=`` argument lets you set a maximum size for the file to be transferred. This may help to avoid surprises: transferring a 100MB coredump when you were expecting to move a 10kB status file might take an awfully long time. The ``blocksize=`` argument controls how the file is sent over the network: larger blocksizes are slightly more efficient but also consume more memory on each end, and there is a hard-coded limit of about 640kB.hjUhhhhh}rU(h]h]h]h]h]uhM hhh]rU(hXThe rUrU}rU(hXThe hjUubh)rU}rU(hX ``maxsize=``h}rU(h]h]h]h]h]uhjUh]rUhXmaxsize=rUrU}rU(hUhjUubahhubhX argument lets you set a maximum size for the file to be transferred. This may help to avoid surprises: transferring a 100MB coredump when you were expecting to move a 10kB status file might take an awfully long time. The rUrU}rU(hX argument lets you set a maximum size for the file to be transferred. This may help to avoid surprises: transferring a 100MB coredump when you were expecting to move a 10kB status file might take an awfully long time. The hjUubh)rU}rU(hX``blocksize=``h}rU(h]h]h]h]h]uhjUh]rUhX blocksize=rUrU}rU(hUhjUubahhubhX argument controls how the file is sent over the network: larger blocksizes are slightly more efficient but also consume more memory on each end, and there is a hard-coded limit of about 640kB.rUrU}rU(hX argument controls how the file is sent over the network: larger blocksizes are slightly more efficient but also consume more memory on each end, and there is a hard-coded limit of about 640kB.hjUubeubh)rU}rU(hXQThe ``mode=`` argument allows you to control the access permissions of the target file, traditionally expressed as an octal integer. The most common value is probably ``0755``, which sets the `x` executable bit on the file (useful for shell scripts and the like). The default value for ``mode=`` is None, which means the permission bits will default to whatever the umask of the writing process is. The default umask tends to be fairly restrictive, but at least on the buildslave you can make it less restrictive with a --umask command-line option at creation time (:ref:`Buildslave-Options`).hjUhhhhh}rU(h]h]h]h]h]uhM hhh]rU(hXThe rUrU}rU(hXThe hjUubh)rU}rU(hX ``mode=``h}rU(h]h]h]h]h]uhjUh]rUhXmode=rUrU}rU(hUhjUubahhubhX argument allows you to control the access permissions of the target file, traditionally expressed as an octal integer. The most common value is probably rUrU}rU(hX argument allows you to control the access permissions of the target file, traditionally expressed as an octal integer. The most common value is probably hjUubh)rV}rV(hX``0755``h}rV(h]h]h]h]h]uhjUh]rVhX0755rVrV}rV(hUhjVubahhubhX, which sets the rVrV}r V(hX, which sets the hjUubjE)r V}r V(hX`x`h}r V(h]h]h]h]h]uhjUh]r VhXxrV}rV(hUhj VubahjMubhX[ executable bit on the file (useful for shell scripts and the like). The default value for rVrV}rV(hX[ executable bit on the file (useful for shell scripts and the like). The default value for hjUubh)rV}rV(hX ``mode=``h}rV(h]h]h]h]h]uhjUh]rVhXmode=rVrV}rV(hUhjVubahhubhX is None, which means the permission bits will default to whatever the umask of the writing process is. The default umask tends to be fairly restrictive, but at least on the buildslave you can make it less restrictive with a --umask command-line option at creation time (rVrV}rV(hX is None, which means the permission bits will default to whatever the umask of the writing process is. The default umask tends to be fairly restrictive, but at least on the buildslave you can make it less restrictive with a --umask command-line option at creation time (hjUubh)rV}rV(hX:ref:`Buildslave-Options`rVhjUhhhhh}r V(UreftypeXrefhhXbuildslave-optionsU refdomainXstdr!Vh]h]U refexplicith]h]h]hhuhM h]r"VjW)r#V}r$V(hjVh}r%V(h]h]r&V(hj!VXstd-refr'Veh]h]h]uhjVh]r(VhXBuildslave-Optionsr)Vr*V}r+V(hUhj#VubahjaubaubhX).r,Vr-V}r.V(hX).hjUubeubh)r/V}r0V(hX)The ``keepstamp=`` argument is a boolean that, when ``True``, forces the modified and accessed time of the destination file to match the times of the source file. When ``False`` (the default), the modified and accessed times of the destination file are set to the current time on the buildmaster.hjUhhhhh}r1V(h]h]h]h]h]uhM hhh]r2V(hXThe r3Vr4V}r5V(hXThe hj/Vubh)r6V}r7V(hX``keepstamp=``h}r8V(h]h]h]h]h]uhj/Vh]r9VhX keepstamp=r:Vr;V}rV}r?V(hX" argument is a boolean that, when hj/Vubh)r@V}rAV(hX``True``h}rBV(h]h]h]h]h]uhj/Vh]rCVhXTruerDVrEV}rFV(hUhj@VubahhubhXm, forces the modified and accessed time of the destination file to match the times of the source file. When rGVrHV}rIV(hXm, forces the modified and accessed time of the destination file to match the times of the source file. When hj/Vubh)rJV}rKV(hX ``False``h}rLV(h]h]h]h]h]uhj/Vh]rMVhXFalserNVrOV}rPV(hUhjJVubahhubhXw (the default), the modified and accessed times of the destination file are set to the current time on the buildmaster.rQVrRV}rSV(hXw (the default), the modified and accessed times of the destination file are set to the current time on the buildmaster.hj/Vubeubh)rTV}rUV(hXMThe ``url=`` argument allows you to specify an url that will be displayed in the HTML status. The title of the url will be the name of the item transferred (directory for :class:`DirectoryUpload` or file for :class:`FileUpload`). This allows the user to add a link to the uploaded item if that one is uploaded to an accessible place.hjUhhhhh}rVV(h]h]h]h]h]uhM hhh]rWV(hXThe rXVrYV}rZV(hXThe hjTVubh)r[V}r\V(hX``url=``h}r]V(h]h]h]h]h]uhjTVh]r^VhXurl=r_Vr`V}raV(hUhj[VubahhubhX argument allows you to specify an url that will be displayed in the HTML status. The title of the url will be the name of the item transferred (directory for rbVrcV}rdV(hX argument allows you to specify an url that will be displayed in the HTML status. The title of the url will be the name of the item transferred (directory for hjTVubh)reV}rfV(hX:class:`DirectoryUpload`rgVhjTVhhhhh}rhV(UreftypeXclasshhXDirectoryUploadU refdomainXpyriVh]h]U refexplicith]h]h]hhhNhj uhM h]rjVh)rkV}rlV(hjgVh}rmV(h]h]rnV(hjiVXpy-classroVeh]h]h]uhjeVh]rpVhXDirectoryUploadrqVrrV}rsV(hUhjkVubahhubaubhX or file for rtVruV}rvV(hX or file for hjTVubh)rwV}rxV(hX:class:`FileUpload`ryVhjTVhhhhh}rzV(UreftypeXclasshhX FileUploadU refdomainXpyr{Vh]h]U refexplicith]h]h]hhhNhj uhM h]r|Vh)r}V}r~V(hjyVh}rV(h]h]rV(hj{VXpy-classrVeh]h]h]uhjwVh]rVhX FileUploadrVrV}rV(hUhj}VubahhubaubhXj). This allows the user to add a link to the uploaded item if that one is uploaded to an accessible place.rVrV}rV(hXj). This allows the user to add a link to the uploaded item if that one is uploaded to an accessible place.hjTVubeubj)rV}rV(hUhjUhhhj h}rV(h]h]h]h]h]Uentries]rV((UsingleXBuild Steps; DirectoryUploadXstep-DirectoryUploadrVjVtrV(UsingleXDirectoryUpload Build StepjVjVtrVeuhM hhh]ubh)rV}rV(hUhjUhhhhh}rV(h]h]h]h]h]hjVuhM hhh]ubeubh)rV}rV(hUhjShhh}hhh}rV(h]h]h]h]rV(jjVeh]rVhoauhM hhh}rVjVjVsh]rV(h)rV}rV(hjhjVhhhhh}rV(h]h]h]h]h]hjuhM hhh]rVhXTransfering DirectoriesrVrV}rV(hjhjVubaubj)rV}rV(hUhjVhNhj h}rV(h]h]h]h]h]Uentries]rV(jXHbuildbot.steps.transfer.DirectoryUpload (class in buildbot.steps.source)hEUtrVauhNhhh]ubj )rV}rV(hUhjVhNhj h}rV(j j Xpyh]h]h]h]h]j XclassrVj jVuhNhhh]rV(j )rV}rV(hX'buildbot.steps.transfer.DirectoryUploadhjVhhhj h}rV(h]rVhEaj j h]h]h]h]rVhEaj X'buildbot.steps.transfer.DirectoryUploadj Xbuildbot.steps.transferj uhM hhh]rV(j )rV}rV(hXclass hjVhhhj h}rV(h]h]h]h]h]uhM hhh]rVhXclass rVrV}rV(hUhjVubaubj )rV}rV(hXbuildbot.steps.transfer.hjVhhhj h}rV(h]h]h]h]h]uhM hhh]rVhXbuildbot.steps.transfer.rVrV}rV(hUhjVubaubj )rV}rV(hXDirectoryUploadhjVhhhj h}rV(h]h]h]h]h]uhM hhh]rVhXDirectoryUploadrVrV}rV(hUhjVubaubeubj )rV}rV(hUhjVhhhj h}rV(h]h]h]h]h]uhM hhh]ubeubh)rV}rV(hXTo transfer complete directories from the buildslave to the master, there is a :class:`BuildStep` named :bb:step:`DirectoryUpload`. It works like :bb:step:`FileUpload`, just for directories. However it does not support the ``maxsize``, ``blocksize`` and ``mode`` arguments. As an example, let's assume an generated project documentation, which consists of many files (like the output of :command:`doxygen` or :command:`epydoc`). We want to move the entire documentation to the buildmaster, into a :file:`~/public_html/docs` directory, and add a link to the uploaded documentation on the HTML status page. On the slave-side the directory can be found under :file:`docs`::hjVhhhhh}rV(h]h]h]h]h]uhM hhh]rV(hXOTo transfer complete directories from the buildslave to the master, there is a rVrV}rV(hXOTo transfer complete directories from the buildslave to the master, there is a hjVubh)rV}rV(hX:class:`BuildStep`rVhjVhhhhh}rV(UreftypeXclasshhX BuildStepU refdomainXpyrVh]h]U refexplicith]h]h]hhhNhj uhM h]rVh)rV}rV(hjVh}rV(h]h]rV(hjVXpy-classrVeh]h]h]uhjVh]rVhX BuildSteprVrV}rV(hUhjVubahhubaubhX named rVrV}rV(hX named hjVubh)rV}rV(hX:bb:step:`DirectoryUpload`rVhjVhhhhh}rV(UreftypeXstephhXDirectoryUploadU refdomainXbbrVh]h]U refexplicith]h]h]hhuhM h]rVh)rV}rV(hjVh}rV(h]h]rV(hjVXbb-steprVeh]h]h]uhjVh]rVhXDirectoryUploadrVrV}rV(hUhjVubahhubaubhX. It works like rVrV}rV(hX. It works like hjVubh)rV}rV(hX:bb:step:`FileUpload`rVhjVhhhhh}rV(UreftypeXstephhX FileUploadU refdomainXbbrVh]h]U refexplicith]h]h]hhuhM h]rVh)rV}rV(hjVh}rV(h]h]rV(hjVXbb-steprVeh]h]h]uhjVh]rVhX FileUploadrWrW}rW(hUhjVubahhubaubhX8, just for directories. However it does not support the rWrW}rW(hX8, just for directories. However it does not support the hjVubh)rW}rW(hX ``maxsize``h}rW(h]h]h]h]h]uhjVh]r WhXmaxsizer Wr W}r W(hUhjWubahhubhX, r WrW}rW(hX, hjVubh)rW}rW(hX ``blocksize``h}rW(h]h]h]h]h]uhjVh]rWhX blocksizerWrW}rW(hUhjWubahhubhX and rWrW}rW(hX and hjVubh)rW}rW(hX``mode``h}rW(h]h]h]h]h]uhjVh]rWhXmoderWrW}r W(hUhjWubahhubhX} arguments. As an example, let's assume an generated project documentation, which consists of many files (like the output of r!Wr"W}r#W(hX} arguments. As an example, let's assume an generated project documentation, which consists of many files (like the output of hjVubjL)r$W}r%W(hX:command:`doxygen`h}r&W(h]h]r'WjQah]h]h]uhjVh]r(WhXdoxygenr)Wr*W}r+W(hUhj$WubahjVubhX or r,Wr-W}r.W(hX or hjVubjL)r/W}r0W(hX:command:`epydoc`h}r1W(h]h]r2WjQah]h]h]uhjVh]r3WhXepydocr4Wr5W}r6W(hUhj/WubahjVubhXG). We want to move the entire documentation to the buildmaster, into a r7Wr8W}r9W(hXG). We want to move the entire documentation to the buildmaster, into a hjVubh)r:W}r;W(hUh}rWaUrolej>Wh]uhjVh]r?WhX~/public_html/docsr@WrAW}rBW(hX~/public_html/docshj:WubahhubhX directory, and add a link to the uploaded documentation on the HTML status page. On the slave-side the directory can be found under rCWrDW}rEW(hX directory, and add a link to the uploaded documentation on the HTML status page. On the slave-side the directory can be found under hjVubh)rFW}rGW(hUh}rHW(h]h]h]h]rIWXfilerJWaUrolejJWh]uhjVh]rKWhXdocsrLWrMW}rNW(hXdocshjFWubahhubhX:rOW}rPW(hX:hjVubeubjS)rQW}rRW(hX+from buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import DirectoryUpload f.addStep(ShellCommand(command=["make", "docs"])) f.addStep(DirectoryUpload(slavesrc="docs", masterdest="~/public_html/docs", url="~buildbot/docs"))hjVhhhjVh}rSW(jXjYh]h]h]h]h]uhM hhh]rTWhX+from buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import DirectoryUpload f.addStep(ShellCommand(command=["make", "docs"])) f.addStep(DirectoryUpload(slavesrc="docs", masterdest="~/public_html/docs", url="~buildbot/docs"))rUWrVW}rWW(hUhjQWubaubh)rXW}rYW(hXoThe :bb:step:`DirectoryUpload` step will create all necessary directories and transfers empty directories, too.hjVhhhhh}rZW(h]h]h]h]h]uhM hhh]r[W(hXThe r\Wr]W}r^W(hXThe hjXWubh)r_W}r`W(hX:bb:step:`DirectoryUpload`raWhjXWhhhhh}rbW(UreftypeXstephhXDirectoryUploadU refdomainXbbrcWh]h]U refexplicith]h]h]hhuhM h]rdWh)reW}rfW(hjaWh}rgW(h]h]rhW(hjcWXbb-stepriWeh]h]h]uhj_Wh]rjWhXDirectoryUploadrkWrlW}rmW(hUhjeWubahhubaubhXQ step will create all necessary directories and transfers empty directories, too.rnWroW}rpW(hXQ step will create all necessary directories and transfers empty directories, too.hjXWubeubh)rqW}rrW(hXThe ``maxsize`` and ``blocksize`` parameters are the same as for :bb:step:`FileUpload`, although note that the size of the transferred data is implementation-dependent, and probably much larger than you expect due to the encoding used (currently tar).hjVhhhhh}rsW(h]h]h]h]h]uhM hhh]rtW(hXThe ruWrvW}rwW(hXThe hjqWubh)rxW}ryW(hX ``maxsize``h}rzW(h]h]h]h]h]uhjqWh]r{WhXmaxsizer|Wr}W}r~W(hUhjxWubahhubhX and rWrW}rW(hX and hjqWubh)rW}rW(hX ``blocksize``h}rW(h]h]h]h]h]uhjqWh]rWhX blocksizerWrW}rW(hUhjWubahhubhX parameters are the same as for rWrW}rW(hX parameters are the same as for hjqWubh)rW}rW(hX:bb:step:`FileUpload`rWhjqWhhhhh}rW(UreftypeXstephhX FileUploadU refdomainXbbrWh]h]U refexplicith]h]h]hhuhM h]rWh)rW}rW(hjWh}rW(h]h]rW(hjWXbb-steprWeh]h]h]uhjWh]rWhX FileUploadrWrW}rW(hUhjWubahhubaubhX, although note that the size of the transferred data is implementation-dependent, and probably much larger than you expect due to the encoding used (currently tar).rWrW}rW(hX, although note that the size of the transferred data is implementation-dependent, and probably much larger than you expect due to the encoding used (currently tar).hjqWubeubh)rW}rW(hXdThe optional ``compress`` argument can be given as ``'gz'`` or ``'bz2'`` to compress the datastream.hjVhhhhh}rW(h]h]h]h]h]uhM hhh]rW(hX The optional rWrW}rW(hX The optional hjWubh)rW}rW(hX ``compress``h}rW(h]h]h]h]h]uhjWh]rWhXcompressrWrW}rW(hUhjWubahhubhX argument can be given as rWrW}rW(hX argument can be given as hjWubh)rW}rW(hX``'gz'``h}rW(h]h]h]h]h]uhjWh]rWhX'gz'rWrW}rW(hUhjWubahhubhX or rWrW}rW(hX or hjWubh)rW}rW(hX ``'bz2'``h}rW(h]h]h]h]h]uhjWh]rWhX'bz2'rWrW}rW(hUhjWubahhubhX to compress the datastream.rWrW}rW(hX to compress the datastream.hjWubeubj")rW}rW(hXThe permissions on the copied files will be the same on the master as originally on the slave, see :option:`buildslave create-slave --umask` to change the default one.hjVhhhj"h}rW(h]h]h]h]h]uhNhhh]rWh)rW}rW(hXThe permissions on the copied files will be the same on the master as originally on the slave, see :option:`buildslave create-slave --umask` to change the default one.hjWhhhhh}rW(h]h]h]h]h]uhM h]rW(hXcThe permissions on the copied files will be the same on the master as originally on the slave, see rWrW}rW(hXcThe permissions on the copied files will be the same on the master as originally on the slave, see hjWubh)rW}rW(hX):option:`buildslave create-slave --umask`rWhjWhhhhh}rW(UreftypeXoptionhhX--umaskU refdomainXstdrWjXbuildslave-create-slaveh]h]U refexplicith]h]h]hhuhM h]rWj)rW}rW(hjWh}rW(h]h]rW(hjWX std-optionrWeh]h]h]uhjWh]rWhXbuildslave create-slave --umaskrWrW}rW(hUhjWubahjubaubhX to change the default one.rWrW}rW(hX to change the default one.hjWubeubaubj)rW}rW(hUhjVhhhj h}rW(h]h]h]h]h]Uentries]rW((UsingleXBuild Steps; MultipleFileUploadXstep-MultipleFileUploadrWjWtrW(UsingleXMultipleFileUpload Build StepjWjWtrWeuhM" hhh]ubh)rW}rW(hUhjVhhhhh}rW(h]h]h]h]h]hjWuhM" hhh]ubeubh)rW}rW(hUhjShhh}hhh}rW(h]h]h]h]rW(j"jWeh]rWhauhM$ hhh}rWjWjWsh]rW(h)rW}rW(hj'hjWhhhhh}rW(h]h]h]h]h]hj!uhM$ hhh]rWhX#Transferring Multiple Files At OncerWrW}rW(hj'hjWubaubj)rW}rW(hUhjWhNhj h}rW(h]h]h]h]h]Uentries]rW(jXKbuildbot.steps.transfer.MultipleFileUpload (class in buildbot.steps.source)hUtrWauhNhhh]ubj )rW}rW(hUhjWhNhj h}rW(j j Xpyh]h]h]h]h]j XclassrXj jXuhNhhh]rX(j )rX}rX(hX*buildbot.steps.transfer.MultipleFileUploadhjWhhhj h}rX(h]rXhaj j h]h]h]h]rXhaj X*buildbot.steps.transfer.MultipleFileUploadj Xbuildbot.steps.transferj uhM' hhh]rX(j )rX}r X(hXclass hjXhhhj h}r X(h]h]h]h]h]uhM' hhh]r XhXclass r Xr X}rX(hUhjXubaubj )rX}rX(hXbuildbot.steps.transfer.hjXhhhj h}rX(h]h]h]h]h]uhM' hhh]rXhXbuildbot.steps.transfer.rXrX}rX(hUhjXubaubj )rX}rX(hXMultipleFileUploadhjXhhhj h}rX(h]h]h]h]h]uhM' hhh]rXhXMultipleFileUploadrXrX}rX(hUhjXubaubeubj )rX}rX(hUhjWhhhj h}rX(h]h]h]h]h]uhM' hhh]ubeubh)r X}r!X(hXIn addition to the :bb:step:`FileUpload` and :bb:step:`DirectoryUpload` steps there is the :bb:step:`MultipleFileUpload` step for uploading a bunch of files (and directories) in a single :class:`BuildStep`. The step supports all arguments that are supported by :bb:step:`FileUpload` and :bb:step:`DirectoryUpload`, but instead of a the single ``slavesrc`` parameter it takes a (plural) ``slavesrcs`` parameter. This parameter should either be a list, or something that can be rendered as a list.::hjWhhhhh}r"X(h]h]h]h]h]uhM( hhh]r#X(hXIn addition to the r$Xr%X}r&X(hXIn addition to the hj Xubh)r'X}r(X(hX:bb:step:`FileUpload`r)Xhj Xhhhhh}r*X(UreftypeXstephhX FileUploadU refdomainXbbr+Xh]h]U refexplicith]h]h]hhuhM( h]r,Xh)r-X}r.X(hj)Xh}r/X(h]h]r0X(hj+XXbb-stepr1Xeh]h]h]uhj'Xh]r2XhX FileUploadr3Xr4X}r5X(hUhj-XubahhubaubhX and r6Xr7X}r8X(hX and hj Xubh)r9X}r:X(hX:bb:step:`DirectoryUpload`r;Xhj Xhhhhh}rXh)r?X}r@X(hj;Xh}rAX(h]h]rBX(hj=XXbb-steprCXeh]h]h]uhj9Xh]rDXhXDirectoryUploadrEXrFX}rGX(hUhj?XubahhubaubhX steps there is the rHXrIX}rJX(hX steps there is the hj Xubh)rKX}rLX(hX:bb:step:`MultipleFileUpload`rMXhj Xhhhhh}rNX(UreftypeXstephhXMultipleFileUploadU refdomainXbbrOXh]h]U refexplicith]h]h]hhuhM( h]rPXh)rQX}rRX(hjMXh}rSX(h]h]rTX(hjOXXbb-steprUXeh]h]h]uhjKXh]rVXhXMultipleFileUploadrWXrXX}rYX(hUhjQXubahhubaubhXC step for uploading a bunch of files (and directories) in a single rZXr[X}r\X(hXC step for uploading a bunch of files (and directories) in a single hj Xubh)r]X}r^X(hX:class:`BuildStep`r_Xhj Xhhhhh}r`X(UreftypeXclasshhX BuildStepU refdomainXpyraXh]h]U refexplicith]h]h]hhhNhj uhM( h]rbXh)rcX}rdX(hj_Xh}reX(h]h]rfX(hjaXXpy-classrgXeh]h]h]uhj]Xh]rhXhX BuildStepriXrjX}rkX(hUhjcXubahhubaubhX8. The step supports all arguments that are supported by rlXrmX}rnX(hX8. The step supports all arguments that are supported by hj Xubh)roX}rpX(hX:bb:step:`FileUpload`rqXhj Xhhhhh}rrX(UreftypeXstephhX FileUploadU refdomainXbbrsXh]h]U refexplicith]h]h]hhuhM( h]rtXh)ruX}rvX(hjqXh}rwX(h]h]rxX(hjsXXbb-stepryXeh]h]h]uhjoXh]rzXhX FileUploadr{Xr|X}r}X(hUhjuXubahhubaubhX and r~XrX}rX(hX and hj Xubh)rX}rX(hX:bb:step:`DirectoryUpload`rXhj Xhhhhh}rX(UreftypeXstephhXDirectoryUploadU refdomainXbbrXh]h]U refexplicith]h]h]hhuhM( h]rXh)rX}rX(hjXh}rX(h]h]rX(hjXXbb-steprXeh]h]h]uhjXh]rXhXDirectoryUploadrXrX}rX(hUhjXubahhubaubhX, but instead of a the single rXrX}rX(hX, but instead of a the single hj Xubh)rX}rX(hX ``slavesrc``h}rX(h]h]h]h]h]uhj Xh]rXhXslavesrcrXrX}rX(hUhjXubahhubhX parameter it takes a (plural) rXrX}rX(hX parameter it takes a (plural) hj Xubh)rX}rX(hX ``slavesrcs``h}rX(h]h]h]h]h]uhj Xh]rXhX slavesrcsrXrX}rX(hUhjXubahhubhXa parameter. This parameter should either be a list, or something that can be rendered as a list.:rXrX}rX(hXa parameter. This parameter should either be a list, or something that can be rendered as a list.:hj XubeubjS)rX}rX(hX}from buildbot.steps.shell import ShellCommand, Test from buildbot.steps.transfer import MultipleFileUpload f.addStep(ShellCommand(command=["make", "test"])) f.addStep(ShellCommand(command=["make", "docs"])) f.addStep(MultipleFileUpload(slavesrcs=["docs", "test-results.html"], masterdest="~/public_html", url="~buildbot"))hjWhhhjVh}rX(jXjYh]h]h]h]h]uhM0 hhh]rXhX}from buildbot.steps.shell import ShellCommand, Test from buildbot.steps.transfer import MultipleFileUpload f.addStep(ShellCommand(command=["make", "test"])) f.addStep(ShellCommand(command=["make", "docs"])) f.addStep(MultipleFileUpload(slavesrcs=["docs", "test-results.html"], masterdest="~/public_html", url="~buildbot"))rXrX}rX(hUhjXubaubh)rX}rX(hXeThe ``url=`` parameter, can be used to specify a link to be displayed in the HTML status of the step.hjWhhhhh}rX(h]h]h]h]h]uhM9 hhh]rX(hXThe rXrX}rX(hXThe hjXubh)rX}rX(hX``url=``h}rX(h]h]h]h]h]uhjXh]rXhXurl=rXrX}rX(hUhjXubahhubhXY parameter, can be used to specify a link to be displayed in the HTML status of the step.rXrX}rX(hXY parameter, can be used to specify a link to be displayed in the HTML status of the step.hjXubeubh)rX}rX(hX4The way URLs are added to the step can be customized by extending the :bb:step:`MultipleFileUpload` class. the `allUploadsDone` method is called after all files have been uploaded and sets the URL. The `uploadDone` method is called once for each uploaded file and can be used to create file-specific links.::hjWhhhhh}rX(h]h]h]h]h]uhM< hhh]rX(hXFThe way URLs are added to the step can be customized by extending the rXrX}rX(hXFThe way URLs are added to the step can be customized by extending the hjXubh)rX}rX(hX:bb:step:`MultipleFileUpload`rXhjXhhhhh}rX(UreftypeXstephhXMultipleFileUploadU refdomainXbbrXh]h]U refexplicith]h]h]hhuhM< h]rXh)rX}rX(hjXh}rX(h]h]rX(hjXXbb-steprXeh]h]h]uhjXh]rXhXMultipleFileUploadrXrX}rX(hUhjXubahhubaubhX class. the rXrX}rX(hX class. the hjXubjE)rX}rX(hX`allUploadsDone`h}rX(h]h]h]h]h]uhjXh]rXhXallUploadsDonerXrX}rX(hUhjXubahjMubhXK method is called after all files have been uploaded and sets the URL. The rXrX}rX(hXK method is called after all files have been uploaded and sets the URL. The hjXubjE)rX}rX(hX `uploadDone`h}rX(h]h]h]h]h]uhjXh]rXhX uploadDonerXrX}rX(hUhjXubahjMubhX] method is called once for each uploaded file and can be used to create file-specific links.:rXrX}rX(hX] method is called once for each uploaded file and can be used to create file-specific links.:hjXubeubjS)rX}rX(hX from buildbot.steps.transfer import MultipleFileUpload import os.path class CustomFileUpload(MultipleFileUpload): linkTypes = ('.html', '.txt') def linkFile(self, basename): name, ext = os.path.splitext(basename) return ext in self.linkTypes def uploadDone(self, result, source, masterdest): if self.url: basename = os.path.basename(source) if self.linkFile(basename): self.addURL(self.url + '/' + basename, basename) def allUploadsDone(self, result, sources, masterdest): if self.url: notLinked = filter(lambda src: not self.linkFile(src), sources) numFiles = len(notLinked) if numFiles: self.addURL(self.url, '... %d more' % numFiles)hjWhhhjVh}rX(jXjYh]h]h]h]h]uhMB hhh]rXhX from buildbot.steps.transfer import MultipleFileUpload import os.path class CustomFileUpload(MultipleFileUpload): linkTypes = ('.html', '.txt') def linkFile(self, basename): name, ext = os.path.splitext(basename) return ext in self.linkTypes def uploadDone(self, result, source, masterdest): if self.url: basename = os.path.basename(source) if self.linkFile(basename): self.addURL(self.url + '/' + basename, basename) def allUploadsDone(self, result, sources, masterdest): if self.url: notLinked = filter(lambda src: not self.linkFile(src), sources) numFiles = len(notLinked) if numFiles: self.addURL(self.url, '... %d more' % numFiles)rXrX}rX(hUhjXubaubj)rX}rX(hUhjWhhhj h}rX(h]h]h]h]h]Uentries]rX((UsingleXBuild Steps; StringDownloadXstep-StringDownloadrXjXtrX(UsingleXStringDownload Build StepjXjXtrXeuhMZ hhh]ubh)rX}rX(hUhjWhhhhh}rX(h]h]h]h]rXjXah]uhMZ hhh]ubj)rX}rX(hUhjWhhhj h}rY(h]h]h]h]h]Uentries]rY((UsingleXBuild Steps; JSONStringDownloadXstep-JSONStringDownloadrYjYtrY(UsingleXJSONStringDownload Build StepjYjYtrYeuhM[ hhh]ubh)rY}rY(hUhjWhhhhh}rY(h]h]h]h]rYjYah]uhM[ hhh]ubj)r Y}r Y(hUhjWhhhj h}r Y(h]h]h]h]h]Uentries]r Y((UsingleX#Build Steps; JSONPropertiesDownloadXstep-JSONPropertiesDownloadr Yj YtrY(UsingleX!JSONPropertiesDownload Build Stepj Yj YtrYeuhM] hhh]ubh)rY}rY(hUhjWhhhhh}rY(h]h]h]h]h]hj YuhM] hhh]ubeubeubh)rY}rY(hUhhhhh}hhh}rY(h]h]h]h]rY(j5j Yeh]rYhmauhM_ hhh}rYj YjYsh]rY(h)rY}rY(hj:hjYhhhhh}rY(h]h]h]h]h]hj4uhM_ hhh]rYhXTransfering StringsrYrY}r Y(hj:hjYubaubj)r!Y}r"Y(hUhjYhNhj h}r#Y(h]h]h]h]h]Uentries]r$Y(jXGbuildbot.steps.transfer.StringDownload (class in buildbot.steps.source)h2Utr%YauhNhhh]ubj )r&Y}r'Y(hUhjYhNhj h}r(Y(j j Xpyh]h]h]h]h]j Xclassr)Yj j)YuhNhhh]r*Y(j )r+Y}r,Y(hX&buildbot.steps.transfer.StringDownloadhj&Yhhhj h}r-Y(h]r.Yh2aj j h]h]h]h]r/Yh2aj X&buildbot.steps.transfer.StringDownloadj Xbuildbot.steps.transferj uhMa hhh]r0Y(j )r1Y}r2Y(hXclass hj+Yhhhj h}r3Y(h]h]h]h]h]uhMa hhh]r4YhXclass r5Yr6Y}r7Y(hUhj1Yubaubj )r8Y}r9Y(hXbuildbot.steps.transfer.hj+Yhhhj h}r:Y(h]h]h]h]h]uhMa hhh]r;YhXbuildbot.steps.transfer.rY(hUhj8Yubaubj )r?Y}r@Y(hXStringDownloadhj+Yhhhj h}rAY(h]h]h]h]h]uhMa hhh]rBYhXStringDownloadrCYrDY}rEY(hUhj?Yubaubeubj )rFY}rGY(hUhj&Yhhhj h}rHY(h]h]h]h]h]uhMa hhh]ubeubj)rIY}rJY(hUhjYhNhj h}rKY(h]h]h]h]h]Uentries]rLY(jXKbuildbot.steps.transfer.JSONStringDownload (class in buildbot.steps.source)hGUtrMYauhNhhh]ubj )rNY}rOY(hUhjYhNhj h}rPY(j j Xpyh]h]h]h]h]j XclassrQYj jQYuhNhhh]rRY(j )rSY}rTY(hX*buildbot.steps.transfer.JSONStringDownloadhjNYhhhj h}rUY(h]rVYhGaj j h]h]h]h]rWYhGaj X*buildbot.steps.transfer.JSONStringDownloadj Xbuildbot.steps.transferj uhMb hhh]rXY(j )rYY}rZY(hXclass hjSYhhhj h}r[Y(h]h]h]h]h]uhMb hhh]r\YhXclass r]Yr^Y}r_Y(hUhjYYubaubj )r`Y}raY(hXbuildbot.steps.transfer.hjSYhhhj h}rbY(h]h]h]h]h]uhMb hhh]rcYhXbuildbot.steps.transfer.rdYreY}rfY(hUhj`Yubaubj )rgY}rhY(hXJSONStringDownloadhjSYhhhj h}riY(h]h]h]h]h]uhMb hhh]rjYhXJSONStringDownloadrkYrlY}rmY(hUhjgYubaubeubj )rnY}roY(hUhjNYhhhj h}rpY(h]h]h]h]h]uhMb hhh]ubeubj)rqY}rrY(hUhjYhNhj h}rsY(h]h]h]h]h]Uentries]rtY(jXObuildbot.steps.transfer.JSONPropertiesDownload (class in buildbot.steps.source)h3UtruYauhNhhh]ubj )rvY}rwY(hUhjYhNhj h}rxY(j j Xpyh]h]h]h]h]j XclassryYj jyYuhNhhh]rzY(j )r{Y}r|Y(hX.buildbot.steps.transfer.JSONPropertiesDownloadhjvYhhhj h}r}Y(h]r~Yh3aj j h]h]h]h]rYh3aj X.buildbot.steps.transfer.JSONPropertiesDownloadj Xbuildbot.steps.transferj uhMd hhh]rY(j )rY}rY(hXclass hj{Yhhhj h}rY(h]h]h]h]h]uhMd hhh]rYhXclass rYrY}rY(hUhjYubaubj )rY}rY(hXbuildbot.steps.transfer.hj{Yhhhj h}rY(h]h]h]h]h]uhMd hhh]rYhXbuildbot.steps.transfer.rYrY}rY(hUhjYubaubj )rY}rY(hXJSONPropertiesDownloadhj{Yhhhj h}rY(h]h]h]h]h]uhMd hhh]rYhXJSONPropertiesDownloadrYrY}rY(hUhjYubaubeubj )rY}rY(hUhjvYhhhj h}rY(h]h]h]h]h]uhMd hhh]ubeubh)rY}rY(hXSometimes it is useful to transfer a calculated value from the master to the slave. Instead of having to create a temporary file and then use FileDownload, you can use one of the string download steps. ::hjYhhhhh}rY(h]h]h]h]h]uhMe hhh]rYhXSometimes it is useful to transfer a calculated value from the master to the slave. Instead of having to create a temporary file and then use FileDownload, you can use one of the string download steps.rYrY}rY(hXSometimes it is useful to transfer a calculated value from the master to the slave. Instead of having to create a temporary file and then use FileDownload, you can use one of the string download steps.hjYubaubjS)rY}rY(hXfrom buildbot.steps.transfer import StringDownload f.addStep(StringDownload(Interpolate("%(src::branch)s-%(prop:got_revision)s\n"), slavedest="buildid.txt"))hjYhhhjVh}rY(jXjYh]h]h]h]h]uhMi hhh]rYhXfrom buildbot.steps.transfer import StringDownload f.addStep(StringDownload(Interpolate("%(src::branch)s-%(prop:got_revision)s\n"), slavedest="buildid.txt"))rYrY}rY(hUhjYubaubh)rY}rY(hX:bb:step:`StringDownload` works just like :bb:step:`FileDownload` except it takes a single argument, ``s``, representing the string to download instead of a ``mastersrc`` argument. ::hjYhhhhh}rY(h]h]h]h]h]uhMm hhh]rY(h)rY}rY(hX:bb:step:`StringDownload`rYhjYhhhhh}rY(UreftypeXstephhXStringDownloadU refdomainXbbrYh]h]U refexplicith]h]h]hhuhMm h]rYh)rY}rY(hjYh}rY(h]h]rY(hjYXbb-steprYeh]h]h]uhjYh]rYhXStringDownloadrYrY}rY(hUhjYubahhubaubhX works just like rYrY}rY(hX works just like hjYubh)rY}rY(hX:bb:step:`FileDownload`rYhjYhhhhh}rY(UreftypeXstephhX FileDownloadU refdomainXbbrYh]h]U refexplicith]h]h]hhuhMm h]rYh)rY}rY(hjYh}rY(h]h]rY(hjYXbb-steprYeh]h]h]uhjYh]rYhX FileDownloadrYrY}rY(hUhjYubahhubaubhX$ except it takes a single argument, rYrY}rY(hX$ except it takes a single argument, hjYubh)rY}rY(hX``s``h}rY(h]h]h]h]h]uhjYh]rYhXsrY}rY(hUhjYubahhubhX3, representing the string to download instead of a rYrY}rY(hX3, representing the string to download instead of a hjYubh)rY}rY(hX ``mastersrc``h}rY(h]h]h]h]h]uhjYh]rYhX mastersrcrYrY}rY(hUhjYubahhubhX argument.rYrY}rY(hX argument.hjYubeubjS)rY}rY(hXfrom buildbot.steps.transfer import JSONStringDownload buildinfo = { branch: Property('branch'), got_revision: Property('got_revision') } f.addStep(JSONStringDownload(buildinfo, slavedest="buildinfo.json"))hjYhhhjVh}rY(jXjYh]h]h]h]h]uhMp hhh]rYhXfrom buildbot.steps.transfer import JSONStringDownload buildinfo = { branch: Property('branch'), got_revision: Property('got_revision') } f.addStep(JSONStringDownload(buildinfo, slavedest="buildinfo.json"))rYrY}rY(hUhjYubaubh)rY}rY(hX:bb:step:`JSONStringDownload` is similar, except it takes an ``o`` argument, which must be JSON serializable, and transfers that as a JSON-encoded string to the slave.hjYhhhhh}rY(h]h]h]h]h]uhMt hhh]rY(h)rY}rY(hX:bb:step:`JSONStringDownload`rYhjYhhhhh}rY(UreftypeXstephhXJSONStringDownloadU refdomainXbbrYh]h]U refexplicith]h]h]hhuhMt h]rYh)rY}rY(hjYh}rY(h]h]rY(hjYXbb-steprYeh]h]h]uhjYh]rYhXJSONStringDownloadrYrY}rY(hUhjYubahhubaubhX is similar, except it takes an rYrY}rY(hX is similar, except it takes an hjYubh)rY}rZ(hX``o``h}rZ(h]h]h]h]h]uhjYh]rZhXorZ}rZ(hUhjYubahhubhXe argument, which must be JSON serializable, and transfers that as a JSON-encoded string to the slave.rZrZ}rZ(hXe argument, which must be JSON serializable, and transfers that as a JSON-encoded string to the slave.hjYubeubj)rZ}r Z(hUhjYhhhj h}r Z(h]h]h]h]h]j ]r Z(jX"Properties; JSONPropertiesDownloadUindex-29r ZUtr ZajuhMw hhh]ubh)rZ}rZ(hUhjYhhhhh}rZ(h]h]h]h]h]hj ZuhMx hhh]ubjS)rZ}rZ(hXfrom buildbot.steps.transfer import JSONPropertiesDownload f.addStep(JSONPropertiesDownload(slavedest="build-properties.json"))hjYhhh}hjVh}rZ(jXjYh]rZj Zah]h]h]h]uhM{ hhh}rZj ZjZsh]rZhXfrom buildbot.steps.transfer import JSONPropertiesDownload f.addStep(JSONPropertiesDownload(slavedest="build-properties.json"))rZrZ}rZ(hUhjZubaubh)rZ}rZ(hX:bb:step:`JSONPropertiesDownload` transfers a json-encoded string that represents a dictionary where properties maps to a dictionary of build property ``name`` to property ``value``; and ``sourcestamp`` represents the build's sourcestamp.hjYhhhhh}rZ(h]h]h]h]h]uhM~ hhh]rZ(h)rZ}rZ(hX!:bb:step:`JSONPropertiesDownload`r ZhjZhhhhh}r!Z(UreftypeXstephhXJSONPropertiesDownloadU refdomainXbbr"Zh]h]U refexplicith]h]h]hhuhM~ h]r#Zh)r$Z}r%Z(hj Zh}r&Z(h]h]r'Z(hj"ZXbb-stepr(Zeh]h]h]uhjZh]r)ZhXJSONPropertiesDownloadr*Zr+Z}r,Z(hUhj$ZubahhubaubhXv transfers a json-encoded string that represents a dictionary where properties maps to a dictionary of build property r-Zr.Z}r/Z(hXv transfers a json-encoded string that represents a dictionary where properties maps to a dictionary of build property hjZubh)r0Z}r1Z(hX``name``h}r2Z(h]h]h]h]h]uhjZh]r3ZhXnamer4Zr5Z}r6Z(hUhj0ZubahhubhX to property r7Zr8Z}r9Z(hX to property hjZubh)r:Z}r;Z(hX ``value``h}rZr?Z}r@Z(hUhj:ZubahhubhX; and rAZrBZ}rCZ(hX; and hjZubh)rDZ}rEZ(hX``sourcestamp``h}rFZ(h]h]h]h]h]uhjZh]rGZhX sourcestamprHZrIZ}rJZ(hUhjDZubahhubhX$ represents the build's sourcestamp.rKZrLZ}rMZ(hX$ represents the build's sourcestamp.hjZubeubj)rNZ}rOZ(hUhjYhhhj h}rPZ(h]h]h]h]h]Uentries]rQZ((UsingleXBuild Steps; MasterShellCommandXstep-MasterShellCommandrRZjRZtrSZ(UsingleXMasterShellCommand Build StepjRZjRZtrTZeuhM hhh]ubh)rUZ}rVZ(hUhjYhhhhh}rWZ(h]h]h]h]h]hjRZuhM hhh]ubeubh)rXZ}rYZ(hUhhhhh}hhh}rZZ(h]h]h]h]r[Z(jHjRZeh]r\ZhqauhM hhh}r]ZjRZjUZsh]r^Z(h)r_Z}r`Z(hjMhjXZhhhhh}raZ(h]h]h]h]h]hjGuhM hhh]rbZhXRunning Commands on the MasterrcZrdZ}reZ(hjMhj_Zubaubj)rfZ}rgZ(hUhjXZhNhj h}rhZ(h]h]h]h]h]Uentries]riZ(jXIbuildbot.steps.master.MasterShellCommand (class in buildbot.steps.source)h?UtrjZauhNhhh]ubj )rkZ}rlZ(hUhjXZhNhj h}rmZ(j j Xpyh]h]h]h]h]j XclassrnZj jnZuhNhhh]roZ(j )rpZ}rqZ(hX(buildbot.steps.master.MasterShellCommandhjkZhhhj h}rrZ(h]rsZh?aj j h]h]h]h]rtZh?aj X(buildbot.steps.master.MasterShellCommandj Xbuildbot.steps.masterj uhM hhh]ruZ(j )rvZ}rwZ(hXclass hjpZhhhj h}rxZ(h]h]h]h]h]uhM hhh]ryZhXclass rzZr{Z}r|Z(hUhjvZubaubj )r}Z}r~Z(hXbuildbot.steps.master.hjpZhhhj h}rZ(h]h]h]h]h]uhM hhh]rZhXbuildbot.steps.master.rZrZ}rZ(hUhj}Zubaubj )rZ}rZ(hXMasterShellCommandhjpZhhhj h}rZ(h]h]h]h]h]uhM hhh]rZhXMasterShellCommandrZrZ}rZ(hUhjZubaubeubj )rZ}rZ(hUhjkZhhhj h}rZ(h]h]h]h]h]uhM hhh]ubeubh)rZ}rZ(hXOccasionally, it is useful to execute some task on the master, for example to create a directory, deploy a build result, or trigger some other centralized processing. This is possible, in a limited fashion, with the :bb:step:`MasterShellCommand` step.hjXZhhhhh}rZ(h]h]h]h]h]uhM hhh]rZ(hXOccasionally, it is useful to execute some task on the master, for example to create a directory, deploy a build result, or trigger some other centralized processing. This is possible, in a limited fashion, with the rZrZ}rZ(hXOccasionally, it is useful to execute some task on the master, for example to create a directory, deploy a build result, or trigger some other centralized processing. This is possible, in a limited fashion, with the hjZubh)rZ}rZ(hX:bb:step:`MasterShellCommand`rZhjZhhhhh}rZ(UreftypeXstephhXMasterShellCommandU refdomainXbbrZh]h]U refexplicith]h]h]hhuhM h]rZh)rZ}rZ(hjZh}rZ(h]h]rZ(hjZXbb-steprZeh]h]h]uhjZh]rZhXMasterShellCommandrZrZ}rZ(hUhjZubahhubaubhX step.rZrZ}rZ(hX step.hjZubeubh)rZ}rZ(hXThis step operates similarly to a regular :bb:step:`ShellCommand`, but executes on the master, instead of the slave. To be clear, the enclosing :class:`Build` object must still have a slave object, just as for any other step -- only, in this step, the slave does not do anything.hjXZhhhhh}rZ(h]h]h]h]h]uhM hhh]rZ(hX*This step operates similarly to a regular rZrZ}rZ(hX*This step operates similarly to a regular hjZubh)rZ}rZ(hX:bb:step:`ShellCommand`rZhjZhhhhh}rZ(UreftypeXstephhX ShellCommandU refdomainXbbrZh]h]U refexplicith]h]h]hhuhM h]rZh)rZ}rZ(hjZh}rZ(h]h]rZ(hjZXbb-steprZeh]h]h]uhjZh]rZhX ShellCommandrZrZ}rZ(hUhjZubahhubaubhXP, but executes on the master, instead of the slave. To be clear, the enclosing rZrZ}rZ(hXP, but executes on the master, instead of the slave. To be clear, the enclosing hjZubh)rZ}rZ(hX:class:`Build`rZhjZhhhhh}rZ(UreftypeXclasshhXBuildU refdomainXpyrZh]h]U refexplicith]h]h]hhhNhj uhM h]rZh)rZ}rZ(hjZh}rZ(h]h]rZ(hjZXpy-classrZeh]h]h]uhjZh]rZhXBuildrZrZ}rZ(hUhjZubahhubaubhXy object must still have a slave object, just as for any other step -- only, in this step, the slave does not do anything.rZrZ}rZ(hXy object must still have a slave object, just as for any other step -- only, in this step, the slave does not do anything.hjZubeubh)rZ}rZ(hXLIn this example, the step renames a tarball based on the day of the week. ::rZhjXZhhhhh}rZ(h]h]h]h]h]uhM hhh]rZhXIIn this example, the step renames a tarball based on the day of the week.rZrZ}rZ(hXIIn this example, the step renames a tarball based on the day of the week.hjZubaubjS)rZ}rZ(hXefrom buildbot.steps.transfer import FileUpload from buildbot.steps.master import MasterShellCommand f.addStep(FileUpload(slavesrc="widgetsoft.tar.gz", masterdest="/var/buildoutputs/widgetsoft-new.tar.gz")) f.addStep(MasterShellCommand(command=""" cd /var/buildoutputs; mv widgetsoft-new.tar.gz widgetsoft-`date +%a`.tar.gz"""))hjXZhhhjVh}rZ(jXjYh]h]h]h]h]uhM hhh]rZhXefrom buildbot.steps.transfer import FileUpload from buildbot.steps.master import MasterShellCommand f.addStep(FileUpload(slavesrc="widgetsoft.tar.gz", masterdest="/var/buildoutputs/widgetsoft-new.tar.gz")) f.addStep(MasterShellCommand(command=""" cd /var/buildoutputs; mv widgetsoft-new.tar.gz widgetsoft-`date +%a`.tar.gz"""))rZrZ}rZ(hUhjZubaubj")rZ}rZ(hXBy default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an ``env={..}`` argument.hjXZhhhj"h}rZ(h]h]h]h]h]uhNhhh]rZh)rZ}rZ(hXBy default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an ``env={..}`` argument.hjZhhhhh}rZ(h]h]h]h]h]uhM h]rZ(hXBy default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an rZrZ}rZ(hXBy default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an hjZubh)rZ}rZ(hX ``env={..}``h}rZ(h]h]h]h]h]uhjZh]rZhXenv={..}rZrZ}rZ(hUhjZubahhubhX argument.rZrZ}rZ(hX argument.hjZubeubaubh)rZ}rZ(hXdEnvironment variables constructed using the ``env`` argument support expansion so that if you just want to prepend :file:`/home/buildbot/bin` to the :envvar:`PATH` environment variable, you can do it by putting the value ``${PATH}`` at the end of the value like in the example below. Variables that don't exist on the master will be replaced by ``""``. ::hjXZhhhhh}rZ(h]h]h]h]h]uhM hhh]rZ(hX,Environment variables constructed using the rZrZ}rZ(hX,Environment variables constructed using the hjZubh)rZ}rZ(hX``env``h}rZ(h]h]h]h]h]uhjZh]r[hXenvr[r[}r[(hUhjZubahhubhXA argument support expansion so that if you just want to prepend r[r[}r[(hXA argument support expansion so that if you just want to prepend hjZubh)r[}r[(hUh}r [(h]h]h]h]r [Xfiler [aUrolej [h]uhjZh]r [hX/home/buildbot/binr [r[}r[(hX/home/buildbot/binhj[ubahhubhX to the r[r[}r[(hX to the hjZubj)r[}r[(hUh}r[(h]h]h]h]h]j ]r[((jXPATHr[Uindex-30r[Utr[(jXenvironment variable; PATHj[Utr[euhjZh]hj ubh)r[}r[(hUh}r[(h]h]h]h]r[j[ah]uhjZh]hhubh)r[}r [(hX:envvar:`PATH`r![hjZhhhhh}r"[(UreftypeXenvvarhhj[U refdomainXstdr#[h]h]U refexplicith]h]h]hhuhM h]r$[h)r%[}r&[(hj![h}r'[(h]h]r([(hj#[X std-envvarr)[eh]h]h]uhj[h]r*[hXPATHr+[r,[}r-[(hUhj%[ubahhubaubhX: environment variable, you can do it by putting the value r.[r/[}r0[(hX: environment variable, you can do it by putting the value hjZubh)r1[}r2[(hX ``${PATH}``h}r3[(h]h]h]h]h]uhjZh]r4[hX${PATH}r5[r6[}r7[(hUhj1[ubahhubhXq at the end of the value like in the example below. Variables that don't exist on the master will be replaced by r8[r9[}r:[(hXq at the end of the value like in the example below. Variables that don't exist on the master will be replaced by hjZubh)r;[}r<[(hX``""``h}r=[(h]h]h]h]h]uhjZh]r>[hX""r?[r@[}rA[(hUhj;[ubahhubhX.rB[}rC[(hX.hjZubeubjS)rD[}rE[(hXfrom buildbot.steps.master import MasterShellCommand f.addStep(MasterShellCommand( command=["make", "www"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))hjXZhhhjVh}rF[(jXjYh]h]h]h]h]uhM hhh]rG[hXfrom buildbot.steps.master import MasterShellCommand f.addStep(MasterShellCommand( command=["make", "www"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))rH[rI[}rJ[(hUhjD[ubaubh)rK[}rL[(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as ``buildnumber`` must be substituted using :ref:`Interpolate`.hjXZhhhhh}rM[(h]h]h]h]h]uhM hhh]rN[(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as rO[rP[}rQ[(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as hjK[ubh)rR[}rS[(hX``buildnumber``h}rT[(h]h]h]h]h]uhjK[h]rU[hX buildnumberrV[rW[}rX[(hUhjR[ubahhubhX must be substituted using rY[rZ[}r[[(hX must be substituted using hjK[ubh)r\[}r][(hX:ref:`Interpolate`r^[hjK[hhhhh}r_[(UreftypeXrefhhX interpolateU refdomainXstdr`[h]h]U refexplicith]h]h]hhuhM h]ra[jW)rb[}rc[(hj^[h}rd[(h]h]re[(hj`[Xstd-refrf[eh]h]h]uhj\[h]rg[hX Interpolaterh[ri[}rj[(hUhjb[ubahjaubaubhX.rk[}rl[(hX.hjK[ubeubj)rm[}rn[(hUhjXZhhhjh}ro[(h]h]h]h]h]uhNhhh]rp[j)rq[}rr[(hX]``interruptSignal`` (optional) Signal to use to end the process, if the step is interrupted. hjm[hhhjh}rs[(h]h]h]h]h]uhM h]rt[(j)ru[}rv[(hX``interruptSignal``rw[hjq[hhhjh}rx[(h]h]h]h]h]uhM h]ry[h)rz[}r{[(hjw[h}r|[(h]h]h]h]h]uhju[h]r}[hXinterruptSignalr~[r[}r[(hUhjz[ubahhubaubj)r[}r[(hUh}r[(h]h]h]h]h]uhjq[h]r[h)r[}r[(hXH(optional) Signal to use to end the process, if the step is interrupted.r[hj[hhhhh}r[(h]h]h]h]h]uhM h]r[hXH(optional) Signal to use to end the process, if the step is interrupted.r[r[}r[(hj[hj[ubaubahjubeubaubj)r[}r[(hUhjXZhhhj h}r[(h]h]h]h]h]Uentries]r[((UsingleXBuild Steps; LogRenderableXstep-LogRenderabler[j[tr[(UsingleXLogRenderable Build Stepj[j[tr[euhM hhh]ubh)r[}r[(hUhjXZhhhhh}r[(h]h]h]h]h]hj[uhM hhh]ubh)r[}r[(hUhjXZhhh}hhh}r[(h]h]h]h]r[(j_j[eh]r[hUauhM hhh}r[j[j[sh]r[(h)r[}r[(hjdhj[hhhhh}r[(h]h]h]h]h]hj^uhM hhh]r[hX LogRenderabler[r[}r[(hjdhj[ubaubj)r[}r[(hUhj[hNhj h}r[(h]h]h]h]h]Uentries]r[(jXDbuildbot.steps.master.LogRenderable (class in buildbot.steps.source)hUtr[auhNhhh]ubj )r[}r[(hUhj[hNhj h}r[(j j Xpyh]h]h]h]h]j Xclassr[j j[uhNhhh]r[(j )r[}r[(hX#buildbot.steps.master.LogRenderablehj[hhhj h}r[(h]r[haj j h]h]h]h]r[haj X#buildbot.steps.master.LogRenderablej Xbuildbot.steps.masterj uhM hhh]r[(j )r[}r[(hXclass hj[hhhj h}r[(h]h]h]h]h]uhM hhh]r[hXclass r[r[}r[(hUhj[ubaubj )r[}r[(hXbuildbot.steps.master.hj[hhhj h}r[(h]h]h]h]h]uhM hhh]r[hXbuildbot.steps.master.r[r[}r[(hUhj[ubaubj )r[}r[(hX LogRenderablehj[hhhj h}r[(h]h]h]h]h]uhM hhh]r[hX LogRenderabler[r[}r[(hUhj[ubaubeubj )r[}r[(hUhj[hhhj h}r[(h]h]h]h]h]uhM hhh]ubeubh)r[}r[(hXThis build step takes content which can be renderable and logs it in a pretty-printed format. It can be useful for debugging properties during a build.r[hj[hhhhh}r[(h]h]h]h]h]uhM hhh]r[hXThis build step takes content which can be renderable and logs it in a pretty-printed format. It can be useful for debugging properties during a build.r[r[}r[(hj[hj[ubaubj)r[}r[(hUhj[hhhj h}r[(h]h]h]h]h]j ]r[(jXProperties; from stepsUindex-31r[Utr[ajuhM hhh]ubh)r[}r[(hUhj[hhhhh}r[(h]h]h]h]h]hj[uhM hhh]ubh)r[}r[(hX.. _Setting-Properties:hj[hhh}hhh}r[(h]h]h]h]h]hjruhM hhh}r[j[j[sh]ubeubeubh)r[}r[(hUhhhhh}r[h9j[shhh}r[(h]h]h]h]r[(jrj[Uid23r[eh]r[(hzh9euhM hhh}r[(j[j[jrj[uh]r[(h)r[}r[(hjwhj[hhhhh}r[(h]h]h]h]h]hjquhM hhh]r[hXSetting Propertiesr[r[}r[(hjwhj[ubaubh)r[}r[(hXMThese steps set properties on the master based on information from the slave.r[hj[hhhhh}r[(h]h]h]h]h]uhM hhh]r[hXMThese steps set properties on the master based on information from the slave.r[r[}r[(hj[hj[ubaubj)r[}r[(hUhj[hhhj h}r[(h]h]h]h]h]Uentries]r[((UsingleXBuild Steps; SetPropertyXstep-SetPropertyr[j[tr[(UsingleXSetProperty Build Stepj[j[tr\euhM hhh]ubh)r\}r\(hUhj[hhhhh}r\(h]h]h]h]h]hj[uhM hhh]ubh)r\}r\(hX.. _Step-SetProperty:hj[hhh}hhh}r\(h]h]h]h]h]hUstep-setpropertyr\uhM hhh}r\j[j\sh]ubh)r \}r \(hUhj[hhh}r \h>j\shhh}r \(h]h]h]h]r \(jj\j[eh]r\(hh>euhM hhh}r\(j[j\j\j\uh]r\(h)r\}r\(hjhj \hhhhh}r\(h]h]h]h]h]hjuhM hhh]r\hX SetPropertyr\r\}r\(hjhj\ubaubj)r\}r\(hUhj \hNhj h}r\(h]h]h]h]h]Uentries]r\(jXBbuildbot.steps.master.SetProperty (class in buildbot.steps.source)hUtr\auhNhhh]ubj )r\}r\(hUhj \hNhj h}r\(j j Xpyh]h]h]h]h]j Xclassr \j j \uhNhhh]r!\(j )r"\}r#\(hX!buildbot.steps.master.SetPropertyhj\hhhj h}r$\(h]r%\haj j h]h]h]h]r&\haj X!buildbot.steps.master.SetPropertyj Xbuildbot.steps.masterj uhM hhh]r'\(j )r(\}r)\(hXclass hj"\hhhj h}r*\(h]h]h]h]h]uhM hhh]r+\hXclass r,\r-\}r.\(hUhj(\ubaubj )r/\}r0\(hXbuildbot.steps.master.hj"\hhhj h}r1\(h]h]h]h]h]uhM hhh]r2\hXbuildbot.steps.master.r3\r4\}r5\(hUhj/\ubaubj )r6\}r7\(hX SetPropertyhj"\hhhj h}r8\(h]h]h]h]h]uhM hhh]r9\hX SetPropertyr:\r;\}r<\(hUhj6\ubaubeubj )r=\}r>\(hUhj\hhhj h}r?\(h]h]h]h]h]uhM hhh]ubeubh)r@\}rA\(hXSetProperty takes two arguments of ``property`` and ``value`` where the ``value`` is to be assigned to the ``property`` key. It is usually called with the ``value`` argument being specifed as a :ref:`Interpolate` object which allows the value to be built from other property values::hj \hhhhh}rB\(h]h]h]h]h]uhM hhh]rC\(hX#SetProperty takes two arguments of rD\rE\}rF\(hX#SetProperty takes two arguments of hj@\ubh)rG\}rH\(hX ``property``h}rI\(h]h]h]h]h]uhj@\h]rJ\hXpropertyrK\rL\}rM\(hUhjG\ubahhubhX and rN\rO\}rP\(hX and hj@\ubh)rQ\}rR\(hX ``value``h}rS\(h]h]h]h]h]uhj@\h]rT\hXvaluerU\rV\}rW\(hUhjQ\ubahhubhX where the rX\rY\}rZ\(hX where the hj@\ubh)r[\}r\\(hX ``value``h}r]\(h]h]h]h]h]uhj@\h]r^\hXvaluer_\r`\}ra\(hUhj[\ubahhubhX is to be assigned to the rb\rc\}rd\(hX is to be assigned to the hj@\ubh)re\}rf\(hX ``property``h}rg\(h]h]h]h]h]uhj@\h]rh\hXpropertyri\rj\}rk\(hUhje\ubahhubhX$ key. It is usually called with the rl\rm\}rn\(hX$ key. It is usually called with the hj@\ubh)ro\}rp\(hX ``value``h}rq\(h]h]h]h]h]uhj@\h]rr\hXvaluers\rt\}ru\(hUhjo\ubahhubhX argument being specifed as a rv\rw\}rx\(hX argument being specifed as a hj@\ubh)ry\}rz\(hX:ref:`Interpolate`r{\hj@\hhhhh}r|\(UreftypeXrefhhX interpolateU refdomainXstdr}\h]h]U refexplicith]h]h]hhuhM h]r~\jW)r\}r\(hj{\h}r\(h]h]r\(hj}\Xstd-refr\eh]h]h]uhjy\h]r\hX Interpolater\r\}r\(hUhj\ubahjaubaubhXF object which allows the value to be built from other property values:r\r\}r\(hXF object which allows the value to be built from other property values:hj@\ubeubjS)r\}r\(hXfrom buildbot.steps.master import SetProperty from buildbot.process.properties import Interpolate f.addStep(SetProperty(property="SomeProperty", value=Interpolate("sch=%(prop:scheduler)s, slave=%(prop:slavename)s")))hj \hhhjVh}r\(jXjYh]h]h]h]h]uhM hhh]r\hXfrom buildbot.steps.master import SetProperty from buildbot.process.properties import Interpolate f.addStep(SetProperty(property="SomeProperty", value=Interpolate("sch=%(prop:scheduler)s, slave=%(prop:slavename)s")))r\r\}r\(hUhj\ubaubj)r\}r\(hUhj \hhhj h}r\(h]h]h]h]h]Uentries]r\((UsingleX#Build Steps; SetPropertyFromCommandXstep-SetPropertyFromCommandr\j\tr\(UsingleX!SetPropertyFromCommand Build Stepj\j\tr\euhM hhh]ubh)r\}r\(hUhj \hhhhh}r\(h]h]h]h]h]hj\uhM hhh]ubeubh)r\}r\(hUhj[hhh}hhh}r\(h]h]h]h]r\(jj\eh]r\hgauhM hhh}r\j\j\sh]r\(h)r\}r\(hjhj\hhhhh}r\(h]h]h]h]h]hjuhM hhh]r\hXSetPropertyFromCommandr\r\}r\(hjhj\ubaubj)r\}r\(hUhj\hNhj h}r\(h]h]h]h]h]Uentries]r\(jXLbuildbot.steps.shell.SetPropertyFromCommand (class in buildbot.steps.source)h}Utr\auhNhhh]ubj )r\}r\(hUhj\hNhj h}r\(j j Xpyh]h]h]h]h]j Xclassr\j j\uhNhhh]r\(j )r\}r\(hX+buildbot.steps.shell.SetPropertyFromCommandhj\hhhj h}r\(h]r\h}aj j h]h]h]h]r\h}aj X+buildbot.steps.shell.SetPropertyFromCommandj Xbuildbot.steps.shellj uhM hhh]r\(j )r\}r\(hXclass hj\hhhj h}r\(h]h]h]h]h]uhM hhh]r\hXclass r\r\}r\(hUhj\ubaubj )r\}r\(hXbuildbot.steps.shell.hj\hhhj h}r\(h]h]h]h]h]uhM hhh]r\hXbuildbot.steps.shell.r\r\}r\(hUhj\ubaubj )r\}r\(hXSetPropertyFromCommandhj\hhhj h}r\(h]h]h]h]h]uhM hhh]r\hXSetPropertyFromCommandr\r\}r\(hUhj\ubaubeubj )r\}r\(hUhj\hhhj h}r\(h]h]h]h]h]uhM hhh]ubeubh)r\}r\(hXThis buildstep is similar to :bb:step:`ShellCommand`, except that it captures the output of the command into a property. It is usually used like this::hj\hhhhh}r\(h]h]h]h]h]uhM hhh]r\(hXThis buildstep is similar to r\r\}r\(hXThis buildstep is similar to hj\ubh)r\}r\(hX:bb:step:`ShellCommand`r\hj\hhhhh}r\(UreftypeXstephhX ShellCommandU refdomainXbbr\h]h]U refexplicith]h]h]hhuhM h]r\h)r\}r\(hj\h}r\(h]h]r\(hj\Xbb-stepr\eh]h]h]uhj\h]r\hX ShellCommandr\r\}r\(hUhj\ubahhubaubhXc, except that it captures the output of the command into a property. It is usually used like this:r\r\}r\(hXc, except that it captures the output of the command into a property. It is usually used like this:hj\ubeubjS)r\}r\(hXnfrom buildbot.steps import shell f.addStep(shell.SetPropertyFromCommand(command="uname -a", property="uname"))hj\hhhjVh}r\(jXjYh]h]h]h]h]uhM hhh]r\hXnfrom buildbot.steps import shell f.addStep(shell.SetPropertyFromCommand(command="uname -a", property="uname"))r\r\}r\(hUhj\ubaubh)r\}r\(hXThis runs ``uname -a`` and captures its stdout, stripped of leading and trailing whitespace, in the property ``uname``. To avoid stripping, add ``strip=False``.hj\hhhhh}r\(h]h]h]h]h]uhM hhh]r\(hX This runs r\r\}r\(hX This runs hj\ubh)r\}r\(hX ``uname -a``h}r\(h]h]h]h]h]uhj\h]r\hXuname -ar\r\}r\(hUhj\ubahhubhXW and captures its stdout, stripped of leading and trailing whitespace, in the property r]r]}r](hXW and captures its stdout, stripped of leading and trailing whitespace, in the property hj\ubh)r]}r](hX ``uname``h}r](h]h]h]h]h]uhj\h]r]hXunamer]r]}r ](hUhj]ubahhubhX. To avoid stripping, add r ]r ]}r ](hX. To avoid stripping, add hj\ubh)r ]}r](hX``strip=False``h}r](h]h]h]h]h]uhj\h]r]hX strip=Falser]r]}r](hUhj ]ubahhubhX.r]}r](hX.hj\ubeubh)r]}r](hXThe ``property`` argument can be specified as a :ref:`Interpolate` object, allowing the property name to be built from other property values.hj\hhhhh}r](h]h]h]h]h]uhM hhh]r](hXThe r]r]}r](hXThe hj]ubh)r]}r](hX ``property``h}r](h]h]h]h]h]uhj]h]r ]hXpropertyr!]r"]}r#](hUhj]ubahhubhX! argument can be specified as a r$]r%]}r&](hX! argument can be specified as a hj]ubh)r']}r(](hX:ref:`Interpolate`r)]hj]hhhhh}r*](UreftypeXrefhhX interpolateU refdomainXstdr+]h]h]U refexplicith]h]h]hhuhM h]r,]jW)r-]}r.](hj)]h}r/](h]h]r0](hj+]Xstd-refr1]eh]h]h]uhj']h]r2]hX Interpolater3]r4]}r5](hUhj-]ubahjaubaubhXK object, allowing the property name to be built from other property values.r6]r7]}r8](hXK object, allowing the property name to be built from other property values.hj]ubeubh)r9]}r:](hXThe more advanced usage allows you to specify a function to extract properties from the command output. Here you can use regular expressions, string interpolation, or whatever you would like. In this form, :func:`extract_fn` should be passed, and not :class:`Property`. The :func:`extract_fn` function is called with three arguments: the exit status of the command, its standard output as a string, and its standard error as a string. It should return a dictionary containing all new properties. ::hj\hhhhh}r;](h]h]h]h]h]uhM hhh]r<](hXThe more advanced usage allows you to specify a function to extract properties from the command output. Here you can use regular expressions, string interpolation, or whatever you would like. In this form, r=]r>]}r?](hXThe more advanced usage allows you to specify a function to extract properties from the command output. Here you can use regular expressions, string interpolation, or whatever you would like. In this form, hj9]ubh)r@]}rA](hX:func:`extract_fn`rB]hj9]hhhhh}rC](UreftypeXfunchhX extract_fnU refdomainXpyrD]h]h]U refexplicith]h]h]hhhNhj uhM h]rE]h)rF]}rG](hjB]h}rH](h]h]rI](hjD]Xpy-funcrJ]eh]h]h]uhj@]h]rK]hX extract_fnrL]rM]}rN](hUhjF]ubahhubaubhX should be passed, and not rO]rP]}rQ](hX should be passed, and not hj9]ubh)rR]}rS](hX:class:`Property`rT]hj9]hhhhh}rU](UreftypeXclasshhXPropertyU refdomainXpyrV]h]h]U refexplicith]h]h]hhhNhj uhM h]rW]h)rX]}rY](hjT]h}rZ](h]h]r[](hjV]Xpy-classr\]eh]h]h]uhjR]h]r]]hXPropertyr^]r_]}r`](hUhjX]ubahhubaubhX. The ra]rb]}rc](hX. The hj9]ubh)rd]}re](hX:func:`extract_fn`rf]hj9]hhhhh}rg](UreftypeXfunchhX extract_fnU refdomainXpyrh]h]h]U refexplicith]h]h]hhhNhj uhM h]ri]h)rj]}rk](hjf]h}rl](h]h]rm](hjh]Xpy-funcrn]eh]h]h]uhjd]h]ro]hX extract_fnrp]rq]}rr](hUhjj]ubahhubaubhX function is called with three arguments: the exit status of the command, its standard output as a string, and its standard error as a string. It should return a dictionary containing all new properties.rs]rt]}ru](hX function is called with three arguments: the exit status of the command, its standard output as a string, and its standard error as a string. It should return a dictionary containing all new properties.hj9]ubeubjS)rv]}rw](hXdef glob2list(rc, stdout, stderr): jpgs = [ l.strip() for l in stdout.split('\n') ] return { 'jpgs' : jpgs } f.addStep(SetPropertyFromCommand(command="ls -1 *.jpg", extract_fn=glob2list))hj\hhhjVh}rx](jXjYh]h]h]h]h]uhM hhh]ry]hXdef glob2list(rc, stdout, stderr): jpgs = [ l.strip() for l in stdout.split('\n') ] return { 'jpgs' : jpgs } f.addStep(SetPropertyFromCommand(command="ls -1 *.jpg", extract_fn=glob2list))rz]r{]}r|](hUhjv]ubaubh)r}]}r~](hXhNote that any ordering relationship of the contents of stdout and stderr is lost. For example, given ::hj\hhhhh}r](h]h]h]h]h]uhM hhh]r]hXeNote that any ordering relationship of the contents of stdout and stderr is lost. For example, givenr]r]}r](hXeNote that any ordering relationship of the contents of stdout and stderr is lost. For example, givenhj}]ubaubjS)r]}r](hXwf.addStep(SetPropertyFromCommand( command="echo output1; echo error >&2; echo output2", extract_fn=my_extract))hj\hhhjVh}r](jXjYh]h]h]h]h]uhM hhh]r]hXwf.addStep(SetPropertyFromCommand( command="echo output1; echo error >&2; echo output2", extract_fn=my_extract))r]r]}r](hUhj]ubaubh)r]}r](hXVThen ``my_extract`` will see ``stdout="output1\noutput2\n"`` and ``stderr="error\n"``.hj\hhhhh}r](h]h]h]h]h]uhM hhh]r](hXThen r]r]}r](hXThen hj]ubh)r]}r](hX``my_extract``h}r](h]h]h]h]h]uhj]h]r]hX my_extractr]r]}r](hUhj]ubahhubhX will see r]r]}r](hX will see hj]ubh)r]}r](hX``stdout="output1\noutput2\n"``h}r](h]h]h]h]h]uhj]h]r]hXstdout="output1\noutput2\n"r]r]}r](hUhj]ubahhubhX and r]r]}r](hX and hj]ubh)r]}r](hX``stderr="error\n"``h}r](h]h]h]h]h]uhj]h]r]hXstderr="error\n"r]r]}r](hUhj]ubahhubhX.r]}r](hX.hj]ubeubh)r]}r](hXAvoid using the ``extract_fn`` form of this step with commands that produce a great deal of output, as the output is buffered in memory until complete.r]hj\hhhhh}r](h]h]h]h]h]uhM hhh]r](hXAvoid using the r]r]}r](hXAvoid using the hj]ubh)r]}r](hX``extract_fn``h}r](h]h]h]h]h]uhj]h]r]hX extract_fnr]r]}r](hUhj]ubahhubhXy form of this step with commands that produce a great deal of output, as the output is buffered in memory until complete.r]r]}r](hXy form of this step with commands that produce a great deal of output, as the output is buffered in memory until complete.hj]ubeubj)r]}r](hUhj\hhhj h}r](h]h]h]h]h]Uentries]r]((UsingleX!Build Steps; SetPropertiesFromEnvXstep-SetPropertiesFromEnvr]j]tr](UsingleXSetPropertiesFromEnv Build Stepj]j]tr]euhM hhh]ubh)r]}r](hUhj\hhhhh}r](h]h]h]h]r]j]ah]uhM hhh]ubj)r]}r](hUhj\hNhj h}r](h]h]h]h]h]Uentries]r](jXJbuildbot.steps.slave.SetPropertiesFromEnv (class in buildbot.steps.source)h&Utr]auhNhhh]ubj )r]}r](hUhj\hNhj h}r](j j Xpyh]h]h]h]h]j Xclassr]j j]uhNhhh]r](j )r]}r](hX)buildbot.steps.slave.SetPropertiesFromEnvhj]hhhj h}r](h]r]h&aj j h]h]h]h]r]h&aj X)buildbot.steps.slave.SetPropertiesFromEnvj Xbuildbot.steps.slavej uhM hhh]r](j )r]}r](hXclass hj]hhhj h}r](h]h]h]h]h]uhM hhh]r]hXclass r]r]}r](hUhj]ubaubj )r]}r](hXbuildbot.steps.slave.hj]hhhj h}r](h]h]h]h]h]uhM hhh]r]hXbuildbot.steps.slave.r]r]}r](hUhj]ubaubj )r]}r](hXSetPropertiesFromEnvhj]hhhj h}r](h]h]h]h]h]uhM hhh]r]hXSetPropertiesFromEnvr]r]}r](hUhj]ubaubeubj )r]}r](hUhj]hhhj h}r](h]h]h]h]h]uhM hhh]ubeubeubh)r]}r](hUhj[hhhhh}r](h]h]h]h]r]jah]r]hauhM hhh]r](h)r]}r](hjhj]hhhhh}r](h]h]h]h]h]hjuhM hhh]r]hXSetPropertiesFromEnvr]r]}r^(hjhj]ubaubh)r^}r^(hXEBuildbot slaves (later than version 0.8.3) provide their environment variables to the master on connect. These can be copied into Buildbot properties with the :bb:step:`SetPropertiesFromEnv` step. Pass a variable or list of variables in the ``variables`` parameter, then simply use the values as properties in a later step.hj]hhhhh}r^(h]h]h]h]h]uhM hhh]r^(hXBuildbot slaves (later than version 0.8.3) provide their environment variables to the master on connect. These can be copied into Buildbot properties with the r^r^}r^(hXBuildbot slaves (later than version 0.8.3) provide their environment variables to the master on connect. These can be copied into Buildbot properties with the hj^ubh)r^}r ^(hX:bb:step:`SetPropertiesFromEnv`r ^hj^hhhhh}r ^(UreftypeXstephhXSetPropertiesFromEnvU refdomainXbbr ^h]h]U refexplicith]h]h]hhuhM h]r ^h)r^}r^(hj ^h}r^(h]h]r^(hj ^Xbb-stepr^eh]h]h]uhj^h]r^hXSetPropertiesFromEnvr^r^}r^(hUhj^ubahhubaubhX4 step. Pass a variable or list of variables in the r^r^}r^(hX4 step. Pass a variable or list of variables in the hj^ubh)r^}r^(hX ``variables``h}r^(h]h]h]h]h]uhj^h]r^hX variablesr^r^}r ^(hUhj^ubahhubhXE parameter, then simply use the values as properties in a later step.r!^r"^}r#^(hXE parameter, then simply use the values as properties in a later step.hj^ubeubh)r$^}r%^(hXNote that on Windows, environment variables are case-insensitive, but Buildbot property names are case sensitive. The property will have exactly the variable name you specify, even if the underlying environment variable is capitalized differently. If, for example, you use ``variables=['Tmp']``, the result will be a property named ``Tmp``, even though the environment variable is displayed as :envvar:`TMP` in the Windows GUI. ::hj]hhhhh}r&^(h]h]h]h]h]uhM hhh]r'^(hXNote that on Windows, environment variables are case-insensitive, but Buildbot property names are case sensitive. The property will have exactly the variable name you specify, even if the underlying environment variable is capitalized differently. If, for example, you use r(^r)^}r*^(hXNote that on Windows, environment variables are case-insensitive, but Buildbot property names are case sensitive. The property will have exactly the variable name you specify, even if the underlying environment variable is capitalized differently. If, for example, you use hj$^ubh)r+^}r,^(hX``variables=['Tmp']``h}r-^(h]h]h]h]h]uhj$^h]r.^hXvariables=['Tmp']r/^r0^}r1^(hUhj+^ubahhubhX&, the result will be a property named r2^r3^}r4^(hX&, the result will be a property named hj$^ubh)r5^}r6^(hX``Tmp``h}r7^(h]h]h]h]h]uhj$^h]r8^hXTmpr9^r:^}r;^(hUhj5^ubahhubhX7, even though the environment variable is displayed as r<^r=^}r>^(hX7, even though the environment variable is displayed as hj$^ubj)r?^}r@^(hUh}rA^(h]h]h]h]h]j ]rB^((jXTMPrC^Uindex-32rD^UtrE^(jXenvironment variable; TMPjD^UtrF^euhj$^h]hj ubh)rG^}rH^(hUh}rI^(h]h]h]h]rJ^jD^ah]uhj$^h]hhubh)rK^}rL^(hX :envvar:`TMP`rM^hj$^hhhhh}rN^(UreftypeXenvvarhhjC^U refdomainXstdrO^h]h]U refexplicith]h]h]hhuhM h]rP^h)rQ^}rR^(hjM^h}rS^(h]h]rT^(hjO^X std-envvarrU^eh]h]h]uhjK^h]rV^hXTMPrW^rX^}rY^(hUhjQ^ubahhubaubhX in the Windows GUI.rZ^r[^}r\^(hX in the Windows GUI.hj$^ubeubjS)r]^}r^^(hXfrom buildbot.steps.slave import SetPropertiesFromEnv from buildbot.steps.shell import Compile f.addStep(SetPropertiesFromEnv(variables=["SOME_JAVA_LIB_HOME", "JAVAC"])) f.addStep(Compile(commands=[Interpolate("%(prop:JAVAC)s"), "-cp", Interpolate("%(prop:SOME_JAVA_LIB_HOME)s")]))hj]hhhjVh}r_^(jXjYh]h]h]h]h]uhM hhh]r`^hXfrom buildbot.steps.slave import SetPropertiesFromEnv from buildbot.steps.shell import Compile f.addStep(SetPropertiesFromEnv(variables=["SOME_JAVA_LIB_HOME", "JAVAC"])) f.addStep(Compile(commands=[Interpolate("%(prop:JAVAC)s"), "-cp", Interpolate("%(prop:SOME_JAVA_LIB_HOME)s")]))ra^rb^}rc^(hUhj]^ubaubh)rd^}re^(hXNote that this step requires that the Buildslave be at least version 0.8.3. For previous versions, no environment variables are available (the slave environment will appear to be empty).rf^hj]hhhhh}rg^(h]h]h]h]h]uhM! hhh]rh^hXNote that this step requires that the Buildslave be at least version 0.8.3. For previous versions, no environment variables are available (the slave environment will appear to be empty).ri^rj^}rk^(hjf^hjd^ubaubh)rl^}rm^(hX.. _Setting-Buildslave-Info:hj]hhhhh}rn^(h]h]h]h]h]hjuhM% hhh]ubeubeubh)ro^}rp^(hUhhhhh}rq^hHjl^shhh}rr^(h]h]h]h]rs^(jUid24rt^eh]ru^(h hHeuhM( hhh}rv^jjl^sh]rw^(h)rx^}ry^(hjhjo^hhhhh}rz^(h]h]h]h]h]hjuhM( hhh]r{^hXSetting Buildslave Infor|^r}^}r~^(hjhjx^ubaubh)r^}r^(hXEach buildslave has a dictionary of properties (the "buildslave info dictionary") that is persisted into the database. This info dictionary is displayed on the "buildslave" web page and is available in Interpolate operations.r^hjo^hhhhh}r^(h]h]h]h]h]uhM* hhh]r^hXEach buildslave has a dictionary of properties (the "buildslave info dictionary") that is persisted into the database. This info dictionary is displayed on the "buildslave" web page and is available in Interpolate operations.r^r^}r^(hj^hj^ubaubj)r^}r^(hUhjo^hhhj h}r^(h]h]h]h]h]Uentries]r^((UsingleXBuild Steps; SetSlaveInfoXstep-SetSlaveInfor^j^tr^(UsingleXSetSlaveInfo Build Stepj^j^tr^euhM. hhh]ubh)r^}r^(hUhjo^hhhhh}r^(h]h]h]h]h]hj^uhM. hhh]ubh)r^}r^(hX.. _Step-SetSlaveInfo:hjo^hhh}hhh}r^(h]h]h]h]h]hUstep-setslaveinfor^uhM/ hhh}r^j^j^sh]ubh)r^}r^(hUhjo^hhh}r^hxj^shhh}r^(h]h]h]h]r^(jj^j^eh]r^(hhxeuhM2 hhh}r^(j^j^j^j^uh]r^(h)r^}r^(hjhj^hhhhh}r^(h]h]h]h]h]hjuhM2 hhh]r^hX SetSlaveInfor^r^}r^(hjhj^ubaubj)r^}r^(hUhj^hNhj h}r^(h]h]h]h]h]Uentries]r^(jXCbuildbot.steps.master.SetSlaveInfo (class in buildbot.steps.source)h0Utr^auhNhhh]ubj )r^}r^(hUhj^hNhj h}r^(j j Xpyh]h]h]h]h]j Xclassr^j j^uhNhhh]r^(j )r^}r^(hX"buildbot.steps.master.SetSlaveInfohj^hhhj h}r^(h]r^h0aj j h]h]h]h]r^h0aj X"buildbot.steps.master.SetSlaveInfoj Xbuildbot.steps.masterj uhM5 hhh]r^(j )r^}r^(hXclass hj^hhhj h}r^(h]h]h]h]h]uhM5 hhh]r^hXclass r^r^}r^(hUhj^ubaubj )r^}r^(hXbuildbot.steps.master.hj^hhhj h}r^(h]h]h]h]h]uhM5 hhh]r^hXbuildbot.steps.master.r^r^}r^(hUhj^ubaubj )r^}r^(hX SetSlaveInfohj^hhhj h}r^(h]h]h]h]h]uhM5 hhh]r^hX SetSlaveInfor^r^}r^(hUhj^ubaubeubj )r^}r^(hUhj^hhhj h}r^(h]h]h]h]h]uhM5 hhh]ubeubh)r^}r^(hXu``SetSlaveInfo`` is a base class to provide a facility to set values in the buildslave info dictionary. For example::hj^hhhhh}r^(h]h]h]h]h]uhM6 hhh]r^(h)r^}r^(hX``SetSlaveInfo``h}r^(h]h]h]h]h]uhj^h]r^hX SetSlaveInfor^r^}r^(hUhj^ubahhubhXd is a base class to provide a facility to set values in the buildslave info dictionary. For example:r^r^}r^(hXd is a base class to provide a facility to set values in the buildslave info dictionary. For example:hj^ubeubjS)r^}r^(hXpfrom buildbot.steps.master import SetSlaveInfo class SetSlaveFromPropInfo(SetSlaveInfo): name = "SetSlaveFromPropInfo" # override this to return the dictionary update def getSlaveInfoUpdate(self): # for example, copy a property into the buildslave dict update = { "foo": self.getProperty("foo") } return updatehj^hhhjVh}r^(jXjYh]h]h]h]h]uhM9 hhh]r^hXpfrom buildbot.steps.master import SetSlaveInfo class SetSlaveFromPropInfo(SetSlaveInfo): name = "SetSlaveFromPropInfo" # override this to return the dictionary update def getSlaveInfoUpdate(self): # for example, copy a property into the buildslave dict update = { "foo": self.getProperty("foo") } return updater^r^}r^(hUhj^ubaubj)r^}r^(hUhj^hhhj h}r^(h]h]h]h]h]j ]r^(jX!Properties; triggering schedulersUindex-33r^Utr^ajuhMG hhh]ubh)r^}r^(hUhj^hhhhh}r^(h]h]h]h]r^j^ah]uhMH hhh]ubj)r^}r^(hUhj^hhhj h}r^(h]h]h]h]h]Uentries]r^((UsingleXBuild Steps; TriggerX step-Triggerr^j^tr^(UsingleXTrigger Build Stepj^j^tr^euhMJ hhh]ubh)r^}r^(hUhj^hhhhh}r^(h]h]h]h]h]hj^uhMJ hhh]ubh)r^}r^(hX.. _Triggering-Schedulers:hj^hhh}hhh}r^(h]h]h]h]h]hjuhMK hhh}r^j^j^sh]ubeubeubh)r^}r^(hUhhhhh}r^hj^shhh}r^(h]h]h]h]r^(jj^Uid25r^eh]r_(hheuhMN hhh}r_(j^j^jj^uh]r_(h)r_}r_(hjhj^hhhhh}r_(h]h]h]h]h]hjuhMN hhh]r_hXTriggering Schedulersr_r_}r _(hjhj_ubaubh)r _}r _(hXvThe counterpart to the Triggerable described in section :bb:Sched:`Triggerable` is the :bb:step:`Trigger` build step::hj^hhhhh}r _(h]h]h]h]h]uhMP hhh]r _(hX8The counterpart to the Triggerable described in section r_r_}r_(hX8The counterpart to the Triggerable described in section hj _ubh)r_}r_(hX:bb:Sched:`Triggerable`r_hj _hhhhh}r_(UreftypeXschedhhX TriggerableU refdomainXbbr_h]h]U refexplicith]h]h]hhuhMP h]r_h)r_}r_(hj_h}r_(h]h]r_(hj_Xbb-schedr_eh]h]h]uhj_h]r_hX Triggerabler_r_}r_(hUhj_ubahhubaubhX is the r _r!_}r"_(hX is the hj _ubh)r#_}r$_(hX:bb:step:`Trigger`r%_hj _hhhhh}r&_(UreftypeXstephhXTriggerU refdomainXbbr'_h]h]U refexplicith]h]h]hhuhMP h]r(_h)r)_}r*_(hj%_h}r+_(h]h]r,_(hj'_Xbb-stepr-_eh]h]h]uhj#_h]r._hXTriggerr/_r0_}r1_(hUhj)_ubahhubaubhX build step:r2_r3_}r4_(hX build step:hj _ubeubjS)r5_}r6_(hXfrom buildbot.steps.trigger import Trigger f.addStep(Trigger(schedulerNames=['build-prep'], waitForFinish=True, updateSourceStamp=True, set_properties={ 'quick' : False }))hj^hhhjVh}r7_(jXjYh]h]h]h]h]uhMS hhh]r8_hXfrom buildbot.steps.trigger import Trigger f.addStep(Trigger(schedulerNames=['build-prep'], waitForFinish=True, updateSourceStamp=True, set_properties={ 'quick' : False }))r9_r:_}r;_(hUhj5_ubaubh)r<_}r=_(hXThe ``schedulerNames=`` argument lists the :bb:sched:`Triggerable` schedulers that should be triggered when this step is executed. Note that it is possible, but not advisable, to create a cycle where a build continually triggers itself, because the schedulers are specified by name.hj^hhhhh}r>_(h]h]h]h]h]uhMY hhh]r?_(hXThe r@_rA_}rB_(hXThe hj<_ubh)rC_}rD_(hX``schedulerNames=``h}rE_(h]h]h]h]h]uhj<_h]rF_hXschedulerNames=rG_rH_}rI_(hUhjC_ubahhubhX argument lists the rJ_rK_}rL_(hX argument lists the hj<_ubh)rM_}rN_(hX:bb:sched:`Triggerable`rO_hj<_hhhhh}rP_(UreftypeXschedhhX TriggerableU refdomainXbbrQ_h]h]U refexplicith]h]h]hhuhMY h]rR_h)rS_}rT_(hjO_h}rU_(h]h]rV_(hjQ_Xbb-schedrW_eh]h]h]uhjM_h]rX_hX TriggerablerY_rZ_}r[_(hUhjS_ubahhubaubhX schedulers that should be triggered when this step is executed. Note that it is possible, but not advisable, to create a cycle where a build continually triggers itself, because the schedulers are specified by name.r\_r]_}r^_(hX schedulers that should be triggered when this step is executed. Note that it is possible, but not advisable, to create a cycle where a build continually triggers itself, because the schedulers are specified by name.hj<_ubeubh)r__}r`_(hXfIf ``waitForFinish`` is ``True``, then the step will not finish until all of the builds from the triggered schedulers have finished. Hyperlinks are added to the waterfall and the build detail web pages for each triggered build. If this argument is ``False`` (the default) or not given, then the buildstep succeeds immediately after triggering the schedulers.hj^hhhhh}ra_(h]h]h]h]h]uhM_ hhh]rb_(hXIf rc_rd_}re_(hXIf hj__ubh)rf_}rg_(hX``waitForFinish``h}rh_(h]h]h]h]h]uhj__h]ri_hX waitForFinishrj_rk_}rl_(hUhjf_ubahhubhX is rm_rn_}ro_(hX is hj__ubh)rp_}rq_(hX``True``h}rr_(h]h]h]h]h]uhj__h]rs_hXTruert_ru_}rv_(hUhjp_ubahhubhX, then the step will not finish until all of the builds from the triggered schedulers have finished. Hyperlinks are added to the waterfall and the build detail web pages for each triggered build. If this argument is rw_rx_}ry_(hX, then the step will not finish until all of the builds from the triggered schedulers have finished. Hyperlinks are added to the waterfall and the build detail web pages for each triggered build. If this argument is hj__ubh)rz_}r{_(hX ``False``h}r|_(h]h]h]h]h]uhj__h]r}_hXFalser~_r_}r_(hUhjz_ubahhubhXe (the default) or not given, then the buildstep succeeds immediately after triggering the schedulers.r_r_}r_(hXe (the default) or not given, then the buildstep succeeds immediately after triggering the schedulers.hj__ubeubh)r_}r_(hXThe SourceStamps to use for the triggered build are controlled by the arguments ``updateSourceStamp``, ``alwaysUseLatest``, and ``sourceStamps``. If ``updateSourceStamp`` is ``True`` (the default), then step updates the source stamps given to the :bb:sched:`Triggerable` schedulers to include ``got_revision`` (the revision actually used in this build) as ``revision`` (the revision to use in the triggered builds). This is useful to ensure that all of the builds use exactly the same source stamps, even if other :class:`Change`\s have occurred while the build was running. If ``updateSourceStamp`` is False (and neither of the other arguments are specified), then the exact same SourceStamps are used. If ``alwaysUseLatest`` is True, then no SourceStamps are given, corresponding to using the latest revisions of the repositories specified in the Source steps. This is useful if the triggered builds use to a different source repository. The argument ``sourceStamps`` accepts a list of dictionaries containing the keys ``branch``, ``revision``, ``repository``, ``project``, and optionally ``patch_level``, ``patch_body``, ``patch_subdir``, ``patch_author`` and ``patch_comment`` and creates the corresponding SourceStamps. If only one sourceStamp has to be specified then the argument ``sourceStamp`` can be used for a dictionary containing the keys mentioned above. The arguments ``updateSourceStamp``, ``alwaysUseLatest``, and ``sourceStamp`` can be specified using properties.hj^hhhhh}r_(h]h]h]h]h]uhMe hhh]r_(hXPThe SourceStamps to use for the triggered build are controlled by the arguments r_r_}r_(hXPThe SourceStamps to use for the triggered build are controlled by the arguments hj_ubh)r_}r_(hX``updateSourceStamp``h}r_(h]h]h]h]h]uhj_h]r_hXupdateSourceStampr_r_}r_(hUhj_ubahhubhX, r_r_}r_(hX, hj_ubh)r_}r_(hX``alwaysUseLatest``h}r_(h]h]h]h]h]uhj_h]r_hXalwaysUseLatestr_r_}r_(hUhj_ubahhubhX, and r_r_}r_(hX, and hj_ubh)r_}r_(hX``sourceStamps``h}r_(h]h]h]h]h]uhj_h]r_hX sourceStampsr_r_}r_(hUhj_ubahhubhX. If r_r_}r_(hX. If hj_ubh)r_}r_(hX``updateSourceStamp``h}r_(h]h]h]h]h]uhj_h]r_hXupdateSourceStampr_r_}r_(hUhj_ubahhubhX is r_r_}r_(hX is hj_ubh)r_}r_(hX``True``h}r_(h]h]h]h]h]uhj_h]r_hXTruer_r_}r_(hUhj_ubahhubhXA (the default), then step updates the source stamps given to the r_r_}r_(hXA (the default), then step updates the source stamps given to the hj_ubh)r_}r_(hX:bb:sched:`Triggerable`r_hj_hhhhh}r_(UreftypeXschedhhX TriggerableU refdomainXbbr_h]h]U refexplicith]h]h]hhuhMe h]r_h)r_}r_(hj_h}r_(h]h]r_(hj_Xbb-schedr_eh]h]h]uhj_h]r_hX Triggerabler_r_}r_(hUhj_ubahhubaubhX schedulers to include r_r_}r_(hX schedulers to include hj_ubh)r_}r_(hX``got_revision``h}r_(h]h]h]h]h]uhj_h]r_hX got_revisionr_r_}r_(hUhj_ubahhubhX/ (the revision actually used in this build) as r_r_}r_(hX/ (the revision actually used in this build) as hj_ubh)r_}r_(hX ``revision``h}r_(h]h]h]h]h]uhj_h]r_hXrevisionr_r_}r_(hUhj_ubahhubhX (the revision to use in the triggered builds). This is useful to ensure that all of the builds use exactly the same source stamps, even if other r_r_}r_(hX (the revision to use in the triggered builds). This is useful to ensure that all of the builds use exactly the same source stamps, even if other hj_ubh)r_}r_(hX:class:`Change`r_hj_hhhhh}r_(UreftypeXclasshhXChangeU refdomainXpyr_h]h]U refexplicith]h]h]hhhNhj uhMe h]r_h)r_}r_(hj_h}r_(h]h]r_(hj_Xpy-classr_eh]h]h]uhj_h]r_hXChanger_r_}r_(hUhj_ubahhubaubhX0s have occurred while the build was running. If r_r_}r_(hX1\s have occurred while the build was running. If hj_ubh)r_}r_(hX``updateSourceStamp``h}r_(h]h]h]h]h]uhj_h]r_hXupdateSourceStampr_r_}r_(hUhj_ubahhubhXl is False (and neither of the other arguments are specified), then the exact same SourceStamps are used. If r_r_}r_(hXl is False (and neither of the other arguments are specified), then the exact same SourceStamps are used. If hj_ubh)r_}r`(hX``alwaysUseLatest``h}r`(h]h]h]h]h]uhj_h]r`hXalwaysUseLatestr`r`}r`(hUhj_ubahhubhX is True, then no SourceStamps are given, corresponding to using the latest revisions of the repositories specified in the Source steps. This is useful if the triggered builds use to a different source repository. The argument r`r`}r`(hX is True, then no SourceStamps are given, corresponding to using the latest revisions of the repositories specified in the Source steps. This is useful if the triggered builds use to a different source repository. The argument hj_ubh)r `}r `(hX``sourceStamps``h}r `(h]h]h]h]h]uhj_h]r `hX sourceStampsr `r`}r`(hUhj `ubahhubhX4 accepts a list of dictionaries containing the keys r`r`}r`(hX4 accepts a list of dictionaries containing the keys hj_ubh)r`}r`(hX ``branch``h}r`(h]h]h]h]h]uhj_h]r`hXbranchr`r`}r`(hUhj`ubahhubhX, r`r`}r`(hX, hj_ubh)r`}r`(hX ``revision``h}r`(h]h]h]h]h]uhj_h]r `hXrevisionr!`r"`}r#`(hUhj`ubahhubhX, r$`r%`}r&`(hX, hj_ubh)r'`}r(`(hX``repository``h}r)`(h]h]h]h]h]uhj_h]r*`hX repositoryr+`r,`}r-`(hUhj'`ubahhubhX, r.`r/`}r0`(hX, hj_ubh)r1`}r2`(hX ``project``h}r3`(h]h]h]h]h]uhj_h]r4`hXprojectr5`r6`}r7`(hUhj1`ubahhubhX, and optionally r8`r9`}r:`(hX, and optionally hj_ubh)r;`}r<`(hX``patch_level``h}r=`(h]h]h]h]h]uhj_h]r>`hX patch_levelr?`r@`}rA`(hUhj;`ubahhubhX, rB`rC`}rD`(hX, hj_ubh)rE`}rF`(hX``patch_body``h}rG`(h]h]h]h]h]uhj_h]rH`hX patch_bodyrI`rJ`}rK`(hUhjE`ubahhubhX, rL`rM`}rN`(hX, hj_ubh)rO`}rP`(hX``patch_subdir``h}rQ`(h]h]h]h]h]uhj_h]rR`hX patch_subdirrS`rT`}rU`(hUhjO`ubahhubhX, rV`rW`}rX`(hX, hj_ubh)rY`}rZ`(hX``patch_author``h}r[`(h]h]h]h]h]uhj_h]r\`hX patch_authorr]`r^`}r_`(hUhjY`ubahhubhX and r``ra`}rb`(hX and hj_ubh)rc`}rd`(hX``patch_comment``h}re`(h]h]h]h]h]uhj_h]rf`hX patch_commentrg`rh`}ri`(hUhjc`ubahhubhXk and creates the corresponding SourceStamps. If only one sourceStamp has to be specified then the argument rj`rk`}rl`(hXk and creates the corresponding SourceStamps. If only one sourceStamp has to be specified then the argument hj_ubh)rm`}rn`(hX``sourceStamp``h}ro`(h]h]h]h]h]uhj_h]rp`hX sourceStamprq`rr`}rs`(hUhjm`ubahhubhXQ can be used for a dictionary containing the keys mentioned above. The arguments rt`ru`}rv`(hXQ can be used for a dictionary containing the keys mentioned above. The arguments hj_ubh)rw`}rx`(hX``updateSourceStamp``h}ry`(h]h]h]h]h]uhj_h]rz`hXupdateSourceStampr{`r|`}r}`(hUhjw`ubahhubhX, r~`r`}r`(hX, hj_ubh)r`}r`(hX``alwaysUseLatest``h}r`(h]h]h]h]h]uhj_h]r`hXalwaysUseLatestr`r`}r`(hUhj`ubahhubhX, and r`r`}r`(hX, and hj_ubh)r`}r`(hX``sourceStamp``h}r`(h]h]h]h]h]uhj_h]r`hX sourceStampr`r`}r`(hUhj`ubahhubhX# can be specified using properties.r`r`}r`(hX# can be specified using properties.hj_ubeubh)r`}r`(hXEThe ``set_properties`` parameter allows control of the properties that are passed to the triggered scheduler. The parameter takes a dictionary mapping property names to values. You may use :ref:`Interpolate` here to dynamically construct new property values. For the simple case of copying a property, this might look like ::hj^hhhhh}r`(h]h]h]h]h]uhM{ hhh]r`(hXThe r`r`}r`(hXThe hj`ubh)r`}r`(hX``set_properties``h}r`(h]h]h]h]h]uhj`h]r`hXset_propertiesr`r`}r`(hUhj`ubahhubhX parameter allows control of the properties that are passed to the triggered scheduler. The parameter takes a dictionary mapping property names to values. You may use r`r`}r`(hX parameter allows control of the properties that are passed to the triggered scheduler. The parameter takes a dictionary mapping property names to values. You may use hj`ubh)r`}r`(hX:ref:`Interpolate`r`hj`hhhhh}r`(UreftypeXrefhhX interpolateU refdomainXstdr`h]h]U refexplicith]h]h]hhuhM{ h]r`jW)r`}r`(hj`h}r`(h]h]r`(hj`Xstd-refr`eh]h]h]uhj`h]r`hX Interpolater`r`}r`(hUhj`ubahjaubaubhXs here to dynamically construct new property values. For the simple case of copying a property, this might look liker`r`}r`(hXs here to dynamically construct new property values. For the simple case of copying a property, this might look likehj`ubeubjS)r`}r`(hX2set_properties={"my_prop1" : Property("my_prop1")}hj^hhhjVh}r`(jXjYh]h]h]h]h]uhM hhh]r`hX2set_properties={"my_prop1" : Property("my_prop1")}r`r`}r`(hUhj`ubaubh)r`}r`(hXThe ``copy_properties`` parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of ``set_properties``.r`hj^hhhhh}r`(h]h]h]h]h]uhM hhh]r`(hXThe r`r`}r`(hXThe hj`ubh)r`}r`(hX``copy_properties``h}r`(h]h]h]h]h]uhj`h]r`hXcopy_propertiesr`r`}r`(hUhj`ubahhubhX{ parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of r`r`}r`(hX{ parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of hj`ubh)r`}r`(hX``set_properties``h}r`(h]h]h]h]h]uhj`h]r`hXset_propertiesr`r`}r`(hUhj`ubahhubhX.r`}r`(hX.hj`ubeubeubh)r`}r`(hUhhhhhhh}r`(h]h]h]h]r`jah]r`htauhM hhh]r`(h)r`}r`(hjhj`hhhhh}r`(h]h]h]h]h]hjuhM hhh]r`hXRPM-Related Stepsr`r`}r`(hjhj`ubaubh)r`}r`(hX*These steps work with RPMs and spec files.r`hj`hhhhh}r`(h]h]h]h]h]uhM hhh]r`hX*These steps work with RPMs and spec files.r`r`}r`(hj`hj`ubaubj)r`}r`(hUhj`hhhj h}r`(h]h]h]h]h]Uentries]r`((UsingleXBuild Steps; RpmBuildX step-RpmBuildr`j`tr`(UsingleXRpmBuild Build Stepj`j`tr`euhM hhh]ubh)r`}r`(hUhj`hhhhh}r`(h]h]h]h]h]hj`uhM hhh]ubh)r`}r`(hUhj`hhh}hhh}r`(h]h]h]h]r`(jj`eh]r`h auhM hhh}r`j`j`sh]r`(h)ra}ra(hjhj`hhhhh}ra(h]h]h]h]h]hjuhM hhh]rahXRpmBuildrara}ra(hjhjaubaubh)ra}ra(hX?The :bb:step:`RpmBuild` step builds RPMs based on a spec file::r ahj`hhhhh}r a(h]h]h]h]h]uhM hhh]r a(hXThe r ar a}ra(hXThe hjaubh)ra}ra(hX:bb:step:`RpmBuild`rahjahhhhh}ra(UreftypeXstephhXRpmBuildU refdomainXbbrah]h]U refexplicith]h]h]hhuhM h]rah)ra}ra(hjah}ra(h]h]ra(hjaXbb-stepraeh]h]h]uhjah]rahXRpmBuildrara}ra(hUhjaubahhubaubhX' step builds RPMs based on a spec file:rara}r a(hX' step builds RPMs based on a spec file:hjaubeubjS)r!a}r"a(hXnfrom buildbot.steps.package.rpm import RpmBuild f.addStep(RpmBuild(specfile="proj.spec", dist='.el5'))hj`hhhjVh}r#a(jXjYh]h]h]h]h]uhM hhh]r$ahXnfrom buildbot.steps.package.rpm import RpmBuild f.addStep(RpmBuild(specfile="proj.spec", dist='.el5'))r%ar&a}r'a(hUhj!aubaubh)r(a}r)a(hX'The step takes the following parametersr*ahj`hhhhh}r+a(h]h]h]h]h]uhM hhh]r,ahX'The step takes the following parametersr-ar.a}r/a(hj*ahj(aubaubj)r0a}r1a(hUhj`hhhjh}r2a(h]h]h]h]h]uhNhhh]r3a(j)r4a}r5a(hX.``specfile`` The ``.spec`` file to build from hj0ahhhjh}r6a(h]h]h]h]h]uhM h]r7a(j)r8a}r9a(hX ``specfile``r:ahj4ahhhjh}r;a(h]h]h]h]h]uhM h]ra(hj:ah}r?a(h]h]h]h]h]uhj8ah]r@ahXspecfilerAarBa}rCa(hUhj=aubahhubaubj)rDa}rEa(hUh}rFa(h]h]h]h]h]uhj4ah]rGah)rHa}rIa(hX The ``.spec`` file to build fromhjDahhhhh}rJa(h]h]h]h]h]uhM h]rKa(hXThe rLarMa}rNa(hXThe hjHaubh)rOa}rPa(hX ``.spec``h}rQa(h]h]h]h]h]uhjHah]rRahX.specrSarTa}rUa(hUhjOaubahhubhX file to build fromrVarWa}rXa(hX file to build fromhjHaubeubahjubeubj)rYa}rZa(hXB``topdir`` Definition for ``_topdir``, defaulting to the workdir. hj0ahhhjh}r[a(h]h]h]h]h]uhM hhh]r\a(j)r]a}r^a(hX ``topdir``r_ahjYahhhjh}r`a(h]h]h]h]h]uhM h]raah)rba}rca(hj_ah}rda(h]h]h]h]h]uhj]ah]reahXtopdirrfarga}rha(hUhjbaubahhubaubj)ria}rja(hUh}rka(h]h]h]h]h]uhjYah]rlah)rma}rna(hX6Definition for ``_topdir``, defaulting to the workdir.hjiahhhhh}roa(h]h]h]h]h]uhM h]rpa(hXDefinition for rqarra}rsa(hXDefinition for hjmaubh)rta}rua(hX ``_topdir``h}rva(h]h]h]h]h]uhjmah]rwahX_topdirrxarya}rza(hUhjtaubahhubhX, defaulting to the workdir.r{ar|a}r}a(hX, defaulting to the workdir.hjmaubeubahjubeubj)r~a}ra(hXF``builddir`` Definition for ``_builddir``, defaulting to the workdir. hj0ahhhjh}ra(h]h]h]h]h]uhM hhh]ra(j)ra}ra(hX ``builddir``rahj~ahhhjh}ra(h]h]h]h]h]uhM h]rah)ra}ra(hjah}ra(h]h]h]h]h]uhjah]rahXbuilddirrara}ra(hUhjaubahhubaubj)ra}ra(hUh}ra(h]h]h]h]h]uhj~ah]rah)ra}ra(hX8Definition for ``_builddir``, defaulting to the workdir.hjahhhhh}ra(h]h]h]h]h]uhM h]ra(hXDefinition for rara}ra(hXDefinition for hjaubh)ra}ra(hX ``_builddir``h}ra(h]h]h]h]h]uhjah]rahX _builddirrara}ra(hUhjaubahhubhX, defaulting to the workdir.rara}ra(hX, defaulting to the workdir.hjaubeubahjubeubj)ra}ra(hXB``rpmdir`` Definition for ``_rpmdir``, defaulting to the workdir. hj0ahhhjh}ra(h]h]h]h]h]uhM hhh]ra(j)ra}ra(hX ``rpmdir``rahjahhhjh}ra(h]h]h]h]h]uhM h]rah)ra}ra(hjah}ra(h]h]h]h]h]uhjah]rahXrpmdirrara}ra(hUhjaubahhubaubj)ra}ra(hUh}ra(h]h]h]h]h]uhjah]rah)ra}ra(hX6Definition for ``_rpmdir``, defaulting to the workdir.hjahhhhh}ra(h]h]h]h]h]uhM h]ra(hXDefinition for rara}ra(hXDefinition for hjaubh)ra}ra(hX ``_rpmdir``h}ra(h]h]h]h]h]uhjah]rahX_rpmdirrara}ra(hUhjaubahhubhX, defaulting to the workdir.rara}ra(hX, defaulting to the workdir.hjaubeubahjubeubj)ra}ra(hXH``sourcedir`` Definition for ``_sourcedir``, defaulting to the workdir. hj0ahhhjh}ra(h]h]h]h]h]uhM hhh]ra(j)ra}ra(hX ``sourcedir``rahjahhhjh}ra(h]h]h]h]h]uhM h]rah)ra}ra(hjah}ra(h]h]h]h]h]uhjah]rahX sourcedirrara}ra(hUhjaubahhubaubj)ra}ra(hUh}ra(h]h]h]h]h]uhjah]rah)ra}ra(hX9Definition for ``_sourcedir``, defaulting to the workdir.hjahhhhh}ra(h]h]h]h]h]uhM h]ra(hXDefinition for rara}ra(hXDefinition for hjaubh)ra}ra(hX``_sourcedir``h}ra(h]h]h]h]h]uhjah]rahX _sourcedirrara}ra(hUhjaubahhubhX, defaulting to the workdir.rara}ra(hX, defaulting to the workdir.hjaubeubahjubeubj)ra}ra(hXH``srcrpmdir`` Definition for ``_srcrpmdir``, defaulting to the workdir. hj0ahhhjh}ra(h]h]h]h]h]uhM hhh]ra(j)ra}ra(hX ``srcrpmdir``rahjahhhjh}ra(h]h]h]h]h]uhM h]rah)ra}ra(hjah}ra(h]h]h]h]h]uhjah]rahX srcrpmdirrara}ra(hUhjaubahhubaubj)ra}ra(hUh}ra(h]h]h]h]h]uhjah]rbh)rb}rb(hX9Definition for ``_srcrpmdir``, defaulting to the workdir.hjahhhhh}rb(h]h]h]h]h]uhM h]rb(hXDefinition for rbrb}rb(hXDefinition for hjbubh)rb}r b(hX``_srcrpmdir``h}r b(h]h]h]h]h]uhjbh]r bhX _srcrpmdirr br b}rb(hUhjbubahhubhX, defaulting to the workdir.rbrb}rb(hX, defaulting to the workdir.hjbubeubahjubeubj)rb}rb(hXF``dist`` Distribution to build, used as the definition for ``_dist``. hj0ahhhjh}rb(h]h]h]h]h]uhM hhh]rb(j)rb}rb(hX``dist``rbhjbhhhjh}rb(h]h]h]h]h]uhM h]rbh)rb}rb(hjbh}rb(h]h]h]h]h]uhjbh]rbhXdistrbr b}r!b(hUhjbubahhubaubj)r"b}r#b(hUh}r$b(h]h]h]h]h]uhjbh]r%bh)r&b}r'b(hX<Distribution to build, used as the definition for ``_dist``.hj"bhhhhh}r(b(h]h]h]h]h]uhM h]r)b(hX2Distribution to build, used as the definition for r*br+b}r,b(hX2Distribution to build, used as the definition for hj&bubh)r-b}r.b(hX ``_dist``h}r/b(h]h]h]h]h]uhj&bh]r0bhX_distr1br2b}r3b(hUhj-bubahhubhX.r4b}r5b(hX.hj&bubeubahjubeubj)r6b}r7b(hX9``autoRelease`` If true, use the auto-release mechanics. hj0ahhhjh}r8b(h]h]h]h]h]uhM hhh]r9b(j)r:b}r;b(hX``autoRelease``rbh)r?b}r@b(hjchOauhM hhh}r?cj4cj7csh]r@c(h)rAc}rBc(hjThj:chhhhh}rCc(h]h]h]h]h]hjNuhM hhh]rDchXMockBuildSRPM SteprEcrFc}rGc(hjThjAcubaubh)rHc}rIc(hXmThe :bb:step:`MockBuildSRPM` step builds a SourceRPM based on a spec file and optionally a source directory::hj:chhhhh}rJc(h]h]h]h]h]uhM hhh]rKc(hXThe rLcrMc}rNc(hXThe hjHcubh)rOc}rPc(hX:bb:step:`MockBuildSRPM`rQchjHchhhhh}rRc(UreftypeXstephhX MockBuildSRPMU refdomainXbbrSch]h]U refexplicith]h]h]hhuhM h]rTch)rUc}rVc(hjQch}rWc(h]h]rXc(hjScXbb-steprYceh]h]h]uhjOch]rZchX MockBuildSRPMr[cr\c}r]c(hUhjUcubahhubaubhXP step builds a SourceRPM based on a spec file and optionally a source directory:r^cr_c}r`c(hXP step builds a SourceRPM based on a spec file and optionally a source directory:hjHcubeubjS)rac}rbc(hXpfrom buildbot.steps.package.rpm import MockBuildSRPM f.addStep(MockBuildSRPM(root='default', spec='mypkg.spec'))hj:chhhjVh}rcc(jXjYh]h]h]h]h]uhM hhh]rdchXpfrom buildbot.steps.package.rpm import MockBuildSRPM f.addStep(MockBuildSRPM(root='default', spec='mypkg.spec'))recrfc}rgc(hUhjacubaubh)rhc}ric(hX'The step takes the following parametersrjchj:chhhhh}rkc(h]h]h]h]h]uhM hhh]rlchX'The step takes the following parametersrmcrnc}roc(hjjchjhcubaubj)rpc}rqc(hUhj:chhhjh}rrc(h]h]h]h]h]uhNhhh]rsc(j)rtc}ruc(hXG``root`` Use chroot configuration defined in ``/etc/mock/.cfg``. hjpchhhjh}rvc(h]h]h]h]h]uhM h]rwc(j)rxc}ryc(hX``root``rzchjtchhhjh}r{c(h]h]h]h]h]uhM h]r|ch)r}c}r~c(hjzch}rc(h]h]h]h]h]uhjxch]rchXrootrcrc}rc(hUhj}cubahhubaubj)rc}rc(hUh}rc(h]h]h]h]h]uhjtch]rch)rc}rc(hX=Use chroot configuration defined in ``/etc/mock/.cfg``.hjchhhhh}rc(h]h]h]h]h]uhM h]rc(hX$Use chroot configuration defined in rcrc}rc(hX$Use chroot configuration defined in hjcubh)rc}rc(hX``/etc/mock/.cfg``h}rc(h]h]h]h]h]uhjch]rchX/etc/mock/.cfgrcrc}rc(hUhjcubahhubhX.rc}rc(hX.hjcubeubahjubeubj)rc}rc(hXQ``resultdir`` The directory where the logfiles and the SourceRPM are written to. hjpchhhjh}rc(h]h]h]h]h]uhM hhh]rc(j)rc}rc(hX ``resultdir``rchjchhhjh}rc(h]h]h]h]h]uhM h]rch)rc}rc(hjch}rc(h]h]h]h]h]uhjch]rchX resultdirrcrc}rc(hUhjcubahhubaubj)rc}rc(hUh}rc(h]h]h]h]h]uhjch]rch)rc}rc(hXBThe directory where the logfiles and the SourceRPM are written to.rchjchhhhh}rc(h]h]h]h]h]uhM h]rchXBThe directory where the logfiles and the SourceRPM are written to.rcrc}rc(hjchjcubaubahjubeubj)rc}rc(hX2``spec`` Build the SourceRPM from this spec file. hjpchhhjh}rc(h]h]h]h]h]uhM hhh]rc(j)rc}rc(hX``spec``rchjchhhjh}rc(h]h]h]h]h]uhM h]rch)rc}rc(hjch}rc(h]h]h]h]h]uhjch]rchXspecrcrc}rc(hUhjcubahhubaubj)rc}rc(hUh}rc(h]h]h]h]h]uhjch]rch)rc}rc(hX(Build the SourceRPM from this spec file.rchjchhhhh}rc(h]h]h]h]h]uhM h]rchX(Build the SourceRPM from this spec file.rcrc}rc(hjchjcubaubahjubeubj)rc}rc(hXO``sources`` Path to the directory containing the sources, defaulting to ``.``. hjpchhhjh}rc(h]h]h]h]h]uhM hhh]rc(j)rc}rc(hX ``sources``rchjchhhjh}rc(h]h]h]h]h]uhM h]rch)rc}rc(hjch}rc(h]h]h]h]h]uhjch]rchXsourcesrcrc}rc(hUhjcubahhubaubj)rc}rc(hUh}rc(h]h]h]h]h]uhjch]rch)rc}rc(hXBPath to the directory containing the sources, defaulting to ``.``.hjchhhhh}rc(h]h]h]h]h]uhM h]rc(hX<Path to the directory containing the sources, defaulting to rcrc}rc(hX<Path to the directory containing the sources, defaulting to hjcubh)rc}rc(hX``.``h}rc(h]h]h]h]h]uhjch]rchX.rc}rc(hUhjcubahhubhX.rc}rc(hX.hjcubeubahjubeubeubj)rc}rc(hUhj:chhhj h}rc(h]h]h]h]h]Uentries]rc((UsingleXBuild Steps; MockRebuildXstep-MockRebuildrcjctrc(UsingleXMockRebuild Build StepjcjctrceuhM hhh]ubh)rc}rc(hUhj:chhhhh}rc(h]h]h]h]h]hjcuhM hhh]ubeubh)rc}rc(hUhj`hhh}hhh}rc(h]h]h]h]rd(jbjceh]rdhauhM hhh}rdjcjcsh]rd(h)rd}rd(hjghjchhhhh}rd(h]h]h]h]h]hjauhM hhh]rdhXMockRebuild Steprdr d}r d(hjghjdubaubh)r d}r d(hX>The :bb:step:`MockRebuild` step rebuilds a SourceRPM package::r dhjchhhhh}rd(h]h]h]h]h]uhM hhh]rd(hXThe rdrd}rd(hXThe hj dubh)rd}rd(hX:bb:step:`MockRebuild`rdhj dhhhhh}rd(UreftypeXstephhX MockRebuildU refdomainXbbrdh]h]U refexplicith]h]h]hhuhM h]rdh)rd}rd(hjdh}rd(h]h]rd(hjdXbb-steprdeh]h]h]uhjdh]rdhX MockRebuildrdr d}r!d(hUhjdubahhubaubhX# step rebuilds a SourceRPM package:r"dr#d}r$d(hX# step rebuilds a SourceRPM package:hj dubeubjS)r%d}r&d(hXufrom buildbot.steps.package.rpm import MockRebuild f.addStep(MockRebuild(root='default', spec='mypkg-1.0-1.src.rpm'))hjchhhjVh}r'd(jXjYh]h]h]h]h]uhM hhh]r(dhXufrom buildbot.steps.package.rpm import MockRebuild f.addStep(MockRebuild(root='default', spec='mypkg-1.0-1.src.rpm'))r)dr*d}r+d(hUhj%dubaubh)r,d}r-d(hX'The step takes the following parametersr.dhjchhhhh}r/d(h]h]h]h]h]uhM hhh]r0dhX'The step takes the following parametersr1dr2d}r3d(hj.dhj,dubaubj)r4d}r5d(hUhjchhhjh}r6d(h]h]h]h]h]uhNhhh]r7d(j)r8d}r9d(hXH``root`` Uses chroot configuration defined in ``/etc/mock/.cfg``. hj4dhhhjh}r:d(h]h]h]h]h]uhM h]r;d(j)rdhj8dhhhjh}r?d(h]h]h]h]h]uhM h]r@dh)rAd}rBd(hj>dh}rCd(h]h]h]h]h]uhjUses chroot configuration defined in ``/etc/mock/.cfg``.hjHdhhhhh}rNd(h]h]h]h]h]uhM h]rOd(hX%Uses chroot configuration defined in rPdrQd}rRd(hX%Uses chroot configuration defined in hjLdubh)rSd}rTd(hX``/etc/mock/.cfg``h}rUd(h]h]h]h]h]uhjLdh]rVdhX/etc/mock/.cfgrWdrXd}rYd(hUhjSdubahhubhX.rZd}r[d(hX.hjLdubeubahjubeubj)r\d}r]d(hXQ``resultdir`` The directory where the logfiles and the SourceRPM are written to. hj4dhhhjh}r^d(h]h]h]h]h]uhM hhh]r_d(j)r`d}rad(hX ``resultdir``rbdhj\dhhhjh}rcd(h]h]h]h]h]uhM h]rddh)red}rfd(hjbdh}rgd(h]h]h]h]h]uhj`dh]rhdhX resultdirridrjd}rkd(hUhjedubahhubaubj)rld}rmd(hUh}rnd(h]h]h]h]h]uhj\dh]rodh)rpd}rqd(hXBThe directory where the logfiles and the SourceRPM are written to.rrdhjldhhhhh}rsd(h]h]h]h]h]uhM h]rtdhXBThe directory where the logfiles and the SourceRPM are written to.rudrvd}rwd(hjrdhjpdubaubahjubeubj)rxd}ryd(hX/``srpm`` The path to the SourceRPM to rebuild. hj4dhhhjh}rzd(h]h]h]h]h]uhM hhh]r{d(j)r|d}r}d(hX``srpm``r~dhjxdhhhjh}rd(h]h]h]h]h]uhM h]rdh)rd}rd(hj~dh}rd(h]h]h]h]h]uhj|dh]rdhXsrpmrdrd}rd(hUhjdubahhubaubj)rd}rd(hUh}rd(h]h]h]h]h]uhjxdh]rdh)rd}rd(hX%The path to the SourceRPM to rebuild.rdhjdhhhhh}rd(h]h]h]h]h]uhM h]rdhX%The path to the SourceRPM to rebuild.rdrd}rd(hjdhjdubaubahjubeubeubeubeubh)rd}rd(hUhhhhhhh}rd(h]h]h]h]rdjuah]rdh1auhM hhh]rd(h)rd}rd(hjzhjdhhhhh}rd(h]h]h]h]h]hjtuhM hhh]rdhXDebian Build Stepsrdrd}rd(hjzhjdubaubj)rd}rd(hUhjdhhhj h}rd(h]h]h]h]h]Uentries]rd((UsingleXBuild Steps; DebPbuilderXstep-DebPbuilderrdjdtrd(UsingleXDebPbuilder Build StepjdjdtrdeuhM hhh]ubh)rd}rd(hUhjdhhhhh}rd(h]h]h]h]h]hjduhM hhh]ubh)rd}rd(hUhjdhhh}hhh}rd(h]h]h]h]rd(jjdeh]rdhkauhM hhh}rdjdjdsh]rd(h)rd}rd(hjhjdhhhhh}rd(h]h]h]h]h]hjuhM hhh]rdhX DebPbuilderrdrd}rd(hjhjdubaubh)rd}rd(hXThe :bb:step:`DebPbuilder` step builds Debian packages within a chroot built by pbuilder. It populates the changeroot with a basic system and the packages listed as build requirement. The type of chroot to build is specified with the ``distribution``, ``distribution`` and ``mirror`` parameter. To use pbuilder your buildbot must have the right to run pbuilder as root through sudo. ::hjdhhhhh}rd(h]h]h]h]h]uhM hhh]rd(hXThe rdrd}rd(hXThe hjdubh)rd}rd(hX:bb:step:`DebPbuilder`rdhjdhhhhh}rd(UreftypeXstephhX DebPbuilderU refdomainXbbrdh]h]U refexplicith]h]h]hhuhM h]rdh)rd}rd(hjdh}rd(h]h]rd(hjdXbb-steprdeh]h]h]uhjdh]rdhX DebPbuilderrdrd}rd(hUhjdubahhubaubhX step builds Debian packages within a chroot built by pbuilder. It populates the changeroot with a basic system and the packages listed as build requirement. The type of chroot to build is specified with the rdrd}rd(hX step builds Debian packages within a chroot built by pbuilder. It populates the changeroot with a basic system and the packages listed as build requirement. The type of chroot to build is specified with the hjdubh)rd}rd(hX``distribution``h}rd(h]h]h]h]h]uhjdh]rdhX distributionrdrd}rd(hUhjdubahhubhX, rdrd}rd(hX, hjdubh)rd}rd(hX``distribution``h}rd(h]h]h]h]h]uhjdh]rdhX distributionrdrd}rd(hUhjdubahhubhX and rdrd}rd(hX and hjdubh)rd}rd(hX ``mirror``h}rd(h]h]h]h]h]uhjdh]rdhXmirrorrdrd}rd(hUhjdubahhubhXc parameter. To use pbuilder your buildbot must have the right to run pbuilder as root through sudo.rdrd}rd(hXc parameter. To use pbuilder your buildbot must have the right to run pbuilder as root through sudo.hjdubeubjS)rd}rd(hXTfrom buildbot.steps.package.deb.pbuilder import DebPbuilder f.addStep(DebPbuilder())hjdhhhjVh}rd(jXjYh]h]h]h]h]uhM hhh]rdhXTfrom buildbot.steps.package.deb.pbuilder import DebPbuilder f.addStep(DebPbuilder())rdrd}rd(hUhjdubaubh)rd}rd(hX'The step takes the following parametersrdhjdhhhhh}rd(h]h]h]h]h]uhM hhh]rdhX'The step takes the following parametersrdrd}rd(hjdhjdubaubj)rd}re(hUhjdhhhjh}re(h]h]h]h]h]uhNhhh]re(j)re}re(hX3``architecture`` Architecture to build chroot for. hjdhhhjh}re(h]h]h]h]h]uhM h]re(j)re}re(hX``architecture``r ehjehhhjh}r e(h]h]h]h]h]uhM h]r eh)r e}r e(hj eh}re(h]h]h]h]h]uhjeh]rehX architecturerere}re(hUhj eubahhubaubj)re}re(hUh}re(h]h]h]h]h]uhjeh]reh)re}re(hX!Architecture to build chroot for.rehjehhhhh}re(h]h]h]h]h]uhM h]rehX!Architecture to build chroot for.rere}re(hjehjeubaubahjubeubj)re}r e(hXO``distribution`` Name, or nickname, of the distribution. Defaults to 'stable'. hjdhhhjh}r!e(h]h]h]h]h]uhM hhh]r"e(j)r#e}r$e(hX``distribution``r%ehjehhhjh}r&e(h]h]h]h]h]uhM h]r'eh)r(e}r)e(hj%eh}r*e(h]h]h]h]h]uhj#eh]r+ehX distributionr,er-e}r.e(hUhj(eubahhubaubj)r/e}r0e(hUh}r1e(h]h]h]h]h]uhjeh]r2eh)r3e}r4e(hX=Name, or nickname, of the distribution. Defaults to 'stable'.r5ehj/ehhhhh}r6e(h]h]h]h]h]uhM h]r7ehX=Name, or nickname, of the distribution. Defaults to 'stable'.r8er9e}r:e(hj5ehj3eubaubahjubeubj)r;e}re(j)r?e}r@e(hX ``basetgz``rAehj;ehhhjh}rBe(h]h]h]h]h]uhM h]rCeh)rDe}rEe(hjAeh}rFe(h]h]h]h]h]uhj?eh]rGehXbasetgzrHerIe}rJe(hUhjDeubahhubaubj)rKe}rLe(hUh}rMe(h]h]h]h]h]uhj;eh]rNeh)rOe}rPe(hX(Path of the basetgz to use for building.rQehjKehhhhh}rRe(h]h]h]h]h]uhM h]rSehX(Path of the basetgz to use for building.rTerUe}rVe(hjQehjOeubaubahjubeubj)rWe}rXe(hXA``mirror`` URL of the mirror used to download the packages from. hjdhhhjh}rYe(h]h]h]h]h]uhM hhh]rZe(j)r[e}r\e(hX ``mirror``r]ehjWehhhjh}r^e(h]h]h]h]h]uhM h]r_eh)r`e}rae(hj]eh}rbe(h]h]h]h]h]uhj[eh]rcehXmirrorrderee}rfe(hUhj`eubahhubaubj)rge}rhe(hUh}rie(h]h]h]h]h]uhjWeh]rjeh)rke}rle(hX5URL of the mirror used to download the packages from.rmehjgehhhhh}rne(h]h]h]h]h]uhM h]roehX5URL of the mirror used to download the packages from.rperqe}rre(hjmehjkeubaubahjubeubj)rse}rte(hXN``extrapackages`` List if packages to install in addition to the base system. hjdhhhjh}rue(h]h]h]h]h]uhM hhh]rve(j)rwe}rxe(hX``extrapackages``ryehjsehhhjh}rze(h]h]h]h]h]uhM h]r{eh)r|e}r}e(hjyeh}r~e(h]h]h]h]h]uhjweh]rehX extrapackagesrere}re(hUhj|eubahhubaubj)re}re(hUh}re(h]h]h]h]h]uhjseh]reh)re}re(hX;List if packages to install in addition to the base system.rehjehhhhh}re(h]h]h]h]h]uhM h]rehX;List if packages to install in addition to the base system.rere}re(hjehjeubaubahjubeubj)re}re(hX``keyring`` Path to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution. hjdhhhjh}re(h]h]h]h]h]uhM# hhh]re(j)re}re(hX ``keyring``rehjehhhjh}re(h]h]h]h]h]uhM# h]reh)re}re(hjeh}re(h]h]h]h]h]uhjeh]rehXkeyringrere}re(hUhjeubahhubaubj)re}re(hUh}re(h]h]h]h]h]uhjeh]reh)re}re(hXsPath to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution.rehjehhhhh}re(h]h]h]h]h]uhM" h]rehXsPath to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution.rere}re(hjehjeubaubahjubeubj)re}re(hX6``components`` Repos to activate for chroot building. hjdhhhjh}re(h]h]h]h]h]uhM& hhh]re(j)re}re(hX``components``rehjehhhjh}re(h]h]h]h]h]uhM& h]reh)re}re(hjeh}re(h]h]h]h]h]uhjeh]rehX componentsrere}re(hUhjeubahhubaubj)re}re(hUh}re(h]h]h]h]h]uhjeh]reh)re}re(hX&Repos to activate for chroot building.rehjehhhhh}re(h]h]h]h]h]uhM& h]rehX&Repos to activate for chroot building.rere}re(hjehjeubaubahjubeubeubj)re}re(hUhjdhhhj h}re(h]h]h]h]h]Uentries]re((UsingleXBuild Steps; DebCowbuilderXstep-DebCowbuilderrejetre(UsingleXDebCowbuilder Build StepjejetreeuhM) hhh]ubh)re}re(hUhjdhhhhh}re(h]h]h]h]h]hjeuhM) hhh]ubeubh)re}re(hUhjdhhh}hhh}re(h]h]h]h]re(jjeeh]rehauhM+ hhh}rejejesh]re(h)re}re(hjhjehhhhh}re(h]h]h]h]h]hjuhM+ hhh]rehX DebCowbuilderrere}re(hjhjeubaubh)re}re(hXtThe :bb:step:`DebCowbuilder` step is a subclass of :bb:step:`DebPbuilder`, which use cowbuilder instead of pbuilder.hjehhhhh}re(h]h]h]h]h]uhM- hhh]re(hXThe rere}re(hXThe hjeubh)re}re(hX:bb:step:`DebCowbuilder`rehjehhhhh}re(UreftypeXstephhX DebCowbuilderU refdomainXbbreh]h]U refexplicith]h]h]hhuhM- h]reh)re}re(hjeh}re(h]h]re(hjeXbb-stepreeh]h]h]uhjeh]rehX DebCowbuilderrere}re(hUhjeubahhubaubhX step is a subclass of rere}re(hX step is a subclass of hjeubh)re}re(hX:bb:step:`DebPbuilder`rehjehhhhh}re(UreftypeXstephhX DebPbuilderU refdomainXbbreh]h]U refexplicith]h]h]hhuhM- h]reh)re}re(hjeh}rf(h]h]rf(hjeXbb-steprfeh]h]h]uhjeh]rfhX DebPbuilderrfrf}rf(hUhjeubahhubaubhX+, which use cowbuilder instead of pbuilder.rfrf}r f(hX+, which use cowbuilder instead of pbuilder.hjeubeubj)r f}r f(hUhjehhhj h}r f(h]h]h]h]h]Uentries]r f((UsingleXBuild Steps; DebLintianXstep-DebLintianrfjftrf(UsingleXDebLintian Build StepjfjftrfeuhM1 hhh]ubh)rf}rf(hUhjehhhhh}rf(h]h]h]h]h]hjfuhM1 hhh]ubeubh)rf}rf(hUhjdhhh}hhh}rf(h]h]h]h]rf(jjfeh]rfhauhM3 hhh}rfjfjfsh]rf(h)rf}rf(hjhjfhhhhh}rf(h]h]h]h]h]hjuhM3 hhh]rfhX DebLintianrfr f}r!f(hjhjfubaubh)r"f}r#f(hXThe :bb:step:`DebLintian` step checks a build .deb for bugs and policy violations. The packages or changes file to test is specified in ``fileloc``hjfhhhhh}r$f(h]h]h]h]h]uhM5 hhh]r%f(hXThe r&fr'f}r(f(hXThe hj"fubh)r)f}r*f(hX:bb:step:`DebLintian`r+fhj"fhhhhh}r,f(UreftypeXstephhX DebLintianU refdomainXbbr-fh]h]U refexplicith]h]h]hhuhM5 h]r.fh)r/f}r0f(hj+fh}r1f(h]h]r2f(hj-fXbb-stepr3feh]h]h]uhj)fh]r4fhX DebLintianr5fr6f}r7f(hUhj/fubahhubaubhXo step checks a build .deb for bugs and policy violations. The packages or changes file to test is specified in r8fr9f}r:f(hXo step checks a build .deb for bugs and policy violations. The packages or changes file to test is specified in hj"fubh)r;f}rfhXfilelocr?fr@f}rAf(hUhj;fubahhubeubjS)rBf}rCf(hX|from buildbot.steps.package.deb.lintian import DebLintian f.addStep(DebLintian(fileloc=Interpolate("%(prop:deb-changes)s")))hjfhhhjVh}rDf(jXjYh]h]h]h]h]uhM: hhh]rEfhX|from buildbot.steps.package.deb.lintian import DebLintian f.addStep(DebLintian(fileloc=Interpolate("%(prop:deb-changes)s")))rFfrGf}rHf(hUhjBfubaubeubeubh)rIf}rJf(hUhhhhhhh}rKf(h]h]h]h]rLfjah]rMfh-auhM> hhh]rNf(h)rOf}rPf(hjhjIfhhhhh}rQf(h]h]h]h]h]hjuhM> hhh]rRfhXMiscellaneous BuildStepsrSfrTf}rUf(hjhjOfubaubh)rVf}rWf(hX;A number of steps do not fall into any particular category.rXfhjIfhhhhh}rYf(h]h]h]h]h]uhM@ hhh]rZfhX;A number of steps do not fall into any particular category.r[fr\f}r]f(hjXfhjVfubaubj)r^f}r_f(hUhjIfhhhj h}r`f(h]h]h]h]h]Uentries]raf((UsingleXBuild Steps; HLintX step-HLintrbfjbftrcf(UsingleXHLint Build StepjbfjbftrdfeuhMC hhh]ubh)ref}rff(hUhjIfhhhhh}rgf(h]h]h]h]h]hjbfuhMC hhh]ubh)rhf}rif(hUhjIfhhh}hhh}rjf(h]h]h]h]rkf(jjbfeh]rlfhSauhME hhh}rmfjbfjefsh]rnf(h)rof}rpf(hjhjhfhhhhh}rqf(h]h]h]h]h]hjuhME hhh]rrfhXHLintrsfrtf}ruf(hjhjofubaubh)rvf}rwf(hXThe :bb:step:`HLint` step runs Twisted Lore, a lint-like checker over a set of ``.xhtml`` files. Any deviations from recommended style is flagged and put in the output log.hjhfhhhhh}rxf(h]h]h]h]h]uhMG hhh]ryf(hXThe rzfr{f}r|f(hXThe hjvfubh)r}f}r~f(hX:bb:step:`HLint`rfhjvfhhhhh}rf(UreftypeXstephhXHLintU refdomainXbbrfh]h]U refexplicith]h]h]hhuhMG h]rfh)rf}rf(hjfh}rf(h]h]rf(hjfXbb-steprfeh]h]h]uhj}fh]rfhXHLintrfrf}rf(hUhjfubahhubaubhX; step runs Twisted Lore, a lint-like checker over a set of rfrf}rf(hX; step runs Twisted Lore, a lint-like checker over a set of hjvfubh)rf}rf(hX ``.xhtml``h}rf(h]h]h]h]h]uhjvfh]rfhX.xhtmlrfrf}rf(hUhjfubahhubhXT files. Any deviations from recommended style is flagged and put in the output log.rfrf}rf(hXT files. Any deviations from recommended style is flagged and put in the output log.hjvfubeubh)rf}rf(hXThe step looks at the list of changes in the build to determine which files to check - it does not check all files. It specifically excludes any ``.xhtml`` files in the top-level ``sandbox/`` directory.hjhfhhhhh}rf(h]h]h]h]h]uhMK hhh]rf(hXThe step looks at the list of changes in the build to determine which files to check - it does not check all files. It specifically excludes any rfrf}rf(hXThe step looks at the list of changes in the build to determine which files to check - it does not check all files. It specifically excludes any hjfubh)rf}rf(hX ``.xhtml``h}rf(h]h]h]h]h]uhjfh]rfhX.xhtmlrfrf}rf(hUhjfubahhubhX files in the top-level rfrf}rf(hX files in the top-level hjfubh)rf}rf(hX ``sandbox/``h}rf(h]h]h]h]h]uhjfh]rfhXsandbox/rfrf}rf(hUhjfubahhubhX directory.rfrf}rf(hX directory.hjfubeubh)rf}rf(hXvThe step takes a single, optional, parameter: ``python``. This specifies the Python executable to use to run Lore. ::hjhfhhhhh}rf(h]h]h]h]h]uhMO hhh]rf(hX.The step takes a single, optional, parameter: rfrf}rf(hX.The step takes a single, optional, parameter: hjfubh)rf}rf(hX ``python``h}rf(h]h]h]h]h]uhjfh]rfhXpythonrfrf}rf(hUhjfubahhubhX;. This specifies the Python executable to use to run Lore.rfrf}rf(hX;. This specifies the Python executable to use to run Lore.hjfubeubjS)rf}rf(hXBfrom buildbot.steps.python_twisted import HLint f.addStep(HLint())hjhfhhhjVh}rf(jXjYh]h]h]h]h]uhMR hhh]rfhXBfrom buildbot.steps.python_twisted import HLint f.addStep(HLint())rfrf}rf(hUhjfubaubeubh)rf}rf(hUhjIfhhhhh}rf(h]h]h]h]rfjah]rfhauhMV hhh]rf(h)rf}rf(hjhjfhhhhh}rf(h]h]h]h]h]hjuhMV hhh]rfhXMaxQrfrf}rf(hjhjfubaubj)rf}rf(hUhjfhhhj h}rf(h]h]h]h]h]Uentries]rf((UsingleXBuild Steps; MaxQX step-MaxQrfjftrf(UsingleXMaxQ Build StepjfjftrfeuhMY hhh]ubh)rf}rf(hUhjfhhhhh}rf(h]h]h]h]h]hjfuhMY hhh]ubh)rf}rf(hXMaxQ (http://maxq.tigris.org/) is a web testing tool that allows you to record HTTP sessions and play them back. The :bb:step:`MaxQ` step runs this framework. ::hjfhhh}hhh}rf(h]h]h]h]rfjfah]uhMZ hhh}rfjfjfsh]rf(hXMaxQ (rfrf}rf(hXMaxQ (hjfubjM)rf}rf(hXhttp://maxq.tigris.org/rfh}rf(Urefurijfh]h]h]h]h]uhjfh]rfhXhttp://maxq.tigris.org/rfrf}rf(hUhjfubahjYubhXY) is a web testing tool that allows you to record HTTP sessions and play them back. The rfrf}rf(hXY) is a web testing tool that allows you to record HTTP sessions and play them back. The hjfubh)rf}rf(hX:bb:step:`MaxQ`rfhjfhhhhh}rf(UreftypeXstephhXMaxQU refdomainXbbrfh]h]U refexplicith]h]h]hhuhMZ h]rfh)rf}rf(hjfh}rf(h]h]rg(hjfXbb-steprgeh]h]h]uhjfh]rghXMaxQrgrg}rg(hUhjfubahhubaubhX step runs this framework.rgrg}rg(hX step runs this framework.hjfubeubjS)r g}r g(hXFfrom buildbot.steps.maxq import MaxQ f.addStep(MaxQ(testdir='tests/'))hjfhhhjVh}r g(jXjYh]h]h]h]h]uhM^ hhh]r ghXFfrom buildbot.steps.maxq import MaxQ f.addStep(MaxQ(testdir='tests/'))r grg}rg(hUhj gubaubh)rg}rg(hXThe single argument, ``testdir``, specifies where the tests should be run. This directory will be passed to the ``run_maxq.py`` command, and the results analyzed.hjfhhhhh}rg(h]h]h]h]h]uhMa hhh]rg(hXThe single argument, rgrg}rg(hXThe single argument, hjgubh)rg}rg(hX ``testdir``h}rg(h]h]h]h]h]uhjgh]rghXtestdirrgrg}rg(hUhjgubahhubhXP, specifies where the tests should be run. This directory will be passed to the rgrg}r g(hXP, specifies where the tests should be run. This directory will be passed to the hjgubh)r!g}r"g(hX``run_maxq.py``h}r#g(h]h]h]h]h]uhjgh]r$ghX run_maxq.pyr%gr&g}r'g(hUhj!gubahhubhX# command, and the results analyzed.r(gr)g}r*g(hX# command, and the results analyzed.hjgubeubj)r+g}r,g(hUhjfhhhj h}r-g(h]h]h]h]h]j ]r.g(jX HTTP RequestsUindex-34r/gUtr0gajuhMe hhh]ubh)r1g}r2g(hUhjfhhhhh}r3g(h]h]h]h]r4gj/gah]uhMe hhh]ubj)r5g}r6g(hUhjfhhhj h}r7g(h]h]h]h]h]Uentries]r8g((UsingleXBuild Steps; HTTPStepX step-HTTPStepr9gj9gtr:g(UsingleXHTTPStep Build Stepj9gj9gtr;geuhMf hhh]ubh)rg(h]h]h]h]r?gj9gah]uhMf hhh]ubj)r@g}rAg(hUhjfhhhj h}rBg(h]h]h]h]h]Uentries]rCg((UsingleXBuild Steps; POSTX step-POSTrDgjDgtrEg(UsingleXPOST Build StepjDgjDgtrFgeuhMg hhh]ubh)rGg}rHg(hUhjfhhhhh}rIg(h]h]h]h]rJgjDgah]uhMg hhh]ubj)rKg}rLg(hUhjfhhhj h}rMg(h]h]h]h]h]Uentries]rNg((UsingleXBuild Steps; GETXstep-GETrOgjOgtrPg(UsingleXGET Build StepjOgjOgtrQgeuhMh hhh]ubh)rRg}rSg(hUhjfhhhhh}rTg(h]h]h]h]rUgjOgah]uhMh hhh]ubj)rVg}rWg(hUhjfhhhj h}rXg(h]h]h]h]h]Uentries]rYg((UsingleXBuild Steps; PUTXstep-PUTrZgjZgtr[g(UsingleXPUT Build StepjZgjZgtr\geuhMi hhh]ubh)r]g}r^g(hUhjfhhhhh}r_g(h]h]h]h]r`gjZgah]uhMi hhh]ubj)rag}rbg(hUhjfhhhj h}rcg(h]h]h]h]h]Uentries]rdg((UsingleXBuild Steps; DELETEX step-DELETEregjegtrfg(UsingleXDELETE Build StepjegjegtrggeuhMj hhh]ubh)rhg}rig(hUhjfhhhhh}rjg(h]h]h]h]rkgjegah]uhMj hhh]ubj)rlg}rmg(hUhjfhhhj h}rng(h]h]h]h]h]Uentries]rog((UsingleXBuild Steps; HEADX step-HEADrpgjpgtrqg(UsingleXHEAD Build StepjpgjpgtrrgeuhMk hhh]ubh)rsg}rtg(hUhjfhhhhh}rug(h]h]h]h]rvgjpgah]uhMk hhh]ubj)rwg}rxg(hUhjfhhhj h}ryg(h]h]h]h]h]Uentries]rzg((UsingleXBuild Steps; OPTIONSX step-OPTIONSr{gj{gtr|g(UsingleXOPTIONS Build Stepj{gj{gtr}geuhMm hhh]ubh)r~g}rg(hUhjfhhhhh}rg(h]h]h]h]h]hj{guhMm hhh]ubeubh)rg}rg(hUhjIfhhh}hhh}rg(h]h]h]h]rg(jj{geh]rghauhMo hhh}rgj{gj~gsh]rg(h)rg}rg(hjhjghhhhh}rg(h]h]h]h]h]hjuhMo hhh]rghX HTTP Requestsrgrg}rg(hjhjgubaubh)rg}rg(hXUsing the :bb:step:`HTTPStep` step, it is possible to perform HTTP requests in order to trigger another REST service about the progress of the build.rghjghhhhh}rg(h]h]h]h]h]uhMq hhh]rg(hX Using the rgrg}rg(hX Using the hjgubh)rg}rg(hX:bb:step:`HTTPStep`rghjghhhhh}rg(UreftypeXstephhXHTTPStepU refdomainXbbrgh]h]U refexplicith]h]h]hhuhMq h]rgh)rg}rg(hjgh}rg(h]h]rg(hjgXbb-steprgeh]h]h]uhjgh]rghXHTTPSteprgrg}rg(hUhjgubahhubaubhXx step, it is possible to perform HTTP requests in order to trigger another REST service about the progress of the build.rgrg}rg(hXx step, it is possible to perform HTTP requests in order to trigger another REST service about the progress of the build.hjgubeubj")rg}rg(hXThis step requires the `txrequests `_ and `requests `_ Python libraries.rghjghhhj"h}rg(h]h]h]h]h]uhNhhh]rgh)rg}rg(hjghjghhhhh}rg(h]h]h]h]h]uhMs h]rg(hXThis step requires the rgrg}rg(hXThis step requires the hjgubjM)rg}rg(hX7`txrequests `_h}rg(Unameh j X'https://pypi.python.org/pypi/txrequestsrgh]h]h]h]h]uhjgh]rghX txrequestsrgrg}rg(hUhjgubahjYubh)rg}rg(hX* hKhjghhh}rg(Urefurijgh]rgU txrequestsrgah]h]h]h]rgh auh]ubhX and rgrg}rg(hX and hjgubjM)rg}rg(hX(`requests `_h}rg(UnamehNj Xhttp://python-requests.orgrgh]h]h]h]h]uhjgh]rghXrequestsrgrg}rg(hUhjgubahjYubh)rg}rg(hX hKhjghhh}rg(Urefurijgh]rgUrequestsrgah]h]h]h]rghNauh]ubhX Python libraries.rgrg}rg(hX Python libraries.hjgubeubaubh)rg}rg(hX!The parameters are the following:rghjghhhhh}rg(h]h]h]h]h]uhMu hhh]rghX!The parameters are the following:rgrg}rg(hjghjgubaubj)rg}rg(hUhjghhhjh}rg(h]h]h]h]h]uhNhhh]rg(j)rg}rg(hX6``url`` (mandatory) The URL where to send the request hjghhhjh}rg(h]h]h]h]h]uhMx h]rg(j)rg}rg(hX``url``rghjghhhjh}rg(h]h]h]h]h]uhMx h]rgh)rg}rg(hjgh}rg(h]h]h]h]h]uhjgh]rghXurlrgrg}rg(hUhjgubahhubaubj)rg}rg(hUh}rg(h]h]h]h]h]uhjgh]rgh)rg}rg(hX-(mandatory) The URL where to send the requestrghjghhhhh}rg(h]h]h]h]h]uhMx h]rghX-(mandatory) The URL where to send the requestrgrg}rg(hjghjgubaubahjubeubj)rg}rh(hX``method`` The HTTP method to use (out of ``POST``, ``GET``, ``PUT``, ``DELETE``, ``HEAD`` or ``OPTIONS``), default to ``POST``. hjghhhjh}rh(h]h]h]h]h]uhM| hhh]rh(j)rh}rh(hX ``method``rhhjghhhjh}rh(h]h]h]h]h]uhM| h]rhh)rh}r h(hjhh}r h(h]h]h]h]h]uhjhh]r hhXmethodr hr h}rh(hUhjhubahhubaubj)rh}rh(hUh}rh(h]h]h]h]h]uhjgh]rhh)rh}rh(hXuThe HTTP method to use (out of ``POST``, ``GET``, ``PUT``, ``DELETE``, ``HEAD`` or ``OPTIONS``), default to ``POST``.hjhhhhhh}rh(h]h]h]h]h]uhM{ h]rh(hXThe HTTP method to use (out of rhrh}rh(hXThe HTTP method to use (out of hjhubh)rh}rh(hX``POST``h}rh(h]h]h]h]h]uhjhh]rhhXPOSTrhrh}r h(hUhjhubahhubhX, r!hr"h}r#h(hX, hjhubh)r$h}r%h(hX``GET``h}r&h(h]h]h]h]h]uhjhh]r'hhXGETr(hr)h}r*h(hUhj$hubahhubhX, r+hr,h}r-h(hX, hjhubh)r.h}r/h(hX``PUT``h}r0h(h]h]h]h]h]uhjhh]r1hhXPUTr2hr3h}r4h(hUhj.hubahhubhX, r5hr6h}r7h(hX, hjhubh)r8h}r9h(hX ``DELETE``h}r:h(h]h]h]h]h]uhjhh]r;hhXDELETErh(hUhj8hubahhubhX, r?hr@h}rAh(hX, hjhubh)rBh}rCh(hX``HEAD``h}rDh(h]h]h]h]h]uhjhh]rEhhXHEADrFhrGh}rHh(hUhjBhubahhubhX or rIhrJh}rKh(hX or hjhubh)rLh}rMh(hX ``OPTIONS``h}rNh(h]h]h]h]h]uhjhh]rOhhXOPTIONSrPhrQh}rRh(hUhjLhubahhubhX), default to rShrTh}rUh(hX), default to hjhubh)rVh}rWh(hX``POST``h}rXh(h]h]h]h]h]uhjhh]rYhhXPOSTrZhr[h}r\h(hUhjVhubahhubhX.r]h}r^h(hX.hjhubeubahjubeubj)r_h}r`h(hX>``params`` Dictionary of URL parameters to append to the URL. hjghhhjh}rah(h]h]h]h]h]uhM hhh]rbh(j)rch}rdh(hX ``params``rehhj_hhhhjh}rfh(h]h]h]h]h]uhM h]rghh)rhh}rih(hjehh}rjh(h]h]h]h]h]uhjchh]rkhhXparamsrlhrmh}rnh(hUhjhhubahhubaubj)roh}rph(hUh}rqh(h]h]h]h]h]uhj_hh]rrhh)rsh}rth(hX2Dictionary of URL parameters to append to the URL.ruhhjohhhhhh}rvh(h]h]h]h]h]uhM h]rwhhX2Dictionary of URL parameters to append to the URL.rxhryh}rzh(hjuhhjshubaubahjubeubj)r{h}r|h(hXe``data`` The body to attach the request. If a dictionary is provided, form-encoding will take place. hjghhhjh}r}h(h]h]h]h]h]uhM hhh]r~h(j)rh}rh(hX``data``rhhj{hhhhjh}rh(h]h]h]h]h]uhM h]rhh)rh}rh(hjhh}rh(h]h]h]h]h]uhjhh]rhhXdatarhrh}rh(hUhjhubahhubaubj)rh}rh(hUh}rh(h]h]h]h]h]uhj{hh]rhh)rh}rh(hX[The body to attach the request. If a dictionary is provided, form-encoding will take place.rhhjhhhhhh}rh(h]h]h]h]h]uhM h]rhhX[The body to attach the request. If a dictionary is provided, form-encoding will take place.rhrh}rh(hjhhjhubaubahjubeubj)rh}rh(hX+``headers`` Dictionary of headers to send. hjghhhjh}rh(h]h]h]h]h]uhM hhh]rh(j)rh}rh(hX ``headers``rhhjhhhhjh}rh(h]h]h]h]h]uhM h]rhh)rh}rh(hjhh}rh(h]h]h]h]h]uhjhh]rhhXheadersrhrh}rh(hUhjhubahhubaubj)rh}rh(hUh}rh(h]h]h]h]h]uhjhh]rhh)rh}rh(hXDictionary of headers to send.rhhjhhhhhh}rh(h]h]h]h]h]uhM h]rhhXDictionary of headers to send.rhrh}rh(hjhhjhubaubahjubeubj)rh}rh(hX``other params`` Any other keywords supported by the ``requests`` api can be passed to this step .. note:: The entire Buildbot master process shares a single Requests ``Session`` object. This has the advantage of supporting connection re-use and other HTTP/1.1 features. However, it also means that any cookies or other state changed by one step will be visible to other steps, causing unexpected results. This behavior may change in future versions. hjghhhjh}rh(h]h]h]h]h]uhM hhh]rh(j)rh}rh(hX``other params``rhhjhhhhjh}rh(h]h]h]h]h]uhM h]rhh)rh}rh(hjhh}rh(h]h]h]h]h]uhjhh]rhhX other paramsrhrh}rh(hUhjhubahhubaubj)rh}rh(hUh}rh(h]h]h]h]h]uhjhh]rh(h)rh}rh(hXOAny other keywords supported by the ``requests`` api can be passed to this steprhhjhhhhhh}rh(h]h]h]h]h]uhM h]rh(hX$Any other keywords supported by the rhrh}rh(hX$Any other keywords supported by the hjhubh)rh}rh(hX ``requests``h}rh(h]h]h]h]h]uhjhh]rhhXrequestsrhrh}rh(hUhjhubahhubhX api can be passed to this steprhrh}rh(hX api can be passed to this stephjhubeubj")rh}rh(hXWThe entire Buildbot master process shares a single Requests ``Session`` object. This has the advantage of supporting connection re-use and other HTTP/1.1 features. However, it also means that any cookies or other state changed by one step will be visible to other steps, causing unexpected results. This behavior may change in future versions.h}rh(h]h]h]h]h]uhjhh]rhh)rh}rh(hXWThe entire Buildbot master process shares a single Requests ``Session`` object. This has the advantage of supporting connection re-use and other HTTP/1.1 features. However, it also means that any cookies or other state changed by one step will be visible to other steps, causing unexpected results. This behavior may change in future versions.hjhhhhhh}rh(h]h]h]h]h]uhM h]rh(hX<The entire Buildbot master process shares a single Requests rhrh}rh(hX<The entire Buildbot master process shares a single Requests hjhubh)rh}rh(hX ``Session``h}rh(h]h]h]h]h]uhjhh]rhhXSessionrhrh}rh(hUhjhubahhubhX object. This has the advantage of supporting connection re-use and other HTTP/1.1 features. However, it also means that any cookies or other state changed by one step will be visible to other steps, causing unexpected results. This behavior may change in future versions.rhrh}rh(hX object. This has the advantage of supporting connection re-use and other HTTP/1.1 features. However, it also means that any cookies or other state changed by one step will be visible to other steps, causing unexpected results. This behavior may change in future versions.hjhubeubahj"ubehjubeubeubh)rh}rh(hXWhen the method is known in advance, class with the name of the method can also be used. In this case, it is not necessary to specify the method.rhhjghhhhh}rh(h]h]h]h]h]uhM hhh]rhhXWhen the method is known in advance, class with the name of the method can also be used. In this case, it is not necessary to specify the method.rhrh}rh(hjhhjhubaubh)rh}rh(hX Example::rhhjghhhhh}rh(h]h]h]h]h]uhM hhh]rhhXExample:rhrh}rh(hXExample:hjhubaubjS)rh}rh(hXjfrom buildbot.steps.http import POST from buildbot.process.properties import Property f.addStep( POST( 'http://myRESTService.example.com/builds', data = { 'builder': Property('buildername'), 'buildnumber': Property('buildnumber'), 'slavename': Property('slavename'), 'revision': Property('got_revision'), } ) )hjghhhjVh}ri(jXjYh]h]h]h]h]uhM hhh]rihXjfrom buildbot.steps.http import POST from buildbot.process.properties import Property f.addStep( POST( 'http://myRESTService.example.com/builds', data = { 'builder': Property('buildername'), 'buildnumber': Property('buildnumber'), 'slavename': Property('slavename'), 'revision': Property('got_revision'), } ) )riri}ri(hUhjhubaubeubeubeubhhh}rih5jZ shhh}ri(h]h]h]h]ri(jgUid2rij] eh]r i(hRh5euhKhhh}r ij] jZ sh]r i(h)r i}r i(hjlhhhhhhh}ri(h]h]h]h]h]hjfuhKhhh]rihXSource Checkoutriri}ri(hjlhj iubaubj)ri}ri(hUhhhhhj h}ri(h]h]h]h]h]Uentries]ri(jXbuildbot.steps.source (module)Xmodule-buildbot.steps.sourceUtriauhKhhh]ubh)ri}ri(hXZAt the moment, Buildbot contains two implementations of most source steps. The new implementation handles most of the logic on the master side, and has a simpler, more unified approach. The older implementation (:ref:`Source-Checkout-Slave-Side`) handles the logic on the slave side, and some of the classes have a bewildering array of options.hhhhhhh}ri(h]h]h]h]h]uhKhhh]ri(hXAt the moment, Buildbot contains two implementations of most source steps. The new implementation handles most of the logic on the master side, and has a simpler, more unified approach. The older implementation (riri}ri(hXAt the moment, Buildbot contains two implementations of most source steps. The new implementation handles most of the logic on the master side, and has a simpler, more unified approach. The older implementation (hjiubh)ri}r i(hX!:ref:`Source-Checkout-Slave-Side`r!ihjihhhhh}r"i(UreftypeXrefhhXsource-checkout-slave-sideU refdomainXstdr#ih]h]U refexplicith]h]h]hhuhKh]r$ijW)r%i}r&i(hj!ih}r'i(h]h]r(i(hj#iXstd-refr)ieh]h]h]uhjih]r*ihXSource-Checkout-Slave-Sider+ir,i}r-i(hUhj%iubahjaubaubhXc) handles the logic on the slave side, and some of the classes have a bewildering array of options.r.ir/i}r0i(hXc) handles the logic on the slave side, and some of the classes have a bewildering array of options.hjiubeubcdocutils.nodes caution r1i)r2i}r3i(hXMaster-side source checkout steps are recently developed and not stable yet. If you find any bugs please report them on the `Buildbot Trac `_. The older Slave-side described source steps are :ref:`Source-Checkout-Slave-Side`. The old source steps are imported like this:: from buildbot.steps.source import Git while new source steps are in separate source-packages for each version-control system:: from buildbot.steps.source.git import GithhhhhUcautionr4ih}r5i(h]h]h]h]h]uhNhhh]r6i(h)r7i}r8i(hXMaster-side source checkout steps are recently developed and not stable yet. If you find any bugs please report them on the `Buildbot Trac `_. The older Slave-side described source steps are :ref:`Source-Checkout-Slave-Side`.hj2ihhhhh}r9i(h]h]h]h]h]uhKh]r:i(hX|Master-side source checkout steps are recently developed and not stable yet. If you find any bugs please report them on the r;iri}r?i(hX5`Buildbot Trac `_h}r@i(UnameX Buildbot Tracj X"http://trac.buildbot.net/newticketrAih]h]h]h]h]uhj7ih]rBihX Buildbot TracrCirDi}rEi(hUhj>iubahjYubh)rFi}rGi(hX% hKhj7ihhh}rHi(UrefurijAih]rIiU buildbot-tracrJiah]h]h]h]rKih%auh]ubhX2. The older Slave-side described source steps are rLirMi}rNi(hX2. The older Slave-side described source steps are hj7iubh)rOi}rPi(hX!:ref:`Source-Checkout-Slave-Side`rQihj7ihhhhh}rRi(UreftypeXrefhhXsource-checkout-slave-sideU refdomainXstdrSih]h]U refexplicith]h]h]hhuhKh]rTijW)rUi}rVi(hjQih}rWi(h]h]rXi(hjSiXstd-refrYieh]h]h]uhjOih]rZihXSource-Checkout-Slave-Sider[ir\i}r]i(hUhjUiubahjaubaubhX.r^i}r_i(hX.hj7iubeubh)r`i}rai(hX-The old source steps are imported like this::hj2ihhhhh}rbi(h]h]h]h]h]uhKh]rcihX,The old source steps are imported like this:rdirei}rfi(hX,The old source steps are imported like this:hj`iubaubjS)rgi}rhi(hX%from buildbot.steps.source import Githj2ihjVh}rii(jXjYh]h]h]h]h]uhKh]rjihX%from buildbot.steps.source import Gitrkirli}rmi(hUhjgiubaubh)rni}roi(hXXwhile new source steps are in separate source-packages for each version-control system::hj2ihhhhh}rpi(h]h]h]h]h]uhKh]rqihXWwhile new source steps are in separate source-packages for each version-control system:rrirsi}rti(hXWwhile new source steps are in separate source-packages for each version-control system:hjniubaubjS)rui}rvi(hX)from buildbot.steps.source.git import Githj2ihjVh}rwi(jXjYh]h]h]h]h]uhKh]rxihX)from buildbot.steps.source.git import Gitryirzi}r{i(hUhjuiubaubeubh)r|i}r}i(hXNew users should, where possible, use the new implementations. The old implementations will be deprecated in a later release. Old users should take this opportunity to switch to the new implementations while both are supported by Buildbot.r~ihhhhhhh}ri(h]h]h]h]h]uhKhhh]rihXNew users should, where possible, use the new implementations. The old implementations will be deprecated in a later release. Old users should take this opportunity to switch to the new implementations while both are supported by Buildbot.riri}ri(hj~ihj|iubaubh)ri}ri(hXSome version control systems have not yet been implemented as master-side steps. If you are interested in continued support for such a version control system, please consider helping the Buildbot developers to create such an implementation. In particular, version-control systems with proprietary licenses will not be supported without access to the version-control system for development.rihhhhhhh}ri(h]h]h]h]h]uhKhhh]rihXSome version control systems have not yet been implemented as master-side steps. If you are interested in continued support for such a version control system, please consider helping the Buildbot developers to create such an implementation. In particular, version-control systems with proprietary licenses will not be supported without access to the version-control system for development.riri}ri(hjihjiubaubhj j j j j j| jr jm jh jc eubhhhhh}ri(h]rij ah]h]h]rij~ah]uhKhhh]ri(h)ri}ri(hjhhhhhhh}ri(h]h]h]h]h]hj}uhKhhh]rihXCommon Parametersriri}ri(hjhjiubaubh)ri}ri(hXAll source checkout steps accept some common parameters to control how they get the sources and where they should be placed. The remaining per-VC-system parameters are mostly to specify where exactly the sources are coming from.rihhhhhhh}ri(h]h]h]h]h]uhKhhh]rihXAll source checkout steps accept some common parameters to control how they get the sources and where they should be placed. The remaining per-VC-system parameters are mostly to specify where exactly the sources are coming from.riri}ri(hjihjiubaubh)ri}ri(hX``mode`` ``method``hhhhhhh}ri(h]h]h]h]h]uhKhhh]ri(h)ri}ri(hX``mode``h}ri(h]h]h]h]h]uhjih]rihXmoderiri}ri(hUhjiubahhubhX ri}ri(hX hjiubh)ri}ri(hX ``method``h}ri(h]h]h]h]h]uhjih]rihXmethodriri}ri(hUhjiubahhubeubjx)ri}ri(hUhhhhhj{h}ri(h]h]h]h]h]uhNhhh]ri(h)ri}ri(hXThese two parameters specify the means by which the source is checked out. ``mode`` specifies the type of checkout and ``method`` tells about the way to implement it. ::hjihhhhh}ri(h]h]h]h]h]uhKh]ri(hXKThese two parameters specify the means by which the source is checked out. riri}ri(hXKThese two parameters specify the means by which the source is checked out. hjiubh)ri}ri(hX``mode``h}ri(h]h]h]h]h]uhjih]rihXmoderiri}ri(hUhjiubahhubhX$ specifies the type of checkout and riri}ri(hX$ specifies the type of checkout and hjiubh)ri}ri(hX ``method``h}ri(h]h]h]h]h]uhjih]rihXmethodriri}ri(hUhjiubahhubhX% tells about the way to implement it.riri}ri(hX% tells about the way to implement it.hjiubeubjS)ri}ri(hXfactory = BuildFactory() from buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh'))hjihjVh}ri(jXjYh]h]h]h]h]uhKh]rihXfactory = BuildFactory() from buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh'))riri}ri(hUhjiubaubh)ri}ri(hXThe ``mode`` parameter a string describing the kind of VC operation that is desired, defaulting to ``incremental``. The options arehjihhhhh}ri(h]h]h]h]h]uhKh]ri(hXThe riri}ri(hXThe hjiubh)ri}ri(hX``mode``h}ri(h]h]h]h]h]uhjih]rihXmoderiri}ri(hUhjiubahhubhXW parameter a string describing the kind of VC operation that is desired, defaulting to riri}ri(hXW parameter a string describing the kind of VC operation that is desired, defaulting to hjiubh)ri}ri(hX``incremental``h}ri(h]h]h]h]h]uhjih]rihX incrementalriri}ri(hUhjiubahhubhX. The options areriri}ri(hX. The options arehjiubeubj)ri}ri(hUh}ri(h]h]h]h]h]uhjih]ri(j)ri}ri(hX``incremental`` Update the source to the desired revision, but do not remove any other files generated by previous builds. This allows compilers to take advantage of object files from previous builds. This mode is exactly same as the old ``update`` mode. hjihhhjh}ri(h]h]h]h]h]uhKh]ri(j)ri}ri(hX``incremental``rihjihhhjh}ri(h]h]h]h]h]uhKh]rjh)rj}rj(hjih}rj(h]h]h]h]h]uhjih]rjhX incrementalrjrj}rj(hUhjjubahhubaubj)rj}r j(hUh}r j(h]h]h]h]h]uhjih]r jh)r j}r j(hXUpdate the source to the desired revision, but do not remove any other files generated by previous builds. This allows compilers to take advantage of object files from previous builds. This mode is exactly same as the old ``update`` mode.hjjhhhhh}rj(h]h]h]h]h]uhKh]rj(hXUpdate the source to the desired revision, but do not remove any other files generated by previous builds. This allows compilers to take advantage of object files from previous builds. This mode is exactly same as the old rjrj}rj(hXUpdate the source to the desired revision, but do not remove any other files generated by previous builds. This allows compilers to take advantage of object files from previous builds. This mode is exactly same as the old hj jubh)rj}rj(hX ``update``h}rj(h]h]h]h]h]uhj jh]rjhXupdaterjrj}rj(hUhjjubahhubhX mode.rjrj}rj(hX mode.hj jubeubahjubeubj)rj}rj(hX``full`` Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files. hjihhhjh}rj(h]h]h]h]h]uhKh]r j(j)r!j}r"j(hX``full``r#jhjjhhhjh}r$j(h]h]h]h]h]uhKh]r%jh)r&j}r'j(hj#jh}r(j(h]h]h]h]h]uhj!jh]r)jhXfullr*jr+j}r,j(hUhj&jubahhubaubj)r-j}r.j(hUh}r/j(h]h]h]h]h]uhjjh]r0jh)r1j}r2j(hX}Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files.r3jhj-jhhhhh}r4j(h]h]h]h]h]uhKh]r5jhX}Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files.r6jr7j}r8j(hj3jhj1jubaubahjubeubehjubh)r9j}r:j(hXMethods are specific to the version-control system in question, as they may take advantage of special behaviors in that version-control system that can make checkouts more efficient or reliable.r;jhjihhhhh}rjr?j}r@j(hj;jhj9jubaubeubj)rAj}rBj(hUhhhhhjh}rCj(h]h]h]h]h]uhNhhh]rDj(j)rEj}rFj(hX``workdir`` like all Steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself). hjAjhhhjh}rGj(h]h]h]h]h]uhKh]rHj(j)rIj}rJj(hX ``workdir``rKjhjEjhhhjh}rLj(h]h]h]h]h]uhKh]rMjh)rNj}rOj(hjKjh}rPj(h]h]h]h]h]uhjIjh]rQjhXworkdirrRjrSj}rTj(hUhjNjubahhubaubj)rUj}rVj(hUh}rWj(h]h]h]h]h]uhjEjh]rXjh)rYj}rZj(hXlike all Steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself).r[jhjUjhhhhh}r\j(h]h]h]h]h]uhKh]r]jhXlike all Steps, this indicates the directory where the build will take place. Source Steps are special in that they perform some operations outside of the workdir (like creating the workdir itself).r^jr_j}r`j(hj[jhjYjubaubahjubeubj)raj}rbj(hX``alwaysUseLatest`` if True, bypass the usual behavior of checking out the revision in the source stamp, and always update to the latest revision in the repository instead. hjAjhhhjh}rcj(h]h]h]h]h]uhMhhh]rdj(j)rej}rfj(hX``alwaysUseLatest``rgjhjajhhhjh}rhj(h]h]h]h]h]uhMh]rijh)rjj}rkj(hjgjh}rlj(h]h]h]h]h]uhjejh]rmjhXalwaysUseLatestrnjroj}rpj(hUhjjjubahhubaubj)rqj}rrj(hUh}rsj(h]h]h]h]h]uhjajh]rtjh)ruj}rvj(hXif True, bypass the usual behavior of checking out the revision in the source stamp, and always update to the latest revision in the repository instead.rwjhjqjhhhhh}rxj(h]h]h]h]h]uhMh]ryjhXif True, bypass the usual behavior of checking out the revision in the source stamp, and always update to the latest revision in the repository instead.rzjr{j}r|j(hjwjhjujubaubahjubeubj)r}j}r~j(hX``retry`` If set, this specifies a tuple of ``(delay, repeats)`` which means that when a full VC checkout fails, it should be retried up to ``repeats`` times, waiting ``delay`` seconds between attempts. If you don't provide this, it defaults to ``None``, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections. hjAjhhhjh}rj(h]h]h]h]h]uhM hhh]rj(j)rj}rj(hX ``retry``rjhj}jhhhjh}rj(h]h]h]h]h]uhM h]rjh)rj}rj(hjjh}rj(h]h]h]h]h]uhjjh]rjhXretryrjrj}rj(hUhjjubahhubaubj)rj}rj(hUh}rj(h]h]h]h]h]uhj}jh]rjh)rj}rj(hXIf set, this specifies a tuple of ``(delay, repeats)`` which means that when a full VC checkout fails, it should be retried up to ``repeats`` times, waiting ``delay`` seconds between attempts. If you don't provide this, it defaults to ``None``, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.hjjhhhhh}rj(h]h]h]h]h]uhMh]rj(hX"If set, this specifies a tuple of rjrj}rj(hX"If set, this specifies a tuple of hjjubh)rj}rj(hX``(delay, repeats)``h}rj(h]h]h]h]h]uhjjh]rjhX(delay, repeats)rjrj}rj(hUhjjubahhubhXL which means that when a full VC checkout fails, it should be retried up to rjrj}rj(hXL which means that when a full VC checkout fails, it should be retried up to hjjubh)rj}rj(hX ``repeats``h}rj(h]h]h]h]h]uhjjh]rjhXrepeatsrjrj}rj(hUhjjubahhubhX times, waiting rjrj}rj(hX times, waiting hjjubh)rj}rj(hX ``delay``h}rj(h]h]h]h]h]uhjjh]rjhXdelayrjrj}rj(hUhjjubahhubhXE seconds between attempts. If you don't provide this, it defaults to rjrj}rj(hXE seconds between attempts. If you don't provide this, it defaults to hjjubh)rj}rj(hX``None``h}rj(h]h]h]h]h]uhjjh]rjhXNonerjrj}rj(hUhjjubahhubhX, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.rjrj}rj(hX, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.hjjubeubahjubeubj)rj}rj(hX:``repository`` The name of this parameter might vary depending on the Source step you are running. The concept explained here is common to all steps and applies to ``repourl`` as well as for ``baseURL`` (when applicable). A common idiom is to pass ``Property('repository', 'url://default/repo/path')`` as repository. This grabs the repository from the source stamp of the build. This can be a security issue, if you allow force builds from the web, or have the :class:`WebStatus` change hooks enabled; as the buildslave will download code from an arbitrary repository. hjAjhhhjh}rj(h]h]h]h]h]uhMhhh]rj(j)rj}rj(hX``repository``rjhjjhhhjh}rj(h]h]h]h]h]uhMh]rjh)rj}rj(hjjh}rj(h]h]h]h]h]uhjjh]rjhX repositoryrjrj}rj(hUhjjubahhubaubj)rj}rj(hUh}rj(h]h]h]h]h]uhjjh]rj(h)rj}rj(hXThe name of this parameter might vary depending on the Source step you are running. The concept explained here is common to all steps and applies to ``repourl`` as well as for ``baseURL`` (when applicable).hjjhhhhh}rj(h]h]h]h]h]uhM h]rj(hXThe name of this parameter might vary depending on the Source step you are running. The concept explained here is common to all steps and applies to rjrj}rj(hXThe name of this parameter might vary depending on the Source step you are running. The concept explained here is common to all steps and applies to hjjubh)rj}rj(hX ``repourl``h}rj(h]h]h]h]h]uhjjh]rjhXrepourlrjrj}rj(hUhjjubahhubhX as well as for rjrj}rj(hX as well as for hjjubh)rj}rj(hX ``baseURL``h}rj(h]h]h]h]h]uhjjh]rjhXbaseURLrjrj}rj(hUhjjubahhubhX (when applicable).rjrj}rj(hX (when applicable).hjjubeubh)rj}rj(hXZA common idiom is to pass ``Property('repository', 'url://default/repo/path')`` as repository. This grabs the repository from the source stamp of the build. This can be a security issue, if you allow force builds from the web, or have the :class:`WebStatus` change hooks enabled; as the buildslave will download code from an arbitrary repository.hjjhhhhh}rj(h]h]h]h]h]uhMh]rj(hXA common idiom is to pass rjrj}rj(hXA common idiom is to pass hjjubh)rj}rj(hX5``Property('repository', 'url://default/repo/path')``h}rj(h]h]h]h]h]uhjjh]rjhX1Property('repository', 'url://default/repo/path')rjrj}rj(hUhjjubahhubhX as repository. This grabs the repository from the source stamp of the build. This can be a security issue, if you allow force builds from the web, or have the rjrj}rj(hX as repository. This grabs the repository from the source stamp of the build. This can be a security issue, if you allow force builds from the web, or have the hjjubh)rk}rk(hX:class:`WebStatus`rkhjjhhhhh}rk(UreftypeXclasshhX WebStatusU refdomainXpyrkh]h]U refexplicith]h]h]hhhNhj uhMh]rkh)rk}rk(hjkh}rk(h]h]r k(hjkXpy-classr keh]h]h]uhjkh]r khX WebStatusr kr k}rk(hUhjkubahhubaubhXY change hooks enabled; as the buildslave will download code from an arbitrary repository.rkrk}rk(hXY change hooks enabled; as the buildslave will download code from an arbitrary repository.hjjubeubehjubeubj)rk}rk(hXn``codebase`` This specifies which codebase the source step should use to select the right source stamp. The default codebase value is ''. The codebase must correspond to a codebase assigned by the :bb:cfg:`codebaseGenerator`. If there is no codebaseGenerator defined in the master then codebase doesn't need to be set, the default value will then match all changes. hjAjhhhjh}rk(h]h]h]h]h]uhMhhh]rk(j)rk}rk(hX ``codebase``rkhjkhhhjh}rk(h]h]h]h]h]uhMh]rkh)rk}rk(hjkh}rk(h]h]h]h]h]uhjkh]rkhXcodebaserkr k}r!k(hUhjkubahhubaubj)r"k}r#k(hUh}r$k(h]h]h]h]h]uhjkh]r%kh)r&k}r'k(hX`This specifies which codebase the source step should use to select the right source stamp. The default codebase value is ''. The codebase must correspond to a codebase assigned by the :bb:cfg:`codebaseGenerator`. If there is no codebaseGenerator defined in the master then codebase doesn't need to be set, the default value will then match all changes.hj"khhhhh}r(k(h]h]h]h]h]uhMh]r)k(hXThis specifies which codebase the source step should use to select the right source stamp. The default codebase value is ''. The codebase must correspond to a codebase assigned by the r*kr+k}r,k(hXThis specifies which codebase the source step should use to select the right source stamp. The default codebase value is ''. The codebase must correspond to a codebase assigned by the hj&kubh)r-k}r.k(hX:bb:cfg:`codebaseGenerator`r/khj&khhhhh}r0k(UreftypeXcfghhXcodebaseGeneratorU refdomainXbbr1kh]h]U refexplicith]h]h]hhuhMh]r2kh)r3k}r4k(hj/kh}r5k(h]h]r6k(hj1kXbb-cfgr7keh]h]h]uhj-kh]r8khXcodebaseGeneratorr9kr:k}r;k(hUhj3kubahhubaubhX. If there is no codebaseGenerator defined in the master then codebase doesn't need to be set, the default value will then match all changes.rk(hX. If there is no codebaseGenerator defined in the master then codebase doesn't need to be set, the default value will then match all changes.hj&kubeubahjubeubj)r?k}r@k(hX``timeout`` Specifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes). hjAjhhhjh}rAk(h]h]h]h]h]uhM"hhh]rBk(j)rCk}rDk(hX ``timeout``rEkhj?khhhjh}rFk(h]h]h]h]h]uhM"h]rGkh)rHk}rIk(hjEkh}rJk(h]h]h]h]h]uhjCkh]rKkhXtimeoutrLkrMk}rNk(hUhjHkubahhubaubj)rOk}rPk(hUh}rQk(h]h]h]h]h]uhj?kh]rRkh)rSk}rTk(hXSpecifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes).rUkhjOkhhhhh}rVk(h]h]h]h]h]uhM h]rWkhXSpecifies the timeout for slave-side operations, in seconds. If your repositories are particularly large, then you may need to increase this value from its default of 1200 (20 minutes).rXkrYk}rZk(hjUkhjSkubaubahjubeubj)r[k}r\k(hX``logEnviron`` If this option is true (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set logEnviron=False. hjAjhhhjh}r]k(h]h]h]h]h]uhM(hhh]r^k(j)r_k}r`k(hX``logEnviron``rakhj[khhhjh}rbk(h]h]h]h]h]uhM(h]rckh)rdk}rek(hjakh}rfk(h]h]h]h]h]uhj_kh]rgkhX logEnvironrhkrik}rjk(hUhjdkubahhubaubj)rkk}rlk(hUh}rmk(h]h]h]h]h]uhj[kh]rnkh)rok}rpk(hXIf this option is true (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set logEnviron=False.rqkhjkkhhhhh}rrk(h]h]h]h]h]uhM%h]rskhXIf this option is true (the default), then the step's logfile will describe the environment variables on the slave. In situations where the environment is not relevant and is long, it may be easier to set logEnviron=False.rtkruk}rvk(hjqkhjokubaubahjubeubj)rwk}rxk(hX``env`` a dictionary of environment strings which will be added to the child command's environment. The usual property interpolations can be used in environment variable names and values - see :ref:`Properties`. hjAjhhhjh}ryk(h]h]h]h]h]uhM-hhh]rzk(j)r{k}r|k(hX``env``r}khjwkhhhjh}r~k(h]h]h]h]h]uhM-h]rkh)rk}rk(hj}kh}rk(h]h]h]h]h]uhj{kh]rkhXenvrkrk}rk(hUhjkubahhubaubj)rk}rk(hUh}rk(h]h]h]h]h]uhjwkh]rkh)rk}rk(hXa dictionary of environment strings which will be added to the child command's environment. The usual property interpolations can be used in environment variable names and values - see :ref:`Properties`.hjkhhhhh}rk(h]h]h]h]h]uhM+h]rk(hXa dictionary of environment strings which will be added to the child command's environment. The usual property interpolations can be used in environment variable names and values - see rkrk}rk(hXa dictionary of environment strings which will be added to the child command's environment. The usual property interpolations can be used in environment variable names and values - see hjkubh)rk}rk(hX:ref:`Properties`rkhjkhhhhh}rk(UreftypeXrefhhX propertiesU refdomainXstdrkh]h]U refexplicith]h]h]hhuhM+h]rkjW)rk}rk(hjkh}rk(h]h]rk(hjkXstd-refrkeh]h]h]uhjkh]rkhX Propertiesrkrk}rk(hUhjkubahjaubaubhX.rk}rk(hX.hjkubeubahjubeubeubj)rk}rk(hUhhhhhj h}rk(h]h]h]h]h]Uentries]rk((UsingleXBuild Steps; Mercurialj j trk(UsingleXMercurial Build Stepj j trkeuhM0hhh]ubj j eubhhhUsystem_messagerkh}rk(h]UlevelKh]h]rkj~aUsourcehh]h]UlineKUtypeUINFOrkuhKhhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhhh]rkhX4Duplicate implicit target name: "common parameters".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhj hhhjkh}rk(h]UlevelKh]h]rkjaUsourcehh]h]UlineKUtypejkuhM9hhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhjkh]rkhX,Duplicate implicit target name: "mercurial".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhj hhhjkh}rk(h]UlevelKh]h]rkjaUsourcehh]h]UlineKUtypejkuhMzhhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhjkh]rkhX&Duplicate implicit target name: "git".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhj hhhjkh}rk(h]UlevelKh]h]rkjaUsourcehh]h]UlineKUtypejkuhMxhhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhjkh]rkhX&Duplicate implicit target name: "cvs".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhjr hhhjkh}rk(h]UlevelKh]h]rkj) aUsourcehh]h]UlineKUtypejkuhMnhhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhjkh]rkhX'Duplicate implicit target name: "repo".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhjh hhhjkh}rk(h]UlevelKh]h]rkj#aUsourcehh]h]UlineKUtypejkuhMhhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhjkh]rkhX(Duplicate implicit target name: "darcs".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhjc hhhjkh}rk(h]UlevelKh]h]rkj%aUsourcehh]h]UlineKUtypejkuhM!hhh]rkh)rk}rk(hUh}rk(h]h]h]h]h]uhjkh]rkhX+Duplicate implicit target name: "monotone".rkrk}rk(hUhjkubahhubaubh)rk}rk(hUhj*hhhjkh}rk(h]UlevelKh]h]rlj*aUsourcehh]h]UlineKUtypejkuhMhhh]rlh)rl}rl(hUh}rl(h]h]h]h]h]uhjkh]rlhX&Duplicate explicit target name: "cvs".rlrl}rl(hUhjlubahhubaubh)r l}r l(hUhjO,hhhjkh}r l(h]UlevelKh]h]r lj,aUsourcehh]h]UlineKUtypejkuhM1hhh]r lh)rl}rl(hUh}rl(h]h]h]h]h]uhj lh]rlhX-Duplicate explicit target name: "subversion".rlrl}rl(hUhjlubahhubaubh)rl}rl(hUhj/hhhjkh}rl(h]UlevelKh]h]rljE/aUsourcehh]h]UlineKUtypejkuhMhhh]rlh)rl}rl(hUh}rl(h]h]h]h]h]uhjlh]rlhX(Duplicate explicit target name: "darcs".rlrl}r l(hUhjlubahhubaubh)r!l}r"l(hUhj%0hhhjkh}r#l(h]UlevelKh]h]r$ljX0aUsourcehh]h]UlineKUtypejkuhMhhh]r%lh)r&l}r'l(hUh}r(l(h]h]h]h]h]uhj!lh]r)lhX,Duplicate explicit target name: "mercurial".r*lr+l}r,l(hUhj&lubahhubaubh)r-l}r.l(hUhjr2hhhjkh}r/l(h]UlevelKh]h]r0lj2aUsourcehh]h]UlineKUtypejkuhMhhh]r1lh)r2l}r3l(hUh}r4l(h]h]h]h]h]uhj-lh]r5lhX+Duplicate explicit target name: "perforce".r6lr7l}r8l(hUhj2lubahhubaubh)r9l}r:l(hUhj,4hhhjkh}r;l(h]UlevelKh]h]rl}r?l(hUh}r@l(h]h]h]h]h]uhj9lh]rAlhX&Duplicate explicit target name: "git".rBlrCl}rDl(hUhj>lubahhubaubh)rEl}rFl(hUhj6hhhjkh}rGl(h]UlevelKh]h]rHlj6aUsourcehh]h]UlineKUtypejkuhMuhhh]rIlh)rJl}rKl(hUh}rLl(h]h]h]h]h]uhjElh]rMlhX'Duplicate explicit target name: "repo".rNlrOl}rPl(hUhjJlubahhubaubh)rQl}rRl(hUhjEhhhjkh}rSl(h]UlevelKh]h]rTljEaUsourcehh]h]UlineKUtypejkuhMhhh]rUlh)rVl}rWl(hUh}rXl(h]h]h]h]h]uhjQlh]rYlhX+Duplicate implicit target name: "robocopy".rZlr[l}r\l(hUhjVlubahhubaubh)r]l}r^l(hUhj Nhhhjkh}r_l(h]UlevelKh]h]r`ljiNaUsourcehh]h]UlineKUtypejkuhM hhh]ralh)rbl}rcl(hUh}rdl(h]h]h]h]h]uhj]lh]relhX+Duplicate implicit target name: "pyflakes".rflrgl}rhl(hUhjblubahhubaubh)ril}rjl(hUhjNhhhjkh}rkl(h]UlevelKh]h]rlljj\h?h?h@jNhAjhBjX'hCj%hDjhEhEhFj*hGhGhHjhIhIhJhJhKjhLjhMj\hNjghOjOhPjshQjhRjihSjhThThUj_hVj'#hWjhXjhYhYhZjNh[jMh\jyh]jh^jh_Nh`h`hahahbhbhcjPhdjhejhfhfhgjhhhhhijahjj QhkjhljOhmj5hnj#hojhpjIhqjHhrjhsjNhtjhuhhvjhwjhxj^hyj>hzj[h{j.%h|h|h}h}h~jNhjhjhjhjhjhjM,hhhhhhhhhhhj<hjhj#6hj$hjhhhhhjmh)r?m}r@m(hUh}rAm(h]h]h]h]h]uhj;mh]rBmhX4Hyperlink target "step-Mercurial" is not referenced.rCmrDm}rEm(hUhj?mubahhubahjkubh)rFm}rGm(hUh}rHm(h]UlevelKh]h]Usourcehh]h]UlineM1Utypejkuh]rImh)rJm}rKm(hUh}rLm(h]h]h]h]h]uhjFmh]rMmhX4Hyperlink target "step-mercurial" is not referenced.rNmrOm}rPm(hUhjJmubahhubahjkubh)rQm}rRm(hUh}rSm(h]UlevelKh]h]Usourcehh]h]UlineMnUtypejkuh]rTmh)rUm}rVm(hUh}rWm(h]h]h]h]h]uhjQmh]rXmhX.Hyperlink target "step-Git" is not referenced.rYmrZm}r[m(hUhjUmubahhubahjkubh)r\m}r]m(hUh}r^m(h]UlevelKh]h]Usourcehh]h]UlineMoUtypejkuh]r_mh)r`m}ram(hUh}rbm(h]h]h]h]h]uhj\mh]rcmhX.Hyperlink target "step-git" is not referenced.rdmrem}rfm(hUhj`mubahhubahjkubh)rgm}rhm(hUh}rim(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rjmh)rkm}rlm(hUh}rmm(h]h]h]h]h]uhjgmh]rnmhX.Hyperlink target "step-SVN" is not referenced.romrpm}rqm(hUhjkmubahhubahjkubh)rrm}rsm(hUh}rtm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rumh)rvm}rwm(hUh}rxm(h]h]h]h]h]uhjrmh]rymhX.Hyperlink target "step-svn" is not referenced.rzmr{m}r|m(hUhjvmubahhubahjkubh)r}m}r~m(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMoUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhj}mh]rmhX.Hyperlink target "step-CVS" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMpUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX.Hyperlink target "step-cvs" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX.Hyperlink target "step-Bzr" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX.Hyperlink target "step-bzr" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX-Hyperlink target "step-P4" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMeUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX.Hyperlink target "index-13" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMgUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX/Hyperlink target "step-Repo" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX1Hyperlink target "step-Gerrit" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX1Hyperlink target "step-gerrit" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX0Hyperlink target "step-Darcs" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX0Hyperlink target "step-darcs" is not referenced.rmrm}rm(hUhjmubahhubahjkubh)rm}rm(hUh}rm(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rmh)rm}rm(hUh}rm(h]h]h]h]h]uhjmh]rmhX3Hyperlink target "step-Monotone" is not referenced.rmrm}rn(hUhjmubahhubahjkubh)rn}rn(hUh}rn(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rnh)rn}rn(hUh}rn(h]h]h]h]h]uhjnh]rnhX3Hyperlink target "step-monotone" is not referenced.r nr n}r n(hUhjnubahhubahjkubh)r n}r n(hUh}rn(h]UlevelKh]h]Usourcehh]h]UlineMaUtypejkuh]rnh)rn}rn(hUh}rn(h]h]h]h]h]uhj nh]rnhX@Hyperlink target "source-checkout-slave-side" is not referenced.rnrn}rn(hUhjnubahhubahjkubh)rn}rn(hUh}rn(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rnh)rn}rn(hUh}rn(h]h]h]h]h]uhjnh]rnhX;Hyperlink target "step-CVS (Slave-Side)" is not referenced.rnr n}r!n(hUhjnubahhubahjkubh)r"n}r#n(hUh}r$n(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]r%nh)r&n}r'n(hUh}r(n(h]h]h]h]h]uhj"nh]r)nhX9Hyperlink target "step-cvs-slave-side" is not referenced.r*nr+n}r,n(hUhj&nubahhubahjkubh)r-n}r.n(hUh}r/n(h]UlevelKh]h]Usourcehh]h]UlineM(Utypejkuh]r0nh)r1n}r2n(hUh}r3n(h]h]h]h]h]uhj-nh]r4nhX;Hyperlink target "step-SVN (Slave-Side)" is not referenced.r5nr6n}r7n(hUhj1nubahhubahjkubh)r8n}r9n(hUh}r:n(h]UlevelKh]h]Usourcehh]h]UlineM)Utypejkuh]r;nh)rn(h]h]h]h]h]uhj8nh]r?nhX9Hyperlink target "step-svn-slave-side" is not referenced.r@nrAn}rBn(hUhjo}r?o(hUhj9oubahhubahjkubh)r@o}rAo(hUh}rBo(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rCoh)rDo}rEo(hUh}rFo(h]h]h]h]h]uhj@oh]rGohX/Hyperlink target "step-VC10" is not referenced.rHorIo}rJo(hUhjDoubahhubahjkubh)rKo}rLo(hUh}rMo(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rNoh)rOo}rPo(hUh}rQo(h]h]h]h]h]uhjKoh]rRohX/Hyperlink target "step-VC11" is not referenced.rSorTo}rUo(hUhjOoubahhubahjkubh)rVo}rWo(hUh}rXo(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rYoh)rZo}r[o(hUh}r\o(h]h]h]h]h]uhjVoh]r]ohX/Hyperlink target "step-VC12" is not referenced.r^or_o}r`o(hUhjZoubahhubahjkubh)rao}rbo(hUh}rco(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rdoh)reo}rfo(hUh}rgo(h]h]h]h]h]uhjaoh]rhohX1Hyperlink target "step-VS2003" is not referenced.riorjo}rko(hUhjeoubahhubahjkubh)rlo}rmo(hUh}rno(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rooh)rpo}rqo(hUh}rro(h]h]h]h]h]uhjloh]rsohX1Hyperlink target "step-VS2005" is not referenced.rtoruo}rvo(hUhjpoubahhubahjkubh)rwo}rxo(hUh}ryo(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rzoh)r{o}r|o(hUh}r}o(h]h]h]h]h]uhjwoh]r~ohX1Hyperlink target "step-VS2008" is not referenced.roro}ro(hUhj{oubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX1Hyperlink target "step-VS2010" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX1Hyperlink target "step-VS2012" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX1Hyperlink target "step-VS2013" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX5Hyperlink target "step-VCExpress9" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX3Hyperlink target "step-MsBuild4" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX4Hyperlink target "step-MsBuild12" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMSUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX.Hyperlink target "index-22" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMSUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX.Hyperlink target "index-23" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMSUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX.Hyperlink target "index-24" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMZUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX.Hyperlink target "index-25" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}ro(hUh}ro(h]h]h]h]h]uhjoh]rohX3Hyperlink target "step-Robocopy" is not referenced.roro}ro(hUhjoubahhubahjkubh)ro}ro(hUh}ro(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]roh)ro}rp(hUh}rp(h]h]h]h]h]uhjoh]rphX/Hyperlink target "step-Test" is not referenced.rprp}rp(hUhjoubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]r ph)r p}r p(hUh}r p(h]h]h]h]h]uhjph]r phX3Hyperlink target "step-TreeSize" is not referenced.rprp}rp(hUhj pubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX.Hyperlink target "index-26" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineMUtypejkuh]rph)r p}r!p(hUh}r"p(h]h]h]h]h]uhjph]r#phX9Hyperlink target "step-PerlModuleTest" is not referenced.r$pr%p}r&p(hUhj pubahhubahjkubh)r'p}r(p(hUh}r)p(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]r*ph)r+p}r,p(hUh}r-p(h]h]h]h]h]uhj'ph]r.phX.Hyperlink target "step-MTR" is not referenced.r/pr0p}r1p(hUhj+pubahhubahjkubh)r2p}r3p(hUh}r4p(h]UlevelKh]h]Usourcehh]h]UlineMU Utypejkuh]r5ph)r6p}r7p(hUh}r8p(h]h]h]h]h]uhj2ph]r9phX>Hyperlink target "step-SubunitShellCommand" is not referenced.r:pr;p}rp(hUh}r?p(h]UlevelKh]h]Usourcehh]h]UlineMV Utypejkuh]r@ph)rAp}rBp(hUh}rCp(h]h]h]h]h]uhj=ph]rDphX>Hyperlink target "step-subunitshellcommand" is not referenced.rEprFp}rGp(hUhjApubahhubahjkubh)rHp}rIp(hUh}rJp(h]UlevelKh]h]Usourcehh]h]UlineMi Utypejkuh]rKph)rLp}rMp(hUh}rNp(h]h]h]h]h]uhjHph]rOphX<Hyperlink target "slave-filesystem-steps" is not referenced.rPprQp}rRp(hUhjLpubahhubahjkubh)rSp}rTp(hUh}rUp(h]UlevelKh]h]Usourcehh]h]UlineMq Utypejkuh]rVph)rWp}rXp(hUh}rYp(h]h]h]h]h]uhjSph]rZphX5Hyperlink target "step-FileExists" is not referenced.r[pr\p}r]p(hUhjWpubahhubahjkubh)r^p}r_p(hUh}r`p(h]UlevelKh]h]Usourcehh]h]UlineM~ Utypejkuh]raph)rbp}rcp(hUh}rdp(h]h]h]h]h]uhj^ph]rephX8Hyperlink target "step-CopyDirectory" is not referenced.rfprgp}rhp(hUhjbpubahhubahjkubh)rip}rjp(hUh}rkp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rlph)rmp}rnp(hUh}rop(h]h]h]h]h]uhjiph]rpphX:Hyperlink target "step-RemoveDirectory" is not referenced.rqprrp}rsp(hUhjmpubahhubahjkubh)rtp}rup(hUh}rvp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rwph)rxp}ryp(hUh}rzp(h]h]h]h]h]uhjtph]r{phX8Hyperlink target "step-MakeDirectory" is not referenced.r|pr}p}r~p(hUhjxpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX7Hyperlink target "python-buildsteps" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX6Hyperlink target "step-BuildEPYDoc" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX6Hyperlink target "step-buildepydoc" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX3Hyperlink target "step-PyFlakes" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX2Hyperlink target "step-pyflake" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX1Hyperlink target "step-Sphinx" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX1Hyperlink target "step-sphinx" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM& Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX1Hyperlink target "step-PyLint" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM' Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX1Hyperlink target "step-pylint" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM5 Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX0Hyperlink target "step-Trial" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineM6 Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX0Hyperlink target "step-trial" is not referenced.rprp}rp(hUhjpubahhubahjkubh)rp}rp(hUh}rp(h]UlevelKh]h]Usourcehh]h]UlineMS Utypejkuh]rph)rp}rp(hUh}rp(h]h]h]h]h]uhjph]rphX.Hyperlink target "index-27" is not referenced.rqrq}rq(hUhjpubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}r q(h]h]h]h]h]uhjqh]r qhX5Hyperlink target "step-RemovePYCs" is not referenced.r qr q}r q(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX.Hyperlink target "index-28" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]r qhX5Hyperlink target "step-FileUpload" is not referenced.r!qr"q}r#q(hUhjqubahhubahjkubh)r$q}r%q(hUh}r&q(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]r'qh)r(q}r)q(hUh}r*q(h]h]h]h]h]uhj$qh]r+qhX7Hyperlink target "step-FileDownload" is not referenced.r,qr-q}r.q(hUhj(qubahhubahjkubh)r/q}r0q(hUh}r1q(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]r2qh)r3q}r4q(hUh}r5q(h]h]h]h]h]uhj/qh]r6qhX:Hyperlink target "step-DirectoryUpload" is not referenced.r7qr8q}r9q(hUhj3qubahhubahjkubh)r:q}r;q(hUh}rq}r?q(hUh}r@q(h]h]h]h]h]uhj:qh]rAqhX=Hyperlink target "step-MultipleFileUpload" is not referenced.rBqrCq}rDq(hUhj>qubahhubahjkubh)rEq}rFq(hUh}rGq(h]UlevelKh]h]Usourcehh]h]UlineMZ Utypejkuh]rHqh)rIq}rJq(hUh}rKq(h]h]h]h]h]uhjEqh]rLqhX9Hyperlink target "step-StringDownload" is not referenced.rMqrNq}rOq(hUhjIqubahhubahjkubh)rPq}rQq(hUh}rRq(h]UlevelKh]h]Usourcehh]h]UlineM[ Utypejkuh]rSqh)rTq}rUq(hUh}rVq(h]h]h]h]h]uhjPqh]rWqhX=Hyperlink target "step-JSONStringDownload" is not referenced.rXqrYq}rZq(hUhjTqubahhubahjkubh)r[q}r\q(hUh}r]q(h]UlevelKh]h]Usourcehh]h]UlineM] Utypejkuh]r^qh)r_q}r`q(hUh}raq(h]h]h]h]h]uhj[qh]rbqhXAHyperlink target "step-JSONPropertiesDownload" is not referenced.rcqrdq}req(hUhj_qubahhubahjkubh)rfq}rgq(hUh}rhq(h]UlevelKh]h]Usourcehh]h]UlineMx Utypejkuh]riqh)rjq}rkq(hUh}rlq(h]h]h]h]h]uhjfqh]rmqhX.Hyperlink target "index-29" is not referenced.rnqroq}rpq(hUhjjqubahhubahjkubh)rqq}rrq(hUh}rsq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rtqh)ruq}rvq(hUh}rwq(h]h]h]h]h]uhjqqh]rxqhX=Hyperlink target "step-MasterShellCommand" is not referenced.ryqrzq}r{q(hUhjuqubahhubahjkubh)r|q}r}q(hUh}r~q(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhj|qh]rqhX.Hyperlink target "index-30" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX8Hyperlink target "step-LogRenderable" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX.Hyperlink target "index-31" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX8Hyperlink target "setting-properties" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX6Hyperlink target "step-SetProperty" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX6Hyperlink target "step-setproperty" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhXAHyperlink target "step-SetPropertyFromCommand" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX?Hyperlink target "step-SetPropertiesFromEnv" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX.Hyperlink target "index-32" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM% Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX=Hyperlink target "setting-buildslave-info" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM. Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX7Hyperlink target "step-SetSlaveInfo" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rq}rq(hUh}rq(h]UlevelKh]h]Usourcehh]h]UlineM/ Utypejkuh]rqh)rq}rq(hUh}rq(h]h]h]h]h]uhjqh]rqhX7Hyperlink target "step-setslaveinfo" is not referenced.rqrq}rq(hUhjqubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMH Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX.Hyperlink target "index-33" is not referenced.rrr r}r r(hUhjrubahhubahjkubh)r r}r r(hUh}r r(h]UlevelKh]h]Usourcehh]h]UlineMJ Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhj rh]rrhX2Hyperlink target "step-Trigger" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMK Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX;Hyperlink target "triggering-schedulers" is not referenced.rrrr}r r(hUhjrubahhubahjkubh)r!r}r"r(hUh}r#r(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]r$rh)r%r}r&r(hUh}r'r(h]h]h]h]h]uhj!rh]r(rhX3Hyperlink target "step-RpmBuild" is not referenced.r)rr*r}r+r(hUhj%rubahhubahjkubh)r,r}r-r(hUh}r.r(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]r/rh)r0r}r1r(hUh}r2r(h]h]h]h]h]uhj,rh]r3rhX2Hyperlink target "step-RpmLint" is not referenced.r4rr5r}r6r(hUhj0rubahhubahjkubh)r7r}r8r(hUh}r9r(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]r:rh)r;r}rrhX8Hyperlink target "step-MockBuildSRPM" is not referenced.r?rr@r}rAr(hUhj;rubahhubahjkubh)rBr}rCr(hUh}rDr(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rErh)rFr}rGr(hUh}rHr(h]h]h]h]h]uhjBrh]rIrhX6Hyperlink target "step-MockRebuild" is not referenced.rJrrKr}rLr(hUhjFrubahhubahjkubh)rMr}rNr(hUh}rOr(h]UlevelKh]h]Usourcehh]h]UlineM Utypejkuh]rPrh)rQr}rRr(hUh}rSr(h]h]h]h]h]uhjMrh]rTrhX6Hyperlink target "step-DebPbuilder" is not referenced.rUrrVr}rWr(hUhjQrubahhubahjkubh)rXr}rYr(hUh}rZr(h]UlevelKh]h]Usourcehh]h]UlineM) Utypejkuh]r[rh)r\r}r]r(hUh}r^r(h]h]h]h]h]uhjXrh]r_rhX8Hyperlink target "step-DebCowbuilder" is not referenced.r`rrar}rbr(hUhj\rubahhubahjkubh)rcr}rdr(hUh}rer(h]UlevelKh]h]Usourcehh]h]UlineM1 Utypejkuh]rfrh)rgr}rhr(hUh}rir(h]h]h]h]h]uhjcrh]rjrhX5Hyperlink target "step-DebLintian" is not referenced.rkrrlr}rmr(hUhjgrubahhubahjkubh)rnr}ror(hUh}rpr(h]UlevelKh]h]Usourcehh]h]UlineMC Utypejkuh]rqrh)rrr}rsr(hUh}rtr(h]h]h]h]h]uhjnrh]rurhX0Hyperlink target "step-HLint" is not referenced.rvrrwr}rxr(hUhjrrubahhubahjkubh)ryr}rzr(hUh}r{r(h]UlevelKh]h]Usourcehh]h]UlineMY Utypejkuh]r|rh)r}r}r~r(hUh}rr(h]h]h]h]h]uhjyrh]rrhX/Hyperlink target "step-MaxQ" is not referenced.rrrr}rr(hUhj}rubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMe Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX.Hyperlink target "index-34" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMf Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX3Hyperlink target "step-HTTPStep" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMg Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX/Hyperlink target "step-POST" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMh Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX.Hyperlink target "step-GET" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMi Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX.Hyperlink target "step-PUT" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMj Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX1Hyperlink target "step-DELETE" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMk Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX/Hyperlink target "step-HEAD" is not referenced.rrrr}rr(hUhjrubahhubahjkubh)rr}rr(hUh}rr(h]UlevelKh]h]Usourcehh]h]UlineMm Utypejkuh]rrh)rr}rr(hUh}rr(h]h]h]h]h]uhjrh]rrhX2Hyperlink target "step-OPTIONS" is not referenced.rrrr}rr(hUhjrubahhubahjkubeUreporterrrNUid_startrrKeU autofootnotesrr]rrU citation_refsrr}rrUindirect_targetsrr]rrUsettingsrr(cdocutils.frontend Values rrorr}rr(Ufootnote_backlinksrrKUrecord_dependenciesrrNU rfc_base_urlrrUhttp://tools.ietf.org/html/rrU tracebackrrUpep_referencesrrNUstrip_commentsrrNU toc_backlinksrrUentryrrU language_coderrUenrrU datestamprrNU report_levelrrKU _destinationrrNU halt_levelrrKU strip_classesrrNhNUerror_encoding_error_handlerrrUbackslashreplacerrUdebugrrNUembed_stylesheetrrUoutput_encoding_error_handlerrrUstrictrrU sectnum_xformrrKUdump_transformsrrNU docinfo_xformrsKUwarning_streamrsNUpep_file_url_templatersUpep-%04drsUexit_status_levelrsKUconfigrsNUstrict_visitorrsNUcloak_email_addressesrsUtrim_footnote_reference_spacersUenvr sNUdump_pseudo_xmlr sNUexpose_internalsr sNUsectsubtitle_xformr sU source_linkr sNUrfc_referencesrsNUoutput_encodingrsUutf-8rsU source_urlrsNUinput_encodingrsU utf-8-sigrsU_disable_configrsNU id_prefixrsUU tab_widthrsKUerror_encodingrsUUTF-8rsU_sourcersUV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-buildsteps.rstrsUgettext_compactrsU generatorrsNUdump_internalsrsNU smart_quotesrsU pep_base_urlrsUhttp://www.python.org/dev/peps/r sUsyntax_highlightr!sUlongr"sUinput_encoding_error_handlerr#sjrUauto_id_prefixr$sUidr%sUdoctitle_xformr&sUstrip_elements_with_classesr'sNU _config_filesr(s]Ufile_insertion_enabledr)sU raw_enabledr*sKU dump_settingsr+sNubUsymbol_footnote_startr,sKUidsr-s}r.s(jj jjjLjLjjjjjjjjjjjxjtjejaj6jxLj#jKjjjb8jh8jjfhjh#jh$jOjrLjxLh&j]jAjAjjEjAjAjj jAjAj"jWjj0Hh.jnhjXjoSjuSjWjWjh;jk;j;j;j ;j#;j>;jA;j5j5j8j8j j jEjEj j% jz j j\j \h?jpZjj6jD,jO,jtjAhJjjjQjsjMjbjbjpgjsgj_j[j*Hj0HjjSjjPjjehYj5Kj]j]haj"jJijFij<jbh/jSj #jm j#jh jjhfj j jAjAh|j;Nh}j\juHj{Hjjr2jHjXZj>j>jj]jjgjNjNj9gjj6jNj>jYjYjjfj;j7jNjJjjj(j$jjjjjjjjjjjjhjjGjGj9j9jj jKjKjjdj[j \jj jOj:cj5jYjDgjGgjjj jjh0j^jj^j[j[j[jD^jG^j^j^j/gj1gjLAjOAjWAjZAj6Aj9AjAAjDAjjKjjr j /j/jNj Nh4jEhjTh2j+Yjl2jr2jKjKjgh)r/s}r0s(hUhhhhhhh}r1s(h]h]r2sjgah]Uismodh]h]uhKhhh]ubjbAjeAjmAjpAjxAj{Aj QjQjjjjj;j7jj jaj]jtjpjjjjjjjjjjo^j6j6jHjDj5j1jrjnj[jWjjjjj"jjj jgjgjjjjjj jOgjRgjNjJjPjPjx jr jMjMjejeh`j"j*j*jj| jj jajz?jj`j)jbjjUjAjAjNjNjjGjj{HjZgj]gj.%jc j j| jLjMjNj NjjjKjKjjjjjj5jsjojjjjjjj#jj:j6jMjIj^j^j#6j6hj>jj Nj;j_9j YjYjjj}jyjiNjeNjLjLj[j[jDjADhbjj$j9jDjDjrj[jAjAj#j#j%j%jjj) j% jjjjjihj~hjfjfhhjFjFhEjVj*j*hIjv9j\jLj0j%0jdjdhhj(j$jjjjjjjjjqjmjjjjjjjjjj jX'j^ j*j*j&4j,4jE/jA/jX0jT0j2j2j`j\j6j6jEjEjKjKjjh8jbfjhfjKjKjfj*j4cj:cjOj^ jyjO,jIjLjSjjjjVjVjj%0jSjSjjGj] hhjH%j1j1j{gjgjcjcjj hj"\jjNjAjAj^j^uUsubstitution_namesr3s}r4shhh}r5s(h]h]h]Usourcehh]h]uU footnotesr6s]r7sUrefidsr8s}r9s(j'%]r:sj*%aj\]r;sj\ajL]rsjNajf]r?sjfajz ]r@sj| aj]rAsj^aj]rBsj aj#]rCsj#ajb8]rDsje8aj`]rEsj`aj]rFsjKaj\]rGsj\ajf]rHsjfajQ]rIsjQajrL]rJsjuLajN]rKsjNaj /]rLsj/aj Z]rMsjZaj?]rNsj?ajG]rOsjGajt?]rPsjw?aj'#]rQsjp ajl2]rRsjo2aj] ]rSsjZ ajG]rTsjGajK]rUsjKajr]rVsj[ajoS]rWsjrSajW]rXsjWaj ]rYsj aj5]rZsj5aj8]r[sj8aj ]r\sj ajE]r]sjEaj ]r^sj" ajc]r_sjfaj ]r`sj aj= ]rasj? aj ]rbsj aj ]rcsj aj]rdsjaj]resjajQ ]rfsjS aj ]rgsj aj ]rhsj aj ]risj ajD,]rjsjG,aj*]rksj*aj]rlsjaj]rmsjl^aj6]rnsj6aj\]rosjLaj[]rpsj[aj4c]rqsj7caj Y]rrsjYaj]rssjajb]rtsjbaj0]rusj"0ajd]rvsjdaj*H]rwsj-HajP]rxsjPajx ]rysjz aj&4]rzsj)4ajM]r{sjMaje]r|sjeaj5]r}sj5ajbf]r~sjefajK]rsjKaj*]rsj*ajP]rsjPajRZ]rsjUZaj[]rsj[aj Q]rsj Qaj #]rsj##ajO]rsja aj#]rsjk ajA]rsjAaj]rsj aj ]rsj aj]rsjaj^]rsj^aj.%]rsjf aj ]rsj ajuH]rsjxHajL]rsjLajN]rsjNaj>]rsj>ajK]rsjKajN]rsjNajM,]rsjJ,ajS]rsjSaj^]rsj^aj^]rsj^aj1]rsj1aj{g]rsj~gajc]rsjcaj]rsjaj9]rsj9ajK]rsjKajV]rsjVaj[]rsj\aj]rsj ah]rshauub.PK7D{TB2buildbot-v0.8.9/.doctrees/manual/resources.doctreecdocutils.nodes document q)q}q(U nametypesq}qX resourcesqsUsubstitution_defsq}qUparse_messagesq ]q cdocutils.nodes system_message q )q }q (U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceqcdocutils.nodes reprunicode qXQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/resources.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q)q}q(hX.. _Resources:hhhhUtagnameqUtargetqU attributesq }q!(Uidsq"]Ubackrefsq#]Udupnamesq$]Uclassesq%]Unamesq&]Urefidq'U resourcesq(uUlineq)KUdocumentq*hUchildrenq+]ubshUsectionq,h }q-(h$]q.X resourcesq/ah%]h#]h"]q0(h(Uid1q1eh&]q2hauh)Kh*hUexpect_referenced_by_idq3}q4h(hsh+]q5(cdocutils.nodes title q6)q7}q8(hX Resourcesq9hhhhhUtitleq:h }q;(h$]h%]h#]h"]h&]uh)Kh*hh+]qq?}q@(hh9hh7ubaubcdocutils.nodes paragraph qA)qB}qC(hX/The Buildbot home page is http://buildbot.net/.qDhhhhhU paragraphqEh }qF(h$]h%]h#]h"]h&]uh)Kh*hh+]qG(h=XThe Buildbot home page is qHqI}qJ(hXThe Buildbot home page is hhBubcdocutils.nodes reference qK)qL}qM(hXhttp://buildbot.net/qNh }qO(UrefurihNh"]h#]h$]h%]h&]uhhBh+]qPh=Xhttp://buildbot.net/qQqR}qS(hUhhLubahU referenceqTubh=X.qU}qV(hX.hhBubeubhA)qW}qX(hXFor configuration questions and general discussion, please use the ``buildbot-devel`` mailing list. The subscription instructions and archives are available at http://lists.sourceforge.net/lists/listinfo/buildbot-develhhhhhhEh }qY(h$]h%]h#]h"]h&]uh)Kh*hh+]qZ(h=XCFor configuration questions and general discussion, please use the q[q\}q](hXCFor configuration questions and general discussion, please use the hhWubcdocutils.nodes literal q^)q_}q`(hX``buildbot-devel``h }qa(h$]h%]h#]h"]h&]uhhWh+]qbh=Xbuildbot-develqcqd}qe(hUhh_ubahUliteralqfubh=XK mailing list. The subscription instructions and archives are available at qgqh}qi(hXK mailing list. The subscription instructions and archives are available at hhWubhK)qj}qk(hX:http://lists.sourceforge.net/lists/listinfo/buildbot-develqlh }qm(Urefurihlh"]h#]h$]h%]h&]uhhWh+]qnh=X:http://lists.sourceforge.net/lists/listinfo/buildbot-develqoqp}qq(hUhhjubahhTubeubhA)qr}qs(hXThe ``#buildbot`` channel on Freenode's IRC servers hosts development discussion, and often folks are available to answer questions there, as well.hhhhhhEh }qt(h$]h%]h#]h"]h&]uh)K h*hh+]qu(h=XThe qvqw}qx(hXThe hhrubh^)qy}qz(hX ``#buildbot``h }q{(h$]h%]h#]h"]h&]uhhrh+]q|h=X #buildbotq}q~}q(hUhhyubahhfubh=X channel on Freenode's IRC servers hosts development discussion, and often folks are available to answer questions there, as well.qq}q(hX channel on Freenode's IRC servers hosts development discussion, and often folks are available to answer questions there, as well.hhrubeubeubhhhUsystem_messageqh }q(h$]UlevelKh"]h#]qh1aUsourcehh%]h&]UlineKUtypeUINFOquh)Kh*hh+]qhA)q}q(hUh }q(h$]h%]h#]h"]h&]uhh h+]qh=X,Duplicate implicit target name: "resources".qq}q(hUhhubahhEubaubaUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}qhh(sh+]q(hhehUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh*hU current_lineqNUtransform_messagesq]qh )q}q(hUh }q(h$]UlevelKh"]h#]Usourcehh%]h&]UlineKUtypehuh+]qhA)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh+]qh=X/Hyperlink target "resources" is not referenced.qq}q(hUhhubahhEubahhubaUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh:NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqωUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqۈUtrim_footnote_reference_spaceq܉UenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/resources.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]qUfile_insertion_enabledqU raw_enabledqKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(h(hh1huUsubstitution_namesr}rhh*h }r(h$]h"]h#]Usourcehh%]h&]uU footnotesr]rUrefidsr }r h(]r hasub.PK4Djw888buildbot-v0.8.9/.doctrees/manual/cfg-buildslaves.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xconfiguring your base imageqNXwhen buildslaves go missingqNXcommon optionsqNX$get an account in an openstack cloudq NXec2q Xcreate an imageq NX openstackq X0configure the master with an ec2latentbuildslaveq NUcontentsqNXlatent buildslavesqNXsetting up libvirtqNX6configure the master with an openstacklatentbuildslaveqNXdefining buildslavesqNXwhen-buildslaves-go-missingqXconfiguring your masterqNX5amazon web services elastic compute cloud ("aws ec2")qNXiamqX buildslavesqXmaster-slave tcp keepaliveqNXlibvirtqX'openstack compute administration manualqXbuildslave optionsqNXget an aws ec2 accountqNXdangers with latent buildslavesqNX create an amiqNXec2 getting started guideqXspot instancesq NXlatent-buildslavesq!uUsubstitution_defsq"}q#Uparse_messagesq$]q%(cdocutils.nodes system_message q&)q'}q((U rawsourceq)UUparentq*cdocutils.nodes section q+)q,}q-(h)UU referencedq.Kh*hUsourceq/cdocutils.nodes reprunicode q0XW/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-buildslaves.rstq1q2}q3bUexpect_referenced_by_nameq4}Utagnameq5Usectionq6U attributesq7}q8(Udupnamesq9]q:X buildslavesq;aUclassesq<]Ubackrefsq=]Uidsq>]q?(X cfg-slavesq@Uid1qAeUnamesqB]uUlineqCKUdocumentqDhUexpect_referenced_by_idqE}qFh@cdocutils.nodes target qG)qH}qI(h)Uh*hh/h2h5UtargetqJh7}qK(h>]h=]h9]h<]hB]UrefidqLh@uhCKhDhUchildrenqM]ubshM]qN(cdocutils.nodes title qO)qP}qQ(h)X BuildslavesqRh*h,h/h2h5UtitleqSh7}qT(h9]h<]h=]h>]hB]uhCKhDhhM]qUcdocutils.nodes Text qVX BuildslavesqWqX}qY(h)hRh*hPubaubcdocutils.nodes paragraph qZ)q[}q\(h)XThe :bb:cfg:`slaves` configuration key specifies a list of known buildslaves. In the common case, each buildslave is defined by an instance of the :class:`BuildSlave` class. It represents a standard, manually started machine that will try to connect to the buildbot master as a slave. Buildbot also supports "on-demand", or latent, buildslaves, which allow buildbot to dynamically start and stop buildslave instances.h*h,h/h2h5U paragraphq]h7}q^(h9]h<]h=]h>]hB]uhCK hDhhM]q_(hVXThe q`qa}qb(h)XThe h*h[ubcsphinx.addnodes pending_xref qc)qd}qe(h)X:bb:cfg:`slaves`qfh*h[h/h2h5U pending_xrefqgh7}qh(UreftypeXcfgUrefwarnqiU reftargetqjXslavesU refdomainXbbqkh>]h=]U refexplicith9]h<]hB]UrefdocqlXmanual/cfg-buildslavesqmuhCK hM]qncdocutils.nodes literal qo)qp}qq(h)hfh7}qr(h9]h<]qs(UxrefqthkXbb-cfgqueh=]h>]hB]uh*hdhM]qvhVXslavesqwqx}qy(h)Uh*hpubah5UliteralqzubaubhVX configuration key specifies a list of known buildslaves. In the common case, each buildslave is defined by an instance of the q{q|}q}(h)X configuration key specifies a list of known buildslaves. In the common case, each buildslave is defined by an instance of the h*h[ubhc)q~}q(h)X:class:`BuildSlave`qh*h[h/h2h5hgh7}q(UreftypeXclasshihjX BuildSlaveU refdomainXpyqh>]h=]U refexplicith9]h<]hB]hlhmUpy:classqNU py:moduleqNuhCK hM]qho)q}q(h)hh7}q(h9]h<]q(hthXpy-classqeh=]h>]hB]uh*h~hM]qhVX BuildSlaveqq}q(h)Uh*hubah5hzubaubhVX class. It represents a standard, manually started machine that will try to connect to the buildbot master as a slave. Buildbot also supports "on-demand", or latent, buildslaves, which allow buildbot to dynamically start and stop buildslave instances.qq}q(h)X class. It represents a standard, manually started machine that will try to connect to the buildbot master as a slave. Buildbot also supports "on-demand", or latent, buildslaves, which allow buildbot to dynamically start and stop buildslave instances.h*h[ubeubcdocutils.nodes topic q)q}q(h)Uh*h,h/h2h5Utopicqh7}q(h9]h<]q(UcontentsqUlocalqeh=]h>]qUcontentsqahB]qhauhCKhDhhM]qcdocutils.nodes bullet_list q)q}q(h)Uh*hh/Nh5U bullet_listqh7}q(h9]h<]h=]h>]hB]uhCNhDhhM]q(cdocutils.nodes list_item q)q}q(h)Uh7}q(h9]h<]h=]h>]hB]uh*hhM]qhZ)q}q(h)Uh7}q(h9]h<]h=]h>]hB]uh*hhM]qcdocutils.nodes reference q)q}q(h)Uh7}q(h>]qUid6qah=]h9]h<]hB]UrefidUdefining-buildslavesquh*hhM]qhVXDefining Buildslavesqq}q(h)XDefining Buildslavesqh*hubah5U referencequbah5h]ubah5U list_itemqubh)q}q(h)Uh7}q(h9]h<]h=]h>]hB]uh*hhM]qhZ)q}q(h)Uh7}q(h9]h<]h=]h>]hB]uh*hhM]qh)q}q(h)Uh7}q(h>]qUid7qah=]h9]h<]hB]UrefidUbuildslave-optionsquh*hhM]qhVXBuildSlave Optionsqʅq}q(h)XBuildSlave Optionsqh*hubah5hubah5h]ubah5hubh)q}q(h)Uh7}q(h9]h<]h=]h>]hB]uh*hhM]qhZ)q}q(h)Uh7}q(h9]h<]h=]h>]hB]uh*hhM]qh)q}q(h)Uh7}q(h>]qUid8qah=]h9]h<]hB]UrefidUlatent-buildslavesquh*hhM]qhVXLatent Buildslavesq݅q}q(h)XLatent Buildslavesqh*hubah5hubah5h]ubah5hubeubaubh+)q}q(h)Uh*h,h/h2h5h6h7}q(h9]h<]h=]h>]qhahB]qhauhCKhDhhM]q(hO)q}q(h)hh*hh/h2h5hSh7}q(h>]h=]h9]h<]hB]hLhuhCKhDhhM]qhVXDefining Buildslavesq녁q}q(h)hh*hubaubhZ)q}q(h)XA :class:`BuildSlave` instance is created with a ``slavename`` and a ``slavepassword``. These are the same two values that need to be provided to the buildslave administrator when they create the buildslave.h*hh/h2h5h]h7}q(h9]h<]h=]h>]hB]uhCKhDhhM]q(hVXA qq}q(h)XA h*hubhc)q}q(h)X:class:`BuildSlave`qh*hh/h2h5hgh7}q(UreftypeXclasshihjX BuildSlaveU refdomainXpyqh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCKhM]qho)q}q(h)hh7}q(h9]h<]q(hthXpy-classqeh=]h>]hB]uh*hhM]rhVX BuildSlaverr}r(h)Uh*hubah5hzubaubhVX instance is created with a rr}r(h)X instance is created with a h*hubho)r}r(h)X ``slavename``h7}r (h9]h<]h=]h>]hB]uh*hhM]r hVX slavenamer r }r (h)Uh*jubah5hzubhVX and a rr}r(h)X and a h*hubho)r}r(h)X``slavepassword``h7}r(h9]h<]h=]h>]hB]uh*hhM]rhVX slavepasswordrr}r(h)Uh*jubah5hzubhVXy. These are the same two values that need to be provided to the buildslave administrator when they create the buildslave.rr}r(h)Xy. These are the same two values that need to be provided to the buildslave administrator when they create the buildslave.h*hubeubhZ)r}r(h)XThe slavename must be unique, of course. The password exists to prevent evildoers from interfering with the buildbot by inserting their own (broken) buildslaves into the system and thus displacing the real ones.rh*hh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVXThe slavename must be unique, of course. The password exists to prevent evildoers from interfering with the buildbot by inserting their own (broken) buildslaves into the system and thus displacing the real ones.r r!}r"(h)jh*jubaubhZ)r#}r$(h)XBuildslaves with an unrecognized slavename or a non-matching password will be rejected when they attempt to connect, and a message describing the problem will be written to the log file (see :ref:`Logfiles`).h*hh/h2h5h]h7}r%(h9]h<]h=]h>]hB]uhCK hDhhM]r&(hVXBuildslaves with an unrecognized slavename or a non-matching password will be rejected when they attempt to connect, and a message describing the problem will be written to the log file (see r'r(}r)(h)XBuildslaves with an unrecognized slavename or a non-matching password will be rejected when they attempt to connect, and a message describing the problem will be written to the log file (see h*j#ubhc)r*}r+(h)X:ref:`Logfiles`r,h*j#h/h2h5hgh7}r-(UreftypeXrefhihjXlogfilesU refdomainXstdr.h>]h=]U refexplicith9]h<]hB]hlhmuhCK hM]r/cdocutils.nodes emphasis r0)r1}r2(h)j,h7}r3(h9]h<]r4(htj.Xstd-refr5eh=]h>]hB]uh*j*hM]r6hVXLogfilesr7r8}r9(h)Uh*j1ubah5Uemphasisr:ubaubhVX).r;r<}r=(h)X).h*j#ubeubhZ)r>}r?(h)X0A configuration for two slaves would look like::r@h*hh/h2h5h]h7}rA(h9]h<]h=]h>]hB]uhCK$hDhhM]rBhVX/A configuration for two slaves would look like:rCrD}rE(h)X/A configuration for two slaves would look like:h*j>ubaubcdocutils.nodes literal_block rF)rG}rH(h)Xfrom buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd'), BuildSlave('bot-bsd', 'bsdpasswd'), ]h*hh/h2h5U literal_blockrIh7}rJ(U xml:spacerKUpreserverLh>]h=]h9]h<]hB]uhCK&hDhhM]rMhVXfrom buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd'), BuildSlave('bot-bsd', 'bsdpasswd'), ]rNrO}rP(h)Uh*jGubaubeubh+)rQ}rR(h)Uh*h,h/h2h5h6h7}rS(h9]h<]h=]h>]rThahB]rUhauhCK-hDhhM]rV(hO)rW}rX(h)hh*jQh/h2h5hSh7}rY(h>]h=]h9]h<]hB]hLhuhCK-hDhhM]rZhVXBuildSlave Optionsr[r\}r](h)hh*jWubaubcsphinx.addnodes index r^)r_}r`(h)Uh*jQh/h2h5Uindexrah7}rb(h>]h=]h9]h<]hB]Uentriesrc]rd(UsinglereXProperties; from buildslaveUindex-0rfUtrgaUinlinerhuhCK/hDhhM]ubhG)ri}rj(h)Uh*jQh/h2h5hJh7}rk(h>]h=]h9]h<]hB]hLjfuhCK0hDhhM]ubhZ)rl}rm(h)X:class:`BuildSlave` objects can also be created with an optional ``properties`` argument, a dictionary specifying properties that will be available to any builds performed on this slave. For example::h*jQh/h2h4}h5h]h7}rn(h9]h<]h=]h>]rojfahB]uhCK1hDhhE}rpjfjishM]rq(hc)rr}rs(h)X:class:`BuildSlave`rth*jlh/h2h5hgh7}ru(UreftypeXclasshihjX BuildSlaveU refdomainXpyrvh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCK1hM]rwho)rx}ry(h)jth7}rz(h9]h<]r{(htjvXpy-classr|eh=]h>]hB]uh*jrhM]r}hVX BuildSlaver~r}r(h)Uh*jxubah5hzubaubhVX. objects can also be created with an optional rr}r(h)X. objects can also be created with an optional h*jlubho)r}r(h)X``properties``h7}r(h9]h<]h=]h>]hB]uh*jlhM]rhVX propertiesrr}r(h)Uh*jubah5hzubhVXy argument, a dictionary specifying properties that will be available to any builds performed on this slave. For example:rr}r(h)Xy argument, a dictionary specifying properties that will be available to any builds performed on this slave. For example:h*jlubeubjF)r}r(h)Xpc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', properties={ 'os':'solaris' }), ]h*jQh/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCK5hDhhM]rhVXpc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', properties={ 'os':'solaris' }), ]rr}r(h)Uh*jubaubj^)r}r(h)Uh*jQh/h2h5jah7}r(h>]h=]h9]h<]hB]jc]r(jeX"Build Slaves; limiting concurrencyUindex-1rUtrajhuhCK:hDhhM]ubhG)r}r(h)Uh*jQh/h2h5hJh7}r(h>]h=]h9]h<]hB]hLjuhCK;hDhhM]ubhZ)r}r(h)XThe :class:`BuildSlave` constructor can also take an optional ``max_builds`` parameter to limit the number of builds that it will execute simultaneously::h*jQh/h2h4}h5h]h7}r(h9]h<]h=]h>]rjahB]uhCK]h=]U refexplicith9]h<]hB]hlhmhNhNuhCK]hB]uh*jhM]rhVX BuildSlaverr}r(h)Uh*jubah5hzubaubhVX' constructor can also take an optional rr}r(h)X' constructor can also take an optional h*jubho)r}r(h)X``max_builds``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX max_buildsrr}r(h)Uh*jubah5hzubhVXM parameter to limit the number of builds that it will execute simultaneously:rr}r(h)XM parameter to limit the number of builds that it will execute simultaneously:h*jubeubjF)r}r(h)XLc['slaves'] = [ BuildSlave("bot-linux", "linuxpassword", max_builds=2) ]h*jQh/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCK@hDhhM]rhVXLc['slaves'] = [ BuildSlave("bot-linux", "linuxpassword", max_builds=2) ]rr}r(h)Uh*jubaubh+)r}r(h)Uh*jQh/h2h5h6h7}r(h9]h<]h=]h>]rUmaster-slave-tcp-keepaliverahB]rhauhCKEhDhhM]r(hO)r}r(h)XMaster-Slave TCP Keepaliverh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCKEhDhhM]rhVXMaster-Slave TCP Keepaliverr}r(h)jh*jubaubhZ)r}r(h)XBy default, the buildmaster sends a simple, non-blocking message to each slave every hour. These keepalives ensure that traffic is flowing over the underlying TCP connection, allowing the system's network stack to detect any problems before a build is started.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKGhDhhM]rhVXBy default, the buildmaster sends a simple, non-blocking message to each slave every hour. These keepalives ensure that traffic is flowing over the underlying TCP connection, allowing the system's network stack to detect any problems before a build is started.rr}r(h)jh*jubaubhZ)r}r(h)X}The interval can be modified by specifying the interval in seconds using the ``keepalive_interval`` parameter of BuildSlave::h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKLhDhhM]r(hVXMThe interval can be modified by specifying the interval in seconds using the rr}r(h)XMThe interval can be modified by specifying the interval in seconds using the h*jubho)r}r(h)X``keepalive_interval``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXkeepalive_intervalrr}r(h)Uh*jubah5hzubhVX parameter of BuildSlave:rr}r(h)X parameter of BuildSlave:h*jubeubjF)r}r(h)Xfc['slaves'] = [ BuildSlave('bot-linux', 'linuxpasswd', keepalive_interval=3600), ]h*jh/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCKOhDhhM]rhVXfc['slaves'] = [ BuildSlave('bot-linux', 'linuxpasswd', keepalive_interval=3600), ]rr}r(h)Uh*jubaubhZ)r}r(h)XMThe interval can be set to ``None`` to disable this functionality altogether.h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKThDhhM]r(hVXThe interval can be set to rr}r(h)XThe interval can be set to h*jubho)r}r(h)X``None``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXNonerr}r(h)Uh*jubah5hzubhVX* to disable this functionality altogether.rr}r (h)X* to disable this functionality altogether.h*jubeubhG)r }r (h)X .. _When-Buildslaves-Go-Missing:h*jh/h2h5hJh7}r (h>]h=]h9]h<]hB]hLUwhen-buildslaves-go-missingr uhCKWhDhhM]ubeubh+)r}r(h)Uh*jQh/h2h4}rhj sh5h6h7}r(h9]h<]h=]h>]r(j Uid2rehB]r(hheuhCKZhDhhE}rj j shM]r(hO)r}r(h)XWhen Buildslaves Go Missingrh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCKZhDhhM]rhVXWhen Buildslaves Go Missingrr}r(h)jh*jubaubhZ)r}r (h)XSometimes, the buildslaves go away. One very common reason for this is when the buildslave process is started once (manually) and left running, but then later the machine reboots and the process is not automatically restarted.r!h*jh/h2h5h]h7}r"(h9]h<]h=]h>]hB]uhCK\hDhhM]r#hVXSometimes, the buildslaves go away. One very common reason for this is when the buildslave process is started once (manually) and left running, but then later the machine reboots and the process is not automatically restarted.r$r%}r&(h)j!h*jubaubhZ)r'}r((h)X+If you'd like to have the administrator of the buildslave (or other people) be notified by email when the buildslave has been missing for too long, just add the ``notify_on_missing=`` argument to the :class:`BuildSlave` definition. This value can be a single email address, or a list of addresses::h*jh/h2h5h]h7}r)(h9]h<]h=]h>]hB]uhCKahDhhM]r*(hVXIf you'd like to have the administrator of the buildslave (or other people) be notified by email when the buildslave has been missing for too long, just add the r+r,}r-(h)XIf you'd like to have the administrator of the buildslave (or other people) be notified by email when the buildslave has been missing for too long, just add the h*j'ubho)r.}r/(h)X``notify_on_missing=``h7}r0(h9]h<]h=]h>]hB]uh*j'hM]r1hVXnotify_on_missing=r2r3}r4(h)Uh*j.ubah5hzubhVX argument to the r5r6}r7(h)X argument to the h*j'ubhc)r8}r9(h)X:class:`BuildSlave`r:h*j'h/h2h5hgh7}r;(UreftypeXclasshihjX BuildSlaveU refdomainXpyr<h>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCKahM]r=ho)r>}r?(h)j:h7}r@(h9]h<]rA(htj<Xpy-classrBeh=]h>]hB]uh*j8hM]rChVX BuildSlaverDrE}rF(h)Uh*j>ubah5hzubaubhVXO definition. This value can be a single email address, or a list of addresses:rGrH}rI(h)XO definition. This value can be a single email address, or a list of addresses:h*j'ubeubjF)rJ}rK(h)Xvc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing="bob@example.com"), ]h*jh/h2h5jIh7}rL(jKjLh>]h=]h9]h<]hB]uhCKghDhhM]rMhVXvc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing="bob@example.com"), ]rNrO}rP(h)Uh*jJubaubhZ)rQ}rR(h)XBy default, this will send email when the buildslave has been disconnected for more than one hour. Only one email per connection-loss event will be sent. To change the timeout, use ``missing_timeout=`` and give it a number of seconds (the default is 3600).h*jh/h2h5h]h7}rS(h9]h<]h=]h>]hB]uhCKlhDhhM]rT(hVXBy default, this will send email when the buildslave has been disconnected for more than one hour. Only one email per connection-loss event will be sent. To change the timeout, use rUrV}rW(h)XBy default, this will send email when the buildslave has been disconnected for more than one hour. Only one email per connection-loss event will be sent. To change the timeout, use h*jQubho)rX}rY(h)X``missing_timeout=``h7}rZ(h9]h<]h=]h>]hB]uh*jQhM]r[hVXmissing_timeout=r\r]}r^(h)Uh*jXubah5hzubhVX7 and give it a number of seconds (the default is 3600).r_r`}ra(h)X7 and give it a number of seconds (the default is 3600).h*jQubeubhZ)rb}rc(h)XzYou can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one::h*jh/h2h5h]h7}rd(h9]h<]h=]h>]hB]uhCKrhDhhM]rehVXyYou can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one:rfrg}rh(h)XyYou can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one:h*jbubaubjF)ri}rj(h)Xc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing=["bob@example.com", "alice@example.org"], missing_timeout=300, # notify after 5 minutes ), ]h*jh/h2h5jIh7}rk(jKjLh>]h=]h9]h<]hB]uhCKuhDhhM]rlhVXc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing=["bob@example.com", "alice@example.org"], missing_timeout=300, # notify after 5 minutes ), ]rmrn}ro(h)Uh*jiubaubhZ)rp}rq(h)XThe email sent this way will use a :class:`MailNotifier` (see :bb:status:`MailNotifier`) status target, if one is configured. This provides a way for you to control the *from* address of the email, as well as the relayhost (aka *smarthost*) to use as an SMTP server. If no :class:`MailNotifier` is configured on this buildmaster, the buildslave-missing emails will be sent using a default configuration.h*jh/h2h5h]h7}rr(h9]h<]h=]h>]hB]uhCK}hDhhM]rs(hVX#The email sent this way will use a rtru}rv(h)X#The email sent this way will use a h*jpubhc)rw}rx(h)X:class:`MailNotifier`ryh*jph/h2h5hgh7}rz(UreftypeXclasshihjX MailNotifierU refdomainXpyr{h>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCK}hM]r|ho)r}}r~(h)jyh7}r(h9]h<]r(htj{Xpy-classreh=]h>]hB]uh*jwhM]rhVX MailNotifierrr}r(h)Uh*j}ubah5hzubaubhVX (see rr}r(h)X (see h*jpubhc)r}r(h)X:bb:status:`MailNotifier`rh*jph/h2h5hgh7}r(UreftypeXstatushihjX MailNotifierU refdomainXbbrh>]h=]U refexplicith9]h<]hB]hlhmuhCK}hM]rho)r}r(h)jh7}r(h9]h<]r(htjX bb-statusreh=]h>]hB]uh*jhM]rhVX MailNotifierrr}r(h)Uh*jubah5hzubaubhVXR) status target, if one is configured. This provides a way for you to control the rr}r(h)XR) status target, if one is configured. This provides a way for you to control the h*jpubj0)r}r(h)X*from*h7}r(h9]h<]h=]h>]hB]uh*jphM]rhVXfromrr}r(h)Uh*jubah5j:ubhVX5 address of the email, as well as the relayhost (aka rr}r(h)X5 address of the email, as well as the relayhost (aka h*jpubj0)r}r(h)X *smarthost*h7}r(h9]h<]h=]h>]hB]uh*jphM]rhVX smarthostrr}r(h)Uh*jubah5j:ubhVX") to use as an SMTP server. If no rr}r(h)X") to use as an SMTP server. If no h*jpubhc)r}r(h)X:class:`MailNotifier`rh*jph/h2h5hgh7}r(UreftypeXclasshihjX MailNotifierU refdomainXpyrh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCK}hM]rho)r}r(h)jh7}r(h9]h<]r(htjXpy-classreh=]h>]hB]uh*jhM]rhVX MailNotifierrr}r(h)Uh*jubah5hzubaubhVXm is configured on this buildmaster, the buildslave-missing emails will be sent using a default configuration.rr}r(h)Xm is configured on this buildmaster, the buildslave-missing emails will be sent using a default configuration.h*jpubeubhZ)r}r(h)XNote that if you want to have a :class:`MailNotifier` for buildslave-missing emails but not for regular build emails, just create one with ``builders=[]``, as follows::h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhDhhM]r(hVX Note that if you want to have a rr}r(h)X Note that if you want to have a h*jubhc)r}r(h)X:class:`MailNotifier`rh*jh/h2h5hgh7}r(UreftypeXclasshihjX MailNotifierU refdomainXpyrh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCKhM]rho)r}r(h)jh7}r(h9]h<]r(htjXpy-classreh=]h>]hB]uh*jhM]rhVX MailNotifierrr}r(h)Uh*jubah5hzubaubhVXV for buildslave-missing emails but not for regular build emails, just create one with rr}r(h)XV for buildslave-missing emails but not for regular build emails, just create one with h*jubho)r}r(h)X``builders=[]``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX builders=[]rr}r(h)Uh*jubah5hzubhVX , as follows:rr}r(h)X , as follows:h*jubeubjF)r}r(h)XWfrom buildbot.status import mail m = mail.MailNotifier(fromaddr="buildbot@localhost", builders=[], relayhost="smtp.example.org") c['status'].append(m) from buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing="bob@example.com"), ]h*jh/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCKhDhhM]rhVXWfrom buildbot.status import mail m = mail.MailNotifier(fromaddr="buildbot@localhost", builders=[], relayhost="smtp.example.org") c['status'].append(m) from buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing="bob@example.com"), ]rr}r(h)Uh*jubaubj^)r}r(h)Uh*jh/h2h5jah7}r(h>]h=]h9]h<]hB]jc]r(jeXBuildSlaves; latentUindex-2rUtrajhuhCKhDhhM]ubhG)r}r(h)Uh*jh/h2h5hJh7}r(h>]h=]h9]h<]hB]hLjuhCKhDhhM]ubhG)r}r(h)X.. _Latent-Buildslaves:h*jh/h2h4}h5hJh7}r(h>]h=]h9]h<]hB]hLhuhCKhDhhE}rjjshM]ubeubeubh+)r}r(h)Uh*h,h/h2h4}rh!jsh5h6h7}r(h9]h<]h=]h>]r(hjUid3rehB]r(hh!euhCKhDhhE}r(jjhjuhM]r(hO)r}r(h)hh*jh/h2h5hSh7}r(h>]h=]h9]h<]hB]hLhuhCKhDhhM]rhVXLatent Buildslavesrr}r(h)hh*jubaubhZ)r}r (h)XThe standard buildbot model has slaves started manually. The previous section described how to configure the master for this approach.r h*jh/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCKhDhhM]r hVXThe standard buildbot model has slaves started manually. The previous section described how to configure the master for this approach.r r}r(h)j h*jubaubhZ)r}r(h)XAnother approach is to let the buildbot master start slaves when builds are ready, on-demand. Thanks to services such as Amazon Web Services' Elastic Compute Cloud ("AWS EC2"), this is relatively easy to set up, and can be very useful for some situations.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVXAnother approach is to let the buildbot master start slaves when builds are ready, on-demand. Thanks to services such as Amazon Web Services' Elastic Compute Cloud ("AWS EC2"), this is relatively easy to set up, and can be very useful for some situations.rr}r(h)jh*jubaubhZ)r}r(h)XThe buildslaves that are started on-demand are called "latent" buildslaves. As of this writing, buildbot ships with an abstract base class for building latent buildslaves, and a concrete implementation for AWS EC2 and for libvirt.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVXThe buildslaves that are started on-demand are called "latent" buildslaves. As of this writing, buildbot ships with an abstract base class for building latent buildslaves, and a concrete implementation for AWS EC2 and for libvirt.rr}r(h)jh*jubaubh+)r }r!(h)Uh*jh/h2h5h6h7}r"(h9]h<]h=]h>]r#Ucommon-optionsr$ahB]r%hauhCKhDhhM]r&(hO)r'}r((h)XCommon Optionsr)h*j h/h2h5hSh7}r*(h9]h<]h=]h>]hB]uhCKhDhhM]r+hVXCommon Optionsr,r-}r.(h)j)h*j'ubaubhZ)r/}r0(h)X?The following options are available for all latent buildslaves.r1h*j h/h2h5h]h7}r2(h9]h<]h=]h>]hB]uhCKhDhhM]r3hVX?The following options are available for all latent buildslaves.r4r5}r6(h)j1h*j/ubaubcdocutils.nodes definition_list r7)r8}r9(h)Uh*j h/h2h5Udefinition_listr:h7}r;(h9]h<]h=]h>]hB]uhCNhDhhM]r<cdocutils.nodes definition_list_item r=)r>}r?(h)X,``build_wait_timeout`` This option allows you to specify how long a latent slave should wait after a build for another build before it shuts down. It defaults to 10 minutes. If this is set to 0 then the slave will be shut down immediately. If it is less than 0 it will never automatically shutdown. h*j8h/h2h5Udefinition_list_itemr@h7}rA(h9]h<]h=]h>]hB]uhCKhM]rB(cdocutils.nodes term rC)rD}rE(h)X``build_wait_timeout``rFh*j>h/h2h5UtermrGh7}rH(h9]h<]h=]h>]hB]uhCKhM]rIho)rJ}rK(h)jFh7}rL(h9]h<]h=]h>]hB]uh*jDhM]rMhVXbuild_wait_timeoutrNrO}rP(h)Uh*jJubah5hzubaubcdocutils.nodes definition rQ)rR}rS(h)Uh7}rT(h9]h<]h=]h>]hB]uh*j>hM]rUhZ)rV}rW(h)XThis option allows you to specify how long a latent slave should wait after a build for another build before it shuts down. It defaults to 10 minutes. If this is set to 0 then the slave will be shut down immediately. If it is less than 0 it will never automatically shutdown.rXh*jRh/h2h5h]h7}rY(h9]h<]h=]h>]hB]uhCKhM]rZhVXThis option allows you to specify how long a latent slave should wait after a build for another build before it shuts down. It defaults to 10 minutes. If this is set to 0 then the slave will be shut down immediately. If it is less than 0 it will never automatically shutdown.r[r\}r](h)jXh*jVubaubah5U definitionr^ubeubaubj^)r_}r`(h)Uh*j h/h2h5jah7}ra(h>]h=]h9]h<]hB]jc]rb((jeXAWS EC2Uindex-3rcUtrd(jeXBuildSlaves; AWS EC2jcUtreejhuhCKhDhhM]ubhG)rf}rg(h)Uh*j h/h2h5hJh7}rh(h>]h=]h9]h<]hB]hLjcuhCKhDhhM]ubeubh+)ri}rj(h)Uh*jh/h2h4}h5h6h7}rk(h9]h<]h=]h>]rl(U1amazon-web-services-elastic-compute-cloud-aws-ec2rmjcehB]rnhauhCKhDhhE}rojcjfshM]rp(hO)rq}rr(h)X5Amazon Web Services Elastic Compute Cloud ("AWS EC2")rsh*jih/h2h5hSh7}rt(h9]h<]h=]h>]hB]uhCKhDhhM]ruhVX5Amazon Web Services Elastic Compute Cloud ("AWS EC2")rvrw}rx(h)jsh*jqubaubhZ)ry}rz(h)X`EC2 `_ is a web service that allows you to start virtual machines in an Amazon data center. Please see their website for details, including costs. Using the AWS EC2 latent buildslaves involves getting an EC2 account with AWS and setting up payment; customizing one or more EC2 machine images ("AMIs") on your desired operating system(s) and publishing them (privately if needed); and configuring the buildbot master to know how to start your customized images for "substantiating" your latent slaves.h*jih/h2h5h]h7}r{(h9]h<]h=]h>]hB]uhCKhDhhM]r|(h)r}}r~(h)X#`EC2 `_h7}r(UnameXEC2UrefurirXhttp://aws.amazon.com/ec2/rh>]h=]h9]h<]hB]uh*jyhM]rhVXEC2rr}r(h)Uh*j}ubah5hubhG)r}r(h)X h.Kh*jyh5hJh7}r(Urefurijh>]rUec2rah=]h9]h<]hB]rh auhM]ubhVX is a web service that allows you to start virtual machines in an Amazon data center. Please see their website for details, including costs. Using the AWS EC2 latent buildslaves involves getting an EC2 account with AWS and setting up payment; customizing one or more EC2 machine images ("AMIs") on your desired operating system(s) and publishing them (privately if needed); and configuring the buildbot master to know how to start your customized images for "substantiating" your latent slaves.rr}r(h)X is a web service that allows you to start virtual machines in an Amazon data center. Please see their website for details, including costs. Using the AWS EC2 latent buildslaves involves getting an EC2 account with AWS and setting up payment; customizing one or more EC2 machine images ("AMIs") on your desired operating system(s) and publishing them (privately if needed); and configuring the buildbot master to know how to start your customized images for "substantiating" your latent slaves.h*jyubeubh+)r}r(h)Uh*jih/h2h5h6h7}r(h9]h<]h=]h>]rUget-an-aws-ec2-accountrahB]rhauhCKhDhhM]r(hO)r}r(h)XGet an AWS EC2 Accountrh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVXGet an AWS EC2 Accountrr}r(h)jh*jubaubhZ)r}r(h)XTo start off, to use the AWS EC2 latent buildslave, you need to get an AWS developer account and sign up for EC2. Although Amazon often changes this process, these instructions should help you get started:rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVXTo start off, to use the AWS EC2 latent buildslave, you need to get an AWS developer account and sign up for EC2. Although Amazon often changes this process, these instructions should help you get started:rr}r(h)jh*jubaubcdocutils.nodes block_quote r)r}r(h)Uh*jh/Nh5U block_quoterh7}r(h9]h<]h=]h>]hB]uhCNhDhhM]rcdocutils.nodes enumerated_list r)r}r(h)Uh7}r(UsuffixrU.h>]h=]h9]UprefixrUh<]hB]UenumtyperUarabicruh*jhM]r(h)r}r(h)XLGo to http://aws.amazon.com/ and click to "Sign Up Now" for an AWS account. h7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XKGo to http://aws.amazon.com/ and click to "Sign Up Now" for an AWS account.h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhM]r(hVXGo to rr}r(h)XGo to h*jubh)r}r(h)Xhttp://aws.amazon.com/rh7}r(Urefurijh>]h=]h9]h<]hB]uh*jhM]rhVXhttp://aws.amazon.com/rr}r(h)Uh*jubah5hubhVX/ and click to "Sign Up Now" for an AWS account.rr}r(h)X/ and click to "Sign Up Now" for an AWS account.h*jubeubah5hubh)r}r(h)XOnce you are logged into your account, you need to sign up for EC2. Instructions for how to do this have changed over time because Amazon changes their website, so the best advice is to hunt for it. After signing up for EC2, it may say it wants you to upload an x.509 cert. You will need this to create images (see below) but it is not technically necessary for the buildbot master configuration. h7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XOnce you are logged into your account, you need to sign up for EC2. Instructions for how to do this have changed over time because Amazon changes their website, so the best advice is to hunt for it. After signing up for EC2, it may say it wants you to upload an x.509 cert. You will need this to create images (see below) but it is not technically necessary for the buildbot master configuration.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhM]rhVXOnce you are logged into your account, you need to sign up for EC2. Instructions for how to do this have changed over time because Amazon changes their website, so the best advice is to hunt for it. After signing up for EC2, it may say it wants you to upload an x.509 cert. You will need this to create images (see below) but it is not technically necessary for the buildbot master configuration.rr}r(h)jh*jubaubah5hubh)r}r(h)XgYou must enter a valid credit card before you will be able to use EC2. Do that under 'Payment Method'. h7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XfYou must enter a valid credit card before you will be able to use EC2. Do that under 'Payment Method'.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhM]rhVXfYou must enter a valid credit card before you will be able to use EC2. Do that under 'Payment Method'.rr}r(h)jh*jubaubah5hubh)r}r(h)XoMake sure you're signed up for EC2 by going to 'Your Account'->'Account Activity' and verifying EC2 is listed. h7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XnMake sure you're signed up for EC2 by going to 'Your Account'->'Account Activity' and verifying EC2 is listed.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhM]rhVXnMake sure you're signed up for EC2 by going to 'Your Account'->'Account Activity' and verifying EC2 is listed.rr}r(h)jh*jubaubah5hubeh5Uenumerated_listrubaubeubh+)r}r(h)Uh*jih/h2h5h6h7}r(h9]h<]h=]h>]rU create-an-amirahB]rhauhCKhDhhM]r(hO)r}r(h)X Create an AMIrh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVX Create an AMIrr}r(h)jh*jubaubhZ)r}r(h)XNow you need to create an AMI and configure the master. You may need to run through this cycle a few times to get it working, but these instructions should get you started.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhDhhM]rhVXNow you need to create an AMI and configure the master. You may need to run through this cycle a few times to get it working, but these instructions should get you started.rr}r(h)jh*jubaubhZ)r}r(h)XCreating an AMI is out of the scope of this document. The `EC2 Getting Started Guide `_ is a good resource for this task. Here are a few additional hints.h*jh/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCKhDhhM]r (hVX;Creating an AMI is out of the scope of this document. The r r }r (h)X;Creating an AMI is out of the scope of this document. The h*jubh)r}r(h)Xc`EC2 Getting Started Guide `_h7}r(UnameXEC2 Getting Started GuidejXDhttp://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/rh>]h=]h9]h<]hB]uh*jhM]rhVXEC2 Getting Started Guiderr}r(h)Uh*jubah5hubhG)r}r(h)XG h.Kh*jh5hJh7}r(Urefurijh>]rUec2-getting-started-guiderah=]h9]h<]hB]rhauhM]ubhVXD is a good resource for this task. Here are a few additional hints.rr}r(h)XD is a good resource for this task. Here are a few additional hints.h*jubeubj)r}r (h)Uh*jh/Nh5jh7}r!(h9]h<]h=]h>]hB]uhCNhDhhM]r"h)r#}r$(h)Uh7}r%(Ubulletr&X*h>]h=]h9]h<]hB]uh*jhM]r'(h)r(}r)(h)XWhen an instance of the image starts, it needs to automatically start a buildbot slave that connects to your master (to create a buildbot slave, :ref:`Creating-a-buildslave`; to make a daemon, :ref:`Launching-the-daemons`). h7}r*(h9]h<]h=]h>]hB]uh*j#hM]r+hZ)r,}r-(h)XWhen an instance of the image starts, it needs to automatically start a buildbot slave that connects to your master (to create a buildbot slave, :ref:`Creating-a-buildslave`; to make a daemon, :ref:`Launching-the-daemons`).h*j(h/h2h5h]h7}r.(h9]h<]h=]h>]hB]uhCKhM]r/(hVXWhen an instance of the image starts, it needs to automatically start a buildbot slave that connects to your master (to create a buildbot slave, r0r1}r2(h)XWhen an instance of the image starts, it needs to automatically start a buildbot slave that connects to your master (to create a buildbot slave, h*j,ubhc)r3}r4(h)X:ref:`Creating-a-buildslave`r5h*j,h/h2h5hgh7}r6(UreftypeXrefhihjXcreating-a-buildslaveU refdomainXstdr7h>]h=]U refexplicith9]h<]hB]hlhmuhCKhM]r8j0)r9}r:(h)j5h7}r;(h9]h<]r<(htj7Xstd-refr=eh=]h>]hB]uh*j3hM]r>hVXCreating-a-buildslaver?r@}rA(h)Uh*j9ubah5j:ubaubhVX; to make a daemon, rBrC}rD(h)X; to make a daemon, h*j,ubhc)rE}rF(h)X:ref:`Launching-the-daemons`rGh*j,h/h2h5hgh7}rH(UreftypeXrefhihjXlaunching-the-daemonsU refdomainXstdrIh>]h=]U refexplicith9]h<]hB]hlhmuhCKhM]rJj0)rK}rL(h)jGh7}rM(h9]h<]rN(htjIXstd-refrOeh=]h>]hB]uh*jEhM]rPhVXLaunching-the-daemonsrQrR}rS(h)Uh*jKubah5j:ubaubhVX).rTrU}rV(h)X).h*j,ubeubah5hubh)rW}rX(h)XYou may want to make an instance of the buildbot slave, configure it as a standard buildslave in the master (i.e., not as a latent slave), and test and debug it that way before you turn it into an AMI and convert to a latent slave in the master. h7}rY(h9]h<]h=]h>]hB]uh*j#hM]rZhZ)r[}r\(h)XYou may want to make an instance of the buildbot slave, configure it as a standard buildslave in the master (i.e., not as a latent slave), and test and debug it that way before you turn it into an AMI and convert to a latent slave in the master.r]h*jWh/h2h5h]h7}r^(h9]h<]h=]h>]hB]uhCKhM]r_hVXYou may want to make an instance of the buildbot slave, configure it as a standard buildslave in the master (i.e., not as a latent slave), and test and debug it that way before you turn it into an AMI and convert to a latent slave in the master.r`ra}rb(h)j]h*j[ubaubah5hubeh5hubaubeubh+)rc}rd(h)Uh*jih/h2h5h6h7}re(h9]h<]h=]h>]rfU0configure-the-master-with-an-ec2latentbuildslavergahB]rhh auhCKhDhhM]ri(hO)rj}rk(h)X0Configure the Master with an EC2LatentBuildSlaverlh*jch/h2h5hSh7}rm(h9]h<]h=]h>]hB]uhCKhDhhM]rnhVX0Configure the Master with an EC2LatentBuildSlaverorp}rq(h)jlh*jjubaubhZ)rr}rs(h)XNow let's assume you have an AMI that should work with the EC2LatentBuildSlave. It's now time to set up your buildbot master configuration.rth*jch/h2h5h]h7}ru(h9]h<]h=]h>]hB]uhCKhDhhM]rvhVXNow let's assume you have an AMI that should work with the EC2LatentBuildSlave. It's now time to set up your buildbot master configuration.rwrx}ry(h)jth*jrubaubhZ)rz}r{(h)X0You will need some information from your AWS account: the `Access Key Id` and the `Secret Access Key`. If you've built the AMI yourself, you probably already are familiar with these values. If you have not, and someone has given you access to an AMI, these hints may help you find the necessary values:h*jch/h2h5h]h7}r|(h9]h<]h=]h>]hB]uhCKhDhhM]r}(hVX:You will need some information from your AWS account: the r~r}r(h)X:You will need some information from your AWS account: the h*jzubcdocutils.nodes title_reference r)r}r(h)X`Access Key Id`h7}r(h9]h<]h=]h>]hB]uh*jzhM]rhVX Access Key Idrr}r(h)Uh*jubah5Utitle_referencerubhVX and the rr}r(h)X and the h*jzubj)r}r(h)X`Secret Access Key`h7}r(h9]h<]h=]h>]hB]uh*jzhM]rhVXSecret Access Keyrr}r(h)Uh*jubah5jubhVX. If you've built the AMI yourself, you probably already are familiar with these values. If you have not, and someone has given you access to an AMI, these hints may help you find the necessary values:rr}r(h)X. If you've built the AMI yourself, you probably already are familiar with these values. If you have not, and someone has given you access to an AMI, these hints may help you find the necessary values:h*jzubeubj)r}r(h)Uh*jch/Nh5jh7}r(h9]h<]h=]h>]hB]uhCNhDhhM]rh)r}r(h)Uh7}r(j&X*h>]h=]h9]h<]hB]uh*jhM]r(h)r}r(h)XWhile logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers". h7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XWhile logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers".rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhM]rhVXWhile logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers".rr}r(h)jh*jubaubah5hubh)r}r(h)XOn the page, you'll see alphanumeric values for "Your Access Key Id:" and "Your Secret Access Key:". Make a note of these. Later on, we'll call the first one your ``identifier`` and the second one your ``secret_identifier``\. h7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XOn the page, you'll see alphanumeric values for "Your Access Key Id:" and "Your Secret Access Key:". Make a note of these. Later on, we'll call the first one your ``identifier`` and the second one your ``secret_identifier``\.h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCKhM]r(hVXOn the page, you'll see alphanumeric values for "Your Access Key Id:" and "Your Secret Access Key:". Make a note of these. Later on, we'll call the first one your rr}r(h)XOn the page, you'll see alphanumeric values for "Your Access Key Id:" and "Your Secret Access Key:". Make a note of these. Later on, we'll call the first one your h*jubho)r}r(h)X``identifier``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX identifierrr}r(h)Uh*jubah5hzubhVX and the second one your rr}r(h)X and the second one your h*jubho)r}r(h)X``secret_identifier``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXsecret_identifierrr}r(h)Uh*jubah5hzubhVX.r}r(h)X\.h*jubeubah5hubeh5hubaubhZ)r}r(h)XWhen creating an EC2LatentBuildSlave in the buildbot master configuration, the first three arguments are required. The name and password are the first two arguments, and work the same as with normal buildslaves. The next argument specifies the type of the EC2 virtual machine (available options as of this writing include ``m1.small``, ``m1.large``, ``m1.xlarge``, ``c1.medium``, and ``c1.xlarge``; see the EC2 documentation for descriptions of these machines).h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(hVXDWhen creating an EC2LatentBuildSlave in the buildbot master configuration, the first three arguments are required. The name and password are the first two arguments, and work the same as with normal buildslaves. The next argument specifies the type of the EC2 virtual machine (available options as of this writing include rr}r(h)XDWhen creating an EC2LatentBuildSlave in the buildbot master configuration, the first three arguments are required. The name and password are the first two arguments, and work the same as with normal buildslaves. The next argument specifies the type of the EC2 virtual machine (available options as of this writing include h*jubho)r}r(h)X ``m1.small``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXm1.smallrr}r(h)Uh*jubah5hzubhVX, rr}r(h)X, h*jubho)r}r(h)X ``m1.large``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXm1.largerr}r(h)Uh*jubah5hzubhVX, rr}r(h)X, h*jubho)r}r(h)X ``m1.xlarge``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX m1.xlargerr}r(h)Uh*jubah5hzubhVX, rr}r(h)X, h*jubho)r}r(h)X ``c1.medium``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX c1.mediumrr}r(h)Uh*jubah5hzubhVX, and rr}r(h)X, and h*jubho)r}r(h)X ``c1.xlarge``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX c1.xlargerr}r(h)Uh*jubah5hzubhVX@; see the EC2 documentation for descriptions of these machines).rr}r(h)X@; see the EC2 documentation for descriptions of these machines).h*jubeubhZ)r}r(h)XHere is the simplest example of configuring an EC2 latent buildslave. It specifies all necessary remaining values explicitly in the instantiation. ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXHere is the simplest example of configuring an EC2 latent buildslave. It specifies all necessary remaining values explicitly in the instantiation.rr}r(h)XHere is the simplest example of configuring an EC2 latent buildslave. It specifies all necessary remaining values explicitly in the instantiation.h*jubaubjF)r }r (h)XOfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345', identifier='publickey', secret_identifier='privatekey' )]h*jch/h2h5jIh7}r (jKjLh>]h=]h9]h<]hB]uhCM hDhhM]r hVXOfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345', identifier='publickey', secret_identifier='privatekey' )]r r}r(h)Uh*j ubaubhZ)r}r(h)XThe ``ami`` argument specifies the AMI that the master should start. The ``identifier`` argument specifies the AWS `Access Key Id`, and the ``secret_identifier`` specifies the AWS `Secret Access Key.` Both the AMI and the account information can be specified in alternate ways.h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(hVXThe rr}r(h)XThe h*jubho)r}r(h)X``ami``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXamirr}r(h)Uh*jubah5hzubhVX? argument specifies the AMI that the master should start. The rr}r (h)X? argument specifies the AMI that the master should start. The h*jubho)r!}r"(h)X``identifier``h7}r#(h9]h<]h=]h>]hB]uh*jhM]r$hVX identifierr%r&}r'(h)Uh*j!ubah5hzubhVX argument specifies the AWS r(r)}r*(h)X argument specifies the AWS h*jubj)r+}r,(h)X`Access Key Id`h7}r-(h9]h<]h=]h>]hB]uh*jhM]r.hVX Access Key Idr/r0}r1(h)Uh*j+ubah5jubhVX , and the r2r3}r4(h)X , and the h*jubho)r5}r6(h)X``secret_identifier``h7}r7(h9]h<]h=]h>]hB]uh*jhM]r8hVXsecret_identifierr9r:}r;(h)Uh*j5ubah5hzubhVX specifies the AWS r<r=}r>(h)X specifies the AWS h*jubj)r?}r@(h)X`Secret Access Key.`h7}rA(h9]h<]h=]h>]hB]uh*jhM]rBhVXSecret Access Key.rCrD}rE(h)Uh*j?ubah5jubhVXM Both the AMI and the account information can be specified in alternate ways.rFrG}rH(h)XM Both the AMI and the account information can be specified in alternate ways.h*jubeubcdocutils.nodes note rI)rJ}rK(h)XvWhoever has your ``identifier`` and ``secret_identifier`` values can request AWS work charged to your account, so these values need to be carefully protected. Another way to specify these access keys is to put them in a separate file. You can then make the access privileges stricter for this separate file, and potentially let more people read your main configuration file.h*jch/h2h5UnoterLh7}rM(h9]h<]h=]h>]hB]uhCNhDhhM]rNhZ)rO}rP(h)XvWhoever has your ``identifier`` and ``secret_identifier`` values can request AWS work charged to your account, so these values need to be carefully protected. Another way to specify these access keys is to put them in a separate file. You can then make the access privileges stricter for this separate file, and potentially let more people read your main configuration file.h*jJh/h2h5h]h7}rQ(h9]h<]h=]h>]hB]uhCMhM]rR(hVXWhoever has your rSrT}rU(h)XWhoever has your h*jOubho)rV}rW(h)X``identifier``h7}rX(h9]h<]h=]h>]hB]uh*jOhM]rYhVX identifierrZr[}r\(h)Uh*jVubah5hzubhVX and r]r^}r_(h)X and h*jOubho)r`}ra(h)X``secret_identifier``h7}rb(h9]h<]h=]h>]hB]uh*jOhM]rchVXsecret_identifierrdre}rf(h)Uh*j`ubah5hzubhVX= values can request AWS work charged to your account, so these values need to be carefully protected. Another way to specify these access keys is to put them in a separate file. You can then make the access privileges stricter for this separate file, and potentially let more people read your main configuration file.rgrh}ri(h)X= values can request AWS work charged to your account, so these values need to be carefully protected. Another way to specify these access keys is to put them in a separate file. You can then make the access privileges stricter for this separate file, and potentially let more people read your main configuration file.h*jOubeubaubhZ)rj}rk(h)XMBy default, you can make an :file:`.ec2` directory in the home folder of the user running the buildbot master. In that directory, create a file called :file:`aws_id`. The first line of that file should be your access key id; the second line should be your secret access key id. Then you can instantiate the build slave as follows. ::h*jch/h2h5h]h7}rl(h9]h<]h=]h>]hB]uhCMhDhhM]rm(hVXBy default, you can make an rnro}rp(h)XBy default, you can make an h*jjubho)rq}rr(h)Uh7}rs(h>]h=]h9]h<]rtXfileruaUrolejuhB]uh*jjhM]rvhVX.ec2rwrx}ry(h)X.ec2h*jqubah5hzubhVXo directory in the home folder of the user running the buildbot master. In that directory, create a file called rzr{}r|(h)Xo directory in the home folder of the user running the buildbot master. In that directory, create a file called h*jjubho)r}}r~(h)Uh7}r(h>]h=]h9]h<]rXfileraUrolejhB]uh*jjhM]rhVXaws_idrr}r(h)Xaws_idh*j}ubah5hzubhVX. The first line of that file should be your access key id; the second line should be your secret access key id. Then you can instantiate the build slave as follows.rr}r(h)X. The first line of that file should be your access key id; the second line should be your secret access key id. Then you can instantiate the build slave as follows.h*jjubeubjF)r}r(h)Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345')]h*jch/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCM$hDhhM]rhVXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345')]rr}r(h)Uh*jubaubhZ)r}r(h)XmIf you want to put the key information in another file, use the ``aws_id_file_path`` initialization argument.h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCM(hDhhM]r(hVX@If you want to put the key information in another file, use the rr}r(h)X@If you want to put the key information in another file, use the h*jubho)r}r(h)X``aws_id_file_path``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXaws_id_file_pathrr}r(h)Uh*jubah5hzubhVX initialization argument.rr}r(h)X initialization argument.h*jubeubhZ)r}r(h)XPrevious examples used a particular AMI. If the Buildbot master will be deployed in a process-controlled environment, it may be convenient to specify the AMI more flexibly. Rather than specifying an individual AMI, specify one or two AMI filters.rh*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCM+hDhhM]rhVXPrevious examples used a particular AMI. If the Buildbot master will be deployed in a process-controlled environment, it may be convenient to specify the AMI more flexibly. Rather than specifying an individual AMI, specify one or two AMI filters.rr}r(h)jh*jubaubhZ)r}r(h)XjIn all cases, the AMI that sorts last by its location (the S3 bucket and manifest name) will be preferred.rh*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCM0hDhhM]rhVXjIn all cases, the AMI that sorts last by its location (the S3 bucket and manifest name) will be preferred.rr}r(h)jh*jubaubhZ)r}r(h)XOne available filter is to specify the acceptable AMI owners, by AWS account number (the 12 digit number, usually rendered in AWS with hyphens like "1234-5678-9012", should be entered as in integer). ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCM3hDhhM]rhVXOne available filter is to specify the acceptable AMI owners, by AWS account number (the 12 digit number, usually rendered in AWS with hyphens like "1234-5678-9012", should be entered as in integer).rr}r(h)XOne available filter is to specify the acceptable AMI owners, by AWS account number (the 12 digit number, usually rendered in AWS with hyphens like "1234-5678-9012", should be entered as in integer).h*jubaubjF)r}r(h)Xofrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', valid_ami_owners=[11111111111, 22222222222], identifier='publickey', secret_identifier='privatekey' )h*jch/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCM7hDhhM]rhVXofrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', valid_ami_owners=[11111111111, 22222222222], identifier='publickey', secret_identifier='privatekey' )rr}r(h)Uh*jubaubhZ)r}r(h)XThe other available filter is to provide a regular expression string that will be matched against each AMI's location (the S3 bucket and manifest name). ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCM?hDhhM]rhVXThe other available filter is to provide a regular expression string that will be matched against each AMI's location (the S3 bucket and manifest name).rr}r(h)XThe other available filter is to provide a regular expression string that will be matched against each AMI's location (the S3 bucket and manifest name).h*jubaubjF)r}r(h)Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave( 'bot1', 'sekrit', 'm1.large', valid_ami_location_regex=r'buildbot\-.*/image.manifest.xml', identifier='publickey', secret_identifier='privatekey')h*jch/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCMBhDhhM]rhVXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave( 'bot1', 'sekrit', 'm1.large', valid_ami_location_regex=r'buildbot\-.*/image.manifest.xml', identifier='publickey', secret_identifier='privatekey')rr}r(h)Uh*jubaubhZ)r}r(h)XThe regular expression can specify a group, which will be preferred for the sorting. Only the first group is used; subsequent groups are ignored. ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMHhDhhM]rhVXThe regular expression can specify a group, which will be preferred for the sorting. Only the first group is used; subsequent groups are ignored.rr}r(h)XThe regular expression can specify a group, which will be preferred for the sorting. Only the first group is used; subsequent groups are ignored.h*jubaubjF)r}r(h)Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave( 'bot1', 'sekrit', 'm1.large', valid_ami_location_regex=r'buildbot\-.*\-(.*)/image.manifest.xml', identifier='publickey', secret_identifier='privatekey')h*jch/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCMKhDhhM]rhVXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave( 'bot1', 'sekrit', 'm1.large', valid_ami_location_regex=r'buildbot\-.*\-(.*)/image.manifest.xml', identifier='publickey', secret_identifier='privatekey')rr}r(h)Uh*jubaubhZ)r}r(h)XeIf the group can be cast to an integer, it will be. This allows 10 to sort after 1, for instance. ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMQhDhhM]rhVXbIf the group can be cast to an integer, it will be. This allows 10 to sort after 1, for instance.rr}r(h)XbIf the group can be cast to an integer, it will be. This allows 10 to sort after 1, for instance.h*jubaubjF)r}r(h)Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave( 'bot1', 'sekrit', 'm1.large', valid_ami_location_regex=r'buildbot\-.*\-(\d+)/image.manifest.xml', identifier='publickey', secret_identifier='privatekey')h*jch/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCMThDhhM]rhVXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave( 'bot1', 'sekrit', 'm1.large', valid_ami_location_regex=r'buildbot\-.*\-(\d+)/image.manifest.xml', identifier='publickey', secret_identifier='privatekey')rr}r(h)Uh*jubaubhZ)r}r(h)XuIn addition to using the password as a handshake between the master and the slave, you may want to use a firewall to assert that only machines from a specific IP can connect as slaves. This is possible with AWS EC2 by using the Elastic IP feature. To configure, generate a Elastic IP in AWS, and then specify it in your configuration using the ``elastic_ip`` argument. ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMZhDhhM]r(hVXZIn addition to using the password as a handshake between the master and the slave, you may want to use a firewall to assert that only machines from a specific IP can connect as slaves. This is possible with AWS EC2 by using the Elastic IP feature. To configure, generate a Elastic IP in AWS, and then specify it in your configuration using the rr}r(h)XZIn addition to using the password as a handshake between the master and the slave, you may want to use a firewall to assert that only machines from a specific IP can connect as slaves. This is possible with AWS EC2 by using the Elastic IP feature. To configure, generate a Elastic IP in AWS, and then specify it in your configuration using the h*jubho)r}r(h)X``elastic_ip``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX elastic_iprr}r(h)Uh*jubah5hzubhVX argument.rr}r(h)X argument.h*jubeubjF)r}r(h)Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', 'ami-12345', identifier='publickey', secret_identifier='privatekey', elastic_ip='208.77.188.166' )]h*jch/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCM`hDhhM]rhVXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', 'ami-12345', identifier='publickey', secret_identifier='privatekey', elastic_ip='208.77.188.166' )]rr}r(h)Uh*jubaubhZ)r}r(h)X&One other way to configure a slave is by settings AWS tags. They can for example be used to have a more restrictive security `IAM `_ policy. To get Buildbot to tag the latent slave specify the tag keys and values in your configuration using the ``tags`` argument. ::h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhhDhhM]r(hVX}One other way to configure a slave is by settings AWS tags. They can for example be used to have a more restrictive security rr}r(h)X}One other way to configure a slave is by settings AWS tags. They can for example be used to have a more restrictive security h*jubh)r}r (h)X#`IAM `_h7}r (UnameXIAMjXhttp://aws.amazon.com/iam/r h>]h=]h9]h<]hB]uh*jhM]r hVXIAMr r}r(h)Uh*jubah5hubhG)r}r(h)X h.Kh*jh5hJh7}r(Urefurij h>]rUiamrah=]h9]h<]hB]rhauhM]ubhVXq policy. To get Buildbot to tag the latent slave specify the tag keys and values in your configuration using the rr}r(h)Xq policy. To get Buildbot to tag the latent slave specify the tag keys and values in your configuration using the h*jubho)r}r(h)X``tags``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXtagsrr}r(h)Uh*jubah5hzubhVX argument.r r!}r"(h)X argument.h*jubeubjF)r#}r$(h)Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', 'ami-12345', identifier='publickey', secret_identifier='privatekey', tags={'SomeTag': 'foo'} )]h*jch/h2h5jIh7}r%(jKjLh>]h=]h9]h<]hB]uhCMlhDhhM]r&hVXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', 'ami-12345', identifier='publickey', secret_identifier='privatekey', tags={'SomeTag': 'foo'} )]r'r(}r)(h)Uh*j#ubaubhZ)r*}r+(h)XZThe :class:`EC2LatentBuildSlave` supports all other configuration from the standard :class:`BuildSlave`. The ``missing_timeout`` and ``notify_on_missing`` specify how long to wait for an EC2 instance to attach before considering the attempt to have failed, and email addresses to alert, respectively. ``missing_timeout`` defaults to 20 minutes.h*jch/h2h5h]h7}r,(h9]h<]h=]h>]hB]uhCMthDhhM]r-(hVXThe r.r/}r0(h)XThe h*j*ubhc)r1}r2(h)X:class:`EC2LatentBuildSlave`r3h*j*h/h2h5hgh7}r4(UreftypeXclasshihjXEC2LatentBuildSlaveU refdomainXpyr5h>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCMthM]r6ho)r7}r8(h)j3h7}r9(h9]h<]r:(htj5Xpy-classr;eh=]h>]hB]uh*j1hM]r<hVXEC2LatentBuildSlaver=r>}r?(h)Uh*j7ubah5hzubaubhVX4 supports all other configuration from the standard r@rA}rB(h)X4 supports all other configuration from the standard h*j*ubhc)rC}rD(h)X:class:`BuildSlave`rEh*j*h/h2h5hgh7}rF(UreftypeXclasshihjX BuildSlaveU refdomainXpyrGh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCMthM]rHho)rI}rJ(h)jEh7}rK(h9]h<]rL(htjGXpy-classrMeh=]h>]hB]uh*jChM]rNhVX BuildSlaverOrP}rQ(h)Uh*jIubah5hzubaubhVX. The rRrS}rT(h)X. The h*j*ubho)rU}rV(h)X``missing_timeout``h7}rW(h9]h<]h=]h>]hB]uh*j*hM]rXhVXmissing_timeoutrYrZ}r[(h)Uh*jUubah5hzubhVX and r\r]}r^(h)X and h*j*ubho)r_}r`(h)X``notify_on_missing``h7}ra(h9]h<]h=]h>]hB]uh*j*hM]rbhVXnotify_on_missingrcrd}re(h)Uh*j_ubah5hzubhVX specify how long to wait for an EC2 instance to attach before considering the attempt to have failed, and email addresses to alert, respectively. rfrg}rh(h)X specify how long to wait for an EC2 instance to attach before considering the attempt to have failed, and email addresses to alert, respectively. h*j*ubho)ri}rj(h)X``missing_timeout``h7}rk(h9]h<]h=]h>]hB]uh*j*hM]rlhVXmissing_timeoutrmrn}ro(h)Uh*jiubah5hzubhVX defaults to 20 minutes.rprq}rr(h)X defaults to 20 minutes.h*j*ubeubhZ)rs}rt(h)Xw``volumes`` expects a list of (volume_id, mount_point) tuples to attempt attaching when your instance has been created.h*jch/h2h5h]h7}ru(h9]h<]h=]h>]hB]uhCMzhDhhM]rv(ho)rw}rx(h)X ``volumes``h7}ry(h9]h<]h=]h>]hB]uh*jshM]rzhVXvolumesr{r|}r}(h)Uh*jwubah5hzubhVXl expects a list of (volume_id, mount_point) tuples to attempt attaching when your instance has been created.r~r}r(h)Xl expects a list of (volume_id, mount_point) tuples to attempt attaching when your instance has been created.h*jsubeubhZ)r}r(h)X``keypair_name`` and ``security_name`` allow you to specify different names for these AWS EC2 values. They both default to ``latent_buildbot_slave``.h*jch/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCM}hDhhM]r(ho)r}r(h)X``keypair_name``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX keypair_namerr}r(h)Uh*jubah5hzubhVX and rr}r(h)X and h*jubho)r}r(h)X``security_name``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX security_namerr}r(h)Uh*jubah5hzubhVXV allow you to specify different names for these AWS EC2 values. They both default to rr}r(h)XV allow you to specify different names for these AWS EC2 values. They both default to h*jubho)r}r(h)X``latent_buildbot_slave``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXlatent_buildbot_slaverr}r(h)Uh*jubah5hzubhVX.r}r(h)X.h*jubeubeubh+)r}r(h)Uh*jih/h2h5h6h7}r(h9]h<]h=]h>]rUspot-instancesrahB]rh auhCMhDhhM]r(hO)r}r(h)XSpot instancesrh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXSpot instancesrr}r(h)jh*jubaubhZ)r}r(h)XHIf you would prefer to use spot instances for running your builds, you can accomplish that by passing in a True value to the ``spot_instance`` parameter to the EC2LatentBuildSlave constructor. Additionally, you may want to specify ``max_spot_price`` and ``price_multiplier`` in order to limit your builds' budget consumption. ::h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(hVX}If you would prefer to use spot instances for running your builds, you can accomplish that by passing in a True value to the rr}r(h)X}If you would prefer to use spot instances for running your builds, you can accomplish that by passing in a True value to the h*jubho)r}r(h)X``spot_instance``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX spot_instancerr}r(h)Uh*jubah5hzubhVXY parameter to the EC2LatentBuildSlave constructor. Additionally, you may want to specify rr}r(h)XY parameter to the EC2LatentBuildSlave constructor. Additionally, you may want to specify h*jubho)r}r(h)X``max_spot_price``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXmax_spot_pricerr}r(h)Uh*jubah5hzubhVX and rr}r(h)X and h*jubho)r}r(h)X``price_multiplier``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXprice_multiplierrr}r(h)Uh*jubah5hzubhVX3 in order to limit your builds' budget consumption.rr}r(h)X3 in order to limit your builds' budget consumption.h*jubeubjF)r}r(h)XWfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', 'ami-12345', region='us-west-2', identifier='publickey', secret_identifier='privatekey', elastic_ip='208.77.188.166', placement='b', spot_instance=True, max_spot_price=0.09, price_multiplier=1.15 )]h*jh/h2h5jIh7}r(jKjLh>]h=]h9]h<]hB]uhCMhDhhM]rhVXWfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', 'ami-12345', region='us-west-2', identifier='publickey', secret_identifier='privatekey', elastic_ip='208.77.188.166', placement='b', spot_instance=True, max_spot_price=0.09, price_multiplier=1.15 )]rr}r(h)Uh*jubaubhZ)r}r(h)XThis example would attempt to create a m1.large spot instance in the us-west-2b region costing no more than $0.09/hour. The spot prices for that region in the last 24 hours will be averaged and multiplied by the ``price_multiplier`` parameter, then a spot request will be sent to Amazon with the above details. If the spot request is rejected, an error message will be logged with the final status.h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(hVXThis example would attempt to create a m1.large spot instance in the us-west-2b region costing no more than $0.09/hour. The spot prices for that region in the last 24 hours will be averaged and multiplied by the rr}r(h)XThis example would attempt to create a m1.large spot instance in the us-west-2b region costing no more than $0.09/hour. The spot prices for that region in the last 24 hours will be averaged and multiplied by the h*jubho)r}r(h)X``price_multiplier``h7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXprice_multiplierrr}r(h)Uh*jubah5hzubhVX parameter, then a spot request will be sent to Amazon with the above details. If the spot request is rejected, an error message will be logged with the final status.rr}r(h)X parameter, then a spot request will be sent to Amazon with the above details. If the spot request is rejected, an error message will be logged with the final status.h*jubeubj^)r}r(h)Uh*jh/h2h5jah7}r(h>]h=]h9]h<]hB]jc]r((jeXlibvirtUindex-4rUtr(jeXBuildSlaves; libvirtjUtrejhuhCMhDhhM]ubhG)r}r(h)Uh*jh/h2h5hJh7}r(h>]h=]h9]h<]hB]hLjuhCMhDhhM]ubeubeubh+)r}r(h)Uh.Kh*jh/h2h4}h5h6h7}r(h9]rXlibvirtrah<]h=]h>]r(UlibvirtrjehB]uhCMhDhhE}rjjshM]r(hO)r}r(h)XLibvirtrh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXLibvirtrr}r(h)jh*jubaubhZ)r }r (h)X`libvirt `_ is a virtualization API for interacting with the virtualization capabilities of recent versions of Linux and other OSes. It is LGPL and comes with a stable C API, and Python bindings.h*jh/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r (h)r }r(h)X$`libvirt `_h7}r(UnamejjXhttp://www.libvirt.org/rh>]h=]h9]h<]hB]uh*j hM]rhVXlibvirtrr}r(h)Uh*j ubah5hubhG)r}r(h)X h.Kh*j h5hJh7}r(Urefurijh>]rUid4rah=]h9]h<]hB]rjauhM]ubhVX is a virtualization API for interacting with the virtualization capabilities of recent versions of Linux and other OSes. It is LGPL and comes with a stable C API, and Python bindings.rr}r(h)X is a virtualization API for interacting with the virtualization capabilities of recent versions of Linux and other OSes. It is LGPL and comes with a stable C API, and Python bindings.h*j ubeubhZ)r}r(h)XThis means we know have an API which when tied to buildbot allows us to have slaves that run under Xen, QEMU, KVM, LXC, OpenVZ, User Mode Linux, VirtualBox and VMWare.r h*jh/h2h5h]h7}r!(h9]h<]h=]h>]hB]uhCMhDhhM]r"hVXThis means we know have an API which when tied to buildbot allows us to have slaves that run under Xen, QEMU, KVM, LXC, OpenVZ, User Mode Linux, VirtualBox and VMWare.r#r$}r%(h)j h*jubaubhZ)r&}r'(h)XThe libvirt code in Buildbot was developed against libvirt 0.7.5 on Ubuntu Lucid. It is used with KVM to test Python code on Karmic VM's, but obviously isn't limited to that. Each build is run on a new VM, images are temporary and thrown away after each build.r(h*jh/h2h5h]h7}r)(h9]h<]h=]h>]hB]uhCMhDhhM]r*hVXThe libvirt code in Buildbot was developed against libvirt 0.7.5 on Ubuntu Lucid. It is used with KVM to test Python code on Karmic VM's, but obviously isn't limited to that. Each build is run on a new VM, images are temporary and thrown away after each build.r+r,}r-(h)j(h*j&ubaubh+)r.}r/(h)Uh*jh/h2h5h6h7}r0(h9]h<]h=]h>]r1Usetting-up-libvirtr2ahB]r3hauhCMhDhhM]r4(hO)r5}r6(h)XSetting up libvirtr7h*j.h/h2h5hSh7}r8(h9]h<]h=]h>]hB]uhCMhDhhM]r9hVXSetting up libvirtr:r;}r<(h)j7h*j5ubaubhZ)r=}r>(h)XWe won't show you how to set up libvirt as it is quite different on each platform, but there are a few things you should keep in mind.r?h*j.h/h2h5h]h7}r@(h9]h<]h=]h>]hB]uhCMhDhhM]rAhVXWe won't show you how to set up libvirt as it is quite different on each platform, but there are a few things you should keep in mind.rBrC}rD(h)j?h*j=ubaubj)rE}rF(h)Uh*j.h/Nh5jh7}rG(h9]h<]h=]h>]hB]uhCNhDhhM]rHh)rI}rJ(h)Uh7}rK(j&X*h>]h=]h9]h<]hB]uh*jEhM]rL(h)rM}rN(h)XfIf you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic. h7}rO(h9]h<]h=]h>]hB]uh*jIhM]rPhZ)rQ}rR(h)XeIf you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic.rSh*jMh/h2h5h]h7}rT(h9]h<]h=]h>]hB]uhCMhM]rUhVXeIf you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic.rVrW}rX(h)jSh*jQubaubah5hubh)rY}rZ(h)XfIf you are using the system libvirt, your buildbot master user will need to be in the libvirtd group. h7}r[(h9]h<]h=]h>]hB]uh*jIhM]r\hZ)r]}r^(h)XeIf you are using the system libvirt, your buildbot master user will need to be in the libvirtd group.r_h*jYh/h2h5h]h7}r`(h9]h<]h=]h>]hB]uhCMhM]rahVXeIf you are using the system libvirt, your buildbot master user will need to be in the libvirtd group.rbrc}rd(h)j_h*j]ubaubah5hubh)re}rf(h)XRIf you are using KVM, your buildbot master user will need to be in the KVM group. h7}rg(h9]h<]h=]h>]hB]uh*jIhM]rhhZ)ri}rj(h)XQIf you are using KVM, your buildbot master user will need to be in the KVM group.rkh*jeh/h2h5h]h7}rl(h9]h<]h=]h>]hB]uhCMhM]rmhVXQIf you are using KVM, your buildbot master user will need to be in the KVM group.rnro}rp(h)jkh*jiubaubah5hubh)rq}rr(h)XYou need to think carefully about your virtual network *first*. Will NAT be enough? What IP will my VM's need to connect to for connecting to the master? h7}rs(h9]h<]h=]h>]hB]uh*jIhM]rthZ)ru}rv(h)XYou need to think carefully about your virtual network *first*. Will NAT be enough? What IP will my VM's need to connect to for connecting to the master?h*jqh/h2h5h]h7}rw(h9]h<]h=]h>]hB]uhCMhM]rx(hVX7You need to think carefully about your virtual network ryrz}r{(h)X7You need to think carefully about your virtual network h*juubj0)r|}r}(h)X*first*h7}r~(h9]h<]h=]h>]hB]uh*juhM]rhVXfirstrr}r(h)Uh*j|ubah5j:ubhVX[. Will NAT be enough? What IP will my VM's need to connect to for connecting to the master?rr}r(h)X[. Will NAT be enough? What IP will my VM's need to connect to for connecting to the master?h*juubeubah5hubeh5hubaubeubh+)r}r(h)Uh*jh/h2h5h6h7}r(h9]h<]h=]h>]rUconfiguring-your-base-imagerahB]rhauhCMhDhhM]r(hO)r}r(h)XConfiguring your base imagerh*jh/h2h5hSh7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXConfiguring your base imagerr}r(h)jh*jubaubhZ)r}r(h)XYou need to create a base image for your builds that has everything needed to build your software. You need to configure the base image with a buildbot slave that is configured to connect to the master on boot.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXYou need to create a base image for your builds that has everything needed to build your software. You need to configure the base image with a buildbot slave that is configured to connect to the master on boot.rr}r(h)jh*jubaubhZ)r}r(h)XWBecause this image may need updating a lot, we strongly suggest scripting its creation.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXWBecause this image may need updating a lot, we strongly suggest scripting its creation.rr}r(h)jh*jubaubhZ)r}r(h)X#If you want to have multiple slaves using the same base image it can be annoying to duplicate the image just to change the buildbot credentials. One option is to use libvirt's DHCP server to allocate an identity to the slave: DHCP sets a hostname, and the slave takes its identity from that.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVX#If you want to have multiple slaves using the same base image it can be annoying to duplicate the image just to change the buildbot credentials. One option is to use libvirt's DHCP server to allocate an identity to the slave: DHCP sets a hostname, and the slave takes its identity from that.rr}r(h)jh*jubaubhZ)r}r(h)XDoing all this is really beyond the scope of the manual, but there is a :file:`vmbuilder` script and a :file:`network.xml` file to create such a DHCP server in :file:`contrib/` (:ref:`Contrib-Scripts`) that should get you started:h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(hVXHDoing all this is really beyond the scope of the manual, but there is a rr}r(h)XHDoing all this is really beyond the scope of the manual, but there is a h*jubho)r}r(h)Uh7}r(h>]h=]h9]h<]rXfileraUrolejhB]uh*jhM]rhVX vmbuilderrr}r(h)X vmbuilderh*jubah5hzubhVX script and a rr}r(h)X script and a h*jubho)r}r(h)Uh7}r(h>]h=]h9]h<]rXfileraUrolejhB]uh*jhM]rhVX network.xmlrr}r(h)X network.xmlh*jubah5hzubhVX& file to create such a DHCP server in rr}r(h)X& file to create such a DHCP server in h*jubho)r}r(h)Uh7}r(h>]h=]h9]h<]rXfileraUrolejhB]uh*jhM]rhVXcontrib/rr}r(h)Xcontrib/h*jubah5hzubhVX (rr}r(h)X (h*jubhc)r}r(h)X:ref:`Contrib-Scripts`rh*jh/h2h5hgh7}r(UreftypeXrefhihjXcontrib-scriptsU refdomainXstdrh>]h=]U refexplicith9]h<]hB]hlhmuhCMhM]rj0)r}r(h)jh7}r(h9]h<]r(htjXstd-refreh=]h>]hB]uh*jhM]rhVXContrib-Scriptsrr}r(h)Uh*jubah5j:ubaubhVX) that should get you started:rr}r(h)X) that should get you started:h*jubeubjF)r}r(h)XEsudo apt-get install ubuntu-vm-builder sudo contrib/libvirt/vmbuilderh*jh/h2h5jIh7}r(UlinenosrUlanguagerXbashjKjLh>]h=]h9]h<]hB]uhCMhDhhM]rhVXEsudo apt-get install ubuntu-vm-builder sudo contrib/libvirt/vmbuilderrr}r(h)Uh*jubaubhZ)r}r(h)XDShould create an :file:`ubuntu/` folder with a suitable image in it.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(hVXShould create an rr}r(h)XShould create an h*jubho)r}r(h)Uh7}r(h>]h=]h9]h<]rXfileraUrolejhB]uh*jhM]rhVXubuntu/rr}r(h)Xubuntu/h*jubah5hzubhVX$ folder with a suitable image in it.rr}r(h)X$ folder with a suitable image in it.h*jubeubjF)r}r(h)XMvirsh net-define contrib/libvirt/network.xml virsh net-start buildbot-networkh*jh/h2h5jIh7}r (jjXnonejKjLh>]h=]h9]h<]hB]uhCMhDhhM]r hVXMvirsh net-define contrib/libvirt/network.xml virsh net-start buildbot-networkr r }r (h)Uh*jubaubhZ)r}r(h)XPShould set up a KVM compatible libvirt network for your buildbot VM's to run on.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]rhVXPShould set up a KVM compatible libvirt network for your buildbot VM's to run on.rr}r(h)jh*jubaubeubh+)r}r(h)Uh*jh/h2h5h6h7}r(h9]h<]h=]h>]rUconfiguring-your-masterrahB]rhauhCMhDhhM]r(hO)r}r(h)XConfiguring your Masterrh*jh/h2h5hSh7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r!hVXConfiguring your Masterr"r#}r$(h)jh*jubaubhZ)r%}r&(h)X>If you want to add a simple on demand VM to your setup, you only need the following. We set the username to ``minion1``, the password to ``sekrit``. The base image is called ``base_image`` and a copy of it will be made for the duration of the VM's life. That copy will be thrown away every time a build is complete. ::h*jh/h2h5h]h7}r'(h9]h<]h=]h>]hB]uhCMhDhhM]r((hVXlIf you want to add a simple on demand VM to your setup, you only need the following. We set the username to r)r*}r+(h)XlIf you want to add a simple on demand VM to your setup, you only need the following. We set the username to h*j%ubho)r,}r-(h)X ``minion1``h7}r.(h9]h<]h=]h>]hB]uh*j%hM]r/hVXminion1r0r1}r2(h)Uh*j,ubah5hzubhVX, the password to r3r4}r5(h)X, the password to h*j%ubho)r6}r7(h)X ``sekrit``h7}r8(h9]h<]h=]h>]hB]uh*j%hM]r9hVXsekritr:r;}r<(h)Uh*j6ubah5hzubhVX. The base image is called r=r>}r?(h)X. The base image is called h*j%ubho)r@}rA(h)X``base_image``h7}rB(h9]h<]h=]h>]hB]uh*j%hM]rChVX base_imagerDrE}rF(h)Uh*j@ubah5hzubhVX and a copy of it will be made for the duration of the VM's life. That copy will be thrown away every time a build is complete.rGrH}rI(h)X and a copy of it will be made for the duration of the VM's life. That copy will be thrown away every time a build is complete.h*j%ubeubjF)rJ}rK(h)Xfrom buildbot.buildslave.libvirt import LibVirtSlave, Connection c['slaves'] = [LibVirtSlave('minion1', 'sekrit', Connection("qemu:///session"), '/home/buildbot/images/minion1', '/home/buildbot/images/base_image')]h*jh/h2h5jIh7}rL(jKjLh>]h=]h9]h<]hB]uhCMhDhhM]rMhVXfrom buildbot.buildslave.libvirt import LibVirtSlave, Connection c['slaves'] = [LibVirtSlave('minion1', 'sekrit', Connection("qemu:///session"), '/home/buildbot/images/minion1', '/home/buildbot/images/base_image')]rNrO}rP(h)Uh*jJubaubhZ)rQ}rR(h)XYou can use virt-manager to define ``minion1`` with the correct hardware. If you don't, buildbot won't be able to find a VM to start.h*jh/h2h5h]h7}rS(h9]h<]h=]h>]hB]uhCMhDhhM]rT(hVX#You can use virt-manager to define rUrV}rW(h)X#You can use virt-manager to define h*jQubho)rX}rY(h)X ``minion1``h7}rZ(h9]h<]h=]h>]hB]uh*jQhM]r[hVXminion1r\r]}r^(h)Uh*jXubah5hzubhVXW with the correct hardware. If you don't, buildbot won't be able to find a VM to start.r_r`}ra(h)XW with the correct hardware. If you don't, buildbot won't be able to find a VM to start.h*jQubeubhZ)rb}rc(h)X6:class:`LibVirtSlave` accepts the following arguments:rdh*jh/h2h5h]h7}re(h9]h<]h=]h>]hB]uhCMhDhhM]rf(hc)rg}rh(h)X:class:`LibVirtSlave`rih*jbh/h2h5hgh7}rj(UreftypeXclasshihjX LibVirtSlaveU refdomainXpyrkh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCMhM]rlho)rm}rn(h)jih7}ro(h9]h<]rp(htjkXpy-classrqeh=]h>]hB]uh*jghM]rrhVX LibVirtSlaversrt}ru(h)Uh*jmubah5hzubaubhVX! accepts the following arguments:rvrw}rx(h)X! accepts the following arguments:h*jbubeubj7)ry}rz(h)Uh*jh/h2h5j:h7}r{(h9]h<]h=]h>]hB]uhCNhDhhM]r|(j=)r}}r~(h)XG``name`` Both a buildbot username and the name of the virtual machine. h*jyh/h2h5j@h7}r(h9]h<]h=]h>]hB]uhCMhM]r(jC)r}r(h)X``name``rh*j}h/h2h5jGh7}r(h9]h<]h=]h>]hB]uhCMhM]rho)r}r(h)jh7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXnamerr}r(h)Uh*jubah5hzubaubjQ)r}r(h)Uh7}r(h9]h<]h=]h>]hB]uh*j}hM]rhZ)r}r(h)X=Both a buildbot username and the name of the virtual machine.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhM]rhVX=Both a buildbot username and the name of the virtual machine.rr}r(h)jh*jubaubah5j^ubeubj=)r}r(h)XF``password`` A password for the buildbot to login to the master with. h*jyh/h2h5j@h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(jC)r}r(h)X ``password``rh*jh/h2h5jGh7}r(h9]h<]h=]h>]hB]uhCMhM]rho)r}r(h)jh7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXpasswordrr}r(h)Uh*jubah5hzubaubjQ)r}r(h)Uh7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)X8A password for the buildbot to login to the master with.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhM]rhVX8A password for the buildbot to login to the master with.rr}r(h)jh*jubaubah5j^ubeubj=)r}r(h)XL``connection`` :class:`Connection` instance wrapping connection to libvirt. h*jyh/h2h5j@h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(jC)r}r(h)X``connection``rh*jh/h2h5jGh7}r(h9]h<]h=]h>]hB]uhCMhM]rho)r}r(h)jh7}r(h9]h<]h=]h>]hB]uh*jhM]rhVX connectionrr}r(h)Uh*jubah5hzubaubjQ)r}r(h)Uh7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)X<:class:`Connection` instance wrapping connection to libvirt.h*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhM]r(hc)r}r(h)X:class:`Connection`rh*jh/h2h5hgh7}r(UreftypeXclasshihjX ConnectionU refdomainXpyrh>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCMhM]rho)r}r(h)jh7}r(h9]h<]r(htjXpy-classreh=]h>]hB]uh*jhM]rhVX Connectionrr}r(h)Uh*jubah5hzubaubhVX) instance wrapping connection to libvirt.rr}r(h)X) instance wrapping connection to libvirt.h*jubeubah5j^ubeubj=)r}r(h)XX``hd_image`` The path to a libvirt disk image, normally in qcow2 format when using KVM. h*jyh/h2h5j@h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(jC)r}r(h)X ``hd_image``rh*jh/h2h5jGh7}r(h9]h<]h=]h>]hB]uhCMhM]rho)r}r(h)jh7}r(h9]h<]h=]h>]hB]uh*jhM]rhVXhd_imagerr}r(h)Uh*jubah5hzubaubjQ)r}r(h)Uh7}r(h9]h<]h=]h>]hB]uh*jhM]rhZ)r}r(h)XJThe path to a libvirt disk image, normally in qcow2 format when using KVM.rh*jh/h2h5h]h7}r(h9]h<]h=]h>]hB]uhCMhM]rhVXJThe path to a libvirt disk image, normally in qcow2 format when using KVM.rr}r(h)jh*jubaubah5j^ubeubj=)r}r(h)X``base_image`` If given a base image, buildbot will clone it every time it starts a VM. This means you always have a clean environment to do your build in. h*jyh/h2h5j@h7}r(h9]h<]h=]h>]hB]uhCMhDhhM]r(jC)r}r (h)X``base_image``r h*jh/h2h5jGh7}r (h9]h<]h=]h>]hB]uhCMhM]r ho)r }r (h)j h7}r (h9]h<]h=]h>]hB]uh*jhM]r hVX base_imager r }r (h)Uh*j ubah5hzubaubjQ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*jhM]r hZ)r }r (h)XIf given a base image, buildbot will clone it every time it starts a VM. This means you always have a clean environment to do your build in.r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCMhM]r hVXIf given a base image, buildbot will clone it every time it starts a VM. This means you always have a clean environment to do your build in.r r }r (h)j h*j ubaubah5j^ubeubj=)r }r (h)X``xml`` If a VM isn't predefined in virt-manager, then you can instead provide XML like that used with ``virsh define``. The VM will be created automatically when needed, and destroyed when not needed any longer. h*jyh/h2h5j@h7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r (jC)r }r (h)X``xml``r h*j h/h2h5jGh7}r (h9]h<]h=]h>]hB]uhCMhM]r ho)r }r! (h)j h7}r" (h9]h<]h=]h>]hB]uh*j hM]r# hVXxmlr$ r% }r& (h)Uh*j ubah5hzubaubjQ)r' }r( (h)Uh7}r) (h9]h<]h=]h>]hB]uh*j hM]r* hZ)r+ }r, (h)XIf a VM isn't predefined in virt-manager, then you can instead provide XML like that used with ``virsh define``. The VM will be created automatically when needed, and destroyed when not needed any longer.h*j' h/h2h5h]h7}r- (h9]h<]h=]h>]hB]uhCMhM]r. (hVX_If a VM isn't predefined in virt-manager, then you can instead provide XML like that used with r/ r0 }r1 (h)X_If a VM isn't predefined in virt-manager, then you can instead provide XML like that used with h*j+ ubho)r2 }r3 (h)X``virsh define``h7}r4 (h9]h<]h=]h>]hB]uh*j+ hM]r5 hVX virsh definer6 r7 }r8 (h)Uh*j2 ubah5hzubhVX]. The VM will be created automatically when needed, and destroyed when not needed any longer.r9 r: }r; (h)X]. The VM will be created automatically when needed, and destroyed when not needed any longer.h*j+ ubeubah5j^ubeubeubeubeubh+)r< }r= (h)Uh.Kh*jh/h2h5h6h7}r> (h9]r? X openstackr@ ah<]h=]h>]rA U openstackrB ahB]uhCMhDhhM]rC (hO)rD }rE (h)X OpenStackrF h*j< h/h2h5hSh7}rG (h9]h<]h=]h>]hB]uhCMhDhhM]rH hVX OpenStackrI rJ }rK (h)jF h*jD ubaubhZ)rL }rM (h)X`OpenStack `_ is a series of interconnected components that facilitates managing compute, storage, and network resources in a data center. It is available under the Apache License and has a REST interface along with a Python client.h*j< h/h2h5h]h7}rN (h9]h<]h=]h>]hB]uhCMhDhhM]rO (h)rP }rQ (h)X$`OpenStack `_h7}rR (UnameX OpenStackjXhttp://openstack.org/rS h>]h=]h9]h<]hB]uh*jL hM]rT hVX OpenStackrU rV }rW (h)Uh*jP ubah5hubhG)rX }rY (h)X h.Kh*jL h5hJh7}rZ (UrefurijS h>]r[ Uid5r\ ah=]h9]h<]hB]r] j@ auhM]ubhVX is a series of interconnected components that facilitates managing compute, storage, and network resources in a data center. It is available under the Apache License and has a REST interface along with a Python client.r^ r_ }r` (h)X is a series of interconnected components that facilitates managing compute, storage, and network resources in a data center. It is available under the Apache License and has a REST interface along with a Python client.h*jL ubeubh+)ra }rb (h)Uh*j< h/h2h5h6h7}rc (h9]h<]h=]h>]rd U$get-an-account-in-an-openstack-cloudre ahB]rf h auhCM hDhhM]rg (hO)rh }ri (h)X$Get an Account in an OpenStack cloudrj h*ja h/h2h5hSh7}rk (h9]h<]h=]h>]hB]uhCM hDhhM]rl hVX$Get an Account in an OpenStack cloudrm rn }ro (h)jj h*jh ubaubhZ)rp }rq (h)XSetting up OpenStack is outside the domain of this document. There are four account details necessary for the Buildbot master to interact with your OpenStack cloud: username, password, a tenant name, and the auth URL to use.rr h*ja h/h2h5h]h7}rs (h9]h<]h=]h>]hB]uhCM hDhhM]rt hVXSetting up OpenStack is outside the domain of this document. There are four account details necessary for the Buildbot master to interact with your OpenStack cloud: username, password, a tenant name, and the auth URL to use.ru rv }rw (h)jr h*jp ubaubeubh+)rx }ry (h)Uh*j< h/h2h5h6h7}rz (h9]h<]h=]h>]r{ Ucreate-an-imager| ahB]r} h auhCMhDhhM]r~ (hO)r }r (h)XCreate an Imager h*jx h/h2h5hSh7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r hVXCreate an Imager r }r (h)j h*j ubaubhZ)r }r (h)XOpenStack supports a large number of image formats. OpenStack maintains a short list of prebuilt images; if the desired image is not listed, The `OpenStack Compute Administration Manual `_ is a good resource for creating new images. You need to configure the image with a buildbot slave to connect to the master on boot.h*jx h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r (hVXOpenStack supports a large number of image formats. OpenStack maintains a short list of prebuilt images; if the desired image is not listed, The r r }r (h)XOpenStack supports a large number of image formats. OpenStack maintains a short list of prebuilt images; if the desired image is not listed, The h*j ubh)r }r (h)Xw`OpenStack Compute Administration Manual `_h7}r (UnameX'OpenStack Compute Administration ManualjXJhttp://docs.openstack.org/trunk/openstack-compute/admin/content/index.htmlr h>]h=]h9]h<]hB]uh*j hM]r hVX'OpenStack Compute Administration Manualr r }r (h)Uh*j ubah5hubhG)r }r (h)XM h.Kh*j h5hJh7}r (Urefurij h>]r U'openstack-compute-administration-manualr ah=]h9]h<]hB]r hauhM]ubhVX is a good resource for creating new images. You need to configure the image with a buildbot slave to connect to the master on boot.r r }r (h)X is a good resource for creating new images. You need to configure the image with a buildbot slave to connect to the master on boot.h*j ubeubeubh+)r }r (h)Uh*j< h/h2h5h6h7}r (h9]h<]h=]h>]r U6configure-the-master-with-an-openstacklatentbuildslaver ahB]r hauhCMhDhhM]r (hO)r }r (h)X6Configure the Master with an OpenStackLatentBuildSlaver h*j h/h2h5hSh7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r hVX6Configure the Master with an OpenStackLatentBuildSlaver r }r (h)j h*j ubaubhZ)r }r (h)XWith the configured image in hand, it is time to configure the buildbot master to create OpenStack instances of it. You will need the aforementioned account details. These are the same details set in either environment variables or passed as options to an OpenStack client.r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r hVXWith the configured image in hand, it is time to configure the buildbot master to create OpenStack instances of it. You will need the aforementioned account details. These are the same details set in either environment variables or passed as options to an OpenStack client.r r }r (h)j h*j ubaubhZ)r }r (h)XC:class:`OpenStackLatentBuildSlave` accepts the following arguments:r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCMhDhhM]r (hc)r }r (h)X":class:`OpenStackLatentBuildSlave`r h*j h/h2h5hgh7}r (UreftypeXclasshihjXOpenStackLatentBuildSlaveU refdomainXpyr h>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCMhM]r ho)r }r (h)j h7}r (h9]h<]r (htj Xpy-classr eh=]h>]hB]uh*j hM]r hVXOpenStackLatentBuildSlaver r }r (h)Uh*j ubah5hzubaubhVX! accepts the following arguments:r r }r (h)X! accepts the following arguments:h*j ubeubj7)r }r (h)Uh*j h/h2h5j:h7}r (h9]h<]h=]h>]hB]uhCNhDhhM]r (j=)r }r (h)X``name`` The buildslave name. h*j h/h2h5j@h7}r (h9]h<]h=]h>]hB]uhCM"hM]r (jC)r }r (h)X``name``r h*j h/h2h5jGh7}r (h9]h<]h=]h>]hB]uhCM"hM]r ho)r }r (h)j h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXnamer r }r (h)Uh*j ubah5hzubaubjQ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hZ)r }r (h)XThe buildslave name.r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM"hM]r hVXThe buildslave name.r r }r (h)j h*j ubaubah5j^ubeubj=)r }r (h)XH``password`` A password for the buildslave to login to the master with. h*j h/h2h5j@h7}r (h9]h<]h=]h>]hB]uhCM%hDhhM]r (jC)r }r (h)X ``password``r h*j h/h2h5jGh7}r (h9]h<]h=]h>]hB]uhCM%hM]r ho)r }r (h)j h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXpasswordr r }r (h)Uh*j ubah5hzubaubjQ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hZ)r }r (h)X:A password for the buildslave to login to the master with.r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM%hM]r hVX:A password for the buildslave to login to the master with.r r }r (h)j h*j ubaubah5j^ubeubj=)r }r (h)X2``flavor`` The flavor ID to use for the instance. h*j h/h2h5j@h7}r (h9]h<]h=]h>]hB]uhCM(hDhhM]r (jC)r }r (h)X ``flavor``r h*j h/h2h5jGh7}r (h9]h<]h=]h>]hB]uhCM(hM]r ho)r }r (h)j h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXflavorr r }r (h)Uh*j ubah5hzubaubjQ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hZ)r }r (h)X&The flavor ID to use for the instance.r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM(hM]r! hVX&The flavor ID to use for the instance.r" r# }r$ (h)j h*j ubaubah5j^ubeubj=)r% }r& (h)X``image`` A string containing the image UUID to use for the instance. A callable may instead be passed. It will be passed the list of available images and must return the image to use. h*j h/h2h5j@h7}r' (h9]h<]h=]h>]hB]uhCM-hDhhM]r( (jC)r) }r* (h)X ``image``r+ h*j% h/h2h5jGh7}r, (h9]h<]h=]h>]hB]uhCM-hM]r- ho)r. }r/ (h)j+ h7}r0 (h9]h<]h=]h>]hB]uh*j) hM]r1 hVXimager2 r3 }r4 (h)Uh*j. ubah5hzubaubjQ)r5 }r6 (h)Uh7}r7 (h9]h<]h=]h>]hB]uh*j% hM]r8 hZ)r9 }r: (h)XA string containing the image UUID to use for the instance. A callable may instead be passed. It will be passed the list of available images and must return the image to use.r; h*j5 h/h2h5h]h7}r< (h9]h<]h=]h>]hB]uhCM+hM]r= hVXA string containing the image UUID to use for the instance. A callable may instead be passed. It will be passed the list of available images and must return the image to use.r> r? }r@ (h)j; h*j9 ubaubah5j^ubeubeubhZ)rA }rB (h)X``os_username``rC h*j h/h2h5h]h7}rD (h9]h<]h=]h>]hB]uhCM/hDhhM]rE ho)rF }rG (h)jC h7}rH (h9]h<]h=]h>]hB]uh*jA hM]rI hVX os_usernamerJ rK }rL (h)Uh*jF ubah5hzubaubhZ)rM }rN (h)X``os_password``rO h*j h/h2h5h]h7}rP (h9]h<]h=]h>]hB]uhCM1hDhhM]rQ ho)rR }rS (h)jO h7}rT (h9]h<]h=]h>]hB]uh*jM hM]rU hVX os_passwordrV rW }rX (h)Uh*jR ubah5hzubaubhZ)rY }rZ (h)X``os_tenant_name``r[ h*j h/h2h5h]h7}r\ (h9]h<]h=]h>]hB]uhCM3hDhhM]r] ho)r^ }r_ (h)j[ h7}r` (h9]h<]h=]h>]hB]uh*jY hM]ra hVXos_tenant_namerb rc }rd (h)Uh*j^ ubah5hzubaubj7)re }rf (h)Uh*j h/h2h5j:h7}rg (h9]h<]h=]h>]hB]uhCNhDhhM]rh (j=)ri }rj (h)X``os_auth_url`` The OpenStack authentication needed to create and delete instances. These are the same as the environment variables with uppercase names of the arguments. h*je h/h2h5j@h7}rk (h9]h<]h=]h>]hB]uhCM8hM]rl (jC)rm }rn (h)X``os_auth_url``ro h*ji h/h2h5jGh7}rp (h9]h<]h=]h>]hB]uhCM8hM]rq ho)rr }rs (h)jo h7}rt (h9]h<]h=]h>]hB]uh*jm hM]ru hVX os_auth_urlrv rw }rx (h)Uh*jr ubah5hzubaubjQ)ry }rz (h)Uh7}r{ (h9]h<]h=]h>]hB]uh*ji hM]r| hZ)r} }r~ (h)XThe OpenStack authentication needed to create and delete instances. These are the same as the environment variables with uppercase names of the arguments.r h*jy h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM6hM]r hVXThe OpenStack authentication needed to create and delete instances. These are the same as the environment variables with uppercase names of the arguments.r r }r (h)j h*j} ubaubah5j^ubeubj=)r }r (h)X``meta`` A dictionary of string key-value pairs to pass to the instance. These will be available under the ``metadata`` key from the metadata service. h*je h/h2h5j@h7}r (h9]h<]h=]h>]hB]uhCM<hDhhM]r (jC)r }r (h)X``meta``r h*j h/h2h5jGh7}r (h9]h<]h=]h>]hB]uhCM<hM]r ho)r }r (h)j h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXmetar r }r (h)Uh*j ubah5hzubaubjQ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hZ)r }r (h)XA dictionary of string key-value pairs to pass to the instance. These will be available under the ``metadata`` key from the metadata service.h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM;hM]r (hVXbA dictionary of string key-value pairs to pass to the instance. These will be available under the r r }r (h)XbA dictionary of string key-value pairs to pass to the instance. These will be available under the h*j ubho)r }r (h)X ``metadata``h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXmetadatar r }r (h)Uh*j ubah5hzubhVX key from the metadata service.r r }r (h)X key from the metadata service.h*j ubeubah5j^ubeubeubhZ)r }r (h)XNHere is the simplest example of configuring an OpenStack latent buildslave. ::r h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM>hDhhM]r hVXKHere is the simplest example of configuring an OpenStack latent buildslave.r r }r (h)XKHere is the simplest example of configuring an OpenStack latent buildslave.h*j ubaubjF)r }r (h)Xgfrom buildbot.buildslave.openstack import OpenStackLatentBuildSlave c['slaves'] = [OpenStackLatentBuildSlave('bot2', 'sekrit', flavor=1, image='8ac9d4a4-5e03-48b0-acde-77a0345a9ab1', os_username='user', os_password='password', os_tenant_name='tenant', os_auth_url='http://127.0.0.1:35357/v2.0')]h*j h/h2h5jIh7}r (jKjLh>]h=]h9]h<]hB]uhCM@hDhhM]r hVXgfrom buildbot.buildslave.openstack import OpenStackLatentBuildSlave c['slaves'] = [OpenStackLatentBuildSlave('bot2', 'sekrit', flavor=1, image='8ac9d4a4-5e03-48b0-acde-77a0345a9ab1', os_username='user', os_password='password', os_tenant_name='tenant', os_auth_url='http://127.0.0.1:35357/v2.0')]r r }r (h)Uh*j ubaubhZ)r }r (h)X The ``image`` argument also supports being given a callable. The callable will be passed the list of available images and must return the image to use. The invocation happens in a separate thread to prevent blocking the build master when interacting with OpenStack. ::h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCMGhDhhM]r (hVXThe r r }r (h)XThe h*j ubho)r }r (h)X ``image``h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXimager r }r (h)Uh*j ubah5hzubhVX argument also supports being given a callable. The callable will be passed the list of available images and must return the image to use. The invocation happens in a separate thread to prevent blocking the build master when interacting with OpenStack.r r }r (h)X argument also supports being given a callable. The callable will be passed the list of available images and must return the image to use. The invocation happens in a separate thread to prevent blocking the build master when interacting with OpenStack.h*j ubeubjF)r }r (h)X.from buildbot.buildslave.openstack import OpenStackLatentBuildSlave def find_image(images): # Sort oldest to newest. cmp_fn = lambda x,y: cmp(x.created, y.created) candidate_images = sorted(images, cmp=cmp_fn) # Return the oldest candiate image. return candidate_images[0] c['slaves'] = [OpenStackLatentBuildSlave('bot2', 'sekrit', flavor=1, image=find_image, os_username='user', os_password='password', os_tenant_name='tenant', os_auth_url='http://127.0.0.1:35357/v2.0')]h*j h/h2h5jIh7}r (jKjLh>]h=]h9]h<]hB]uhCMLhDhhM]r hVX.from buildbot.buildslave.openstack import OpenStackLatentBuildSlave def find_image(images): # Sort oldest to newest. cmp_fn = lambda x,y: cmp(x.created, y.created) candidate_images = sorted(images, cmp=cmp_fn) # Return the oldest candiate image. return candidate_images[0] c['slaves'] = [OpenStackLatentBuildSlave('bot2', 'sekrit', flavor=1, image=find_image, os_username='user', os_password='password', os_tenant_name='tenant', os_auth_url='http://127.0.0.1:35357/v2.0')]r r }r (h)Uh*j ubaubhZ)r }r (h)X_:class:`OpenStackLatentBuildSlave` supports all other configuration from the standard :class:`BuildSlave`. The ``missing_timeout`` and ``notify_on_missing`` specify how long to wait for an OpenStack instance to attach before considering the attempt to have failed and email addresses to alert, respectively. ``missing_timeout`` defaults to 20 minutes.h*j h/h2h5h]h7}r (h9]h<]h=]h>]hB]uhCM\hDhhM]r (hc)r }r (h)X":class:`OpenStackLatentBuildSlave`r h*j h/h2h5hgh7}r (UreftypeXclasshihjXOpenStackLatentBuildSlaveU refdomainXpyr h>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCM\hM]r ho)r }r (h)j h7}r (h9]h<]r (htj Xpy-classr eh=]h>]hB]uh*j hM]r hVXOpenStackLatentBuildSlaver r }r (h)Uh*j ubah5hzubaubhVX4 supports all other configuration from the standard r r }r (h)X4 supports all other configuration from the standard h*j ubhc)r }r (h)X:class:`BuildSlave`r h*j h/h2h5hgh7}r (UreftypeXclasshihjX BuildSlaveU refdomainXpyr h>]h=]U refexplicith9]h<]hB]hlhmhNhNuhCM\hM]r ho)r }r (h)j h7}r (h9]h<]r (htj Xpy-classr eh=]h>]hB]uh*j hM]r hVX BuildSlaver r }r (h)Uh*j ubah5hzubaubhVX. The r r }r (h)X. The h*j ubho)r }r (h)X``missing_timeout``h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXmissing_timeoutr r }r (h)Uh*j ubah5hzubhVX and r r }r (h)X and h*j ubho)r }r (h)X``notify_on_missing``h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXnotify_on_missingr r }r (h)Uh*j ubah5hzubhVX specify how long to wait for an OpenStack instance to attach before considering the attempt to have failed and email addresses to alert, respectively. r r }r (h)X specify how long to wait for an OpenStack instance to attach before considering the attempt to have failed and email addresses to alert, respectively. h*j ubho)r }r (h)X``missing_timeout``h7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXmissing_timeoutr r }r (h)Uh*j ubah5hzubhVX defaults to 20 minutes.r r }r (h)X defaults to 20 minutes.h*j ubeubeubeubh+)r }r (h)Uh*jh/h2h5h6h7}r (h9]h<]h=]h>]r Udangers-with-latent-buildslavesr ahB]r hauhCMchDhhM]r (hO)r }r (h)XDangers with Latent Buildslavesr h*j h/h2h5hSh7}r! (h9]h<]h=]h>]hB]uhCMchDhhM]r" hVXDangers with Latent Buildslavesr# r$ }r% (h)j h*j ubaubhZ)r& }r' (h)XpAny latent build slave that interacts with a for-fee service, such as the EC2LatentBuildSlave, brings significant risks. As already identified, the configuration will need access to account information that, if obtained by a criminal, can be used to charge services to your account. Also, bugs in the buildbot software may lead to unnecessary charges. In particular, if the master neglects to shut down an instance for some reason, a virtual machine may be running unnecessarily, charging against your account. Manual and/or automatic (e.g. nagios with a plugin using a library like boto) double-checking may be appropriate.r( h*j h/h2h5h]h7}r) (h9]h<]h=]h>]hB]uhCMehDhhM]r* hVXpAny latent build slave that interacts with a for-fee service, such as the EC2LatentBuildSlave, brings significant risks. As already identified, the configuration will need access to account information that, if obtained by a criminal, can be used to charge services to your account. Also, bugs in the buildbot software may lead to unnecessary charges. In particular, if the master neglects to shut down an instance for some reason, a virtual machine may be running unnecessarily, charging against your account. Manual and/or automatic (e.g. nagios with a plugin using a library like boto) double-checking may be appropriate.r+ r, }r- (h)j( h*j& ubaubhZ)r. }r/ (h)X}A comparatively trivial note is that currently if two instances try to attach to the same latent buildslave, it is likely that the system will become confused. This should not occur, unless, for instance, you configure a normal build slave to connect with the authentication of a latent buildbot. If this situation does occurs, stop all attached instances and restart the master.r0 h*j h/h2h5h]h7}r1 (h9]h<]h=]h>]hB]uhCMohDhhM]r2 hVX}A comparatively trivial note is that currently if two instances try to attach to the same latent buildslave, it is likely that the system will become confused. This should not occur, unless, for instance, you configure a normal build slave to connect with the authentication of a latent buildbot. If this situation does occurs, stop all attached instances and restart the master.r3 r4 }r5 (h)j0 h*j. ubaubeubeubeubh/h2h5Usystem_messager6 h7}r7 (h9]UlevelKh>]h=]r8 hAaUsourceh2h<]hB]UlineKUtypeUINFOr9 uhCKhDhhM]r: hZ)r; }r< (h)Uh7}r= (h9]h<]h=]h>]hB]uh*h'hM]r> hVX.Duplicate implicit target name: "buildslaves".r? r@ }rA (h)Uh*j; ubah5h]ubaubh&)rB }rC (h)Uh*jh/h2h5j6 h7}rD (h9]UlevelKh>]h=]rE jaUsourceh2h<]hB]UlineKUtypej9 uhCMhDhhM]rF hZ)rG }rH (h)Uh7}rI (h9]h<]h=]h>]hB]uh*jB hM]rJ hVX*Duplicate implicit target name: "libvirt".rK rL }rM (h)Uh*jG ubah5h]ubaubh&)rN }rO (h)Uh*j< h/h2h5j6 h7}rP (h9]UlevelKh>]h=]rQ j\ aUsourceh2h<]hB]UlineKUtypej9 uhCMhDhhM]rR hZ)rS }rT (h)Uh7}rU (h9]h<]h=]h>]hB]uh*jN hM]rV hVX,Duplicate implicit target name: "openstack".rW rX }rY (h)Uh*jS ubah5h]ubaubeUcurrent_sourcerZ NU decorationr[ NUautofootnote_startr\ KUnameidsr] }r^ (hjhjhj$h je h jh j| h j\ h jghhhjhj2hj hhhj hjhjmhjhU buildslavesr_ hjhjhj hhhjhj hjhjh jh!huhM]r` (cdocutils.nodes comment ra )rb }rc (h)X -*- rst -*-h*hh/h2h5Ucommentrd h7}re (jKjLh>]h=]h9]h<]hB]uhCKhDhhM]rf hVX -*- rst -*-rg rh }ri (h)Uh*jb ubaubhG)rj }rk (h)X.. _Buildslaves:h*hh/h2h5hJh7}rl (h9]h<]h=]h>]rm j_ ahB]rn hauhCKhDhhM]ubj^)ro }rp (h)Uh*hh/h2h5jah7}rq (h>]h=]h9]h<]hB]Uentries]rr ((UsingleXBuildmaster Config; slavesh@h@trs (UsingleXslaves (Buildmaster Config)h@h@trt euhCKhDhhM]ubhHh,eh)UU transformerru NU footnote_refsrv }rw Urefnamesrx }ry Usymbol_footnotesrz ]r{ Uautofootnote_refsr| ]r} Usymbol_footnote_refsr~ ]r U citationsr ]r hDhU current_liner NUtransform_messagesr ]r (h&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineKUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX1Hyperlink target "buildslaves" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineKUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX0Hyperlink target "cfg-slaves" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineK0Utypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX-Hyperlink target "index-0" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineK;Utypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX-Hyperlink target "index-1" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineKWUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVXAHyperlink target "when-buildslaves-go-missing" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineKUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX-Hyperlink target "index-2" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineKUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX8Hyperlink target "latent-buildslaves" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineKUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX-Hyperlink target "index-3" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubh&)r }r (h)Uh7}r (h9]UlevelKh>]h=]Usourceh2h<]hB]UlineMUtypej9 uhM]r hZ)r }r (h)Uh7}r (h9]h<]h=]h>]hB]uh*j hM]r hVX-Hyperlink target "index-4" is not referenced.r r }r (h)Uh*j ubah5h]ubah5j6 ubeUreporterr NUid_startr K U autofootnotesr ]r U citation_refsr }r Uindirect_targetsr ]r Usettingsr (cdocutils.frontend Values r or }r (Ufootnote_backlinksr KUrecord_dependenciesr NU rfc_base_urlr Uhttp://tools.ietf.org/html/r U tracebackr Upep_referencesr NUstrip_commentsr NU toc_backlinksr Uentryr U language_coder Uenr U datestampr NU report_levelr KU _destinationr NU halt_levelr KU strip_classesr NhSNUerror_encoding_error_handlerr Ubackslashreplacer Udebugr NUembed_stylesheetr Uoutput_encoding_error_handlerr Ustrictr U sectnum_xformr KUdump_transformsr NU docinfo_xformr KUwarning_streamr NUpep_file_url_templater Upep-%04dr Uexit_status_levelr KUconfigr NUstrict_visitorr NUcloak_email_addressesr Utrim_footnote_reference_spacer Uenvr NUdump_pseudo_xmlr NUexpose_internalsr NUsectsubtitle_xformr U source_linkr NUrfc_referencesr NUoutput_encodingr Uutf-8r U source_urlr NUinput_encodingr U utf-8-sigr U_disable_configr NU id_prefixr! UU tab_widthr" KUerror_encodingr# UUTF-8r$ U_sourcer% UW/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-buildslaves.rstr& Ugettext_compactr' U generatorr( NUdump_internalsr) NU smart_quotesr* U pep_base_urlr+ Uhttp://www.python.org/dev/peps/r, Usyntax_highlightr- Ulongr. Uinput_encoding_error_handlerr/ j Uauto_id_prefixr0 Uidr1 Udoctitle_xformr2 Ustrip_elements_with_classesr3 NU _config_filesr4 ]Ufile_insertion_enabledr5 U raw_enabledr6 KU dump_settingsr7 NubUsymbol_footnote_startr8 KUidsr9 }r: (jgjcj_ jj j j jjj2j.jB j< j| jx hhjjjjhhj$j hhjjj\ jX jjjjhAh,jjjfjljjjjjcjij jjjh@h,jjjjjjjjhjQj j je ja hhjmjijjhhhjjjj j uUsubstitution_namesr; }r< h5hDh7}r= (h9]h>]h=]Usourceh2h<]hB]uU footnotesr> ]r? Urefidsr@ }rA (j ]rB j ajc]rC jfah@]rD hHaj]rE jajf]rF jiaj]rG jaj]rH jah]rI jauub.PK7D76buildbot-v0.8.9/.doctrees/manual/customization.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xbuild-priority-functionsqXbuilder priority functionsqNXusing statisticsqNXwriting-new-buildstepsq Xadding-logobserversq Xwriting buildstep constructorsq NXstep execution processq NX customizationq Xfactory workdir functionsqNXa somewhat whimsical exampleqNXusing propertiesqNXabout logfilesqNXcustomizing-svnpollerqXmerge-request-functionsqXdiscovering filesqNX(project/branchname/filepath repositoriesqNX:submit the code for inclusion in the buildbot distributionqNX#python file somewhere on the systemqNXwriting new status pluginsqNXadding logobserversqNXmerge request functionsqNXupdating status stringsqNXcustomizing svnpollerqNXrunning commandsqNX(branchname/project/filepath repositoriesqNXframboozle_regqX inclusion in the master.cfg fileq NX%programmatic configuration generationq!NX.writing a new latent buildslave implementationq"NXcustom build classesq#NX divmod.orgq$Xwriting-change-sourcesq%Xbuild priority functionsq&NXwriting new buildstepsq'NXbuilder-priority-functionsq(X)buildbot.changes.base.PollingChangeSourceq)Xwriting-buildstep-constructorsq*Xfactory-workdir-functionsq+Xwriting a change pollerq,NX*writing a notification-based change sourceq-NX:install this code into a standard python library directoryq.NX"buildbot.changes.base.ChangeSourceq/Xbuildstep urlsq0NXreading logfilesq1NXwriting change sourcesq2NXwriting log filesq3NuUsubstitution_defsq4}q5Uparse_messagesq6]q7cdocutils.nodes system_message q8)q9}q:(U rawsourceq;UUparentq}q?(h;UU referencedq@KhhAhDhKUtitleqghM}qh(hQ]hR]hP]hO]hS]uhVKhWhhX]qicdocutils.nodes Text qjX Customizationqkql}qm(h;hfhhAhDhKU paragraphqrhM}qs(hQ]hR]hP]hO]hS]uhVKhWhhX]qthjXFor advanced users, Buildbot acts as a framework supporting a customized build application. For the most part, such configurations consist of subclasses set up for use in a regular Buildbot configuration file.quqv}qw(h;hqhhAhDhKhrhM}q{(hQ]hR]hP]hO]hS]uhVK hWhhX]q|hjXZThis chapter describes some of the more common idioms in advanced Buildbot configurations.q}q~}q(h;hzhhAhDhKhrhM}q(hQ]hR]hP]hO]hS]uhVK hWhhX]qhjXAt the moment, this chapter is an unordered set of suggestions; if you'd like to clean it up, fork the project on GitHub and get started!qq}q(h;hhhAhDhKhYhM}q(hQ]hR]hP]hO]qU%programmatic-configuration-generationqahS]qh!auhVKhWhhX]q(hc)q}q(h;X%Programmatic Configuration GenerationqhhAhDhF}qhhshKhYhM}q(hQ]hR]hP]hO]q(hUid2qehS]q(hheuhVK'hWhh`}qhhshX]q(hc)q}q(h;XMerge Request Functionsqh(hhhO]hP]hQ]hR]hS]uhVK3hWhhX]r?hjXdef mergeRequests(builder, req1, req2): "any requests with the same branch can be merged" return req1.source.branch == req2.source.branch c['mergeRequests'] = mergeRequestsr@rA}rB(h;UhhWhhX]rhjXdef mergeRequests(builder, req1, req2): if req1.source.canBeMergedWith(req2.source) and req1.reason == req2.reason: return True return False c['mergeRequests'] = mergeRequestsrr}r(h;UhhAhDhF}rh(jshKhYhM}r(hQ]hR]hP]hO]r(jUid3rehS]r(hh(euhVKYhWhh`}rjjshX]r(hc)r}r(h;XBuilder Priority Functionsrh(hhhO]hP]hQ]hR]hS]uhVKfhWhhX]r?hjXdef prioritizeBuilders(buildmaster, builders): """Prioritize builders. 'finalRelease' builds have the highest priority, so they should be built before running tests, or creating builds.""" builderPriorities = { "finalRelease": 0, "test": 1, "build": 2, } builders.sort(key=lambda b: builderPriorities.get(b.name, 0)) return builders c['prioritizeBuilders'] = prioritizeBuildersr@rA}rB(h;UhhAhDhF}rShjLshKhYhM}rT(hQ]hR]hP]hO]rU(jOjGUid4rVehS]rW(h&heuhVKyhWhh`}rX(jOjLjGjIuhX]rY(hc)rZ}r[(h;XBuild Priority Functionsr\hWhen a builder has multiple pending build requests, it uses a rfrg}rh(h;X>When a builder has multiple pending build requests, it uses a hhAhDhF}rhjshKhYhM}r(hQ]hR]hP]hO]r(jUid5rehS]r(hheuhVKhWhh`}rjjshX]r(hc)r}r(h;XCustomizing SVNPollerrh(hQ]hR]r?(jj:Xbb-chsrcr@ehP]hO]hS]uh}r?(h;XE function. This function is responsible for splitting something like h 1 and pieces[0] == 'trunk': return (None, '/'.join(pieces[1:])) elif len(pieces) > 2 and pieces[0] == 'branches': return ('/'.join(pieces[0:2]), '/'.join(pieces[2:])) else: return Noneh 1 and pieces[0] == 'trunk': return (None, '/'.join(pieces[1:])) elif len(pieces) > 2 and pieces[0] == 'branches': return ('/'.join(pieces[0:2]), '/'.join(pieces[2:])) else: return Nonerr}r(h;Uh}r?(h;X``None``hM}r@(hQ]hR]hP]hO]hS]uhubahKhubhjX to indicate the trunk) will be delivered to the Schedulers. Each Scheduler is then free to use or ignore each branch as it sees fit.rErF}rG(h;X to indicate the trunk) will be delivered to the Schedulers. Each Scheduler is then free to use or ignore each branch as it sees fit.h`_ hosts a project named `Nevow` as well as one named `Quotient`. In a checked-out Nevow tree there is a directory named `formless` that contains a Python source file named :file:`webform.py`. This repository is accessible via webdav (and thus uses an `http:` scheme) through the divmod.org hostname. There are many branches in this repository, and they use a ``({BRANCHNAME})/({PROJECT})`` naming policy.h`_hM}r(UnameX Divmod.orgUrefurirXhttp://Divmod.orgrhO]hP]hQ]hR]hS]uhh@Khr?}r@(h;X6, while the Quotient trunk would be checked out using h(h;UhhAhDhF}rh%jshKhYhM}r(hQ]hR]hP]hO]r(jUid6rehS]r(h2h%euhVMghWhh`}rjjshX]r(hc)r}r(h;XWriting Change Sourcesrhr?}r@(h;X&A custom change source must implement h r? }r@ (h;X . This subclass implements the hhAhDhKhYhM}ry (hQ]hR]hP]hO]rz U.writing-a-new-latent-buildslave-implementationr{ ahS]r| h"auhVMhWhhX]r} (hc)r~ }r (h;X.Writing a New Latent Buildslave Implementationr hhAhDhKhYhM}r (hQ]hR]hP]hO]r Ucustom-build-classesr ahS]r h#auhVMhWhhX]r (hc)r }r (h;XCustom Build Classesr h (h;X\s in a fixed sequence. Each step can affect the results of the build, but in general there is little intelligence to tie the different steps together.hhAhDhF}r] h+jW shKhYhM}r^ (hQ]hR]hP]hO]r_ (jZ Uid7r` ehS]ra (hh+euhVMhWhh`}rb jZ jW shX]rc (hc)rd }re (h;XFactory Workdir Functionsrf h /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88h /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88r r }r (h;UhhAhDhF}r h j shKhYhM}r (hQ]hR]hP]hO]r (j Uid8r ehS]r (h'h euhVMhWhh`}r j j shX]r (hc)r }r (h;XWriting New BuildStepsr h (hQ]hR]r? (jj: Xpy-classr@ ehP]hO]hS]uh r? }r@ (h;X method. When this method returns (more accurately, when the Deferred it returns fires), the step is complete. The method's result must be an integer, giving the result of the step. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the h (hQ]hR]hP]hO]hS]uhVMhWhhX]r? hjXEach step can summarize its current status in a very short string. For example, a compile step might display the file being compiled. This information can be helpful users eager to see their build finish.r@ rA }rB (h;j= h(hjXuMost commonly, logfiles come from commands run on the build slave. Internally, these are configured by supplying the r?r@}rA(h;XuMost commonly, logfiles come from commands run on the build slave. Internally, these are configured by supplying the hehP]hO]hS]uh(hQ]hR]r?(jj8X std-optionr@ehP]hO]hS]uh}r?(h;Uh}r?(h;UhhjX@defer.inlineCallbacks def run(self): ... # create and upload report to coverage server url = 'http://coverage.corp.com/reports/%s' % reportname yield self.addURL('coverage', url)r?r@}rA(h;Uh(h;XA Somewhat Whimsical Exampler?hhhM}rD(hQ]hR]rE(jj@Xbb-steprFehP]hO]hS]uh(h;Uh>> import sys >>> import pprint >>> pprint.pprint(sys.path) ['', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/Numeric', '/var/lib/python-support/python2.4', '/usr/lib/site-python']h>> import sys >>> import pprint >>> pprint.pprint(sys.path) ['', '/usr/lib/python24.zip', '/usr/lib/python2.4', '/usr/lib/python2.4/plat-linux2', '/usr/lib/python2.4/lib-tk', '/usr/lib/python2.4/lib-dynload', '/usr/local/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages', '/usr/lib/python2.4/site-packages/Numeric', '/var/lib/python-support/python2.4', '/usr/lib/site-python']rr}r(h;UhhAhDhKhYhM}r7(hQ]hR]hP]hO]r8Uwriting-new-status-pluginsr9ahS]r:hauhVMhWhhX]r;(hc)r<}r=(h;XWriting New Status Pluginsr>hheh;UU transformerrNU footnote_refsr}rXframboozle_regr]rjMasUrefnamesr}rj]rjMasUsymbol_footnotesr]rUautofootnote_refsr]rjMaUsymbol_footnote_refsr]rU citationsr]rhWhU current_linerNUtransform_messagesr]r(h8)r}r(h;UhM}r(hQ]UlevelKhO]hP]UsourcehDhR]hS]UlineKUtypejuhX]rhn)r}r(h;UhM}r(hQ]hR]hP]hO]hS]uhHyperlink target "build-priority-functions" is not referenced.r)r*}r+(h;UhhjX<Hyperlink target "writing-change-sources" is not referenced.r?r@}rA(h;Uhjjj j j j jVjRhhjjj` j[ jVjQjjhhjjh^h>j!jjTjMjXj[jjhhjjjGjQjojvjjj j jjjujqjjjUjhhj)j,jjjjjjjjjjj j j9j5j j h)jj{ jw jZ j[ jzjvj0j,jjh/jj j j j jjuUsubstitution_namesr}rhKhWhM}r(hQ]hO]hP]UsourcehDhR]hS]uU footnotesr]rUrefidsr}r (jO]r jLajU]r jMahU]r hIah]r haj ]rj aj]rjaj]rjaj]rjaj]rjah]rhaj]rjajG]rjIajo]rjsaj]rjaj ]rj| ajZ ]rjW auub.PK7DfU .buildbot-v0.8.9/.doctrees/manual/index.doctreecdocutils.nodes document q)q}q(U nametypesq}qXbuildbot manualqNsUsubstitution_defsq}qUparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startq KUnameidsq}qhUbuildbot-manualqsUchildrenq]q(cdocutils.nodes paragraph q)q}q(U rawsourceqX;This is the BuildBot manual for Buildbot version |version|.qUparentqhUsourceqcdocutils.nodes reprunicode qXM/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/index.rstqq}qbUtagnameqU paragraphqU attributesq }q!(Udupnamesq"]Uclassesq#]Ubackrefsq$]Uidsq%]Unamesq&]uUlineq'KUdocumentq(hh]q)(cdocutils.nodes Text q*X1This is the BuildBot manual for Buildbot version q+q,}q-(hX1This is the BuildBot manual for Buildbot version hhubh*X0.8.9q.q/}q0(hU0.8.9q1hNh'Nh(hhhubh*X.q2}q3(hX.hhubeubcdocutils.nodes section q4)q5}q6(hUhhhhhUsectionq7h }q8(h"]h#]h$]h%]q9hah&]q:hauh'Kh(hh]q;(cdocutils.nodes title q<)q=}q>(hXBuildbot Manualq?hh5hhhUtitleq@h }qA(h"]h#]h$]h%]h&]uh'Kh(hh]qBh*XBuildbot ManualqCqD}qE(hh?hh=ubaubcdocutils.nodes compound qF)qG}qH(hUhh5hhhUcompoundqIh }qJ(h"]h#]qKUtoctree-wrapperqLah$]h%]h&]uh'Nh(hh]qMcsphinx.addnodes toctree qN)qO}qP(hUhhGhhhUtoctreeqQh }qR(UnumberedqSKU includehiddenqThX manual/indexqUU titlesonlyqVUglobqWh%]h$]h"]h#]h&]UentriesqX]qY(NXmanual/introductionqZq[NXmanual/installationq\q]NXmanual/conceptsq^q_NXmanual/configurationq`qaNXmanual/customizationqbqcNXmanual/new-style-stepsqdqeNXmanual/cmdlineqfqgNXmanual/resourcesqhqiNXmanual/optimizationqjqkeUhiddenqlU includefilesqm]qn(hZh\h^h`hbhdhfhhhjeUmaxdepthqoKuh'Kh]ubaubeubehUU transformerqpNU footnote_refsqq}qrUrefnamesqs}qtUsymbol_footnotesqu]qvUautofootnote_refsqw]qxUsymbol_footnote_refsqy]qzU citationsq{]q|h(hU current_lineq}NUtransform_messagesq~]qUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh@NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqUtrim_footnote_reference_spaceqUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUM/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/index.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesq‰U pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqʉUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledq͈U raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}qhh5sUsubstitution_namesq}qhh(h }q(h"]h%]h$]Usourcehh#]h&]uU footnotesq]qUrefidsq}qub.PK4D L'';buildbot-v0.8.9/.doctrees/manual/cfg-buildfactories.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XbasicbuildfactoryqX distutilsqXdefining a build factoryqNXpredefined build factoriesq NX*buildbot.process.factory.BasicBuildFactoryq X buildfactoryq Ucontentsq NXbuild-factoriesq X gnuautoconfqX gnu autoconfqXbuild factoriesqNXcpanqX"buildbot.process.factory.DistutilsqX*buildbot.process.factory.QuickBuildFactoryqXbuildbot.process.factory.TrialqX$buildbot.process.factory.GNUAutoconfqX!buildbot.process.factory.BasicSVNqXbasicsvnqXtrialqX factory-cpanqXquickbuildfactoryqX attributesqNXbuildbot.process.factory.CPANquUsubstitution_defsq}qUparse_messagesq]q (cdocutils.nodes system_message q!)q"}q#(U rawsourceq$UUparentq%cdocutils.nodes section q&)q'}q((h$UU referencedq)Kh%h&)q*}q+(h$Uh%h&)q,}q-(h$Uh%hUsourceq.cdocutils.nodes reprunicode q/XZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-buildfactories.rstq0q1}q2bUexpect_referenced_by_nameq3}q4h cdocutils.nodes target q5)q6}q7(h$X.. _Build-Factories:h%hh.h1Utagnameq8Utargetq9U attributesq:}q;(Uidsq<]Ubackrefsq=]Udupnamesq>]Uclassesq?]Unamesq@]UrefidqAUbuild-factoriesqBuUlineqCKUdocumentqDhUchildrenqE]ubsh8UsectionqFh:}qG(h>]h?]h=]h<]qH(hBUid1qIeh@]qJ(hh euhCKhDhUexpect_referenced_by_idqK}qLhBh6shE]qM(cdocutils.nodes title qN)qO}qP(h$XBuild FactoriesqQh%h,h.h1h8UtitleqRh:}qS(h>]h?]h=]h<]h@]uhCKhDhhE]qTcdocutils.nodes Text qUXBuild FactoriesqVqW}qX(h$hQh%hOubaubcdocutils.nodes paragraph qY)qZ}q[(h$XEach Builder is equipped with a ``build factory``, which is defines the steps used to perform that particular type of build. This factory is created in the configuration file, and attached to a Builder through the ``factory`` element of its dictionary.h%h,h.h1h8U paragraphq\h:}q](h>]h?]h=]h<]h@]uhCKhDhhE]q^(hUX Each Builder is equipped with a q_q`}qa(h$X Each Builder is equipped with a h%hZubcdocutils.nodes literal qb)qc}qd(h$X``build factory``h:}qe(h>]h?]h=]h<]h@]uh%hZhE]qfhUX build factoryqgqh}qi(h$Uh%hcubah8UliteralqjubhUX, which is defines the steps used to perform that particular type of build. This factory is created in the configuration file, and attached to a Builder through the qkql}qm(h$X, which is defines the steps used to perform that particular type of build. This factory is created in the configuration file, and attached to a Builder through the h%hZubhb)qn}qo(h$X ``factory``h:}qp(h>]h?]h=]h<]h@]uh%hZhE]qqhUXfactoryqrqs}qt(h$Uh%hnubah8hjubhUX element of its dictionary.quqv}qw(h$X element of its dictionary.h%hZubeubhY)qx}qy(h$XSThe steps used by these builds are defined in the next section, :ref:`Build-Steps`.qzh%h,h.h1h8h\h:}q{(h>]h?]h=]h<]h@]uhCK hDhhE]q|(hUX@The steps used by these builds are defined in the next section, q}q~}q(h$X@The steps used by these builds are defined in the next section, h%hxubcsphinx.addnodes pending_xref q)q}q(h$X:ref:`Build-Steps`qh%hxh.h1h8U pending_xrefqh:}q(UreftypeXrefUrefwarnqU reftargetqX build-stepsU refdomainXstdqh<]h=]U refexplicith>]h?]h@]UrefdocqXmanual/cfg-buildfactoriesquhCK hE]qcdocutils.nodes emphasis q)q}q(h$hh:}q(h>]h?]q(UxrefqhXstd-refqeh=]h<]h@]uh%hhE]qhUX Build-Stepsqq}q(h$Uh%hubah8UemphasisqubaubhUX.q}q(h$X.h%hxubeubcdocutils.nodes note q)q}q(h$XoBuild factories are used with builders, and are not added directly to the buildmaster configuration dictionary.h%h,h.h1h8Unoteqh:}q(h>]h?]h=]h<]h@]uhCNhDhhE]qhY)q}q(h$XoBuild factories are used with builders, and are not added directly to the buildmaster configuration dictionary.qh%hh.h1h8h\h:}q(h>]h?]h=]h<]h@]uhCKhE]qhUXoBuild factories are used with builders, and are not added directly to the buildmaster configuration dictionary.qq}q(h$hh%hubaubaubcdocutils.nodes topic q)q}q(h$Uh%h,h.h1h8Utopicqh:}q(h>]h?]q(UcontentsqUlocalqeh=]h<]qUcontentsqah@]qh auhCKhDhhE]qcdocutils.nodes bullet_list q)q}q(h$Uh%hh.Nh8U bullet_listqh:}q(h>]h?]h=]h<]h@]uhCNhDhhE]q(cdocutils.nodes list_item q)q}q(h$Uh:}q(h>]h?]h=]h<]h@]uh%hhE]qhY)q}q(h$Uh:}q(h>]h?]h=]h<]h@]uh%hhE]qcdocutils.nodes reference q)q}q(h$Uh:}q(h<]qUid9qah=]h>]h?]h@]UrefidUdefining-a-build-factoryquh%hhE]qhUXDefining a Build Factoryq˅q}q(h$XDefining a Build Factoryqh%hubah8U referencequbah8h\ubah8U list_itemqubh)q}q(h$Uh:}q(h>]h?]h=]h<]h@]uh%hhE]qhY)q}q(h$Uh:}q(h>]h?]h=]h<]h@]uh%hhE]qh)q}q(h$Uh:}q(h<]qUid10qah=]h>]h?]h@]UrefidUpredefined-build-factoriesquh%hhE]qhUXPredefined Build Factoriesqq}q(h$XPredefined Build Factoriesqh%hubah8hubah8h\ubah8hubeubaubh5)q}q(h$X.. _BuildFactory:h%h,h.h1h8h9h:}q(h>]h?]h=]h<]qU buildfactoryqah@]qh auhCKhDhhE]ubcsphinx.addnodes index q)q}q(h$Uh%h,h.h1h8Uindexqh:}q(h<]h=]h>]h?]h@]Uentriesq]q(UsingleqX Build FactoryUindex-0qUtqaUinlinequhCKhDhhE]ubh5)q}q(h$Uh%h,h.h1h8h9h:}q(h<]h=]h>]h?]h@]hAhuhCKhDhhE]ubh&)q}q(h$Uh%h,h.h1h3}h8hFh:}q(h>]h?]h=]h<]q(hheh@]qhauhCKhDhhK}qhhshE]q(hN)q}r(h$hh%hh.h1h8hRh:}r(h<]h=]h>]h?]h@]hAhuhCKhDhhE]rhUXDefining a Build Factoryrr}r(h$hh%hubaubhY)r}r(h$XA :class:`BuildFactory` defines the steps that every build will follow. Think of it as a glorified script. For example, a build factory which consists of an SVN checkout followed by a ``make build`` would be configured as follows::h%hh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKhDhhE]r (hUXA r r }r (h$XA h%jubh)r }r(h$X:class:`BuildFactory`rh%jh.h1h8hh:}r(UreftypeXclasshhX BuildFactoryU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhUpy:classrNU py:modulerNuhCKhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%j hE]rhUX BuildFactoryrr}r(h$Uh%jubah8hjubaubhUX defines the steps that every build will follow. Think of it as a glorified script. For example, a build factory which consists of an SVN checkout followed by a rr}r (h$X defines the steps that every build will follow. Think of it as a glorified script. For example, a build factory which consists of an SVN checkout followed by a h%jubhb)r!}r"(h$X``make build``h:}r#(h>]h?]h=]h<]h@]uh%jhE]r$hUX make buildr%r&}r'(h$Uh%j!ubah8hjubhUX would be configured as follows:r(r)}r*(h$X would be configured as follows:h%jubeubcdocutils.nodes literal_block r+)r,}r-(h$Xfrom buildbot.steps import svn, shell from buildbot.process import factory f = factory.BuildFactory() f.addStep(svn.SVN(svnurl="http://..", mode="incremental")) f.addStep(shell.Compile(command=["make", "build"]))h%hh.h1h8U literal_blockr.h:}r/(U xml:spacer0Upreserver1h<]h=]h>]h?]h@]uhCK hDhhE]r2hUXfrom buildbot.steps import svn, shell from buildbot.process import factory f = factory.BuildFactory() f.addStep(svn.SVN(svnurl="http://..", mode="incremental")) f.addStep(shell.Compile(command=["make", "build"]))r3r4}r5(h$Uh%j,ubaubhY)r6}r7(h$XMThis factory would then be attached to one builder (or several, if desired)::r8h%hh.h1h8h\h:}r9(h>]h?]h=]h<]h@]uhCK'hDhhE]r:hUXLThis factory would then be attached to one builder (or several, if desired):r;r<}r=(h$XLThis factory would then be attached to one builder (or several, if desired):h%j6ubaubj+)r>}r?(h$X^c['builders'].append( BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f))h%hh.h1h8j.h:}r@(j0j1h<]h=]h>]h?]h@]uhCK)hDhhE]rAhUX^c['builders'].append( BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f))rBrC}rD(h$Uh%j>ubaubhY)rE}rF(h$XIt is also possible to pass a list of steps into the :class:`BuildFactory` when it is created. Using :meth:`addStep` is usually simpler, but there are cases where is is more convenient to create the list of steps ahead of time, perhaps using some Python tricks to generate the steps. ::h%hh.h1h8h\h:}rG(h>]h?]h=]h<]h@]uhCK,hDhhE]rH(hUX5It is also possible to pass a list of steps into the rIrJ}rK(h$X5It is also possible to pass a list of steps into the h%jEubh)rL}rM(h$X:class:`BuildFactory`rNh%jEh.h1h8hh:}rO(UreftypeXclasshhX BuildFactoryU refdomainXpyrPh<]h=]U refexplicith>]h?]h@]hhjNjNuhCK,hE]rQhb)rR}rS(h$jNh:}rT(h>]h?]rU(hjPXpy-classrVeh=]h<]h@]uh%jLhE]rWhUX BuildFactoryrXrY}rZ(h$Uh%jRubah8hjubaubhUX when it is created. Using r[r\}r](h$X when it is created. Using h%jEubh)r^}r_(h$X:meth:`addStep`r`h%jEh.h1h8hh:}ra(UreftypeXmethhhXaddStepU refdomainXpyrbh<]h=]U refexplicith>]h?]h@]hhjNjNuhCK,hE]rchb)rd}re(h$j`h:}rf(h>]h?]rg(hjbXpy-methrheh=]h<]h@]uh%j^hE]rihUXaddSteprjrk}rl(h$Uh%jdubah8hjubaubhUX is usually simpler, but there are cases where is is more convenient to create the list of steps ahead of time, perhaps using some Python tricks to generate the steps.rmrn}ro(h$X is usually simpler, but there are cases where is is more convenient to create the list of steps ahead of time, perhaps using some Python tricks to generate the steps.h%jEubeubj+)rp}rq(h$Xfrom buildbot.steps import source, shell from buildbot.process import factory all_steps = [ source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"), shell.Compile(command=["make", "build"]), ] f = factory.BuildFactory(all_steps)h%hh.h1h8j.h:}rr(j0j1h<]h=]h>]h?]h@]uhCK2hDhhE]rshUXfrom buildbot.steps import source, shell from buildbot.process import factory all_steps = [ source.CVS(cvsroot=CVSROOT, cvsmodule="project", mode="update"), shell.Compile(command=["make", "build"]), ] f = factory.BuildFactory(all_steps)rtru}rv(h$Uh%jpubaubhY)rw}rx(h$X;Finally, you can also add a sequence of steps all at once::ryh%hh.h1h8h\h:}rz(h>]h?]h=]h<]h@]uhCK;hDhhE]r{hUX:Finally, you can also add a sequence of steps all at once:r|r}}r~(h$X:Finally, you can also add a sequence of steps all at once:h%jwubaubj+)r}r(h$Xf.addSteps(all_steps)h%hh.h1h8j.h:}r(j0j1h<]h=]h>]h?]h@]uhCK=hDhhE]rhUXf.addSteps(all_steps)rr}r(h$Uh%jubaubh&)r}r(h$Uh%hh.h1h8hFh:}r(h>]h?]h=]h<]rU attributesrah@]rhauhCK@hDhhE]r(hN)r}r(h$X Attributesrh%jh.h1h8hRh:}r(h>]h?]h=]h<]h@]uhCK@hDhhE]rhUX Attributesrr}r(h$jh%jubaubhY)r}r(h$XTThe following attributes can be set on a build factory after it is created, e.g., ::rh%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKBhDhhE]rhUXQThe following attributes can be set on a build factory after it is created, e.g.,rr}r(h$XQThe following attributes can be set on a build factory after it is created, e.g.,h%jubaubj+)r}r(h$X0f = factory.BuildFactory() f.useProgress = Falseh%jh.h1h8j.h:}r(j0j1h<]h=]h>]h?]h@]uhCKDhDhhE]rhUX0f = factory.BuildFactory() f.useProgress = Falserr}r(h$Uh%jubaubcdocutils.nodes definition_list r)r}r(h$Uh%jh.h1h8Udefinition_listrh:}r(h>]h?]h=]h<]h@]uhCNhDhhE]r(cdocutils.nodes definition_list_item r)r}r(h$X:attr:`useProgress` (defaults to ``True``): if ``True``, the buildmaster keeps track of how long each step takes, so it can provide estimates of how long future builds will take. If builds are not expected to take a consistent amount of time (such as incremental builds in which a random set of files are recompiled or tested each time), this should be set to ``False`` to inhibit progress-tracking. h%jh.h1h8Udefinition_list_itemrh:}r(h>]h?]h=]h<]h@]uhCKMhE]r(cdocutils.nodes term r)r}r(h$X:attr:`useProgress`rh%jh.h1h8Utermrh:}r(h>]h?]h=]h<]h@]uhCKMhE]rh)r}r(h$jh%jh.h1h8hh:}r(UreftypeXattrhhX useProgressU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCKMhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-attrreh=]h<]h@]uh%jhE]rhUX useProgressrr}r(h$Uh%jubah8hjubaubaubcdocutils.nodes definition r)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$X{(defaults to ``True``): if ``True``, the buildmaster keeps track of how long each step takes, so it can provide estimates of how long future builds will take. If builds are not expected to take a consistent amount of time (such as incremental builds in which a random set of files are recompiled or tested each time), this should be set to ``False`` to inhibit progress-tracking.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKHhE]r(hUX (defaults to rr}r(h$X (defaults to h%jubhb)r}r(h$X``True``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXTruerr}r(h$Uh%jubah8hjubhUX): if rr}r(h$X): if h%jubhb)r}r(h$X``True``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXTruerr}r(h$Uh%jubah8hjubhUX1, the buildmaster keeps track of how long each step takes, so it can provide estimates of how long future builds will take. If builds are not expected to take a consistent amount of time (such as incremental builds in which a random set of files are recompiled or tested each time), this should be set to rr}r(h$X1, the buildmaster keeps track of how long each step takes, so it can provide estimates of how long future builds will take. If builds are not expected to take a consistent amount of time (such as incremental builds in which a random set of files are recompiled or tested each time), this should be set to h%jubhb)r}r(h$X ``False``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXFalserr}r(h$Uh%jubah8hjubhUX to inhibit progress-tracking.rr}r(h$X to inhibit progress-tracking.h%jubeubah8U definitionrubeubj)r}r(h$X:attr:`workdir` (defaults to 'build'): workdir given to every build step created by this factory as default. The workdir can be overridden in a build step definition. If this attribute is set to a string, that string will be used for constructing the workdir (buildslave base + builder builddir + workdir). The attribute can also be a Python callable, for more complex cases, as described in :ref:`Factory-Workdir-Functions`. h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCKWhDhhE]r(j)r}r(h$X:attr:`workdir`rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCKWhE]rh)r}r(h$jh%jh.h1h8hh:}r(UreftypeXattrhhXworkdirU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCKWhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-attrreh=]h<]h@]uh%jhE]rhUXworkdirrr}r(h$Uh%jubah8hjubaubaubj)r}r(h$Uh:}r (h>]h?]h=]h<]h@]uh%jhE]r (hY)r }r (h$X(defaults to 'build'): workdir given to every build step created by this factory as default. The workdir can be overridden in a build step definition.r h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKPhE]rhUX(defaults to 'build'): workdir given to every build step created by this factory as default. The workdir can be overridden in a build step definition.rr}r(h$j h%j ubaubhY)r}r(h$XIf this attribute is set to a string, that string will be used for constructing the workdir (buildslave base + builder builddir + workdir). The attribute can also be a Python callable, for more complex cases, as described in :ref:`Factory-Workdir-Functions`.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKThE]r(hUXIf this attribute is set to a string, that string will be used for constructing the workdir (buildslave base + builder builddir + workdir). The attribute can also be a Python callable, for more complex cases, as described in rr}r(h$XIf this attribute is set to a string, that string will be used for constructing the workdir (buildslave base + builder builddir + workdir). The attribute can also be a Python callable, for more complex cases, as described in h%jubh)r}r(h$X :ref:`Factory-Workdir-Functions`rh%jh.h1h8hh:}r(UreftypeXrefhhXfactory-workdir-functionsU refdomainXstdrh<]h=]U refexplicith>]h?]h@]hhuhCKThE]rh)r }r!(h$jh:}r"(h>]h?]r#(hjXstd-refr$eh=]h<]h@]uh%jhE]r%hUXFactory-Workdir-Functionsr&r'}r((h$Uh%j ubah8hubaubhUX.r)}r*(h$X.h%jubeubeh8jubeubeubeubeubh*eubh.h1h8hFh:}r+(h>]h?]h=]h<]r,hah@]r-h auhCKZhDhhE]r.(hN)r/}r0(h$hh%h*h.h1h8hRh:}r1(h<]h=]h>]h?]h@]hAhuhCKZhDhhE]r2hUXPredefined Build Factoriesr3r4}r5(h$hh%j/ubaubhY)r6}r7(h$XBuildbot includes a few predefined build factories that perform common build sequences. In practice, these are rarely used, as every site has slightly different requirements, but the source for these factories may provide examples for implementation of those requirements.r8h%h*h.h1h8h\h:}r9(h>]h?]h=]h<]h@]uhCK\hDhhE]r:hUXBuildbot includes a few predefined build factories that perform common build sequences. In practice, these are rarely used, as every site has slightly different requirements, but the source for these factories may provide examples for implementation of those requirements.r;r<}r=(h$j8h%j6ubaubh5)r>}r?(h$X.. _GNUAutoconf:h%h*h.h1h8h9h:}r@(h>]h?]h=]h<]rAU gnuautoconfrBah@]rChauhCKahDhhE]ubh)rD}rE(h$Uh%h*h.h1h8hh:}rF(h<]h=]h>]h?]h@]h]rG((hX GNUAutoconfUindex-1rHUtrI(hXBuild Factory; GNUAutoconfjHUtrJehuhCKchDhhE]ubh5)rK}rL(h$Uh%h*h.h1h8h9h:}rM(h<]h=]h>]h?]h@]hAjHuhCKfhDhhE]ubh'h&)rN}rO(h$Uh)Kh%h*h.h1h3}h8hFh:}rP(h>]rQXbasicbuildfactoryrRah?]h=]h<]rS(Uindex-2rTUid3rUeh@]uhCKhDhhK}rVjTh5)rW}rX(h$Uh%h'h.h1h8h9h:}rY(h<]h=]h>]h?]h@]hAjTuhCKhDhhE]ubshE]rZ(hN)r[}r\(h$XBasicBuildFactoryr]h%jNh.h1h8hRh:}r^(h>]h?]h=]h<]h@]uhCKhDhhE]r_hUXBasicBuildFactoryr`ra}rb(h$j]h%j[ubaubh)rc}rd(h$Uh%jNh.Nh8hh:}re(h<]h=]h>]h?]h@]Uentries]rf(hX;buildbot.process.factory.BasicBuildFactory (built-in class)h UtrgauhCNhDhhE]ubcsphinx.addnodes desc rh)ri}rj(h$Uh%jNh.Nh8Udescrkh:}rl(UnoindexrmUdomainrnXpyh<]h=]h>]h?]h@]UobjtyperoXclassrpUdesctyperqjpuhCNhDhhE]rr(csphinx.addnodes desc_signature rs)rt}ru(h$X*buildbot.process.factory.BasicBuildFactoryh%jih.h1h8Udesc_signaturervh:}rw(h<]rxh aUmoduleryNh=]h>]h?]h@]rzh aUfullnamer{h Uclassr|Xbuildbot.process.factoryUfirstr}uhCKhDhhE]r~(csphinx.addnodes desc_annotation r)r}r(h$Xclass h%jth.h1h8Udesc_annotationrh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXclass rr}r(h$Uh%jubaubcsphinx.addnodes desc_addname r)r}r(h$Xbuildbot.process.factory.h%jth.h1h8U desc_addnamerh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXbuildbot.process.factory.rr}r(h$Uh%jubaubcsphinx.addnodes desc_name r)r}r(h$XBasicBuildFactoryh%jth.h1h8U desc_namerh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXBasicBuildFactoryrr}r(h$Uh%jubaubeubcsphinx.addnodes desc_content r)r}r(h$Uh%jih.h1h8U desc_contentrh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]ubeubhY)r}r(h$XThis is a subclass of :class:`GNUAutoconf` which assumes the source is in CVS, and uses ``mode='full'`` and ``method='clobber'`` to always build from a clean working copy.h%jNh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKhDhhE]r(hUXThis is a subclass of rr}r(h$XThis is a subclass of h%jubh)r}r(h$X:class:`GNUAutoconf`rh%jh.h1h8hh:}r(UreftypeXclasshhX GNUAutoconfU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCKhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUX GNUAutoconfrr}r(h$Uh%jubah8hjubaubhUX. which assumes the source is in CVS, and uses rr}r(h$X. which assumes the source is in CVS, and uses h%jubhb)r}r(h$X``mode='full'``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX mode='full'rr}r(h$Uh%jubah8hjubhUX and rr}r(h$X and h%jubhb)r}r(h$X``method='clobber'``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXmethod='clobber'rr}r(h$Uh%jubah8hjubhUX, to always build from a clean working copy.rr}r(h$X, to always build from a clean working copy.h%jubeubh5)r}r(h$X .. _BasicSVN:h%jNh.h1h8h9h:}r(h>]h?]h=]h<]rUbasicsvnrah@]rhauhCKhDhhE]ubh)r}r(h$Uh%jNh.h1h8hh:}r(h<]h=]h>]h?]h@]h]r((hXBasicSVNUindex-3rUtr(hXBuild Factory; BasicSVNjUtrehuhCKhDhhE]ubh5)r}r(h$Uh%jNh.h1h8h9h:}r(h<]h=]h>]h?]h@]hAjuhCKhDhhE]ubeubh&)r}r(h$Uh)Kh%h*h.h1h3}h8hFh:}r(h>]rXbasicsvnrah?]h=]h<]r(jUid4reh@]uhCKhDhhK}rjjshE]r(hN)r}r(h$XBasicSVNrh%jh.h1h8hRh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXBasicSVNrr}r(h$jh%jubaubh)r}r(h$Uh%jh.Nh8hh:}r(h<]h=]h>]h?]h@]Uentries]r(hX2buildbot.process.factory.BasicSVN (built-in class)hUtrauhCNhDhhE]ubjh)r}r(h$Uh%jh.Nh8jkh:}r(jmjnXpyh<]h=]h>]h?]h@]joXclassrjqjuhCNhDhhE]r(js)r}r(h$X!buildbot.process.factory.BasicSVNh%jh.h1h8jvh:}r(h<]rhajyNh=]h>]h?]h@]rhaj{hj|Xbuildbot.process.factoryj}uhCKhDhhE]r(j)r}r(h$Xclass h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXclass rr}r(h$Uh%jubaubj)r}r(h$Xbuildbot.process.factory.h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXbuildbot.process.factory.rr }r (h$Uh%jubaubj)r }r (h$XBasicSVNh%jh.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhDhhE]rhUXBasicSVNrr}r(h$Uh%j ubaubeubj)r}r(h$Uh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]ubeubhY)r}r(h$XQThis class is similar to :class:`QuickBuildFactory`, but uses SVN instead of CVS.rh%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKhDhhE]r(hUXThis class is similar to rr}r(h$XThis class is similar to h%jubh)r}r(h$X:class:`QuickBuildFactory`rh%jh.h1h8hh:}r (UreftypeXclasshhXQuickBuildFactoryU refdomainXpyr!h<]h=]U refexplicith>]h?]h@]hhjNjNuhCKhE]r"hb)r#}r$(h$jh:}r%(h>]h?]r&(hj!Xpy-classr'eh=]h<]h@]uh%jhE]r(hUXQuickBuildFactoryr)r*}r+(h$Uh%j#ubah8hjubaubhUX, but uses SVN instead of CVS.r,r-}r.(h$X, but uses SVN instead of CVS.h%jubeubh5)r/}r0(h$X.. _QuickBuildFactory:h%jh.h1h8h9h:}r1(h>]h?]h=]h<]r2Uquickbuildfactoryr3ah@]r4hauhCKhDhhE]ubh)r5}r6(h$Uh%jh.h1h8hh:}r7(h<]h=]h>]h?]h@]h]r8((hXQuickBuildFactoryUindex-4r9Utr:(hX Build Factory; QuickBuildFactoryj9Utr;ehuhCKhDhhE]ubh5)r<}r=(h$Uh%jh.h1h8h9h:}r>(h<]h=]h>]h?]h@]hAj9uhCKhDhhE]ubeubh&)r?}r@(h$Uh)Kh%h*h.h1h3}h8hFh:}rA(h>]rBXquickbuildfactoryrCah?]h=]h<]rD(j9Uid5rEeh@]uhCKhDhhK}rFj9j<shE]rG(hN)rH}rI(h$XQuickBuildFactoryrJh%j?h.h1h8hRh:}rK(h>]h?]h=]h<]h@]uhCKhDhhE]rLhUXQuickBuildFactoryrMrN}rO(h$jJh%jHubaubh)rP}rQ(h$Uh%j?h.Nh8hh:}rR(h<]h=]h>]h?]h@]Uentries]rS(hX;buildbot.process.factory.QuickBuildFactory (built-in class)hUtrTauhCNhDhhE]ubjh)rU}rV(h$Uh%j?h.Nh8jkh:}rW(jmjnXpyh<]h=]h>]h?]h@]joXclassrXjqjXuhCNhDhhE]rY(js)rZ}r[(h$X*buildbot.process.factory.QuickBuildFactoryh%jUh.h1h8jvh:}r\(h<]r]hajyNh=]h>]h?]h@]r^haj{hj|Xbuildbot.process.factoryj}uhCKhDhhE]r_(j)r`}ra(h$Xclass h%jZh.h1h8jh:}rb(h>]h?]h=]h<]h@]uhCKhDhhE]rchUXclass rdre}rf(h$Uh%j`ubaubj)rg}rh(h$Xbuildbot.process.factory.h%jZh.h1h8jh:}ri(h>]h?]h=]h<]h@]uhCKhDhhE]rjhUXbuildbot.process.factory.rkrl}rm(h$Uh%jgubaubj)rn}ro(h$XQuickBuildFactoryh%jZh.h1h8jh:}rp(h>]h?]h=]h<]h@]uhCKhDhhE]rqhUXQuickBuildFactoryrrrs}rt(h$Uh%jnubaubeubj)ru}rv(h$Uh%jUh.h1h8jh:}rw(h>]h?]h=]h<]h@]uhCKhDhhE]ubeubhY)rx}ry(h$XThe :class:`QuickBuildFactory` class is a subclass of :class:`GNUAutoconf` which assumes the source is in CVS, and uses ``mode='incremental'`` to get incremental updates.h%j?h.h1h8h\h:}rz(h>]h?]h=]h<]h@]uhCKhDhhE]r{(hUXThe r|r}}r~(h$XThe h%jxubh)r}r(h$X:class:`QuickBuildFactory`rh%jxh.h1h8hh:}r(UreftypeXclasshhXQuickBuildFactoryU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCKhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUXQuickBuildFactoryrr}r(h$Uh%jubah8hjubaubhUX class is a subclass of rr}r(h$X class is a subclass of h%jxubh)r}r(h$X:class:`GNUAutoconf`rh%jxh.h1h8hh:}r(UreftypeXclasshhX GNUAutoconfU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCKhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUX GNUAutoconfrr}r(h$Uh%jubah8hjubaubhUX. which assumes the source is in CVS, and uses rr}r(h$X. which assumes the source is in CVS, and uses h%jxubhb)r}r(h$X``mode='incremental'``h:}r(h>]h?]h=]h<]h@]uh%jxhE]rhUXmode='incremental'rr}r(h$Uh%jubah8hjubhUX to get incremental updates.rr}r(h$X to get incremental updates.h%jxubeubhY)r}r(h$X0The difference between a `full build` and a `quick build` is that quick builds are generally done incrementally, starting with the tree where the previous build was performed. That simply means that the source-checkout step should be given a ``mode='incremental'`` flag, to do the source update in-place.h%j?h.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKhDhhE]r(hUXThe difference between a rr}r(h$XThe difference between a h%jubcdocutils.nodes title_reference r)r}r(h$X `full build`h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX full buildrr}r(h$Uh%jubah8Utitle_referencerubhUX and a rr}r(h$X and a h%jubj)r}r(h$X `quick build`h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX quick buildrr}r(h$Uh%jubah8jubhUX is that quick builds are generally done incrementally, starting with the tree where the previous build was performed. That simply means that the source-checkout step should be given a rr}r(h$X is that quick builds are generally done incrementally, starting with the tree where the previous build was performed. That simply means that the source-checkout step should be given a h%jubhb)r}r(h$X``mode='incremental'``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXmode='incremental'rr}r(h$Uh%jubah8hjubhUX( flag, to do the source update in-place.rr}r(h$X( flag, to do the source update in-place.h%jubeubhY)r}r(h$X2In addition to that, this class sets the :attr:`useProgress` flag to ``False``. Incremental builds will (or at least the ought to) compile as few files as necessary, so they will take an unpredictable amount of time to run. Therefore it would be misleading to claim to predict how long the build will take.h%j?h.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKhDhhE]r(hUX)In addition to that, this class sets the rr}r(h$X)In addition to that, this class sets the h%jubh)r}r(h$X:attr:`useProgress`rh%jh.h1h8hh:}r(UreftypeXattrhhX useProgressU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCKhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-attrreh=]h<]h@]uh%jhE]rhUX useProgressrr}r(h$Uh%jubah8hjubaubhUX flag to rr}r(h$X flag to h%jubhb)r}r(h$X ``False``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXFalserr}r(h$Uh%jubah8hjubhUX. Incremental builds will (or at least the ought to) compile as few files as necessary, so they will take an unpredictable amount of time to run. Therefore it would be misleading to claim to predict how long the build will take.rr}r(h$X. Incremental builds will (or at least the ought to) compile as few files as necessary, so they will take an unpredictable amount of time to run. Therefore it would be misleading to claim to predict how long the build will take.h%jubeubhY)r}r(h$X2This class is probably not of use to new projects.rh%j?h.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUX2This class is probably not of use to new projects.rr}r(h$jh%jubaubh5)r}r(h$X.. _Factory-CPAN:h%j?h.h1h8h9h:}r(h>]h?]h=]h<]rU factory-cpanrah@]rhauhCKhDhhE]ubh)r}r(h$Uh%j?h.h1h8hh:}r(h<]h=]h>]h?]h@]h]r((hXCPANUindex-5r Utr (hXBuild Factory; CPANj Utr ehuhCKhDhhE]ubh5)r }r (h$Uh%j?h.h1h8h9h:}r(h<]h=]h>]h?]h@]hAj uhCKhDhhE]ubeubh&)r}r(h$Uh)Kh%h*h.h1h3}h8hFh:}r(h>]rXcpanrah?]h=]h<]r(Ucpanrj eh@]uhCKhDhhK}rj j shE]r(hN)r}r(h$XCPANrh%jh.h1h8hRh:}r(h>]h?]h=]h<]h@]uhCKhDhhE]rhUXCPANrr}r(h$jh%jubaubh)r }r!(h$Uh%jh.Nh8hh:}r"(h<]h=]h>]h?]h@]Uentries]r#(hX.buildbot.process.factory.CPAN (built-in class)hUtr$auhCNhDhhE]ubjh)r%}r&(h$Uh%jh.Nh8jkh:}r'(jmjnXpyh<]h=]h>]h?]h@]joXclassr(jqj(uhCNhDhhE]r)(js)r*}r+(h$Xbuildbot.process.factory.CPANh%j%h.h1h8jvh:}r,(h<]r-hajyNh=]h>]h?]h@]r.haj{hj|Xbuildbot.process.factoryj}uhCKhDhhE]r/(j)r0}r1(h$Xclass h%j*h.h1h8jh:}r2(h>]h?]h=]h<]h@]uhCKhDhhE]r3hUXclass r4r5}r6(h$Uh%j0ubaubj)r7}r8(h$Xbuildbot.process.factory.h%j*h.h1h8jh:}r9(h>]h?]h=]h<]h@]uhCKhDhhE]r:hUXbuildbot.process.factory.r;r<}r=(h$Uh%j7ubaubj)r>}r?(h$XCPANh%j*h.h1h8jh:}r@(h>]h?]h=]h<]h@]uhCKhDhhE]rAhUXCPANrBrC}rD(h$Uh%j>ubaubeubj)rE}rF(h$Uh%j%h.h1h8jh:}rG(h>]h?]h=]h<]h@]uhCKhDhhE]ubeubhY)rH}rI(h$XMost Perl modules available from the `CPAN `_ archive use the ``MakeMaker`` module to provide configuration, build, and test services. The standard build routine for these modules looks like:h%jh.h1h8h\h:}rJ(h>]h?]h=]h<]h@]uhCKhDhhE]rK(hUX%Most Perl modules available from the rLrM}rN(h$X%Most Perl modules available from the h%jHubh)rO}rP(h$X`CPAN `_h:}rQ(UnameXCPANUrefurirRXhttp://www.cpan.org/rSh<]h=]h>]h?]h@]uh%jHhE]rThUXCPANrUrV}rW(h$Uh%jOubah8hubh5)rX}rY(h$X h)Kh%jHh8h9h:}rZ(UrefurijSh<]r[Uid6r\ah=]h>]h?]h@]r]jauhE]ubhUX archive use the r^r_}r`(h$X archive use the h%jHubhb)ra}rb(h$X ``MakeMaker``h:}rc(h>]h?]h=]h<]h@]uh%jHhE]rdhUX MakeMakerrerf}rg(h$Uh%jaubah8hjubhUXt module to provide configuration, build, and test services. The standard build routine for these modules looks like:rhri}rj(h$Xt module to provide configuration, build, and test services. The standard build routine for these modules looks like:h%jHubeubj+)rk}rl(h$X4% perl Makefile.PL % make % make test # make installh%jh.h1h8j.h:}rm(UlinenosrnUlanguageroXbashj0j1h<]h=]h>]h?]h@]uhCKhDhhE]rphUX4% perl Makefile.PL % make % make test # make installrqrr}rs(h$Uh%jkubaubhY)rt}ru(h$X.(except again Buildbot skips the install step)rvh%jh.h1h8h\h:}rw(h>]h?]h=]h<]h@]uhCMhDhhE]rxhUX.(except again Buildbot skips the install step)ryrz}r{(h$jvh%jtubaubhY)r|}r}(h$XMBuildbot provides a :class:`CPAN` factory to compile and test these projects.h%jh.h1h8h\h:}r~(h>]h?]h=]h<]h@]uhCMhDhhE]r(hUXBuildbot provides a rr}r(h$XBuildbot provides a h%j|ubh)r}r(h$X :class:`CPAN`rh%j|h.h1h8hh:}r(UreftypeXclasshhXCPANU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCMhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUXCPANrr}r(h$Uh%jubah8hjubaubhUX, factory to compile and test these projects.rr}r(h$X, factory to compile and test these projects.h%j|ubeubhY)r}r(h$X Arguments:rh%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM hDhhE]rhUX Arguments:rr}r(h$jh%jubaubj)r}r(h$Uh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCNhDhhE]r(j)r}r(h$X[``source`` (required): A step specification tuple, like that used by :class:`GNUAutoconf`. h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM hE]r(j)r}r(h$X ``source``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM hE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXsourcerr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$XO(required): A step specification tuple, like that used by :class:`GNUAutoconf`.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM hE]r(hUX:(required): A step specification tuple, like that used by rr}r(h$X:(required): A step specification tuple, like that used by h%jubh)r}r(h$X:class:`GNUAutoconf`rh%jh.h1h8hh:}r(UreftypeXclasshhX GNUAutoconfU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCM hE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUX GNUAutoconfrr}r(h$Uh%jubah8hjubaubhUX.r}r(h$X.h%jubeubah8jubeubj)r}r(h$Xk``perl`` A string which specifies the :command:`perl` executable to use. Defaults to just :command:`perl`. h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhDhhE]r(j)r}r(h$X``perl``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXperlrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$XaA string which specifies the :command:`perl` executable to use. Defaults to just :command:`perl`.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCMhE]r(hUXA string which specifies the rr}r(h$XA string which specifies the h%jubcdocutils.nodes strong r)r}r(h$X:command:`perl`h:}r(h>]h?]rUcommandrah=]h<]h@]uh%jhE]rhUXperlrr}r(h$Uh%jubah8UstrongrubhUX% executable to use. Defaults to just rr}r(h$X% executable to use. Defaults to just h%jubj)r}r(h$X:command:`perl`h:}r(h>]h?]rjah=]h<]h@]uh%jhE]rhUXperlrr}r(h$Uh%jubah8jubhUX.r}r(h$X.h%jubeubah8jubeubeubh5)r}r(h$X.. _Distutils:h%jh.h1h8h9h:}r(h>]h?]h=]h<]rU distutilsrah@]rhauhCMhDhhE]ubh)r}r(h$Uh%jh.h1h8hh:}r(h<]h=]h>]h?]h@]h]r ((hX DistutilsUindex-6r Utr (hXBuild Factory; Distutilsj Utr ehuhCMhDhhE]ubh5)r }r(h$Uh%jh.h1h8h9h:}r(h<]h=]h>]h?]h@]hAj uhCMhDhhE]ubeubh&)r}r(h$Uh)Kh%h*h.h1h3}h8hFh:}r(h>]rX distutilsrah?]h=]h<]r(j Uid7reh@]uhCMhDhhK}rj j shE]r(hN)r}r(h$X Distutilsrh%jh.h1h8hRh:}r(h>]h?]h=]h<]h@]uhCMhDhhE]rhUX Distutilsrr}r (h$jh%jubaubh)r!}r"(h$Uh%jh.Nh8hh:}r#(h<]h=]h>]h?]h@]Uentries]r$(hX3buildbot.process.factory.Distutils (built-in class)hUtr%auhCNhDhhE]ubjh)r&}r'(h$Uh%jh.Nh8jkh:}r((jmjnXpyh<]h=]h>]h?]h@]joXclassr)jqj)uhCNhDhhE]r*(js)r+}r,(h$X"buildbot.process.factory.Distutilsh%j&h.h1h8jvh:}r-(h<]r.hajyNh=]h>]h?]h@]r/haj{hj|Xbuildbot.process.factoryj}uhCMhDhhE]r0(j)r1}r2(h$Xclass h%j+h.h1h8jh:}r3(h>]h?]h=]h<]h@]uhCMhDhhE]r4hUXclass r5r6}r7(h$Uh%j1ubaubj)r8}r9(h$Xbuildbot.process.factory.h%j+h.h1h8jh:}r:(h>]h?]h=]h<]h@]uhCMhDhhE]r;hUXbuildbot.process.factory.r<r=}r>(h$Uh%j8ubaubj)r?}r@(h$X Distutilsh%j+h.h1h8jh:}rA(h>]h?]h=]h<]h@]uhCMhDhhE]rBhUX DistutilsrCrD}rE(h$Uh%j?ubaubeubj)rF}rG(h$Uh%j&h.h1h8jh:}rH(h>]h?]h=]h<]h@]uhCMhDhhE]ubeubhY)rI}rJ(h$XMost Python modules use the ``distutils`` package to provide configuration and build services. The standard build process looks like:h%jh.h1h8h\h:}rK(h>]h?]h=]h<]h@]uhCMhDhhE]rL(hUXMost Python modules use the rMrN}rO(h$XMost Python modules use the h%jIubhb)rP}rQ(h$X ``distutils``h:}rR(h>]h?]h=]h<]h@]uh%jIhE]rShUX distutilsrTrU}rV(h$Uh%jPubah8hjubhUX\ package to provide configuration and build services. The standard build process looks like:rWrX}rY(h$X\ package to provide configuration and build services. The standard build process looks like:h%jIubeubj+)rZ}r[(h$X5% python ./setup.py build % python ./setup.py installh%jh.h1h8j.h:}r\(jnjoXbashj0j1h<]h=]h>]h?]h@]uhCM!hDhhE]r]hUX5% python ./setup.py build % python ./setup.py installr^r_}r`(h$Uh%jZubaubhY)ra}rb(h$XUnfortunately, although Python provides a standard unit-test framework named ``unittest``, to the best of my knowledge ``distutils`` does not provide a standardized target to run such unit tests. (Please let me know if I'm wrong, and I will update this factory.)h%jh.h1h8h\h:}rc(h>]h?]h=]h<]h@]uhCM&hDhhE]rd(hUXMUnfortunately, although Python provides a standard unit-test framework named rerf}rg(h$XMUnfortunately, although Python provides a standard unit-test framework named h%jaubhb)rh}ri(h$X ``unittest``h:}rj(h>]h?]h=]h<]h@]uh%jahE]rkhUXunittestrlrm}rn(h$Uh%jhubah8hjubhUX, to the best of my knowledge rorp}rq(h$X, to the best of my knowledge h%jaubhb)rr}rs(h$X ``distutils``h:}rt(h>]h?]h=]h<]h@]uh%jahE]ruhUX distutilsrvrw}rx(h$Uh%jrubah8hjubhUX does not provide a standardized target to run such unit tests. (Please let me know if I'm wrong, and I will update this factory.)ryrz}r{(h$X does not provide a standardized target to run such unit tests. (Please let me know if I'm wrong, and I will update this factory.)h%jaubeubhY)r|}r}(h$XThe :class:`Distutils` factory provides support for running the build part of this process. It accepts the same ``source=`` parameter as the other build factories.h%jh.h1h8h\h:}r~(h>]h?]h=]h<]h@]uhCM+hDhhE]r(hUXThe rr}r(h$XThe h%j|ubh)r}r(h$X:class:`Distutils`rh%j|h.h1h8hh:}r(UreftypeXclasshhX DistutilsU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCM+hE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUX Distutilsrr}r(h$Uh%jubah8hjubaubhUXZ factory provides support for running the build part of this process. It accepts the same rr}r(h$XZ factory provides support for running the build part of this process. It accepts the same h%j|ubhb)r}r(h$X ``source=``h:}r(h>]h?]h=]h<]h@]uh%j|hE]rhUXsource=rr}r(h$Uh%jubah8hjubhUX( parameter as the other build factories.rr}r(h$X( parameter as the other build factories.h%j|ubeubhY)r}r(h$X Arguments:rh%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM/hDhhE]rhUX Arguments:rr}r(h$jh%jubaubj)r}r(h$Uh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCNhDhhE]r(j)r}r(h$X[``source`` (required): A step specification tuple, like that used by :class:`GNUAutoconf`. h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM2hE]r(j)r}r(h$X ``source``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM2hE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXsourcerr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$XO(required): A step specification tuple, like that used by :class:`GNUAutoconf`.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM2hE]r(hUX:(required): A step specification tuple, like that used by rr}r(h$X:(required): A step specification tuple, like that used by h%jubh)r}r(h$X:class:`GNUAutoconf`rh%jh.h1h8hh:}r(UreftypeXclasshhX GNUAutoconfU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCM2hE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUX GNUAutoconfrr}r(h$Uh%jubah8hjubaubhUX.r}r(h$X.h%jubeubah8jubeubj)r}r(h$Xq``python`` A string which specifies the :command:`python` executable to use. Defaults to just :command:`python`. h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM6hDhhE]r(j)r}r(h$X ``python``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM6hE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXpythonrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$XeA string which specifies the :command:`python` executable to use. Defaults to just :command:`python`.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM5hE]r(hUXA string which specifies the rr}r(h$XA string which specifies the h%jubj)r}r(h$X:command:`python`h:}r(h>]h?]rjah=]h<]h@]uh%jhE]rhUXpythonrr}r(h$Uh%jubah8jubhUX% executable to use. Defaults to just rr}r(h$X% executable to use. Defaults to just h%jubj)r}r(h$X:command:`python`h:}r(h>]h?]rjah=]h<]h@]uh%jhE]rhUXpythonrr}r(h$Uh%jubah8jubhUX.r}r(h$X.h%jubeubah8jubeubj)r}r(h$X``test`` Provides a shell command which runs unit tests. This accepts either a string or a list. The default value is ``None``, which disables the test step (since there is no common default command to run unit tests in distutils modules). h%jh.h1h8jh:}r (h>]h?]h=]h<]h@]uhCM<hDhhE]r (j)r }r (h$X``test``r h%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCM<hE]rhb)r}r(h$j h:}r(h>]h?]h=]h<]h@]uh%j hE]rhUXtestrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$XProvides a shell command which runs unit tests. This accepts either a string or a list. The default value is ``None``, which disables the test step (since there is no common default command to run unit tests in distutils modules).h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM9hE]r(hUXmProvides a shell command which runs unit tests. This accepts either a string or a list. The default value is rr }r!(h$XmProvides a shell command which runs unit tests. This accepts either a string or a list. The default value is h%jubhb)r"}r#(h$X``None``h:}r$(h>]h?]h=]h<]h@]uh%jhE]r%hUXNoner&r'}r((h$Uh%j"ubah8hjubhUXq, which disables the test step (since there is no common default command to run unit tests in distutils modules).r)r*}r+(h$Xq, which disables the test step (since there is no common default command to run unit tests in distutils modules).h%jubeubah8jubeubeubh5)r,}r-(h$X .. _Trial:h%jh.h1h8h9h:}r.(h>]h?]h=]h<]r/Utrialr0ah@]r1hauhCM>hDhhE]ubh)r2}r3(h$Uh%jh.h1h8hh:}r4(h<]h=]h>]h?]h@]h]r5((hXTrialUindex-7r6Utr7(hXBuild Factory; Trialj6Utr8ehuhCM@hDhhE]ubh5)r9}r:(h$Uh%jh.h1h8h9h:}r;(h<]h=]h>]h?]h@]hAj6uhCMChDhhE]ubeubh&)r<}r=(h$Uh)Kh%h*h.h1h3}h8hFh:}r>(h>]r?Xtrialr@ah?]h=]h<]rA(j6Uid8rBeh@]uhCMEhDhhK}rCj6j9shE]rD(hN)rE}rF(h$XTrialrGh%j<h.h1h8hRh:}rH(h>]h?]h=]h<]h@]uhCMEhDhhE]rIhUXTrialrJrK}rL(h$jGh%jEubaubh)rM}rN(h$Uh%j<h.Nh8hh:}rO(h<]h=]h>]h?]h@]Uentries]rP(hX/buildbot.process.factory.Trial (built-in class)hUtrQauhCNhDhhE]ubjh)rR}rS(h$Uh%j<h.Nh8jkh:}rT(jmjnXpyh<]h=]h>]h?]h@]joXclassrUjqjUuhCNhDhhE]rV(js)rW}rX(h$Xbuildbot.process.factory.Trialh%jRh.h1h8jvh:}rY(h<]rZhajyNh=]h>]h?]h@]r[haj{hj|Xbuildbot.process.factoryj}uhCMHhDhhE]r\(j)r]}r^(h$Xclass h%jWh.h1h8jh:}r_(h>]h?]h=]h<]h@]uhCMHhDhhE]r`hUXclass rarb}rc(h$Uh%j]ubaubj)rd}re(h$Xbuildbot.process.factory.h%jWh.h1h8jh:}rf(h>]h?]h=]h<]h@]uhCMHhDhhE]rghUXbuildbot.process.factory.rhri}rj(h$Uh%jdubaubj)rk}rl(h$XTrialh%jWh.h1h8jh:}rm(h>]h?]h=]h<]h@]uhCMHhDhhE]rnhUXTrialrorp}rq(h$Uh%jkubaubeubj)rr}rs(h$Uh%jRh.h1h8jh:}rt(h>]h?]h=]h<]h@]uhCMHhDhhE]ubeubhY)ru}rv(h$XPTwisted provides a unit test tool named :command:`trial` which provides a few improvements over Python's built-in :mod:`unittest` module. Many python projects which use Twisted for their networking or application services also use trial for their unit tests. These modules are usually built and tested with something like the following:h%j<h.h1h8h\h:}rw(h>]h?]h=]h<]h@]uhCMIhDhhE]rx(hUX(Twisted provides a unit test tool named ryrz}r{(h$X(Twisted provides a unit test tool named h%juubj)r|}r}(h$X:command:`trial`h:}r~(h>]h?]rjah=]h<]h@]uh%juhE]rhUXtrialrr}r(h$Uh%j|ubah8jubhUX: which provides a few improvements over Python's built-in rr}r(h$X: which provides a few improvements over Python's built-in h%juubh)r}r(h$X:mod:`unittest`rh%juh.h1h8hh:}r(UreftypeXmodhhXunittestU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCMIhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-modreh=]h<]h@]uh%jhE]rhUXunittestrr}r(h$Uh%jubah8hjubaubhUX module. Many python projects which use Twisted for their networking or application services also use trial for their unit tests. These modules are usually built and tested with something like the following:rr}r(h$X module. Many python projects which use Twisted for their networking or application services also use trial for their unit tests. These modules are usually built and tested with something like the following:h%juubeubj+)r}r(h$Xu% python ./setup.py build % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test % python ./setup.py installh%j<h.h1h8j.h:}r(jnjoXbashj0j1h<]h=]h>]h?]h@]uhCMOhDhhE]rhUXu% python ./setup.py build % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test % python ./setup.py installrr}r(h$Uh%jubaubhY)r}r(h$X@Unfortunately, the :file:`build/lib` directory into which the built/copied ``.py`` files are placed is actually architecture-dependent, and I do not yet know of a simple way to calculate its value. For many projects it is sufficient to import their libraries `in place` from the tree's base directory (``PYTHONPATH=.``).h%j<h.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCMUhDhhE]r(hUXUnfortunately, the rr}r(h$XUnfortunately, the h%jubhb)r}r(h$Uh:}r(h<]h=]h>]h?]rXfileraUrolejh@]uh%jhE]rhUX build/librr}r(h$X build/libh%jubah8hjubhUX' directory into which the built/copied rr}r(h$X' directory into which the built/copied h%jubhb)r}r(h$X``.py``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX.pyrr}r(h$Uh%jubah8hjubhUX files are placed is actually architecture-dependent, and I do not yet know of a simple way to calculate its value. For many projects it is sufficient to import their libraries rr}r(h$X files are placed is actually architecture-dependent, and I do not yet know of a simple way to calculate its value. For many projects it is sufficient to import their libraries h%jubj)r}r(h$X `in place`h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXin placerr}r(h$Uh%jubah8jubhUX! from the tree's base directory (rr}r(h$X! from the tree's base directory (h%jubhb)r}r(h$X``PYTHONPATH=.``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX PYTHONPATH=.rr}r(h$Uh%jubah8hjubhUX).rr}r(h$X).h%jubeubhY)r}r(h$XZIn addition, the :samp:`{PROJECTNAME}` value where the test files are located is project-dependent: it is usually just the project's top-level library directory, as common practice suggests the unit test files are put in the :mod:`test` sub-module. This value cannot be guessed, the :class:`Trial` class must be told where to find the test files.h%j<h.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM[hDhhE]r(hUXIn addition, the rr}r(h$XIn addition, the h%jubhb)r}r(h$Uh:}r(h<]h=]h>]h?]rXsampraUrolejh@]uh%jhE]rh)r}r(h$X PROJECTNAMEh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX PROJECTNAMErr}r(h$Uh%jubah8hubah8hjubhUX value where the test files are located is project-dependent: it is usually just the project's top-level library directory, as common practice suggests the unit test files are put in the rr}r(h$X value where the test files are located is project-dependent: it is usually just the project's top-level library directory, as common practice suggests the unit test files are put in the h%jubh)r}r(h$X :mod:`test`rh%jh.h1h8hh:}r(UreftypeXmodhhXtestU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCM[hE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-modreh=]h<]h@]uh%jhE]rhUXtestrr}r(h$Uh%jubah8hjubaubhUX/ sub-module. This value cannot be guessed, the rr}r(h$X/ sub-module. This value cannot be guessed, the h%jubh)r}r(h$X:class:`Trial`rh%jh.h1h8hh:}r(UreftypeXclasshhXTrialU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCM[hE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUXTrialrr}r(h$Uh%jubah8hjubaubhUX1 class must be told where to find the test files.r r }r (h$X1 class must be told where to find the test files.h%jubeubhY)r }r (h$XThe :class:`Trial` class provides support for building and testing projects which use distutils and trial. If the test module name is specified, trial will be invoked. The library path used for testing can also be set.h%j<h.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCMbhDhhE]r(hUXThe rr}r(h$XThe h%j ubh)r}r(h$X:class:`Trial`rh%j h.h1h8hh:}r(UreftypeXclasshhXTrialU refdomainXpyrh<]h=]U refexplicith>]h?]h@]hhjNjNuhCMbhE]rhb)r}r(h$jh:}r(h>]h?]r(hjXpy-classreh=]h<]h@]uh%jhE]rhUXTrialrr }r!(h$Uh%jubah8hjubaubhUX class provides support for building and testing projects which use distutils and trial. If the test module name is specified, trial will be invoked. The library path used for testing can also be set.r"r#}r$(h$X class provides support for building and testing projects which use distutils and trial. If the test module name is specified, trial will be invoked. The library path used for testing can also be set.h%j ubeubhY)r%}r&(h$X0One advantage of trial is that the Buildbot happens to know how to parse trial output, letting it identify which tests passed and which ones failed. The Buildbot can then provide fine-grained reports about how many tests have failed, when individual tests fail when they had been passing previously, etc.r'h%j<h.h1h8h\h:}r((h>]h?]h=]h<]h@]uhCMghDhhE]r)hUX0One advantage of trial is that the Buildbot happens to know how to parse trial output, letting it identify which tests passed and which ones failed. The Buildbot can then provide fine-grained reports about how many tests have failed, when individual tests fail when they had been passing previously, etc.r*r+}r,(h$j'h%j%ubaubhY)r-}r.(h$XmAnother feature of trial is that you can give it a series of source ``.py`` files, and it will search them for special ``test-case-name`` tags that indicate which test cases provide coverage for that file. Trial can then run just the appropriate tests. This is useful for quick builds, where you want to only run the test cases that cover the changed functionality.h%j<h.h1h8h\h:}r/(h>]h?]h=]h<]h@]uhCMmhDhhE]r0(hUXDAnother feature of trial is that you can give it a series of source r1r2}r3(h$XDAnother feature of trial is that you can give it a series of source h%j-ubhb)r4}r5(h$X``.py``h:}r6(h>]h?]h=]h<]h@]uh%j-hE]r7hUX.pyr8r9}r:(h$Uh%j4ubah8hjubhUX, files, and it will search them for special r;r<}r=(h$X, files, and it will search them for special h%j-ubhb)r>}r?(h$X``test-case-name``h:}r@(h>]h?]h=]h<]h@]uh%j-hE]rAhUXtest-case-namerBrC}rD(h$Uh%j>ubah8hjubhUX tags that indicate which test cases provide coverage for that file. Trial can then run just the appropriate tests. This is useful for quick builds, where you want to only run the test cases that cover the changed functionality.rErF}rG(h$X tags that indicate which test cases provide coverage for that file. Trial can then run just the appropriate tests. This is useful for quick builds, where you want to only run the test cases that cover the changed functionality.h%j-ubeubhY)rH}rI(h$X Arguments:rJh%j<h.h1h8h\h:}rK(h>]h?]h=]h<]h@]uhCMthDhhE]rLhUX Arguments:rMrN}rO(h$jJh%jHubaubj)rP}rQ(h$Uh%j<h.h1h8jh:}rR(h>]h?]h=]h<]h@]uhCNhDhhE]rS(j)rT}rU(h$X.``testpath`` Provides a directory to add to :envvar:`PYTHONPATH` when running the unit tests, if tests are being run. Defaults to ``.`` to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be :file:`build/lib` for pure-python modules. h%jPh.h1h8jh:}rV(h>]h?]h=]h<]h@]uhCM{hE]rW(j)rX}rY(h$X ``testpath``rZh%jTh.h1h8jh:}r[(h>]h?]h=]h<]h@]uhCM{hE]r\hb)r]}r^(h$jZh:}r_(h>]h?]h=]h<]h@]uh%jXhE]r`hUXtestpathrarb}rc(h$Uh%j]ubah8hjubaubj)rd}re(h$Uh:}rf(h>]h?]h=]h<]h@]uh%jThE]rghY)rh}ri(h$X Provides a directory to add to :envvar:`PYTHONPATH` when running the unit tests, if tests are being run. Defaults to ``.`` to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be :file:`build/lib` for pure-python modules.h%jdh.h1h8h\h:}rj(h>]h?]h=]h<]h@]uhCMwhE]rk(hUXProvides a directory to add to rlrm}rn(h$XProvides a directory to add to h%jhubh)ro}rp(h$Uh:}rq(h<]h=]h>]h?]h@]h]rr((hX PYTHONPATHrsUindex-8rtUtru(hX environment variable; PYTHONPATHjtUtrveuh%jhhE]h8hubh5)rw}rx(h$Uh:}ry(h>]h?]h=]h<]rzjtah@]uh%jhhE]h8h9ubh)r{}r|(h$X:envvar:`PYTHONPATH`r}h%jhh.h1h8hh:}r~(UreftypeXenvvarhhjsU refdomainXstdrh<]h=]U refexplicith>]h?]h@]hhuhCMwhE]rhb)r}r(h$j}h:}r(h>]h?]r(hjX std-envvarreh=]h<]h@]uh%j{hE]rhUX PYTHONPATHrr}r(h$Uh%jubah8hjubaubhUXB when running the unit tests, if tests are being run. Defaults to rr}r(h$XB when running the unit tests, if tests are being run. Defaults to h%jhubhb)r}r(h$X``.``h:}r(h>]h?]h=]h<]h@]uh%jhhE]rhUX.r}r(h$Uh%jubah8hjubhUX| to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be rr}r(h$X| to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be h%jhubhb)r}r(h$Uh:}r(h<]h=]h>]h?]rXfileraUrolejh@]uh%jhhE]rhUX build/librr}r(h$X build/libh%jubah8hjubhUX for pure-python modules.rr}r(h$X for pure-python modules.h%jhubeubah8jubeubj)r}r(h$X``python`` which Python executable to use. This list will form the start of the `argv` array that will launch trial. If you use this, you should set ``trial`` to an explicit path (like :file:`/usr/bin/trial` or :file:`./bin/trial`). The parameter defaults to ``None``, which leaves it out entirely (running ``trial args`` instead of ``python ./bin/trial args``). Likely values are ``['python']``, ``['python2.2']``, or ``['python', '-Wall']``. h%jPh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhDhhE]r(j)r}r(h$X ``python``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXpythonrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$Xwhich Python executable to use. This list will form the start of the `argv` array that will launch trial. If you use this, you should set ``trial`` to an explicit path (like :file:`/usr/bin/trial` or :file:`./bin/trial`). The parameter defaults to ``None``, which leaves it out entirely (running ``trial args`` instead of ``python ./bin/trial args``). Likely values are ``['python']``, ``['python2.2']``, or ``['python', '-Wall']``.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCM~hE]r(hUXEwhich Python executable to use. This list will form the start of the rr}r(h$XEwhich Python executable to use. This list will form the start of the h%jubj)r}r(h$X`argv`h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXargvrr}r(h$Uh%jubah8jubhUX? array that will launch trial. If you use this, you should set rr}r(h$X? array that will launch trial. If you use this, you should set h%jubhb)r}r(h$X ``trial``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXtrialrr}r(h$Uh%jubah8hjubhUX to an explicit path (like rr}r(h$X to an explicit path (like h%jubhb)r}r(h$Uh:}r(h<]h=]h>]h?]rXfileraUrolejh@]uh%jhE]rhUX/usr/bin/trialrr}r(h$X/usr/bin/trialh%jubah8hjubhUX or rr}r(h$X or h%jubhb)r}r(h$Uh:}r(h<]h=]h>]h?]rXfileraUrolejh@]uh%jhE]rhUX ./bin/trialrr}r(h$X ./bin/trialh%jubah8hjubhUX). The parameter defaults to rr}r(h$X). The parameter defaults to h%jubhb)r}r(h$X``None``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXNonerr}r(h$Uh%jubah8hjubhUX(, which leaves it out entirely (running rr}r(h$X(, which leaves it out entirely (running h%jubhb)r}r(h$X``trial args``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX trial argsrr}r(h$Uh%jubah8hjubhUX instead of rr}r(h$X instead of h%jubhb)r}r(h$X``python ./bin/trial args``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXpython ./bin/trial argsrr}r(h$Uh%jubah8hjubhUX). Likely values are rr}r(h$X). Likely values are h%jubhb)r}r(h$X``['python']``h:}r (h>]h?]h=]h<]h@]uh%jhE]r hUX ['python']r r }r (h$Uh%jubah8hjubhUX, rr}r(h$X, h%jubhb)r}r(h$X``['python2.2']``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX ['python2.2']rr}r(h$Uh%jubah8hjubhUX, or rr}r(h$X, or h%jubhb)r}r(h$X``['python', '-Wall']``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX['python', '-Wall']rr }r!(h$Uh%jubah8hjubhUX.r"}r#(h$X.h%jubeubah8jubeubj)r$}r%(h$X``trial`` provides the name of the :command:`trial` command. It is occasionally useful to use an alternate executable, such as :command:`trial2.2` which might run the tests under an older version of Python. Defaults to :command:`trial`. h%jPh.h1h8jh:}r&(h>]h?]h=]h<]h@]uhCMhDhhE]r'(j)r(}r)(h$X ``trial``r*h%j$h.h1h8jh:}r+(h>]h?]h=]h<]h@]uhCMhE]r,hb)r-}r.(h$j*h:}r/(h>]h?]h=]h<]h@]uh%j(hE]r0hUXtrialr1r2}r3(h$Uh%j-ubah8hjubaubj)r4}r5(h$Uh:}r6(h>]h?]h=]h<]h@]uh%j$hE]r7hY)r8}r9(h$Xprovides the name of the :command:`trial` command. It is occasionally useful to use an alternate executable, such as :command:`trial2.2` which might run the tests under an older version of Python. Defaults to :command:`trial`.h%j4h.h1h8h\h:}r:(h>]h?]h=]h<]h@]uhCMhE]r;(hUXprovides the name of the r<r=}r>(h$Xprovides the name of the h%j8ubj)r?}r@(h$X:command:`trial`h:}rA(h>]h?]rBjah=]h<]h@]uh%j8hE]rChUXtrialrDrE}rF(h$Uh%j?ubah8jubhUXL command. It is occasionally useful to use an alternate executable, such as rGrH}rI(h$XL command. It is occasionally useful to use an alternate executable, such as h%j8ubj)rJ}rK(h$X:command:`trial2.2`h:}rL(h>]h?]rMjah=]h<]h@]uh%j8hE]rNhUXtrial2.2rOrP}rQ(h$Uh%jJubah8jubhUXI which might run the tests under an older version of Python. Defaults to rRrS}rT(h$XI which might run the tests under an older version of Python. Defaults to h%j8ubj)rU}rV(h$X:command:`trial`h:}rW(h>]h?]rXjah=]h<]h@]uh%j8hE]rYhUXtrialrZr[}r\(h$Uh%jUubah8jubhUX.r]}r^(h$X.h%j8ubeubah8jubeubj)r_}r`(h$X``trialMode`` a list of arguments to pass to trial, specifically to set the reporting mode. This defaults to ``['--reporter=bwverbose']``, which only works for Twisted-2.1.0 and later. h%jPh.h1h8jh:}ra(h>]h?]h=]h<]h@]uhCMhDhhE]rb(j)rc}rd(h$X ``trialMode``reh%j_h.h1h8jh:}rf(h>]h?]h=]h<]h@]uhCMhE]rghb)rh}ri(h$jeh:}rj(h>]h?]h=]h<]h@]uh%jchE]rkhUX trialModerlrm}rn(h$Uh%jhubah8hjubaubj)ro}rp(h$Uh:}rq(h>]h?]h=]h<]h@]uh%j_hE]rrhY)rs}rt(h$Xa list of arguments to pass to trial, specifically to set the reporting mode. This defaults to ``['--reporter=bwverbose']``, which only works for Twisted-2.1.0 and later.h%joh.h1h8h\h:}ru(h>]h?]h=]h<]h@]uhCMhE]rv(hUX_a list of arguments to pass to trial, specifically to set the reporting mode. This defaults to rwrx}ry(h$X_a list of arguments to pass to trial, specifically to set the reporting mode. This defaults to h%jsubhb)rz}r{(h$X``['--reporter=bwverbose']``h:}r|(h>]h?]h=]h<]h@]uh%jshE]r}hUX['--reporter=bwverbose']r~r}r(h$Uh%jzubah8hjubhUX/, which only works for Twisted-2.1.0 and later.rr}r(h$X/, which only works for Twisted-2.1.0 and later.h%jsubeubah8jubeubj)r}r(h$Xw``trialArgs`` a list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to ``[]``. h%jPh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhDhhE]r(j)r}r(h$X ``trialArgs``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX trialArgsrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$Xha list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to ``[]``.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCMhE]r(hUXaa list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to rr}r(h$Xaa list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to h%jubhb)r}r(h$X``[]``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX[]rr}r(h$Uh%jubah8hjubhUX.r}r(h$X.h%jubeubah8jubeubj)r}r(h$X``tests`` Provides a module name or names which contain the unit tests for this project. Accepts a string, typically :samp:`{PROJECTNAME}.test`, or a list of strings. Defaults to ``None``, indicating that no tests should be run. You must either set this or ``testChanges``. h%jPh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhDhhE]r(j)r}r(h$X ``tests``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXtestsrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$XProvides a module name or names which contain the unit tests for this project. Accepts a string, typically :samp:`{PROJECTNAME}.test`, or a list of strings. Defaults to ``None``, indicating that no tests should be run. You must either set this or ``testChanges``.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCMhE]r(hUXkProvides a module name or names which contain the unit tests for this project. Accepts a string, typically rr}r(h$XkProvides a module name or names which contain the unit tests for this project. Accepts a string, typically h%jubhb)r}r(h$Uh:}r(h<]h=]h>]h?]rXsampraUrolejh@]uh%jhE]r(h)r}r(h$X PROJECTNAMEh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX PROJECTNAMErr}r(h$Uh%jubah8hubhUX.testrr}r(h$X.testh%jubeh8hjubhUX$, or a list of strings. Defaults to rr}r(h$X$, or a list of strings. Defaults to h%jubhb)r}r(h$X``None``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUXNonerr}r(h$Uh%jubah8hjubhUXF, indicating that no tests should be run. You must either set this or rr}r(h$XF, indicating that no tests should be run. You must either set this or h%jubhb)r}r(h$X``testChanges``h:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX testChangesrr}r(h$Uh%jubah8hjubhUX.r}r(h$X.h%jubeubah8jubeubj)r}r(h$X``testChanges`` if ``True``, ignore the ``tests`` parameter and instead ask the Build for all the files that make up the Changes going into this build. Pass these filenames to trial and ask it to look for test-case-name tags, running just the tests necessary to cover the changes. h%jPh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhDhhE]r(j)r}r(h$X``testChanges``rh%jh.h1h8jh:}r(h>]h?]h=]h<]h@]uhCMhE]rhb)r}r(h$jh:}r(h>]h?]h=]h<]h@]uh%jhE]rhUX testChangesrr}r(h$Uh%jubah8hjubaubj)r}r(h$Uh:}r(h>]h?]h=]h<]h@]uh%jhE]rhY)r}r(h$Xif ``True``, ignore the ``tests`` parameter and instead ask the Build for all the files that make up the Changes going into this build. Pass these filenames to trial and ask it to look for test-case-name tags, running just the tests necessary to cover the changes.h%jh.h1h8h\h:}r(h>]h?]h=]h<]h@]uhCMhE]r (hUXif r r }r (h$Xif h%jubhb)r }r (h$X``True``h:}r (h>]h?]h=]h<]h@]uh%jhE]r hUXTruer r }r (h$Uh%j ubah8hjubhUX , ignore the r r }r (h$X , ignore the h%jubhb)r }r (h$X ``tests``h:}r (h>]h?]h=]h<]h@]uh%jhE]r hUXtestsr r }r (h$Uh%j ubah8hjubhUX parameter and instead ask the Build for all the files that make up the Changes going into this build. Pass these filenames to trial and ask it to look for test-case-name tags, running just the tests necessary to cover the changes.r r }r (h$X parameter and instead ask the Build for all the files that make up the Changes going into this build. Pass these filenames to trial and ask it to look for test-case-name tags, running just the tests necessary to cover the changes.h%jubeubah8jubeubj)r }r (h$X``recurse`` If ``True``, tells Trial (with the ``--recurse`` argument) to look in all subdirectories for additional test cases. h%jPh.h1h8jh:}r (h>]h?]h=]h<]h@]uhCMhDhhE]r (j)r }r (h$X ``recurse``r h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCMhE]r hb)r! }r" (h$j h:}r# (h>]h?]h=]h<]h@]uh%j hE]r$ hUXrecurser% r& }r' (h$Uh%j! ubah8hjubaubj)r( }r) (h$Uh:}r* (h>]h?]h=]h<]h@]uh%j hE]r+ hY)r, }r- (h$XsIf ``True``, tells Trial (with the ``--recurse`` argument) to look in all subdirectories for additional test cases.h%j( h.h1h8h\h:}r. (h>]h?]h=]h<]h@]uhCMhE]r/ (hUXIf r0 r1 }r2 (h$XIf h%j, ubhb)r3 }r4 (h$X``True``h:}r5 (h>]h?]h=]h<]h@]uh%j, hE]r6 hUXTruer7 r8 }r9 (h$Uh%j3 ubah8hjubhUX, tells Trial (with the r: r; }r< (h$X, tells Trial (with the h%j, ubhb)r= }r> (h$X ``--recurse``h:}r? (h>]h?]h=]h<]h@]uh%j, hE]r@ hUX --recurserA rB }rC (h$Uh%j= ubah8hjubhUXC argument) to look in all subdirectories for additional test cases.rD rE }rF (h$XC argument) to look in all subdirectories for additional test cases.h%j, ubeubah8jubeubj)rG }rH (h$X``reactor`` which reactor to use, like 'gtk' or 'java'. If not provided, the Twisted's usual platform-dependent default is used. h%jPh.h1h8jh:}rI (h>]h?]h=]h<]h@]uhCMhDhhE]rJ (j)rK }rL (h$X ``reactor``rM h%jG h.h1h8jh:}rN (h>]h?]h=]h<]h@]uhCMhE]rO hb)rP }rQ (h$jM h:}rR (h>]h?]h=]h<]h@]uh%jK hE]rS hUXreactorrT rU }rV (h$Uh%jP ubah8hjubaubj)rW }rX (h$Uh:}rY (h>]h?]h=]h<]h@]uh%jG hE]rZ hY)r[ }r\ (h$Xtwhich reactor to use, like 'gtk' or 'java'. If not provided, the Twisted's usual platform-dependent default is used.r] h%jW h.h1h8h\h:}r^ (h>]h?]h=]h<]h@]uhCMhE]r_ hUXtwhich reactor to use, like 'gtk' or 'java'. If not provided, the Twisted's usual platform-dependent default is used.r` ra }rb (h$j] h%j[ ubaubah8jubeubj)rc }rd (h$X``randomly`` If ``True``, tells Trial (with the ``--random=0`` argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to ``False``. h%jPh.h1h8jh:}re (h>]h?]h=]h<]h@]uhCMhDhhE]rf (j)rg }rh (h$X ``randomly``ri h%jc h.h1h8jh:}rj (h>]h?]h=]h<]h@]uhCMhE]rk hb)rl }rm (h$ji h:}rn (h>]h?]h=]h<]h@]uh%jg hE]ro hUXrandomlyrp rq }rr (h$Uh%jl ubah8hjubaubj)rs }rt (h$Uh:}ru (h>]h?]h=]h<]h@]uh%jc hE]rv hY)rw }rx (h$XIf ``True``, tells Trial (with the ``--random=0`` argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to ``False``.h%js h.h1h8h\h:}ry (h>]h?]h=]h<]h@]uhCMhE]rz (hUXIf r{ r| }r} (h$XIf h%jw ubhb)r~ }r (h$X``True``h:}r (h>]h?]h=]h<]h@]uh%jw hE]r hUXTruer r }r (h$Uh%j~ ubah8hjubhUX, tells Trial (with the r r }r (h$X, tells Trial (with the h%jw ubhb)r }r (h$X``--random=0``h:}r (h>]h?]h=]h<]h@]uh%jw hE]r hUX --random=0r r }r (h$Uh%j ubah8hjubhUXy argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to r r }r (h$Xy argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to h%jw ubhb)r }r (h$X ``False``h:}r (h>]h?]h=]h<]h@]uh%jw hE]r hUXFalser r }r (h$Uh%j ubah8hjubhUX.r }r (h$X.h%jw ubeubah8jubeubeubhY)r }r (h$X_The step can also take any of the :class:`ShellCommand` arguments, e.g., :attr:`haltOnFailure`.h%j<h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCMhDhhE]r (hUX"The step can also take any of the r r }r (h$X"The step can also take any of the h%j ubh)r }r (h$X:class:`ShellCommand`r h%j h.h1h8hh:}r (UreftypeXclasshhX ShellCommandU refdomainXpyr h<]h=]U refexplicith>]h?]h@]hhjNjNuhCMhE]r hb)r }r (h$j h:}r (h>]h?]r (hj Xpy-classr eh=]h<]h@]uh%j hE]r hUX ShellCommandr r }r (h$Uh%j ubah8hjubaubhUX arguments, e.g., r r }r (h$X arguments, e.g., h%j ubh)r }r (h$X:attr:`haltOnFailure`r h%j h.h1h8hh:}r (UreftypeXattrhhX haltOnFailureU refdomainXpyr h<]h=]U refexplicith>]h?]h@]hhjNjNuhCMhE]r hb)r }r (h$j h:}r (h>]h?]r (hj Xpy-attrr eh=]h<]h@]uh%j hE]r hUX haltOnFailurer r }r (h$Uh%j ubah8hjubaubhUX.r }r (h$X.h%j ubeubhY)r }r (h$XXUnless one of ``tests`` or ``testChanges`` are set, the step will generate an exception.h%j<h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCMhDhhE]r (hUXUnless one of r r }r (h$XUnless one of h%j ubhb)r }r (h$X ``tests``h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUXtestsr r }r (h$Uh%j ubah8hjubhUX or r r }r (h$X or h%j ubhb)r }r (h$X``testChanges``h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX testChangesr r }r (h$Uh%j ubah8hjubhUX. are set, the step will generate an exception.r r }r (h$X. are set, the step will generate an exception.h%j ubeubeubeubh.h1h3}h8hFh:}r (h>]r X gnuautoconfr ah?]h=]h<]r (jHUid2r eh@]uhCKhhDhhK}r jHjKshE]r (hN)r }r (h$X GNUAutoconfr h%h'h.h1h8hRh:}r (h>]h?]h=]h<]h@]uhCKhhDhhE]r hUX GNUAutoconfr r }r (h$j h%j ubaubh)r }r (h$Uh%h'h.Nh8hh:}r (h<]h=]h>]h?]h@]Uentries]r (hX5buildbot.process.factory.GNUAutoconf (built-in class)hUtr auhCNhDhhE]ubjh)r }r (h$Uh%h'h.Nh8jkh:}r (jmjnXpyh<]h=]h>]h?]h@]joXclassr jqj uhCNhDhhE]r (js)r }r (h$X$buildbot.process.factory.GNUAutoconfh%j h.h1h8jvh:}r (h<]r hajyNh=]h>]h?]h@]r haj{hj|Xbuildbot.process.factoryj}uhCKkhDhhE]r (j)r }r (h$Xclass h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKkhDhhE]r hUXclass r r }r (h$Uh%j ubaubj)r }r (h$Xbuildbot.process.factory.h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKkhDhhE]r hUXbuildbot.process.factory.r r }r (h$Uh%j ubaubj)r }r (h$X GNUAutoconfh%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKkhDhhE]r hUX GNUAutoconfr r }r (h$Uh%j ubaubeubj)r }r (h$Uh%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKkhDhhE]ubeubhY)r }r (h$X`GNU Autoconf `_ is a software portability tool, intended to make it possible to write programs in C (and other languages) which will run on a variety of UNIX-like systems. Most GNU software is built using autoconf. It is frequently used in combination with GNU automake. These tools both encourage a build process which usually looks like this:h%h'h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKlhDhhE]r (h)r }r (h$X7`GNU Autoconf `_h:}r (UnameX GNU AutoconfjRX%http://www.gnu.org/software/autoconf/r h<]h=]h>]h?]h@]uh%j hE]r hUX GNU Autoconfr r! }r" (h$Uh%j ubah8hubh5)r# }r$ (h$X( h)Kh%j h8h9h:}r% (Urefurij h<]r& U gnu-autoconfr' ah=]h>]h?]h@]r( hauhE]ubhUXI is a software portability tool, intended to make it possible to write programs in C (and other languages) which will run on a variety of UNIX-like systems. Most GNU software is built using autoconf. It is frequently used in combination with GNU automake. These tools both encourage a build process which usually looks like this:r) r* }r+ (h$XI is a software portability tool, intended to make it possible to write programs in C (and other languages) which will run on a variety of UNIX-like systems. Most GNU software is built using autoconf. It is frequently used in combination with GNU automake. These tools both encourage a build process which usually looks like this:h%j ubeubj+)r, }r- (h$XP% CONFIG_ENV=foo ./configure --with-flags % make all % make check # make installh%h'h.h1h8j.h:}r. (jnjoXbashj0j1h<]h=]h>]h?]h@]uhCKshDhhE]r/ hUXP% CONFIG_ENV=foo ./configure --with-flags % make all % make check # make installr0 r1 }r2 (h$Uh%j, ubaubhY)r3 }r4 (h$XG(except of course the Buildbot always skips the ``make install`` part).h%h'h.h1h8h\h:}r5 (h>]h?]h=]h<]h@]uhCKzhDhhE]r6 (hUX0(except of course the Buildbot always skips the r7 r8 }r9 (h$X0(except of course the Buildbot always skips the h%j3 ubhb)r: }r; (h$X``make install``h:}r< (h>]h?]h=]h<]h@]uh%j3 hE]r= hUX make installr> r? }r@ (h$Uh%j: ubah8hjubhUX part).rA rB }rC (h$X part).h%j3 ubeubhY)rD }rE (h$X>The Buildbot's :class:`buildbot.process.factory.GNUAutoconf` factory is designed to build projects which use GNU autoconf and/or automake. The configuration environment variables, the configure flags, and command lines used for the compile and test are all configurable, in general the default values will be suitable.h%h'h.h1h8h\h:}rF (h>]h?]h=]h<]h@]uhCK}hDhhE]rG (hUXThe Buildbot's rH rI }rJ (h$XThe Buildbot's h%jD ubh)rK }rL (h$X-:class:`buildbot.process.factory.GNUAutoconf`rM h%jD h.h1h8hh:}rN (UreftypeXclasshhX$buildbot.process.factory.GNUAutoconfU refdomainXpyrO h<]h=]U refexplicith>]h?]h@]hhjNjNuhCK}hE]rP hb)rQ }rR (h$jM h:}rS (h>]h?]rT (hjO Xpy-classrU eh=]h<]h@]uh%jK hE]rV hUX$buildbot.process.factory.GNUAutoconfrW rX }rY (h$Uh%jQ ubah8hjubaubhUX factory is designed to build projects which use GNU autoconf and/or automake. The configuration environment variables, the configure flags, and command lines used for the compile and test are all configurable, in general the default values will be suitable.rZ r[ }r\ (h$X factory is designed to build projects which use GNU autoconf and/or automake. The configuration environment variables, the configure flags, and command lines used for the compile and test are all configurable, in general the default values will be suitable.h%jD ubeubhY)r] }r^ (h$X Example::r_ h%h'h.h1h8h\h:}r` (h>]h?]h=]h<]h@]uhCKhDhhE]ra hUXExample:rb rc }rd (h$XExample:h%j] ubaubj+)re }rf (h$Xtf = factory.GNUAutoconf(source=source.SVN(svnurl=URL, mode="copy"), flags=["--disable-nls"])h%h'h.h1h8j.h:}rg (j0j1h<]h=]h>]h?]h@]uhCKhDhhE]rh hUXtf = factory.GNUAutoconf(source=source.SVN(svnurl=URL, mode="copy"), flags=["--disable-nls"])ri rj }rk (h$Uh%je ubaubhY)rl }rm (h$XRequired Arguments:rn h%h'h.h1h8h\h:}ro (h>]h?]h=]h<]h@]uhCKhDhhE]rp hUXRequired Arguments:rq rr }rs (h$jn h%jl ubaubj)rt }ru (h$Uh%h'h.h1h8jh:}rv (h>]h?]h=]h<]h@]uhCNhDhhE]rw j)rx }ry (h$Xs``source`` This argument must be a step specification tuple that provides a BuildStep to generate the source tree. h%jt h.h1h8jh:}rz (h>]h?]h=]h<]h@]uhCKhE]r{ (j)r| }r} (h$X ``source``r~ h%jx h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r hb)r }r (h$j~ h:}r (h>]h?]h=]h<]h@]uh%j| hE]r hUXsourcer r }r (h$Uh%j ubah8hjubaubj)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%jx hE]r hY)r }r (h$XgThis argument must be a step specification tuple that provides a BuildStep to generate the source tree.r h%j h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKhE]r hUXgThis argument must be a step specification tuple that provides a BuildStep to generate the source tree.r r }r (h$j h%j ubaubah8jubeubaubhY)r }r (h$XOptional Arguments:r h%h'h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKhDhhE]r hUXOptional Arguments:r r }r (h$j h%j ubaubj)r }r (h$Uh%h'h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCNhDhhE]r (j)r }r (h$X``configure`` The command used to configure the tree. Defaults to :command:`./configure`. Accepts either a string or a list of shell argv elements. h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r (j)r }r (h$X ``configure``r h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r hb)r }r (h$j h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX configurer r }r (h$Uh%j ubah8hjubaubj)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hY)r }r (h$XThe command used to configure the tree. Defaults to :command:`./configure`. Accepts either a string or a list of shell argv elements.h%j h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKhE]r (hUX4The command used to configure the tree. Defaults to r r }r (h$X4The command used to configure the tree. Defaults to h%j ubj)r }r (h$X:command:`./configure`h:}r (h>]h?]r jah=]h<]h@]uh%j hE]r hUX ./configurer r }r (h$Uh%j ubah8jubhUX;. Accepts either a string or a list of shell argv elements.r r }r (h$X;. Accepts either a string or a list of shell argv elements.h%j ubeubah8jubeubj)r }r (h$X5``configureEnv`` The environment used for the initial configuration step. This accepts a dictionary which will be merged into the buildslave's normal environment. This is commonly used to provide things like ``CFLAGS="-O2 -g"`` (to turn off debug symbols during the compile). Defaults to an empty dictionary. h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhDhhE]r (j)r }r (h$X``configureEnv``r h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r hb)r }r (h$j h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX configureEnvr r }r (h$Uh%j ubah8hjubaubj)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hY)r }r (h$X#The environment used for the initial configuration step. This accepts a dictionary which will be merged into the buildslave's normal environment. This is commonly used to provide things like ``CFLAGS="-O2 -g"`` (to turn off debug symbols during the compile). Defaults to an empty dictionary.h%j h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKhE]r (hUXThe environment used for the initial configuration step. This accepts a dictionary which will be merged into the buildslave's normal environment. This is commonly used to provide things like r r }r (h$XThe environment used for the initial configuration step. This accepts a dictionary which will be merged into the buildslave's normal environment. This is commonly used to provide things like h%j ubhb)r }r (h$X``CFLAGS="-O2 -g"``h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUXCFLAGS="-O2 -g"r r }r (h$Uh%j ubah8hjubhUXQ (to turn off debug symbols during the compile). Defaults to an empty dictionary.r r }r (h$XQ (to turn off debug symbols during the compile). Defaults to an empty dictionary.h%j ubeubah8jubeubj)r }r (h$X``configureFlags`` A list of flags to be appended to the argument list of the configure command. This is commonly used to enable or disable specific features of the autoconf-controlled package, like ``["--without-x"]`` to disable windowing support. Defaults to an empty list. h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhDhhE]r (j)r }r (h$X``configureFlags``r h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r hb)r }r (h$j h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUXconfigureFlagsr r }r (h$Uh%j ubah8hjubaubj)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hY)r }r (h$XA list of flags to be appended to the argument list of the configure command. This is commonly used to enable or disable specific features of the autoconf-controlled package, like ``["--without-x"]`` to disable windowing support. Defaults to an empty list.h%j h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKhE]r (hUXA list of flags to be appended to the argument list of the configure command. This is commonly used to enable or disable specific features of the autoconf-controlled package, like r r }r (h$XA list of flags to be appended to the argument list of the configure command. This is commonly used to enable or disable specific features of the autoconf-controlled package, like h%j ubhb)r }r (h$X``["--without-x"]``h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX["--without-x"]r r }r (h$Uh%j ubah8hjubhUX9 to disable windowing support. Defaults to an empty list.r r }r (h$X9 to disable windowing support. Defaults to an empty list.h%j ubeubah8jubeubj)r }r (h$X``reconf`` use autoreconf to generate the ./configure file, set to True to use a buildbot default autoreconf command, or define the command for the ShellCommand. h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhDhhE]r (j)r }r (h$X ``reconf``r h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r hb)r }r (h$j h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUXreconfr r }r (h$Uh%j ubah8hjubaubj)r }r! (h$Uh:}r" (h>]h?]h=]h<]h@]uh%j hE]r# hY)r$ }r% (h$Xuse autoreconf to generate the ./configure file, set to True to use a buildbot default autoreconf command, or define the command for the ShellCommand.r& h%j h.h1h8h\h:}r' (h>]h?]h=]h<]h@]uhCKhE]r( hUXuse autoreconf to generate the ./configure file, set to True to use a buildbot default autoreconf command, or define the command for the ShellCommand.r) r* }r+ (h$j& h%j$ ubaubah8jubeubj)r, }r- (h$X``compile`` this is a shell command or list of argv values which is used to actually compile the tree. It defaults to ``make all``. If set to ``None``, the compile step is skipped. h%j h.h1h8jh:}r. (h>]h?]h=]h<]h@]uhCKhDhhE]r/ (j)r0 }r1 (h$X ``compile``r2 h%j, h.h1h8jh:}r3 (h>]h?]h=]h<]h@]uhCKhE]r4 hb)r5 }r6 (h$j2 h:}r7 (h>]h?]h=]h<]h@]uh%j0 hE]r8 hUXcompiler9 r: }r; (h$Uh%j5 ubah8hjubaubj)r< }r= (h$Uh:}r> (h>]h?]h=]h<]h@]uh%j, hE]r? hY)r@ }rA (h$Xthis is a shell command or list of argv values which is used to actually compile the tree. It defaults to ``make all``. If set to ``None``, the compile step is skipped.h%j< h.h1h8h\h:}rB (h>]h?]h=]h<]h@]uhCKhE]rC (hUXjthis is a shell command or list of argv values which is used to actually compile the tree. It defaults to rD rE }rF (h$Xjthis is a shell command or list of argv values which is used to actually compile the tree. It defaults to h%j@ ubhb)rG }rH (h$X ``make all``h:}rI (h>]h?]h=]h<]h@]uh%j@ hE]rJ hUXmake allrK rL }rM (h$Uh%jG ubah8hjubhUX . If set to rN rO }rP (h$X . If set to h%j@ ubhb)rQ }rR (h$X``None``h:}rS (h>]h?]h=]h<]h@]uh%j@ hE]rT hUXNonerU rV }rW (h$Uh%jQ ubah8hjubhUX, the compile step is skipped.rX rY }rZ (h$X, the compile step is skipped.h%j@ ubeubah8jubeubj)r[ }r\ (h$X``test`` this is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to ``make check``. If set to None, the test step is skipped. h%j h.h1h8jh:}r] (h>]h?]h=]h<]h@]uhCKhDhhE]r^ (j)r_ }r` (h$X``test``ra h%j[ h.h1h8jh:}rb (h>]h?]h=]h<]h@]uhCKhE]rc hb)rd }re (h$ja h:}rf (h>]h?]h=]h<]h@]uh%j_ hE]rg hUXtestrh ri }rj (h$Uh%jd ubah8hjubaubj)rk }rl (h$Uh:}rm (h>]h?]h=]h<]h@]uh%j[ hE]rn hY)ro }rp (h$Xthis is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to ``make check``. If set to None, the test step is skipped.h%jk h.h1h8h\h:}rq (h>]h?]h=]h<]h@]uhCKhE]rr (hUXjthis is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to rs rt }ru (h$Xjthis is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to h%jo ubhb)rv }rw (h$X``make check``h:}rx (h>]h?]h=]h<]h@]uh%jo hE]ry hUX make checkrz r{ }r| (h$Uh%jv ubah8hjubhUX+. If set to None, the test step is skipped.r} r~ }r (h$X+. If set to None, the test step is skipped.h%jo ubeubah8jubeubj)r }r (h$X``distcheck`` this is a shell command or list of argv values which is used to run the packaging test. It defaults to ``make distcheck``. If set to None, the test step is skipped. h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhDhhE]r (j)r }r (h$X ``distcheck``r h%j h.h1h8jh:}r (h>]h?]h=]h<]h@]uhCKhE]r hb)r }r (h$j h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX distcheckr r }r (h$Uh%j ubah8hjubaubj)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hY)r }r (h$Xthis is a shell command or list of argv values which is used to run the packaging test. It defaults to ``make distcheck``. If set to None, the test step is skipped.h%j h.h1h8h\h:}r (h>]h?]h=]h<]h@]uhCKhE]r (hUXgthis is a shell command or list of argv values which is used to run the packaging test. It defaults to r r }r (h$Xgthis is a shell command or list of argv values which is used to run the packaging test. It defaults to h%j ubhb)r }r (h$X``make distcheck``h:}r (h>]h?]h=]h<]h@]uh%j hE]r hUXmake distcheckr r }r (h$Uh%j ubah8hjubhUX+. If set to None, the test step is skipped.r r }r (h$X+. If set to None, the test step is skipped.h%j ubeubah8jubeubeubh5)r }r (h$X.. _BasicBuildFactory:h%h'h.h1h8h9h:}r (h>]h?]h=]h<]r Ubasicbuildfactoryr ah@]r hauhCKhDhhE]ubh)r }r (h$Uh%h'h.h1h8hh:}r (h<]h=]h>]h?]h@]h]r ((hXBasicBuildFactoryjTUtr (hX Build Factory; BasicBuildFactoryjTUtr ehuhCKhDhhE]ubjWeubh.h1h8Usystem_messager h:}r (h>]UlevelKh<]h=]r j aUsourceh1h?]h@]UlineKhUtypeUINFOr uhCKhhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%h"hE]r hUX.Duplicate implicit target name: "gnuautoconf".r r }r (h$Uh%j ubah8h\ubaubh!)r }r (h$Uh%jNh.h1h8j h:}r (h>]UlevelKh<]h=]r jUaUsourceh1h?]h@]UlineKUtypej uhCKhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX4Duplicate implicit target name: "basicbuildfactory".r r }r (h$Uh%j ubah8h\ubaubh!)r }r (h$Uh%jh.h1h8j h:}r (h>]UlevelKh<]h=]r jaUsourceh1h?]h@]UlineKUtypej uhCKhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX+Duplicate implicit target name: "basicsvn".r r }r (h$Uh%j ubah8h\ubaubh!)r }r (h$Uh%j?h.h1h8j h:}r (h>]UlevelKh<]h=]r jEaUsourceh1h?]h@]UlineKUtypej uhCKhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX4Duplicate implicit target name: "quickbuildfactory".r r }r (h$Uh%j ubah8h\ubaubh!)r }r (h$Uh%jh.h1h8j h:}r (h>]UlevelKh<]h=]r j\aUsourceh1h?]h@]UlineKUtypej uhCKhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX'Duplicate implicit target name: "cpan".r r }r (h$Uh%j ubah8h\ubaubh!)r }r (h$Uh%jh.h1h8j h:}r (h>]UlevelKh<]h=]r jaUsourceh1h?]h@]UlineMUtypej uhCMhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX,Duplicate implicit target name: "distutils".r r }r (h$Uh%j ubah8h\ubaubh!)r }r (h$Uh%j<h.h1h8j h:}r (h>]UlevelKh<]h=]r jBaUsourceh1h?]h@]UlineMEUtypej uhCMEhDhhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX(Duplicate implicit target name: "trial".r r }r (h$Uh%j ubah8h\ubaubeUcurrent_sourcer NU decorationr NUautofootnote_startr KUnameidsr }r (hj hjhhh hh h h hh hh hBhjBhj' hhIhj\hhhhhhhhhhhjhj0hjhj3hjhhuhE]r (h6h,eh$UU transformerr NU footnote_refsr }r Urefnamesr }r Usymbol_footnotesr ]r Uautofootnote_refsr ]r Usymbol_footnote_refsr ]r U citationsr ]r hDhU current_liner NUtransform_messagesr ]r (h!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r hY)r }r (h$Uh:}r! (h>]h?]h=]h<]h@]uh%j hE]r" hUX5Hyperlink target "build-factories" is not referenced.r# r$ }r% (h$Uh%j ubah8h\ubah8j ubh!)r& }r' (h$Uh:}r( (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r) hY)r* }r+ (h$Uh:}r, (h>]h?]h=]h<]h@]uh%j& hE]r- hUX2Hyperlink target "buildfactory" is not referenced.r. r/ }r0 (h$Uh%j* ubah8h\ubah8j ubh!)r1 }r2 (h$Uh:}r3 (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r4 hY)r5 }r6 (h$Uh:}r7 (h>]h?]h=]h<]h@]uh%j1 hE]r8 hUX-Hyperlink target "index-0" is not referenced.r9 r: }r; (h$Uh%j5 ubah8h\ubah8j ubh!)r< }r= (h$Uh:}r> (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKaUtypej uhE]r? hY)r@ }rA (h$Uh:}rB (h>]h?]h=]h<]h@]uh%j< hE]rC hUX1Hyperlink target "gnuautoconf" is not referenced.rD rE }rF (h$Uh%j@ ubah8h\ubah8j ubh!)rG }rH (h$Uh:}rI (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKfUtypej uhE]rJ hY)rK }rL (h$Uh:}rM (h>]h?]h=]h<]h@]uh%jG hE]rN hUX-Hyperlink target "index-1" is not referenced.rO rP }rQ (h$Uh%jK ubah8h\ubah8j ubh!)rR }rS (h$Uh:}rT (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]rU hY)rV }rW (h$Uh:}rX (h>]h?]h=]h<]h@]uh%jR hE]rY hUX7Hyperlink target "basicbuildfactory" is not referenced.rZ r[ }r\ (h$Uh%jV ubah8h\ubah8j ubh!)r] }r^ (h$Uh:}r_ (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r` hY)ra }rb (h$Uh:}rc (h>]h?]h=]h<]h@]uh%j] hE]rd hUX-Hyperlink target "index-2" is not referenced.re rf }rg (h$Uh%ja ubah8h\ubah8j ubh!)rh }ri (h$Uh:}rj (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]rk hY)rl }rm (h$Uh:}rn (h>]h?]h=]h<]h@]uh%jh hE]ro hUX.Hyperlink target "basicsvn" is not referenced.rp rq }rr (h$Uh%jl ubah8h\ubah8j ubh!)rs }rt (h$Uh:}ru (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]rv hY)rw }rx (h$Uh:}ry (h>]h?]h=]h<]h@]uh%js hE]rz hUX-Hyperlink target "index-3" is not referenced.r{ r| }r} (h$Uh%jw ubah8h\ubah8j ubh!)r~ }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j~ hE]r hUX7Hyperlink target "quickbuildfactory" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX-Hyperlink target "index-4" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX2Hyperlink target "factory-cpan" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineKUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX-Hyperlink target "index-5" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineMUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX/Hyperlink target "distutils" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineMUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX-Hyperlink target "index-6" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineM>Utypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX+Hyperlink target "trial" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineMCUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX-Hyperlink target "index-7" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubh!)r }r (h$Uh:}r (h>]UlevelKh<]h=]Usourceh1h?]h@]UlineMwUtypej uhE]r hY)r }r (h$Uh:}r (h>]h?]h=]h<]h@]uh%j hE]r hUX-Hyperlink target "index-8" is not referenced.r r }r (h$Uh%j ubah8h\ubah8j ubeUreporterr NUid_startr K U autofootnotesr ]r U citation_refsr }r Uindirect_targetsr ]r Usettingsr (cdocutils.frontend Values r or }r (Ufootnote_backlinksr KUrecord_dependenciesr NU rfc_base_urlr Uhttp://tools.ietf.org/html/r U tracebackr Upep_referencesr NUstrip_commentsr NU toc_backlinksr Uentryr U language_coder Uenr U datestampr NU report_levelr KU _destinationr NU halt_levelr KU strip_classesr NhRNUerror_encoding_error_handlerr Ubackslashreplacer Udebugr NUembed_stylesheetr Uoutput_encoding_error_handlerr Ustrictr U sectnum_xformr KUdump_transformsr NU docinfo_xformr KUwarning_streamr NUpep_file_url_templater Upep-%04dr Uexit_status_levelr KUconfigr NUstrict_visitorr NUcloak_email_addressesr Utrim_footnote_reference_spacer Uenvr NUdump_pseudo_xmlr NUexpose_internalsr NUsectsubtitle_xformr U source_linkr NUrfc_referencesr NUoutput_encodingr Uutf-8r U source_urlr NUinput_encodingr U utf-8-sigr U_disable_configr NU id_prefixr UU tab_widthr KUerror_encodingr UUTF-8r U_sourcer UZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-buildfactories.rstr Ugettext_compactr U generatorr! NUdump_internalsr" NU smart_quotesr# U pep_base_urlr$ Uhttp://www.python.org/dev/peps/r% Usyntax_highlightr& Ulongr' Uinput_encoding_error_handlerr( j Uauto_id_prefixr) Uidr* Udoctitle_xformr+ Ustrip_elements_with_classesr, NU _config_filesr- ]Ufile_insertion_enabledr. U raw_enabledr/ KU dump_settingsr0 NubUsymbol_footnote_startr1 KUidsr2 }r3 (j j jjh jthhhhhhhhjBj<hhj\jXjjjjjEj?j h'jUjNhBh,hIh,j9j?j jj jj6j<hhjHh'j' j# jjjBj>jTjNjjhjZhj+hh*jtjwhj hjjjj0j,jjj3j/jjhjWhj*uUsubstitution_namesr4 }r5 h8hDh:}r6 (h>]h<]h=]Usourceh1h?]h@]uU footnotesr7 ]r8 Urefidsr9 }r: (hB]r; h6aj9]r< j<aj ]r= j aj ]r> j aj6]r? j9ah]r@ hajH]rA jKajT]rB jWaj]rC jauub.PK7D!y8buildbot-v0.8.9/.doctrees/manual/new-style-steps.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X statisticsqNXnewly asynchronous methodsqNXrewriting startqNX log objectsq NXnew-style-build-stepsq Xnew-style build stepsq NXstatus stringsq NX propertiesq NXsummary of changesqNuUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hU statisticsqhUnewly-asynchronous-methodsqhUrewriting-startqh U log-objectsqh Unew-style-build-stepsqh Uid1qh Ustatus-stringsqh U propertiesqhUsummary-of-changesq uUchildrenq!]q"(cdocutils.nodes target q#)q$}q%(U rawsourceq&X.. _New-Style-Build-Steps:Uparentq'hUsourceq(cdocutils.nodes reprunicode q)XW/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/new-style-steps.rstq*q+}q,bUtagnameq-Utargetq.U attributesq/}q0(Uidsq1]Ubackrefsq2]Udupnamesq3]Uclassesq4]Unamesq5]Urefidq6huUlineq7KUdocumentq8hh!]ubcdocutils.nodes section q9)q:}q;(h&Uh'hh(h+Uexpect_referenced_by_nameq<}q=h h$sh-Usectionq>h/}q?(h3]h4]h2]h1]q@(hheh5]qA(h h euh7Kh8hUexpect_referenced_by_idqB}qChh$sh!]qD(cdocutils.nodes title qE)qF}qG(h&XNew-Style Build StepsqHh'h:h(h+h-UtitleqIh/}qJ(h3]h4]h2]h1]h5]uh7Kh8hh!]qKcdocutils.nodes Text qLXNew-Style Build StepsqMqN}qO(h&hHh'hFubaubcdocutils.nodes paragraph qP)qQ}qR(h&XIn Buildbot-0.9.0, many operations performed by BuildStep subclasses return a Deferred. As a result, custom build steps which call these methods will need to be rewritten.qSh'h:h(h+h-U paragraphqTh/}qU(h3]h4]h2]h1]h5]uh7Kh8hh!]qVhLXIn Buildbot-0.9.0, many operations performed by BuildStep subclasses return a Deferred. As a result, custom build steps which call these methods will need to be rewritten.qWqX}qY(h&hSh'hQubaubhP)qZ}q[(h&X9Buildbot-0.8.9 supports old-style steps natively, while new-style steps are emulated. Buildbot-0.9.0 supports new-style steps natively, while old-style steps are emulated. Later versions of Buildbot wil not support old-style steps at all. All custom steps should be rewritten in the new style as soon as possible.q\h'h:h(h+h-hTh/}q](h3]h4]h2]h1]h5]uh7K h8hh!]q^hLX9Buildbot-0.8.9 supports old-style steps natively, while new-style steps are emulated. Buildbot-0.9.0 supports new-style steps natively, while old-style steps are emulated. Later versions of Buildbot wil not support old-style steps at all. All custom steps should be rewritten in the new style as soon as possible.q_q`}qa(h&h\h'hZubaubhP)qb}qc(h&XBuildbot distinguishes new-style from old-style steps by the presence of a :py:meth:`~buildbot.process.buildstep.BuildStep.run` method. If this method is present, then the step is a new-style step.h'h:h(h+h-hTh/}qd(h3]h4]h2]h1]h5]uh7Kh8hh!]qe(hLXKBuildbot distinguishes new-style from old-style steps by the presence of a qfqg}qh(h&XKBuildbot distinguishes new-style from old-style steps by the presence of a h'hbubcsphinx.addnodes pending_xref qi)qj}qk(h&X4:py:meth:`~buildbot.process.buildstep.BuildStep.run`qlh'hbh(h+h-U pending_xrefqmh/}qn(UreftypeXmethUrefwarnqoU reftargetqpX(buildbot.process.buildstep.BuildStep.runU refdomainXpyqqh1]h2]U refexplicith3]h4]h5]UrefdocqrXmanual/new-style-stepsqsUpy:classqtNU py:modulequNuh7Kh!]qvcdocutils.nodes literal qw)qx}qy(h&hlh/}qz(h3]h4]q{(Uxrefq|hqXpy-methq}eh2]h1]h5]uh'hjh!]q~hLXrunqq}q(h&Uh'hxubah-UliteralqubaubhLXF method. If this method is present, then the step is a new-style step.qq}q(h&XF method. If this method is present, then the step is a new-style step.h'hbubeubh9)q}q(h&Uh'h:h(h+h-h>h/}q(h3]h4]h2]h1]qh ah5]qhauh7Kh8hh!]q(hE)q}q(h&XSummary of Changesqh'hh(h+h-hIh/}q(h3]h4]h2]h1]h5]uh7Kh8hh!]qhLXSummary of Changesqq}q(h&hh'hubaubcdocutils.nodes block_quote q)q}q(h&Uh'hh(Nh-U block_quoteqh/}q(h3]h4]h2]h1]h5]uh7Nh8hh!]qcdocutils.nodes bullet_list q)q}q(h&Uh/}q(UbulletqX*h1]h2]h3]h4]h5]uh'hh!]q(cdocutils.nodes list_item q)q}q(h&XaNew-style steps have a ``run`` method that is simpler to implement than the old ``start`` method.qh/}q(h3]h4]h2]h1]h5]uh'hh!]qhP)q}q(h&hh'hh(h+h-hTh/}q(h3]h4]h2]h1]h5]uh7Kh!]q(hLXNew-style steps have a qq}q(h&XNew-style steps have a h'hubhw)q}q(h&X``run``h/}q(h3]h4]h2]h1]h5]uh'hh!]qhLXrunqq}q(h&Uh'hubah-hubhLX2 method that is simpler to implement than the old qq}q(h&X2 method that is simpler to implement than the old h'hubhw)q}q(h&X ``start``h/}q(h3]h4]h2]h1]h5]uh'hh!]qhLXstartqq}q(h&Uh'hubah-hubhLX method.qq}q(h&X method.h'hubeubah-U list_itemqubh)q}q(h&XaMany methods are now asynchronous (return Deferreds), as they perform operations on the database.qh/}q(h3]h4]h2]h1]h5]uh'hh!]qhP)q}q(h&hh'hh(h+h-hTh/}q(h3]h4]h2]h1]h5]uh7Kh!]qhLXaMany methods are now asynchronous (return Deferreds), as they perform operations on the database.q˅q}q(h&hh'hubaubah-hubh)q}q(h&XLogs are now implemented by a completely different class. This class supports the same log-writing methods (``addStderr`` and so on), although they are now asynchronous. However, it does not support log-reading methods such as ``getText``. It was never advisable to handle logs as enormous strings. New-style steps should, instead, use a LogObserver or (in Buildbot-0.9.0) fetch log lines bit by bit using the data API.h/}q(h3]h4]h2]h1]h5]uh'hh!]qhP)q}q(h&XLogs are now implemented by a completely different class. This class supports the same log-writing methods (``addStderr`` and so on), although they are now asynchronous. However, it does not support log-reading methods such as ``getText``. It was never advisable to handle logs as enormous strings. New-style steps should, instead, use a LogObserver or (in Buildbot-0.9.0) fetch log lines bit by bit using the data API.h'hh(h+h-hTh/}q(h3]h4]h2]h1]h5]uh7Kh!]q(hLXlLogs are now implemented by a completely different class. This class supports the same log-writing methods (qօq}q(h&XlLogs are now implemented by a completely different class. This class supports the same log-writing methods (h'hubhw)q}q(h&X ``addStderr``h/}q(h3]h4]h2]h1]h5]uh'hh!]qhLX addStderrq݅q}q(h&Uh'hubah-hubhLXj and so on), although they are now asynchronous. However, it does not support log-reading methods such as qq}q(h&Xj and so on), although they are now asynchronous. However, it does not support log-reading methods such as h'hubhw)q}q(h&X ``getText``h/}q(h3]h4]h2]h1]h5]uh'hh!]qhLXgetTextq煁q}q(h&Uh'hubah-hubhLX. It was never advisable to handle logs as enormous strings. New-style steps should, instead, use a LogObserver or (in Buildbot-0.9.0) fetch log lines bit by bit using the data API.qꅁq}q(h&X. It was never advisable to handle logs as enormous strings. New-style steps should, instead, use a LogObserver or (in Buildbot-0.9.0) fetch log lines bit by bit using the data API.h'hubeubah-hubh)q}q(h&X:py:class:`buildbot.process.buildstep.LoggingBuildStep` is deprecated and cannot be uesd in new-style steps. Mix in :py:class:`buildbot.process.buildstep.ShellMixin` instead. h/}q(h3]h4]h2]h1]h5]uh'hh!]qhP)q}q(h&X:py:class:`buildbot.process.buildstep.LoggingBuildStep` is deprecated and cannot be uesd in new-style steps. Mix in :py:class:`buildbot.process.buildstep.ShellMixin` instead.h'hh(h+h-hTh/}q(h3]h4]h2]h1]h5]uh7Kh!]q(hi)q}q(h&X7:py:class:`buildbot.process.buildstep.LoggingBuildStep`qh'hh(h+h-hmh/}q(UreftypeXclasshohpX+buildbot.process.buildstep.LoggingBuildStepU refdomainXpyqh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]qhw)q}q(h&hh/}q(h3]h4]q(h|hXpy-classqeh2]h1]h5]uh'hh!]rhLX+buildbot.process.buildstep.LoggingBuildSteprr}r(h&Uh'hubah-hubaubhLX= is deprecated and cannot be uesd in new-style steps. Mix in rr}r(h&X= is deprecated and cannot be uesd in new-style steps. Mix in h'hubhi)r}r(h&X1:py:class:`buildbot.process.buildstep.ShellMixin`r h'hh(h+h-hmh/}r (UreftypeXclasshohpX%buildbot.process.buildstep.ShellMixinU refdomainXpyr h1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]r hw)r }r(h&j h/}r(h3]h4]r(h|j Xpy-classreh2]h1]h5]uh'jh!]rhLX%buildbot.process.buildstep.ShellMixinrr}r(h&Uh'j ubah-hubaubhLX instead.rr}r(h&X instead.h'hubeubah-hubeh-U bullet_listrubaubeubh9)r}r(h&Uh'h:h(h+h-h>h/}r(h3]h4]h2]h1]rhah5]rhauh7Kh8hh!]r(hE)r }r!(h&XRewriting ``start``r"h'jh(h+h-hIh/}r#(h3]h4]h2]h1]h5]uh7Kh8hh!]r$(hLX Rewriting r%r&}r'(h&X Rewriting r(h'j ubhw)r)}r*(h&X ``start``r+h/}r,(h3]h4]h2]h1]h5]uh'j h!]r-hLXstartr.r/}r0(h&Uh'j)ubah-hubeubhP)r1}r2(h&XIf your custom buildstep implements the ``start`` method, then rename that method to ``run`` and set it up to return a Deferred, either explicitly or via ``inlineCallbacks``. The value of the Deferred should be the result of the step (one of the codes in :py:mod:`buildbot.status.results`), or a Twisted failure instance to complete the step as EXCEPTION. The new ``run`` method should *not* call ``self.finished`` or ``self.failed``, instead signalling the same via Deferred.h'jh(h+h-hTh/}r3(h3]h4]h2]h1]h5]uh7K!h8hh!]r4(hLX(If your custom buildstep implements the r5r6}r7(h&X(If your custom buildstep implements the h'j1ubhw)r8}r9(h&X ``start``h/}r:(h3]h4]h2]h1]h5]uh'j1h!]r;hLXstartr<r=}r>(h&Uh'j8ubah-hubhLX$ method, then rename that method to r?r@}rA(h&X$ method, then rename that method to h'j1ubhw)rB}rC(h&X``run``h/}rD(h3]h4]h2]h1]h5]uh'j1h!]rEhLXrunrFrG}rH(h&Uh'jBubah-hubhLX> and set it up to return a Deferred, either explicitly or via rIrJ}rK(h&X> and set it up to return a Deferred, either explicitly or via h'j1ubhw)rL}rM(h&X``inlineCallbacks``h/}rN(h3]h4]h2]h1]h5]uh'j1h!]rOhLXinlineCallbacksrPrQ}rR(h&Uh'jLubah-hubhLXR. The value of the Deferred should be the result of the step (one of the codes in rSrT}rU(h&XR. The value of the Deferred should be the result of the step (one of the codes in h'j1ubhi)rV}rW(h&X!:py:mod:`buildbot.status.results`rXh'j1h(h+h-hmh/}rY(UreftypeXmodhohpXbuildbot.status.resultsU refdomainXpyrZh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7K!h!]r[hw)r\}r](h&jXh/}r^(h3]h4]r_(h|jZXpy-modr`eh2]h1]h5]uh'jVh!]rahLXbuildbot.status.resultsrbrc}rd(h&Uh'j\ubah-hubaubhLXL), or a Twisted failure instance to complete the step as EXCEPTION. The new rerf}rg(h&XL), or a Twisted failure instance to complete the step as EXCEPTION. The new h'j1ubhw)rh}ri(h&X``run``h/}rj(h3]h4]h2]h1]h5]uh'j1h!]rkhLXrunrlrm}rn(h&Uh'jhubah-hubhLX method should rorp}rq(h&X method should h'j1ubcdocutils.nodes emphasis rr)rs}rt(h&X*not*h/}ru(h3]h4]h2]h1]h5]uh'j1h!]rvhLXnotrwrx}ry(h&Uh'jsubah-UemphasisrzubhLX call r{r|}r}(h&X call h'j1ubhw)r~}r(h&X``self.finished``h/}r(h3]h4]h2]h1]h5]uh'j1h!]rhLX self.finishedrr}r(h&Uh'j~ubah-hubhLX or rr}r(h&X or h'j1ubhw)r}r(h&X``self.failed``h/}r(h3]h4]h2]h1]h5]uh'j1h!]rhLX self.failedrr}r(h&Uh'jubah-hubhLX+, instead signalling the same via Deferred.rr}r(h&X+, instead signalling the same via Deferred.h'j1ubeubhP)r}r(h&X8For example, the following old-style ``start`` method ::rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K%h8hh!]r(hLX%For example, the following old-style rr}r(h&X%For example, the following old-style h'jubhw)r}r(h&X ``start``h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLXstartrr}r(h&Uh'jubah-hubhLX methodrr}r(h&X methodh'jubeubcdocutils.nodes literal_block r)r}r(h&Xdef start(self): ## old style cmd = remotecommand.RemoteCommand('stat', {'file': self.file }) d = self.runCommand(cmd) d.addCallback(lambda res: self.convertResult(cmd)) d.addErrback(self.failed)h'jh(h+h-U literal_blockrh/}r(U xml:spacerUpreserverh1]h2]h3]h4]h5]uh7K(h8hh!]rhLXdef start(self): ## old style cmd = remotecommand.RemoteCommand('stat', {'file': self.file }) d = self.runCommand(cmd) d.addCallback(lambda res: self.convertResult(cmd)) d.addErrback(self.failed)rr}r(h&Uh'jubaubhP)r}r(h&X Becomes ::rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K.h8hh!]rhLXBecomesrr}r(h&XBecomesh'jubaubj)r}r(h&X@defer.inlineCallbacks def run(self): ## new style cmd = remotecommand.RemoteCommand('stat', {'file': self.file }) yield self.runCommand(cmd) yield self.convertResult(cmd)h'jh(h+h-jh/}r(jjh1]h2]h3]h4]h5]uh7K0h8hh!]rhLX@defer.inlineCallbacks def run(self): ## new style cmd = remotecommand.RemoteCommand('stat', {'file': self.file }) yield self.runCommand(cmd) yield self.convertResult(cmd)rr}r(h&Uh'jubaubeubh9)r}r(h&Uh'h:h(h+h-h>h/}r(h3]h4]h2]h1]rhah5]rhauh7K7h8hh!]r(hE)r}r(h&XNewly Asynchronous Methodsrh'jh(h+h-hIh/}r(h3]h4]h2]h1]h5]uh7K7h8hh!]rhLXNewly Asynchronous Methodsrr}r(h&jh'jubaubhP)r}r(h&X,The following methods now return a Deferred:rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K9h8hh!]rhLX,The following methods now return a Deferred:rr}r(h&jh'jubaubh)r}r(h&Uh'jh(Nh-hh/}r(h3]h4]h2]h1]h5]uh7Nh8hh!]rh)r}r(h&Uh/}r(hX*h1]h2]h3]h4]h5]uh'jh!]r(h)r}r(h&X6:py:meth:`buildbot.process.buildstep.BuildStep.addLog`rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K;h!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX+buildbot.process.buildstep.BuildStep.addLogU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7K;h!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX+buildbot.process.buildstep.BuildStep.addLogrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X``log.addStdout``rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kh!]rhw)r}r(h&jh/}r(h3]h4]h2]h1]h5]uh'jh!]rhLX log.addHeaderr r!}r"(h&Uh'jubah-hubaubah-hubh)r#}r$(h&X)``log.finish`` (see "Log Objects", below)r%h/}r&(h3]h4]h2]h1]h5]uh'jh!]r'hP)r(}r)(h&j%h'j#h(h+h-hTh/}r*(h3]h4]h2]h1]h5]uh7K?h!]r+(hw)r,}r-(h&X``log.finish``h/}r.(h3]h4]h2]h1]h5]uh'j(h!]r/hLX log.finishr0r1}r2(h&Uh'j,ubah-hubhLX (see "Log Objects", below)r3r4}r5(h&X (see "Log Objects", below)h'j(ubeubah-hubh)r6}r7(h&XA:py:meth:`buildbot.process.remotecommand.RemoteCommand.addStdout`r8h/}r9(h3]h4]h2]h1]h5]uh'jh!]r:hP)r;}r<(h&j8h'j6h(h+h-hTh/}r=(h3]h4]h2]h1]h5]uh7K@h!]r>hi)r?}r@(h&j8h'j;h(h+h-hmh/}rA(UreftypeXmethhohpX6buildbot.process.remotecommand.RemoteCommand.addStdoutU refdomainXpyrBh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7K@h!]rChw)rD}rE(h&j8h/}rF(h3]h4]rG(h|jBXpy-methrHeh2]h1]h5]uh'j?h!]rIhLX6buildbot.process.remotecommand.RemoteCommand.addStdoutrJrK}rL(h&Uh'jDubah-hubaubaubah-hubh)rM}rN(h&XA:py:meth:`buildbot.process.remotecommand.RemoteCommand.addStderr`rOh/}rP(h3]h4]h2]h1]h5]uh'jh!]rQhP)rR}rS(h&jOh'jMh(h+h-hTh/}rT(h3]h4]h2]h1]h5]uh7KAh!]rUhi)rV}rW(h&jOh'jRh(h+h-hmh/}rX(UreftypeXmethhohpX6buildbot.process.remotecommand.RemoteCommand.addStderrU refdomainXpyrYh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7KAh!]rZhw)r[}r\(h&jOh/}r](h3]h4]r^(h|jYXpy-methr_eh2]h1]h5]uh'jVh!]r`hLX6buildbot.process.remotecommand.RemoteCommand.addStderrrarb}rc(h&Uh'j[ubah-hubaubaubah-hubh)rd}re(h&XA:py:meth:`buildbot.process.remotecommand.RemoteCommand.addHeader`rfh/}rg(h3]h4]h2]h1]h5]uh'jh!]rhhP)ri}rj(h&jfh'jdh(h+h-hTh/}rk(h3]h4]h2]h1]h5]uh7KBh!]rlhi)rm}rn(h&jfh'jih(h+h-hmh/}ro(UreftypeXmethhohpX6buildbot.process.remotecommand.RemoteCommand.addHeaderU refdomainXpyrph1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7KBh!]rqhw)rr}rs(h&jfh/}rt(h3]h4]ru(h|jpXpy-methrveh2]h1]h5]uh'jmh!]rwhLX6buildbot.process.remotecommand.RemoteCommand.addHeaderrxry}rz(h&Uh'jrubah-hubaubaubah-hubh)r{}r|(h&X@:py:meth:`buildbot.process.remotecommand.RemoteCommand.addToLog`r}h/}r~(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&j}h'j{h(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7KCh!]rhi)r}r(h&j}h'jh(h+h-hmh/}r(UreftypeXmethhohpX5buildbot.process.remotecommand.RemoteCommand.addToLogU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7KCh!]rhw)r}r(h&j}h/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX5buildbot.process.remotecommand.RemoteCommand.addToLogrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X>:py:meth:`buildbot.process.buildstep.BuildStep.addCompleteLog`rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7KDh!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX3buildbot.process.buildstep.BuildStep.addCompleteLogU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7KDh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX3buildbot.process.buildstep.BuildStep.addCompleteLogrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X::py:meth:`buildbot.process.buildstep.BuildStep.addHTMLLog`rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7KEh!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX/buildbot.process.buildstep.BuildStep.addHTMLLogU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7KEh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX/buildbot.process.buildstep.BuildStep.addHTMLLogrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X7:py:meth:`buildbot.process.buildstep.BuildStep.addURL` h/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&X6:py:meth:`buildbot.process.buildstep.BuildStep.addURL`rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7KFh!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX+buildbot.process.buildstep.BuildStep.addURLU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7KFh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX+buildbot.process.buildstep.BuildStep.addURLrr}r(h&Uh'jubah-hubaubaubah-hubeh-jubaubhP)r}r(h&XAny custom code in a new-style step that calls these methods must handle the resulting Deferred. In some cases, that means that the calling method's signature will change. For example ::h'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7KHh8hh!]rhLXAny custom code in a new-style step that calls these methods must handle the resulting Deferred. In some cases, that means that the calling method's signature will change. For examplerr}r(h&XAny custom code in a new-style step that calls these methods must handle the resulting Deferred. In some cases, that means that the calling method's signature will change. For exampleh'jubaubj)r}r(h&Xdef summarize(self): ## old-style for m in self.MESSAGES: if counts[m]: self.addCompleteLog(m, "".join(summaries[m])) self.setProperty("count-%s" % m, counts[m], "counter")h'jh(h+h-jh/}r(jjh1]h2]h3]h4]h5]uh7KLh8hh!]rhLXdef summarize(self): ## old-style for m in self.MESSAGES: if counts[m]: self.addCompleteLog(m, "".join(summaries[m])) self.setProperty("count-%s" % m, counts[m], "counter")rr}r(h&Uh'jubaubhP)r}r(h&XIs a synchronous function, not returning a Deferred. However, when converted to a new-style test, it must handle Deferreds from the methods it calls, so it must be asynchronous. Syntactically, ``inlineCallbacks`` makes the change fairly simple::h'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7KRh8hh!]r(hLXIs a synchronous function, not returning a Deferred. However, when converted to a new-style test, it must handle Deferreds from the methods it calls, so it must be asynchronous. Syntactically, rr}r(h&XIs a synchronous function, not returning a Deferred. However, when converted to a new-style test, it must handle Deferreds from the methods it calls, so it must be asynchronous. Syntactically, h'jubhw)r}r(h&X``inlineCallbacks``h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLXinlineCallbacksrr}r(h&Uh'jubah-hubhLX makes the change fairly simple:rr}r(h&X makes the change fairly simple:h'jubeubj)r}r(h&X@defer.inlineCallbacks def summarize(self): ## new-style for m in self.MESSAGES: if counts[m]: yield self.addCompleteLog(m, "".join(summaries[m])) self.setProperty("count-%s" % m, counts[m], "counter")h'jh(h+h-jh/}r(jjh1]h2]h3]h4]h5]uh7KVh8hh!]rhLX@defer.inlineCallbacks def summarize(self): ## new-style for m in self.MESSAGES: if counts[m]: yield self.addCompleteLog(m, "".join(summaries[m])) self.setProperty("count-%s" % m, counts[m], "counter")rr}r(h&Uh'jubaubhP)r}r(h&XHowever, this method's callers must now handle the Deferred that it returns. All methods that can be overridden in custom steps can return a Deferred.rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K]h8hh!]rhLXHowever, this method's callers must now handle the Deferred that it returns. All methods that can be overridden in custom steps can return a Deferred.rr}r(h&jh'jubaubeubh9)r}r(h&Uh'h:h(h+h-h>h/}r(h3]h4]h2]h1]rhah5]r h auh7Kah8hh!]r (hE)r }r (h&X Propertiesr h'jh(h+h-hIh/}r(h3]h4]h2]h1]h5]uh7Kah8hh!]rhLX Propertiesrr}r(h&j h'j ubaubhP)r}r(h&XGood news! The API for properties is the same synchronous API as was available in old-style steps. Properties are handled synchronously during the build, and persisted to the database at completion of each step.rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kch8hh!]rhLXGood news! The API for properties is the same synchronous API as was available in old-style steps. Properties are handled synchronously during the build, and persisted to the database at completion of each step.rr}r(h&jh'jubaubeubh9)r}r(h&Uh'h:h(h+h-h>h/}r(h3]h4]h2]h1]rhah5]rh auh7Khh8hh!]r (hE)r!}r"(h&X Log Objectsr#h'jh(h+h-hIh/}r$(h3]h4]h2]h1]h5]uh7Khh8hh!]r%hLX Log Objectsr&r'}r((h&j#h'j!ubaubhP)r)}r*(h&XPOld steps had two ways of interacting with logfiles, both of which have changed.r+h'jh(h+h-hTh/}r,(h3]h4]h2]h1]h5]uh7Kjh8hh!]r-hLXPOld steps had two ways of interacting with logfiles, both of which have changed.r.r/}r0(h&j+h'j)ubaubhP)r1}r2(h&XThe first is writing to logs while a step is executing. When using :py:meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog` or :py:meth:`~buildbot.process.buildstep.BuildStep.addHTMLLog`, this is straightforward, except that in new-style steps these methods return a Deferred.h'jh(h+h-hTh/}r3(h3]h4]h2]h1]h5]uh7Klh8hh!]r4(hLXCThe first is writing to logs while a step is executing. When using r5r6}r7(h&XCThe first is writing to logs while a step is executing. When using h'j1ubhi)r8}r9(h&X?:py:meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog`r:h'j1h(h+h-hmh/}r;(UreftypeXmethhohpX3buildbot.process.buildstep.BuildStep.addCompleteLogU refdomainXpyr<h1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Klh!]r=hw)r>}r?(h&j:h/}r@(h3]h4]rA(h|j<Xpy-methrBeh2]h1]h5]uh'j8h!]rChLXaddCompleteLogrDrE}rF(h&Uh'j>ubah-hubaubhLX or rGrH}rI(h&X or h'j1ubhi)rJ}rK(h&X;:py:meth:`~buildbot.process.buildstep.BuildStep.addHTMLLog`rLh'j1h(h+h-hmh/}rM(UreftypeXmethhohpX/buildbot.process.buildstep.BuildStep.addHTMLLogU refdomainXpyrNh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Klh!]rOhw)rP}rQ(h&jLh/}rR(h3]h4]rS(h|jNXpy-methrTeh2]h1]h5]uh'jJh!]rUhLX addHTMLLogrVrW}rX(h&Uh'jPubah-hubaubhLXZ, this is straightforward, except that in new-style steps these methods return a Deferred.rYrZ}r[(h&XZ, this is straightforward, except that in new-style steps these methods return a Deferred.h'j1ubeubhP)r\}r](h&XThe second method is via :py:meth:`buildbot.process.buildstep.BuildStep.addLog`. In new-style steps, the returned object (via Deferred) has the following methods to add log content:h'jh(h+h-hTh/}r^(h3]h4]h2]h1]h5]uh7Koh8hh!]r_(hLXThe second method is via r`ra}rb(h&XThe second method is via h'j\ubhi)rc}rd(h&X6:py:meth:`buildbot.process.buildstep.BuildStep.addLog`reh'j\h(h+h-hmh/}rf(UreftypeXmethhohpX+buildbot.process.buildstep.BuildStep.addLogU refdomainXpyrgh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Koh!]rhhw)ri}rj(h&jeh/}rk(h3]h4]rl(h|jgXpy-methrmeh2]h1]h5]uh'jch!]rnhLX+buildbot.process.buildstep.BuildStep.addLogrorp}rq(h&Uh'jiubah-hubaubhLXf. In new-style steps, the returned object (via Deferred) has the following methods to add log content:rrrs}rt(h&Xf. In new-style steps, the returned object (via Deferred) has the following methods to add log content:h'j\ubeubh)ru}rv(h&Uh'jh(Nh-hh/}rw(h3]h4]h2]h1]h5]uh7Nh8hh!]rxh)ry}rz(h&Uh/}r{(hX*h1]h2]h3]h4]h5]uh'juh!]r|(h)r}}r~(h&X4:py:meth:`~buildbot.process.log.StreamLog.addStdout`rh/}r(h3]h4]h2]h1]h5]uh'jyh!]rhP)r}r(h&jh'j}h(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Krh!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX(buildbot.process.log.StreamLog.addStdoutU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Krh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX addStdoutrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X4:py:meth:`~buildbot.process.log.StreamLog.addStderr`rh/}r(h3]h4]h2]h1]h5]uh'jyh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Ksh!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX(buildbot.process.log.StreamLog.addStderrU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Ksh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX addStderrrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X4:py:meth:`~buildbot.process.log.StreamLog.addHeader`rh/}r(h3]h4]h2]h1]h5]uh'jyh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kth!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpX(buildbot.process.log.StreamLog.addHeaderU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kth!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX addHeaderrr}r(h&Uh'jubah-hubaubaubah-hubh)r}r(h&X,:py:meth:`~buildbot.process.log.Log.finish` h/}r(h3]h4]h2]h1]h5]uh'jyh!]rhP)r}r(h&X+:py:meth:`~buildbot.process.log.Log.finish`rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kuh!]rhi)r}r(h&jh'jh(h+h-hmh/}r(UreftypeXmethhohpXbuildbot.process.log.Log.finishU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kuh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLXfinishrr}r(h&Uh'jubah-hubaubaubah-hubeh-jubaubhP)r}r(h&XlAll of these methods now return Deferreds. None of the old log-reading methods are available on this object:rh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kwh8hh!]rhLXlAll of these methods now return Deferreds. None of the old log-reading methods are available on this object:rr}r(h&jh'jubaubh)r}r(h&Uh'jh(Nh-hh/}r(h3]h4]h2]h1]h5]uh7Nh8hh!]rh)r}r(h&Uh/}r(hX*h1]h2]h3]h4]h5]uh'jh!]r(h)r}r(h&X``hasContents``rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kzh!]rhw)r}r(h&jh/}r(h3]h4]h2]h1]h5]uh'jh!]rhLX hasContentsrr}r(h&Uh'jubah-hubaubah-hubh)r}r(h&X ``getText``rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K{h!]rhw)r}r(h&jh/}r(h3]h4]h2]h1]h5]uh'jh!]rhLXgetTextrr}r(h&Uh'jubah-hubaubah-hubh)r }r (h&X ``readLines``r h/}r (h3]h4]h2]h1]h5]uh'jh!]r hP)r}r(h&j h'j h(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7K|h!]rhw)r}r(h&j h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLX readLinesrr}r(h&Uh'jubah-hubaubah-hubh)r}r(h&X``getTextWithHeaders``rh/}r(h3]h4]h2]h1]h5]uh'jh!]rhP)r}r(h&jh'jh(h+h-hTh/}r (h3]h4]h2]h1]h5]uh7K}h!]r!hw)r"}r#(h&jh/}r$(h3]h4]h2]h1]h5]uh'jh!]r%hLXgetTextWithHeadersr&r'}r((h&Uh'j"ubah-hubaubah-hubh)r)}r*(h&X``getChunks`` h/}r+(h3]h4]h2]h1]h5]uh'jh!]r,hP)r-}r.(h&X ``getChunks``r/h'j)h(h+h-hTh/}r0(h3]h4]h2]h1]h5]uh7K~h!]r1hw)r2}r3(h&j/h/}r4(h3]h4]h2]h1]h5]uh'j-h!]r5hLX getChunksr6r7}r8(h&Uh'j2ubah-hubaubah-hubeh-jubaubhP)r9}r:(h&XIf your step uses such methods, consider using a :class:`~buildbot.process.logobserver.LogObserver` instead, or using the Data API to get the required data.r;h'jh(h+h-hTh/}r<(h3]h4]h2]h1]h5]uh7Kh8hh!]r=(hLX1If your step uses such methods, consider using a r>r?}r@(h&X1If your step uses such methods, consider using a h'j9ubhi)rA}rB(h&X2:class:`~buildbot.process.logobserver.LogObserver`rCh'j9h(h+h-hmh/}rD(UreftypeXclasshohpX(buildbot.process.logobserver.LogObserverU refdomainXpyrEh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rFhw)rG}rH(h&jCh/}rI(h3]h4]rJ(h|jEXpy-classrKeh2]h1]h5]uh'jAh!]rLhLX LogObserverrMrN}rO(h&Uh'jGubah-hubaubhLX9 instead, or using the Data API to get the required data.rPrQ}rR(h&X9 instead, or using the Data API to get the required data.h'j9ubeubhP)rS}rT(h&X[The undocumented and unused ``subscribeConsumer`` method of logfiles has also been removed.rUh'jh(h+h-hTh/}rV(h3]h4]h2]h1]h5]uh7Kh8hh!]rW(hLXThe undocumented and unused rXrY}rZ(h&XThe undocumented and unused h'jSubhw)r[}r\(h&X``subscribeConsumer``h/}r](h3]h4]h2]h1]h5]uh'jSh!]r^hLXsubscribeConsumerr_r`}ra(h&Uh'j[ubah-hubhLX* method of logfiles has also been removed.rbrc}rd(h&X* method of logfiles has also been removed.h'jSubeubhP)re}rf(h&XThe :py:meth:`~buildbot.process.log.Log.subscribe` method now takes a callable, rather than an instance, and does not support catchup. This method was primarily used by :py:class:`~buildbot.process.logobserver.LogObserver`, the implementation of which has been modified accordingly. Any other uses of the subscribe method should be refactored to use a :py:class:`~buildbot.process.logobserver.LogObserver`.h'jh(h+h-hTh/}rg(h3]h4]h2]h1]h5]uh7Kh8hh!]rh(hLXThe rirj}rk(h&XThe h'jeubhi)rl}rm(h&X.:py:meth:`~buildbot.process.log.Log.subscribe`rnh'jeh(h+h-hmh/}ro(UreftypeXmethhohpX"buildbot.process.log.Log.subscribeU refdomainXpyrph1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rqhw)rr}rs(h&jnh/}rt(h3]h4]ru(h|jpXpy-methrveh2]h1]h5]uh'jlh!]rwhLX subscriberxry}rz(h&Uh'jrubah-hubaubhLXw method now takes a callable, rather than an instance, and does not support catchup. This method was primarily used by r{r|}r}(h&Xw method now takes a callable, rather than an instance, and does not support catchup. This method was primarily used by h'jeubhi)r~}r(h&X5:py:class:`~buildbot.process.logobserver.LogObserver`rh'jeh(h+h-hmh/}r(UreftypeXclasshohpX(buildbot.process.logobserver.LogObserverU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-classreh2]h1]h5]uh'j~h!]rhLX LogObserverrr}r(h&Uh'jubah-hubaubhLX, the implementation of which has been modified accordingly. Any other uses of the subscribe method should be refactored to use a rr}r(h&X, the implementation of which has been modified accordingly. Any other uses of the subscribe method should be refactored to use a h'jeubhi)r}r(h&X5:py:class:`~buildbot.process.logobserver.LogObserver`rh'jeh(h+h-hmh/}r(UreftypeXclasshohpX(buildbot.process.logobserver.LogObserverU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-classreh2]h1]h5]uh'jh!]rhLX LogObserverrr}r(h&Uh'jubah-hubaubhLX.r}r(h&X.h'jeubeubeubh9)r}r(h&Uh'h:h(h+h-h>h/}r(h3]h4]h2]h1]rhah5]rh auh7Kh8hh!]r(hE)r}r(h&XStatus Stringsrh'jh(h+h-hIh/}r(h3]h4]h2]h1]h5]uh7Kh8hh!]rhLXStatus Stringsrr}r(h&jh'jubaubhP)r}r(h&XThe ``self.step_status.setText`` and ``setText2`` methods have been removed. Similarly, the ``_describe`` and ``describe`` methods are not used in new-style steps. In fact, steps no longer set their status directly.h'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kh8hh!]r(hLXThe rr}r(h&XThe h'jubhw)r}r(h&X``self.step_status.setText``h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLXself.step_status.setTextrr}r(h&Uh'jubah-hubhLX and rr}r(h&X and h'jubhw)r}r(h&X ``setText2``h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLXsetText2rr}r(h&Uh'jubah-hubhLX+ methods have been removed. Similarly, the rr}r(h&X+ methods have been removed. Similarly, the h'jubhw)r}r(h&X ``_describe``h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLX _describerr}r(h&Uh'jubah-hubhLX and rr}r(h&X and h'jubhw)r}r(h&X ``describe``h/}r(h3]h4]h2]h1]h5]uh'jh!]rhLXdescriberr}r(h&Uh'jubah-hubhLX] methods are not used in new-style steps. In fact, steps no longer set their status directly.rr}r(h&X] methods are not used in new-style steps. In fact, steps no longer set their status directly.h'jubeubhP)r}r(h&XInstead, steps call :py:meth:`buildbot.process.buildstep.BuildStep.updateSummary` whenever the status may have changed. This method calls :py:meth:`~buildbot.process.buildstep.BuildStep.getCurrentSummary` or :py:meth:`~buildbot.process.buildstep.BuildStep.getResultSummary` as appropriate and update displays of the step's status. Steps override the latter two methods to provide appropriate summaries.h'jh(h+h-hTh/}r(h3]h4]h2]h1]h5]uh7Kh8hh!]r(hLXInstead, steps call rr}r(h&XInstead, steps call h'jubhi)r}r(h&X=:py:meth:`buildbot.process.buildstep.BuildStep.updateSummary`rh'jh(h+h-hmh/}r(UreftypeXmethhohpX2buildbot.process.buildstep.BuildStep.updateSummaryU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLX2buildbot.process.buildstep.BuildStep.updateSummaryrr}r(h&Uh'jubah-hubaubhLX9 whenever the status may have changed. This method calls rr}r(h&X9 whenever the status may have changed. This method calls h'jubhi)r}r(h&XB:py:meth:`~buildbot.process.buildstep.BuildStep.getCurrentSummary`rh'jh(h+h-hmh/}r(UreftypeXmethhohpX6buildbot.process.buildstep.BuildStep.getCurrentSummaryU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rhw)r}r(h&jh/}r(h3]h4]r(h|jXpy-methreh2]h1]h5]uh'jh!]rhLXgetCurrentSummaryrr}r(h&Uh'jubah-hubaubhLX or rr}r(h&X or h'jubhi)r }r (h&XA:py:meth:`~buildbot.process.buildstep.BuildStep.getResultSummary`r h'jh(h+h-hmh/}r (UreftypeXmethhohpX5buildbot.process.buildstep.BuildStep.getResultSummaryU refdomainXpyr h1]h2]U refexplicith3]h4]h5]hrhshtNhuNuh7Kh!]rhw)r}r(h&j h/}r(h3]h4]r(h|j Xpy-methreh2]h1]h5]uh'j h!]rhLXgetResultSummaryrr}r(h&Uh'jubah-hubaubhLX as appropriate and update displays of the step's status. Steps override the latter two methods to provide appropriate summaries.rr}r(h&X as appropriate and update displays of the step's status. Steps override the latter two methods to provide appropriate summaries.h'jubeubeubh9)r}r(h&Uh'h:h(h+h-h>h/}r(h3]h4]h2]h1]rhah5]rhauh7Kh8hh!]r (hE)r!}r"(h&X Statisticsr#h'jh(h+h-hIh/}r$(h3]h4]h2]h1]h5]uh7Kh8hh!]r%hLX Statisticsr&r'}r((h&j#h'j!ubaubhP)r)}r*(h&XSupport for statistics has been moved to the ``BuildStep`` and ``Build`` objects. Calls to ``self.step_status.setStatistic`` should be rewritten as ``self.setStatistic``.h'jh(h+h-hTh/}r+(h3]h4]h2]h1]h5]uh7Kh8hh!]r,(hLX-Support for statistics has been moved to the r-r.}r/(h&X-Support for statistics has been moved to the h'j)ubhw)r0}r1(h&X ``BuildStep``h/}r2(h3]h4]h2]h1]h5]uh'j)h!]r3hLX BuildStepr4r5}r6(h&Uh'j0ubah-hubhLX and r7r8}r9(h&X and h'j)ubhw)r:}r;(h&X ``Build``h/}r<(h3]h4]h2]h1]h5]uh'j)h!]r=hLXBuildr>r?}r@(h&Uh'j:ubah-hubhLX objects. Calls to rArB}rC(h&X objects. Calls to h'j)ubhw)rD}rE(h&X!``self.step_status.setStatistic``h/}rF(h3]h4]h2]h1]h5]uh'j)h!]rGhLXself.step_status.setStatisticrHrI}rJ(h&Uh'jDubah-hubhLX should be rewritten as rKrL}rM(h&X should be rewritten as h'j)ubhw)rN}rO(h&X``self.setStatistic``h/}rP(h3]h4]h2]h1]h5]uh'j)h!]rQhLXself.setStatisticrRrS}rT(h&Uh'jNubah-hubhLX.rU}rV(h&X.h'j)ubeubeubeubeh&UU transformerrWNU footnote_refsrX}rYUrefnamesrZ}r[Usymbol_footnotesr\]r]Uautofootnote_refsr^]r_Usymbol_footnote_refsr`]raU citationsrb]rch8hU current_linerdNUtransform_messagesre]rfcdocutils.nodes system_message rg)rh}ri(h&Uh/}rj(h3]UlevelKh1]h2]Usourceh+h4]h5]UlineKUtypeUINFOrkuh!]rlhP)rm}rn(h&Uh/}ro(h3]h4]h2]h1]h5]uh'jhh!]rphLX;Hyperlink target "new-style-build-steps" is not referenced.rqrr}rs(h&Uh'jmubah-hTubah-Usystem_messagertubaUreporterruNUid_startrvKU autofootnotesrw]rxU citation_refsry}rzUindirect_targetsr{]r|Usettingsr}(cdocutils.frontend Values r~or}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhINUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUW/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/new-style-steps.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hjhjhjhh:hjh hhjhh:hjuUsubstitution_namesr}rh-h8h/}r(h3]h1]h2]Usourceh+h4]h5]uU footnotesr]rUrefidsr}rh]rh$asub.PK4DY5buildbot-v0.8.9/.doctrees/manual/cfg-builders.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xmerging build requestsqNXprioritizing buildsqNXmerging-build-requestsqXprioritizing-buildsq Xbuilder configurationq NXbuilder-configurationq Ucontentsq NuUsubstitution_defsq }qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUid2qhUid3qhUmerging-build-requestsqh Uprioritizing-buildsqh Uid1qh Ubuilder-configurationqh UcontentsquUchildrenq]q(cdocutils.nodes comment q)q }q!(U rawsourceq"X -*- rst -*-Uparentq#hUsourceq$cdocutils.nodes reprunicode q%XT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-builders.rstq&q'}q(bUtagnameq)Ucommentq*U attributesq+}q,(U xml:spaceq-Upreserveq.Uidsq/]Ubackrefsq0]Udupnamesq1]Uclassesq2]Unamesq3]uUlineq4KUdocumentq5hh]q6cdocutils.nodes Text q7X -*- rst -*-q8q9}q:(h"Uh#h ubaubcsphinx.addnodes index q;)q<}q=(h"Uh#hh$h'h)Uindexq>h+}q?(h/]h0]h1]h2]h3]Uentries]q@((UsingleXBuildmaster Config; buildersX cfg-buildersqAhAtqB(UsingleXbuilders (Buildmaster Config)hAhAtqCeuh4Kh5hh]ubcdocutils.nodes target qD)qE}qF(h"Uh#hh$h'h)UtargetqGh+}qH(h/]h0]h1]h2]h3]UrefidqIhAuh4Kh5hh]ubhD)qJ}qK(h"X.. _Builder-Configuration:h#hh$h'Uexpect_referenced_by_nameqL}h)hGh+}qM(h/]h0]h1]h2]h3]hIhuh4Kh5hUexpect_referenced_by_idqN}qOhAhEsh]ubcdocutils.nodes section qP)qQ}qR(h"Uh#hh$h'hL}qSh hJsh)UsectionqTh+}qU(h1]h2]h0]h/]qV(hhAheh3]qW(h h euh4Kh5hhN}qX(hhJhAhEuh]qY(cdocutils.nodes title qZ)q[}q\(h"XBuilder Configurationq]h#hQh$h'h)Utitleq^h+}q_(h1]h2]h0]h/]h3]uh4Kh5hh]q`h7XBuilder Configurationqaqb}qc(h"h]h#h[ubaubcdocutils.nodes topic qd)qe}qf(h"Uh#hQh$h'h)Utopicqgh+}qh(h1]h2]qi(UcontentsqjUlocalqkeh0]h/]qlhah3]qmh auh4K h5hh]qncdocutils.nodes bullet_list qo)qp}qq(h"Uh#heh$Nh)U bullet_listqrh+}qs(h1]h2]h0]h/]h3]uh4Nh5hh]qt(cdocutils.nodes list_item qu)qv}qw(h"Uh+}qx(h1]h2]h0]h/]h3]uh#hph]qycdocutils.nodes paragraph qz)q{}q|(h"Uh+}q}(h1]h2]h0]h/]h3]uh#hvh]q~cdocutils.nodes reference q)q}q(h"Uh+}q(h/]qUid4qah0]h1]h2]h3]Urefidhuh#h{h]qh7XMerging Build Requestsqq}q(h"XMerging Build Requestsqh#hubah)U referencequbah)U paragraphqubah)U list_itemqubhu)q}q(h"Uh+}q(h1]h2]h0]h/]h3]uh#hph]qhz)q}q(h"Uh+}q(h1]h2]h0]h/]h3]uh#hh]qh)q}q(h"Uh+}q(h/]qUid5qah0]h1]h2]h3]Urefidhuh#hh]qh7XPrioritizing Buildsqq}q(h"XPrioritizing Buildsqh#hubah)hubah)hubah)hubeubaubhz)q}q(h"XRThe :bb:cfg:`builders` configuration key is a list of objects giving configuration for the Builders. For more information on the function of Builders in Buildbot, see :ref:`the Concepts chapter `. The class definition for the builder configuration is in :file:`buildbot.config`. In the configuration file, its use looks like::h#hQh$h'h)hh+}q(h1]h2]h0]h/]h3]uh4Kh5hh]q(h7XThe qq}q(h"XThe h#hubcsphinx.addnodes pending_xref q)q}q(h"X:bb:cfg:`builders`qh#hh$h'h)U pending_xrefqh+}q(UreftypeXcfgUrefwarnqU reftargetqXbuildersU refdomainXbbqh/]h0]U refexplicith1]h2]h3]UrefdocqXmanual/cfg-buildersquh4Kh]qcdocutils.nodes literal q)q}q(h"hh+}q(h1]h2]q(UxrefqhXbb-cfgqeh0]h/]h3]uh#hh]qh7Xbuildersqq}q(h"Uh#hubah)Uliteralqubaubh7X configuration key is a list of objects giving configuration for the Builders. For more information on the function of Builders in Buildbot, see qq}q(h"X configuration key is a list of objects giving configuration for the Builders. For more information on the function of Builders in Buildbot, see h#hubh)q}q(h"X%:ref:`the Concepts chapter `qh#hh$h'h)hh+}q(UreftypeXrefhhXbuilderU refdomainXstdqh/]h0]U refexplicith1]h2]h3]hhuh4Kh]qcdocutils.nodes emphasis q)q}q(h"hh+}q(h1]h2]q(hhXstd-refqeh0]h/]h3]uh#hh]qh7Xthe Concepts chapterq΅q}q(h"Uh#hubah)Uemphasisqubaubh7X<. The class definition for the builder configuration is in q҅q}q(h"X<. The class definition for the builder configuration is in h#hubh)q}q(h"Uh+}q(h/]h0]h1]h2]qXfileqaUrolehh3]uh#hh]qh7Xbuildbot.configqۅq}q(h"Xbuildbot.configh#hubah)hubh7X1. In the configuration file, its use looks like:qޅq}q(h"X1. In the configuration file, its use looks like:h#hubeubcdocutils.nodes literal_block q)q}q(h"Xfrom buildbot.config import BuilderConfig c['builders'] = [ BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f_quick), BuilderConfig(name='thorough', slavename='bot1', factory=f_thorough), ]h#hQh$h'h)U literal_blockqh+}q(h-h.h/]h0]h1]h2]h3]uh4Kh5hh]qh7Xfrom buildbot.config import BuilderConfig c['builders'] = [ BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f_quick), BuilderConfig(name='thorough', slavename='bot1', factory=f_thorough), ]q煁q}q(h"Uh#hubaubhz)q}q(h"X8``BuilderConfig`` takes the following keyword arguments:qh#hQh$h'h)hh+}q(h1]h2]h0]h/]h3]uh4Kh5hh]q(h)q}q(h"X``BuilderConfig``h+}q(h1]h2]h0]h/]h3]uh#hh]qh7X BuilderConfigqq}q(h"Uh#hubah)hubh7X' takes the following keyword arguments:qq}q(h"X' takes the following keyword arguments:h#hubeubcdocutils.nodes definition_list q)q}q(h"Uh#hQh$h'h)Udefinition_listqh+}q(h1]h2]h0]h/]h3]uh4Nh5hh]qcdocutils.nodes definition_list_item q)r}r(h"XM``name`` This specifies the Builder's name, which is used in status reports. h#hh$h'h)Udefinition_list_itemrh+}r(h1]h2]h0]h/]h3]uh4Kh]r(cdocutils.nodes term r)r}r(h"X``name``rh#jh$h'h)Utermr h+}r (h1]h2]h0]h/]h3]uh4Kh]r h)r }r (h"jh+}r(h1]h2]h0]h/]h3]uh#jh]rh7Xnamerr}r(h"Uh#j ubah)hubaubcdocutils.nodes definition r)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rhz)r}r(h"XCThis specifies the Builder's name, which is used in status reports.rh#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh]rh7XCThis specifies the Builder's name, which is used in status reports.rr}r(h"jh#jubaubah)U definitionr ubeubaubhz)r!}r"(h"X ``slavename``r#h#hQh$h'h)hh+}r$(h1]h2]h0]h/]h3]uh4Kh5hh]r%h)r&}r'(h"j#h+}r((h1]h2]h0]h/]h3]uh#j!h]r)h7X slavenamer*r+}r,(h"Uh#j&ubah)hubaubh)r-}r.(h"Uh#hQh$h'h)hh+}r/(h1]h2]h0]h/]h3]uh4Nh5hh]r0(h)r1}r2(h"XP``slavenames`` These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the :bb:cfg:`slaves` configuration parameter. Each buildslave can accommodate multiple builders. The ``slavenames`` parameter can be a list of names, while ``slavename`` can specify only one slave. h#j-h$h'h)jh+}r3(h1]h2]h0]h/]h3]uh4K&h]r4(j)r5}r6(h"X``slavenames``r7h#j1h$h'h)j h+}r8(h1]h2]h0]h/]h3]uh4K&h]r9h)r:}r;(h"j7h+}r<(h1]h2]h0]h/]h3]uh#j5h]r=h7X slavenamesr>r?}r@(h"Uh#j:ubah)hubaubj)rA}rB(h"Uh+}rC(h1]h2]h0]h/]h3]uh#j1h]rDhz)rE}rF(h"X@These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the :bb:cfg:`slaves` configuration parameter. Each buildslave can accommodate multiple builders. The ``slavenames`` parameter can be a list of names, while ``slavename`` can specify only one slave.h#jAh$h'h)hh+}rG(h1]h2]h0]h/]h3]uh4K"h]rH(h7X~These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the rIrJ}rK(h"X~These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the h#jEubh)rL}rM(h"X:bb:cfg:`slaves`rNh#jEh$h'h)hh+}rO(UreftypeXcfghhXslavesU refdomainXbbrPh/]h0]U refexplicith1]h2]h3]hhuh4K"h]rQh)rR}rS(h"jNh+}rT(h1]h2]rU(hjPXbb-cfgrVeh0]h/]h3]uh#jLh]rWh7XslavesrXrY}rZ(h"Uh#jRubah)hubaubh7XR configuration parameter. Each buildslave can accommodate multiple builders. The r[r\}r](h"XR configuration parameter. Each buildslave can accommodate multiple builders. The h#jEubh)r^}r_(h"X``slavenames``h+}r`(h1]h2]h0]h/]h3]uh#jEh]rah7X slavenamesrbrc}rd(h"Uh#j^ubah)hubh7X) parameter can be a list of names, while rerf}rg(h"X) parameter can be a list of names, while h#jEubh)rh}ri(h"X ``slavename``h+}rj(h1]h2]h0]h/]h3]uh#jEh]rkh7X slavenamerlrm}rn(h"Uh#jhubah)hubh7X can specify only one slave.rorp}rq(h"X can specify only one slave.h#jEubeubah)j ubeubh)rr}rs(h"X``factory`` This is a :class:`buildbot.process.factory.BuildFactory` instance which controls how the build is performed by defining the steps in the build. Full details appear in their own section, :ref:`Build-Factories`. h#j-h$h'h)jh+}rt(h1]h2]h0]h/]h3]uh4K+h5hh]ru(j)rv}rw(h"X ``factory``rxh#jrh$h'h)j h+}ry(h1]h2]h0]h/]h3]uh4K+h]rzh)r{}r|(h"jxh+}r}(h1]h2]h0]h/]h3]uh#jvh]r~h7Xfactoryrr}r(h"Uh#j{ubah)hubaubj)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jrh]rhz)r}r(h"XThis is a :class:`buildbot.process.factory.BuildFactory` instance which controls how the build is performed by defining the steps in the build. Full details appear in their own section, :ref:`Build-Factories`.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4K)h]r(h7X This is a rr}r(h"X This is a h#jubh)r}r(h"X.:class:`buildbot.process.factory.BuildFactory`rh#jh$h'h)hh+}r(UreftypeXclasshhX%buildbot.process.factory.BuildFactoryU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhUpy:classrNU py:modulerNuh4K)h]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7X%buildbot.process.factory.BuildFactoryrr}r(h"Uh#jubah)hubaubh7X instance which controls how the build is performed by defining the steps in the build. Full details appear in their own section, rr}r(h"X instance which controls how the build is performed by defining the steps in the build. Full details appear in their own section, h#jubh)r}r(h"X:ref:`Build-Factories`rh#jh$h'h)hh+}r(UreftypeXrefhhXbuild-factoriesU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4K)h]rh)r}r(h"jh+}r(h1]h2]r(hjXstd-refreh0]h/]h3]uh#jh]rh7XBuild-Factoriesrr}r(h"Uh#jubah)hubaubh7X.r}r(h"X.h#jubeubah)j ubeubeubhz)r}r(h"X9Other optional keys may be set on each ``BuilderConfig``:rh#hQh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4K-h5hh]r(h7X'Other optional keys may be set on each rr}r(h"X'Other optional keys may be set on each h#jubh)r}r(h"X``BuilderConfig``h+}r(h1]h2]h0]h/]h3]uh#jh]rh7X BuilderConfigrr}r(h"Uh#jubah)hubh7X:r}r(h"X:h#jubeubh)r}r(h"Uh#hQh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Nh5hh]r(h)r}r(h"X4``builddir`` Specifies the name of a subdirectory of the master's basedir in which everything related to this builder will be stored. This holds build status information. If not set, this parameter defaults to the builder name, with some characters escaped. Each builder must have a unique build directory. h#jh$h'h)jh+}r(h1]h2]h0]h/]h3]uh4K3h]r(j)r}r(h"X ``builddir``rh#jh$h'h)j h+}r(h1]h2]h0]h/]h3]uh4K3h]rh)r}r(h"jh+}r(h1]h2]h0]h/]h3]uh#jh]rh7Xbuilddirrr}r(h"Uh#jubah)hubaubj)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rhz)r}r(h"X&Specifies the name of a subdirectory of the master's basedir in which everything related to this builder will be stored. This holds build status information. If not set, this parameter defaults to the builder name, with some characters escaped. Each builder must have a unique build directory.rh#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4K0h]rh7X&Specifies the name of a subdirectory of the master's basedir in which everything related to this builder will be stored. This holds build status information. If not set, this parameter defaults to the builder name, with some characters escaped. Each builder must have a unique build directory.rr}r(h"jh#jubaubah)j ubeubh)r}r(h"X``slavebuilddir`` Specifies the name of a subdirectory (under the slave's configured base directory) in which everything related to this builder will be placed on the buildslave. This is where checkouts, compiles, and tests are run. If not set, defaults to ``builddir``. If a slave is connected to multiple builders that share the same ``slavebuilddir``, make sure the slave is set to run one build at a time or ensure this is fine to run multiple builds from the same directory simultaneously. h#jh$h'h)jh+}r(h1]h2]h0]h/]h3]uh4K}r?(h"Uh+}r@(h1]h2]h0]h/]h3]uh#j.h]rAhz)rB}rC(h"XUIf provided, this is a function that controls which slave will be assigned future jobs. The function is passed two arguments, the :class:`Builder` object which is assigning a new job, and a list of :class:`SlaveBuilder` objects. The function should return one of the :class:`SlaveBuilder` objects, or ``None`` if none of the available slaves should be used. As an example, for each ``slave`` in the list, ``slave.slave`` will be a :class:`BuildSlave` object, and ``slave.slave.slavename`` is the slave's name. The function can optionally return a Deferred, which should fire with the same results.h#j>h$h'h)hh+}rD(h1]h2]h0]h/]h3]uh4KJh]rE(h7XIf provided, this is a function that controls which slave will be assigned future jobs. The function is passed two arguments, the rFrG}rH(h"XIf provided, this is a function that controls which slave will be assigned future jobs. The function is passed two arguments, the h#jBubh)rI}rJ(h"X:class:`Builder`rKh#jBh$h'h)hh+}rL(UreftypeXclasshhXBuilderU refdomainXpyrMh/]h0]U refexplicith1]h2]h3]hhjNjNuh4KJh]rNh)rO}rP(h"jKh+}rQ(h1]h2]rR(hjMXpy-classrSeh0]h/]h3]uh#jIh]rTh7XBuilderrUrV}rW(h"Uh#jOubah)hubaubh7X4 object which is assigning a new job, and a list of rXrY}rZ(h"X4 object which is assigning a new job, and a list of h#jBubh)r[}r\(h"X:class:`SlaveBuilder`r]h#jBh$h'h)hh+}r^(UreftypeXclasshhX SlaveBuilderU refdomainXpyr_h/]h0]U refexplicith1]h2]h3]hhjNjNuh4KJh]r`h)ra}rb(h"j]h+}rc(h1]h2]rd(hj_Xpy-classreeh0]h/]h3]uh#j[h]rfh7X SlaveBuilderrgrh}ri(h"Uh#jaubah)hubaubh7X0 objects. The function should return one of the rjrk}rl(h"X0 objects. The function should return one of the h#jBubh)rm}rn(h"X:class:`SlaveBuilder`roh#jBh$h'h)hh+}rp(UreftypeXclasshhX SlaveBuilderU refdomainXpyrqh/]h0]U refexplicith1]h2]h3]hhjNjNuh4KJh]rrh)rs}rt(h"joh+}ru(h1]h2]rv(hjqXpy-classrweh0]h/]h3]uh#jmh]rxh7X SlaveBuilderryrz}r{(h"Uh#jsubah)hubaubh7X objects, or r|r}}r~(h"X objects, or h#jBubh)r}r(h"X``None``h+}r(h1]h2]h0]h/]h3]uh#jBh]rh7XNonerr}r(h"Uh#jubah)hubh7XI if none of the available slaves should be used. As an example, for each rr}r(h"XI if none of the available slaves should be used. As an example, for each h#jBubh)r}r(h"X ``slave``h+}r(h1]h2]h0]h/]h3]uh#jBh]rh7Xslaverr}r(h"Uh#jubah)hubh7X in the list, rr}r(h"X in the list, h#jBubh)r}r(h"X``slave.slave``h+}r(h1]h2]h0]h/]h3]uh#jBh]rh7X slave.slaverr}r(h"Uh#jubah)hubh7X will be a rr}r(h"X will be a h#jBubh)r}r(h"X:class:`BuildSlave`rh#jBh$h'h)hh+}r(UreftypeXclasshhX BuildSlaveU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4KJh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7X BuildSlaverr}r(h"Uh#jubah)hubaubh7X object, and rr}r(h"X object, and h#jBubh)r}r(h"X``slave.slave.slavename``h+}r(h1]h2]h0]h/]h3]uh#jBh]rh7Xslave.slave.slavenamerr}r(h"Uh#jubah)hubh7Xm is the slave's name. The function can optionally return a Deferred, which should fire with the same results.rr}r(h"Xm is the slave's name. The function can optionally return a Deferred, which should fire with the same results.h#jBubeubah)j ubeubh)r}r(h"X``nextBuild`` If provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the :class:`Builder` object which is assigning a new job, and a list of :class:`BuildRequest` objects of pending builds. The function should return one of the :class:`BuildRequest` objects, or ``None`` if none of the pending builds should be started. This function can optionally return a Deferred which should fire with the same results. h#jh$h'h)jh+}r(h1]h2]h0]h/]h3]uh4KZh5hh]r(j)r}r(h"X ``nextBuild``rh#jh$h'h)j h+}r(h1]h2]h0]h/]h3]uh4KZh]rh)r}r(h"jh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X nextBuildrr}r(h"Uh#jubah)hubaubj)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rhz)r}r(h"XIf provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the :class:`Builder` object which is assigning a new job, and a list of :class:`BuildRequest` objects of pending builds. The function should return one of the :class:`BuildRequest` objects, or ``None`` if none of the pending builds should be started. This function can optionally return a Deferred which should fire with the same results.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4KTh]r(h7XIf provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the rr}r(h"XIf provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the h#jubh)r}r(h"X:class:`Builder`rh#jh$h'h)hh+}r(UreftypeXclasshhXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4KTh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7XBuilderrr}r(h"Uh#jubah)hubaubh7X4 object which is assigning a new job, and a list of rr}r(h"X4 object which is assigning a new job, and a list of h#jubh)r}r(h"X:class:`BuildRequest`rh#jh$h'h)hh+}r(UreftypeXclasshhX BuildRequestU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4KTh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7X BuildRequestrr}r(h"Uh#jubah)hubaubh7XB objects of pending builds. The function should return one of the rr}r(h"XB objects of pending builds. The function should return one of the h#jubh)r}r(h"X:class:`BuildRequest`rh#jh$h'h)hh+}r(UreftypeXclasshhX BuildRequestU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4KTh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7X BuildRequestrr}r(h"Uh#jubah)hubaubh7X objects, or rr}r (h"X objects, or h#jubh)r }r (h"X``None``h+}r (h1]h2]h0]h/]h3]uh#jh]r h7XNonerr}r(h"Uh#j ubah)hubh7X if none of the pending builds should be started. This function can optionally return a Deferred which should fire with the same results.rr}r(h"X if none of the pending builds should be started. This function can optionally return a Deferred which should fire with the same results.h#jubeubah)j ubeubh)r}r(h"X``canStartBuild`` If provided, this is a function that can veto whether a particular buildslave should be used for a given build request. The function is passed three arguments: the :class:`Builder`, a :class:`BuildSlave`, and a :class:`BuildRequest`. The function should return ``True`` if the combination is acceptable, or ``False`` otherwise. This function can optionally return a Deferred which should fire with the same results. h#jh$h'h)jh+}r(h1]h2]h0]h/]h3]uh4Kbh5hh]r(j)r}r(h"X``canStartBuild``rh#jh$h'h)j h+}r(h1]h2]h0]h/]h3]uh4Kbh]rh)r}r(h"jh+}r(h1]h2]h0]h/]h3]uh#jh]r h7X canStartBuildr!r"}r#(h"Uh#jubah)hubaubj)r$}r%(h"Uh+}r&(h1]h2]h0]h/]h3]uh#jh]r'hz)r(}r)(h"XIf provided, this is a function that can veto whether a particular buildslave should be used for a given build request. The function is passed three arguments: the :class:`Builder`, a :class:`BuildSlave`, and a :class:`BuildRequest`. The function should return ``True`` if the combination is acceptable, or ``False`` otherwise. This function can optionally return a Deferred which should fire with the same results.h#j$h$h'h)hh+}r*(h1]h2]h0]h/]h3]uh4K]h]r+(h7XIf provided, this is a function that can veto whether a particular buildslave should be used for a given build request. The function is passed three arguments: the r,r-}r.(h"XIf provided, this is a function that can veto whether a particular buildslave should be used for a given build request. The function is passed three arguments: the h#j(ubh)r/}r0(h"X:class:`Builder`r1h#j(h$h'h)hh+}r2(UreftypeXclasshhXBuilderU refdomainXpyr3h/]h0]U refexplicith1]h2]h3]hhjNjNuh4K]h]r4h)r5}r6(h"j1h+}r7(h1]h2]r8(hj3Xpy-classr9eh0]h/]h3]uh#j/h]r:h7XBuilderr;r<}r=(h"Uh#j5ubah)hubaubh7X, a r>r?}r@(h"X, a h#j(ubh)rA}rB(h"X:class:`BuildSlave`rCh#j(h$h'h)hh+}rD(UreftypeXclasshhX BuildSlaveU refdomainXpyrEh/]h0]U refexplicith1]h2]h3]hhjNjNuh4K]h]rFh)rG}rH(h"jCh+}rI(h1]h2]rJ(hjEXpy-classrKeh0]h/]h3]uh#jAh]rLh7X BuildSlaverMrN}rO(h"Uh#jGubah)hubaubh7X, and a rPrQ}rR(h"X, and a h#j(ubh)rS}rT(h"X:class:`BuildRequest`rUh#j(h$h'h)hh+}rV(UreftypeXclasshhX BuildRequestU refdomainXpyrWh/]h0]U refexplicith1]h2]h3]hhjNjNuh4K]h]rXh)rY}rZ(h"jUh+}r[(h1]h2]r\(hjWXpy-classr]eh0]h/]h3]uh#jSh]r^h7X BuildRequestr_r`}ra(h"Uh#jYubah)hubaubh7X. The function should return rbrc}rd(h"X. The function should return h#j(ubh)re}rf(h"X``True``h+}rg(h1]h2]h0]h/]h3]uh#j(h]rhh7XTruerirj}rk(h"Uh#jeubah)hubh7X& if the combination is acceptable, or rlrm}rn(h"X& if the combination is acceptable, or h#j(ubh)ro}rp(h"X ``False``h+}rq(h1]h2]h0]h/]h3]uh#j(h]rrh7XFalsersrt}ru(h"Uh#joubah)hubh7Xc otherwise. This function can optionally return a Deferred which should fire with the same results.rvrw}rx(h"Xc otherwise. This function can optionally return a Deferred which should fire with the same results.h#j(ubeubah)j ubeubh)ry}rz(h"Xe``locks`` This argument specifies a list of locks that apply to this builder; see :ref:`Interlocks`. h#jh$h'h)jh+}r{(h1]h2]h0]h/]h3]uh4Kfh5hh]r|(j)r}}r~(h"X ``locks``rh#jyh$h'h)j h+}r(h1]h2]h0]h/]h3]uh4Kfh]rh)r}r(h"jh+}r(h1]h2]h0]h/]h3]uh#j}h]rh7Xlocksrr}r(h"Uh#jubah)hubaubj)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jyh]rhz)r}r(h"XZThis argument specifies a list of locks that apply to this builder; see :ref:`Interlocks`.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Keh]r(h7XHThis argument specifies a list of locks that apply to this builder; see rr}r(h"XHThis argument specifies a list of locks that apply to this builder; see h#jubh)r}r(h"X:ref:`Interlocks`rh#jh$h'h)hh+}r(UreftypeXrefhhX interlocksU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Keh]rh)r}r(h"jh+}r(h1]h2]r(hjXstd-refreh0]h/]h3]uh#jh]rh7X Interlocksrr}r(h"Uh#jubah)hubaubh7X.r}r(h"X.h#jubeubah)j ubeubh)r}r(h"X``env`` A Builder may be given a dictionary of environment variables in this parameter. The variables are used in :bb:step:`ShellCommand` steps in builds created by this builder. The environment variables will override anything in the buildslave's environment. Variables passed directly to a :class:`ShellCommand` will override variables of the same name passed to the Builder. For example, if you have a pool of identical slaves it is often easier to manage variables like :envvar:`PATH` from Buildbot rather than manually editing it inside of the slaves' environment. :: f = factory.BuildFactory f.addStep(ShellCommand( command=['bash', './configure'])) f.addStep(Compile()) c['builders'] = [ BuilderConfig(name='test', factory=f, slavenames=['slave1', 'slave2', 'slave3', 'slave4'], env={'PATH': '/opt/local/bin:/opt/app/bin:/usr/local/bin:/usr/bin'}), ] Unlike most builder configuration arguments, this argument can contain renderables. h#jh$h'h)jh+}r(h1]h2]h0]h/]h3]uh4K~h5hh]r(j)r}r(h"X``env``rh#jh$h'h)j h+}r(h1]h2]h0]h/]h3]uh4K~h]rh)r}r(h"jh+}r(h1]h2]h0]h/]h3]uh#jh]rh7Xenvrr}r(h"Uh#jubah)hubaubj)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]r(hz)r}r(h"XqA Builder may be given a dictionary of environment variables in this parameter. The variables are used in :bb:step:`ShellCommand` steps in builds created by this builder. The environment variables will override anything in the buildslave's environment. Variables passed directly to a :class:`ShellCommand` will override variables of the same name passed to the Builder.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kih]r(h7XjA Builder may be given a dictionary of environment variables in this parameter. The variables are used in rr}r(h"XjA Builder may be given a dictionary of environment variables in this parameter. The variables are used in h#jubh)r}r(h"X:bb:step:`ShellCommand`rh#jh$h'h)hh+}r(UreftypeXstephhX ShellCommandU refdomainXbbrh/]h0]U refexplicith1]h2]h3]hhuh4Kih]rh)r}r(h"jh+}r(h1]h2]r(hjXbb-stepreh0]h/]h3]uh#jh]rh7X ShellCommandrr}r(h"Uh#jubah)hubaubh7X steps in builds created by this builder. The environment variables will override anything in the buildslave's environment. Variables passed directly to a rr}r(h"X steps in builds created by this builder. The environment variables will override anything in the buildslave's environment. Variables passed directly to a h#jubh)r}r(h"X:class:`ShellCommand`rh#jh$h'h)hh+}r(UreftypeXclasshhX ShellCommandU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4Kih]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7X ShellCommandrr}r(h"Uh#jubah)hubaubh7X@ will override variables of the same name passed to the Builder.rr}r(h"X@ will override variables of the same name passed to the Builder.h#jubeubhz)r}r(h"XFor example, if you have a pool of identical slaves it is often easier to manage variables like :envvar:`PATH` from Buildbot rather than manually editing it inside of the slaves' environment. ::h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Koh]r(h7X`For example, if you have a pool of identical slaves it is often easier to manage variables like rr}r(h"X`For example, if you have a pool of identical slaves it is often easier to manage variables like h#jubh;)r}r(h"Uh+}r(h/]h0]h1]h2]h3]Uentriesr]r((UsinglerXPATHrUindex-0rUtr(jXenvironment variable; PATHjUtreuh#jh]h)h>ubhD)r}r(h"Uh+}r(h1]h2]h0]h/]rjah3]uh#jh]h)hGubh)r}r(h"X:envvar:`PATH`rh#jh$h'h)hh+}r(UreftypeXenvvarhhjU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Koh]rh)r}r(h"jh+}r(h1]h2]r(hjX std-envvarreh0]h/]h3]uh#jh]rh7XPATHrr}r(h"Uh#jubah)hubaubh7XQ from Buildbot rather than manually editing it inside of the slaves' environment.rr }r (h"XQ from Buildbot rather than manually editing it inside of the slaves' environment.h#jubeubh)r }r (h"X=f = factory.BuildFactory f.addStep(ShellCommand( command=['bash', './configure'])) f.addStep(Compile()) c['builders'] = [ BuilderConfig(name='test', factory=f, slavenames=['slave1', 'slave2', 'slave3', 'slave4'], env={'PATH': '/opt/local/bin:/opt/app/bin:/usr/local/bin:/usr/bin'}), ]h#jh)hh+}r (h-h.h/]h0]h1]h2]h3]uh4Ksh]rh7X=f = factory.BuildFactory f.addStep(ShellCommand( command=['bash', './configure'])) f.addStep(Compile()) c['builders'] = [ BuilderConfig(name='test', factory=f, slavenames=['slave1', 'slave2', 'slave3', 'slave4'], env={'PATH': '/opt/local/bin:/opt/app/bin:/usr/local/bin:/usr/bin'}), ]rr}r(h"Uh#j ubaubhz)r}r(h"XSUnlike most builder configuration arguments, this argument can contain renderables.rh#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4K~h]rh7XSUnlike most builder configuration arguments, this argument can contain renderables.rr}r(h"jh#jubaubeh)j ubeubeubh;)r}r(h"Uh#hQh$h'h)h>h+}r(h/]h0]h1]h2]h3]j]r(jXBuilds; mergingUindex-1rUtraUinliner uh4Kh5hh]ubhD)r!}r"(h"Uh#hQh$h'h)hGh+}r#(h/]h0]h1]h2]h3]hIjuh4Kh5hh]ubh)r$}r%(h"Uh#hQh$h'hL}h)hh+}r&(h1]h2]h0]h/]r'jah3]uh4Nh5hhN}r(jj!sh]r)h)r*}r+(h"X|``mergeRequests`` Specifies how build requests for this builder should be merged. See :ref:`Merging-Build-Requests`, below. h#j$h$h'h)jh+}r,(h1]h2]h0]h/]h3]uh4Kh]r-(j)r.}r/(h"X``mergeRequests``r0h#j*h$h'h)j h+}r1(h1]h2]h0]h/]h3]uh4Kh]r2h)r3}r4(h"j0h+}r5(h1]h2]h0]h/]h3]uh#j.h]r6h7X mergeRequestsr7r8}r9(h"Uh#j3ubah)hubaubj)r:}r;(h"Uh+}r<(h1]h2]h0]h/]h3]uh#j*h]r=hz)r>}r?(h"XiSpecifies how build requests for this builder should be merged. See :ref:`Merging-Build-Requests`, below.h#j:h$h'h)hh+}r@(h1]h2]h0]h/]h3]uh4Kh]rA(h7XDSpecifies how build requests for this builder should be merged. See rBrC}rD(h"XDSpecifies how build requests for this builder should be merged. See h#j>ubh)rE}rF(h"X:ref:`Merging-Build-Requests`rGh#j>h$h'h)hh+}rH(UreftypeXrefhhXmerging-build-requestsU refdomainXstdrIh/]h0]U refexplicith1]h2]h3]hhuh4Kh]rJh)rK}rL(h"jGh+}rM(h1]h2]rN(hjIXstd-refrOeh0]h/]h3]uh#jEh]rPh7XMerging-Build-RequestsrQrR}rS(h"Uh#jKubah)hubaubh7X, below.rTrU}rV(h"X, below.h#j>ubeubah)j ubeubaubh;)rW}rX(h"Uh#hQh$h'h)h>h+}rY(h/]h0]h1]h2]h3]j]rZ(jXProperties; builderUindex-2r[Utr\aj uh4Kh5hh]ubhD)r]}r^(h"Uh#hQh$h'h)hGh+}r_(h/]h0]h1]h2]h3]hIj[uh4Kh5hh]ubh)r`}ra(h"Uh#hQh$h'hL}h)hh+}rb(h1]h2]h0]h/]rcj[ah3]uh4Nh5hhN}rdj[j]sh]re(h)rf}rg(h"X``properties`` A builder may be given a dictionary of :ref:`Build-Properties` specific for this builder in this parameter. Those values can be used later on like other properties. :ref:`Interpolate`. h#j`h$h'h)jh+}rh(h1]h2]h0]h/]h3]uh4Kh]ri(j)rj}rk(h"X``properties``rlh#jfh$h'h)j h+}rm(h1]h2]h0]h/]h3]uh4Kh]rnh)ro}rp(h"jlh+}rq(h1]h2]h0]h/]h3]uh#jjh]rrh7X propertiesrsrt}ru(h"Uh#joubah)hubaubj)rv}rw(h"Uh+}rx(h1]h2]h0]h/]h3]uh#jfh]ryhz)rz}r{(h"XA builder may be given a dictionary of :ref:`Build-Properties` specific for this builder in this parameter. Those values can be used later on like other properties. :ref:`Interpolate`.h#jvh$h'h)hh+}r|(h1]h2]h0]h/]h3]uh4Kh]r}(h7X'A builder may be given a dictionary of r~r}r(h"X'A builder may be given a dictionary of h#jzubh)r}r(h"X:ref:`Build-Properties`rh#jzh$h'h)hh+}r(UreftypeXrefhhXbuild-propertiesU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXstd-refreh0]h/]h3]uh#jh]rh7XBuild-Propertiesrr}r(h"Uh#jubah)hubaubh7Xg specific for this builder in this parameter. Those values can be used later on like other properties. rr}r(h"Xg specific for this builder in this parameter. Those values can be used later on like other properties. h#jzubh)r}r(h"X:ref:`Interpolate`rh#jzh$h'h)hh+}r(UreftypeXrefhhX interpolateU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXstd-refreh0]h/]h3]uh#jh]rh7X Interpolaterr}r(h"Uh#jubah)hubaubh7X.r}r(h"X.h#jzubeubah)j ubeubh)r}r(h"X}``description`` A builder may be given an arbitrary description, which will show up in the web status on the builder's page. h#j`h$h'h)jh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(j)r}r(h"X``description``rh#jh$h'h)j h+}r(h1]h2]h0]h/]h3]uh4Kh]rh)r}r(h"jh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X descriptionrr}r(h"Uh#jubah)hubaubj)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rhz)r}r(h"XlA builder may be given an arbitrary description, which will show up in the web status on the builder's page.rh#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh]rh7XlA builder may be given an arbitrary description, which will show up in the web status on the builder's page.rr}r(h"jh#jubaubah)j ubeubeubh;)r}r(h"Uh#hQh$h'h)h>h+}r(h/]h0]h1]h2]h3]j]r(jXBuilds; mergingUindex-3rUtraj uh4Kh5hh]ubhD)r}r(h"Uh#hQh$h'h)hGh+}r(h/]h0]h1]h2]h3]hIjuh4Kh5hh]ubhD)r}r(h"X.. _Merging-Build-Requests:h#hQh$h'hL}h)hGh+}r(h/]h0]h1]h2]h3]hIhuh4Kh5hhN}rjjsh]ubhP)r}r(h"Uh#hQh$h'hL}rhjsh)hTh+}r(h1]h2]h0]h/]r(hjheh3]r(hheuh4Kh5hhN}r(hjjjuh]r(hZ)r}r(h"hh#jh$h'h)h^h+}r(h/]h0]h1]h2]h3]hIhuh4Kh5hh]rh7XMerging Build Requestsrr}r(h"hh#jubaubhz)r}r(h"X'When more than one build request is available for a builder, Buildbot can "merge" the requests into a single build. This is desirable when build requests arrive more quickly than the available slaves can satisfy them, but has the drawback that separate results for each build are not available.rh#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]rh7X'When more than one build request is available for a builder, Buildbot can "merge" the requests into a single build. This is desirable when build requests arrive more quickly than the available slaves can satisfy them, but has the drawback that separate results for each build are not available.rr}r(h"jh#jubaubhz)r}r(h"XpRequests are only candidated for a merge if both requests have exactly the same :ref:`codebases`.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(h7XPRequests are only candidated for a merge if both requests have exactly the same rr}r(h"XPRequests are only candidated for a merge if both requests have exactly the same h#jubh)r}r(h"X:ref:`codebases`rh#jh$h'h)hh+}r(UreftypeXrefhhX attr-codebaseU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXstd-refreh0]h/]h3]uh#jh]rh7X codebasesrr}r(h"Uh#jubah)hubaubh7X.r}r(h"X.h#jubeubhz)r}r(h"XThis behavior can be controlled globally, using the :bb:cfg:`mergeRequests` parameter, and on a per-:class:`Builder` basis, using the ``mergeRequests`` argument to the :class:`Builder` configuration. If ``mergeRequests`` is given, it completely overrides the global configuration.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(h7X4This behavior can be controlled globally, using the rr}r(h"X4This behavior can be controlled globally, using the h#jubh)r}r(h"X:bb:cfg:`mergeRequests`rh#jh$h'h)hh+}r(UreftypeXcfghhX mergeRequestsU refdomainXbbrh/]h0]U refexplicith1]h2]h3]hhuh4Kh]rh)r }r (h"jh+}r (h1]h2]r (hjXbb-cfgr eh0]h/]h3]uh#jh]rh7X mergeRequestsrr}r(h"Uh#j ubah)hubaubh7X parameter, and on a per-rr}r(h"X parameter, and on a per-h#jubh)r}r(h"X:class:`Builder`rh#jh$h'h)hh+}r(UreftypeXclasshhXBuilderU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]r h7XBuilderr!r"}r#(h"Uh#jubah)hubaubh7X basis, using the r$r%}r&(h"X basis, using the h#jubh)r'}r((h"X``mergeRequests``h+}r)(h1]h2]h0]h/]h3]uh#jh]r*h7X mergeRequestsr+r,}r-(h"Uh#j'ubah)hubh7X argument to the r.r/}r0(h"X argument to the h#jubh)r1}r2(h"X:class:`Builder`r3h#jh$h'h)hh+}r4(UreftypeXclasshhXBuilderU refdomainXpyr5h/]h0]U refexplicith1]h2]h3]hhjNjNuh4Kh]r6h)r7}r8(h"j3h+}r9(h1]h2]r:(hj5Xpy-classr;eh0]h/]h3]uh#j1h]r<h7XBuilderr=r>}r?(h"Uh#j7ubah)hubaubh7X configuration. If r@rA}rB(h"X configuration. If h#jubh)rC}rD(h"X``mergeRequests``h+}rE(h1]h2]h0]h/]h3]uh#jh]rFh7X mergeRequestsrGrH}rI(h"Uh#jCubah)hubh7X< is given, it completely overrides the global configuration.rJrK}rL(h"X< is given, it completely overrides the global configuration.h#jubeubhz)rM}rN(h"XFor either configuration parameter, a value of ``True`` (the default) causes buildbot to merge BuildRequests that have "compatible" source stamps. Source stamps are compatible if:h#jh$h'h)hh+}rO(h1]h2]h0]h/]h3]uh4Kh5hh]rP(h7X/For either configuration parameter, a value of rQrR}rS(h"X/For either configuration parameter, a value of h#jMubh)rT}rU(h"X``True``h+}rV(h1]h2]h0]h/]h3]uh#jMh]rWh7XTruerXrY}rZ(h"Uh#jTubah)hubh7X} (the default) causes buildbot to merge BuildRequests that have "compatible" source stamps. Source stamps are compatible if:r[r\}r](h"X} (the default) causes buildbot to merge BuildRequests that have "compatible" source stamps. Source stamps are compatible if:h#jMubeubho)r^}r_(h"Uh#jh$h'h)hrh+}r`(UbulletraX*h/]h0]h1]h2]h3]uh4Kh5hh]rb(hu)rc}rd(h"XItheir codebase, branch, project, and repository attributes match exactly;reh#j^h$h'h)hh+}rf(h1]h2]h0]h/]h3]uh4Nh5hh]rghz)rh}ri(h"jeh#jch$h'h)hh+}rj(h1]h2]h0]h/]h3]uh4Kh]rkh7XItheir codebase, branch, project, and repository attributes match exactly;rlrm}rn(h"jeh#jhubaubaubhu)ro}rp(h"XBneither source stamp has a patch (e.g., from a try scheduler); andrqh#j^h$h'h)hh+}rr(h1]h2]h0]h/]h3]uh4Nh5hh]rshz)rt}ru(h"jqh#joh$h'h)hh+}rv(h1]h2]h0]h/]h3]uh4Kh]rwh7XBneither source stamp has a patch (e.g., from a try scheduler); andrxry}rz(h"jqh#jtubaubaubhu)r{}r|(h"Xeither both source stamps are associated with changes, or neither ar associated with changes but they have matching revisions. h#j^h$h'h)hh+}r}(h1]h2]h0]h/]h3]uh4Nh5hh]r~hz)r}r(h"X~either both source stamps are associated with changes, or neither ar associated with changes but they have matching revisions.rh#j{h$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh]rh7X~either both source stamps are associated with changes, or neither ar associated with changes but they have matching revisions.rr}r(h"jh#jubaubaubeubhz)r}r(h"XYThis algorithm is implemented by the :class:`SourceStamp` method :func:`canBeMergedWith`.rh#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(h7X%This algorithm is implemented by the rr}r(h"X%This algorithm is implemented by the h#jubh)r}r(h"X:class:`SourceStamp`rh#jh$h'h)hh+}r(UreftypeXclasshhX SourceStampU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classreh0]h/]h3]uh#jh]rh7X SourceStamprr}r(h"Uh#jubah)hubaubh7X method rr}r(h"X method h#jubh)r}r(h"X:func:`canBeMergedWith`rh#jh$h'h)hh+}r(UreftypeXfunchhXcanBeMergedWithU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-funcreh0]h/]h3]uh#jh]rh7XcanBeMergedWithrr}r(h"Uh#jubah)hubaubh7X.r}r(h"X.h#jubeubhz)r}r(h"XRA configuration value of ``False`` indicates that requests should never be merged.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(h7XA configuration value of rr}r(h"XA configuration value of h#jubh)r}r(h"X ``False``h+}r(h1]h2]h0]h/]h3]uh#jh]rh7XFalserr}r(h"Uh#jubah)hubh7X0 indicates that requests should never be merged.rr}r(h"X0 indicates that requests should never be merged.h#jubeubhz)r}r(h"XThe configuration value can also be a callable, specifying a custom merging function. See :ref:`Merge-Request-Functions` for details.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(h7X[The configuration value can also be a callable, specifying a custom merging function. See rr}r(h"X[The configuration value can also be a callable, specifying a custom merging function. See h#jubh)r}r(h"X:ref:`Merge-Request-Functions`rh#jh$h'h)hh+}r(UreftypeXrefhhXmerge-request-functionsU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXstd-refreh0]h/]h3]uh#jh]rh7XMerge-Request-Functionsrr}r(h"Uh#jubah)hubaubh7X for details.rr}r(h"X for details.h#jubeubh;)r}r(h"Uh#jh$h'h)h>h+}r(h/]h0]h1]h2]h3]j]r(jXBuilds; priorityUindex-4rUtraj uh4Kh5hh]ubhD)r}r(h"Uh#jh$h'h)hGh+}r(h/]h0]h1]h2]h3]hIjuh4Kh5hh]ubhD)r}r(h"X.. _Prioritizing-Builds:h#jh$h'hL}h)hGh+}r(h/]h0]h1]h2]h3]hIhuh4Kh5hhN}rjjsh]ubeubhP)r}r(h"Uh#hQh$h'hL}rh jsh)hTh+}r(h1]h2]h0]h/]r(hjheh3]r(hh euh4Kh5hhN}r(jjhjuh]r(hZ)r}r(h"hh#jh$h'h)h^h+}r(h/]h0]h1]h2]h3]hIhuh4Kh5hh]rh7XPrioritizing Buildsrr}r(h"hh#jubaubhz)r}r(h"XJThe :class:`BuilderConfig` parameter ``nextBuild`` can be use to prioritize build requests within a builder. Note that this is orthogonal to :ref:`Prioritizing-Builders`, which controls the order in which builders are called on to start their builds. The details of writing such a function are in :ref:`Build-Priority-Functions`.h#jh$h'h)hh+}r(h1]h2]h0]h/]h3]uh4Kh5hh]r(h7XThe rr}r(h"XThe h#jubh)r}r(h"X:class:`BuilderConfig`rh#jh$h'h)hh+}r(UreftypeXclasshhX BuilderConfigU refdomainXpyrh/]h0]U refexplicith1]h2]h3]hhjNjNuh4Kh]rh)r}r(h"jh+}r(h1]h2]r(hjXpy-classr eh0]h/]h3]uh#jh]r h7X BuilderConfigr r }r (h"Uh#jubah)hubaubh7X parameter rr}r(h"X parameter h#jubh)r}r(h"X ``nextBuild``h+}r(h1]h2]h0]h/]h3]uh#jh]rh7X nextBuildrr}r(h"Uh#jubah)hubh7X[ can be use to prioritize build requests within a builder. Note that this is orthogonal to rr}r(h"X[ can be use to prioritize build requests within a builder. Note that this is orthogonal to h#jubh)r}r(h"X:ref:`Prioritizing-Builders`rh#jh$h'h)hh+}r(UreftypeXrefhhXprioritizing-buildersU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hhuh4Kh]r h)r!}r"(h"jh+}r#(h1]h2]r$(hjXstd-refr%eh0]h/]h3]uh#jh]r&h7XPrioritizing-Buildersr'r(}r)(h"Uh#j!ubah)hubaubh7X, which controls the order in which builders are called on to start their builds. The details of writing such a function are in r*r+}r,(h"X, which controls the order in which builders are called on to start their builds. The details of writing such a function are in h#jubh)r-}r.(h"X:ref:`Build-Priority-Functions`r/h#jh$h'h)hh+}r0(UreftypeXrefhhXbuild-priority-functionsU refdomainXstdr1h/]h0]U refexplicith1]h2]h3]hhuh4Kh]r2h)r3}r4(h"j/h+}r5(h1]h2]r6(hj1Xstd-refr7eh0]h/]h3]uh#j-h]r8h7XBuild-Priority-Functionsr9r:}r;(h"Uh#j3ubah)hubaubh7X.r<}r=(h"X.h#jubeubhz)r>}r?(h"XASuch a function can be provided to the BuilderConfig as follows::r@h#jh$h'h)hh+}rA(h1]h2]h0]h/]h3]uh4Kh5hh]rBh7X@Such a function can be provided to the BuilderConfig as follows:rCrD}rE(h"X@Such a function can be provided to the BuilderConfig as follows:h#j>ubaubh)rF}rG(h"Xdef pickNextBuild(builder, requests): ... c['builders'] = [ BuilderConfig(name='test', factory=f, nextBuild=pickNextBuild, slavenames=['slave1', 'slave2', 'slave3', 'slave4']), ]h#jh$h'h)hh+}rH(h-h.h/]h0]h1]h2]h3]uh4Kh5hh]rIh7Xdef pickNextBuild(builder, requests): ... c['builders'] = [ BuilderConfig(name='test', factory=f, nextBuild=pickNextBuild, slavenames=['slave1', 'slave2', 'slave3', 'slave4']), ]rJrK}rL(h"Uh#jFubaubeubeubeh"UU transformerrMNU footnote_refsrN}rOUrefnamesrP}rQUsymbol_footnotesrR]rSUautofootnote_refsrT]rUUsymbol_footnote_refsrV]rWU citationsrX]rYh5hU current_linerZNUtransform_messagesr[]r\(cdocutils.nodes system_message r])r^}r_(h"Uh+}r`(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypeUINFOrauh]rbhz)rc}rd(h"Uh+}re(h1]h2]h0]h/]h3]uh#j^h]rfh7X2Hyperlink target "cfg-builders" is not referenced.rgrh}ri(h"Uh#jcubah)hubah)Usystem_messagerjubj])rk}rl(h"Uh+}rm(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rnhz)ro}rp(h"Uh+}rq(h1]h2]h0]h/]h3]uh#jkh]rrh7X;Hyperlink target "builder-configuration" is not referenced.rsrt}ru(h"Uh#joubah)hubah)jjubj])rv}rw(h"Uh+}rx(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKoUtypejauh]ryhz)rz}r{(h"Uh+}r|(h1]h2]h0]h/]h3]uh#jvh]r}h7X-Hyperlink target "index-0" is not referenced.r~r}r(h"Uh#jzubah)hubah)jjubj])r}r(h"Uh+}r(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rhz)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X-Hyperlink target "index-1" is not referenced.rr}r(h"Uh#jubah)hubah)jjubj])r}r(h"Uh+}r(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rhz)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X-Hyperlink target "index-2" is not referenced.rr}r(h"Uh#jubah)hubah)jjubj])r}r(h"Uh+}r(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rhz)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X-Hyperlink target "index-3" is not referenced.rr}r(h"Uh#jubah)hubah)jjubj])r}r(h"Uh+}r(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rhz)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X<Hyperlink target "merging-build-requests" is not referenced.rr}r(h"Uh#jubah)hubah)jjubj])r}r(h"Uh+}r(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rhz)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X-Hyperlink target "index-4" is not referenced.rr}r(h"Uh#jubah)hubah)jjubj])r}r(h"Uh+}r(h1]UlevelKh/]h0]Usourceh'h2]h3]UlineKUtypejauh]rhz)r}r(h"Uh+}r(h1]h2]h0]h/]h3]uh#jh]rh7X9Hyperlink target "prioritizing-builds" is not referenced.rr}r(h"Uh#jubah)hubah)jjubeUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh^NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cfg-builders.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongr Uinput_encoding_error_handlerr jUauto_id_prefixr Uidr Udoctitle_xformr Ustrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hAhQhhhhhjhjhjhhQjjhjjjjj$j[j`jjhhQhheuUsubstitution_namesr}rh)h5h+}r(h1]h/]h0]Usourceh'h2]h3]uU footnotesr]rUrefidsr}r(hA]rhEah]rjaj]rjah]r jaj]r!j!aj[]r"j]aj]r#jah]r$hJauub.PK6D5F|)|)0buildbot-v0.8.9/.doctrees/manual/cmdline.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xwaiting for resultsqNXbuildbotqNXcommand-line-toolqX buildslaveq NX statusguiq NXadministrator toolsq NXpatch informationq NX try--diffq Xspecifying the vc systemqNXstartqNXsending propertiesqNX sendchangeqNX create-masterqNXdeveloper toolsqNXcommand-line toolqNXsighupqNXstopqNX statuslogqNX debugclientqNXuserqNX other toolsqNX"determining the revision and patchqNXrestartqNXlocating the masterqNXbuildbot-config-directoryqXtryqNX create-slaveq NX try --diffq!NXchoosing the buildersq"NXdetermining the branch nameq#NX.buildbot config directoryq$NXfinding the top of the treeq%NuUsubstitution_defsq&}q'Uparse_messagesq(]q)(cdocutils.nodes system_message q*)q+}q,(U rawsourceq-UUparentq.cdocutils.nodes section q/)q0}q1(h-UU referencedq2Kh.h/)q3}q4(h-Uh.h/)q5}q6(h-Uh.hUsourceq7cdocutils.nodes reprunicode q8XO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cmdline.rstq9q:}q;bUexpect_referenced_by_nameq<}q=hcdocutils.nodes target q>)q?}q@(h-X.. _Command-line-Tool:h.hh7h:UtagnameqAUtargetqBU attributesqC}qD(UidsqE]UbackrefsqF]UdupnamesqG]UclassesqH]UnamesqI]UrefidqJUcommand-line-toolqKuUlineqLKUdocumentqMhUchildrenqN]ubshAUsectionqOhC}qP(hG]hH]hF]hE]qQ(hKUid1qRehI]qS(hheuhLKhMhUexpect_referenced_by_idqT}qUhKh?shN]qV(cdocutils.nodes title qW)qX}qY(h-XCommand-line ToolqZh.h5h7h:hAUtitleq[hC}q\(hG]hH]hF]hE]hI]uhLKhMhhN]q]cdocutils.nodes Text q^XCommand-line Toolq_q`}qa(h-hZh.hXubaubcdocutils.nodes paragraph qb)qc}qd(h-XThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all :command:`buildbot` command-line tool was divided into two parts namely :command:`buildbot` and :command:`buildslave`. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to :command:`buildbot` tool.h.h5h7h:hAU paragraphqehC}qf(hG]hH]hF]hE]hI]uhLKhMhhN]qg(h^XsThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all qhqi}qj(h-XsThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all h.hcubcdocutils.nodes strong qk)ql}qm(h-X:command:`buildbot`hC}qn(hG]hH]qoUcommandqpahF]hE]hI]uh.hchN]qqh^Xbuildbotqrqs}qt(h-Uh.hlubahAUstrongquubh^X5 command-line tool was divided into two parts namely qvqw}qx(h-X5 command-line tool was divided into two parts namely h.hcubhk)qy}qz(h-X:command:`buildbot`hC}q{(hG]hH]q|hpahF]hE]hI]uh.hchN]q}h^Xbuildbotq~q}q(h-Uh.hyubahAhuubh^X and qq}q(h-X and h.hcubhk)q}q(h-X:command:`buildslave`hC}q(hG]hH]qhpahF]hE]hI]uh.hchN]qh^X buildslaveqq}q(h-Uh.hubahAhuubh^X. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to qq}q(h-X. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to h.hcubhk)q}q(h-X:command:`buildbot`hC}q(hG]hH]qhpahF]hE]hI]uh.hchN]qh^Xbuildbotqq}q(h-Uh.hubahAhuubh^X tool.qq}q(h-X tool.h.hcubeubhb)q}q(h-XEvery command-line tool has a list of global options and a set of commands which have their own options. One can run these tools in the following way:qh.h5h7h:hAhehC}q(hG]hH]hF]hE]hI]uhLK hMhhN]qh^XEvery command-line tool has a list of global options and a set of commands which have their own options. One can run these tools in the following way:qq}q(h-hh.hubaubcdocutils.nodes literal_block q)q}q(h-Xibuildbot [global options] command [command options] buildslave [global options] command [command options]h.h5h7h:hAU literal_blockqhC}q(UlinenosqUlanguageqXnoneU xml:spaceqUpreserveqhE]hF]hG]hH]hI]uhLKhMhhN]qh^Xibuildbot [global options] command [command options] buildslave [global options] command [command options]qq}q(h-Uh.hubaubhb)q}q(h-XThe ``buildbot`` command is used on the master, while ``buildslave`` is used on the slave. Global options are the same for both tools which perform the following actions:h.h5h7h:hAhehC}q(hG]hH]hF]hE]hI]uhLKhMhhN]q(h^XThe qq}q(h-XThe h.hubcdocutils.nodes literal q)q}q(h-X ``buildbot``hC}q(hG]hH]hF]hE]hI]uh.hhN]qh^Xbuildbotqq}q(h-Uh.hubahAUliteralqubh^X& command is used on the master, while qq}q(h-X& command is used on the master, while h.hubh)q}q(h-X``buildslave``hC}q(hG]hH]hF]hE]hI]uh.hhN]qh^X buildslaveqƅq}q(h-Uh.hubahAhubh^Xg is used on the slave. Global options are the same for both tools which perform the following actions:qɅq}q(h-Xg is used on the slave. Global options are the same for both tools which perform the following actions:h.hubeubcdocutils.nodes option_list q)q}q(h-Uh.h5h7h:hAU option_listqhC}q(hG]hH]hF]hE]hI]uhLNhMhhN]q(cdocutils.nodes option_list_item q)q}q(h-Uh.hh7h:hAUoption_list_itemqhC}q(hG]hH]hF]hE]hI]uhLNhMhhN]q(cdocutils.nodes option_group q)q}q(h-UhC}q(hG]hH]hF]hE]hI]uh.hhN]qcdocutils.nodes option q)q}q(h-X--helpqhC}q(hG]hH]hF]hE]hI]uh.hhN]qcdocutils.nodes option_string q)q}q(h-hhC}q(hG]hH]hF]hE]hI]uh.hhN]qh^X--helpq腁q}q(h-Uh.hubahAU option_stringqubahAUoptionqubahAU option_groupqubcdocutils.nodes description q)q}q(h-XoPrint general help about available commands and global options and exit. All subsequent arguments are ignored. hC}q(hG]hH]hF]hE]hI]uh.hhN]qhb)q}q(h-XnPrint general help about available commands and global options and exit. All subsequent arguments are ignored.qh.hh7h:hAhehC}q(hG]hH]hF]hE]hI]uhLKhN]qh^XnPrint general help about available commands and global options and exit. All subsequent arguments are ignored.qq}q(h-hh.hubaubahAU descriptionqubeubh)q}q(h-Uh.hh7h:hAhhC}q(hG]hH]hF]hE]hI]uhLNhMhhN]q(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.hhN]rh)r}r(h-X --verboserhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r }r (h-jhC}r (hG]hH]hF]hE]hI]uh.jhN]r h^X --verboser r}r(h-Uh.j ubahAhubahAhubahAhubh)r}r(h-XSet verbose output. hC}r(hG]hH]hF]hE]hI]uh.hhN]rhb)r}r(h-XSet verbose output.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhN]rh^XSet verbose output.rr}r(h-jh.jubaubahAhubeubh)r}r(h-Uh.hh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r }r!(h-UhC}r"(hG]hH]hF]hE]hI]uh.jhN]r#h)r$}r%(h-X --versionr&hC}r'(hG]hH]hF]hE]hI]uh.j hN]r(h)r)}r*(h-j&hC}r+(hG]hH]hF]hE]hI]uh.j$hN]r,h^X --versionr-r.}r/(h-Uh.j)ubahAhubahAhubahAhubh)r0}r1(h-XOPrint current buildbot version and exit. All subsequent arguments are ignored. hC}r2(hG]hH]hF]hE]hI]uh.jhN]r3hb)r4}r5(h-XNPrint current buildbot version and exit. All subsequent arguments are ignored.r6h.j0h7h:hAhehC}r7(hG]hH]hF]hE]hI]uhLK!hN]r8h^XNPrint current buildbot version and exit. All subsequent arguments are ignored.r9r:}r;(h-j6h.j4ubaubahAhubeubeubhb)r<}r=(h-XMYou can get help on any command by specifying ``--help`` as a command option:h.h5h7h:hAhehC}r>(hG]hH]hF]hE]hI]uhLK$hMhhN]r?(h^X.You can get help on any command by specifying r@rA}rB(h-X.You can get help on any command by specifying h.j<ubh)rC}rD(h-X ``--help``hC}rE(hG]hH]hF]hE]hI]uh.j<hN]rFh^X--helprGrH}rI(h-Uh.jCubahAhubh^X as a command option:rJrK}rL(h-X as a command option:h.j<ubeubh)rM}rN(h-Xbuildbot @var{command} --helph.h5h7h:hAhhC}rO(hhXnonehhhE]hF]hG]hH]hI]uhLK'hMhhN]rPh^Xbuildbot @var{command} --helprQrR}rS(h-Uh.jMubaubhb)rT}rU(h-X|You can also use manual pages for :command:`buildbot` and :command:`buildslave` for quick reference on command-line options.h.h5h7h:hAhehC}rV(hG]hH]hF]hE]hI]uhLK+hMhhN]rW(h^X"You can also use manual pages for rXrY}rZ(h-X"You can also use manual pages for h.jTubhk)r[}r\(h-X:command:`buildbot`hC}r](hG]hH]r^hpahF]hE]hI]uh.jThN]r_h^Xbuildbotr`ra}rb(h-Uh.j[ubahAhuubh^X and rcrd}re(h-X and h.jTubhk)rf}rg(h-X:command:`buildslave`hC}rh(hG]hH]rihpahF]hE]hI]uh.jThN]rjh^X buildslaverkrl}rm(h-Uh.jfubahAhuubh^X- for quick reference on command-line options.rnro}rp(h-X- for quick reference on command-line options.h.jTubeubhb)rq}rr(h-XhThe remainder of this section describes each buildbot command. See :bb:index:`cmdline` for a full list.h.h5h7h:hAhehC}rs(hG]hH]hF]hE]hI]uhLK.hMhhN]rt(h^XDThe remainder of this section describes each buildbot command. See rurv}rw(h-XDThe remainder of this section describes each buildbot command. See h.jqubcsphinx.addnodes pending_xref rx)ry}rz(h-X:bb:index:`cmdline`r{h.jqh7h:hAU pending_xrefr|hC}r}(UreftypeXindexUrefwarnr~U reftargetrXcmdlineU refdomainXbbrhE]hF]U refexplicithG]hH]hI]UrefdocrXmanual/cmdlineruhLK.hN]rh)r}r(h-j{hC}r(hG]hH]r(UxrefrjXbb-indexrehF]hE]hI]uh.jyhN]rh^Xcmdlinerr}r(h-Uh.jubahAhubaubh^X for a full list.rr}r(h-X for a full list.h.jqubeubh/)r}r(h-Uh.h5h7h:hAhOhC}r(hG]hH]hF]hE]rUbuildbotrahI]rhauhLK2hMhhN]r(hW)r}r(h-Xbuildbotrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLK2hMhhN]rh^Xbuildbotrr}r(h-jh.jubaubhb)r}r(h-X"The :command:`buildbot` command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLK4hMhhN]r(h^XThe rr}r(h-XThe h.jubhk)r}r(h-X:command:`buildbot`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xbuildbotrr}r(h-Uh.jubahAhuubh^X  command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.rr}r(h-X  command-line tool can be used to start or stop a buildmaster or buildbot, and to interact with a running buildmaster. Some of its subcommands are intended for buildmaster admins, while some are for developers who are editing the code that the buildbot is monitoring.h.jubeubh/)r}r(h-Uh.jh7h:hAhOhC}r(hG]hH]hF]hE]rUadministrator-toolsrahI]rh auhLK;hMhhN]r(hW)r}r(h-XAdministrator Toolsrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLK;hMhhN]rh^XAdministrator Toolsrr}r(h-jh.jubaubhb)r}r(h-X[The following :command:`buildbot` sub-commands are intended for buildmaster administrators:h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLK=hMhhN]r(h^XThe following rr}r(h-XThe following h.jubhk)r}r(h-X:command:`buildbot`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xbuildbotrr}r(h-Uh.jubahAhuubh^X: sub-commands are intended for buildmaster administrators:rr}r(h-X: sub-commands are intended for buildmaster administrators:h.jubeubcsphinx.addnodes index r)r}r(h-Uh.jh7h:hAUindexrhC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleX'Command Line Subcommands; create-masterXcmdline-create-masterrjtr(UsingleX%create-master Command Line SubcommandjjtreuhLKAhMhhN]ubh>)r}r(h-Uh.jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLKAhMhhN]ubh/)r}r(h-Uh.jh7h:h<}hAhOhC}r(hG]hH]hF]hE]r(U create-masterrjehI]rhauhLKChMhhT}rjjshN]r(hW)r}r(h-X create-masterrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLKChMhhN]rh^X create-masterrr}r(h-jh.jubaubh)r}r(h-X#buildbot create-master -r {BASEDIR}h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLKEhMhhN]rh^X#buildbot create-master -r {BASEDIR}rr}r(h-Uh.jubaubhb)r}r(h-XtThis creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKIhMhhN]rh^XtThis creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.rr}r(h-jh.jubaubhb)r}r(h-XYou will usually want to use the :option:`-r` option to create a relocatable :file:`buildbot.tac`. This allows you to move the master directory without editing this file.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKKhMhhN]r(h^X!You will usually want to use the rr}r(h-X!You will usually want to use the h.jubjx)r}r(h-X :option:`-r`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX-rU refdomainXstdr U refprogramr NhE]hF]U refexplicithG]hH]hI]jjuhLKKhN]r csphinx.addnodes literal_emphasis r )r }r(h-jhC}r(hG]hH]r(jj X std-optionrehF]hE]hI]uh.jhN]rh^X-rrr}r(h-Uh.j ubahAUliteral_emphasisrubaubh^X option to create a relocatable rr}r(h-X option to create a relocatable h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X buildbot.tacr r!}r"(h-X buildbot.tach.jubahAhubh^XI. This allows you to move the master directory without editing this file.r#r$}r%(h-XI. This allows you to move the master directory without editing this file.h.jubeubj)r&}r'(h-Uh.jh7h:hAjhC}r((hE]hF]hG]hH]hI]Uentries]r)((UsingleX*Command Line Subcommands; start (buildbot)Xcmdline-start (buildbot)r*j*tr+(UsingleX(start (buildbot) Command Line Subcommandj*j*tr,euhLKOhMhhN]ubh>)r-}r.(h-Uh.jh7h:hAhBhC}r/(hE]hF]hG]hH]hI]hJj*uhLKOhMhhN]ubeubh/)r0}r1(h-Uh2Kh.jh7h:h<}hAhOhC}r2(hG]r3Xstartr4ahH]hF]hE]r5(Ustartr6j*ehI]uhLKQhMhhT}r7j*j-shN]r8(hW)r9}r:(h-Xstartr;h.j0h7h:hAh[hC}r<(hG]hH]hF]hE]hI]uhLKQhMhhN]r=h^Xstartr>r?}r@(h-j;h.j9ubaubh)rA}rB(h-X%buildbot start [--nodaemon] {BASEDIR}h.j0h7h:hAhhC}rC(hhXnonehhhE]hF]hG]hH]hI]uhLKShMhhN]rDh^X%buildbot start [--nodaemon] {BASEDIR}rErF}rG(h-Uh.jAubaubhb)rH}rI(h-XThis starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named :file:`twistd.log`.h.j0h7h:hAhehC}rJ(hG]hH]hF]hE]hI]uhLKWhMhhN]rK(h^XThis starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named rLrM}rN(h-XThis starts a buildmaster which was already created in the given base directory. The daemon is launched in the background, with events logged to a file named h.jHubh)rO}rP(h-UhC}rQ(hE]hF]hG]hH]rRXfilerSaUrolejShI]uh.jHhN]rTh^X twistd.logrUrV}rW(h-X twistd.logh.jOubahAhubh^X.rX}rY(h-X.h.jHubeubhb)rZ}r[(h-XThe :option:`--nodaemon` option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.h.j0h7h:hAhehC}r\(hG]hH]hF]hE]hI]uhLKZhMhhN]r](h^XThe r^r_}r`(h-XThe h.jZubjx)ra}rb(h-X:option:`--nodaemon`rch.jZh7h:hAj|hC}rd(UreftypeXoptionj~jX --nodaemonU refdomainXstdrej NhE]hF]U refexplicithG]hH]hI]jjuhLKZhN]rfj )rg}rh(h-jchC}ri(hG]hH]rj(jjeX std-optionrkehF]hE]hI]uh.jahN]rlh^X --nodaemonrmrn}ro(h-Uh.jgubahAjubaubh^X option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.rprq}rr(h-X option instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.h.jZubeubj)rs}rt(h-Uh.j0h7h:hAjhC}ru(hE]hF]hG]hH]hI]Uentries]rv((UsingleX,Command Line Subcommands; restart (buildbot)Xcmdline-restart (buildbot)rwjwtrx(UsingleX*restart (buildbot) Command Line SubcommandjwjwtryeuhLK_hMhhN]ubh>)rz}r{(h-Uh.j0h7h:hAhBhC}r|(hE]hF]hG]hH]hI]hJjwuhLK_hMhhN]ubeubh/)r}}r~(h-Uh2Kh.jh7h:h<}hAhOhC}r(hG]rXrestartrahH]hF]hE]r(UrestartrjwehI]uhLKahMhhT}rjwjzshN]r(hW)r}r(h-Xrestartrh.j}h7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLKahMhhN]rh^Xrestartrr}r(h-jh.jubaubh)r}r(h-X'buildbot restart [--nodaemon] {BASEDIR}h.j}h7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLKchMhhN]rh^X'buildbot restart [--nodaemon] {BASEDIR}rr}r(h-Uh.jubaubhb)r}r(h-XRestart the buildmaster. This is equivalent to ``stop`` followed by ``start`` The :option:`--nodaemon` option has the same meaning as for ``start``.h.j}h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKghMhhN]r(h^X/Restart the buildmaster. This is equivalent to rr}r(h-X/Restart the buildmaster. This is equivalent to h.jubh)r}r(h-X``stop``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xstoprr}r(h-Uh.jubahAhubh^X followed by rr}r(h-X followed by h.jubh)r}r(h-X ``start``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xstartrr}r(h-Uh.jubahAhubh^X The rr}r(h-X The h.jubjx)r}r(h-X:option:`--nodaemon`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --nodaemonU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKghN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --nodaemonrr}r(h-Uh.jubahAjubaubh^X$ option has the same meaning as for rr}r(h-X$ option has the same meaning as for h.jubh)r}r(h-X ``start``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xstartrr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jubeubj)r}r(h-Uh.j}h7h:hAjhC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleX)Command Line Subcommands; stop (buildbot)Xcmdline-stop (buildbot)rjtr(UsingleX'stop (buildbot) Command Line SubcommandjjtreuhLKlhMhhN]ubh>)r}r(h-Uh.j}h7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLKlhMhhN]ubeubh/)r}r(h-Uh2Kh.jh7h:h<}hAhOhC}r(hG]rXstoprahH]hF]hE]r(UstoprjehI]uhLKnhMhhT}rjjshN]r(hW)r}r(h-Xstoprh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLKnhMhhN]rh^Xstoprr}r(h-jh.jubaubh)r}r(h-Xbuildbot stop {BASEDIR}h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLKphMhhN]rh^Xbuildbot stop {BASEDIR}rr}r(h-Uh.jubaubhb)r}r(h-XThis terminates the daemon (either buildmaster or buildslave) running in the given directory. The :option:`--clean` option shuts down the buildmaster cleanly.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKthMhhN]r(h^XbThis terminates the daemon (either buildmaster or buildslave) running in the given directory. The rr}r(h-XbThis terminates the daemon (either buildmaster or buildslave) running in the given directory. The h.jubjx)r}r(h-X:option:`--clean`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--cleanU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKthN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--cleanrr}r(h-Uh.jubahAjubaubh^X+ option shuts down the buildmaster cleanly.rr}r(h-X+ option shuts down the buildmaster cleanly.h.jubeubj)r}r(h-Uh.jh7h:hAjhC}r(hE]hF]hG]hH]hI]Uentries]r ((UsingleX Command Line Subcommands; sighupXcmdline-sighupr j tr (UsingleXsighup Command Line Subcommandj j tr euhLKxhMhhN]ubh>)r }r(h-Uh.jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJj uhLKxhMhhN]ubeubh/)r}r(h-Uh.jh7h:h<}hAhOhC}r(hG]hH]hF]hE]r(Usighuprj ehI]rhauhLKzhMhhT}rj j shN]r(hW)r}r(h-Xsighuprh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLKzhMhhN]rh^Xsighuprr}r(h-jh.jubaubh)r }r!(h-Xbuildbot sighup {BASEDIR}h.jh7h:hAhhC}r"(hhXnonehhhE]hF]hG]hH]hI]uhLK|hMhhN]r#h^Xbuildbot sighup {BASEDIR}r$r%}r&(h-Uh.j ubaubhb)r'}r((h-X~This sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its :file:`master.cfg` file.r)h.jh7h:hAhehC}r*(hG]hH]hF]hE]hI]uhLKhMhhN]r+(h^XfThis sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its r,r-}r.(h-XfThis sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its h.j'ubh)r/}r0(h-UhC}r1(hE]hF]hG]hH]r2Xfiler3aUrolej3hI]uh.j'hN]r4h^X master.cfgr5r6}r7(h-X master.cfgh.j/ubahAhubh^X file.r8r9}r:(h-X file.h.j'ubeubeubeubh/)r;}r<(h-Uh.jh7h:hAhOhC}r=(hG]hH]hF]hE]r>Udeveloper-toolsr?ahI]r@hauhLKhMhhN]rA(hW)rB}rC(h-XDeveloper ToolsrDh.j;h7h:hAh[hC}rE(hG]hH]hF]hE]hI]uhLKhMhhN]rFh^XDeveloper ToolsrGrH}rI(h-jDh.jBubaubhb)rJ}rK(h-XoThese tools are provided for use by the developers who are working on the code that the buildbot is monitoring.rLh.j;h7h:hAhehC}rM(hG]hH]hF]hE]hI]uhLKhMhhN]rNh^XoThese tools are provided for use by the developers who are working on the code that the buildbot is monitoring.rOrP}rQ(h-jLh.jJubaubj)rR}rS(h-Uh.j;h7h:hAjhC}rT(hE]hF]hG]hH]hI]Uentries]rU((UsingleX#Command Line Subcommands; statuslogXcmdline-statuslogrVjVtrW(UsingleX!statuslog Command Line SubcommandjVjVtrXeuhLKhMhhN]ubh>)rY}rZ(h-Uh.j;h7h:hAhBhC}r[(hE]hF]hG]hH]hI]hJjVuhLKhMhhN]ubh/)r\}r](h-Uh.j;h7h:h<}hAhOhC}r^(hG]hH]hF]hE]r_(U statuslogr`jVehI]rahauhLKhMhhT}rbjVjYshN]rc(hW)rd}re(h-X statuslogrfh.j\h7h:hAh[hC}rg(hG]hH]hF]hE]hI]uhLKhMhhN]rhh^X statuslogrirj}rk(h-jfh.jdubaubh)rl}rm(h-X/buildbot statuslog --master {MASTERHOST}:{PORT}h.j\h7h:hAhhC}rn(hhXnonehhhE]hF]hG]hH]hI]uhLKhMhhN]roh^X/buildbot statuslog --master {MASTERHOST}:{PORT}rprq}rr(h-Uh.jlubaubhb)rs}rt(h-XThis command starts a simple text-based status client, one which just prints out a new line each time an event occurs on the buildmaster.ruh.j\h7h:hAhehC}rv(hG]hH]hF]hE]hI]uhLKhMhhN]rwh^XThis command starts a simple text-based status client, one which just prints out a new line each time an event occurs on the buildmaster.rxry}rz(h-juh.jsubaubhb)r{}r|(h-XThe :option:`--master` option provides the location of the :class:`buildbot.status.client.PBListener` status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (:samp:`{HOSTNAME}:{PORTNUM}`). Note that this port is *not* the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of ``Failure: twisted.cred.error.UnauthorizedLogin:``, this may indicate that you are connecting to the slaveport rather than a :class:`PBListener` port.h.j\h7h:hAhehC}r}(hG]hH]hF]hE]hI]uhLKhMhhN]r~(h^XThe rr}r(h-XThe h.j{ubjx)r}r(h-X:option:`--master`rh.j{h7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X% option provides the location of the rr}r(h-X% option provides the location of the h.j{ubjx)r}r(h-X*:class:`buildbot.status.client.PBListener`rh.j{h7h:hAj|hC}r(UreftypeXclassj~jX!buildbot.status.client.PBListenerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjUpy:classrNU py:modulerNuhLKhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X!buildbot.status.client.PBListenerrr}r(h-Uh.jubahAhubaubh^X status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (rr}r(h-X status port, used to deliver build information to realtime status clients. The option is always in the form of a string, with hostname and port number separated by a colon (h.j{ubh)r}r(h-UhC}r(hE]hF]hG]hH]rXsampraUrolejhI]uh.j{hN]r(cdocutils.nodes emphasis r)r}r(h-XHOSTNAMEhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XHOSTNAMErr}r(h-Uh.jubahAUemphasisrubh^X:r}r(h-X:h.jubj)r}r(h-XPORTNUMhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XPORTNUMrr}r(h-Uh.jubahAjubehAhubh^X). Note that this port is rr}r(h-X). Note that this port is h.j{ubj)r}r(h-X*not*hC}r(hG]hH]hF]hE]hI]uh.j{hN]rh^Xnotrr}r(h-Uh.jubahAjubh^X the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of rr}r(h-X the same as the slaveport (although a future version may allow the same port number to be used for both purposes). If you get an error message to the effect of h.j{ubh)r}r(h-X2``Failure: twisted.cred.error.UnauthorizedLogin:``hC}r(hG]hH]hF]hE]hI]uh.j{hN]rh^X.Failure: twisted.cred.error.UnauthorizedLogin:rr}r(h-Uh.jubahAhubh^XK, this may indicate that you are connecting to the slaveport rather than a rr}r(h-XK, this may indicate that you are connecting to the slaveport rather than a h.j{ubjx)r}r(h-X:class:`PBListener`rh.j{h7h:hAj|hC}r(UreftypeXclassj~jX PBListenerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X PBListenerrr}r(h-Uh.jubahAhubaubh^X port.rr}r(h-X port.h.j{ubeubhb)r}r(h-XThe :option:`--master` option can also be provided by the ``masterstatus`` name in :file:`.buildbot/options` (see :ref:`buildbot-config-directory`).h.j\h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h^XThe rr}r(h-XThe h.jubjx)r}r(h-X:option:`--master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X$ option can also be provided by the rr}r(h-X$ option can also be provided by the h.jubh)r}r(h-X``masterstatus``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X masterstatusrr}r(h-Uh.jubahAhubh^X name in r r }r (h-X name in h.jubh)r }r (h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X.buildbot/optionsrr}r(h-X.buildbot/optionsh.j ubahAhubh^X (see rr}r(h-X (see h.jubjx)r}r(h-X :ref:`buildbot-config-directory`rh.jh7h:hAj|hC}r(UreftypeXrefj~jXbuildbot-config-directoryU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj)r}r(h-jhC}r (hG]hH]r!(jjXstd-refr"ehF]hE]hI]uh.jhN]r#h^Xbuildbot-config-directoryr$r%}r&(h-Uh.jubahAjubaubh^X).r'r(}r)(h-X).h.jubeubj)r*}r+(h-Uh.j\h7h:hAjhC}r,(hE]hF]hG]hH]hI]Uentries]r-((UsingleX#Command Line Subcommands; statusguiXcmdline-statusguir.j.tr/(UsingleX!statusgui Command Line Subcommandj.j.tr0euhLKhMhhN]ubh>)r1}r2(h-Uh.j\h7h:hAhBhC}r3(hE]hF]hG]hH]hI]hJj.uhLKhMhhN]ubeubh/)r4}r5(h-Uh.j;h7h:h<}hAhOhC}r6(hG]hH]hF]hE]r7(U statusguir8j.ehI]r9h auhLKhMhhT}r:j.j1shN]r;(hW)r<}r=(h-X statusguir>h.j4h7h:hAh[hC}r?(hG]hH]hF]hE]hI]uhLKhMhhN]r@h^X statusguirArB}rC(h-j>h.j<ubaubhb)rD}rE(h-XIf you have set up a :bb:status:`PBListener`, you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the ``buildbot statusgui`` command:h.j4h7h:hAhehC}rF(hG]hH]hF]hE]hI]uhLKhMhhN]rG(h^XIf you have set up a rHrI}rJ(h-XIf you have set up a h.jDubjx)rK}rL(h-X:bb:status:`PBListener`rMh.jDh7h:hAj|hC}rN(UreftypeXstatusj~jX PBListenerU refdomainXbbrOhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rPh)rQ}rR(h-jMhC}rS(hG]hH]rT(jjOX bb-statusrUehF]hE]hI]uh.jKhN]rVh^X PBListenerrWrX}rY(h-Uh.jQubahAhubaubh^X], you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the rZr[}r\(h-X], you will be able to monitor your Buildbot using a simple Gtk+ application invoked with the h.jDubh)r]}r^(h-X``buildbot statusgui``hC}r_(hG]hH]hF]hE]hI]uh.jDhN]r`h^Xbuildbot statusguirarb}rc(h-Uh.j]ubahAhubh^X command:rdre}rf(h-X command:h.jDubeubh)rg}rh(h-X/buildbot statusgui --master {MASTERHOST}:{PORT}h.j4h7h:hAhhC}ri(hhXnonehhhE]hF]hG]hH]hI]uhLKhMhhN]rjh^X/buildbot statusgui --master {MASTERHOST}:{PORT}rkrl}rm(h-Uh.jgubaubhb)rn}ro(h-X This command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same ``--master`` argument and ``masterstatus`` option as the ``buildbot statuslog`` command (:bb:cmdline:`statuslog`).h.j4h7h:hAhehC}rp(hG]hH]hF]hE]hI]uhLKhMhhN]rq(h^XThis command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same rrrs}rt(h-XThis command starts a simple Gtk+-based status client, which contains a few boxes for each Builder that change color as events occur. It uses the same h.jnubh)ru}rv(h-X ``--master``hC}rw(hG]hH]hF]hE]hI]uh.jnhN]rxh^X--masterryrz}r{(h-Uh.juubahAhubh^X argument and r|r}}r~(h-X argument and h.jnubh)r}r(h-X``masterstatus``hC}r(hG]hH]hF]hE]hI]uh.jnhN]rh^X masterstatusrr}r(h-Uh.jubahAhubh^X option as the rr}r(h-X option as the h.jnubh)r}r(h-X``buildbot statuslog``hC}r(hG]hH]hF]hE]hI]uh.jnhN]rh^Xbuildbot statuslogrr}r(h-Uh.jubahAhubh^X command (rr}r(h-X command (h.jnubjx)r}r(h-X:bb:cmdline:`statuslog`rh.jnh7h:hAj|hC}r(UreftypeXcmdlinej~jX statuslogU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X statuslogrr}r(h-Uh.jubahAhubaubh^X).rr}r(h-X).h.jnubeubj)r}r(h-Uh.j4h7h:hAjhC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleXCommand Line Subcommands; tryX cmdline-tryrjtr(UsingleXtry Command Line SubcommandjjtreuhLKhMhhN]ubh>)r}r(h-Uh.j4h7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLKhMhhN]ubeubh/)r}r(h-Uh.j;h7h:h<}hAhOhC}r(hG]hH]hF]hE]r(UtryrjehI]rhauhLKhMhhT}rjjshN]r(hW)r}r(h-Xtryrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLKhMhhN]rh^Xtryrr}r(h-jh.jubaubhb)r}r(h-X$This lets a developer to ask the question ``What would happen if I committed this patch right now?``. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h^X*This lets a developer to ask the question rr}r(h-X*This lets a developer to ask the question h.jubh)r}r(h-X:``What would happen if I committed this patch right now?``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X6What would happen if I committed this patch right now?rr}r(h-Uh.jubahAhubh^X. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.rr}r(h-X. It runs the unit test suite (across multiple build platforms) on the developer's current code, allowing them to make sure they will not break the tree when they finally commit their changes.h.jubeubhb)r}r(h-XBThe ``buildbot try`` command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This ``(revision, patch)`` pair is then sent to the buildmaster, which runs a build with that :class:`SourceStamp`. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h^XThe rr}r(h-XThe h.jubh)r}r(h-X``buildbot try``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X buildbot tryrr}r(h-Uh.jubahAhubh^X% command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This rr}r(h-X% command is meant to be run from within a developer's local tree, and starts by figuring out the base revision of that tree (what revision was current the last time the tree was updated), and a patch that can be applied to that revision of the tree to make it match the developer's copy. This h.jubh)r}r(h-X``(revision, patch)``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X(revision, patch)rr}r(h-Uh.jubahAhubh^XD pair is then sent to the buildmaster, which runs a build with that rr}r(h-XD pair is then sent to the buildmaster, which runs a build with that h.jubjx)r}r(h-X:class:`SourceStamp`rh.jh7h:hAj|hC}r(UreftypeXclassj~jX SourceStampU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X SourceStamprr}r(h-Uh.jubahAhubaubh^X. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).rr}r(h-X. If you want, the tool will emit status messages as the builds run, and will not terminate until the first failure has been detected (or the last success).h.jubeubhb)r}r(h-XThere is an alternate form which accepts a pre-made patch file (typically the output of a command like :command:`svn diff`). This ``--diff`` form does not require a local tree to run from. See :ref:`try--diff` concerning the ``--diff`` command option.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h^XgThere is an alternate form which accepts a pre-made patch file (typically the output of a command like rr}r(h-XgThere is an alternate form which accepts a pre-made patch file (typically the output of a command like h.jubhk)r}r(h-X:command:`svn diff`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xsvn diffr r }r (h-Uh.jubahAhuubh^X). This r r }r(h-X). This h.jubh)r}r(h-X ``--diff``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--diffrr}r(h-Uh.jubahAhubh^X5 form does not require a local tree to run from. See rr}r(h-X5 form does not require a local tree to run from. See h.jubjx)r}r(h-X:ref:`try--diff`rh.jh7h:hAj|hC}r(UreftypeXrefj~jX try--diffU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj)r}r (h-jhC}r!(hG]hH]r"(jjXstd-refr#ehF]hE]hI]uh.jhN]r$h^X try--diffr%r&}r'(h-Uh.jubahAjubaubh^X concerning the r(r)}r*(h-X concerning the h.jubh)r+}r,(h-X ``--diff``hC}r-(hG]hH]hF]hE]hI]uh.jhN]r.h^X--diffr/r0}r1(h-Uh.j+ubahAhubh^X command option.r2r3}r4(h-X command option.h.jubeubhb)r5}r6(h-XFor this command to work, several pieces must be in place: the :bb:sched:`Try_Jobdir` or ::bb:sched:`Try_Userpass`, as well as some client-side configuration.h.jh7h:hAhehC}r7(hG]hH]hF]hE]hI]uhLKhMhhN]r8(h^X?For this command to work, several pieces must be in place: the r9r:}r;(h-X?For this command to work, several pieces must be in place: the h.j5ubjx)r<}r=(h-X:bb:sched:`Try_Jobdir`r>h.j5h7h:hAj|hC}r?(UreftypeXschedj~jX Try_JobdirU refdomainXbbr@hE]hF]U refexplicithG]hH]hI]jjuhLKhN]rAh)rB}rC(h-j>hC}rD(hG]hH]rE(jj@Xbb-schedrFehF]hE]hI]uh.j<hN]rGh^X Try_JobdirrHrI}rJ(h-Uh.jBubahAhubaubh^X or :rKrL}rM(h-X or :h.j5ubjx)rN}rO(h-X:bb:sched:`Try_Userpass`rPh.j5h7h:hAj|hC}rQ(UreftypeXschedj~jX Try_UserpassU refdomainXbbrRhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rSh)rT}rU(h-jPhC}rV(hG]hH]rW(jjRXbb-schedrXehF]hE]hI]uh.jNhN]rYh^X Try_UserpassrZr[}r\(h-Uh.jTubahAhubaubh^X,, as well as some client-side configuration.r]r^}r_(h-X,, as well as some client-side configuration.h.j5ubeubh/)r`}ra(h-Uh.jh7h:hAhOhC}rb(hG]hH]hF]hE]rcUlocating-the-masterrdahI]rehauhLKhMhhN]rf(hW)rg}rh(h-XLocating the masterrih.j`h7h:hAh[hC}rj(hG]hH]hF]hE]hI]uhLKhMhhN]rkh^XLocating the masterrlrm}rn(h-jih.jgubaubhb)ro}rp(h-XPThe :command:`try` command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using ``--connect=ssh`` or ``--connect=pb`` (or ``try_connect = 'ssh'`` or ``try_connect = 'pb'`` in :file:`.buildbot/options`).h.j`h7h:hAhehC}rq(hG]hH]hF]hE]hI]uhLKhMhhN]rr(h^XThe rsrt}ru(h-XThe h.joubhk)rv}rw(h-X:command:`try`hC}rx(hG]hH]ryhpahF]hE]hI]uh.johN]rzh^Xtryr{r|}r}(h-Uh.jvubahAhuubh^X command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using r~r}r(h-X command needs to be told how to connect to the try scheduler, and must know which of the authentication approaches described above is in use by the buildmaster. You specify the approach by using h.joubh)r}r(h-X``--connect=ssh``hC}r(hG]hH]hF]hE]hI]uh.johN]rh^X --connect=sshrr}r(h-Uh.jubahAhubh^X or rr}r(h-X or h.joubh)r}r(h-X``--connect=pb``hC}r(hG]hH]hF]hE]hI]uh.johN]rh^X --connect=pbrr}r(h-Uh.jubahAhubh^X (or rr}r(h-X (or h.joubh)r}r(h-X``try_connect = 'ssh'``hC}r(hG]hH]hF]hE]hI]uh.johN]rh^Xtry_connect = 'ssh'rr}r(h-Uh.jubahAhubh^X or rr}r(h-X or h.joubh)r}r(h-X``try_connect = 'pb'``hC}r(hG]hH]hF]hE]hI]uh.johN]rh^Xtry_connect = 'pb'rr}r(h-Uh.jubahAhubh^X in rr}r(h-X in h.joubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.johN]rh^X.buildbot/optionsrr}r(h-X.buildbot/optionsh.jubahAhubh^X).rr}r(h-X).h.joubeubhb)r}r(h-XFor the PB approach, the command must be given a :option:`--master` argument (in the form :samp:`{HOST}:{PORT}`) that points to TCP port that you picked in the :class:`Try_Userpass` scheduler. It also takes a :option:`--username` and :option:`--passwd` pair of arguments that match one of the entries in the buildmaster's ``userpass`` list. These arguments can also be provided as ``try_master``, ``try_username``, and ``try_password`` entries in the :file:`.buildbot/options` file.h.j`h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h^X1For the PB approach, the command must be given a rr}r(h-X1For the PB approach, the command must be given a h.jubjx)r}r(h-X:option:`--master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X argument (in the form rr}r(h-X argument (in the form h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXsampraUrolejhI]uh.jhN]r(j)r}r(h-XHOSThC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XHOSTrr}r(h-Uh.jubahAjubh^X:r}r(h-X:h.jubj)r}r(h-XPORThC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XPORTrr}r(h-Uh.jubahAjubehAhubh^X1) that points to TCP port that you picked in the rr}r(h-X1) that points to TCP port that you picked in the h.jubjx)r}r(h-X:class:`Try_Userpass`rh.jh7h:hAj|hC}r(UreftypeXclassj~jX Try_UserpassU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X Try_Userpassrr}r(h-Uh.jubahAhubaubh^X scheduler. It also takes a rr}r(h-X scheduler. It also takes a h.jubjx)r}r(h-X:option:`--username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --usernameU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --usernamerr}r(h-Uh.jubahAjubaubh^X and rr }r (h-X and h.jubjx)r }r (h-X:option:`--passwd`r h.jh7h:hAj|hC}r(UreftypeXoptionj~jX--passwdU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-j hC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.j hN]rh^X--passwdrr}r(h-Uh.jubahAjubaubh^XF pair of arguments that match one of the entries in the buildmaster's rr}r(h-XF pair of arguments that match one of the entries in the buildmaster's h.jubh)r}r(h-X ``userpass``hC}r(hG]hH]hF]hE]hI]uh.jhN]r h^Xuserpassr!r"}r#(h-Uh.jubahAhubh^X/ list. These arguments can also be provided as r$r%}r&(h-X/ list. These arguments can also be provided as h.jubh)r'}r((h-X``try_master``hC}r)(hG]hH]hF]hE]hI]uh.jhN]r*h^X try_masterr+r,}r-(h-Uh.j'ubahAhubh^X, r.r/}r0(h-X, h.jubh)r1}r2(h-X``try_username``hC}r3(hG]hH]hF]hE]hI]uh.jhN]r4h^X try_usernamer5r6}r7(h-Uh.j1ubahAhubh^X, and r8r9}r:(h-X, and h.jubh)r;}r<(h-X``try_password``hC}r=(hG]hH]hF]hE]hI]uh.jhN]r>h^X try_passwordr?r@}rA(h-Uh.j;ubahAhubh^X entries in the rBrC}rD(h-X entries in the h.jubh)rE}rF(h-UhC}rG(hE]hF]hG]hH]rHXfilerIaUrolejIhI]uh.jhN]rJh^X.buildbot/optionsrKrL}rM(h-X.buildbot/optionsh.jEubahAhubh^X file.rNrO}rP(h-X file.h.jubeubhb)rQ}rR(h-XFor the SSH approach, the command must be given :option:`--host` and :option:`--username`, to get to the buildmaster host. It must also be given :option:`--jobdir`, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like :file:`~buildbot/project/trydir`. These arguments can be provided in :file:`.buildbot/options` as ``try_host``, ``try_username``, ``try_password``, and ``try_jobdir``.h.j`h7h:hAhehC}rS(hG]hH]hF]hE]hI]uhLKhMhhN]rT(h^X0For the SSH approach, the command must be given rUrV}rW(h-X0For the SSH approach, the command must be given h.jQubjx)rX}rY(h-X:option:`--host`rZh.jQh7h:hAj|hC}r[(UreftypeXoptionj~jX--hostU refdomainXstdr\j NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]r]j )r^}r_(h-jZhC}r`(hG]hH]ra(jj\X std-optionrbehF]hE]hI]uh.jXhN]rch^X--hostrdre}rf(h-Uh.j^ubahAjubaubh^X and rgrh}ri(h-X and h.jQubjx)rj}rk(h-X:option:`--username`rlh.jQh7h:hAj|hC}rm(UreftypeXoptionj~jX --usernameU refdomainXstdrnj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]roj )rp}rq(h-jlhC}rr(hG]hH]rs(jjnX std-optionrtehF]hE]hI]uh.jjhN]ruh^X --usernamervrw}rx(h-Uh.jpubahAjubaubh^X8, to get to the buildmaster host. It must also be given ryrz}r{(h-X8, to get to the buildmaster host. It must also be given h.jQubjx)r|}r}(h-X:option:`--jobdir`r~h.jQh7h:hAj|hC}r(UreftypeXoptionj~jX--jobdirU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-j~hC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.j|hN]rh^X--jobdirrr}r(h-Uh.jubahAjubaubh^X, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like rr}r(h-X, which points to the inlet directory configured above. The jobdir can be relative to the user's home directory, but most of the time you will use an explicit path like h.jQubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jQhN]rh^X~buildbot/project/trydirrr}r(h-X~buildbot/project/trydirh.jubahAhubh^X%. These arguments can be provided in rr}r(h-X%. These arguments can be provided in h.jQubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jQhN]rh^X.buildbot/optionsrr}r(h-X.buildbot/optionsh.jubahAhubh^X as rr}r(h-X as h.jQubh)r}r(h-X ``try_host``hC}r(hG]hH]hF]hE]hI]uh.jQhN]rh^Xtry_hostrr}r(h-Uh.jubahAhubh^X, rr}r(h-X, h.jQubh)r}r(h-X``try_username``hC}r(hG]hH]hF]hE]hI]uh.jQhN]rh^X try_usernamerr}r(h-Uh.jubahAhubh^X, rr}r(h-X, h.jQubh)r}r(h-X``try_password``hC}r(hG]hH]hF]hE]hI]uh.jQhN]rh^X try_passwordrr}r(h-Uh.jubahAhubh^X, and rr}r(h-X, and h.jQubh)r}r(h-X``try_jobdir``hC}r(hG]hH]hF]hE]hI]uh.jQhN]rh^X try_jobdirrr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jQubeubhb)r}r(h-XThe SSH approach also provides a :option:`--buildbotbin` argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a :ref:`virtualenv ` on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by :option:`--username`. The :option:`--buildbotbin` argument can be provided in :file:`.buildbot/options` as ``try_buildbotbin``h.j`h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhMhhN]r(h^X!The SSH approach also provides a rr}r(h-X!The SSH approach also provides a h.jubjx)r}r(h-X:option:`--buildbotbin`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --buildbotbinU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --buildbotbinrr}r(h-Uh.jubahAjubaubh^X argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a rr}r(h-X argument to allow specification of the buildbot binary to run on the buildmaster. This is useful in the case where buildbot is installed in a h.jubjx)r}r(h-X0:ref:`virtualenv `rh.jh7h:hAj|hC}r(UreftypeXrefj~jXinstallation-in-a-virtualenvU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^X virtualenvrr}r(h-Uh.jubahAjubaubh^Xw on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by rr}r(h-Xw on the buildmaster host, or in other circumstances where the buildbot command is not on the path of the user given by h.jubjx)r}r(h-X:option:`--username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --usernameU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --usernamerr}r(h-Uh.jubahAjubaubh^X. The rr}r (h-X. The h.jubjx)r }r (h-X:option:`--buildbotbin`r h.jh7h:hAj|hC}r (UreftypeXoptionj~jX --buildbotbinU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-j hC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.j hN]rh^X --buildbotbinrr}r(h-Uh.jubahAjubaubh^X argument can be provided in rr}r(h-X argument can be provided in h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfiler aUrolej hI]uh.jhN]r!h^X.buildbot/optionsr"r#}r$(h-X.buildbot/optionsh.jubahAhubh^X as r%r&}r'(h-X as h.jubh)r(}r)(h-X``try_buildbotbin``hC}r*(hG]hH]hF]hE]hI]uh.jhN]r+h^Xtry_buildbotbinr,r-}r.(h-Uh.j(ubahAhubeubhb)r/}r0(h-X]The following command line arguments are deprecated, but retained for backward compatibility:r1h.j`h7h:hAhehC}r2(hG]hH]hF]hE]hI]uhLKhMhhN]r3h^X]The following command line arguments are deprecated, but retained for backward compatibility:r4r5}r6(h-j1h.j/ubaubh)r7}r8(h-Uh.j`h7h:hAhhC}r9(hG]hH]hF]hE]hI]uhLNhMhhN]r:(h)r;}r<(h-Uh.j7h7h:hAhhC}r=(hG]hH]hF]hE]hI]uhLNhMhhN]r>(h)r?}r@(h-UhC}rA(hG]hH]hF]hE]hI]uh.j;hN]rBh)rC}rD(h-X --tryhostrEhC}rF(hG]hH]hF]hE]hI]uh.j?hN]rGh)rH}rI(h-jEhC}rJ(hG]hH]hF]hE]hI]uh.jChN]rKh^X --tryhostrLrM}rN(h-Uh.jHubahAhubahAhubahAhubh)rO}rP(h-Xis replaced by :option:`--host`rQhC}rR(hG]hH]hF]hE]hI]uh.j;hN]rShb)rT}rU(h-jQh.jOh7h:hAhehC}rV(hG]hH]hF]hE]hI]uhLKhN]rW(h^Xis replaced by rXrY}rZ(h-Xis replaced by h.jTubjx)r[}r\(h-X:option:`--host`r]h.jTh7h:hAj|hC}r^(UreftypeXoptionj~jX--hostU refdomainXstdr_j NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]r`j )ra}rb(h-j]hC}rc(hG]hH]rd(jj_X std-optionreehF]hE]hI]uh.j[hN]rfh^X--hostrgrh}ri(h-Uh.jaubahAjubaubeubahAhubeubh)rj}rk(h-Uh.j7h7h:hAhhC}rl(hG]hH]hF]hE]hI]uhLNhMhhN]rm(h)rn}ro(h-UhC}rp(hG]hH]hF]hE]hI]uh.jjhN]rqh)rr}rs(h-X--trydirrthC}ru(hG]hH]hF]hE]hI]uh.jnhN]rvh)rw}rx(h-jthC}ry(hG]hH]hF]hE]hI]uh.jrhN]rzh^X--trydirr{r|}r}(h-Uh.jwubahAhubahAhubahAhubh)r~}r(h-X!is replaced by :option:`--jobdir`rhC}r(hG]hH]hF]hE]hI]uh.jjhN]rhb)r}r(h-jh.j~h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLKhN]r(h^Xis replaced by rr}r(h-Xis replaced by h.jubjx)r}r(h-X:option:`--jobdir`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--jobdirU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--jobdirrr}r(h-Uh.jubahAjubaubeubahAhubeubh)r}r(h-Uh.j7h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X--masterrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-X(is replaced by :option:`--masterstatus` hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X'is replaced by :option:`--masterstatus`h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^Xis replaced by rr}r(h-Xis replaced by h.jubjx)r}r(h-X:option:`--masterstatus`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--masterstatusU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterstatusrr}r(h-Uh.jubahAjubaubeubahAhubeubeubhb)r}r(h-XwLikewise, the following :file:`.buildbot/options` file entries are deprecated, but retained for backward compatibility:h.j`h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XLikewise, the following rr}r(h-XLikewise, the following h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X.buildbot/optionsrr}r(h-X.buildbot/optionsh.jubahAhubh^XF file entries are deprecated, but retained for backward compatibility:rr}r(h-XF file entries are deprecated, but retained for backward compatibility:h.jubeubcdocutils.nodes block_quote r)r}r(h-Uh.j`h7NhAU block_quoterhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rcdocutils.nodes bullet_list r)r}r(h-UhC}r(UbulletrX*hE]hF]hG]hH]hI]uh.jhN]r(cdocutils.nodes list_item r)r}r(h-X)``try_dir`` is replaced by ``try_jobdir``rhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-jh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h)r}r(h-X ``try_dir``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_dirrr}r(h-Uh.jubahAhubh^X is replaced by rr}r(h-X is replaced by h.jubh)r}r(h-X``try_jobdir``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_jobdirrr}r(h-Uh.jubahAhubeubahAU list_itemrubj)r}r(h-X5``masterstatus`` is replaced by ``try_masterstatus`` hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X4``masterstatus`` is replaced by ``try_masterstatus``h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r (h)r }r (h-X``masterstatus``hC}r (hG]hH]hF]hE]hI]uh.jhN]r h^X masterstatusrr}r(h-Uh.j ubahAhubh^X is replaced by rr}r(h-X is replaced by h.jubh)r}r(h-X``try_masterstatus``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_masterstatusrr}r(h-Uh.jubahAhubeubahAjubehAU bullet_listrubaubeubh/)r}r(h-Uh.jh7h:hAhOhC}r(hG]hH]hF]hE]rUwaiting-for-resultsr ahI]r!hauhLM hMhhN]r"(hW)r#}r$(h-XWaiting for resultsr%h.jh7h:hAh[hC}r&(hG]hH]hF]hE]hI]uhLM hMhhN]r'h^XWaiting for resultsr(r)}r*(h-j%h.j#ubaubhb)r+}r,(h-XfIf you provide the :option:`--wait` option (or ``try_wait = True`` in :file:`.buildbot/options`), the ``buildbot try`` command will wait until your changes have either been proven good or bad before exiting. Unless you use the :option:`--quiet` option (or ``try_quiet=True``), it will emit a progress message every 60 seconds until the builds have completed.h.jh7h:hAhehC}r-(hG]hH]hF]hE]hI]uhLM hMhhN]r.(h^XIf you provide the r/r0}r1(h-XIf you provide the h.j+ubjx)r2}r3(h-X:option:`--wait`r4h.j+h7h:hAj|hC}r5(UreftypeXoptionj~jX--waitU refdomainXstdr6j NhE]hF]U refexplicithG]hH]hI]jjuhLM hN]r7j )r8}r9(h-j4hC}r:(hG]hH]r;(jj6X std-optionr<ehF]hE]hI]uh.j2hN]r=h^X--waitr>r?}r@(h-Uh.j8ubahAjubaubh^X option (or rArB}rC(h-X option (or h.j+ubh)rD}rE(h-X``try_wait = True``hC}rF(hG]hH]hF]hE]hI]uh.j+hN]rGh^Xtry_wait = TruerHrI}rJ(h-Uh.jDubahAhubh^X in rKrL}rM(h-X in h.j+ubh)rN}rO(h-UhC}rP(hE]hF]hG]hH]rQXfilerRaUrolejRhI]uh.j+hN]rSh^X.buildbot/optionsrTrU}rV(h-X.buildbot/optionsh.jNubahAhubh^X), the rWrX}rY(h-X), the h.j+ubh)rZ}r[(h-X``buildbot try``hC}r\(hG]hH]hF]hE]hI]uh.j+hN]r]h^X buildbot tryr^r_}r`(h-Uh.jZubahAhubh^Xm command will wait until your changes have either been proven good or bad before exiting. Unless you use the rarb}rc(h-Xm command will wait until your changes have either been proven good or bad before exiting. Unless you use the h.j+ubjx)rd}re(h-X:option:`--quiet`rfh.j+h7h:hAj|hC}rg(UreftypeXoptionj~jX--quietU refdomainXstdrhj NhE]hF]U refexplicithG]hH]hI]jjuhLM hN]rij )rj}rk(h-jfhC}rl(hG]hH]rm(jjhX std-optionrnehF]hE]hI]uh.jdhN]roh^X--quietrprq}rr(h-Uh.jjubahAjubaubh^X option (or rsrt}ru(h-X option (or h.j+ubh)rv}rw(h-X``try_quiet=True``hC}rx(hG]hH]hF]hE]hI]uh.j+hN]ryh^Xtry_quiet=Truerzr{}r|(h-Uh.jvubahAhubh^XT), it will emit a progress message every 60 seconds until the builds have completed.r}r~}r(h-XT), it will emit a progress message every 60 seconds until the builds have completed.h.j+ubeubhb)r}r(h-X?The SSH connection method does not support waiting for results.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^X?The SSH connection method does not support waiting for results.rr}r(h-jh.jubaubeubh/)r}r(h-Uh.jh7h:hAhOhC}r(hG]hH]hF]hE]rUchoosing-the-buildersrahI]rh"auhLMhMhhN]r(hW)r}r(h-XChoosing the Buildersrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^XChoosing the Buildersrr}r(h-jh.jubaubhb)r}r(h-X]A trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the :class:`TryScheduler`'s ``builderNames=`` argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XA trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the rr}r(h-XA trial build is performed on multiple Builders at the same time, and the developer gets to choose which Builders are used (limited to a set selected by the buildmaster admin with the h.jubjx)r}r(h-X:class:`TryScheduler`rh.jh7h:hAj|hC}r(UreftypeXclassj~jX TrySchedulerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X TrySchedulerrr}r(h-Uh.jubahAhubaubh^X's rr}r(h-X's h.jubh)r}r(h-X``builderNames=``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X builderNames=rr}r(h-Uh.jubahAhubh^X| argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.rr}r(h-X| argument). The set you choose will depend upon what your goals are: if you are concerned about cross-platform compatibility, you should use multiple Builders, one from each platform of interest. You might use just one builder if that platform has libraries or other facilities that allow better test coverage than what you can accomplish on your own machine, or faster test runs.h.jubeubhb)r}r(h-XThe set of Builders to use can be specified with multiple :option:`--builder` arguments on the command line. It can also be specified with a single ``try_builders`` option in :file:`.buildbot/options` that uses a list of strings to specify all the Builder names:h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM!hMhhN]r(h^X:The set of Builders to use can be specified with multiple rr}r(h-X:The set of Builders to use can be specified with multiple h.jubjx)r}r(h-X:option:`--builder`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --builderU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLM!hN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --builderrr}r(h-Uh.jubahAjubaubh^XG arguments on the command line. It can also be specified with a single rr}r(h-XG arguments on the command line. It can also be specified with a single h.jubh)r}r(h-X``try_builders``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_buildersrr}r(h-Uh.jubahAhubh^X option in rr}r(h-X option in h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X.buildbot/optionsrr}r(h-X.buildbot/optionsh.jubahAhubh^X> that uses a list of strings to specify all the Builder names:rr}r(h-X> that uses a list of strings to specify all the Builder names:h.jubeubj)r}r(h-Uh.jh7h:hAjhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rhb)r}r(h-X7try_builders = ["full-OSX", "full-win32", "full-linux"]rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM'hN]rh^X7try_builders = ["full-OSX", "full-win32", "full-linux"]rr}r(h-jh.jubaubaubhb)r}r(h-XIf you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the ``get-builder-names`` argument:h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM)hMhhN]r(h^X|If you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the rr}r(h-X|If you are using the PB approach, you can get the names of the builders that are configured for the try scheduler using the h.jubh)r}r(h-X``get-builder-names``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xget-builder-namesr r }r (h-Uh.jubahAhubh^X argument:r r }r (h-X argument:h.jubeubj)r }r (h-Uh.jh7h:hAjhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r hb)r }r (h-XVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...r h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLM-hN]r h^XVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...r r }r (h-j h.j ubaubaubeubh/)r }r (h-Uh.jh7h:hAhOhC}r (hG]hH]hF]hE]r Uspecifying-the-vc-systemr ahI]r hauhLM0hMhhN]r (hW)r }r (h-XSpecifying the VC systemr h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLM0hMhhN]r h^XSpecifying the VC systemr r }r (h-j h.j ubaubhb)r! }r" (h-XThe :command:`try` command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the :command:`try` command which VC system you are using, with an argument like :option:`--vc=cvs` or :option:`--vc=git`. This can also be provided as ``try_vc`` in :file:`.buildbot/options`.h.j h7h:hAhehC}r# (hG]hH]hF]hE]hI]uhLM2hMhhN]r$ (h^XThe r% r& }r' (h-XThe h.j! ubhk)r( }r) (h-X:command:`try`hC}r* (hG]hH]r+ hpahF]hE]hI]uh.j! hN]r, h^Xtryr- r. }r/ (h-Uh.j( ubahAhuubh^X command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the r0 r1 }r2 (h-X command also needs to know how to take the developer's current tree and extract the (revision, patch) source-stamp pair. Each VC system uses a different process, so you start by telling the h.j! ubhk)r3 }r4 (h-X:command:`try`hC}r5 (hG]hH]r6 hpahF]hE]hI]uh.j! hN]r7 h^Xtryr8 r9 }r: (h-Uh.j3 ubahAhuubh^X> command which VC system you are using, with an argument like r; r< }r= (h-X> command which VC system you are using, with an argument like h.j! ubjx)r> }r? (h-X:option:`--vc=cvs`r@ h.j! h7h:hAj|hC}rA (UreftypeXoptionj~jX--vc=cvsU refdomainXstdrB j NhE]hF]U refexplicithG]hH]hI]jjuhLM2hN]rC j )rD }rE (h-j@ hC}rF (hG]hH]rG (jjB X std-optionrH ehF]hE]hI]uh.j> hN]rI h^X--vc=cvsrJ rK }rL (h-Uh.jD ubahAjubaubh^X or rM rN }rO (h-X or h.j! ubjx)rP }rQ (h-X:option:`--vc=git`rR h.j! h7h:hAj|hC}rS (UreftypeXoptionj~jX--vc=gitU refdomainXstdrT j NhE]hF]U refexplicithG]hH]hI]jjuhLM2hN]rU j )rV }rW (h-jR hC}rX (hG]hH]rY (jjT X std-optionrZ ehF]hE]hI]uh.jP hN]r[ h^X--vc=gitr\ r] }r^ (h-Uh.jV ubahAjubaubh^X. This can also be provided as r_ r` }ra (h-X. This can also be provided as h.j! ubh)rb }rc (h-X ``try_vc``hC}rd (hG]hH]hF]hE]hI]uh.j! hN]re h^Xtry_vcrf rg }rh (h-Uh.jb ubahAhubh^X in ri rj }rk (h-X in h.j! ubh)rl }rm (h-UhC}rn (hE]hF]hG]hH]ro Xfilerp aUrolejp hI]uh.j! hN]rq h^X.buildbot/optionsrr rs }rt (h-X.buildbot/optionsh.jl ubahAhubh^X.ru }rv (h-X.h.j! ubeubcdocutils.nodes comment rw )rx }ry (h-XAThe order of this list comes from the end of scripts/tryclient.pyh.j h7h:hAUcommentrz hC}r{ (hhhE]hF]hG]hH]hI]uhLM;hMhhN]r| h^XAThe order of this list comes from the end of scripts/tryclient.pyr} r~ }r (h-Uh.jx ubaubhb)r }r (h-XcThe following names are recognized: ``bzr`` ``cvs`` ``darcs`` ``hg`` ``git`` ``mtn`` ``p4`` ``svn``h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLM<hMhhN]r (h^X$The following names are recognized: r r }r (h-X$The following names are recognized: h.j ubh)r }r (h-X``bzr``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xbzrr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X``cvs``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xcvsr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X ``darcs``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xdarcsr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X``hg``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xhgr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X``git``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xgitr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X``mtn``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xmtnr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X``p4``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xp4r r }r (h-Uh.j ubahAhubh^X r }r (h-X h.j ubh)r }r (h-X``svn``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xsvnr r }r (h-Uh.j ubahAhubeubeubh/)r }r (h-Uh.jh7h:hAhOhC}r (hG]hH]hF]hE]r Ufinding-the-top-of-the-treer ahI]r h%auhLMAhMhhN]r (hW)r }r (h-XFinding the top of the treer h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMAhMhhN]r h^XFinding the top of the treer r }r (h-j h.j ubaubhb)r }r (h-XKSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the :command:`try` command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the :command:`try` command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is :file:`.buildbot-top`, so when you are using CVS or SVN you should ``touch .buildbot-top`` from the top of your tree before running :command:`buildbot try`. Alternatively, you can use a filename like :file:`ChangeLog` or :file:`README`, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use ``--topfile=ChangeLog``, or set it in the options file with ``try_topfile = 'ChangeLog'``.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMChMhhN]r (h^XgSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the r r }r (h-XgSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the h.j ubhk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the r r }r (h-X command needs to move up to the top of the project tree before it will be able to construct a proper full-tree patch. To accomplish this, the h.j ubhk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X} command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is r r }r (h-X} command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is h.j ubh)r }r (h-UhC}r (hE]hF]hG]hH]r Xfiler aUrolej hI]uh.j hN]r h^X .buildbot-topr r }r (h-X .buildbot-toph.j ubahAhubh^X., so when you are using CVS or SVN you should r r }r (h-X., so when you are using CVS or SVN you should h.j ubh)r }r (h-X``touch .buildbot-top``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xtouch .buildbot-topr r }r (h-Uh.j ubahAhubh^X* from the top of your tree before running r r }r (h-X* from the top of your tree before running h.j ubhk)r }r (h-X:command:`buildbot try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^X buildbot tryr r }r (h-Uh.j ubahAhuubh^X-. Alternatively, you can use a filename like r r }r (h-X-. Alternatively, you can use a filename like h.j ubh)r }r (h-UhC}r (hE]hF]hG]hH]r Xfiler aUrolej hI]uh.j hN]r h^X ChangeLogr r! }r" (h-X ChangeLogh.j ubahAhubh^X or r# r$ }r% (h-X or h.j ubh)r& }r' (h-UhC}r( (hE]hF]hG]hH]r) Xfiler* aUrolej* hI]uh.j hN]r+ h^XREADMEr, r- }r. (h-XREADMEh.j& ubahAhubh^Xw, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use r/ r0 }r1 (h-Xw, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use h.j ubh)r2 }r3 (h-X``--topfile=ChangeLog``hC}r4 (hG]hH]hF]hE]hI]uh.j hN]r5 h^X--topfile=ChangeLogr6 r7 }r8 (h-Uh.j2 ubahAhubh^X%, or set it in the options file with r9 r: }r; (h-X%, or set it in the options file with h.j ubh)r< }r= (h-X``try_topfile = 'ChangeLog'``hC}r> (hG]hH]hF]hE]hI]uh.j hN]r? h^Xtry_topfile = 'ChangeLog'r@ rA }rB (h-Uh.j< ubahAhubh^X.rC }rD (h-X.h.j ubeubhb)rE }rF (h-X<You can also manually set the top of the tree with ``--topdir=~/trees/mytree``, or ``try_topdir = '~/trees/mytree'``. If you use ``try_topdir``, in a :file:`.buildbot/options` file, you will need a separate options file for each tree you use, so it may be more convenient to use the ``try_topfile`` approach instead.h.j h7h:hAhehC}rG (hG]hH]hF]hE]hI]uhLMQhMhhN]rH (h^X3You can also manually set the top of the tree with rI rJ }rK (h-X3You can also manually set the top of the tree with h.jE ubh)rL }rM (h-X``--topdir=~/trees/mytree``hC}rN (hG]hH]hF]hE]hI]uh.jE hN]rO h^X--topdir=~/trees/mytreerP rQ }rR (h-Uh.jL ubahAhubh^X, or rS rT }rU (h-X, or h.jE ubh)rV }rW (h-X!``try_topdir = '~/trees/mytree'``hC}rX (hG]hH]hF]hE]hI]uh.jE hN]rY h^Xtry_topdir = '~/trees/mytree'rZ r[ }r\ (h-Uh.jV ubahAhubh^X . If you use r] r^ }r_ (h-X . If you use h.jE ubh)r` }ra (h-X``try_topdir``hC}rb (hG]hH]hF]hE]hI]uh.jE hN]rc h^X try_topdirrd re }rf (h-Uh.j` ubahAhubh^X, in a rg rh }ri (h-X, in a h.jE ubh)rj }rk (h-UhC}rl (hE]hF]hG]hH]rm Xfilern aUrolejn hI]uh.jE hN]ro h^X.buildbot/optionsrp rq }rr (h-X.buildbot/optionsh.jj ubahAhubh^Xl file, you will need a separate options file for each tree you use, so it may be more convenient to use the rs rt }ru (h-Xl file, you will need a separate options file for each tree you use, so it may be more convenient to use the h.jE ubh)rv }rw (h-X``try_topfile``hC}rx (hG]hH]hF]hE]hI]uh.jE hN]ry h^X try_topfilerz r{ }r| (h-Uh.jv ubahAhubh^X approach instead.r} r~ }r (h-X approach instead.h.jE ubeubhb)r }r (h-XOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require :command:`try` to know the top directory, so the :option:`--try-topfile` and :option:`--try-topdir` arguments will be ignored.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMXhMhhN]r (h^XOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require r r }r (h-XOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require h.j ubhk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X# to know the top directory, so the r r }r (h-X# to know the top directory, so the h.j ubjx)r }r (h-X:option:`--try-topfile`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX --try-topfileU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMXhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X --try-topfiler r }r (h-Uh.j ubahAjubaubh^X and r r }r (h-X and h.j ubjx)r }r (h-X:option:`--try-topdir`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX --try-topdirU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMXhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X --try-topdirr r }r (h-Uh.j ubahAjubaubh^X arguments will be ignored.r r }r (h-X arguments will be ignored.h.j ubeubhb)r }r (h-XaIf the :command:`try` command cannot find the top directory, it will abort with an error message.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLM]hMhhN]r (h^XIf the r r }r (h-XIf the h.j ubhk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^XL command cannot find the top directory, it will abort with an error message.r r }r (h-XL command cannot find the top directory, it will abort with an error message.h.j ubeubhb)r }r (h-X]The following command line arguments are deprecated, but retained for backward compatibility:r h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLM`hMhhN]r h^X]The following command line arguments are deprecated, but retained for backward compatibility:r r }r (h-j h.j ubaubj)r }r (h-Uh.j h7NhAjhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r j)r }r (h-UhC}r (jX*hE]hF]hG]hH]hI]uh.j hN]r (j)r }r (h-X2``--try-topdir`` is replaced by :option:`--topdir`r hC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-j h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMchN]r (h)r }r (h-X``--try-topdir``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X --try-topdirr r }r (h-Uh.j ubahAhubh^X is replaced by r r }r (h-X is replaced by h.j ubjx)r }r (h-X:option:`--topdir`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX--topdirU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMchN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X--topdirr r }r (h-Uh.j ubahAjubaubeubahAjubj)r }r (h-X5``--try-topfile`` is replaced by :option:`--topfile` hC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-X4``--try-topfile`` is replaced by :option:`--topfile`r h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMdhN]r (h)r }r (h-X``--try-topfile``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X --try-topfiler r }r (h-Uh.j ubahAhubh^X is replaced by r r }r (h-X is replaced by h.j ubjx)r }r (h-X:option:`--topfile`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX --topfileU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMdhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X --topfiler r }r (h-Uh.j ubahAjubaubeubahAjubehAjubaubeubh/)r }r (h-Uh.jh7h:hAhOhC}r (hG]hH]hF]hE]r Udetermining-the-branch-namer ahI]r! h#auhLMghMhhN]r" (hW)r# }r$ (h-XDetermining the branch namer% h.j h7h:hAh[hC}r& (hG]hH]hF]hE]hI]uhLMghMhhN]r' h^XDetermining the branch namer( r) }r* (h-j% h.j# ubaubhb)r+ }r, (h-X^Some VC systems record the branch information in a way that ``try`` can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the :option:`--branch` argument, or a ``try_branch`` entry in the :file:`.buildbot/options` file.h.j h7h:hAhehC}r- (hG]hH]hF]hE]hI]uhLMihMhhN]r. (h^X<Some VC systems record the branch information in a way that r/ r0 }r1 (h-X<Some VC systems record the branch information in a way that h.j+ ubh)r2 }r3 (h-X``try``hC}r4 (hG]hH]hF]hE]hI]uh.j+ hN]r5 h^Xtryr6 r7 }r8 (h-Uh.j2 ubahAhubh^X can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the r9 r: }r; (h-X can locate it. For the others, if you are using something other than the default branch, you will have to tell the buildbot which branch your tree is using. You can do this with either the h.j+ ubjx)r< }r= (h-X:option:`--branch`r> h.j+ h7h:hAj|hC}r? (UreftypeXoptionj~jX--branchU refdomainXstdr@ j NhE]hF]U refexplicithG]hH]hI]jjuhLMihN]rA j )rB }rC (h-j> hC}rD (hG]hH]rE (jj@ X std-optionrF ehF]hE]hI]uh.j< hN]rG h^X--branchrH rI }rJ (h-Uh.jB ubahAjubaubh^X argument, or a rK rL }rM (h-X argument, or a h.j+ ubh)rN }rO (h-X``try_branch``hC}rP (hG]hH]hF]hE]hI]uh.j+ hN]rQ h^X try_branchrR rS }rT (h-Uh.jN ubahAhubh^X entry in the rU rV }rW (h-X entry in the h.j+ ubh)rX }rY (h-UhC}rZ (hE]hF]hG]hH]r[ Xfiler\ aUrolej\ hI]uh.j+ hN]r] h^X.buildbot/optionsr^ r_ }r` (h-X.buildbot/optionsh.jX ubahAhubh^X file.ra rb }rc (h-X file.h.j+ ubeubeubh/)rd }re (h-Uh.jh7h:hAhOhC}rf (hG]hH]hF]hE]rg U"determining-the-revision-and-patchrh ahI]ri hauhLMqhMhhN]rj (hW)rk }rl (h-X"Determining the revision and patchrm h.jd h7h:hAh[hC}rn (hG]hH]hF]hE]hI]uhLMqhMhhN]ro h^X"Determining the revision and patchrp rq }rr (h-jm h.jk ubaubhb)rs }rt (h-XfEach VC system has a separate approach for determining the tree's base revision and computing a patch.ru h.jd h7h:hAhehC}rv (hG]hH]hF]hE]hI]uhLMshMhhN]rw h^XfEach VC system has a separate approach for determining the tree's base revision and computing a patch.rx ry }rz (h-ju h.js ubaubcdocutils.nodes definition_list r{ )r| }r} (h-Uh.jd h7h:hAUdefinition_listr~ hC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r (cdocutils.nodes definition_list_item r )r }r (h-XnCVS :command:`try` pretends that the tree is up to date. It converts the current time into a :option:`-D` time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository. h.j| h7h:hAUdefinition_list_itemr hC}r (hG]hH]hF]hE]hI]uhLM|hN]r (cdocutils.nodes term r )r }r (h-XCVSr h.j h7h:hAUtermr hC}r (hG]hH]hF]hE]hI]uhLM|hN]r h^XCVSr r }r (h-j h.j ubaubcdocutils.nodes definition r )r }r (h-UhC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-Xi:command:`try` pretends that the tree is up to date. It converts the current time into a :option:`-D` time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMwhN]r (hk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^XK pretends that the tree is up to date. It converts the current time into a r r }r (h-XK pretends that the tree is up to date. It converts the current time into a h.j ubjx)r }r (h-X :option:`-D`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX-DU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMwhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X-Dr r }r (h-Uh.j ubahAjubaubh^X time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.r r }r (h-X time specification, uses it as the base revision, and computes the diff between the upstream tree as of that point in time versus the current contents. This works, more or less, but requires that the local clock be in reasonably good sync with the repository.h.j ubeubahAU definitionr ubeubj )r }r (h-XSVN :command:`try` does a :command:`svn status -u` to find the latest repository revision number (emitted on the last line in the :samp:`Status against revision: {NN}` message). It then performs an :samp:`svn diff -r{NN}` to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the ``try`` tree being created with the latest revision, then *backwards* patches applied to bring it ``back`` to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build. h.j| h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j )r }r (h-XSVNr h.j h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhN]r h^XSVNr r }r (h-j h.j ubaubj )r }r (h-UhC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-X:command:`try` does a :command:`svn status -u` to find the latest repository revision number (emitted on the last line in the :samp:`Status against revision: {NN}` message). It then performs an :samp:`svn diff -r{NN}` to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the ``try`` tree being created with the latest revision, then *backwards* patches applied to bring it ``back`` to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhN]r (hk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X does a r r }r (h-X does a h.j ubhk)r }r (h-X:command:`svn status -u`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^X svn status -ur r }r (h-Uh.j ubahAhuubh^XP to find the latest repository revision number (emitted on the last line in the r r }r (h-XP to find the latest repository revision number (emitted on the last line in the h.j ubh)r }r (h-UhC}r (hE]hF]hG]hH]r Xsampr aUrolej hI]uh.j hN]r (h^XStatus against revision: r r }r (h-XStatus against revision: h.j ubj)r }r (h-XNNhC}r (hG]hH]hF]hE]hI]uh.j hN]r h^XNNr r }r (h-Uh.j ubahAjubehAhubh^X message). It then performs an r r }r (h-X message). It then performs an h.j ubh)r }r (h-UhC}r (hE]hF]hG]hH]r Xsampr aUrolej hI]uh.j hN]r (h^X svn diff -rr r }r (h-X svn diff -rh.j ubj)r }r (h-XNNhC}r (hG]hH]hF]hE]hI]uh.j hN]r h^XNNr r }r (h-Uh.j ubahAjubehAhubh^X to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the r r }r (h-X to find out how your tree differs from the repository version, and sends the resulting patch to the buildmaster. If your tree is not up to date, this will result in the h.j ubh)r }r (h-X``try``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhubh^X3 tree being created with the latest revision, then r r }r (h-X3 tree being created with the latest revision, then h.j ubj)r }r (h-X *backwards*hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X backwardsr r }r (h-Uh.j ubahAjubh^X patches applied to bring it r r }r (h-X patches applied to bring it h.j ubh)r }r (h-X``back``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xbackr r! }r" (h-Uh.j ubahAhubh^X to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.r# r$ }r% (h-X to the version you actually checked out (plus your actual code changes), but this will still result in the correct tree being used for the build.h.j ubeubahAj ubeubj )r& }r' (h-X~bzr :command:`try` does a ``bzr revision-info`` to find the base revision, then a ``bzr diff -r$base..`` to obtain the patch. h.j| h7h:hAj hC}r( (hG]hH]hF]hE]hI]uhLMhMhhN]r) (j )r* }r+ (h-Xbzrr, h.j& h7h:hAj hC}r- (hG]hH]hF]hE]hI]uhLMhN]r. h^Xbzrr/ r0 }r1 (h-j, h.j* ubaubj )r2 }r3 (h-UhC}r4 (hG]hH]hF]hE]hI]uh.j& hN]r5 hb)r6 }r7 (h-Xy:command:`try` does a ``bzr revision-info`` to find the base revision, then a ``bzr diff -r$base..`` to obtain the patch.h.j2 h7h:hAhehC}r8 (hG]hH]hF]hE]hI]uhLMhN]r9 (hk)r: }r; (h-X:command:`try`hC}r< (hG]hH]r= hpahF]hE]hI]uh.j6 hN]r> h^Xtryr? r@ }rA (h-Uh.j: ubahAhuubh^X does a rB rC }rD (h-X does a h.j6 ubh)rE }rF (h-X``bzr revision-info``hC}rG (hG]hH]hF]hE]hI]uh.j6 hN]rH h^Xbzr revision-inforI rJ }rK (h-Uh.jE ubahAhubh^X# to find the base revision, then a rL rM }rN (h-X# to find the base revision, then a h.j6 ubh)rO }rP (h-X``bzr diff -r$base..``hC}rQ (hG]hH]hF]hE]hI]uh.j6 hN]rR h^Xbzr diff -r$base..rS rT }rU (h-Uh.jO ubahAhubh^X to obtain the patch.rV rW }rX (h-X to obtain the patch.h.j6 ubeubahAj ubeubj )rY }rZ (h-XMercurial ``hg parents --template '{node}\n'`` emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. ``hg diff`` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' ``source.Mercurial`` will use. h.j| h7h:hAj hC}r[ (hG]hH]hF]hE]hI]uhLMhMhhN]r\ (j )r] }r^ (h-X Mercurialr_ h.jY h7h:hAj hC}r` (hG]hH]hF]hE]hI]uhLMhN]ra h^X Mercurialrb rc }rd (h-j_ h.j] ubaubj )re }rf (h-UhC}rg (hG]hH]hF]hE]hI]uh.jY hN]rh hb)ri }rj (h-X``hg parents --template '{node}\n'`` emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. ``hg diff`` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' ``source.Mercurial`` will use.h.je h7h:hAhehC}rk (hG]hH]hF]hE]hI]uhLMhN]rl (h)rm }rn (h-X$``hg parents --template '{node}\n'``hC}ro (hG]hH]hF]hE]hI]uh.ji hN]rp h^X hg parents --template '{node}\n'rq rr }rs (h-Uh.jm ubahAhubh^X emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. rt ru }rv (h-X emits the full revision id (as opposed to the common 12-char truncated) which is a SHA1 hash of the current revision's contents. This is used as the base revision. h.ji ubh)rw }rx (h-X ``hg diff``hC}ry (hG]hH]hF]hE]hI]uh.ji hN]rz h^Xhg diffr{ r| }r} (h-Uh.jw ubahAhubh^X8 then provides the patch relative to that revision. For r~ r }r (h-X8 then provides the patch relative to that revision. For h.ji ubhk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.ji hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' r r }r (h-X to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' h.ji ubh)r }r (h-X``source.Mercurial``hC}r (hG]hH]hF]hE]hI]uh.ji hN]r h^Xsource.Mercurialr r }r (h-Uh.j ubahAhubh^X will use.r r }r (h-X will use.h.ji ubeubahAj ubeubj )r }r (h-XPerforce :command:`try` does a ``p4 changes -m1 ...`` to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a ``p4 diff -du`` to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see :bb:chsrc:`P4Source`) is assumed to be ``//depot`` h.j| h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j )r }r (h-XPerforcer h.j h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhN]r h^XPerforcer r }r (h-j h.j ubaubj )r }r (h-UhC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-X:command:`try` does a ``p4 changes -m1 ...`` to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a ``p4 diff -du`` to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see :bb:chsrc:`P4Source`) is assumed to be ``//depot``h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhN]r (hk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X does a r r }r (h-X does a h.j ubh)r }r (h-X``p4 changes -m1 ...``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xp4 changes -m1 ...r r }r (h-Uh.j ubahAhubh^X to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a r r }r (h-X to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a h.j ubh)r }r (h-X``p4 diff -du``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X p4 diff -dur r }r (h-Uh.j ubahAhubh^X to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see r r }r (h-X to obtain the patch. A p4 patch differs slightly from a normal diff. It contains full depot paths and must be converted to paths relative to the branch top. To convert the following restriction is imposed. The p4base (see h.j ubjx)r }r (h-X:bb:chsrc:`P4Source`r h.j h7h:hAj|hC}r (UreftypeXchsrcj~jXP4SourceU refdomainXbbr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r h)r }r (h-j hC}r (hG]hH]r (jj Xbb-chsrcr ehF]hE]hI]uh.j hN]r h^XP4Sourcer r }r (h-Uh.j ubahAhubaubh^X) is assumed to be r r }r (h-X) is assumed to be h.j ubh)r }r (h-X ``//depot``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X//depotr r }r (h-Uh.j ubahAhubeubahAj ubeubj )r }r (h-XDarcs :command:`try` does a ``darcs changes --context`` to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this ``context`` file *are* the revision stamp for a Darcs-controlled source tree. It then does a ``darcs diff -u`` to compute the patch relative to that revision. h.j| h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (j )r }r (h-XDarcsr h.j h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhN]r h^XDarcsr r }r (h-j h.j ubaubj )r }r (h-UhC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-X:command:`try` does a ``darcs changes --context`` to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this ``context`` file *are* the revision stamp for a Darcs-controlled source tree. It then does a ``darcs diff -u`` to compute the patch relative to that revision.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhN]r (hk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X does a r r }r (h-X does a h.j ubh)r }r (h-X``darcs changes --context``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xdarcs changes --contextr r }r (h-Uh.j ubahAhubh^X to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this r r }r (h-X to find the list of all patches back to and including the last tag that was made. This text file (plus the location of a repository that contains all these patches) is sufficient to re-create the tree. Therefore the contents of this h.j ubh)r }r (h-X ``context``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xcontextr r }r (h-Uh.j ubahAhubh^X file r r }r (h-X file h.j ubj)r }r (h-X*are*hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xarer r }r (h-Uh.j ubahAjubh^XH the revision stamp for a Darcs-controlled source tree. It then does a r r }r (h-XH the revision stamp for a Darcs-controlled source tree. It then does a h.j ubh)r }r (h-X``darcs diff -u``hC}r! (hG]hH]hF]hE]hI]uh.j hN]r" h^X darcs diff -ur# r$ }r% (h-Uh.j ubahAhubh^X0 to compute the patch relative to that revision.r& r' }r( (h-X0 to compute the patch relative to that revision.h.j ubeubahAj ubeubj )r) }r* (h-XGit ``git branch -v`` lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with ``* `` (star and space) while all the others start with ``  `` (two spaces). :command:`try` scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision. h.j| h7h:hAj hC}r+ (hG]hH]hF]hE]hI]uhLMhMhhN]r, (j )r- }r. (h-XGitr/ h.j) h7h:hAj hC}r0 (hG]hH]hF]hE]hI]uhLMhN]r1 h^XGitr2 r3 }r4 (h-j/ h.j- ubaubj )r5 }r6 (h-UhC}r7 (hG]hH]hF]hE]hI]uh.j) hN]r8 hb)r9 }r: (h-X``git branch -v`` lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with ``* `` (star and space) while all the others start with ``  `` (two spaces). :command:`try` scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.h.j5 h7h:hAhehC}r; (hG]hH]hF]hE]hI]uhLMhN]r< (h)r= }r> (h-X``git branch -v``hC}r? (hG]hH]hF]hE]hI]uh.j9 hN]r@ h^X git branch -vrA rB }rC (h-Uh.j= ubahAhubh^X lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with rD rE }rF (h-X lists all the branches available in the local repository along with the revision ID it points to and a short summary of the last commit. The line containing the currently checked out branch begins with h.j9 ubh)rG }rH (h-X``* ``hC}rI (hG]hH]hF]hE]hI]uh.j9 hN]rJ h^X* rK rL }rM (h-Uh.jG ubahAhubh^X2 (star and space) while all the others start with rN rO }rP (h-X2 (star and space) while all the others start with h.j9 ubh)rQ }rR (h-X``  ``hC}rS (hG]hH]hF]hE]hI]uh.j9 hN]rT h^X  rU rV }rW (h-Uh.jQ ubahAhubh^X (two spaces). rX rY }rZ (h-X (two spaces). h.j9 ubhk)r[ }r\ (h-X:command:`try`hC}r] (hG]hH]r^ hpahF]hE]hI]uh.j9 hN]r_ h^Xtryr` ra }rb (h-Uh.j[ ubahAhuubh^X{ scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.rc rd }re (h-X{ scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.h.j9 ubeubahAj ubeubeubjw )rf }rg (h-XEThe spaces in the previous 2 literals are non-breakable spaces  h.jd h7h:hAjz hC}rh (hhhE]hF]hG]hH]hI]uhLMhMhhN]ri h^XEThe spaces in the previous 2 literals are non-breakable spaces  rj rk }rl (h-Uh.jf ubaubh>)rm }rn (h-Uh.jd h7h:hAhBhC}ro (hE]hF]hG]hH]hI]hJUindex-0rp uhLNhMhhN]ubcsphinx.ext.todo todo_node rq )rr }rs (h-XI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.rt h.jd h7h:h<}hAU todo_noderu hC}rv (hG]hH]rw Uadmonition-todorx ahF]hE]ry jp ahI]uhLMhMhhT}rz jp jm shN]r{ (hW)r| }r} (h-XTodor~ hC}r (hG]hH]hF]hE]hI]uh.jr hN]r h^XTodor r }r (h-j~ h.j| ubahAh[ubhb)r }r (h-XI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.r h.jr h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhN]r h^XI'm not sure if this actually works the way it's intended since the extracted base revision might not actually exist in the upstream repository. Perhaps we need to add a --remote option to specify the remote tracking branch to generate a diff against.r r }r (h-j h.j ubaubeubj{ )r }r (h-Uh.jd h7h:hAj~ hC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r j )r }r (h-XMonotone :command:`mtn automate get_base_revision_id` emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. :command:`mtn diff` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' :class:`source.Monotone` will use. h.j h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhN]r (j )r }r (h-XMonotoner h.j h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMhN]r h^XMonotoner r }r (h-j h.j ubaubj )r }r (h-UhC}r (hG]hH]hF]hE]hI]uh.j hN]r hb)r }r (h-X:command:`mtn automate get_base_revision_id` emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. :command:`mtn diff` then provides the patch relative to that revision. For :command:`try` to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' :class:`source.Monotone` will use.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhN]r (hk)r }r (h-X,:command:`mtn automate get_base_revision_id`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^X!mtn automate get_base_revision_idr r }r (h-Uh.j ubahAhuubh^Xx emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. r r }r (h-Xx emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. h.j ubhk)r }r (h-X:command:`mtn diff`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xmtn diffr r }r (h-Uh.j ubahAhuubh^X9 then provides the patch relative to that revision. For r r }r (h-X9 then provides the patch relative to that revision. For h.j ubhk)r }r (h-X:command:`try`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^Xtryr r }r (h-Uh.j ubahAhuubh^X to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' r r }r (h-X to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' h.j ubjx)r }r (h-X:class:`source.Monotone`r h.j h7h:hAj|hC}r (UreftypeXclassj~jXsource.MonotoneU refdomainXpyr hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]r h)r }r (h-j hC}r (hG]hH]r (jj Xpy-classr ehF]hE]hI]uh.j hN]r h^Xsource.Monotoner r }r (h-Uh.j ubahAhubaubh^X will use.r r }r (h-X will use.h.j ubeubahAj ubeubaubeubh/)r }r (h-Uh.jh7h:hAhOhC}r (hG]hH]hF]hE]r Upatch-informationr ahI]r h auhLMhMhhN]r (hW)r }r (h-Xpatch informationr h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h^Xpatch informationr r }r (h-j h.j ubaubhb)r }r (h-X?You can provide the :option:`--who=dev` to designate who is running the try build. This will add the ``dev`` to the Reason field on the try build's status web page. You can also set ``try_who = dev`` in the :file:`.buildbot/options` file. Note that :option:`--who=dev` will not work on version 0.8.3 or earlier masters.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (h^XYou can provide the r r }r (h-XYou can provide the h.j ubjx)r }r (h-X:option:`--who=dev`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX --who=devU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X --who=devr r }r (h-Uh.j ubahAjubaubh^X> to designate who is running the try build. This will add the r r }r (h-X> to designate who is running the try build. This will add the h.j ubh)r }r(h-X``dev``hC}r(hG]hH]hF]hE]hI]uh.j hN]rh^Xdevrr}r(h-Uh.j ubahAhubh^XJ to the Reason field on the try build's status web page. You can also set rr}r(h-XJ to the Reason field on the try build's status web page. You can also set h.j ubh)r }r (h-X``try_who = dev``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X try_who = devr r}r(h-Uh.j ubahAhubh^X in the rr}r(h-X in the h.j ubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.j hN]rh^X.buildbot/optionsrr}r(h-X.buildbot/optionsh.jubahAhubh^X file. Note that rr}r(h-X file. Note that h.j ubjx)r}r (h-X:option:`--who=dev`r!h.j h7h:hAj|hC}r"(UreftypeXoptionj~jX --who=devU refdomainXstdr#j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r$j )r%}r&(h-j!hC}r'(hG]hH]r((jj#X std-optionr)ehF]hE]hI]uh.jhN]r*h^X --who=devr+r,}r-(h-Uh.j%ubahAjubaubh^X3 will not work on version 0.8.3 or earlier masters.r.r/}r0(h-X3 will not work on version 0.8.3 or earlier masters.h.j ubeubhb)r1}r2(h-XSimilarly, :option:`--comment=COMMENT` will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is ``try_comment``.h.j h7h:hAhehC}r3(hG]hH]hF]hE]hI]uhLMhMhhN]r4(h^X Similarly, r5r6}r7(h-X Similarly, h.j1ubjx)r8}r9(h-X:option:`--comment=COMMENT`r:h.j1h7h:hAj|hC}r;(UreftypeXoptionj~jX--comment=COMMENTU refdomainXstdr<j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r=j )r>}r?(h-j:hC}r@(hG]hH]rA(jj<X std-optionrBehF]hE]hI]uh.j8hN]rCh^X--comment=COMMENTrDrE}rF(h-Uh.j>ubahAjubaubh^X will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is rGrH}rI(h-X will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is h.j1ubh)rJ}rK(h-X``try_comment``hC}rL(hG]hH]hF]hE]hI]uh.j1hN]rMh^X try_commentrNrO}rP(h-Uh.jJubahAhubh^X.rQ}rR(h-X.h.j1ubeubeubh/)rS}rT(h-Uh.jh7h:hAhOhC}rU(hG]hH]hF]hE]rVUsending-propertiesrWahI]rXhauhLMhMhhN]rY(hW)rZ}r[(h-XSending propertiesr\h.jSh7h:hAh[hC}r](hG]hH]hF]hE]hI]uhLMhMhhN]r^h^XSending propertiesr_r`}ra(h-j\h.jZubaubhb)rb}rc(h-XYou can set properties to send with your change using either the :option:`--property=key=value` option, which sets a single property, or the :option:`--properties=key1=value1,key2=value2...` option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the :option:`--properties` option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the :option:`--property` option to set it.h.jSh7h:hAhehC}rd(hG]hH]hF]hE]hI]uhLMhMhhN]re(h^XAYou can set properties to send with your change using either the rfrg}rh(h-XAYou can set properties to send with your change using either the h.jbubjx)ri}rj(h-X:option:`--property=key=value`rkh.jbh7h:hAj|hC}rl(UreftypeXoptionj~jX--property=key=valueU refdomainXstdrmj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rnj )ro}rp(h-jkhC}rq(hG]hH]rr(jjmX std-optionrsehF]hE]hI]uh.jihN]rth^X--property=key=valuerurv}rw(h-Uh.joubahAjubaubh^X. option, which sets a single property, or the rxry}rz(h-X. option, which sets a single property, or the h.jbubjx)r{}r|(h-X1:option:`--properties=key1=value1,key2=value2...`r}h.jbh7h:hAj|hC}r~(UreftypeXoptionj~jX'--properties=key1=value1,key2=value2...U refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-j}hC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.j{hN]rh^X'--properties=key1=value1,key2=value2...rr}r(h-Uh.jubahAjubaubh^Xx option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the rr}r(h-Xx option, which sets multiple comma-separated properties. Either of these can be sepcified multiple times. Note that the h.jbubjx)r}r(h-X:option:`--properties`rh.jbh7h:hAj|hC}r(UreftypeXoptionj~jX --propertiesU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --propertiesrr}r(h-Uh.jubahAjubaubh^Xv option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the rr}r(h-Xv option uses commas to split on properties, so if your property value itself contains a comma, you'll need to use the h.jbubjx)r}r(h-X:option:`--property`rh.jbh7h:hAj|hC}r(UreftypeXoptionj~jX --propertyU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --propertyrr}r(h-Uh.jubahAjubaubh^X option to set it.rr}r(h-X option to set it.h.jbubeubh>)r}r(h-X.. _try--diff:h.jSh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJUtry-diffruhLMhMhhN]ubeubeubh/)r}r(h-Uh.j;h7h:h<}rh jshAhOhC}r(hG]hH]hF]hE]r(jUid2rehI]r(h!h euhLMhMhhT}rjjshN]r(hW)r}r(h-X try --diffrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^X try --diffrr}r(h-jh.jubaubhb)r}r(h-X[Sometimes you might have a patch from someone else that you want to submit to the buildbot. For example, a user may have created a patch to fix some specific bug and sent it to you by email. You've inspected the patch and suspect that it might do the job (and have at least confirmed that it doesn't do anything evil). Now you want to test it out.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^X[Sometimes you might have a patch from someone else that you want to submit to the buildbot. For example, a user may have created a patch to fix some specific bug and sent it to you by email. You've inspected the patch and suspect that it might do the job (and have at least confirmed that it doesn't do anything evil). Now you want to test it out.rr}r(h-jh.jubaubhb)r}r(h-XOne approach would be to check out a new local tree, apply the patch, run your local tests, then use ``buildbot try`` to run the tests on other platforms. An alternate approach is to use the ``buildbot try --diff`` form to have the buildbot test the patch without using a local tree.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XeOne approach would be to check out a new local tree, apply the patch, run your local tests, then use rr}r(h-XeOne approach would be to check out a new local tree, apply the patch, run your local tests, then use h.jubh)r}r(h-X``buildbot try``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X buildbot tryrr}r(h-Uh.jubahAhubh^XJ to run the tests on other platforms. An alternate approach is to use the rr}r(h-XJ to run the tests on other platforms. An alternate approach is to use the h.jubh)r}r(h-X``buildbot try --diff``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xbuildbot try --diffrr}r(h-Uh.jubahAhubh^XE form to have the buildbot test the patch without using a local tree.rr}r(h-XE form to have the buildbot test the patch without using a local tree.h.jubeubhb)r}r(h-X5This form takes a :option:`--diff` argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional :option:`--baserev` argument, a tree of the given revision will be used as a starting point instead of TRUNK.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XThis form takes a rr}r(h-XThis form takes a h.jubjx)r}r(h-X:option:`--diff`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--diffU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--diffrr}r(h-Uh.jubahAjubaubh^X argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional rr}r(h-X argument which points to a file that contains the patch you want to apply. By default this patch will be applied to the TRUNK revision, but if you give the optional h.jubjx)r}r(h-X:option:`--baserev`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --baserevU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r (h-jhC}r (hG]hH]r (jjX std-optionr ehF]hE]hI]uh.jhN]r h^X --baserevrr}r(h-Uh.jubahAjubaubh^XZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.rr}r(h-XZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.h.jubeubhb)r}r(h-XPYou can also use ``buildbot try --diff=-`` to read the patch from :file:`stdin`.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XYou can also use rr}r(h-XYou can also use h.jubh)r}r(h-X``buildbot try --diff=-``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xbuildbot try --diff=-rr }r!(h-Uh.jubahAhubh^X to read the patch from r"r#}r$(h-X to read the patch from h.jubh)r%}r&(h-UhC}r'(hE]hF]hG]hH]r(Xfiler)aUrolej)hI]uh.jhN]r*h^Xstdinr+r,}r-(h-Xstdinh.j%ubahAhubh^X.r.}r/(h-X.h.jubeubhb)r0}r1(h-XEach patch has a ``patchlevel`` associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the :option:`-p` or :option:`--strip` argument to the :command:`patch` utility. By default ``buildbot try --diff`` uses a patchlevel of 0, but you can override this with the :option:`-p` argument.h.jh7h:hAhehC}r2(hG]hH]hF]hE]hI]uhLMhMhhN]r3(h^XEach patch has a r4r5}r6(h-XEach patch has a h.j0ubh)r7}r8(h-X``patchlevel``hC}r9(hG]hH]hF]hE]hI]uh.j0hN]r:h^X patchlevelr;r<}r=(h-Uh.j7ubahAhubh^X associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the r>r?}r@(h-X associated with it. This indicates the number of slashes (and preceding pathnames) that should be stripped before applying the diff. This exactly corresponds to the h.j0ubjx)rA}rB(h-X :option:`-p`rCh.j0h7h:hAj|hC}rD(UreftypeXoptionj~jX-pU refdomainXstdrEj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rFj )rG}rH(h-jChC}rI(hG]hH]rJ(jjEX std-optionrKehF]hE]hI]uh.jAhN]rLh^X-prMrN}rO(h-Uh.jGubahAjubaubh^X or rPrQ}rR(h-X or h.j0ubjx)rS}rT(h-X:option:`--strip`rUh.j0h7h:hAj|hC}rV(UreftypeXoptionj~jX--stripU refdomainXstdrWj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rXj )rY}rZ(h-jUhC}r[(hG]hH]r\(jjWX std-optionr]ehF]hE]hI]uh.jShN]r^h^X--stripr_r`}ra(h-Uh.jYubahAjubaubh^X argument to the rbrc}rd(h-X argument to the h.j0ubhk)re}rf(h-X:command:`patch`hC}rg(hG]hH]rhhpahF]hE]hI]uh.j0hN]rih^Xpatchrjrk}rl(h-Uh.jeubahAhuubh^X utility. By default rmrn}ro(h-X utility. By default h.j0ubh)rp}rq(h-X``buildbot try --diff``hC}rr(hG]hH]hF]hE]hI]uh.j0hN]rsh^Xbuildbot try --diffrtru}rv(h-Uh.jpubahAhubh^X< uses a patchlevel of 0, but you can override this with the rwrx}ry(h-X< uses a patchlevel of 0, but you can override this with the h.j0ubjx)rz}r{(h-X :option:`-p`r|h.j0h7h:hAj|hC}r}(UreftypeXoptionj~jX-pU refdomainXstdr~j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-j|hC}r(hG]hH]r(jj~X std-optionrehF]hE]hI]uh.jzhN]rh^X-prr}r(h-Uh.jubahAjubaubh^X argument.rr}r(h-X argument.h.j0ubeubhb)r}r(h-XPWhen you use :option:`--diff`, you do not need to use any of the other options that relate to a local tree, specifically :option:`--vc`, :option:`--try-topfile`, or :option:`--try-topdir`. These options will be ignored. Of course you must still specify how to get to the buildmaster (with :option:`--connect`, :option:`--tryhost`, etc).h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^X When you use rr}r(h-X When you use h.jubjx)r}r(h-X:option:`--diff`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--diffU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--diffrr}r(h-Uh.jubahAjubaubh^X\, you do not need to use any of the other options that relate to a local tree, specifically rr}r(h-X\, you do not need to use any of the other options that relate to a local tree, specifically h.jubjx)r}r(h-X:option:`--vc`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--vcU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--vcrr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jubjx)r}r(h-X:option:`--try-topfile`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --try-topfileU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --try-topfilerr}r(h-Uh.jubahAjubaubh^X, or rr}r(h-X, or h.jubjx)r}r(h-X:option:`--try-topdir`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --try-topdirU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --try-topdirrr}r(h-Uh.jubahAjubaubh^Xf. These options will be ignored. Of course you must still specify how to get to the buildmaster (with rr}r(h-Xf. These options will be ignored. Of course you must still specify how to get to the buildmaster (with h.jubjx)r}r(h-X:option:`--connect`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --connectU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --connectrr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jubjx)r}r(h-X:option:`--tryhost`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --tryhostU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --tryhostrr}r(h-Uh.jubahAjubaubh^X, etc).rr}r(h-X, etc).h.jubeubeubeubh/)r}r(h-Uh.jh7h:hAhOhC}r(hG]hH]hF]hE]rU other-toolsrahI]rhauhLMhMhhN]r(hW)r}r(h-X Other Toolsrh.jh7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h^X Other Toolsr r }r (h-jh.jubaubhb)r}r(h-X=These tools are generally used by buildmaster administrators.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM hMhhN]rh^X=These tools are generally used by buildmaster administrators.rr}r(h-jh.jubaubj)r}r(h-Uh.jh7h:hAjhC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleX$Command Line Subcommands; sendchangeXcmdline-sendchangerjtr(UsingleX"sendchange Command Line SubcommandjjtreuhLM hMhhN]ubh>)r}r(h-Uh.jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLM hMhhN]ubh/)r }r!(h-Uh.jh7h:h<}hAhOhC}r"(hG]hH]hF]hE]r#(U sendchanger$jehI]r%hauhLMhMhhT}r&jjshN]r'(hW)r(}r)(h-X sendchanger*h.j h7h:hAh[hC}r+(hG]hH]hF]hE]hI]uhLMhMhhN]r,h^X sendchanger-r.}r/(h-j*h.j(ubaubhb)r0}r1(h-X+This command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a :class:`PBChangeSource` (:bb:chsrc:`PBChangeSource`) running in the buildmaster (by being set in ``c['change_source']``).h.j h7h:hAhehC}r2(hG]hH]hF]hE]hI]uhLMhMhhN]r3(h^XThis command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a r4r5}r6(h-XThis command is used to tell the buildmaster about source changes. It is intended to be used from within a commit script, installed on the VC server. It requires that you have a h.j0ubjx)r7}r8(h-X:class:`PBChangeSource`r9h.j0h7h:hAj|hC}r:(UreftypeXclassj~jXPBChangeSourceU refdomainXpyr;hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]r<h)r=}r>(h-j9hC}r?(hG]hH]r@(jj;Xpy-classrAehF]hE]hI]uh.j7hN]rBh^XPBChangeSourcerCrD}rE(h-Uh.j=ubahAhubaubh^X (rFrG}rH(h-X (h.j0ubjx)rI}rJ(h-X:bb:chsrc:`PBChangeSource`rKh.j0h7h:hAj|hC}rL(UreftypeXchsrcj~jXPBChangeSourceU refdomainXbbrMhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rNh)rO}rP(h-jKhC}rQ(hG]hH]rR(jjMXbb-chsrcrSehF]hE]hI]uh.jIhN]rTh^XPBChangeSourcerUrV}rW(h-Uh.jOubahAhubaubh^X.) running in the buildmaster (by being set in rXrY}rZ(h-X.) running in the buildmaster (by being set in h.j0ubh)r[}r\(h-X``c['change_source']``hC}r](hG]hH]hF]hE]hI]uh.j0hN]r^h^Xc['change_source']r_r`}ra(h-Uh.j[ubahAhubh^X).rbrc}rd(h-X).h.j0ubeubh)re}rf(h-Xhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}h.j h7h:hAhhC}rg(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rhh^Xhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}rirj}rk(h-Uh.jeubaubhb)rl}rm(h-XoThe :option:`auth` option specifies the credentials to use to connect to the master, in the form ``user:pass``. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.h.j h7h:hAhehC}rn(hG]hH]hF]hE]hI]uhLMhMhhN]ro(h^XThe rprq}rr(h-XThe h.jlubjx)rs}rt(h-X:option:`auth`ruh.jlh7h:hAj|hC}rv(UreftypeXoptionj~jXauthU refdomainXstdrwj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rxj )ry}rz(h-juhC}r{(hG]hH]r|(jjwX std-optionr}ehF]hE]hI]uh.jshN]r~h^Xauthrr}r(h-Uh.jyubahAjubaubh^XO option specifies the credentials to use to connect to the master, in the form rr}r(h-XO option specifies the credentials to use to connect to the master, in the form h.jlubh)r}r(h-X ``user:pass``hC}r(hG]hH]hF]hE]hI]uh.jlhN]rh^X user:passrr}r(h-Uh.jubahAhubh^X. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.rr}r(h-X. If the password is omitted, then sendchange will prompt for it. If both are omitted, the old default (username "change" and password "changepw") will be used. Note that this password is well-known, and should not be used on an internet-accessible port.h.jlubeubhb)r}r(h-XThe :option:`master` and :option:`username` arguments can also be given in the options file (see :ref:`buildbot-config-directory`). There are other (optional) arguments which can influence the ``Change`` that gets submitted:h.j h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM"hMhhN]r(h^XThe rr}r(h-XThe h.jubjx)r}r(h-X:option:`master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXmasterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLM"hN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xmasterrr}r(h-Uh.jubahAjubaubh^X and rr}r(h-X and h.jubjx)r}r(h-X:option:`username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXusernameU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLM"hN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xusernamerr}r(h-Uh.jubahAjubaubh^X6 arguments can also be given in the options file (see rr}r(h-X6 arguments can also be given in the options file (see h.jubjx)r}r(h-X :ref:`buildbot-config-directory`rh.jh7h:hAj|hC}r(UreftypeXrefj~jXbuildbot-config-directoryU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLM"hN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^Xbuildbot-config-directoryrr}r(h-Uh.jubahAjubaubh^XA). There are other (optional) arguments which can influence the rr}r(h-XA). There are other (optional) arguments which can influence the h.jubh)r}r(h-X ``Change``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XChangerr}r(h-Uh.jubahAhubh^X that gets submitted:rr}r(h-X that gets submitted:h.jubeubh)r}r(h-Uh.j h7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X--branchrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--branchrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-X(or option ``branch``) This provides the (string) branch specifier. If omitted, it defaults to ``None``, indicating the ``default branch``. All files included in this Change must be on the same branch. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X(or option ``branch``) This provides the (string) branch specifier. If omitted, it defaults to ``None``, indicating the ``default branch``. All files included in this Change must be on the same branch.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM'hN]r(h^X (or option rr}r(h-X (or option h.jubh)r}r(h-X ``branch``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xbranchrr}r(h-Uh.jubahAhubh^XJ) This provides the (string) branch specifier. If omitted, it defaults to rr}r(h-XJ) This provides the (string) branch specifier. If omitted, it defaults to h.jubh)r}r(h-X``None``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XNonerr}r (h-Uh.jubahAhubh^X, indicating the r r }r (h-X, indicating the h.jubh)r }r(h-X``default branch``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xdefault branchrr}r(h-Uh.j ubahAhubh^X?. All files included in this Change must be on the same branch.rr}r(h-X?. All files included in this Change must be on the same branch.h.jubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r (h-X --categoryr!hC}r"(hG]hH]hF]hE]hI]uh.jhN]r#h)r$}r%(h-j!hC}r&(hG]hH]hF]hE]hI]uh.jhN]r'h^X --categoryr(r)}r*(h-Uh.j$ubahAhubahAhubahAhubh)r+}r,(h-X(or option ``category``) This provides the (string) category specifier. If omitted, it defaults to ``None``, indicating ``no category``. The category property can be used by :class:`Scheduler`\s to filter what changes they listen to. hC}r-(hG]hH]hF]hE]hI]uh.jhN]r.hb)r/}r0(h-X(or option ``category``) This provides the (string) category specifier. If omitted, it defaults to ``None``, indicating ``no category``. The category property can be used by :class:`Scheduler`\s to filter what changes they listen to.h.j+h7h:hAhehC}r1(hG]hH]hF]hE]hI]uhLM,hN]r2(h^X (or option r3r4}r5(h-X (or option h.j/ubh)r6}r7(h-X ``category``hC}r8(hG]hH]hF]hE]hI]uh.j/hN]r9h^Xcategoryr:r;}r<(h-Uh.j6ubahAhubh^XL) This provides the (string) category specifier. If omitted, it defaults to r=r>}r?(h-XL) This provides the (string) category specifier. If omitted, it defaults to h.j/ubh)r@}rA(h-X``None``hC}rB(hG]hH]hF]hE]hI]uh.j/hN]rCh^XNonerDrE}rF(h-Uh.j@ubahAhubh^X , indicating rGrH}rI(h-X , indicating h.j/ubh)rJ}rK(h-X``no category``hC}rL(hG]hH]hF]hE]hI]uh.j/hN]rMh^X no categoryrNrO}rP(h-Uh.jJubahAhubh^X'. The category property can be used by rQrR}rS(h-X'. The category property can be used by h.j/ubjx)rT}rU(h-X:class:`Scheduler`rVh.j/h7h:hAj|hC}rW(UreftypeXclassj~jX SchedulerU refdomainXpyrXhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM,hN]rYh)rZ}r[(h-jVhC}r\(hG]hH]r](jjXXpy-classr^ehF]hE]hI]uh.jThN]r_h^X Schedulerr`ra}rb(h-Uh.jZubahAhubaubh^X(s to filter what changes they listen to.rcrd}re(h-X)\s to filter what changes they listen to.h.j/ubeubahAhubeubh)rf}rg(h-Uh.jh7h:hAhhC}rh(hG]hH]hF]hE]hI]uhLNhMhhN]ri(h)rj}rk(h-UhC}rl(hG]hH]hF]hE]hI]uh.jfhN]rmh)rn}ro(h-X --projectrphC}rq(hG]hH]hF]hE]hI]uh.jjhN]rrh)rs}rt(h-jphC}ru(hG]hH]hF]hE]hI]uh.jnhN]rvh^X --projectrwrx}ry(h-Uh.jsubahAhubahAhubahAhubh)rz}r{(h-X(or option ``project``) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change. hC}r|(hG]hH]hF]hE]hI]uh.jfhN]r}hb)r~}r(h-X(or option ``project``) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.h.jzh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM1hN]r(h^X (or option rr}r(h-X (or option h.j~ubh)r}r(h-X ``project``hC}r(hG]hH]hF]hE]hI]uh.j~hN]rh^Xprojectrr}r(h-Uh.jubahAhubh^X) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.rr}r(h-X) This provides the (string) project to which this change applies, and defaults to ''. The project can be used by schedulers to decide which builders should respond to a particular change.h.j~ubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X --repositoryrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --repositoryrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-Xm(or option ``repository``) This provides the repository from which this change came, and defaults to ``''``. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-Xl(or option ``repository``) This provides the repository from which this change came, and defaults to ``''``.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM6hN]r(h^X (or option rr}r(h-X (or option h.jubh)r}r(h-X``repository``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X repositoryrr}r(h-Uh.jubahAhubh^XL) This provides the repository from which this change came, and defaults to rr}r(h-XL) This provides the repository from which this change came, and defaults to h.jubh)r}r(h-X``''``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X''rr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X --revisionrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --revisionrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XIThis provides a revision specifier, appropriate to the VC system in use. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XHThis provides a revision specifier, appropriate to the VC system in use.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM:hN]rh^XHThis provides a revision specifier, appropriate to the VC system in use.rr}r(h-jh.jubaubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X--revision_filerhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--revision_filerr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-X_This provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of ``darcs changes --context`` as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X^This provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of ``darcs changes --context`` as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM=hN]r(h^XThis provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of rr}r(h-XThis provides a filename which will be opened and the contents used as the revision specifier. This is specifically for Darcs, which uses the output of h.jubh)r}r(h-X``darcs changes --context``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xdarcs changes --contextrr}r(h-Uh.jubahAhubh^X as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.rr}r (h-X as a revision specifier. This context file can be a couple of kilobytes long, spanning a couple lines per patch, and would be a hassle to pass as a command-line argument.h.jubeubahAhubeubh)r }r (h-Uh.jh7h:hAhhC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r (h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.j hN]rh)r}r(h-X --propertyrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --propertyrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XThis parameter is used to set a property on the :class:`Change` generated by ``sendchange``. Properties are specified as a :samp:`{name}:{value}` pair, separated by a colon. You may specify many properties by passing this parameter multiple times. hC}r (hG]hH]hF]hE]hI]uh.j hN]r!hb)r"}r#(h-XThis parameter is used to set a property on the :class:`Change` generated by ``sendchange``. Properties are specified as a :samp:`{name}:{value}` pair, separated by a colon. You may specify many properties by passing this parameter multiple times.h.jh7h:hAhehC}r$(hG]hH]hF]hE]hI]uhLMEhN]r%(h^X0This parameter is used to set a property on the r&r'}r((h-X0This parameter is used to set a property on the h.j"ubjx)r)}r*(h-X:class:`Change`r+h.j"h7h:hAj|hC}r,(UreftypeXclassj~jXChangeU refdomainXpyr-hE]hF]U refexplicithG]hH]hI]jjjNjNuhLMEhN]r.h)r/}r0(h-j+hC}r1(hG]hH]r2(jj-Xpy-classr3ehF]hE]hI]uh.j)hN]r4h^XChanger5r6}r7(h-Uh.j/ubahAhubaubh^X generated by r8r9}r:(h-X generated by h.j"ubh)r;}r<(h-X``sendchange``hC}r=(hG]hH]hF]hE]hI]uh.j"hN]r>h^X sendchanger?r@}rA(h-Uh.j;ubahAhubh^X . Properties are specified as a rBrC}rD(h-X . Properties are specified as a h.j"ubh)rE}rF(h-UhC}rG(hE]hF]hG]hH]rHXsamprIaUrolejIhI]uh.j"hN]rJ(j)rK}rL(h-XnamehC}rM(hG]hH]hF]hE]hI]uh.jEhN]rNh^XnamerOrP}rQ(h-Uh.jKubahAjubh^X:rR}rS(h-X:h.jEubj)rT}rU(h-XvaluehC}rV(hG]hH]hF]hE]hI]uh.jEhN]rWh^XvaluerXrY}rZ(h-Uh.jTubahAjubehAhubh^Xf pair, separated by a colon. You may specify many properties by passing this parameter multiple times.r[r\}r](h-Xf pair, separated by a colon. You may specify many properties by passing this parameter multiple times.h.j"ubeubahAhubeubh)r^}r_(h-Uh.jh7h:hAhhC}r`(hG]hH]hF]hE]hI]uhLNhMhhN]ra(h)rb}rc(h-UhC}rd(hG]hH]hF]hE]hI]uh.j^hN]reh)rf}rg(h-X --commentsrhhC}ri(hG]hH]hF]hE]hI]uh.jbhN]rjh)rk}rl(h-jhhC}rm(hG]hH]hF]hE]hI]uh.jfhN]rnh^X --commentsrorp}rq(h-Uh.jkubahAhubahAhubahAhubh)rr}rs(h-XiThis provides the change comments as a single argument. You may want to use :option:`--logfile` instead. hC}rt(hG]hH]hF]hE]hI]uh.j^hN]ruhb)rv}rw(h-XhThis provides the change comments as a single argument. You may want to use :option:`--logfile` instead.h.jrh7h:hAhehC}rx(hG]hH]hF]hE]hI]uhLMJhN]ry(h^XLThis provides the change comments as a single argument. You may want to use rzr{}r|(h-XLThis provides the change comments as a single argument. You may want to use h.jvubjx)r}}r~(h-X:option:`--logfile`rh.jvh7h:hAj|hC}r(UreftypeXoptionj~jX --logfileU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMJhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.j}hN]rh^X --logfilerr}r(h-Uh.jubahAjubaubh^X instead.rr}r(h-X instead.h.jvubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X --logfilerhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --logfilerr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XThis instructs the tool to read the change comments from the given file. If you use ``-`` as the filename, the tool will read the change comments from stdin. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XThis instructs the tool to read the change comments from the given file. If you use ``-`` as the filename, the tool will read the change comments from stdin.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMNhN]r(h^XTThis instructs the tool to read the change comments from the given file. If you use rr}r(h-XTThis instructs the tool to read the change comments from the given file. If you use h.jubh)r}r(h-X``-``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X-r}r(h-Uh.jubahAhubh^XD as the filename, the tool will read the change comments from stdin.rr}r(h-XD as the filename, the tool will read the change comments from stdin.h.jubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X --encodingrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --encodingrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XUSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XTSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMShN]r(h^XISpecifies the character encoding for all other parameters, defaulting to rr}r(h-XISpecifies the character encoding for all other parameters, defaulting to h.jubh)r}r(h-X ``'utf8'``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X'utf8'rr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X--vcrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--vcrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XSpecifies which VC system the Change is coming from, one of: ``cvs``, ``svn``, ``darcs``, ``hg``, ``bzr``, ``git``, ``mtn``, or ``p4``. Defaults to ``None``. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XSpecifies which VC system the Change is coming from, one of: ``cvs``, ``svn``, ``darcs``, ``hg``, ``bzr``, ``git``, ``mtn``, or ``p4``. Defaults to ``None``.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMWhN]r(h^X=Specifies which VC system the Change is coming from, one of: rr}r(h-X=Specifies which VC system the Change is coming from, one of: h.jubh)r}r(h-X``cvs``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xcvsrr}r(h-Uh.jubahAhubh^X, rr}r(h-X, h.jubh)r}r (h-X``svn``hC}r (hG]hH]hF]hE]hI]uh.jhN]r h^Xsvnr r }r(h-Uh.jubahAhubh^X, rr}r(h-X, h.jubh)r}r(h-X ``darcs``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xdarcsrr}r(h-Uh.jubahAhubh^X, rr}r(h-X, h.jubh)r}r(h-X``hg``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xhgr r!}r"(h-Uh.jubahAhubh^X, r#r$}r%(h-X, h.jubh)r&}r'(h-X``bzr``hC}r((hG]hH]hF]hE]hI]uh.jhN]r)h^Xbzrr*r+}r,(h-Uh.j&ubahAhubh^X, r-r.}r/(h-X, h.jubh)r0}r1(h-X``git``hC}r2(hG]hH]hF]hE]hI]uh.jhN]r3h^Xgitr4r5}r6(h-Uh.j0ubahAhubh^X, r7r8}r9(h-X, h.jubh)r:}r;(h-X``mtn``hC}r<(hG]hH]hF]hE]hI]uh.jhN]r=h^Xmtnr>r?}r@(h-Uh.j:ubahAhubh^X, or rArB}rC(h-X, or h.jubh)rD}rE(h-X``p4``hC}rF(hG]hH]hF]hE]hI]uh.jhN]rGh^Xp4rHrI}rJ(h-Uh.jDubahAhubh^X. Defaults to rKrL}rM(h-X. Defaults to h.jubh)rN}rO(h-X``None``hC}rP(hG]hH]hF]hE]hI]uh.jhN]rQh^XNonerRrS}rT(h-Uh.jNubahAhubh^X.rU}rV(h-X.h.jubeubahAhubeubeubj)rW}rX(h-Uh.j h7h:hAjhC}rY(hE]hF]hG]hH]hI]Uentries]rZ((UsingleX%Command Line Subcommands; debugclientXcmdline-debugclientr[j[tr\(UsingleX#debugclient Command Line Subcommandj[j[tr]euhLM\hMhhN]ubh>)r^}r_(h-Uh.j h7h:hAhBhC}r`(hE]hF]hG]hH]hI]hJj[uhLM\hMhhN]ubeubh/)ra}rb(h-Uh.jh7h:h<}hAhOhC}rc(hG]hH]hF]hE]rd(U debugclientrej[ehI]rfhauhLM^hMhhT}rgj[j^shN]rh(hW)ri}rj(h-X debugclientrkh.jah7h:hAh[hC}rl(hG]hH]hF]hE]hI]uhLM^hMhhN]rmh^X debugclientrnro}rp(h-jkh.jiubaubh)rq}rr(h-XDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}h.jah7h:hAhhC}rs(hhXnonehhhE]hF]hG]hH]hI]uhLM`hMhhN]rth^XDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}rurv}rw(h-Uh.jqubaubhb)rx}ry(h-XThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's ``debug port``. This debug port shares the same port number as the slaveport (see :ref:`Setting-the-PB-Port-for-Slaves`), but the ``debugPort`` is only enabled if you set a debug password in the buildmaster's config file (see :ref:`Debug-Options`). The :option:`--passwd` option must match the ``c['debugPassword']`` value.h.jah7h:hAhehC}rz(hG]hH]hF]hE]hI]uhLMdhMhhN]r{(h^XSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's r|r}}r~(h-XSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's h.jxubh)r}r(h-X``debug port``hC}r(hG]hH]hF]hE]hI]uh.jxhN]rh^X debug portrr}r(h-Uh.jubahAhubh^XD. This debug port shares the same port number as the slaveport (see rr}r(h-XD. This debug port shares the same port number as the slaveport (see h.jxubjx)r}r(h-X%:ref:`Setting-the-PB-Port-for-Slaves`rh.jxh7h:hAj|hC}r(UreftypeXrefj~jXsetting-the-pb-port-for-slavesU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMdhN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^XSetting-the-PB-Port-for-Slavesrr}r(h-Uh.jubahAjubaubh^X ), but the rr}r(h-X ), but the h.jxubh)r}r(h-X ``debugPort``hC}r(hG]hH]hF]hE]hI]uh.jxhN]rh^X debugPortrr}r(h-Uh.jubahAhubh^XS is only enabled if you set a debug password in the buildmaster's config file (see rr}r(h-XS is only enabled if you set a debug password in the buildmaster's config file (see h.jxubjx)r}r(h-X:ref:`Debug-Options`rh.jxh7h:hAj|hC}r(UreftypeXrefj~jX debug-optionsU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMdhN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^X Debug-Optionsrr}r(h-Uh.jubahAjubaubh^X). The rr}r(h-X). The h.jxubjx)r}r(h-X:option:`--passwd`rh.jxh7h:hAj|hC}r(UreftypeXoptionj~jX--passwdU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMdhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--passwdrr}r(h-Uh.jubahAjubaubh^X option must match the rr}r(h-X option must match the h.jxubh)r}r(h-X``c['debugPassword']``hC}r(hG]hH]hF]hE]hI]uh.jxhN]rh^Xc['debugPassword']rr}r(h-Uh.jubahAhubh^X value.rr}r(h-X value.h.jxubeubhb)r}r(h-X:option:`--master` can also be provided in :file:`.debug/options` by the ``master`` key. :option:`--passwd` can be provided by the ``debugPassword`` key. See :ref:`buildbot-config-directory`.h.jah7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMlhMhhN]r(jx)r}r(h-X:option:`--master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMlhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X can also be provided in rr}r(h-X can also be provided in h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X.debug/optionsrr}r(h-X.debug/optionsh.jubahAhubh^X by the rr}r(h-X by the h.jubh)r}r(h-X ``master``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xmasterrr}r(h-Uh.jubahAhubh^X key. rr}r(h-X key. h.jubjx)r}r(h-X:option:`--passwd`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--passwdU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMlhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionr ehF]hE]hI]uh.jhN]r h^X--passwdr r }r (h-Uh.jubahAjubaubh^X can be provided by the rr}r(h-X can be provided by the h.jubh)r}r(h-X``debugPassword``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X debugPasswordrr}r(h-Uh.jubahAhubh^X key. See rr}r(h-X key. See h.jubjx)r}r(h-X :ref:`buildbot-config-directory`rh.jh7h:hAj|hC}r(UreftypeXrefj~jXbuildbot-config-directoryU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMlhN]r j)r!}r"(h-jhC}r#(hG]hH]r$(jjXstd-refr%ehF]hE]hI]uh.jhN]r&h^Xbuildbot-config-directoryr'r(}r)(h-Uh.j!ubahAjubaubh^X.r*}r+(h-X.h.jubeubhb)r,}r-(h-XThe :guilabel:`Connect` button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:h.jah7h:hAhehC}r.(hG]hH]hF]hE]hI]uhLMphMhhN]r/(h^XThe r0r1}r2(h-XThe h.j,ubj)r3}r4(h-UhC}r5(UrawtextX:guilabel:`Connect`hE]hF]hG]hH]r6Xguilabelr7ahI]uh.j,hN]r8h^XConnectr9r:}r;(h-Uh.j3ubahAjubh^X button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:r<r=}r>(h-X button must be pressed before any of the other buttons will be active. This establishes the connection to the buildmaster. The other sections of the tool are as follows:h.j,ubeubj{ )r?}r@(h-Uh.jah7h:hAj~ hC}rA(hG]hH]hF]hE]hI]uhLNhMhhN]rB(j )rC}rD(h-X~:guilabel:`Reload .cfg` Forces the buildmaster to reload its :file:`master.cfg` file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's :file:`twistd.log` as you reload the config file, as any errors which are detected in the config file will be announced there. h.j?h7h:hAj hC}rE(hG]hH]hF]hE]hI]uhLMzhN]rF(j )rG}rH(h-X:guilabel:`Reload .cfg`rIh.jCh7h:hAj hC}rJ(hG]hH]hF]hE]hI]uhLMzhN]rKj)rL}rM(h-UhC}rN(UrawtextjIhE]hF]hG]hH]rOXguilabelrPahI]uh.jGhN]rQh^X Reload .cfgrRrS}rT(h-Uh.jLubahAjubaubj )rU}rV(h-UhC}rW(hG]hH]hF]hE]hI]uh.jChN]rXhb)rY}rZ(h-XeForces the buildmaster to reload its :file:`master.cfg` file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's :file:`twistd.log` as you reload the config file, as any errors which are detected in the config file will be announced there.h.jUh7h:hAhehC}r[(hG]hH]hF]hE]hI]uhLMuhN]r\(h^X%Forces the buildmaster to reload its r]r^}r_(h-X%Forces the buildmaster to reload its h.jYubh)r`}ra(h-UhC}rb(hE]hF]hG]hH]rcXfilerdaUrolejdhI]uh.jYhN]reh^X master.cfgrfrg}rh(h-X master.cfgh.j`ubahAhubh^X file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's rirj}rk(h-X file. This is equivalent to sending a SIGHUP to the buildmaster, but can be done remotely through the debug port. Note that it is a good idea to be watching the buildmaster's h.jYubh)rl}rm(h-UhC}rn(hE]hF]hG]hH]roXfilerpaUrolejphI]uh.jYhN]rqh^X twistd.logrrrs}rt(h-X twistd.logh.jlubahAhubh^Xl as you reload the config file, as any errors which are detected in the config file will be announced there.rurv}rw(h-Xl as you reload the config file, as any errors which are detected in the config file will be announced there.h.jYubeubahAj ubeubj )rx}ry(h-X:guilabel:`Rebuild .py` (not yet implemented). The idea here is to use Twisted's ``rebuild`` facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers. h.j?h7h:hAj hC}rz(hG]hH]hF]hE]hI]uhLMhMhhN]r{(j )r|}r}(h-X:guilabel:`Rebuild .py`r~h.jxh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(Urawtextj~hE]hF]hG]hH]rXguilabelrahI]uh.j|hN]rh^X Rebuild .pyrr}r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jxhN]rhb)r}r(h-X(not yet implemented). The idea here is to use Twisted's ``rebuild`` facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM}hN]r(h^X9(not yet implemented). The idea here is to use Twisted's rr}r(h-X9(not yet implemented). The idea here is to use Twisted's h.jubh)r}r(h-X ``rebuild``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xrebuildrr}r(h-Uh.jubahAhubh^X facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.rr}r(h-X facilities to replace the buildmaster's running code with a new version. Even if this worked, it would only be used by buildbot developers.h.jubeubahAj ubeubj )r}r(h-X:guilabel:`poke IRC` This locates a :class:`words.IRC` status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect. h.j?h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j )r}r(h-X:guilabel:`poke IRC`rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(UrawtextjhE]hF]hG]hH]rXguilabelrahI]uh.jhN]rh^Xpoke IRCrr}r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X This locates a :class:`words.IRC` status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThis locates a rr}r(h-XThis locates a h.jubjx)r}r(h-X:class:`words.IRC`rh.jh7h:hAj|hC}r(UreftypeXclassj~jX words.IRCU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X words.IRCrr}r(h-Uh.jubahAhubaubh^X status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.rr}r(h-X status target and causes it to emit a message on all the channels to which it is currently connected. This was used to debug a problem in which the buildmaster lost the connection to the IRC server and did not attempt to reconnect.h.jubeubahAj ubeubj )r}r(h-X:guilabel:`Commit` This allows you to inject a :class:`Change`, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string. h.j?h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j )r}r(h-X:guilabel:`Commit`rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(UrawtextjhE]hF]hG]hH]rXguilabelrahI]uh.jhN]rh^XCommitrr}r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XThis allows you to inject a :class:`Change`, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThis allows you to inject a rr}r(h-XThis allows you to inject a h.jubjx)r}r(h-X:class:`Change`rh.jh7h:hAj|hC}r(UreftypeXclassj~jXChangeU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^XChangerr}r(h-Uh.jubahAhubaubh^XY, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.rr}r(h-XY, just as if a real one had been delivered by whatever VC hook you are using. You can set the name of the committed file and the name of the user who is doing the commit. Optionally, you can also set a revision for the change. If the revision you provide looks like a number, it will be sent as an integer, otherwise it will be sent as a string.h.jubeubahAj ubeubj )r}r(h-X:guilabel:`Force Build` This lets you force a :class:`Builder` (selected by name) to start a build of the current source tree. h.j?h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(j )r}r(h-X:guilabel:`Force Build`rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(UrawtextjhE]hF]hG]hH]r Xguilabelr ahI]uh.jhN]r h^X Force Buildr r }r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XfThis lets you force a :class:`Builder` (selected by name) to start a build of the current source tree.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThis lets you force a rr}r(h-XThis lets you force a h.jubjx)r}r(h-X:class:`Builder`rh.jh7h:hAj|hC}r(UreftypeXclassj~jXBuilderU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rh)r }r!(h-jhC}r"(hG]hH]r#(jjXpy-classr$ehF]hE]hI]uh.jhN]r%h^XBuilderr&r'}r((h-Uh.j ubahAhubaubh^X@ (selected by name) to start a build of the current source tree.r)r*}r+(h-X@ (selected by name) to start a build of the current source tree.h.jubeubahAj ubeubj )r,}r-(h-X:guilabel:`Currently` (obsolete). This was used to manually set the status of the given :class:`Builder`, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful. h.j?h7h:hAj hC}r.(hG]hH]hF]hE]hI]uhLMhMhhN]r/(j )r0}r1(h-X:guilabel:`Currently`r2h.j,h7h:hAj hC}r3(hG]hH]hF]hE]hI]uhLMhN]r4j)r5}r6(h-UhC}r7(Urawtextj2hE]hF]hG]hH]r8Xguilabelr9ahI]uh.j0hN]r:h^X Currentlyr;r<}r=(h-Uh.j5ubahAjubaubj )r>}r?(h-UhC}r@(hG]hH]hF]hE]hI]uh.j,hN]rAhb)rB}rC(h-X(obsolete). This was used to manually set the status of the given :class:`Builder`, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.h.j>h7h:hAhehC}rD(hG]hH]hF]hE]hI]uhLMhN]rE(h^XB(obsolete). This was used to manually set the status of the given rFrG}rH(h-XB(obsolete). This was used to manually set the status of the given h.jBubjx)rI}rJ(h-X:class:`Builder`rKh.jBh7h:hAj|hC}rL(UreftypeXclassj~jXBuilderU refdomainXpyrMhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rNh)rO}rP(h-jKhC}rQ(hG]hH]rR(jjMXpy-classrSehF]hE]hI]uh.jIhN]rTh^XBuilderrUrV}rW(h-Uh.jOubahAhubaubh^Xo, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.rXrY}rZ(h-Xo, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.h.jBubeubahAj ubeubeubj)r[}r\(h-Uh.jah7h:hAjhC}r](hE]hF]hG]hH]hI]Uentries]r^((UsingleXCommand Line Subcommands; userX cmdline-userr_j_tr`(UsingleXuser Command Line Subcommandj_j_traeuhLMhMhhN]ubh>)rb}rc(h-Uh.jah7h:hAhBhC}rd(hE]hF]hG]hH]hI]hJj_uhLMhMhhN]ubeubh/)re}rf(h-Uh.jh7h:h<}hAhOhC}rg(hG]hH]hF]hE]rh(Uuserrij_ehI]rjhauhLMhMhhT}rkj_jbshN]rl(hW)rm}rn(h-Xuserroh.jeh7h:hAh[hC}rp(hG]hH]hF]hE]hI]uhLMhMhhN]rqh^Xuserrrrs}rt(h-joh.jmubaubhb)ru}rv(h-XNote that in order to use this command, you need to configure a `CommandlineUserManager` instance in your `master.cfg` file, which is explained in :ref:`Users-Options`.h.jeh7h:hAhehC}rw(hG]hH]hF]hE]hI]uhLMhMhhN]rx(h^X@Note that in order to use this command, you need to configure a ryrz}r{(h-X@Note that in order to use this command, you need to configure a h.juubcdocutils.nodes title_reference r|)r}}r~(h-X`CommandlineUserManager`hC}r(hG]hH]hF]hE]hI]uh.juhN]rh^XCommandlineUserManagerrr}r(h-Uh.j}ubahAUtitle_referencerubh^X instance in your rr}r(h-X instance in your h.juubj|)r}r(h-X `master.cfg`hC}r(hG]hH]hF]hE]hI]uh.juhN]rh^X master.cfgrr}r(h-Uh.jubahAjubh^X file, which is explained in rr}r(h-X file, which is explained in h.juubjx)r}r(h-X:ref:`Users-Options`rh.juh7h:hAj|hC}r(UreftypeXrefj~jX users-optionsU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^X Users-Optionsrr}r(h-Uh.jubahAjubaubh^X.r}r(h-X.h.juubeubhb)r}r(h-XThis command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see :ref:`Concepts-Users`.h.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XThis command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see rr}r(h-XThis command allows you to manage users in buildbot's database. No extra requirements are needed to use this command, aside from the Buildmaster running. For details on how Buildbot manages users, see h.jubjx)r}r(h-X:ref:`Concepts-Users`rh.jh7h:hAj|hC}r(UreftypeXrefj~jXconcepts-usersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^XConcepts-Usersrr}r(h-Uh.jubahAjubaubh^X.r}r(h-X.h.jubeubh)r}r(h-Uh.jeh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X--masterrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XThe :command:`user` command can be run virtually anywhere provided a location of the running buildmaster. The :option:`master` argument is of the form ``{MASTERHOST}:{PORT}``. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XThe :command:`user` command can be run virtually anywhere provided a location of the running buildmaster. The :option:`master` argument is of the form ``{MASTERHOST}:{PORT}``.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThe rr}r(h-XThe h.jubhk)r}r(h-X:command:`user`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xuserrr}r(h-Uh.jubahAhuubh^X[ command can be run virtually anywhere provided a location of the running buildmaster. The rr}r(h-X[ command can be run virtually anywhere provided a location of the running buildmaster. The h.jubjx)r}r(h-X:option:`master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXmasterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xmasterrr}r(h-Uh.jubahAjubaubh^X argument is of the form rr}r(h-X argument is of the form h.jubh)r}r(h-X``{MASTERHOST}:{PORT}``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X{MASTERHOST}:{PORT}rr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r (h-UhC}r (hG]hH]hF]hE]hI]uh.jhN]r h)r }r (h-X --usernamerhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.j hN]rh^X --usernamerr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XZPB connection authentication that should match the arguments to `CommandlineUserManager`. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XYPB connection authentication that should match the arguments to `CommandlineUserManager`.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^X@PB connection authentication that should match the arguments to r r!}r"(h-X@PB connection authentication that should match the arguments to h.jubj|)r#}r$(h-X`CommandlineUserManager`hC}r%(hG]hH]hF]hE]hI]uh.jhN]r&h^XCommandlineUserManagerr'r(}r)(h-Uh.j#ubahAjubh^X.r*}r+(h-X.h.jubeubahAhubeubh)r,}r-(h-Uh.jh7h:hAhhC}r.(hG]hH]hF]hE]hI]uhLNhMhhN]r/(h)r0}r1(h-UhC}r2(hG]hH]hF]hE]hI]uh.j,hN]r3h)r4}r5(h-X--passwdr6hC}r7(hG]hH]hF]hE]hI]uh.j0hN]r8h)r9}r:(h-j6hC}r;(hG]hH]hF]hE]hI]uh.j4hN]r<h^X--passwdr=r>}r?(h-Uh.j9ubahAhubahAhubahAhubh)r@}rA(h-XZPB connection authentication that should match the arguments to `CommandlineUserManager`. hC}rB(hG]hH]hF]hE]hI]uh.j,hN]rChb)rD}rE(h-XYPB connection authentication that should match the arguments to `CommandlineUserManager`.h.j@h7h:hAhehC}rF(hG]hH]hF]hE]hI]uhLMhN]rG(h^X@PB connection authentication that should match the arguments to rHrI}rJ(h-X@PB connection authentication that should match the arguments to h.jDubj|)rK}rL(h-X`CommandlineUserManager`hC}rM(hG]hH]hF]hE]hI]uh.jDhN]rNh^XCommandlineUserManagerrOrP}rQ(h-Uh.jKubahAjubh^X.rR}rS(h-X.h.jDubeubahAhubeubh)rT}rU(h-Uh.jh7h:hAhhC}rV(hG]hH]hF]hE]hI]uhLNhMhhN]rW(h)rX}rY(h-UhC}rZ(hG]hH]hF]hE]hI]uh.jThN]r[h)r\}r](h-X--opr^hC}r_(hG]hH]hF]hE]hI]uh.jXhN]r`h)ra}rb(h-j^hC}rc(hG]hH]hF]hE]hI]uh.j\hN]rdh^X--oprerf}rg(h-Uh.jaubahAhubahAhubahAhubh)rh}ri(h-XThere are four supported values for the :option:`op` argument: :option:`add`, :option:`update`, :option:`remove`, and :option:`get`. Each are described in full in the following sections. hC}rj(hG]hH]hF]hE]hI]uh.jThN]rkhb)rl}rm(h-XThere are four supported values for the :option:`op` argument: :option:`add`, :option:`update`, :option:`remove`, and :option:`get`. Each are described in full in the following sections.h.jhh7h:hAhehC}rn(hG]hH]hF]hE]hI]uhLMhN]ro(h^X(There are four supported values for the rprq}rr(h-X(There are four supported values for the h.jlubjx)rs}rt(h-X :option:`op`ruh.jlh7h:hAj|hC}rv(UreftypeXoptionj~jXopU refdomainXstdrwj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rxj )ry}rz(h-juhC}r{(hG]hH]r|(jjwX std-optionr}ehF]hE]hI]uh.jshN]r~h^Xoprr}r(h-Uh.jyubahAjubaubh^X argument: rr}r(h-X argument: h.jlubjx)r}r(h-X :option:`add`rh.jlh7h:hAj|hC}r(UreftypeXoptionj~jXaddU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xaddrr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jlubjx)r}r(h-X:option:`update`rh.jlh7h:hAj|hC}r(UreftypeXoptionj~jXupdateU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xupdaterr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jlubjx)r}r(h-X:option:`remove`rh.jlh7h:hAj|hC}r(UreftypeXoptionj~jXremoveU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xremoverr}r(h-Uh.jubahAjubaubh^X, and rr}r(h-X, and h.jlubjx)r}r(h-X :option:`get`rh.jlh7h:hAj|hC}r(UreftypeXoptionj~jXgetU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xgetrr}r(h-Uh.jubahAjubaubh^X7. Each are described in full in the following sections.rr}r(h-X7. Each are described in full in the following sections.h.jlubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X --bb_usernamerhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --bb_usernamerr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XUsed with the :option:`update` option, this sets the user's username for web authentication in the database. It requires :option:`bb_password` to be set along with it. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XUsed with the :option:`update` option, this sets the user's username for web authentication in the database. It requires :option:`bb_password` to be set along with it.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XUsed with the rr}r(h-XUsed with the h.jubjx)r}r(h-X:option:`update`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXupdateU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xupdaterr}r(h-Uh.jubahAjubaubh^X[ option, this sets the user's username for web authentication in the database. It requires rr}r(h-X[ option, this sets the user's username for web authentication in the database. It requires h.jubjx)r}r(h-X:option:`bb_password`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX bb_passwordU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]r h^X bb_passwordr r }r (h-Uh.jubahAjubaubh^X to be set along with it.r r}r(h-X to be set along with it.h.jubeubahAhubeubh)r}r(h-Uh.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X --bb_passwordrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]r h^X --bb_passwordr!r"}r#(h-Uh.jubahAhubahAhubahAhubh)r$}r%(h-XAlso used with the :option:`update` option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons. hC}r&(hG]hH]hF]hE]hI]uh.jhN]r'hb)r(}r)(h-XAlso used with the :option:`update` option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.h.j$h7h:hAhehC}r*(hG]hH]hF]hE]hI]uhLMhN]r+(h^XAlso used with the r,r-}r.(h-XAlso used with the h.j(ubjx)r/}r0(h-X:option:`update`r1h.j(h7h:hAj|hC}r2(UreftypeXoptionj~jXupdateU refdomainXstdr3j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r4j )r5}r6(h-j1hC}r7(hG]hH]r8(jj3X std-optionr9ehF]hE]hI]uh.j/hN]r:h^Xupdater;r<}r=(h-Uh.j5ubahAjubaubh^X option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.r>r?}r@(h-X option, this sets the password portion of a user's web authentication credentials into the database. The password is first encrypted prior to storage for security reasons.h.j(ubeubahAhubeubh)rA}rB(h-Uh.jh7h:hAhhC}rC(hG]hH]hF]hE]hI]uhLNhMhhN]rD(h)rE}rF(h-UhC}rG(hG]hH]hF]hE]hI]uh.jAhN]rHh)rI}rJ(h-X--idsrKhC}rL(hG]hH]hF]hE]hI]uh.jEhN]rMh)rN}rO(h-jKhC}rP(hG]hH]hF]hE]hI]uh.jIhN]rQh^X--idsrRrS}rT(h-Uh.jNubahAhubahAhubahAhubh)rU}rV(h-XTWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The :option:`ids` option lets you specify a comma separated list of these identifiers for use with the :command:`user` command. The :option:`ids` option is used only when using :option:`remove` or :option:`show`. hC}rW(hG]hH]hF]hE]hI]uh.jAhN]rX(hb)rY}rZ(h-XWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The :option:`ids` option lets you specify a comma separated list of these identifiers for use with the :command:`user` command.h.jUh7h:hAhehC}r[(hG]hH]hF]hE]hI]uhLMhN]r\(h^XWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The r]r^}r_(h-XWhen working with users, you need to be able to refer to them by unique identifiers to find particular users in the database. The h.jYubjx)r`}ra(h-X :option:`ids`rbh.jYh7h:hAj|hC}rc(UreftypeXoptionj~jXidsU refdomainXstdrdj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rej )rf}rg(h-jbhC}rh(hG]hH]ri(jjdX std-optionrjehF]hE]hI]uh.j`hN]rkh^Xidsrlrm}rn(h-Uh.jfubahAjubaubh^XV option lets you specify a comma separated list of these identifiers for use with the rorp}rq(h-XV option lets you specify a comma separated list of these identifiers for use with the h.jYubhk)rr}rs(h-X:command:`user`hC}rt(hG]hH]ruhpahF]hE]hI]uh.jYhN]rvh^Xuserrwrx}ry(h-Uh.jrubahAhuubh^X command.rzr{}r|(h-X command.h.jYubeubhb)r}}r~(h-XTThe :option:`ids` option is used only when using :option:`remove` or :option:`show`.h.jUh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThe rr}r(h-XThe h.j}ubjx)r}r(h-X :option:`ids`rh.j}h7h:hAj|hC}r(UreftypeXoptionj~jXidsU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xidsrr}r(h-Uh.jubahAjubaubh^X option is used only when using rr}r(h-X option is used only when using h.j}ubjx)r}r(h-X:option:`remove`rh.j}h7h:hAj|hC}r(UreftypeXoptionj~jXremoveU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xremoverr}r(h-Uh.jubahAjubaubh^X or rr}r(h-X or h.j}ubjx)r}r(h-X:option:`show`rh.j}h7h:hAj|hC}r(UreftypeXoptionj~jXshowU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xshowrr}r(h-Uh.jubahAjubaubh^X.r}r(h-X.h.j}ubeubehAhubeubh)r}r(h-Uh.jh7NhAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-X--inforhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--inforr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see :ref:`Concepts-Users`). These attributes are specified in the form ``{TYPE}={VALUE}`` when using the :option:`info` option. These ``{TYPE}={VALUE}`` pairs are specified in a comma separated list, so for example: .. code-block:: none --info=svn=jschmo,git='Joe Schmo ' The :option:`info` option can be specified multiple times in the :command:`user` command, as each specified option will be interpreted as a new user. Note that :option:`info` is only used with :option:`add` or with :option:`update`, and whenever you use :option:`update` you need to specify the identifier of the user you want to update. This is done by prepending the :option:`info` arguments with ``{ID:}``. If we were to update ``'jschmo'`` from the previous example, it would look like this: .. code-block:: none --info=jschmo:git='Joseph Schmo ' hC}r(hG]hH]hF]hE]hI]uh.jhN]r(hb)r}r(h-X:Users are known in buildbot as a collection of attributes tied together by some unique identifier (see :ref:`Concepts-Users`). These attributes are specified in the form ``{TYPE}={VALUE}`` when using the :option:`info` option. These ``{TYPE}={VALUE}`` pairs are specified in a comma separated list, so for example:h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see rr}r(h-XgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see h.jubjx)r}r(h-X:ref:`Concepts-Users`rh.jh7h:hAj|hC}r(UreftypeXrefj~jXconcepts-usersU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj)r}r(h-jhC}r(hG]hH]r(jjXstd-refrehF]hE]hI]uh.jhN]rh^XConcepts-Usersrr}r(h-Uh.jubahAjubaubh^X.). These attributes are specified in the form rr}r(h-X.). These attributes are specified in the form h.jubh)r}r(h-X``{TYPE}={VALUE}``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X{TYPE}={VALUE}rr}r(h-Uh.jubahAhubh^X when using the rr}r(h-X when using the h.jubjx)r}r(h-X:option:`info`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXinfoU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xinforr}r(h-Uh.jubahAjubaubh^X option. These rr}r(h-X option. These h.jubh)r}r(h-X``{TYPE}={VALUE}``hC}r(hG]hH]hF]hE]hI]uh.jhN]r h^X{TYPE}={VALUE}r r }r (h-Uh.jubahAhubh^X? pairs are specified in a comma separated list, so for example:r r}r(h-X? pairs are specified in a comma separated list, so for example:h.jubeubh)r}r(h-X1--info=svn=jschmo,git='Joe Schmo 'h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhN]rh^X1--info=svn=jschmo,git='Joe Schmo 'rr}r(h-Uh.jubaubhb)r}r(h-XThe :option:`info` option can be specified multiple times in the :command:`user` command, as each specified option will be interpreted as a new user. Note that :option:`info` is only used with :option:`add` or with :option:`update`, and whenever you use :option:`update` you need to specify the identifier of the user you want to update. This is done by prepending the :option:`info` arguments with ``{ID:}``. If we were to update ``'jschmo'`` from the previous example, it would look like this:h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThe rr}r(h-XThe h.jubjx)r}r(h-X:option:`info`r h.jh7h:hAj|hC}r!(UreftypeXoptionj~jXinfoU refdomainXstdr"j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r#j )r$}r%(h-j hC}r&(hG]hH]r'(jj"X std-optionr(ehF]hE]hI]uh.jhN]r)h^Xinfor*r+}r,(h-Uh.j$ubahAjubaubh^X/ option can be specified multiple times in the r-r.}r/(h-X/ option can be specified multiple times in the h.jubhk)r0}r1(h-X:command:`user`hC}r2(hG]hH]r3hpahF]hE]hI]uh.jhN]r4h^Xuserr5r6}r7(h-Uh.j0ubahAhuubh^XP command, as each specified option will be interpreted as a new user. Note that r8r9}r:(h-XP command, as each specified option will be interpreted as a new user. Note that h.jubjx)r;}r<(h-X:option:`info`r=h.jh7h:hAj|hC}r>(UreftypeXoptionj~jXinfoU refdomainXstdr?j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r@j )rA}rB(h-j=hC}rC(hG]hH]rD(jj?X std-optionrEehF]hE]hI]uh.j;hN]rFh^XinforGrH}rI(h-Uh.jAubahAjubaubh^X is only used with rJrK}rL(h-X is only used with h.jubjx)rM}rN(h-X :option:`add`rOh.jh7h:hAj|hC}rP(UreftypeXoptionj~jXaddU refdomainXstdrQj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rRj )rS}rT(h-jOhC}rU(hG]hH]rV(jjQX std-optionrWehF]hE]hI]uh.jMhN]rXh^XaddrYrZ}r[(h-Uh.jSubahAjubaubh^X or with r\r]}r^(h-X or with h.jubjx)r_}r`(h-X:option:`update`rah.jh7h:hAj|hC}rb(UreftypeXoptionj~jXupdateU refdomainXstdrcj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rdj )re}rf(h-jahC}rg(hG]hH]rh(jjcX std-optionriehF]hE]hI]uh.j_hN]rjh^Xupdaterkrl}rm(h-Uh.jeubahAjubaubh^X, and whenever you use rnro}rp(h-X, and whenever you use h.jubjx)rq}rr(h-X:option:`update`rsh.jh7h:hAj|hC}rt(UreftypeXoptionj~jXupdateU refdomainXstdruj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rvj )rw}rx(h-jshC}ry(hG]hH]rz(jjuX std-optionr{ehF]hE]hI]uh.jqhN]r|h^Xupdater}r~}r(h-Uh.jwubahAjubaubh^Xc you need to specify the identifier of the user you want to update. This is done by prepending the rr}r(h-Xc you need to specify the identifier of the user you want to update. This is done by prepending the h.jubjx)r}r(h-X:option:`info`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXinfoU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xinforr}r(h-Uh.jubahAjubaubh^X arguments with rr}r(h-X arguments with h.jubh)r}r(h-X ``{ID:}``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X{ID:}rr}r(h-Uh.jubahAhubh^X. If we were to update rr}r(h-X. If we were to update h.jubh)r}r(h-X ``'jschmo'``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X'jschmo'rr}r(h-Uh.jubahAhubh^X4 from the previous example, it would look like this:rr}r(h-X4 from the previous example, it would look like this:h.jubeubh)r}r(h-X0--info=jschmo:git='Joseph Schmo 'h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhN]rh^X0--info=jschmo:git='Joseph Schmo 'rr}r(h-Uh.jubaubehAhubeubeubhb)r}r(h-XNote that :option:`--master`, :option:`--username`, :option:`--passwd`, and :option:`--op` are always required to issue the :command:`user` command.h.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^X Note that rr}r(h-X Note that h.jubjx)r}r(h-X:option:`--master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jubjx)r}r(h-X:option:`--username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --usernameU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --usernamerr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jubjx)r}r(h-X:option:`--passwd`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--passwdU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--passwdrr}r(h-Uh.jubahAjubaubh^X, and rr}r(h-X, and h.jubjx)r}r(h-X:option:`--op`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--opU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--oprr}r(h-Uh.jubahAjubaubh^X" are always required to issue the rr}r(h-X" are always required to issue the h.jubhk)r}r(h-X:command:`user`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xuserrr}r(h-Uh.jubahAhuubh^X command.rr}r (h-X command.h.jubeubhb)r }r (h-XEThe :option:`--master`, :option:`--username`, and :option:`--passwd` options can be specified in the option file with keywords :option:`user_master`, :option:`user_username`, and :option:`user_passwd`, respectively. If :option:`user_master` is not specified, then :option:`master` from the options file will be used instead.h.jeh7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (h^XThe rr}r(h-XThe h.j ubjx)r}r(h-X:option:`--master`rh.j h7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X, r r!}r"(h-X, h.j ubjx)r#}r$(h-X:option:`--username`r%h.j h7h:hAj|hC}r&(UreftypeXoptionj~jX --usernameU refdomainXstdr'j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r(j )r)}r*(h-j%hC}r+(hG]hH]r,(jj'X std-optionr-ehF]hE]hI]uh.j#hN]r.h^X --usernamer/r0}r1(h-Uh.j)ubahAjubaubh^X, and r2r3}r4(h-X, and h.j ubjx)r5}r6(h-X:option:`--passwd`r7h.j h7h:hAj|hC}r8(UreftypeXoptionj~jX--passwdU refdomainXstdr9j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r:j )r;}r<(h-j7hC}r=(hG]hH]r>(jj9X std-optionr?ehF]hE]hI]uh.j5hN]r@h^X--passwdrArB}rC(h-Uh.j;ubahAjubaubh^X; options can be specified in the option file with keywords rDrE}rF(h-X; options can be specified in the option file with keywords h.j ubjx)rG}rH(h-X:option:`user_master`rIh.j h7h:hAj|hC}rJ(UreftypeXoptionj~jX user_masterU refdomainXstdrKj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rLj )rM}rN(h-jIhC}rO(hG]hH]rP(jjKX std-optionrQehF]hE]hI]uh.jGhN]rRh^X user_masterrSrT}rU(h-Uh.jMubahAjubaubh^X, rVrW}rX(h-X, h.j ubjx)rY}rZ(h-X:option:`user_username`r[h.j h7h:hAj|hC}r\(UreftypeXoptionj~jX user_usernameU refdomainXstdr]j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r^j )r_}r`(h-j[hC}ra(hG]hH]rb(jj]X std-optionrcehF]hE]hI]uh.jYhN]rdh^X user_usernamererf}rg(h-Uh.j_ubahAjubaubh^X, and rhri}rj(h-X, and h.j ubjx)rk}rl(h-X:option:`user_passwd`rmh.j h7h:hAj|hC}rn(UreftypeXoptionj~jX user_passwdU refdomainXstdroj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rpj )rq}rr(h-jmhC}rs(hG]hH]rt(jjoX std-optionruehF]hE]hI]uh.jkhN]rvh^X user_passwdrwrx}ry(h-Uh.jqubahAjubaubh^X, respectively. If rzr{}r|(h-X, respectively. If h.j ubjx)r}}r~(h-X:option:`user_master`rh.j h7h:hAj|hC}r(UreftypeXoptionj~jX user_masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.j}hN]rh^X user_masterrr}r(h-Uh.jubahAjubaubh^X is not specified, then rr}r(h-X is not specified, then h.j ubjx)r}r(h-X:option:`master`rh.j h7h:hAj|hC}r(UreftypeXoptionj~jXmasterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xmasterrr}r(h-Uh.jubahAjubaubh^X, from the options file will be used instead.rr}r(h-X, from the options file will be used instead.h.j ubeubhb)r}r(h-XBelow are examples of how each command should look. Whenever a :command:`user` command is successful, results will be shown to whoever issued the command.h.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^X?Below are examples of how each command should look. Whenever a rr}r(h-X?Below are examples of how each command should look. Whenever a h.jubhk)r}r(h-X:command:`user`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xuserrr}r(h-Uh.jubahAhuubh^XL command is successful, results will be shown to whoever issued the command.rr}r(h-XL command is successful, results will be shown to whoever issued the command.h.jubeubhb)r}r(h-XFor :option:`add`:rh.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XFor rr}r(h-XFor h.jubjx)r}r(h-X :option:`add`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXaddU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xaddrr}r(h-Uh.jubahAjubaubh^X:r}r(h-X:h.jubeubh)r}r(h-X~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...h.jeh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rh^X~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...rr}r(h-Uh.jubaubhb)r}r(h-XFor :option:`update`:rh.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XFor rr}r(h-XFor h.jubjx)r}r(h-X:option:`update`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXupdateU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xupdaterr}r(h-Uh.jubahAjubaubh^X:r}r(h-X:h.jubeubh)r}r(h-Xbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...h.jeh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rh^Xbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...rr}r(h-Uh.jubaubhb)r}r(h-XFor :option:`remove`:rh.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XFor rr}r(h-XFor h.jubjx)r}r(h-X:option:`remove`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXremoveU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^Xremoverr}r (h-Uh.jubahAjubaubh^X:r }r (h-X:h.jubeubh)r }r (h-X}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h.jeh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rh^X}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...rr}r(h-Uh.j ubaubhb)r}r(h-XFor :option:`get`:rh.jeh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XFor rr}r(h-XFor h.jubjx)r}r(h-X :option:`get`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXgetU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r j )r!}r"(h-jhC}r#(hG]hH]r$(jjX std-optionr%ehF]hE]hI]uh.jhN]r&h^Xgetr'r(}r)(h-Uh.j!ubahAjubaubh^X:r*}r+(h-X:h.jubeubh)r,}r-(h-Xzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h.jeh7h:hAhhC}r.(hhXnonehhhE]hF]hG]hH]hI]uhLM hMhhN]r/h^Xzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...r0r1}r2(h-Uh.j,ubaubhb)r3}r4(h-XA note on :option:`update`: when updating the :option:`bb_username` and :option:`bb_password`, the :option:`info` doesn't need to have additional ``{TYPE}={VALUE}`` pairs to update and can just take the ``{ID}`` portion.h.jeh7h:hAhehC}r5(hG]hH]hF]hE]hI]uhLMhMhhN]r6(h^X A note on r7r8}r9(h-X A note on h.j3ubjx)r:}r;(h-X:option:`update`r<h.j3h7h:hAj|hC}r=(UreftypeXoptionj~jXupdateU refdomainXstdr>j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r?j )r@}rA(h-j<hC}rB(hG]hH]rC(jj>X std-optionrDehF]hE]hI]uh.j:hN]rEh^XupdaterFrG}rH(h-Uh.j@ubahAjubaubh^X: when updating the rIrJ}rK(h-X: when updating the h.j3ubjx)rL}rM(h-X:option:`bb_username`rNh.j3h7h:hAj|hC}rO(UreftypeXoptionj~jX bb_usernameU refdomainXstdrPj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rQj )rR}rS(h-jNhC}rT(hG]hH]rU(jjPX std-optionrVehF]hE]hI]uh.jLhN]rWh^X bb_usernamerXrY}rZ(h-Uh.jRubahAjubaubh^X and r[r\}r](h-X and h.j3ubjx)r^}r_(h-X:option:`bb_password`r`h.j3h7h:hAj|hC}ra(UreftypeXoptionj~jX bb_passwordU refdomainXstdrbj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rcj )rd}re(h-j`hC}rf(hG]hH]rg(jjbX std-optionrhehF]hE]hI]uh.j^hN]rih^X bb_passwordrjrk}rl(h-Uh.jdubahAjubaubh^X, the rmrn}ro(h-X, the h.j3ubjx)rp}rq(h-X:option:`info`rrh.j3h7h:hAj|hC}rs(UreftypeXoptionj~jXinfoU refdomainXstdrtj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]ruj )rv}rw(h-jrhC}rx(hG]hH]ry(jjtX std-optionrzehF]hE]hI]uh.jphN]r{h^Xinfor|r}}r~(h-Uh.jvubahAjubaubh^X! doesn't need to have additional rr}r(h-X! doesn't need to have additional h.j3ubh)r}r(h-X``{TYPE}={VALUE}``hC}r(hG]hH]hF]hE]hI]uh.j3hN]rh^X{TYPE}={VALUE}rr}r(h-Uh.jubahAhubh^X' pairs to update and can just take the rr}r(h-X' pairs to update and can just take the h.j3ubh)r}r(h-X``{ID}``hC}r(hG]hH]hF]hE]hI]uh.j3hN]rh^X{ID}rr}r(h-Uh.jubahAhubh^X portion.rr}r(h-X portion.h.j3ubeubh>)r}r(h-X.. _buildbot-config-directory:h.jeh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJUbuildbot-config-directoryruhLMhMhhN]ubeubeubh/)r}r(h-Uh.jh7h:h<}rhjshAhOhC}r(hG]hH]hF]hE]r(jUid3rehI]r(h$heuhLMhMhhT}rjjshN]r(hW)r}r(h-X.buildbot config directoryrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^X.buildbot config directoryrr}r(h-jh.jubaubhb)r}r(h-XMany of the :command:`buildbot` tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an ``options`` file. The :command:`buildbot` command will look for a special directory named :file:`.buildbot`, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named :file:`options` in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple ``name = 'value'`` pairs in this file to set the options.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^X Many of the rr}r(h-X Many of the h.jubhk)r}r(h-X:command:`buildbot`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xbuildbotrr}r(h-Uh.jubahAhuubh^X tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an rr}r(h-X tools must be told how to contact the buildmaster that they interact with. This specification can be provided as a command-line argument, but most of the time it will be easier to set them in an h.jubh)r}r(h-X ``options``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xoptionsrr}r(h-Uh.jubahAhubh^X file. The rr}r(h-X file. The h.jubhk)r}r(h-X:command:`buildbot`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xbuildbotrr}r(h-Uh.jubahAhuubh^X1 command will look for a special directory named rr}r(h-X1 command will look for a special directory named h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X .buildbotrr}r(h-X .buildboth.jubahAhubh^X, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named rr}r(h-X, starting from the current directory (where the command was run) and crawling upwards, eventually looking in the user's home directory. It will look for a file named h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^Xoptionsrr}r(h-Xoptionsh.jubahAhubh^Xz in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple rr}r(h-Xz in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple h.jubh)r}r(h-X``name = 'value'``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xname = 'value'rr}r(h-Uh.jubahAhubh^X' pairs in this file to set the options.rr}r(h-X' pairs in this file to set the options.h.jubeubhb)r}r(h-XFor a description of the names used in this file, please see the documentation for the individual :command:`buildbot` sub-commands. The following is a brief sample of what this file's contents could be.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM&hMhhN]r(h^XbFor a description of the names used in this file, please see the documentation for the individual rr}r(h-XbFor a description of the names used in this file, please see the documentation for the individual h.jubhk)r}r(h-X:command:`buildbot`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xbuildbotrr}r(h-Uh.jubahAhuubh^XU sub-commands. The following is a brief sample of what this file's contents could be.rr}r(h-XU sub-commands. The following is a brief sample of what this file's contents could be.h.jubeubh)r}r(h-X# for status-reading tools masterstatus = 'buildbot.example.org:12345' # for 'sendchange' or the debug port master = 'buildbot.example.org:18990' debugPassword = 'eiv7Po'h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLM*hMhhN]r h^X# for status-reading tools masterstatus = 'buildbot.example.org:12345' # for 'sendchange' or the debug port master = 'buildbot.example.org:18990' debugPassword = 'eiv7Po'r r }r (h-Uh.jubaubhb)r }r(h-XlNote carefully that the names in the :file:`options` file usually do not match the command-line option name.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM2hMhhN]r(h^X%Note carefully that the names in the rr}r(h-X%Note carefully that the names in the h.j ubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.j hN]rh^Xoptionsrr}r(h-Xoptionsh.jubahAhubh^X8 file usually do not match the command-line option name.rr}r(h-X8 file usually do not match the command-line option name.h.j ubeubj{ )r }r!(h-Uh.jh7h:hAj~ hC}r"(hG]hH]hF]hE]hI]uhLNhMhhN]r#(j )r$}r%(h-X``masterstatus`` Equivalent to :option:`--master` for :bb:cmdline:`statuslog` and :bb:cmdline:`statusgui`, this gives the location of the :class:`client.PBListener` status port. h.j h7h:hAj hC}r&(hG]hH]hF]hE]hI]uhLM7hN]r'(j )r(}r)(h-X``masterstatus``r*h.j$h7h:hAj hC}r+(hG]hH]hF]hE]hI]uhLM7hN]r,h)r-}r.(h-j*hC}r/(hG]hH]hF]hE]hI]uh.j(hN]r0h^X masterstatusr1r2}r3(h-Uh.j-ubahAhubaubj )r4}r5(h-UhC}r6(hG]hH]hF]hE]hI]uh.j$hN]r7hb)r8}r9(h-XEquivalent to :option:`--master` for :bb:cmdline:`statuslog` and :bb:cmdline:`statusgui`, this gives the location of the :class:`client.PBListener` status port.h.j4h7h:hAhehC}r:(hG]hH]hF]hE]hI]uhLM6hN]r;(h^XEquivalent to r<r=}r>(h-XEquivalent to h.j8ubjx)r?}r@(h-X:option:`--master`rAh.j8h7h:hAj|hC}rB(UreftypeXoptionj~jX--masterU refdomainXstdrCj NhE]hF]U refexplicithG]hH]hI]jjuhLM6hN]rDj )rE}rF(h-jAhC}rG(hG]hH]rH(jjCX std-optionrIehF]hE]hI]uh.j?hN]rJh^X--masterrKrL}rM(h-Uh.jEubahAjubaubh^X for rNrO}rP(h-X for h.j8ubjx)rQ}rR(h-X:bb:cmdline:`statuslog`rSh.j8h7h:hAj|hC}rT(UreftypeXcmdlinej~jX statuslogU refdomainXbbrUhE]hF]U refexplicithG]hH]hI]jjuhLM6hN]rVh)rW}rX(h-jShC}rY(hG]hH]rZ(jjUX bb-cmdliner[ehF]hE]hI]uh.jQhN]r\h^X statuslogr]r^}r_(h-Uh.jWubahAhubaubh^X and r`ra}rb(h-X and h.j8ubjx)rc}rd(h-X:bb:cmdline:`statusgui`reh.j8h7h:hAj|hC}rf(UreftypeXcmdlinej~jX statusguiU refdomainXbbrghE]hF]U refexplicithG]hH]hI]jjuhLM6hN]rhh)ri}rj(h-jehC}rk(hG]hH]rl(jjgX bb-cmdlinermehF]hE]hI]uh.jchN]rnh^X statusguirorp}rq(h-Uh.jiubahAhubaubh^X!, this gives the location of the rrrs}rt(h-X!, this gives the location of the h.j8ubjx)ru}rv(h-X:class:`client.PBListener`rwh.j8h7h:hAj|hC}rx(UreftypeXclassj~jXclient.PBListenerU refdomainXpyryhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM6hN]rzh)r{}r|(h-jwhC}r}(hG]hH]r~(jjyXpy-classrehF]hE]hI]uh.juhN]rh^Xclient.PBListenerrr}r(h-Uh.j{ubahAhubaubh^X status port.rr}r(h-X status port.h.j8ubeubahAj ubeubj )r}r(h-X7``master`` Equivalent to :option:`--master` for :bb:cmdline:`debugclient` and :bb:cmdline:`sendchange`. This option is used for two purposes. It is the location of the ``debugPort`` for ``debugclient`` and the location of the :class:`pb.PBChangeSource` for ```sendchange``. Generally these are the same port. h.j h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLM>hMhhN]r(j )r}r(h-X ``master``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLM>hN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xmasterrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X+Equivalent to :option:`--master` for :bb:cmdline:`debugclient` and :bb:cmdline:`sendchange`. This option is used for two purposes. It is the location of the ``debugPort`` for ``debugclient`` and the location of the :class:`pb.PBChangeSource` for ```sendchange``. Generally these are the same port.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM:hN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r}r(h-X:option:`--master`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLM:hN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X for rr}r(h-X for h.jubjx)r}r(h-X:bb:cmdline:`debugclient`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX debugclientU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLM:hN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X debugclientrr}r(h-Uh.jubahAhubaubh^X and rr}r(h-X and h.jubjx)r}r(h-X:bb:cmdline:`sendchange`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX sendchangeU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLM:hN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X sendchangerr}r(h-Uh.jubahAhubaubh^XC. This option is used for two purposes. It is the location of the rr}r(h-XC. This option is used for two purposes. It is the location of the h.jubh)r}r(h-X ``debugPort``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X debugPortrr}r(h-Uh.jubahAhubh^X for rr}r(h-X for h.jubh)r}r(h-X``debugclient``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X debugclientrr}r(h-Uh.jubahAhubh^X and the location of the rr}r(h-X and the location of the h.jubjx)r}r(h-X:class:`pb.PBChangeSource`rh.jh7h:hAj|hC}r(UreftypeXclassj~jXpb.PBChangeSourceU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM:hN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^Xpb.PBChangeSourcerr}r(h-Uh.jubahAhubaubh^X for rr}r(h-X for h.jubh)r}r(h-X```sendchange``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X `sendchangerr}r(h-Uh.jubahAhubh^X%. Generally these are the same port.rr}r(h-X%. Generally these are the same port.h.jubeubahAj ubeubj )r}r (h-X``debugPassword`` Equivalent to :option:`--passwd` for :bb:cmdline:`debugclient`. .. important:: This value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command. h.j h7h:hAj hC}r (hG]hH]hF]hE]hI]uhLMFhMhhN]r (j )r }r (h-X``debugPassword``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMFhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.j hN]rh^X debugPasswordrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]r(hb)r}r(h-X?Equivalent to :option:`--passwd` for :bb:cmdline:`debugclient`.rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMAhN]r (h^XEquivalent to r!r"}r#(h-XEquivalent to h.jubjx)r$}r%(h-X:option:`--passwd`r&h.jh7h:hAj|hC}r'(UreftypeXoptionj~jX--passwdU refdomainXstdr(j NhE]hF]U refexplicithG]hH]hI]jjuhLMAhN]r)j )r*}r+(h-j&hC}r,(hG]hH]r-(jj(X std-optionr.ehF]hE]hI]uh.j$hN]r/h^X--passwdr0r1}r2(h-Uh.j*ubahAjubaubh^X for r3r4}r5(h-X for h.jubjx)r6}r7(h-X:bb:cmdline:`debugclient`r8h.jh7h:hAj|hC}r9(UreftypeXcmdlinej~jX debugclientU refdomainXbbr:hE]hF]U refexplicithG]hH]hI]jjuhLMAhN]r;h)r<}r=(h-j8hC}r>(hG]hH]r?(jj:X bb-cmdliner@ehF]hE]hI]uh.j6hN]rAh^X debugclientrBrC}rD(h-Uh.j<ubahAhubaubh^X.rE}rF(h-X.h.jubeubcdocutils.nodes important rG)rH}rI(h-XThis value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command.hC}rJ(hG]hH]hF]hE]hI]uh.jhN]rKhb)rL}rM(h-XThis value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command.h.jHh7h:hAhehC}rN(hG]hH]hF]hE]hI]uhLMEhN]rO(h^X#This value must match the value of rPrQ}rR(h-X#This value must match the value of h.jLubjx)rS}rT(h-X:bb:cfg:`debugPassword`rUh.jLh7h:hAj|hC}rV(UreftypeXcfgj~jX debugPasswordU refdomainXbbrWhE]hF]U refexplicithG]hH]hI]jjuhLMEhN]rXh)rY}rZ(h-jUhC}r[(hG]hH]r\(jjWXbb-cfgr]ehF]hE]hI]uh.jShN]r^h^X debugPasswordr_r`}ra(h-Uh.jYubahAhubaubh^X*, used to protect the debug port, for the rbrc}rd(h-X*, used to protect the debug port, for the h.jLubjx)re}rf(h-X:bb:cmdline:`debugclient`rgh.jLh7h:hAj|hC}rh(UreftypeXcmdlinej~jX debugclientU refdomainXbbrihE]hF]U refexplicithG]hH]hI]jjuhLMEhN]rjh)rk}rl(h-jghC}rm(hG]hH]rn(jjiX bb-cmdlineroehF]hE]hI]uh.jehN]rph^X debugclientrqrr}rs(h-Uh.jkubahAhubaubh^X command.rtru}rv(h-X command.h.jLubeubahAU importantrwubehAj ubeubj )rx}ry(h-XZ``username`` Equivalent to :option:`--username` for the :bb:cmdline:`sendchange` command. h.j h7h:hAj hC}rz(hG]hH]hF]hE]hI]uhLMIhMhhN]r{(j )r|}r}(h-X ``username``r~h.jxh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMIhN]rh)r}r(h-j~hC}r(hG]hH]hF]hE]hI]uh.j|hN]rh^Xusernamerr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jxhN]rhb)r}r(h-XLEquivalent to :option:`--username` for the :bb:cmdline:`sendchange` command.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMIhN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r}r(h-X:option:`--username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --usernameU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMIhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --usernamerr}r(h-Uh.jubahAjubaubh^X for the rr}r(h-X for the h.jubjx)r}r(h-X:bb:cmdline:`sendchange`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX sendchangeU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMIhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X sendchangerr}r(h-Uh.jubahAhubaubh^X command.rr}r(h-X command.h.jubeubahAj ubeubj )r}r(h-XV``branch`` Equivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command. h.j h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMLhMhhN]r(j )r}r(h-X ``branch``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMLhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xbranchrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XJEquivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMLhN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r}r(h-X:option:`--branch`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--branchU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMLhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--branchrr}r(h-Uh.jubahAjubaubh^X for the rr}r(h-X for the h.jubjx)r}r(h-X:bb:cmdline:`sendchange`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX sendchangeU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMLhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X sendchangerr}r(h-Uh.jubahAhubaubh^X command.rr}r(h-X command.h.jubeubahAj ubeubj )r}r(h-XZ``category`` Equivalent to :option:`--category` for the :bb:cmdline:`sendchange` command. h.j h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMOhMhhN]r(j )r}r(h-X ``category``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMOhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xcategoryrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]r hb)r }r (h-XLEquivalent to :option:`--category` for the :bb:cmdline:`sendchange` command.h.jh7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMOhN]r (h^XEquivalent to rr}r(h-XEquivalent to h.j ubjx)r}r(h-X:option:`--category`rh.j h7h:hAj|hC}r(UreftypeXoptionj~jX --categoryU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMOhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --categoryrr}r(h-Uh.jubahAjubaubh^X for the r r!}r"(h-X for the h.j ubjx)r#}r$(h-X:bb:cmdline:`sendchange`r%h.j h7h:hAj|hC}r&(UreftypeXcmdlinej~jX sendchangeU refdomainXbbr'hE]hF]U refexplicithG]hH]hI]jjuhLMOhN]r(h)r)}r*(h-j%hC}r+(hG]hH]r,(jj'X bb-cmdliner-ehF]hE]hI]uh.j#hN]r.h^X sendchanger/r0}r1(h-Uh.j)ubahAhubaubh^X command.r2r3}r4(h-X command.h.j ubeubahAj ubeubj )r5}r6(h-X``try_connect`` Equivalent to :option:`--connect`, this specifies how the :bb:cmdline:`try` command should deliver its request to the buildmaster. The currently accepted values are ``ssh`` and ``pb``. h.j h7h:hAj hC}r7(hG]hH]hF]hE]hI]uhLMThMhhN]r8(j )r9}r:(h-X``try_connect``r;h.j5h7h:hAj hC}r<(hG]hH]hF]hE]hI]uhLMThN]r=h)r>}r?(h-j;hC}r@(hG]hH]hF]hE]hI]uh.j9hN]rAh^X try_connectrBrC}rD(h-Uh.j>ubahAhubaubj )rE}rF(h-UhC}rG(hG]hH]hF]hE]hI]uh.j5hN]rHhb)rI}rJ(h-XEquivalent to :option:`--connect`, this specifies how the :bb:cmdline:`try` command should deliver its request to the buildmaster. The currently accepted values are ``ssh`` and ``pb``.h.jEh7h:hAhehC}rK(hG]hH]hF]hE]hI]uhLMRhN]rL(h^XEquivalent to rMrN}rO(h-XEquivalent to h.jIubjx)rP}rQ(h-X:option:`--connect`rRh.jIh7h:hAj|hC}rS(UreftypeXoptionj~jX --connectU refdomainXstdrTj NhE]hF]U refexplicithG]hH]hI]jjuhLMRhN]rUj )rV}rW(h-jRhC}rX(hG]hH]rY(jjTX std-optionrZehF]hE]hI]uh.jPhN]r[h^X --connectr\r]}r^(h-Uh.jVubahAjubaubh^X, this specifies how the r_r`}ra(h-X, this specifies how the h.jIubjx)rb}rc(h-X:bb:cmdline:`try`rdh.jIh7h:hAj|hC}re(UreftypeXcmdlinej~jXtryU refdomainXbbrfhE]hF]U refexplicithG]hH]hI]jjuhLMRhN]rgh)rh}ri(h-jdhC}rj(hG]hH]rk(jjfX bb-cmdlinerlehF]hE]hI]uh.jbhN]rmh^Xtryrnro}rp(h-Uh.jhubahAhubaubh^XZ command should deliver its request to the buildmaster. The currently accepted values are rqrr}rs(h-XZ command should deliver its request to the buildmaster. The currently accepted values are h.jIubh)rt}ru(h-X``ssh``hC}rv(hG]hH]hF]hE]hI]uh.jIhN]rwh^Xsshrxry}rz(h-Uh.jtubahAhubh^X and r{r|}r}(h-X and h.jIubh)r~}r(h-X``pb``hC}r(hG]hH]hF]hE]hI]uh.jIhN]rh^Xpbrr}r(h-Uh.j~ubahAhubh^X.r}r(h-X.h.jIubeubahAj ubeubj )r}r(h-X~``try_builders`` Equivalent to :option:`--builders`, specifies which builders should be used for the :bb:cmdline:`try` build. h.j h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMXhMhhN]r(j )r}r(h-X``try_builders``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMXhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_buildersrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XlEquivalent to :option:`--builders`, specifies which builders should be used for the :bb:cmdline:`try` build.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMWhN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r}r(h-X:option:`--builders`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --buildersU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMWhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --buildersrr}r(h-Uh.jubahAjubaubh^X2, specifies which builders should be used for the rr}r(h-X2, specifies which builders should be used for the h.jubjx)r}r(h-X:bb:cmdline:`try`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jXtryU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMWhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^Xtryrr}r(h-Uh.jubahAhubaubh^X build.rr}r(h-X build.h.jubeubahAj ubeubj )r}r(h-Xu``try_vc`` Equivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used. h.j h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLM\hMhhN]r(j )r}r(h-X ``try_vc``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLM\hN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_vcrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XiEquivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM[hN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r}r(h-X:option:`--vc`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--vcU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLM[hN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--vcrr}r(h-Uh.jubahAjubaubh^X for rr}r(h-X for h.jubjx)r}r(h-X:bb:cmdline:`try`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jXtryU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLM[hN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^Xtryrr}r(h-Uh.jubahAhubaubh^X7, this specifies the version control system being used.rr}r(h-X7, this specifies the version control system being used.h.jubeubahAj ubeubj )r}r(h-Xp``try_branch`` Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch. h.j h7h:hAj hC}r(hG]hH]hF]hE]hI]uhLM`hMhhN]r(j )r }r (h-X``try_branch``r h.jh7h:hAj hC}r (hG]hH]hF]hE]hI]uhLM`hN]r h)r}r(h-j hC}r(hG]hH]hF]hE]hI]uh.j hN]rh^X try_branchrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X`Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM_hN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r }r!(h-X:option:`--branch`r"h.jh7h:hAj|hC}r#(UreftypeXoptionj~jX--branchU refdomainXstdr$j NhE]hF]U refexplicithG]hH]hI]jjuhLM_hN]r%j )r&}r'(h-j"hC}r((hG]hH]r)(jj$X std-optionr*ehF]hE]hI]uh.j hN]r+h^X--branchr,r-}r.(h-Uh.j&ubahAjubaubh^X@, this indicates that the current tree is on a non-trunk branch.r/r0}r1(h-X@, this indicates that the current tree is on a non-trunk branch.h.jubeubahAj ubeubeubhb)r2}r3(h-X``try_topdir``r4h.jh7h:hAhehC}r5(hG]hH]hF]hE]hI]uhLMbhMhhN]r6h)r7}r8(h-j4hC}r9(hG]hH]hF]hE]hI]uh.j2hN]r:h^X try_topdirr;r<}r=(h-Uh.j7ubahAhubaubj{ )r>}r?(h-Uh.jh7h:hAj~ hC}r@(hG]hH]hF]hE]hI]uhLNhMhhN]rAj )rB}rC(h-X``try_topfile`` Use ``try_topdir``, equivalent to :option:`--try-topdir`, to explicitly indicate the top of your working tree, or ``try_topfile``, equivalent to :option:`--try-topfile` to name a file that will only be found in that top-most directory. h.j>h7h:hAj hC}rD(hG]hH]hF]hE]hI]uhLMhhN]rE(j )rF}rG(h-X``try_topfile``rHh.jBh7h:hAj hC}rI(hG]hH]hF]hE]hI]uhLMhhN]rJh)rK}rL(h-jHhC}rM(hG]hH]hF]hE]hI]uh.jFhN]rNh^X try_topfilerOrP}rQ(h-Uh.jKubahAhubaubj )rR}rS(h-UhC}rT(hG]hH]hF]hE]hI]uh.jBhN]rUhb)rV}rW(h-XUse ``try_topdir``, equivalent to :option:`--try-topdir`, to explicitly indicate the top of your working tree, or ``try_topfile``, equivalent to :option:`--try-topfile` to name a file that will only be found in that top-most directory.h.jRh7h:hAhehC}rX(hG]hH]hF]hE]hI]uhLMehN]rY(h^XUse rZr[}r\(h-XUse h.jVubh)r]}r^(h-X``try_topdir``hC}r_(hG]hH]hF]hE]hI]uh.jVhN]r`h^X try_topdirrarb}rc(h-Uh.j]ubahAhubh^X, equivalent to rdre}rf(h-X, equivalent to h.jVubjx)rg}rh(h-X:option:`--try-topdir`rih.jVh7h:hAj|hC}rj(UreftypeXoptionj~jX --try-topdirU refdomainXstdrkj NhE]hF]U refexplicithG]hH]hI]jjuhLMehN]rlj )rm}rn(h-jihC}ro(hG]hH]rp(jjkX std-optionrqehF]hE]hI]uh.jghN]rrh^X --try-topdirrsrt}ru(h-Uh.jmubahAjubaubh^X:, to explicitly indicate the top of your working tree, or rvrw}rx(h-X:, to explicitly indicate the top of your working tree, or h.jVubh)ry}rz(h-X``try_topfile``hC}r{(hG]hH]hF]hE]hI]uh.jVhN]r|h^X try_topfiler}r~}r(h-Uh.jyubahAhubh^X, equivalent to rr}r(h-X, equivalent to h.jVubjx)r}r(h-X:option:`--try-topfile`rh.jVh7h:hAj|hC}r(UreftypeXoptionj~jX --try-topfileU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMehN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --try-topfilerr}r(h-Uh.jubahAjubaubh^XC to name a file that will only be found in that top-most directory.rr}r(h-XC to name a file that will only be found in that top-most directory.h.jVubeubahAj ubeubaubhb)r}r(h-X ``try_host``rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMjhMhhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_hostrr}r(h-Uh.jubahAhubaubhb)r}r(h-X``try_username``rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMlhMhhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_usernamerr}r(h-Uh.jubahAhubaubj{ )r}r(h-Uh.jh7h:hAj~ hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rj )r}r(h-X``try_dir`` When ``try_connect`` is ``ssh``, the command will use ``try_host`` for :option:`--tryhost`, ``try_username`` for :option:`--username`, and ``try_dir`` for :option:`--trydir`. Apologies for the confusing presence and absence of 'try'. h.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMrhN]r(j )r}r(h-X ``try_dir``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMrhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_dirrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XWhen ``try_connect`` is ``ssh``, the command will use ``try_host`` for :option:`--tryhost`, ``try_username`` for :option:`--username`, and ``try_dir`` for :option:`--trydir`. Apologies for the confusing presence and absence of 'try'.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMohN]r(h^XWhen rr}r(h-XWhen h.jubh)r}r(h-X``try_connect``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_connectrr}r(h-Uh.jubahAhubh^X is rr}r(h-X is h.jubh)r}r(h-X``ssh``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xsshrr}r(h-Uh.jubahAhubh^X, the command will use rr}r(h-X, the command will use h.jubh)r}r(h-X ``try_host``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_hostrr}r(h-Uh.jubahAhubh^X for rr}r(h-X for h.jubjx)r}r(h-X:option:`--tryhost`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --tryhostU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMohN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --tryhostrr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jubh)r}r(h-X``try_username``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_usernamerr}r(h-Uh.jubahAhubh^X for rr}r(h-X for h.jubjx)r}r(h-X:option:`--username`rh.jh7h:hAj|hC}r (UreftypeXoptionj~jX --usernameU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMohN]r j )r }r (h-jhC}r(hG]hH]r(jj X std-optionrehF]hE]hI]uh.jhN]rh^X --usernamerr}r(h-Uh.j ubahAjubaubh^X, and rr}r(h-X, and h.jubh)r}r(h-X ``try_dir``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_dirrr}r(h-Uh.jubahAhubh^X for rr }r!(h-X for h.jubjx)r"}r#(h-X:option:`--trydir`r$h.jh7h:hAj|hC}r%(UreftypeXoptionj~jX--trydirU refdomainXstdr&j NhE]hF]U refexplicithG]hH]hI]jjuhLMohN]r'j )r(}r)(h-j$hC}r*(hG]hH]r+(jj&X std-optionr,ehF]hE]hI]uh.j"hN]r-h^X--trydirr.r/}r0(h-Uh.j(ubahAjubaubh^X=. Apologies for the confusing presence and absence of 'try'.r1r2}r3(h-X=. Apologies for the confusing presence and absence of 'try'.h.jubeubahAj ubeubaubhb)r4}r5(h-X``try_username``r6h.jh7h:hAhehC}r7(hG]hH]hF]hE]hI]uhLMthMhhN]r8h)r9}r:(h-j6hC}r;(hG]hH]hF]hE]hI]uh.j4hN]r<h^X try_usernamer=r>}r?(h-Uh.j9ubahAhubaubhb)r@}rA(h-X``try_password``rBh.jh7h:hAhehC}rC(hG]hH]hF]hE]hI]uhLMvhMhhN]rDh)rE}rF(h-jBhC}rG(hG]hH]hF]hE]hI]uh.j@hN]rHh^X try_passwordrIrJ}rK(h-Uh.jEubahAhubaubj{ )rL}rM(h-Uh.jh7h:hAj~ hC}rN(hG]hH]hF]hE]hI]uhLNhMhhN]rOj )rP}rQ(h-X``try_master`` Similarly, when ``try_connect`` is ``pb``, the command will pay attention to ``try_username`` for :option:`--username`, ``try_password`` for :option:`--passwd`, and ``try_master`` for :option:`--master`. h.jLh7h:hAj hC}rR(hG]hH]hF]hE]hI]uhLM{hN]rS(j )rT}rU(h-X``try_master``rVh.jPh7h:hAj hC}rW(hG]hH]hF]hE]hI]uhLM{hN]rXh)rY}rZ(h-jVhC}r[(hG]hH]hF]hE]hI]uh.jThN]r\h^X try_masterr]r^}r_(h-Uh.jYubahAhubaubj )r`}ra(h-UhC}rb(hG]hH]hF]hE]hI]uh.jPhN]rchb)rd}re(h-XSimilarly, when ``try_connect`` is ``pb``, the command will pay attention to ``try_username`` for :option:`--username`, ``try_password`` for :option:`--passwd`, and ``try_master`` for :option:`--master`.h.j`h7h:hAhehC}rf(hG]hH]hF]hE]hI]uhLMyhN]rg(h^XSimilarly, when rhri}rj(h-XSimilarly, when h.jdubh)rk}rl(h-X``try_connect``hC}rm(hG]hH]hF]hE]hI]uh.jdhN]rnh^X try_connectrorp}rq(h-Uh.jkubahAhubh^X is rrrs}rt(h-X is h.jdubh)ru}rv(h-X``pb``hC}rw(hG]hH]hF]hE]hI]uh.jdhN]rxh^Xpbryrz}r{(h-Uh.juubahAhubh^X$, the command will pay attention to r|r}}r~(h-X$, the command will pay attention to h.jdubh)r}r(h-X``try_username``hC}r(hG]hH]hF]hE]hI]uh.jdhN]rh^X try_usernamerr}r(h-Uh.jubahAhubh^X for rr}r(h-X for h.jdubjx)r}r(h-X:option:`--username`rh.jdh7h:hAj|hC}r(UreftypeXoptionj~jX --usernameU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMyhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --usernamerr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.jdubh)r}r(h-X``try_password``hC}r(hG]hH]hF]hE]hI]uh.jdhN]rh^X try_passwordrr}r(h-Uh.jubahAhubh^X for rr}r(h-X for h.jdubjx)r}r(h-X:option:`--passwd`rh.jdh7h:hAj|hC}r(UreftypeXoptionj~jX--passwdU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMyhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--passwdrr}r(h-Uh.jubahAjubaubh^X, and rr}r(h-X, and h.jdubh)r}r(h-X``try_master``hC}r(hG]hH]hF]hE]hI]uh.jdhN]rh^X try_masterrr}r(h-Uh.jubahAhubh^X for rr}r(h-X for h.jdubjx)r}r(h-X:option:`--master`rh.jdh7h:hAj|hC}r(UreftypeXoptionj~jX--masterU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMyhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X--masterrr}r(h-Uh.jubahAjubaubh^X.r}r(h-X.h.jdubeubahAj ubeubaubhb)r}r(h-X ``try_wait``rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM}hMhhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_waitrr}r(h-Uh.jubahAhubaubj{ )r}r(h-Uh.jh7h:hAj~ hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rj )r}r(h-X``masterstatus`` ``try_wait`` and ``masterstatus`` (equivalent to :option:`--wait` and ``master``, respectively) are used to ask the :bb:cmdline:`try` command to wait for the requested build to complete. h.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhN]r(j )r}r(h-X``masterstatus``rh.jh7h:hAj hC}r(hG]hH]hF]hE]hI]uhLMhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X masterstatusrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-X``try_wait`` and ``masterstatus`` (equivalent to :option:`--wait` and ``master``, respectively) are used to ask the :bb:cmdline:`try` command to wait for the requested build to complete.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h)r}r(h-X ``try_wait``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_waitrr}r (h-Uh.jubahAhubh^X and r r }r (h-X and h.jubh)r }r (h-X``masterstatus``hC}r (hG]hH]hF]hE]hI]uh.jhN]r h^X masterstatusr r }r (h-Uh.j ubahAhubh^X (equivalent to r r }r (h-X (equivalent to h.jubjx)r }r (h-X:option:`--wait`r h.jh7h:hAj|hC}r (UreftypeXoptionj~jX--waitU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X--waitr r }r (h-Uh.j ubahAjubaubh^X and r r }r (h-X and h.jubh)r }r! (h-X ``master``hC}r" (hG]hH]hF]hE]hI]uh.jhN]r# h^Xmasterr$ r% }r& (h-Uh.j ubahAhubh^X$, respectively) are used to ask the r' r( }r) (h-X$, respectively) are used to ask the h.jubjx)r* }r+ (h-X:bb:cmdline:`try`r, h.jh7h:hAj|hC}r- (UreftypeXcmdlinej~jXtryU refdomainXbbr. hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r/ h)r0 }r1 (h-j, hC}r2 (hG]hH]r3 (jj. X bb-cmdliner4 ehF]hE]hI]uh.j* hN]r5 h^Xtryr6 r7 }r8 (h-Uh.j0 ubahAhubaubh^X5 command to wait for the requested build to complete.r9 r: }r; (h-X5 command to wait for the requested build to complete.h.jubeubahAj ubeubaubeubeubh3eubh7h:hAhOhC}r< (hG]hH]hF]hE]r= U buildslaver> ahI]r? h auhLMhMhhN]r@ (hW)rA }rB (h-X buildslaverC h.h3h7h:hAh[hC}rD (hG]hH]hF]hE]hI]uhLMhMhhN]rE h^X buildslaverF rG }rH (h-jC h.jA ubaubhb)rI }rJ (h-X:command:`buildslave` command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.h.h3h7h:hAhehC}rK (hG]hH]hF]hE]hI]uhLMhMhhN]rL (hk)rM }rN (h-X:command:`buildslave`hC}rO (hG]hH]rP hpahF]hE]hI]uh.jI hN]rQ h^X buildslaverR rS }rT (h-Uh.jM ubahAhuubh^X command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.rU rV }rW (h-X command-line tool is used for buildslave management only and does not provide any additional functionality. One can create, start, stop and restart the buildslave.h.jI ubeubj)rX }rY (h-Uh.h3h7h:hAjhC}rZ (hE]hF]hG]hH]hI]Uentries]r[ ((UsingleX&Command Line Subcommands; create-slaveXcmdline-create-slaver\ j\ tr] (UsingleX$create-slave Command Line Subcommandj\ j\ tr^ euhLMhMhhN]ubh>)r_ }r` (h-Uh.h3h7h:hAhBhC}ra (hE]hF]hG]hH]hI]hJj\ uhLMhMhhN]ubh/)rb }rc (h-Uh.h3h7h:h<}hAhOhC}rd (hG]hH]hF]hE]re (U create-slaverf j\ ehI]rg h auhLMhMhhT}rh j\ j_ shN]ri (hW)rj }rk (h-X create-slaverl h.jb h7h:hAh[hC}rm (hG]hH]hF]hE]hI]uhLMhMhhN]rn h^X create-slavero rp }rq (h-jl h.jj ubaubhb)rr }rs (h-XThis creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial :file:`buildbot.tac` file.h.jb h7h:hAhehC}rt (hG]hH]hF]hE]hI]uhLMhMhhN]ru (h^XThis creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial rv rw }rx (h-XThis creates a new directory and populates it with files that let it be used as a buildslave's base directory. You must provide several arguments, which are used to create the initial h.jr ubh)ry }rz (h-UhC}r{ (hE]hF]hG]hH]r| Xfiler} aUrolej} hI]uh.jr hN]r~ h^X buildbot.tacr r }r (h-X buildbot.tach.jy ubahAhubh^X file.r r }r (h-X file.h.jr ubeubhb)r }r (h-XKThe :option:`-r` option is advisable here, just like for ``create-master``.r h.jb h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (h^XThe r r }r (h-XThe h.j ubjx)r }r (h-X :option:`-r`r h.j h7h:hAj|hC}r (UreftypeXoptionj~jX-rU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r j )r }r (h-j hC}r (hG]hH]r (jj X std-optionr ehF]hE]hI]uh.j hN]r h^X-rr r }r (h-Uh.j ubahAjubaubh^X) option is advisable here, just like for r r }r (h-X) option is advisable here, just like for h.j ubh)r }r (h-X``create-master``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^X create-masterr r }r (h-Uh.j ubahAhubh^X.r }r (h-X.h.j ubeubh)r }r (h-XObuildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}h.jb h7h:hAhhC}r (hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]r h^XObuildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}r r }r (h-Uh.j ubaubhb)r }r (h-XDThe create-slave options are described in :ref:`Buildslave-Options`.r h.jb h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (h^X*The create-slave options are described in r r }r (h-X*The create-slave options are described in h.j ubjx)r }r (h-X:ref:`Buildslave-Options`r h.j h7h:hAj|hC}r (UreftypeXrefj~jXbuildslave-optionsU refdomainXstdr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r j)r }r (h-j hC}r (hG]hH]r (jj Xstd-refr ehF]hE]hI]uh.j hN]r h^XBuildslave-Optionsr r }r (h-Uh.j ubahAjubaubh^X.r }r (h-X.h.j ubeubj)r }r (h-Uh.jb h7h:hAjhC}r (hE]hF]hG]hH]hI]Uentries]r ((UsingleX,Command Line Subcommands; start (buildslave)Xcmdline-start (buildslave)r j tr (UsingleX*start (buildslave) Command Line Subcommandj j tr euhLMhMhhN]ubh>)r }r (h-Uh.jb h7h:hAhBhC}r (hE]hF]hG]hH]hI]hJj uhLMhMhhN]ubeubh0h/)r }r (h-Uh2Kh.h3h7h:h<}hAhOhC}r (hG]r jahH]hF]hE]r (Xcmdline-restart (buildslave)r Uid5r ehI]uhLMhMhhT}r j h>)r }r (h-Uh.h0h7h:hAhBhC}r (hE]hF]hG]hH]hI]hJj uhLMhMhhN]ubshN]r (hW)r }r (h-Xrestartr h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h^Xrestartr r }r (h-j h.j ubaubh)r }r (h-X'buildslave restart [--nodaemon] BASEDIRh.j h7h:hAhhC}r (hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]r h^X'buildslave restart [--nodaemon] BASEDIRr r }r (h-Uh.j ubaubhb)r }r (h-XlThis restarts a buildslave which is already running. It is equivalent to a ``stop`` followed by a ``start``.h.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (h^XKThis restarts a buildslave which is already running. It is equivalent to a r r }r (h-XKThis restarts a buildslave which is already running. It is equivalent to a h.j ubh)r }r (h-X``stop``hC}r (hG]hH]hF]hE]hI]uh.j hN]r h^Xstopr r }r (h-Uh.j ubahAhubh^X followed by a r r }r (h-X followed by a h.j ubh)r }r (h-X ``start``hC}r!(hG]hH]hF]hE]hI]uh.j hN]r!h^Xstartr!r!}r!(h-Uh.j ubahAhubh^X.r!}r!(h-X.h.j ubeubhb)r!}r!(h-XFThe :option:`--nodaemon` option has the same meaning as for ``start``.r !h.j h7h:hAhehC}r !(hG]hH]hF]hE]hI]uhLMhMhhN]r !(h^XThe r !r !}r!(h-XThe h.j!ubjx)r!}r!(h-X:option:`--nodaemon`r!h.j!h7h:hAj|hC}r!(UreftypeXoptionj~jX --nodaemonU refdomainXstdr!j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r!j )r!}r!(h-j!hC}r!(hG]hH]r!(jj!X std-optionr!ehF]hE]hI]uh.j!hN]r!h^X --nodaemonr!r!}r!(h-Uh.j!ubahAjubaubh^X$ option has the same meaning as for r!r!}r !(h-X$ option has the same meaning as for h.j!ubh)r!!}r"!(h-X ``start``hC}r#!(hG]hH]hF]hE]hI]uh.j!hN]r$!h^Xstartr%!r&!}r'!(h-Uh.j!!ubahAhubh^X.r(!}r)!(h-X.h.j!ubeubj)r*!}r+!(h-Uh.j h7h:hAjhC}r,!(hE]hF]hG]hH]hI]Uentries]r-!((UsingleX+Command Line Subcommands; stop (buildslave)Xcmdline-stop (buildslave)r.!j.!tr/!(UsingleX)stop (buildslave) Command Line Subcommandj.!j.!tr0!euhLMhMhhN]ubh>)r1!}r2!(h-Uh.j h7h:hAhBhC}r3!(hE]hF]hG]hH]hI]hJj.!uhLMhMhhN]ubeubh/)r4!}r5!(h-Uh2Kh.h3h7h:h<}hAhOhC}r6!(hG]r7!jahH]hF]hE]r8!(j.!Uid6r9!ehI]uhLMhMhhT}r:!j.!j1!shN]r;!(hW)r!h.j4!h7h:hAh[hC}r?!(hG]hH]hF]hE]hI]uhLMhMhhN]r@!h^XstoprA!rB!}rC!(h-j>!h.j h j8h jh j h jhj hNhjWhj$hjhj?hhRhjhNhj`hjehjihjhjh hNhjdhjhjh jf h!jh"jh#j h$jh%j uhN]r!(h?h5eh-UU transformerr!NU footnote_refsr!}r!Urefnamesr!}r!Usymbol_footnotesr!]r!Uautofootnote_refsr!]r!Usymbol_footnote_refsr!]r!U citationsr!]r!hMhU current_liner!NUtransform_messagesr!]r!(h*)r!}r!(h-UhC}r!(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypej!uhN]r!hb)r!}r!(h-UhC}r!(hG]hH]hF]hE]hI]uh.j!hN]r!h^X7Hyperlink target "command-line-tool" is not referenced.r!r!}r!(h-Uh.j!ubahAheubahAj!ubh*)r!}r!(h-UhC}r!(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKAUtypej!uhN]r!hb)r!}r!(h-UhC}r!(hG]hH]hF]hE]hI]uh.j!hN]r!h^X;Hyperlink target "cmdline-create-master" is not referenced.r!r!}r!(h-Uh.j!ubahAheubahAj!ubh*)r!}r!(h-UhC}r!(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKOUtypej!uhN]r!hb)r!}r!(h-UhC}r!(hG]hH]hF]hE]hI]uh.j!hN]r!h^X>Hyperlink target "cmdline-start (buildbot)" is not referenced.r!r!}r!(h-Uh.j!ubahAheubahAj!ubh*)r!}r!(h-UhC}r!(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineK_Utypej!uhN]r!hb)r!}r!(h-UhC}r!(hG]hH]hF]hE]hI]uh.j!hN]r!h^X@Hyperlink target "cmdline-restart (buildbot)" is not referenced.r!r!}r!(h-Uh.j!ubahAheubahAj!ubh*)r!}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKlUtypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j!hN]r"h^X=Hyperlink target "cmdline-stop (buildbot)" is not referenced.r"r"}r "(h-Uh.j"ubahAheubahAj!ubh*)r "}r "(h-UhC}r "(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKxUtypej!uhN]r "hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j "hN]r"h^X4Hyperlink target "cmdline-sighup" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubh*)r"}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j"hN]r"h^X7Hyperlink target "cmdline-statuslog" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubh*)r "}r!"(h-UhC}r""(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypej!uhN]r#"hb)r$"}r%"(h-UhC}r&"(hG]hH]hF]hE]hI]uh.j "hN]r'"h^X7Hyperlink target "cmdline-statusgui" is not referenced.r("r)"}r*"(h-Uh.j$"ubahAheubahAj!ubh*)r+"}r,"(h-UhC}r-"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypej!uhN]r."hb)r/"}r0"(h-UhC}r1"(hG]hH]hF]hE]hI]uh.j+"hN]r2"h^X1Hyperlink target "cmdline-try" is not referenced.r3"r4"}r5"(h-Uh.j/"ubahAheubahAj!ubh*)r6"}r7"(h-UhC}r8"(hG]UlevelKhE]hF]Usourceh:hH]hI]Utypej!uhN]r9"hb)r:"}r;"(h-UhC}r<"(hG]hH]hF]hE]hI]uh.j6"hN]r="h^X-Hyperlink target "index-0" is not referenced.r>"r?"}r@"(h-Uh.j:"ubahAheubahAj!ubh*)rA"}rB"(h-UhC}rC"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]rD"hb)rE"}rF"(h-UhC}rG"(hG]hH]hF]hE]hI]uh.jA"hN]rH"h^X.Hyperlink target "try-diff" is not referenced.rI"rJ"}rK"(h-Uh.jE"ubahAheubahAj!ubh*)rL"}rM"(h-UhC}rN"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM Utypej!uhN]rO"hb)rP"}rQ"(h-UhC}rR"(hG]hH]hF]hE]hI]uh.jL"hN]rS"h^X8Hyperlink target "cmdline-sendchange" is not referenced.rT"rU"}rV"(h-Uh.jP"ubahAheubahAj!ubh*)rW"}rX"(h-UhC}rY"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineM\Utypej!uhN]rZ"hb)r["}r\"(h-UhC}r]"(hG]hH]hF]hE]hI]uh.jW"hN]r^"h^X9Hyperlink target "cmdline-debugclient" is not referenced.r_"r`"}ra"(h-Uh.j["ubahAheubahAj!ubh*)rb"}rc"(h-UhC}rd"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]re"hb)rf"}rg"(h-UhC}rh"(hG]hH]hF]hE]hI]uh.jb"hN]ri"h^X2Hyperlink target "cmdline-user" is not referenced.rj"rk"}rl"(h-Uh.jf"ubahAheubahAj!ubh*)rm"}rn"(h-UhC}ro"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]rp"hb)rq"}rr"(h-UhC}rs"(hG]hH]hF]hE]hI]uh.jm"hN]rt"h^X?Hyperlink target "buildbot-config-directory" is not referenced.ru"rv"}rw"(h-Uh.jq"ubahAheubahAj!ubh*)rx"}ry"(h-UhC}rz"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]r{"hb)r|"}r}"(h-UhC}r~"(hG]hH]hF]hE]hI]uh.jx"hN]r"h^X:Hyperlink target "cmdline-create-slave" is not referenced.r"r"}r"(h-Uh.j|"ubahAheubahAj!ubh*)r"}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j"hN]r"h^X@Hyperlink target "cmdline-start (buildslave)" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubh*)r"}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j"hN]r"h^XBHyperlink target "cmdline-restart (buildslave)" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubh*)r"}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMUtypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j"hN]r"h^X?Hyperlink target "cmdline-stop (buildslave)" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubeUreporterr"NUid_startr"KU autofootnotesr"]r"U citation_refsr"}r"Uindirect_targetsr"]r"Usettingsr"(cdocutils.frontend Values r"or"}r"(Ufootnote_backlinksr"KUrecord_dependenciesr"NU rfc_base_urlr"Uhttp://tools.ietf.org/html/r"U tracebackr"Upep_referencesr"NUstrip_commentsr"NU toc_backlinksr"Uentryr"U language_coder"Uenr"U datestampr"NU report_levelr"KU _destinationr"NU halt_levelr"KU strip_classesr"Nh[NUerror_encoding_error_handlerr"Ubackslashreplacer"Udebugr"NUembed_stylesheetr"Uoutput_encoding_error_handlerr"Ustrictr"U sectnum_xformr"KUdump_transformsr"NU docinfo_xformr"KUwarning_streamr"NUpep_file_url_templater"Upep-%04dr"Uexit_status_levelr"KUconfigr"NUstrict_visitorr"NUcloak_email_addressesr"Utrim_footnote_reference_spacer"Uenvr"NUdump_pseudo_xmlr"NUexpose_internalsr"NUsectsubtitle_xformr"U source_linkr"NUrfc_referencesr"NUoutput_encodingr"Uutf-8r"U source_urlr"NUinput_encodingr"U utf-8-sigr"U_disable_configr"NU id_prefixr"UU tab_widthr"KUerror_encodingr"UUTF-8r"U_sourcer"UO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/manual/cmdline.rstr"Ugettext_compactr"U generatorr"NUdump_internalsr"NU smart_quotesr"U pep_base_urlr"Uhttp://www.python.org/dev/peps/r"Usyntax_highlightr"Ulongr"Uinput_encoding_error_handlerr"j"Uauto_id_prefixr"Uidr"Udoctitle_xformr"Ustrip_elements_with_classesr"NU _config_filesr"]Ufile_insertion_enabledr"U raw_enabledr"KU dump_settingsr"NubUsymbol_footnote_startr"KUidsr"}r"(jh jd j j j j jjj.j4jjjdj`j j j[jaj jhKh5j jj j j> h3j.!j4!j8j4jjjwj}j9!j4!jV!h0j j jjjjjWjShRh5j6j0jp jr j$j jjjjjjjjjjj j j h0jjj_jej`j\jj jjjijej*j0jjj\ jb jj}jjjf jb jjjejaj?j;jVj\uUsubstitution_namesr"}r"hAhMhC}r"(hG]hE]hF]Usourceh:hH]hI]uU footnotesr"]r"Urefidsr"}r"(j]r"jajw]r"jzaj ]r#j aj]r#jaj]r#jaj.]r#j1aj ]r#j aj_]r#jbaj.!]r#j1!aj]r#jajp ]r#jm aj[]r #j^aj*]r #j-ahK]r #h?aj]r #jaj ]r #j ajV]r#jYaj\ ]r#j_ aj]r#jauub.PK7Dbѽ221buildbot-v0.8.9/.doctrees/tutorial/docker.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xcurrent docker dependenciesqNXfirst buildbot run with dockerqNX$playing with your buildbot containerqNXfirst-run-docker-labelq Xwaterfall display linkq Xbuilding and running buildbotq NXdockerq uUsubstitution_defsq }qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUcurrent-docker-dependenciesqhUfirst-buildbot-run-with-dockerqhU$playing-with-your-buildbot-containerqh Ufirst-run-docker-labelqh Uwaterfall-display-linkqh Ubuilding-and-running-buildbotqh UdockerquUchildrenq]q(cdocutils.nodes target q)q }q!(U rawsourceq"X.. _first-run-docker-label:Uparentq#hUsourceq$cdocutils.nodes reprunicode q%XP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/docker.rstq&q'}q(bUtagnameq)Utargetq*U attributesq+}q,(Uidsq-]Ubackrefsq.]Udupnamesq/]Uclassesq0]Unamesq1]Urefidq2huUlineq3KUdocumentq4hh]ubcdocutils.nodes section q5)q6}q7(h"Uh#hh$h'Uexpect_referenced_by_nameq8}q9h h sh)Usectionq:h+}q;(h/]h0]h.]h-]q<(hheh1]q=(hh euh3Kh4hUexpect_referenced_by_idq>}q?hh sh]q@(cdocutils.nodes title qA)qB}qC(h"XFirst Buildbot run with DockerqDh#h6h$h'h)UtitleqEh+}qF(h/]h0]h.]h-]h1]uh3Kh4hh]qGcdocutils.nodes Text qHXFirst Buildbot run with DockerqIqJ}qK(h"hDh#hBubaubcdocutils.nodes paragraph qL)qM}qN(h"XDocker_ is an tool that makes building and deploying custom environments a breeze. It uses lightweight linux containers (LXC) and performs quickly, making it a great instrument for the testing community. The next section includes a Docker pre-flight check. If it takes more that 3 minutes to get the 'Success' message for you, try the Buildbot pip-based :ref:`first run ` instead.h#h6h$h'h)U paragraphqOh+}qP(h/]h0]h.]h-]h1]uh3Kh4hh]qQ(cdocutils.nodes reference qR)qS}qT(h"XDocker_UresolvedqUKh#hMh)U referenceqVh+}qW(UnameXDockerUrefuriqXXhttp://www.docker.ioqYh-]h.]h/]h0]h1]uh]qZhHXDockerq[q\}q](h"Uh#hSubaubhHX[ is an tool that makes building and deploying custom environments a breeze. It uses lightweight linux containers (LXC) and performs quickly, making it a great instrument for the testing community. The next section includes a Docker pre-flight check. If it takes more that 3 minutes to get the 'Success' message for you, try the Buildbot pip-based q^q_}q`(h"X[ is an tool that makes building and deploying custom environments a breeze. It uses lightweight linux containers (LXC) and performs quickly, making it a great instrument for the testing community. The next section includes a Docker pre-flight check. If it takes more that 3 minutes to get the 'Success' message for you, try the Buildbot pip-based h#hMubcsphinx.addnodes pending_xref qa)qb}qc(h"X%:ref:`first run `qdh#hMh$h'h)U pending_xrefqeh+}qf(UreftypeXrefUrefwarnqgU reftargetqhXgetting-code-labelU refdomainXstdqih-]h.]U refexplicith/]h0]h1]UrefdocqjXtutorial/dockerqkuh3Kh]qlcdocutils.nodes emphasis qm)qn}qo(h"hdh+}qp(h/]h0]qq(UxrefqrhiXstd-refqseh.]h-]h1]uh#hbh]qthHX first runquqv}qw(h"Uh#hnubah)UemphasisqxubaubhHX instead.qyqz}q{(h"X instead.h#hMubeubh)q|}q}(h"X .. _Docker: http://www.docker.ioU referencedq~Kh#h6h$h'h)h*h+}q(hXhYh-]qhah.]h/]h0]h1]qh auh3K h4hh]ubh5)q}q(h"Uh#h6h$h'h)h:h+}q(h/]h0]h.]h-]qhah1]qhauh3Kh4hh]q(hA)q}q(h"XCurrent Docker dependenciesqh#hh$h'h)hEh+}q(h/]h0]h.]h-]h1]uh3Kh4hh]qhHXCurrent Docker dependenciesqq}q(h"hh#hubaubcdocutils.nodes bullet_list q)q}q(h"Uh#hh$h'h)U bullet_listqh+}q(UbulletqX*h-]h.]h/]h0]h1]uh3Kh4hh]q(cdocutils.nodes list_item q)q}q(h"XoLinux system, with at least kernel 3.8 and AUFS support. For example, Standard Ubuntu, Debian and Arch systems.h#hh$h'h)U list_itemqh+}q(h/]h0]h.]h-]h1]uh3Nh4hh]qhL)q}q(h"XoLinux system, with at least kernel 3.8 and AUFS support. For example, Standard Ubuntu, Debian and Arch systems.qh#hh$h'h)hOh+}q(h/]h0]h.]h-]h1]uh3Kh]qhHXoLinux system, with at least kernel 3.8 and AUFS support. For example, Standard Ubuntu, Debian and Arch systems.qq}q(h"hh#hubaubaubh)q}q(h"X<Packages: lxc, iptables, ca-certificates, and bzip2 packagesqh#hh$h'h)hh+}q(h/]h0]h.]h-]h1]uh3Nh4hh]qhL)q}q(h"hh#hh$h'h)hOh+}q(h/]h0]h.]h-]h1]uh3Kh]qhHX<Packages: lxc, iptables, ca-certificates, and bzip2 packagesqq}q(h"hh#hubaubaubh)q}q(h"XJLocal clock on time or slightly in the future for proper SSL communicationqh#hh$h'h)hh+}q(h/]h0]h.]h-]h1]uh3Nh4hh]qhL)q}q(h"hh#hh$h'h)hOh+}q(h/]h0]h.]h-]h1]uh3Kh]qhHXJLocal clock on time or slightly in the future for proper SSL communicationqq}q(h"hh#hubaubaubh)q}q(h"XDDownload, launch and test docker is happy in your linux enviroment: h#hh$h'h)hh+}q(h/]h0]h.]h-]h1]uh3Nh4hh]qhL)q}q(h"XCDownload, launch and test docker is happy in your linux enviroment:qh#hh$h'h)hOh+}q(h/]h0]h.]h-]h1]uh3Kh]qhHXCDownload, launch and test docker is happy in your linux enviroment:qƅq}q(h"hh#hubaubaubeubcdocutils.nodes literal_block q)q}q(h"Xmkdir tmp; cd tmp wget -O docker http://get.docker.io/builds/Linux/x86_64/docker-latest chmod 755 docker; sudo ./docker -d & sudo ./docker run -i busybox /bin/echo Successh#hh$h'h)U literal_blockqh+}q(UlinenosqΉUlanguageqXbashU xml:spaceqUpreserveqh-]h.]h/]h0]h1]uh3Kh4hh]qhHXmkdir tmp; cd tmp wget -O docker http://get.docker.io/builds/Linux/x86_64/docker-latest chmod 755 docker; sudo ./docker -d & sudo ./docker run -i busybox /bin/echo SuccessqӅq}q(h"Uh#hubaubeubh5)q}q(h"Uh#h6h$h'h)h:h+}q(h/]h0]h.]h-]qhah1]qh auh3K h4hh]q(hA)q}q(h"XBuilding and running Buildbotqh#hh$h'h)hEh+}q(h/]h0]h.]h-]h1]uh3K h4hh]qhHXBuilding and running Buildbotqᅁq}q(h"hh#hubaubh)q}q(h"X-# Download Buildbot Dockerfile. wget https://raw.github.com/buildbot/buildbot/master/master/contrib/Dockerfile # Build the Buildbot container (it will take a few minutes to download packages) sudo ./docker build -t buildbot - < Dockerfile # Run buildbot CONTAINER_ID=$(sudo ./docker run -d buildbot)h#hh$h'h)hh+}q(hΉhXbashhhh-]h.]h/]h0]h1]uh3K"h4hh]qhHX-# Download Buildbot Dockerfile. wget https://raw.github.com/buildbot/buildbot/master/master/contrib/Dockerfile # Build the Buildbot container (it will take a few minutes to download packages) sudo ./docker build -t buildbot - < Dockerfile # Run buildbot CONTAINER_ID=$(sudo ./docker run -d buildbot)q腁q}q(h"Uh#hubaubhL)q}q(h"XTYou should now be able to go to http://localhost:8010 and see a web page similar to:h#hh$h'h)hOh+}q(h/]h0]h.]h-]h1]uh3K.h4hh]q(hHX You should now be able to go to qq}q(h"X You should now be able to go to h#hubhR)q}q(h"Xhttp://localhost:8010qh+}q(Urefurihh-]h.]h/]h0]h1]uh#hh]qhHXhttp://localhost:8010qq}q(h"Uh#hubah)hVubhHX and see a web page similar to:qq}q(h"X and see a web page similar to:h#hubeubcdocutils.nodes image q)q}q(h"X1.. image:: _images/index.png :alt: index page h#hh$h'h)Uimagerh+}r(UuriXtutorial/_images/index.pngrh-]h.]h/]h0]U candidatesr}rU*jsh1]Ualth%X index pagerr}rbuh3Nh4hh]ubhL)r}r (h"XZClick on the `Waterfall Display link `_ and you get this:h#hh$h'h)hOh+}r (h/]h0]h.]h-]h1]uh3K4h4hh]r (hHX Click on the r r }r(h"X Click on the h#jubhR)r}r(h"X;`Waterfall Display link `_h+}r(UnameXWaterfall Display linkhXXhttp://localhost:8010/waterfallrh-]h.]h/]h0]h1]uh#jh]rhHXWaterfall Display linkrr}r(h"Uh#jubah)hVubh)r}r(h"X" h~Kh#jh)h*h+}r(Urefurijh-]rhah.]h/]h0]h1]rh auh]ubhHX and you get this:rr}r(h"X and you get this:h#jubeubh)r}r (h"XB.. image:: _images/waterfall-empty.png :alt: empty waterfall. h#hh$h'h)jh+}r!(UuriX$tutorial/_images/waterfall-empty.pngr"h-]h.]h/]h0]j}r#U*j"sh1]Ualth%Xempty waterfall.r$r%}r&buh3Nh4hh]ubeubh5)r'}r((h"Uh#h6h$h'h)h:h+}r)(h/]h0]h.]h-]r*hah1]r+hauh3K=h4hh]r,(hA)r-}r.(h"X$Playing with your Buildbot containerr/h#j'h$h'h)hEh+}r0(h/]h0]h.]h-]h1]uh3K=h4hh]r1hHX$Playing with your Buildbot containerr2r3}r4(h"j/h#j-ubaubhL)r5}r6(h"XIf you've come this far, you have a Buildbot environment that you can freely experiment with. You can access your container using ssh (username: admin, password: admin):r7h#j'h$h'h)hOh+}r8(h/]h0]h.]h-]h1]uh3K?h4hh]r9hHXIf you've come this far, you have a Buildbot environment that you can freely experiment with. You can access your container using ssh (username: admin, password: admin):r:r;}r<(h"j7h#j5ubaubh)r=}r>(h"X=ssh -p $(sudo ./docker port $CONTAINER_ID 22) admin@localhosth#j'h$h'h)hh+}r?(hΉhXbashhhh-]h.]h/]h0]h1]uh3KBh4hh]r@hHX=ssh -p $(sudo ./docker port $CONTAINER_ID 22) admin@localhostrArB}rC(h"Uh#j=ubaubhL)rD}rE(h"XYou've got a taste now, but you're probably curious for more. Let's step it up a little in the second tutorial by changing the configuration and doing an actual build. Continue on to :ref:`quick-tour-label`h#j'h$h'h)hOh+}rF(h/]h0]h.]h-]h1]uh3KGh4hh]rG(hHXYou've got a taste now, but you're probably curious for more. Let's step it up a little in the second tutorial by changing the configuration and doing an actual build. Continue on to rHrI}rJ(h"XYou've got a taste now, but you're probably curious for more. Let's step it up a little in the second tutorial by changing the configuration and doing an actual build. Continue on to h#jDubha)rK}rL(h"X:ref:`quick-tour-label`rMh#jDh$h'h)heh+}rN(UreftypeXrefhghhXquick-tour-labelU refdomainXstdrOh-]h.]U refexplicith/]h0]h1]hjhkuh3KGh]rPhm)rQ}rR(h"jMh+}rS(h/]h0]rT(hrjOXstd-refrUeh.]h-]h1]uh#jKh]rVhHXquick-tour-labelrWrX}rY(h"Uh#jQubah)hxubaubeubeubeubeh"UU transformerrZNU footnote_refsr[}r\Urefnamesr]}r^Xdocker]r_hSasUsymbol_footnotesr`]raUautofootnote_refsrb]rcUsymbol_footnote_refsrd]reU citationsrf]rgh4hU current_linerhNUtransform_messagesri]rjcdocutils.nodes system_message rk)rl}rm(h"Uh+}rn(h/]UlevelKh-]h.]Usourceh'h0]h1]UlineKUtypeUINFOrouh]rphL)rq}rr(h"Uh+}rs(h/]h0]h.]h-]h1]uh#jlh]rthHX<Hyperlink target "first-run-docker-label" is not referenced.rurv}rw(h"Uh#jqubah)hOubah)Usystem_messagerxubaUreporterryNUid_startrzKU autofootnotesr{]r|U citation_refsr}}r~Uindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhENUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/docker.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhhhhh6hh6hj'hh|hjuUsubstitution_namesr}rh)h4h+}r(h/]h-]h.]Usourceh'h0]h1]uU footnotesr]rUrefidsr}rh]rh asub.PK7DS煃/buildbot-v0.8.9/.doctrees/tutorial/tour.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xadding a 'try' schedulerqNXview in waterfallqXquick-tour-labelqXthe waterfall pageq Xconfiguration errorsq NXsetting project name and urlq NXsetting authorized web usersq NXyour first buildq NX waterfallqXdebugging with manholeqNXenabling the irc botqNX a quick tourqNXgoalqNuUsubstitution_defsq}qUparse_messagesq]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUhh)q}q (hUhhUsourceq!cdocutils.nodes reprunicode q"XN/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/tour.rstq#q$}q%bUexpect_referenced_by_nameq&}q'hcdocutils.nodes target q()q)}q*(hX.. _quick-tour-label:hhh!h$Utagnameq+Utargetq,U attributesq-}q.(Uidsq/]Ubackrefsq0]Udupnamesq1]Uclassesq2]Unamesq3]Urefidq4Uquick-tour-labelq5uUlineq6KUdocumentq7hUchildrenq8]ubsh+Usectionq9h-}q:(h1]h2]h0]h/]q;(U a-quick-tourq}q?h5h)sh8]q@(cdocutils.nodes title qA)qB}qC(hX A Quick TourqDhhh!h$h+UtitleqEh-}qF(h1]h2]h0]h/]h3]uh6Kh7hh8]qGcdocutils.nodes Text qHX A Quick TourqIqJ}qK(hhDhhBubaubh)qL}qM(hUhhh!h$h+h9h-}qN(h1]h2]h0]h/]qOUgoalqPah3]qQhauh6Kh7hh8]qR(hA)qS}qT(hXGoalqUhhLh!h$h+hEh-}qV(h1]h2]h0]h/]h3]uh6Kh7hh8]qWhHXGoalqXqY}qZ(hhUhhSubaubcdocutils.nodes paragraph q[)q\}q](hXThis tutorial will expand on the :ref:`first-run-label` tutorial by taking a quick tour around some of the features of buildbot that are hinted at in the comments in the sample configuration. We will simply change parts of the default configuration and explain the activated features.hhLh!h$h+U paragraphq^h-}q_(h1]h2]h0]h/]h3]uh6K h7hh8]q`(hHX!This tutorial will expand on the qaqb}qc(hX!This tutorial will expand on the hh\ubcsphinx.addnodes pending_xref qd)qe}qf(hX:ref:`first-run-label`qghh\h!h$h+U pending_xrefqhh-}qi(UreftypeXrefUrefwarnqjU reftargetqkXfirst-run-labelU refdomainXstdqlh/]h0]U refexplicith1]h2]h3]UrefdocqmX tutorial/tourqnuh6K h8]qocdocutils.nodes emphasis qp)qq}qr(hhgh-}qs(h1]h2]qt(UxrefquhlXstd-refqveh0]h/]h3]uhheh8]qwhHXfirst-run-labelqxqy}qz(hUhhqubah+Uemphasisq{ubaubhHX tutorial by taking a quick tour around some of the features of buildbot that are hinted at in the comments in the sample configuration. We will simply change parts of the default configuration and explain the activated features.q|q}}q~(hX tutorial by taking a quick tour around some of the features of buildbot that are hinted at in the comments in the sample configuration. We will simply change parts of the default configuration and explain the activated features.hh\ubeubh[)q}q(hXIAs a part of this tutorial, we will make buildbot do a few actual builds.qhhLh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh7hh8]qhHXIAs a part of this tutorial, we will make buildbot do a few actual builds.qq}q(hhhhubaubcdocutils.nodes definition_list q)q}q(hUhhLh!Nh+Udefinition_listqh-}q(h1]h2]h0]h/]h3]uh6Nh7hh8]qcdocutils.nodes definition_list_item q)q}q(hXThis section will teach you how to: - make simple configuration changes and activate them - deal with configuration errors - force builds - enable and control the IRC bot - enable ssh debugging - add a 'try' scheduler hhh!h$h+Udefinition_list_itemqh-}q(h1]h2]h0]h/]h3]uh6Kh8]q(cdocutils.nodes term q)q}q(hX#This section will teach you how to:qhhh!h$h+Utermqh-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHX#This section will teach you how to:qq}q(hhhhubaubcdocutils.nodes definition q)q}q(hUh-}q(h1]h2]h0]h/]h3]uhhh8]qcdocutils.nodes bullet_list q)q}q(hUh-}q(UbulletqX-h/]h0]h1]h2]h3]uhhh8]q(cdocutils.nodes list_item q)q}q(hX3make simple configuration changes and activate themqh-}q(h1]h2]h0]h/]h3]uhhh8]qh[)q}q(hhhhh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHX3make simple configuration changes and activate themqq}q(hhhhubaubah+U list_itemqubh)q}q(hXdeal with configuration errorsqh-}q(h1]h2]h0]h/]h3]uhhh8]qh[)q}q(hhhhh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHXdeal with configuration errorsqq}q(hhhhubaubah+hubh)q}q(hX force buildsqh-}q(h1]h2]h0]h/]h3]uhhh8]qh[)q}q(hhhhh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHX force buildsq˅q}q(hhhhubaubah+hubh)q}q(hXenable and control the IRC botqh-}q(h1]h2]h0]h/]h3]uhhh8]qh[)q}q(hhhhh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHXenable and control the IRC botqׅq}q(hhhhubaubah+hubh)q}q(hXenable ssh debuggingqh-}q(h1]h2]h0]h/]h3]uhhh8]qh[)q}q(hhhhh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHXenable ssh debuggingqㅁq}q(hhhhubaubah+hubh)q}q(hXadd a 'try' scheduler h-}q(h1]h2]h0]h/]h3]uhhh8]qh[)q}q(hXadd a 'try' schedulerqhhh!h$h+h^h-}q(h1]h2]h0]h/]h3]uh6Kh8]qhHXadd a 'try' schedulerqq}q(hhhhubaubah+hubeh+U bullet_listqubah+U definitionqubeubaubeubh)q}q(hUhhh!h$h+h9h-}q(h1]h2]h0]h/]qUsetting-project-name-and-urlqah3]qh auh6Kh7hh8]q(hA)q}q(hXSetting Project Name and URLqhhh!h$h+hEh-}q(h1]h2]h0]h/]h3]uh6Kh7hh8]qhHXSetting Project Name and URLrr}r(hhhhubaubh[)r}r(hX_Let's start simple by looking at where you would customize the buildbot's project name and URL.rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX_Let's start simple by looking at where you would customize the buildbot's project name and URL.rr }r (hjhjubaubh[)r }r (hXEWe continue where we left off in the :ref:`first-run-label` tutorial.r hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hHX%We continue where we left off in the rr}r(hX%We continue where we left off in the hj ubhd)r}r(hX:ref:`first-run-label`rhj h!h$h+hhh-}r(UreftypeXrefhjhkXfirst-run-labelU refdomainXstdrh/]h0]U refexplicith1]h2]h3]hmhnuh6Kh8]rhp)r}r(hjh-}r(h1]h2]r(hujXstd-refreh0]h/]h3]uhjh8]rhHXfirst-run-labelrr }r!(hUhjubah+h{ubaubhHX tutorial.r"r#}r$(hX tutorial.hj ubeubh[)r%}r&(hXOpen a new terminal, and first enter the same sandbox you created before (where ``$EDITOR`` is your editor of choice like vim, gedit, or emacs):r'hhh!h$h+h^h-}r((h1]h2]h0]h/]h3]uh6K h7hh8]r)(hHXPOpen a new terminal, and first enter the same sandbox you created before (where r*r+}r,(hXPOpen a new terminal, and first enter the same sandbox you created before (where hj%ubcdocutils.nodes literal r-)r.}r/(hX ``$EDITOR``h-}r0(h1]h2]h0]h/]h3]uhj%h8]r1hHX$EDITORr2r3}r4(hUhj.ubah+Uliteralr5ubhHX5 is your editor of choice like vim, gedit, or emacs):r6r7}r8(hX5 is your editor of choice like vim, gedit, or emacs):hj%ubeubcdocutils.nodes literal_block r9)r:}r;(hXHcd cd tmp/buildbot source sandbox/bin/activate $EDITOR master/master.cfghhh!h$h+U literal_blockr<h-}r=(Ulinenosr>Ulanguager?XbashU xml:spacer@UpreserverAh/]h0]h1]h2]h3]uh6K"h7hh8]rBhHXHcd cd tmp/buildbot source sandbox/bin/activate $EDITOR master/master.cfgrCrD}rE(hUhj:ubaubh[)rF}rG(hXANow, look for the section marked *PROJECT IDENTITY* which reads::rHhhh!h$h+h^h-}rI(h1]h2]h0]h/]h3]uh6K)h7hh8]rJ(hHX!Now, look for the section marked rKrL}rM(hX!Now, look for the section marked hjFubhp)rN}rO(hX*PROJECT IDENTITY*h-}rP(h1]h2]h0]h/]h3]uhjFh8]rQhHXPROJECT IDENTITYrRrS}rT(hUhjNubah+h{ubhHX which reads:rUrV}rW(hX which reads:hjFubeubj9)rX}rY(hX,####### PROJECT IDENTITY # the 'title' string will appear at the top of this buildbot # installation's html.WebStatus home page (linked to the # 'titleURL') and is embedded in the title of the waterfall HTML page. c['title'] = "Pyflakes" c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"hhh!h$h+j<h-}rZ(j@jAh/]h0]h1]h2]h3]uh6K+h7hh8]r[hHX,####### PROJECT IDENTITY # the 'title' string will appear at the top of this buildbot # installation's html.WebStatus home page (linked to the # 'titleURL') and is embedded in the title of the waterfall HTML page. c['title'] = "Pyflakes" c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"r\r]}r^(hUhjXubaubh[)r_}r`(hXpIf you want, you can change either of these links to anything you want to see what happens when you change them.rahhh!h$h+h^h-}rb(h1]h2]h0]h/]h3]uh6K4h7hh8]rchHXpIf you want, you can change either of these links to anything you want to see what happens when you change them.rdre}rf(hjahj_ubaubh[)rg}rh(hX4After making a change go into the terminal and type:rihhh!h$h+h^h-}rj(h1]h2]h0]h/]h3]uh6K6h7hh8]rkhHX4After making a change go into the terminal and type:rlrm}rn(hjihjgubaubj9)ro}rp(hXbuildbot reconfig masterhhh!h$h+j<h-}rq(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6K8h7hh8]rrhHXbuildbot reconfig masterrsrt}ru(hUhjoubaubh[)rv}rw(hXNYou will see a handful of lines of output from the master log, much like this:rxhhh!h$h+h^h-}ry(h1]h2]h0]h/]h3]uh6K 2011-12-04 10:11:09-0600 [-] (TCP Port 8010 Closed) 2011-12-04 10:11:09-0600 [-] Stopping factory 2011-12-04 10:11:09-0600 [-] adding IStatusReceiver 2011-12-04 10:11:09-0600 [-] RotateLogSite starting on 8010 2011-12-04 10:11:09-0600 [-] Starting factory 2011-12-04 10:11:09-0600 [-] Setting up http.log rotating 10 files of 10000000 bytes each 2011-12-04 10:11:09-0600 [-] WebStatus using (/home/dustin/tmp/buildbot/master/public_html) 2011-12-04 10:11:09-0600 [-] removing 0 old schedulers, updating 0, and adding 0 2011-12-04 10:11:09-0600 [-] adding 1 new changesources, removing 1 2011-12-04 10:11:09-0600 [-] gitpoller: using workdir '/home/dustin/tmp/buildbot/master/gitpoller-workdir' 2011-12-04 10:11:09-0600 [-] GitPoller repository already exists 2011-12-04 10:11:09-0600 [-] configuration update complete Reconfiguration appears to have completed successfully.hhh!h$h+j<h-}r(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6K>h7hh8]rhHXQ2011-12-04 10:11:09-0600 [-] loading configuration from /home/dustin/tmp/buildbot/master/master.cfg 2011-12-04 10:11:09-0600 [-] configuration update started 2011-12-04 10:11:09-0600 [-] builder runtests is unchanged 2011-12-04 10:11:09-0600 [-] removing IStatusReceiver 2011-12-04 10:11:09-0600 [-] (TCP Port 8010 Closed) 2011-12-04 10:11:09-0600 [-] Stopping factory 2011-12-04 10:11:09-0600 [-] adding IStatusReceiver 2011-12-04 10:11:09-0600 [-] RotateLogSite starting on 8010 2011-12-04 10:11:09-0600 [-] Starting factory 2011-12-04 10:11:09-0600 [-] Setting up http.log rotating 10 files of 10000000 bytes each 2011-12-04 10:11:09-0600 [-] WebStatus using (/home/dustin/tmp/buildbot/master/public_html) 2011-12-04 10:11:09-0600 [-] removing 0 old schedulers, updating 0, and adding 0 2011-12-04 10:11:09-0600 [-] adding 1 new changesources, removing 1 2011-12-04 10:11:09-0600 [-] gitpoller: using workdir '/home/dustin/tmp/buildbot/master/gitpoller-workdir' 2011-12-04 10:11:09-0600 [-] GitPoller repository already exists 2011-12-04 10:11:09-0600 [-] configuration update complete Reconfiguration appears to have completed successfully.rr}r(hUhj~ubaubh[)r}r(hXThe important lines are the ones telling you that it is loading the new configuration at the top, and the one at the bottom saying that the update is complete.rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6KSh7hh8]rhHXThe important lines are the ones telling you that it is loading the new configuration at the top, and the one at the bottom saying that the update is complete.rr}r(hjhjubaubh[)r}r(hX$Now, if you go back to `the waterfall page `_, you will see that the project's name is whatever you may have changed it to and when you click on the URL of the project name at the bottom of the page it should take you to the link you put in the configuration.hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6KWh7hh8]r(hHXNow, if you go back to rr}r(hXNow, if you go back to hjubcdocutils.nodes reference r)r}r(hX7`the waterfall page `_h-}r(UnameXthe waterfall pageUrefurirXhttp://localhost:8010/waterfallrh/]h0]h1]h2]h3]uhjh8]rhHXthe waterfall pagerr}r(hUhjubah+U referencerubh()r}r(hX" U referencedrKhjh+h,h-}r(Urefurijh/]rUthe-waterfall-pagerah0]h1]h2]h3]rh auh8]ubhHX, you will see that the project's name is whatever you may have changed it to and when you click on the URL of the project name at the bottom of the page it should take you to the link you put in the configuration.rr}r(hX, you will see that the project's name is whatever you may have changed it to and when you click on the URL of the project name at the bottom of the page it should take you to the link you put in the configuration.hjubeubeubh)r}r(hUhhh!h$h+h9h-}r(h1]h2]h0]h/]rUconfiguration-errorsrah3]rh auh6K]h7hh8]r(hA)r}r(hXConfiguration Errorsrhjh!h$h+hEh-}r(h1]h2]h0]h/]h3]uh6K]h7hh8]rhHXConfiguration Errorsrr}r(hjhjubaubh[)r}r(hXIt is very common to make a mistake when configuring buildbot, so you might as well see now what happens in that case and what you can do to fix the error.rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6K_h7hh8]rhHXIt is very common to make a mistake when configuring buildbot, so you might as well see now what happens in that case and what you can do to fix the error.rr}r(hjhjubaubh[)r}r(hXOpen up the config again and introduce a syntax error by removing the first single quote in the two lines you changed, so they read::hjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kch7hh8]rhHXOpen up the config again and introduce a syntax error by removing the first single quote in the two lines you changed, so they read:rr}r(hXOpen up the config again and introduce a syntax error by removing the first single quote in the two lines you changed, so they read:hjubaubj9)r}r(hXTc['title'] = "Pyflakes" c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"hjh!h$h+j<h-}r(j@jAh/]h0]h1]h2]h3]uh6Kfh7hh8]rhHXTc['title'] = "Pyflakes" c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"rr}r(hUhjubaubh[)r}r(hXNThis creates a Python SyntaxError. Now go ahead and reconfig the buildmaster:rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kih7hh8]rhHXNThis creates a Python SyntaxError. Now go ahead and reconfig the buildmaster:rr}r(hjhjubaubj9)r}r(hXbuildbot reconfig masterhjh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6Kkh7hh8]rhHXbuildbot reconfig masterrr}r(hUhjubaubh[)r}r(hX!This time, the output looks like:rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Koh7hh8]rhHX!This time, the output looks like:rr}r(hjhjubaubj9)r}r(hXr2011-12-04 10:12:28-0600 [-] loading configuration from /home/dustin/tmp/buildbot/master/master.cfg 2011-12-04 10:12:28-0600 [-] configuration update started 2011-12-04 10:12:28-0600 [-] error while parsing config file 2011-12-04 10:12:28-0600 [-] Unhandled Error Traceback (most recent call last): File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 197, in loadTheConfigFile d = self.loadConfig(f) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 579, in loadConfig d.addCallback(do_load) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 298, in addCallback callbackKeywords=kw) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 287, in addCallbacks self._runCallbacks() --- --- File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 545, in _runCallbacks current.result = callback(current.result, *args, **kw) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 226, in do_load exec f in localDict exceptions.SyntaxError: EOL while scanning string literal (master.cfg, line 17) Never saw reconfiguration finish.hjh!h$h+j<h-}r(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6Kqh7hh8]rhHXr2011-12-04 10:12:28-0600 [-] loading configuration from /home/dustin/tmp/buildbot/master/master.cfg 2011-12-04 10:12:28-0600 [-] configuration update started 2011-12-04 10:12:28-0600 [-] error while parsing config file 2011-12-04 10:12:28-0600 [-] Unhandled Error Traceback (most recent call last): File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 197, in loadTheConfigFile d = self.loadConfig(f) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 579, in loadConfig d.addCallback(do_load) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 298, in addCallback callbackKeywords=kw) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 287, in addCallbacks self._runCallbacks() --- --- File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/Twisted-11.1.0-py2.7-linux-x86_64.egg/twisted/internet/defer.py", line 545, in _runCallbacks current.result = callback(current.result, *args, **kw) File "/home/dustin/tmp/buildbot/sandbox/lib/python2.7/site-packages/buildbot-0.8.5-py2.7.egg/buildbot/master.py", line 226, in do_load exec f in localDict exceptions.SyntaxError: EOL while scanning string literal (master.cfg, line 17) Never saw reconfiguration finish.rr}r(hUhjubaubh[)r}r(hXThis time, it's clear that there was a mistake. in the configuration. Luckily, the buildbot master will ignore the wrong configuration and keep running with the previous configuration.rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXThis time, it's clear that there was a mistake. in the configuration. Luckily, the buildbot master will ignore the wrong configuration and keep running with the previous configuration.rr}r(hjhjubaubh[)r}r(hXeThe message is clear enough, so open the configuration again, fix the error, and reconfig the master.rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXeThe message is clear enough, so open the configuration again, fix the error, and reconfig the master.rr}r(hjhjubaubeubh)r}r(hUhhh!h$h+h9h-}r(h1]h2]h0]h/]rUyour-first-buildrah3]rh auh6Kh7hh8]r(hA)r}r(hXYour First Buildrhjh!h$h+hEh-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXYour First Buildrr }r (hjhjubaubh[)r }r (hXBy now you're probably thinking: "All this time spent and still not done a single build? What was the name of this project again?"r hjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXBy now you're probably thinking: "All this time spent and still not done a single build? What was the name of this project again?"rr}r(hj hj ubaubh[)r}r(hX?On the `waterfall `_. page, click on the runtests link. You'll see a builder page, and in the upper-right corner is a box where you can login. The default username and password are both "pyflakes". Once you've logged in, you will see some new options that allow you to force a build:hjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hHXOn the rr}r(hXOn the hjubj)r}r(hX.`waterfall `_h-}r(UnamehjXhttp://localhost:8010/waterfallrh/]h0]h1]h2]h3]uhjh8]rhHX waterfallrr }r!(hUhjubah+jubh()r"}r#(hX" jKhjh+h,h-}r$(Urefurijh/]r%U waterfallr&ah0]h1]h2]h3]r'hauh8]ubhHX . page, click on the runtests link. You'll see a builder page, and in the upper-right corner is a box where you can login. The default username and password are both "pyflakes". Once you've logged in, you will see some new options that allow you to force a build:r(r)}r*(hX . page, click on the runtests link. You'll see a builder page, and in the upper-right corner is a box where you can login. The default username and password are both "pyflakes". Once you've logged in, you will see some new options that allow you to force a build:hjubeubcdocutils.nodes image r+)r,}r-(hX;.. image:: _images/force-build.png :alt: force a build. hjh!h$h+Uimager.h-}r/(UuriX tutorial/_images/force-build.pngr0h/]h0]h1]h2]U candidatesr1}r2U*j0sh3]Ualth"Xforce a build.r3r4}r5buh6Nh7hh8]ubh[)r6}r7(hXClick *Force Build* - there's no need to fill in any of the fields in this case. Next, click on `view in waterfall `_.hjh!h$h+h^h-}r8(h1]h2]h0]h/]h3]uh6Kh7hh8]r9(hHXClick r:r;}r<(hXClick hj6ubhp)r=}r>(hX *Force Build*h-}r?(h1]h2]h0]h/]h3]uhj6h8]r@hHX Force BuildrArB}rC(hUhj=ubah+h{ubhHXN - there's no need to fill in any of the fields in this case. Next, click on rDrE}rF(hXN - there's no need to fill in any of the fields in this case. Next, click on hj6ubj)rG}rH(hXD`view in waterfall `_h-}rI(UnameXview in waterfalljX-http://localhost:8010/waterfall?show=runtestsrJh/]h0]h1]h2]h3]uhj6h8]rKhHXview in waterfallrLrM}rN(hUhjGubah+jubh()rO}rP(hX0 jKhj6h+h,h-}rQ(UrefurijJh/]rRUview-in-waterfallrSah0]h1]h2]h3]rThauh8]ubhHX.rU}rV(hX.hj6ubeubh[)rW}rX(hXYou will now see:rYhjh!h$h+h^h-}rZ(h1]h2]h0]h/]h3]uh6Kh7hh8]r[hHXYou will now see:r\r]}r^(hjYhjWubaubj+)r_}r`(hXR.. image:: _images/runtests-success.png :alt: an successful test run happened. hjh!h$h+j.h-}ra(UuriX%tutorial/_images/runtests-success.pngrbh/]h0]h1]h2]j1}rcU*jbsh3]Ualth"X an successful test run happened.rdre}rfbuh6Nh7hh8]ubeubh)rg}rh(hUhhh!h$h+h9h-}ri(h1]h2]h0]h/]rjUenabling-the-irc-botrkah3]rlhauh6Kh7hh8]rm(hA)rn}ro(hXEnabling the IRC Botrphjgh!h$h+hEh-}rq(h1]h2]h0]h/]h3]uh6Kh7hh8]rrhHXEnabling the IRC Botrsrt}ru(hjphjnubaubh[)rv}rw(hXqBuildbot includes an IRC bot that you can tell to join a channel and control to report on the status of buildbot.rxhjgh!h$h+h^h-}ry(h1]h2]h0]h/]h3]uh6Kh7hh8]rzhHXqBuildbot includes an IRC bot that you can tell to join a channel and control to report on the status of buildbot.r{r|}r}(hjxhjvubaubh[)r~}r(hXFirst, start an IRC client of your choice, connect to irc.freenode.org and join an empty channel. In this example we will use #buildbot-test, so go join that channel. (*Note: please do not join the main buildbot channel!*)hjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hHXFirst, start an IRC client of your choice, connect to irc.freenode.org and join an empty channel. In this example we will use #buildbot-test, so go join that channel. (rr}r(hXFirst, start an IRC client of your choice, connect to irc.freenode.org and join an empty channel. In this example we will use #buildbot-test, so go join that channel. (hj~ubhp)r}r(hX5*Note: please do not join the main buildbot channel!*h-}r(h1]h2]h0]h/]h3]uhj~h8]rhHX3Note: please do not join the main buildbot channel!rr}r(hUhjubah+h{ubhHX)r}r(hX)hj~ubeubh[)r}r(hXvEdit the config and look for the *STATUS TARGETS* section. Enter these lines below the WebStatus line in master.cfg::hjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]r(hHX!Edit the config and look for the rr}r(hX!Edit the config and look for the hjubhp)r}r(hX*STATUS TARGETS*h-}r(h1]h2]h0]h/]h3]uhjh8]rhHXSTATUS TARGETSrr}r(hUhjubah+h{ubhHXD section. Enter these lines below the WebStatus line in master.cfg:rr}r(hXD section. Enter these lines below the WebStatus line in master.cfg:hjubeubj9)r}r(hXc['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg)) from buildbot.status import words c['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest", channels=["#buildbot-test"]))hjgh!h$h+j<h-}r(j@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXc['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg)) from buildbot.status import words c['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest", channels=["#buildbot-test"]))rr}r(hUhjubaubh[)r}r(hX%Reconfigure the build master then do:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX%Reconfigure the build master then do:rr}r(hjhjubaubj9)r}r(hXgrep -i irc master/twistd.loghjgh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXgrep -i irc master/twistd.logrr}r(hUhjubaubh[)r}r(hX/The log output should contain a line like this:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX/The log output should contain a line like this:rr}r(hjhjubaubj9)r}r(hXe2009-08-01 15:35:20+0200 [-] adding IStatusReceiver hjgh!h$h+j<h-}r(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXe2009-08-01 15:35:20+0200 [-] adding IStatusReceiver rr}r(hUhjubaubh[)r}r(hXQYou should see the bot now joining in your IRC client. In your IRC channel, type:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXQYou should see the bot now joining in your IRC client. In your IRC channel, type:rr}r(hjhjubaubj9)r}r(hXbbtest: commandshjgh!h$h+j<h-}r(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXbbtest: commandsrr}r(hUhjubaubh[)r}r(hX/to get a list of the commands the bot supports.rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX/to get a list of the commands the bot supports.rr}r(hjhjubaubh[)r}r(hXTLet's tell the bot to notify certain events, to learn which EVENTS we can notify on:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXTLet's tell the bot to notify certain events, to learn which EVENTS we can notify on:rr}r(hjhjubaubj9)r}r(hXbbtest: help notifyhjgh!h$h+j<h-}r(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXbbtest: help notifyrr}r(hUhjubaubh[)r}r(hX'Now let's set some event notifications:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX'Now let's set some event notifications:rr}r(hjhjubaubj9)r}r(hXNbbtest: notify on started bbtest: notify on finished bbtest: notify on failurehjgh!h$h+j<h-}r(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXNbbtest: notify on started bbtest: notify on finished bbtest: notify on failurerr}r(hUhjubaubh[)r}r(hX6The bot should have responded to each of the commands:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX6The bot should have responded to each of the commands:rr}r(hjhjubaubj9)r}r(hXL<@lsblakk> bbtest: notify on started The following events are being notified: ['started'] <@lsblakk> bbtest: notify on finished The following events are being notified: ['started', 'finished'] <@lsblakk> bbtest: notify on failure The following events are being notified: ['started', 'failure', 'finished']hjgh!h$h+j<h-}r(j>j?Xircj@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHXL<@lsblakk> bbtest: notify on started The following events are being notified: ['started'] <@lsblakk> bbtest: notify on finished The following events are being notified: ['started', 'finished'] <@lsblakk> bbtest: notify on failure The following events are being notified: ['started', 'failure', 'finished']rr}r(hUhjubaubh[)r}r (hX:Now, go back to the web interface and force another build.r hjgh!h$h+h^h-}r (h1]h2]h0]h/]h3]uh6Kh7hh8]r hHX:Now, go back to the web interface and force another build.r r}r(hj hjubaubh[)r}r(hXFNotice how the bot tells you about the start and finish of this build:rhjgh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHXFNotice how the bot tells you about the start and finish of this build:rr}r(hjhjubaubj9)r}r(hX< bbtest> build #1 of runtests started, including [] < bbtest> build #1 of runtests is complete: Success [build successful] Build details are at http://localhost:8010/builders/runtests/builds/1hjgh!h$h+j<h-}r(j>j?Xircj@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rhHX< bbtest> build #1 of runtests started, including [] < bbtest> build #1 of runtests is complete: Success [build successful] Build details are at http://localhost:8010/builders/runtests/builds/1rr}r(hUhjubaubh[)r}r (hX*You can also use the bot to force a build:r!hjgh!h$h+h^h-}r"(h1]h2]h0]h/]h3]uh6Kh7hh8]r#hHX*You can also use the bot to force a build:r$r%}r&(hj!hjubaubj9)r'}r((hX'bbtest: force build runtests test buildhjgh!h$h+j<h-}r)(j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6Kh7hh8]r*hHX'bbtest: force build runtests test buildr+r,}r-(hUhj'ubaubh[)r.}r/(hXPBut to allow this, you'll need to have ``allowForce`` in the IRC configuration::hjgh!h$h+h^h-}r0(h1]h2]h0]h/]h3]uh6Kh7hh8]r1(hHX'But to allow this, you'll need to have r2r3}r4(hX'But to allow this, you'll need to have hj.ubj-)r5}r6(hX``allowForce``h-}r7(h1]h2]h0]h/]h3]uhj.h8]r8hHX allowForcer9r:}r;(hUhj5ubah+j5ubhHX in the IRC configuration:r<r=}r>(hX in the IRC configuration:hj.ubeubj9)r?}r@(hXc['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest", allowForce=True, channels=["#buildbot-test"]))hjgh!h$h+j<h-}rA(j@jAh/]h0]h1]h2]h3]uh6Kh7hh8]rBhHXc['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest", allowForce=True, channels=["#buildbot-test"]))rCrD}rE(hUhj?ubaubh[)rF}rG(hXThis time, the bot is giving you more output, as it's specifically responding to your direct request to force a build, and explicitly tells you when the build finishes:rHhjgh!h$h+h^h-}rI(h1]h2]h0]h/]h3]uh6Kh7hh8]rJhHXThis time, the bot is giving you more output, as it's specifically responding to your direct request to force a build, and explicitly tells you when the build finishes:rKrL}rM(hjHhjFubaubj9)rN}rO(hXP<@lsblakk> bbtest: force build runtests test build < bbtest> build #2 of runtests started, including [] < bbtest> build forced [ETA 0 seconds] < bbtest> I'll give a shout when the build finishes < bbtest> build #2 of runtests is complete: Success [build successful] Build details are at http://localhost:8010/builders/runtests/builds/2hjgh!h$h+j<h-}rP(j>j?Xircj@jAh/]h0]h1]h2]h3]uh6Mh7hh8]rQhHXP<@lsblakk> bbtest: force build runtests test build < bbtest> build #2 of runtests started, including [] < bbtest> build forced [ETA 0 seconds] < bbtest> I'll give a shout when the build finishes < bbtest> build #2 of runtests is complete: Success [build successful] Build details are at http://localhost:8010/builders/runtests/builds/2rRrS}rT(hUhjNubaubh[)rU}rV(hX5You can also see the new builds in the web interface.rWhjgh!h$h+h^h-}rX(h1]h2]h0]h/]h3]uh6M h7hh8]rYhHX5You can also see the new builds in the web interface.rZr[}r\(hjWhjUubaubj+)r]}r^(hXU.. image:: _images/irc-testrun.png :alt: a successful test run from IRC happened. hjgh!h$h+j.h-}r_(UuriX tutorial/_images/irc-testrun.pngr`h/]h0]h1]h2]j1}raU*j`sh3]Ualth"X(a successful test run from IRC happened.rbrc}rdbuh6Nh7hh8]ubeubh)re}rf(hUhhh!h$h+h9h-}rg(h1]h2]h0]h/]rhUsetting-authorized-web-usersriah3]rjh auh6Mh7hh8]rk(hA)rl}rm(hXSetting Authorized Web Usersrnhjeh!h$h+hEh-}ro(h1]h2]h0]h/]h3]uh6Mh7hh8]rphHXSetting Authorized Web Usersrqrr}rs(hjnhjlubaubh[)rt}ru(hX4Further down, look for the WebStatus configuration::rvhjeh!h$h+h^h-}rw(h1]h2]h0]h/]h3]uh6Mh7hh8]rxhHX3Further down, look for the WebStatus configuration:ryrz}r{(hX3Further down, look for the WebStatus configuration:hjtubaubj9)r|}r}(hX1c['status'] = [] from buildbot.status import html from buildbot.status.web import authz, auth authz_cfg=authz.Authz( # change any of these to True to enable; see the manual for more # options auth=auth.BasicAuth([("pyflakes","pyflakes")]), gracefulShutdown = False, forceBuild = 'auth', # use this to test your slave once it is set up forceAllBuilds = False, pingBuilder = False, stopBuild = False, stopAllBuilds = False, cancelPendingBuild = False, ) c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))hjeh!h$h+j<h-}r~(j@jAh/]h0]h1]h2]h3]uh6Mh7hh8]rhHX1c['status'] = [] from buildbot.status import html from buildbot.status.web import authz, auth authz_cfg=authz.Authz( # change any of these to True to enable; see the manual for more # options auth=auth.BasicAuth([("pyflakes","pyflakes")]), gracefulShutdown = False, forceBuild = 'auth', # use this to test your slave once it is set up forceAllBuilds = False, pingBuilder = False, stopBuild = False, stopAllBuilds = False, cancelPendingBuild = False, ) c['status'].append(html.WebStatus(http_port=8010, authz=authz_cfg))rr}r(hUhj|ubaubh[)r}r(hXThe ``auth.BasicAuth()`` define authorized users and their passwords. You can change these or add new ones. See :bb:status:`WebStatus` for more about the WebStatus configuration.hjeh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M(h7hh8]r(hHXThe rr}r(hXThe hjubj-)r}r(hX``auth.BasicAuth()``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHXauth.BasicAuth()rr}r(hUhjubah+j5ubhHXZ define authorized users and their passwords. You can change these or add new ones. See rr}r(hXZ define authorized users and their passwords. You can change these or add new ones. See hjubhd)r}r(hX:bb:status:`WebStatus`rhjh!h$h+hhh-}r(UreftypeXstatushjhkX WebStatusU refdomainXbbrh/]h0]U refexplicith1]h2]h3]hmhnuh6M(h8]rj-)r}r(hjh-}r(h1]h2]r(hujX bb-statusreh0]h/]h3]uhjh8]rhHX WebStatusrr}r(hUhjubah+j5ubaubhHX, for more about the WebStatus configuration.rr}r(hX, for more about the WebStatus configuration.hjubeubeubh)r}r(hUhhh!h$h+h9h-}r(h1]h2]h0]h/]rUdebugging-with-manholerah3]rhauh6M-h7hh8]r(hA)r}r(hXDebugging with Manholerhjh!h$h+hEh-}r(h1]h2]h0]h/]h3]uh6M-h7hh8]rhHXDebugging with Manholerr}r(hjhjubaubh[)r}r(hXYou can do some debugging by using manhole, an interactive Python shell. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M/h7hh8]rhHXYou can do some debugging by using manhole, an interactive Python shell. It exposes full access to the buildmaster's account (including the ability to modify and delete files), so it should not be enabled with a weak or easily guessable password.rr}r(hjhjubaubh[)r}r(hXUTo use this you will need to install an additional package or two to your virtualenv:rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M4h7hh8]rhHXUTo use this you will need to install an additional package or two to your virtualenv:rr}r(hjhjubaubj9)r}r(hXXcd cd tmp/buildbot source sandbox/bin/activate easy_install pycrypto easy_install pyasn1hjh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6M6h7hh8]rhHXXcd cd tmp/buildbot source sandbox/bin/activate easy_install pycrypto easy_install pyasn1rr}r(hUhjubaubh[)r}r(hXIn your master.cfg find::rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M>h7hh8]rhHXIn your master.cfg find:rr}r(hXIn your master.cfg find:hjubaubj9)r}r(hXc = BuildmasterConfig = {}hjh!h$h+j<h-}r(j@jAh/]h0]h1]h2]h3]uh6M@h7hh8]rhHXc = BuildmasterConfig = {}rr}r(hUhjubaubh[)r}r(hX<Insert the following to enable debugging mode with manhole::rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6MBh7hh8]rhHX;Insert the following to enable debugging mode with manhole:rr}r(hX;Insert the following to enable debugging mode with manhole:hjubaubj9)r}r(hX####### DEBUGGING from buildbot import manhole c['manhole'] = manhole.PasswordManhole("tcp:1234:interface=127.0.0.1","admin","passwd")hjh!h$h+j<h-}r(j@jAh/]h0]h1]h2]h3]uh6MDh7hh8]rhHX####### DEBUGGING from buildbot import manhole c['manhole'] = manhole.PasswordManhole("tcp:1234:interface=127.0.0.1","admin","passwd")rr}r(hUhjubaubh[)r}r(hX]After restarting the master, you can ssh into the master and get an interactive Python shell:rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6MHh7hh8]rhHX]After restarting the master, you can ssh into the master and get an interactive Python shell:rr}r(hjhjubaubj9)r}r(hX3ssh -p1234 admin@127.0.0.1 # enter passwd at prompthjh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6MJh7hh8]rhHX3ssh -p1234 admin@127.0.0.1 # enter passwd at promptrr}r(hUhjubaubcdocutils.nodes note r)r}r(hX;The pyasn1-0.1.1 release has a bug which results in an exception similar to this on startup: .. code-block:: none exceptions.TypeError: argument 2 must be long, not int If you see this, the temporary solution is to install the previous version of pyasn1: .. code-block:: bash pip install pyasn1-0.0.13bhjh!Nh+Unoterh-}r(h1]h2]h0]h/]h3]uh6Nh7hh8]r(h[)r}r(hX\The pyasn1-0.1.1 release has a bug which results in an exception similar to this on startup:rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6MPh8]rhHX\The pyasn1-0.1.1 release has a bug which results in an exception similar to this on startup:rr}r(hjhjubaubj9)r}r(hX6exceptions.TypeError: argument 2 must be long, not inthjh!h$h+j<h-}r (j>j?Xnonej@jAh/]h0]h1]h2]h3]uh6MSh8]r hHX6exceptions.TypeError: argument 2 must be long, not intr r }r (hUhjubaubh[)r}r(hXUIf you see this, the temporary solution is to install the previous version of pyasn1:rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6MWh8]rhHXUIf you see this, the temporary solution is to install the previous version of pyasn1:rr}r(hjhjubaubj9)r}r(hXpip install pyasn1-0.0.13bhjh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6MZh8]rhHXpip install pyasn1-0.0.13brr}r(hUhjubaubeubh[)r}r(hXoIf you wanted to check which slaves are connected and what builders those slaves are assigned to you could do::rhjh!h$h+h^h-}r (h1]h2]h0]h/]h3]uh6M^h7hh8]r!hHXnIf you wanted to check which slaves are connected and what builders those slaves are assigned to you could do:r"r#}r$(hXnIf you wanted to check which slaves are connected and what builders those slaves are assigned to you could do:hjubaubj9)r%}r&(hXg>>> master.botmaster.slaves {'example-slave': }hjh!h$h+j<h-}r'(j@jAh/]h0]h1]h2]h3]uh6M`h7hh8]r(hHXg>>> master.botmaster.slaves {'example-slave': }r)r*}r+(hUhj%ubaubh[)r,}r-(hXVObjects can be explored in more depth using `dir(x)` or the helper function `show(x)`.hjh!h$h+h^h-}r.(h1]h2]h0]h/]h3]uh6Mch7hh8]r/(hHX,Objects can be explored in more depth using r0r1}r2(hX,Objects can be explored in more depth using hj,ubcdocutils.nodes title_reference r3)r4}r5(hX`dir(x)`h-}r6(h1]h2]h0]h/]h3]uhj,h8]r7hHXdir(x)r8r9}r:(hUhj4ubah+Utitle_referencer;ubhHX or the helper function r<r=}r>(hX or the helper function hj,ubj3)r?}r@(hX `show(x)`h-}rA(h1]h2]h0]h/]h3]uhj,h8]rBhHXshow(x)rCrD}rE(hUhj?ubah+j;ubhHX.rF}rG(hX.hj,ubeubeubheubh!h$h+h9h-}rH(h1]h2]h0]h/]rIUadding-a-try-schedulerrJah3]rKhauh6Mgh7hh8]rL(hA)rM}rN(hXAdding a 'try' schedulerrOhhh!h$h+hEh-}rP(h1]h2]h0]h/]h3]uh6Mgh7hh8]rQhHXAdding a 'try' schedulerrRrS}rT(hjOhjMubaubh[)rU}rV(hXBuildbot includes a way for developers to submit patches for testing without committing them to the source code control system. (This is really handy for projects that support several operating systems or architectures.)rWhhh!h$h+h^h-}rX(h1]h2]h0]h/]h3]uh6Mih7hh8]rYhHXBuildbot includes a way for developers to submit patches for testing without committing them to the source code control system. (This is really handy for projects that support several operating systems or architectures.)rZr[}r\(hjWhjUubaubh[)r]}r^(hX7To set this up, add the following lines to master.cfg::r_hhh!h$h+h^h-}r`(h1]h2]h0]h/]h3]uh6Mmh7hh8]rahHX6To set this up, add the following lines to master.cfg:rbrc}rd(hX6To set this up, add the following lines to master.cfg:hj]ubaubj9)re}rf(hX;from buildbot.scheduler import Try_Userpass c['schedulers'].append(Try_Userpass( name='try', builderNames=['runtests'], port=5555, userpass=[('sampleuser','samplepass')]))hhh!h$h+j<h-}rg(j@jAh/]h0]h1]h2]h3]uh6Moh7hh8]rhhHX;from buildbot.scheduler import Try_Userpass c['schedulers'].append(Try_Userpass( name='try', builderNames=['runtests'], port=5555, userpass=[('sampleuser','samplepass')]))rirj}rk(hUhjeubaubh[)rl}rm(hX@Then you can submit changes using the :bb:cmdline:`try` command.rnhhh!h$h+h^h-}ro(h1]h2]h0]h/]h3]uh6Mvh7hh8]rp(hHX&Then you can submit changes using the rqrr}rs(hX&Then you can submit changes using the hjlubhd)rt}ru(hX:bb:cmdline:`try`rvhjlh!h$h+hhh-}rw(UreftypeXcmdlinehjhkXtryU refdomainXbbrxh/]h0]U refexplicith1]h2]h3]hmhnuh6Mvh8]ryj-)rz}r{(hjvh-}r|(h1]h2]r}(hujxX bb-cmdliner~eh0]h/]h3]uhjth8]rhHXtryrr}r(hUhjzubah+j5ubaubhHX command.rr}r(hX command.hjlubeubh[)r}r(hXfLet's try this out by making a one-line change to pyflakes, say, to make it trace the tree by default:rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mxh7hh8]rhHXfLet's try this out by making a one-line change to pyflakes, say, to make it trace the tree by default:rr}r(hjhjubaubj9)r}r(hXgit clone git://github.com/buildbot/pyflakes.git pyflakes-git cd pyflakes-git/pyflakes $EDITOR checker.py # change "traceTree = False" on line 185 to "traceTree = True"hhh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6M{h7hh8]rhHXgit clone git://github.com/buildbot/pyflakes.git pyflakes-git cd pyflakes-git/pyflakes $EDITOR checker.py # change "traceTree = False" on line 185 to "traceTree = True"rr}r(hUhjubaubh[)r}r(hX/Then run buildbot's ``try`` command as follows:rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]r(hHXThen run buildbot's rr}r(hXThen run buildbot's hjubj-)r}r(hX``try``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHXtryrr}r(hUhjubah+j5ubhHX command as follows:rr}r(hX command as follows:hjubeubj9)r}r(hXsource ~/tmp/buildbot/sandbox/bin/activate buildbot try --connect=pb --master=127.0.0.1:5555 --username=sampleuser --passwd=samplepass --vc=githhh!h$h+j<h-}r(j>j?Xbashj@jAh/]h0]h1]h2]h3]uh6Mh7hh8]rhHXsource ~/tmp/buildbot/sandbox/bin/activate buildbot try --connect=pb --master=127.0.0.1:5555 --username=sampleuser --passwd=samplepass --vc=gitrr}r(hUhjubaubh[)r}r(hXThis will do ``git diff`` for you and send the resulting patch to the server for build and test against the latest sources from Git.hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]r(hHX This will do rr}r(hX This will do hjubj-)r}r(hX ``git diff``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHXgit diffrr}r(hUhjubah+j5ubhHXk for you and send the resulting patch to the server for build and test against the latest sources from Git.rr}r(hXk for you and send the resulting patch to the server for build and test against the latest sources from Git.hjubeubh[)r}r(hX_Now go back to the `waterfall `_ page, click on the runtests link, and scroll down. You should see that another build has been started with your change (and stdout for the tests should be chock-full of parse trees as a result). The "Reason" for the job will be listed as "'try' job", and the blamelist will be empty.hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]r(hHXNow go back to the rr}r(hXNow go back to the hjubj)r}r(hX.`waterfall `_h-}r(UnameX waterfallrjXhttp://localhost:8010/waterfallrh/]h0]h1]h2]h3]uhjh8]rhHX waterfallrr}r(hUhjubah+jubh()r}r(hX" jKhjh+h,h-}r(Urefurijh/]rUid1rah0]h1]rjah2]h3]uh8]ubhHX page, click on the runtests link, and scroll down. You should see that another build has been started with your change (and stdout for the tests should be chock-full of parse trees as a result). The "Reason" for the job will be listed as "'try' job", and the blamelist will be empty.rr}r(hX page, click on the runtests link, and scroll down. You should see that another build has been started with your change (and stdout for the tests should be chock-full of parse trees as a result). The "Reason" for the job will be listed as "'try' job", and the blamelist will be empty.hjubeubh[)r}r(hXTo make yourself show up as the author of the change, use the ``--who=emailaddr`` option on ``buildbot try`` to pass your email address.hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]r(hHX>To make yourself show up as the author of the change, use the rr}r(hX>To make yourself show up as the author of the change, use the hjubj-)r}r(hX``--who=emailaddr``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHX--who=emailaddrrr}r(hUhjubah+j5ubhHX option on rr}r(hX option on hjubj-)r}r(hX``buildbot try``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHX buildbot tryrr}r(hUhjubah+j5ubhHX to pass your email address.rr}r(hX to pass your email address.hjubeubh[)r}r(hX}To make a description of the change show up, use the ``--properties=comment="this is a comment"`` option on ``buildbot try``.hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]r(hHX5To make a description of the change show up, use the rr}r(hX5To make a description of the change show up, use the hjubj-)r}r(hX,``--properties=comment="this is a comment"``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHX(--properties=comment="this is a comment"rr}r(hUhjubah+j5ubhHX option on rr}r(hX option on hjubj-)r}r(hX``buildbot try``h-}r(h1]h2]h0]h/]h3]uhjh8]rhHX buildbot tryrr }r (hUhjubah+j5ubhHX.r }r (hX.hjubeubh[)r }r(hXWTo use ssh instead of a private username/password database, see :bb:sched:`Try_Jobdir`.hhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]r(hHX@To use ssh instead of a private username/password database, see rr}r(hX@To use ssh instead of a private username/password database, see hj ubhd)r}r(hX:bb:sched:`Try_Jobdir`rhj h!h$h+hhh-}r(UreftypeXschedhjhkX Try_JobdirU refdomainXbbrh/]h0]U refexplicith1]h2]h3]hmhnuh6Mh8]rj-)r}r(hjh-}r(h1]h2]r(hujXbb-schedreh0]h/]h3]uhjh8]rhHX Try_Jobdirr r!}r"(hUhjubah+j5ubaubhHX.r#}r$(hX.hj ubeubeubh!h$h+Usystem_messager%h-}r&(h1]UlevelKh/]h0]r'jaUsourceh$h2]h3]UlineKUtypeUINFOr(uh6Mh7hh8]r)h[)r*}r+(hUh-}r,(h1]h2]h0]h/]h3]uhhh8]r-hHX,Duplicate explicit target name: "waterfall".r.r/}r0(hUhj*ubah+h^ubaubaUcurrent_sourcer1NU decorationr2NUautofootnote_startr3KUnameidsr4}r5(hjJhjShh5h jh jh hh jih jhj&hjhjkhh]r?Usymbol_footnote_refsr@]rAU citationsrB]rCh7hU current_linerDNUtransform_messagesrE]rFh)rG}rH(hUh-}rI(h1]UlevelKh/]h0]Usourceh$h2]h3]UlineKUtypej(uh8]rJh[)rK}rL(hUh-}rM(h1]h2]h0]h/]h3]uhjGh8]rNhHX6Hyperlink target "quick-tour-label" is not referenced.rOrP}rQ(hUhjKubah+h^ubah+j%ubaUreporterrRNUid_startrSKU autofootnotesrT]rUU citation_refsrV}rWUindirect_targetsrX]rYUsettingsrZ(cdocutils.frontend Values r[or\}r](Ufootnote_backlinksr^KUrecord_dependenciesr_NU rfc_base_urlr`Uhttp://tools.ietf.org/html/raU tracebackrbUpep_referencesrcNUstrip_commentsrdNU toc_backlinksreUentryrfU language_codergUenrhU datestampriNU report_levelrjKU _destinationrkNU halt_levelrlKU strip_classesrmNhENUerror_encoding_error_handlerrnUbackslashreplaceroUdebugrpNUembed_stylesheetrqUoutput_encoding_error_handlerrrUstrictrsU sectnum_xformrtKUdump_transformsruNU docinfo_xformrvKUwarning_streamrwNUpep_file_url_templaterxUpep-%04dryUexit_status_levelrzKUconfigr{NUstrict_visitorr|NUcloak_email_addressesr}Utrim_footnote_reference_spacer~UenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUN/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/tour.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjsUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhjJhh5hjjjjj&j"jjjjjSjOh}q?(hh9hh7ubaubcdocutils.nodes compound q@)qA}qB(hUhhhhhUcompoundqCh}qD(h!]h"]qEUtoctree-wrapperqFah#]h$]h&]uh(Nh)hh]qGcsphinx.addnodes toctree qH)qI}qJ(hUhhAhhhUtoctreeqKh}qL(UnumberedqMKU includehiddenqNhXtutorial/furtherqOU titlesonlyqPUglobqQh$]h#]h!]h"]h&]UentriesqR]qSNXtutorial/fiveminutesqTqUaUhiddenqVU includefilesqW]qXhTaUmaxdepthqYKuh(Kh]ubaubeubahUU transformerqZNU footnote_refsq[}q\Urefnamesq]}q^Usymbol_footnotesq_]q`Uautofootnote_refsqa]qbUsymbol_footnote_refsqc]qdU citationsqe]qfh)hU current_lineqgNUtransform_messagesqh]qiUreporterqjNUid_startqkKU autofootnotesql]qmU citation_refsqn}qoUindirect_targetsqp]qqUsettingsqr(cdocutils.frontend Values qsoqt}qu(Ufootnote_backlinksqvKUrecord_dependenciesqwNU rfc_base_urlqxUhttp://tools.ietf.org/html/qyU tracebackqzUpep_referencesq{NUstrip_commentsq|NU toc_backlinksq}Uentryq~U language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh/NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqUtrim_footnote_reference_spaceqUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/further.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}qhhsUsubstitution_namesq}qhh)h}q(h!]h$]h#]Usourcehh"]h&]uU footnotesq]qUrefidsq}qub.PK7DfF6buildbot-v0.8.9/.doctrees/tutorial/fiveminutes.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X fiveminutesqX schedulersqNX3buildbot in 5 minutes - a user-contributed tutorialqNXchange sourcesq NXbuilders: the workhorsesq NX installationq NXstatus targetsq NX conclusionq NuUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hU fiveminutesqhU schedulersqhU1buildbot-in-5-minutes-a-user-contributed-tutorialqh Uchange-sourcesqh Ubuilders-the-workhorsesqh U installationqh Ustatus-targetsqh U conclusionquUchildrenq]q (cdocutils.nodes target q!)q"}q#(U rawsourceq$X.. _fiveminutes:Uparentq%hUsourceq&cdocutils.nodes reprunicode q'XU/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/fiveminutes.rstq(q)}q*bUtagnameq+Utargetq,U attributesq-}q.(Uidsq/]Ubackrefsq0]Udupnamesq1]Uclassesq2]Unamesq3]Urefidq4huUlineq5KUdocumentq6hh]ubcdocutils.nodes section q7)q8}q9(h$Uh%hh&h)Uexpect_referenced_by_nameq:}q;hh"sh+Usectionq(hheh3]q?(hheuh5Kh6hUexpect_referenced_by_idq@}qAhh"sh]qB(cdocutils.nodes title qC)qD}qE(h$X3Buildbot in 5 minutes - a user-contributed tutorialqFh%h8h&h)h+UtitleqGh-}qH(h1]h2]h0]h/]h3]uh5Kh6hh]qIcdocutils.nodes Text qJX3Buildbot in 5 minutes - a user-contributed tutorialqKqL}qM(h$hFh%hDubaubcdocutils.nodes paragraph qN)qO}qP(h$X(Ok, maybe 10.)qQh%h8h&h)h+U paragraphqRh-}qS(h1]h2]h0]h/]h3]uh5Kh6hh]qThJX(Ok, maybe 10.)qUqV}qW(h$hQh%hOubaubhN)qX}qY(h$X"Buildbot is really an excellent piece of software, however it can be a bit confusing for a newcomer (like me when I first started looking at it). Typically, at first sight it looks like a bunch of complicated concepts that make no sense and whose relationships with each other are unclear. After some time and some reread, it all slowly starts to be more and more meaningful, until you finally say "oh!" and things start to make sense. Once you get there, you realize that the documentation is great, but only if you already know what it's about.qZh%h8h&h)h+hRh-}q[(h1]h2]h0]h/]h3]uh5K h6hh]q\hJX"Buildbot is really an excellent piece of software, however it can be a bit confusing for a newcomer (like me when I first started looking at it). Typically, at first sight it looks like a bunch of complicated concepts that make no sense and whose relationships with each other are unclear. After some time and some reread, it all slowly starts to be more and more meaningful, until you finally say "oh!" and things start to make sense. Once you get there, you realize that the documentation is great, but only if you already know what it's about.q]q^}q_(h$hZh%hXubaubhN)q`}qa(h$X1This is what happened to me, at least. Here I'm going to (try to) explain things in a way that would have helped me more as a newcomer. The approach I'm taking is more or less the reverse of that used by the documentation, that is, I'm going to start from the components that do the actual work (the builders) and go up the chain from there up to change sources. I hope purists will forgive this unorthodoxy. Here I'm trying to clarify the concepts only, and will not go into the details of each object or property; the documentation explains those quite well.qbh%h8h&h)h+hRh-}qc(h1]h2]h0]h/]h3]uh5Kh6hh]qdhJX1This is what happened to me, at least. Here I'm going to (try to) explain things in a way that would have helped me more as a newcomer. The approach I'm taking is more or less the reverse of that used by the documentation, that is, I'm going to start from the components that do the actual work (the builders) and go up the chain from there up to change sources. I hope purists will forgive this unorthodoxy. Here I'm trying to clarify the concepts only, and will not go into the details of each object or property; the documentation explains those quite well.qeqf}qg(h$hbh%h`ubaubh7)qh}qi(h$Uh%h8h&h)h+h}r?(h$X and h%jubh)r@}rA(h$X ``slave3``h-}rB(h1]h2]h0]h/]h3]uh%jh]rChJXslave3rDrE}rF(h$Uh%j@ubah+hubhJX. If our repository has other branches besides trunk, we could create another one or more builders to build them; in the example, only the checkout step would be different, in that it would need to check out the specific branch. Depending on how exactly those branches have to be built, the shell commands may be recycled, or new ones would have to be created if they are different in the branch. You get the idea. The important thing is that all the builders be named differently and all be added to the rGrH}rI(h$X. If our repository has other branches besides trunk, we could create another one or more builders to build them; in the example, only the checkout step would be different, in that it would need to check out the specific branch. Depending on how exactly those branches have to be built, the shell commands may be recycled, or new ones would have to be created if they are different in the branch. You get the idea. The important thing is that all the builders be named differently and all be added to the h%jubh)rJ}rK(h$X``c['builders']``h-}rL(h1]h2]h0]h/]h3]uh%jh]rMhJX c['builders']rNrO}rP(h$Uh%jJubah+hubhJX. value (as can be seen above, it is a list of rQrR}rS(h$X. value (as can be seen above, it is a list of h%jubh)rT}rU(h$X``BuilderConfig``h-}rV(h1]h2]h0]h/]h3]uh%jh]rWhJX BuilderConfigrXrY}rZ(h$Uh%jTubah+hubhJX objects).r[r\}r](h$X objects).h%jubeubhN)r^}r_(h$XNOf course the type and number of steps will vary depending on the goal; for example, to just check that a commit doesn't break the build, we could include just up to the ``make all`` step. Or we could have a builder that performs a more thorough test by also doing ``make test`` or other targets. You get the idea. Note that at each step except the very first we use ``haltOnFailure = True`` because it would not make sense to execute a step if the previous one failed (ok, it wouldn't be needed for the last step, but it's harmless and protects us if one day we add another step after it).h%hh&h)h+hRh-}r`(h1]h2]h0]h/]h3]uh5Kh6hh]ra(hJXOf course the type and number of steps will vary depending on the goal; for example, to just check that a commit doesn't break the build, we could include just up to the rbrc}rd(h$XOf course the type and number of steps will vary depending on the goal; for example, to just check that a commit doesn't break the build, we could include just up to the h%j^ubh)re}rf(h$X ``make all``h-}rg(h1]h2]h0]h/]h3]uh%j^h]rhhJXmake allrirj}rk(h$Uh%jeubah+hubhJXS step. Or we could have a builder that performs a more thorough test by also doing rlrm}rn(h$XS step. Or we could have a builder that performs a more thorough test by also doing h%j^ubh)ro}rp(h$X ``make test``h-}rq(h1]h2]h0]h/]h3]uh%j^h]rrhJX make testrsrt}ru(h$Uh%joubah+hubhJXY or other targets. You get the idea. Note that at each step except the very first we use rvrw}rx(h$XY or other targets. You get the idea. Note that at each step except the very first we use h%j^ubh)ry}rz(h$X``haltOnFailure = True``h-}r{(h1]h2]h0]h/]h3]uh%j^h]r|hJXhaltOnFailure = Truer}r~}r(h$Uh%jyubah+hubhJX because it would not make sense to execute a step if the previous one failed (ok, it wouldn't be needed for the last step, but it's harmless and protects us if one day we add another step after it).rr}r(h$X because it would not make sense to execute a step if the previous one failed (ok, it wouldn't be needed for the last step, but it's harmless and protects us if one day we add another step after it).h%j^ubeubeubh7)r}r(h$Uh%h8h&h)h+h(hC)r?}r@(h$XChange sourcesrAh%j9h&h)h+hGh-}rB(h1]h2]h0]h/]h3]uh5Mh6hh]rChJXChange sourcesrDrE}rF(h$jAh%j?ubaubhN)rG}rH(h$XEarlier we said that a dynamic scheduler "magically" learns about changes; the final piece of the puzzle are `change sources`, which are precisely the elements in buildbot whose task is to detect changes in the repository and communicate them to the schedulers. Note that periodic schedulers don't need a change source, since they only depend on elapsed time; dynamic schedulers, on the other hand, do need a change source.h%j9h&h)h+hRh-}rI(h1]h2]h0]h/]h3]uh5Mh6hh]rJ(hJXmEarlier we said that a dynamic scheduler "magically" learns about changes; the final piece of the puzzle are rKrL}rM(h$XmEarlier we said that a dynamic scheduler "magically" learns about changes; the final piece of the puzzle are h%jGubh)rN}rO(h$X`change sources`h-}rP(h1]h2]h0]h/]h3]uh%jGh]rQhJXchange sourcesrRrS}rT(h$Uh%jNubah+hubhJX*, which are precisely the elements in buildbot whose task is to detect changes in the repository and communicate them to the schedulers. Note that periodic schedulers don't need a change source, since they only depend on elapsed time; dynamic schedulers, on the other hand, do need a change source.rUrV}rW(h$X*, which are precisely the elements in buildbot whose task is to detect changes in the repository and communicate them to the schedulers. Note that periodic schedulers don't need a change source, since they only depend on elapsed time; dynamic schedulers, on the other hand, do need a change source.h%jGubeubhN)rX}rY(h$XA change source is generally configured with information about a source repository (which is where changes happen); a change source can watch changes at different levels in the hierarchy of the repository, so for example it is possible to watch the whole repository or a subset of it, or just a single branch. This determines the extent of the information that is passed down to the schedulers.rZh%j9h&h)h+hRh-}r[(h1]h2]h0]h/]h3]uh5Mh6hh]r\hJXA change source is generally configured with information about a source repository (which is where changes happen); a change source can watch changes at different levels in the hierarchy of the repository, so for example it is possible to watch the whole repository or a subset of it, or just a single branch. This determines the extent of the information that is passed down to the schedulers.r]r^}r_(h$jZh%jXubaubhN)r`}ra(h$X There are many ways a change source can learn about changes; it can periodically poll the repository for changes, or the VCS can be configured (for example through hook scripts triggered by commits) to push changes into the change source. While these two methods are probably the most common, they are not the only possibilities; it is possible for example to have a change source detect changes by parsing some email sent to a mailing list when a commit happen, and yet other methods exist. The manual again has the details.rbh%j9h&h)h+hRh-}rc(h1]h2]h0]h/]h3]uh5M h6hh]rdhJX There are many ways a change source can learn about changes; it can periodically poll the repository for changes, or the VCS can be configured (for example through hook scripts triggered by commits) to push changes into the change source. While these two methods are probably the most common, they are not the only possibilities; it is possible for example to have a change source detect changes by parsing some email sent to a mailing list when a commit happen, and yet other methods exist. The manual again has the details.rerf}rg(h$jbh%j`ubaubhN)rh}ri(h$X]To complete our example, here's a change source that polls a SVN repository every 2 minutes::h%j9h&h)h+hRh-}rj(h1]h2]h0]h/]h3]uh5M)h6hh]rkhJX\To complete our example, here's a change source that polls a SVN repository every 2 minutes:rlrm}rn(h$X\To complete our example, here's a change source that polls a SVN repository every 2 minutes:h%jhubaubh)ro}rp(h$X\from buildbot.changes.svnpoller import SVNPoller, split_file_branches svnpoller = SVNPoller(svnurl = "svn://myrepo/projects/coolproject", svnuser = "foo", svnpasswd = "bar", pollinterval = 120, split_file = split_file_branches) c['change_source'] = svnpollerh%j9h&h)h+hh-}rq(hjh/]h0]h1]h2]h3]uh5M,h6hh]rrhJX\from buildbot.changes.svnpoller import SVNPoller, split_file_branches svnpoller = SVNPoller(svnurl = "svn://myrepo/projects/coolproject", svnuser = "foo", svnpasswd = "bar", pollinterval = 120, split_file = split_file_branches) c['change_source'] = svnpollerrsrt}ru(h$Uh%joubaubhN)rv}rw(h$XThis poller watches the whole "coolproject" section of the repository, so it will detect changes in all the branches. We could have saidrxh%j9h&h)h+hRh-}ry(h1]h2]h0]h/]h3]uh5M6h6hh]rzhJXThis poller watches the whole "coolproject" section of the repository, so it will detect changes in all the branches. We could have saidr{r|}r}(h$jxh%jvubaubcdocutils.nodes block_quote r~)r}r(h$Uh%j9h&h)h+U block_quoterh-}r(h1]h2]h0]h/]h3]uh5Nh6hh]rhN)r}r(h$X2svnurl = "svn://myrepo/projects/coolproject/trunk"rh%jh&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5M9h]rhJX2svnurl = "svn://myrepo/projects/coolproject/trunk"rr}r(h$jh%jubaubaubhN)r}r(h$Xorrh%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5M;h6hh]rhJXorrr}r(h$jh%jubaubj~)r}r(h$Uh%j9h&h)h+jh-}r(h1]h2]h0]h/]h3]uh5Nh6hh]rhN)r}r(h$X9svnurl = "svn://myrepo/projects/coolproject/branches/7.2"rh%jh&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5M=h]rhJX9svnurl = "svn://myrepo/projects/coolproject/branches/7.2"rr}r(h$jh%jubaubaubhN)r}r(h$X to watch only a specific branch.rh%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5M?h6hh]rhJX to watch only a specific branch.rr}r(h$jh%jubaubhN)r}r(h$XTo watch another project, you need to create another change source -- and you need to filter changes by project. For instance, when you add a change source watching project 'superproject' to the above example, you need to change::h%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5MAh6hh]rhJXTo watch another project, you need to create another change source -- and you need to filter changes by project. For instance, when you add a change source watching project 'superproject' to the above example, you need to change:rr}r(h$XTo watch another project, you need to create another change source -- and you need to filter changes by project. For instance, when you add a change source watching project 'superproject' to the above example, you need to change:h%jubaubh)r}r(h$Xtrunkchanged = SingleBranchScheduler(name = "trunkchanged", change_filter = filter.ChangeFilter(branch = None), # ... )h%j9h&h)h+hh-}r(hjh/]h0]h1]h2]h3]uh5MFh6hh]rhJXtrunkchanged = SingleBranchScheduler(name = "trunkchanged", change_filter = filter.ChangeFilter(branch = None), # ... )rr}r(h$Uh%jubaubhN)r}r(h$X to e.g.::rh%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5MKh6hh]rhJXto e.g.:rr}r(h$Xto e.g.:h%jubaubh)r}r(h$Xtrunkchanged = SingleBranchScheduler(name = "trunkchanged", change_filter = filter.ChangeFilter(project = "coolproject", branch = None), # ... )h%j9h&h)h+hh-}r(hjh/]h0]h1]h2]h3]uh5MMh6hh]rhJXtrunkchanged = SingleBranchScheduler(name = "trunkchanged", change_filter = filter.ChangeFilter(project = "coolproject", branch = None), # ... )rr}r(h$Uh%jubaubhN)r}r(h$XEelse coolproject will be built when there's a change in superproject.rh%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5MRh6hh]rhJXEelse coolproject will be built when there's a change in superproject.rr}r(h$jh%jubaubhN)r}r(h$XjSince we're watching more than one branch, we need a method to tell in which branch the change occurred when we detect one. This is what the split_file argument does, it takes a callable that buildbot will call to do the job. The split_file_branches function, which comes with buildbot, is designed for exactly this purpose so that's what the example above uses.rh%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5MTh6hh]rhJXjSince we're watching more than one branch, we need a method to tell in which branch the change occurred when we detect one. This is what the split_file argument does, it takes a callable that buildbot will call to do the job. The split_file_branches function, which comes with buildbot, is designed for exactly this purpose so that's what the example above uses.rr}r(h$jh%jubaubhN)r}r(h$XWAnd of course this is all SVN-specific, but there are pollers for all the popular VCSs.rh%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5M[h6hh]rhJXWAnd of course this is all SVN-specific, but there are pollers for all the popular VCSs.rr}r(h$jh%jubaubhN)r}r(h$XBut note: if you have many projects, branches, and builders it probably pays to not hardcode all the schedulers and builders in the configuration, but generate them dynamically starting from list of all projects, branches, targets etc. and using loops to generate all possible combinations (or only the needed ones, depending on the specific setup), as explained in the documentation chapter about :ref:`Customization`.h%j9h&h)h+hRh-}r(h1]h2]h0]h/]h3]uh5M^h6hh]r(hJXBut note: if you have many projects, branches, and builders it probably pays to not hardcode all the schedulers and builders in the configuration, but generate them dynamically starting from list of all projects, branches, targets etc. and using loops to generate all possible combinations (or only the needed ones, depending on the specific setup), as explained in the documentation chapter about rr}r(h$XBut note: if you have many projects, branches, and builders it probably pays to not hardcode all the schedulers and builders in the configuration, but generate them dynamically starting from list of all projects, branches, targets etc. and using loops to generate all possible combinations (or only the needed ones, depending on the specific setup), as explained in the documentation chapter about h%jubcsphinx.addnodes pending_xref r)r}r(h$X:ref:`Customization`rh%jh&h)h+U pending_xrefrh-}r(UreftypeXrefUrefwarnrU reftargetrX customizationU refdomainXstdrh/]h0]U refexplicith1]h2]h3]UrefdocrXtutorial/fiveminutesruh5M^h]rcdocutils.nodes emphasis r)r}r(h$jh-}r(h1]h2]r(UxrefrjXstd-refreh0]h/]h3]uh%jh]rhJX Customizationrr}r(h$Uh%jubah+UemphasisrubaubhJX.r}r(h$X.h%jubeubeubh7)r}r(h$Uh%h8h&h)h+h(h1]h2]h0]h/]h3]uh%j5h]r?hJXmessageFormatterr@rA}rB(h$Uh%j<ubah+hubhJX argument, which is a function that buildbot calls to format the body of the email, and to which it makes available lots of information about the build. Here all the details.rCrD}rE(h$X argument, which is a function that buildbot calls to format the body of the email, and to which it makes available lots of information about the build. Here all the details.h%j5ubeubeubh7)rF}rG(h$Uh%h8h&h)h+h}q?(hh9hh7ubaubcdocutils.nodes compound q@)qA}qB(hUhhhhhUcompoundqCh}qD(h!]h"]qEUtoctree-wrapperqFah#]h$]h&]uh(Nh)hh]qGcsphinx.addnodes toctree qH)qI}qJ(hUhhAhhhUtoctreeqKh}qL(UnumberedqMKU includehiddenqNhXtutorial/indexqOU titlesonlyqPUglobqQh$]h#]h!]h"]h&]UentriesqR]qS(NXtutorial/firstrunqTqUNXtutorial/dockerqVqWNX tutorial/tourqXqYNXtutorial/furtherqZq[eUhiddenq\U includefilesq]]q^(hThVhXhZeUmaxdepthq_Kuh(Kh]ubaubeubahUU transformerq`NU footnote_refsqa}qbUrefnamesqc}qdUsymbol_footnotesqe]qfUautofootnote_refsqg]qhUsymbol_footnote_refsqi]qjU citationsqk]qlh)hU current_lineqmNUtransform_messagesqn]qoUreporterqpNUid_startqqKU autofootnotesqr]qsU citation_refsqt}quUindirect_targetsqv]qwUsettingsqx(cdocutils.frontend Values qyoqz}q{(Ufootnote_backlinksq|KUrecord_dependenciesq}NU rfc_base_urlq~Uhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh/NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqUtrim_footnote_reference_spaceqUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/index.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}qhhsUsubstitution_namesq}qhh)h}q(h!]h$]h#]Usourcehh"]h&]uU footnotesq]qUrefidsq}qub.PK7D:Vpgg3buildbot-v0.8.9/.doctrees/tutorial/firstrun.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X virtualenvqXgetting-code-labelqXgitqXgoalq NXpythonq Xcreating a slaveq NX first runq NXgetting the codeq NXwaterfall display linkqXcreating a masterqNXfirst-run-labelquUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hU virtualenvqhUgetting-code-labelqhUgitqh Ugoalqh Upythonqh Ucreating-a-slaveqh U first-runq h Ugetting-the-codeq!hUwaterfall-display-linkq"hUcreating-a-masterq#hUfirst-run-labelq$uUchildrenq%]q&(cdocutils.nodes target q')q(}q)(U rawsourceq*X.. _first-run-label:Uparentq+hUsourceq,cdocutils.nodes reprunicode q-XR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/tutorial/firstrun.rstq.q/}q0bUtagnameq1Utargetq2U attributesq3}q4(Uidsq5]Ubackrefsq6]Udupnamesq7]Uclassesq8]Unamesq9]Urefidq:h$uUlineq;KUdocumentq}q?(h*Uh+hh,h/Uexpect_referenced_by_nameq@}qAhh(sh1UsectionqBh3}qC(h7]h8]h6]h5]qD(h h$eh9]qE(h heuh;Khh,h/h1UtitleqMh3}qN(h7]h8]h6]h5]h9]uh;Khh,h/h1hBh3}qV(h7]h8]h6]h5]qWhah9]qXh auh;Kh`, you can use Docker, the linux container engine. Docker automates all the deployment steps for you.h+hTh,h/h1hfh3}q~(h7]h8]h6]h5]h9]uh;Kh`qh+h|h,h/h1U pending_xrefqh3}q(UreftypeXrefUrefwarnqU reftargetqXfirst-run-docker-labelU refdomainXstdqh5]h6]U refexplicith7]h8]h9]UrefdocqXtutorial/firstrunquh;Kh%]qcdocutils.nodes emphasis q)q}q(h*hh3}q(h7]h8]q(UxrefqhXstd-refqeh6]h5]h9]uh+hh%]qhPXfastest way through in Linuxqq}q(h*Uh+hubah1UemphasisqubaubhPXd, you can use Docker, the linux container engine. Docker automates all the deployment steps for you.qq}q(h*Xd, you can use Docker, the linux container engine. Docker automates all the deployment steps for you.h+h|ubeubhb)q}q(h*X}For a more manual approach, you should be able to cut and paste each shell block from this tutorial directly into a terminal.qh+hTh,h/h1hfh3}q(h7]h8]h6]h5]h9]uh;Khh,h/h@}qhhsh1hBh3}q(h7]h8]h6]h5]q(h!heh9]q(h heuh;Khh+hh,h/h1hfh3}r?(h7]h8]h6]h5]h9]uh;K0hh+j<ubaubhb)rD}rE(h*XYou will also need a working Internet connection, as virtualenv and easy_install will need to download other projects from the Internet.rFh+hh,h/h1hfh3}rG(h7]h8]h6]h5]h9]uh;K2hh,h/h1hBh3}r}(h7]h8]h6]h5]r~h#ah9]rhauh;KKh 2011-12-04 10:04:40-0600 [-] Setting up http.log rotating 10 files of 10000000 bytes each 2011-12-04 10:04:40-0600 [-] WebStatus using (/home/dustin/tmp/buildbot/master/public_html) 2011-12-04 10:04:40-0600 [-] removing 0 old schedulers, updating 0, and adding 1 2011-12-04 10:04:40-0600 [-] adding 1 new changesources, removing 0 2011-12-04 10:04:40-0600 [-] gitpoller: using workdir '/home/dustin/tmp/buildbot/master/gitpoller-workdir' 2011-12-04 10:04:40-0600 [-] gitpoller: initializing working dir from git://github.com/buildbot/pyflakes.git 2011-12-04 10:04:40-0600 [-] configuration update complete 2011-12-04 10:04:41-0600 [-] gitpoller: checking out master 2011-12-04 10:04:41-0600 [-] gitpoller: finished initializing working dir from git://github.com/buildbot/pyflakes.git at rev 1a4af6ec1dbb724b884ea14f439b272f30439e4dh+j{h,h/h1jeh3}r(jgjhXnonejijjh5]h6]h7]h8]h9]uh;K^h 2011-12-04 10:04:40-0600 [-] Setting up http.log rotating 10 files of 10000000 bytes each 2011-12-04 10:04:40-0600 [-] WebStatus using (/home/dustin/tmp/buildbot/master/public_html) 2011-12-04 10:04:40-0600 [-] removing 0 old schedulers, updating 0, and adding 1 2011-12-04 10:04:40-0600 [-] adding 1 new changesources, removing 0 2011-12-04 10:04:40-0600 [-] gitpoller: using workdir '/home/dustin/tmp/buildbot/master/gitpoller-workdir' 2011-12-04 10:04:40-0600 [-] gitpoller: initializing working dir from git://github.com/buildbot/pyflakes.git 2011-12-04 10:04:40-0600 [-] configuration update complete 2011-12-04 10:04:41-0600 [-] gitpoller: checking out master 2011-12-04 10:04:41-0600 [-] gitpoller: finished initializing working dir from git://github.com/buildbot/pyflakes.git at rev 1a4af6ec1dbb724b884ea14f439b272f30439e4drr}r(h*Uh+jubaubeubh=)r}r(h*Uh+h>h,h/h1hBh3}r(h7]h8]h6]h5]rhah9]rh auh;KlhhPXEYou should see lines like the following at the end of the worker log:r?r@}rA(h*j<h+j:ubaubjb)rB}rC(h*X2009-07-29 20:59:18+0200 [Broker,client] message from master: attached 2009-07-29 20:59:18+0200 [Broker,client] SlaveBuilder.remote_print(buildbot-full): message from master: attached 2009-07-29 20:59:18+0200 [Broker,client] sending application-level keepalives every 600 secondsh+jh,h/h1jeh3}rD(jgjhXnonejijjh5]h6]h7]h8]h9]uh;Kh`_ and you get this:h+jh,h/h1hfh3}rw(h7]h8]h6]h5]h9]uh;Kh`_h3}r~(UnameXWaterfall Display linkhXhttp://localhost:8010/waterfallrh5]h6]h7]h8]h9]uh+juh%]rhPXWaterfall Display linkrr}r(h*Uh+j|ubah1hubh')r}r(h*X" j.Kh+juh1h2h3}r(Urefurijh5]rh"ah6]h7]h8]h9]rhauh%]ubhPX and you get this:rr}r(h*X and you get this:h+juubeubjj)r}r(h*XA.. image:: _images/waterfall-empty.png :alt: empty waterfall. h+jh,h/h1jmh3}r(UuriX$tutorial/_images/waterfall-empty.pngrh5]h6]h7]h8]jp}rU*jsh9]Ualth-Xempty waterfall.rr}rbuh;Nhh#j{h!hh"jh$h>uUsubstitution_namesr3}r4h1h}q?(hh8hh6ubaubcdocutils.nodes comment q@)qA}qB(hXAny change that adds a feature or fixes a bug should have an entry here. Most simply need an additional bulleted list item, but more significant changes can be given a subsection of their own.hhh h#h%UcommentqCh'}qD(U xml:spaceqEUpreserveqFh,]h+]h)]h*]h/]uh1Kh2hh3]qGhr?}r@(hXR scheduler is again properly passing changes through to the scheduled builds. See hj0ubh)rA}rB(hUh'}rC(hX bug #2376hX$http://trac.buildbot.net/ticket/2376h,]h+]h)]h*]h/]uhj0h3]rDh(h)]h*]h+]h,]h/]uh1Nh2hh3]r?hK)r@}rA(hX``Source`` and ``ShellCommand`` steps now have an optional ``descriptionSuffix``, a suffix to the ``description``/``descriptionDone`` values. For example this can help distinguish between multiple ``Compile`` steps that are applied to different codebases.hj<h h#h%hOh'}rB(h)]h*]h+]h,]h/]uh1KFh3]rC(h)rD}rE(hX ``Source``h'}rF(h)]h*]h+]h,]h/]uhj@h3]rGhr?}r@(hUhj8ubah%hubaubh` via the ``codebases`` parameter * ``NestedParameter`` to provide a logical grouping of parameters. * ``CodebaseParameter`` to set the branch/revision/repository/project for a codebase * new HTML/CSS customization points. Each parameter is contained in a ``row`` with multiple 'class' attributes associated with them (eg, 'force-string' and 'force-nested') as well as a unique id to use with Javascript. Explicit line-breaks have been removed from the HTML generator and are now controlled using CSS. hjh Nh%hvh'}r(h)]h*]h+]h,]h/]uh1Nh2hh3]r(hK)r}r(hX$``ForceScheduler`` has been updated:hjh h#h%hOh'}r(h)]h*]h+]h,]h/]uh1Kch3]r(h)r}r(hX``ForceScheduler``h'}r(h)]h*]h+]h,]h/]uhjh3]rh` via the ``codebases`` parameterrh'}r(h)]h*]h+]h,]h/]uhjh3]rhK)r}r(hjhjh h#h%hOh'}r(h)]h*]h+]h,]h/]uh1Keh3]r(h`rhjh h#h%j h'}r(UreftypeXrefjjX attr-codebaseU refdomainXstdrh,]h+]U refexplicith)]h*]h/]jjuh1Keh3]rj)r}r(hjh'}r(h)]h*]r(jjXstd-refreh+]h,]h/]uhjh3]rh(hXThe :bb:status:`MailNotifier` now takes a callable to calculate the "previous" build for purposes of determining status changes. See :bb:pull:`489`. hjh h#h%hvh'}r?(h)]h*]h+]h,]h/]uh1Nh2hh3]r@hK)rA}rB(hXThe :bb:status:`MailNotifier` now takes a callable to calculate the "previous" build for purposes of determining status changes. See :bb:pull:`489`.hj=h h#h%hOh'}rC(h)]h*]h+]h,]h/]uh1Kph3]rD(h`. The branch/revision/repository/project are deprecated; if you have customized these values, simply provide them as ``codebases=[CodebaseParameter(name='', ...)]``. * The POST URL names for ``AnyPropertyParameter`` fields have changed. For example, 'property1name' is now 'property1_name', and 'property1value' is now 'property1_value'. Please update any bookmarked or saved URL's that used these fields. * ``forcesched.BaseParameter`` API has changed quite a bit and is no longer backwards compatible. Updating guidelines: * ``get_from_post`` is renamed to ``getFromKwargs`` * ``update_from_post`` is renamed to ``updateFromKwargs``. This function's parameters are now called via named parameters to allow subclasses to ignore values it doesnt use. Subclasses should add ``**unused`` for future compatibility. A new parameter ``sourcestampset`` is provided to allow subclasses to modify the sourcestamp set, and will probably require you to add the ``**unused`` field. hjh h#h%hvh'}r(h)]h*]h+]h,]h/]uh1Nh2hh3]r(hK)r}r(hX``ForceScheduler`` has been updated to support multiple :ref:`codebases`. The branch/revision/repository/project are deprecated; if you have customized these values, simply provide them as ``codebases=[CodebaseParameter(name='', ...)]``.hjh h#h%hOh'}r(h)]h*]h+]h,]h/]uh1Kh3]r(h)r}r(hX``ForceScheduler``h'}r(h)]h*]h+]h,]h/]uhjh3]rh`rhjh h#h%j h'}r(UreftypeXrefjjX attr-codebaseU refdomainXstdrh,]h+]U refexplicith)]h*]h/]jjuh1Kh3]r j)r }r (hjh'}r (h)]h*]r (jjXstd-refreh+]h,]h/]uhjh3]rh(hX=``forcesched.BaseParameter`` API has changed quite a bit and is no longer backwards compatible. Updating guidelines: * ``get_from_post`` is renamed to ``getFromKwargs`` * ``update_from_post`` is renamed to ``updateFromKwargs``. This function's parameters are now called via named parameters to allow subclasses to ignore values it doesnt use. Subclasses should add ``**unused`` for future compatibility. A new parameter ``sourcestampset`` is provided to allow subclasses to modify the sourcestamp set, and will probably require you to add the ``**unused`` field. h'}r?(h)]h*]h+]h,]h/]uhj$h3]r@(hK)rA}rB(hXt``forcesched.BaseParameter`` API has changed quite a bit and is no longer backwards compatible. Updating guidelines:hj=h h#h%hOh'}rC(h)]h*]h+]h,]h/]uh1Kh3]rD(h)rE}rF(hX``forcesched.BaseParameter``h'}rG(h)]h*]h+]h,]h/]uhjAh3]rHh` hjh h#h%hvh'}r(h)]h*]h+]h,]h/]uh1Nh2hh3]rhK)r}r(hXThe parameters to the callable version of ``build.workdir`` have changed. Instead of a single sourcestamp, a list of sourcestamps is passed. Each sourcestamp in the list has a different :ref:`codebase`hjh h#h%hOh'}r(h)]h*]h+]h,]h/]uh1Kh3]r(h`rhjh h#h%j h'}r(UreftypeXrefjjX attr-codebaseU refdomainXstdrh,]h+]U refexplicith)]h*]h/]jjuh1Kh3]rj)r}r(hjh'}r(h)]h*]r(jjXstd-refreh+]h,]h/]uhjh3]rh}r?(hUhj9ubah%hubh}r?(hX. hjubcdocutils.nodes title_reference r@)rA}rB(hX `Interpolate`h'}rC(h)]h*]h+]h,]h/]uhjh3]rDh(hXXThe ``P4Sync`` step, deprecated since 0.8.5, has been removed. The ``P4`` step remains.r?hj9h h#h%hOh'}r@(h)]h*]h+]h,]h/]uh1Kh3]rA(h}q?(hh8hh6ubaubcdocutils.nodes comment q@)qA}qB(hXAny change that adds a feature or fixes a bug should have an entry here. Most simply need an additional bulleted list item, but more significant changes can be given a subsection of their own.hhh h#h%UcommentqCh'}qD(U xml:spaceqEUpreserveqFh,]h+]h)]h*]h/]uh1Kh2hh3]qGh(h)]h*]h+]h,]h/]uh1Nh2hh3]r?(hK)r@}rA(hXForced builds now require that a :bb:sched:`ForceScheduler` be defined in the Buildbot configuration. For compatible behavior, this should look like::hj<h h#h%hOh'}rB(h)]h*]h+]h,]h/]uh1K3h3]rC(hSQLAlchemy-Migrate version 0.6.0 is no longer supported. See r)r*}r+(hX>SQLAlchemy-Migrate version 0.6.0 is no longer supported. See hj%ubjG)r,}r-(hX:ref:`Buildmaster-Requirements`r.hj%h h#h%jKh'}r/(UreftypeXrefjMjNXbuildmaster-requirementsU refdomainXstdr0h,]h+]U refexplicith)]h*]h/]jPjQuh1KTh3]r1jr)r2}r3(hj.h'}r4(h)]h*]r5(jXj0Xstd-refr6eh+]h,]h/]uhj,h3]r7h(hXOlder versions of SQLite which could limp along for previous versions of Buildbot are no longer supported. The minimum version is 3.4.0, and 3.7.0 or higher is recommended. hj8h h#h%hvh'}r?(h)]h*]h+]h,]h/]uh1Nh2hh3]r@hK)rA}rB(hXOlder versions of SQLite which could limp along for previous versions of Buildbot are no longer supported. The minimum version is 3.4.0, and 3.7.0 or higher is recommended.rChj=h h#h%hOh'}rD(h)]h*]h+]h,]h/]uh1KWh3]rEh}r?(hX Passing a hj9ubjG)r@}rA(hX0:py:class:`buildbot.process.buildstep.BuildStep`rBhj9h h#h%jKh'}rC(UreftypeXclassjMjNX$buildbot.process.buildstep.BuildStepU refdomainXpyrDh,]h+]U refexplicith)]h*]h/]jPjQjNjNuh1Kph3]rEjS)rF}rG(hjBh'}rH(h)]h*]rI(jXjDXpy-classrJeh+]h,]h/]uhj@h3]rKh}r?(hX<The Dependent scheduler tracks its upstream buildsets using hj9ubjG)r@}rA(hX::py:class:`buildbot.db.schedulers.StateConnectorComponent`rBhj9h h#h%jKh'}rC(UreftypeXclassjMjNX.buildbot.db.schedulers.StateConnectorComponentU refdomainXpyrDh,]h+]U refexplicith)]h*]h/]jPjQjNjNuh1Kh3]rEjS)rF}rG(hjBh'}rH(h)]h*]rI(jXjDXpy-classrJeh+]h,]h/]uhj@h3]rKhh}r?(hUhhh h#h%h&h'}r@(h)]h*]h+]h,]rAUolder-versionsrBah/]rCh auh1Kh2hh3]rD(h5)rE}rF(hXOlder VersionsrGhj>h h#h%h9h'}rH(h)]h*]h+]h,]h/]uh1Kh2hh3]rIhh h#h%hOh'}rO(h)]h*]h+]h,]h/]uh1Kh2hh3]rP(hh.huUsubstitution_namesr(}r)h%h2h'}r*(h)]h,]h+]Usourceh#h*]h/]uU footnotesr+]r,Urefidsr-}r.ub.PK7Dq YY0buildbot-v0.8.9/.doctrees/relnotes/0.8.8.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XslaveqNXfeaturesqNX2deprecations, removals, and non-compatible changesqNX!release notes for buildbot v0.8.8q NXchanges for developersq NXolder versionsq NXmasterq NXdetailsq NuUsubstitution_defsq}qUparse_messagesq]q(cdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhh)q}q(hUhh)q}q(hUhhUsourceqcdocutils.nodes reprunicode q XO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/relnotes/0.8.8.rstq!q"}q#bUtagnameq$Usectionq%U attributesq&}q'(Udupnamesq(]Uclassesq)]Ubackrefsq*]Uidsq+]q,U!release-notes-for-buildbot-v0-8-8q-aUnamesq.]q/h auUlineq0KUdocumentq1hUchildrenq2]q3(cdocutils.nodes title q4)q5}q6(hX!Release Notes for Buildbot v0.8.8q7hhhh"h$Utitleq8h&}q9(h(]h)]h*]h+]h.]uh0Kh1hh2]q:cdocutils.nodes Text q;X!Release Notes for Buildbot v0.8.8q(hh7hh5ubaubcdocutils.nodes comment q?)q@}qA(hXAny change that adds a feature or fixes a bug should have an entry here. Most simply need an additional bulleted list item, but more significant changes can be given a subsection of their own.hhhh"h$UcommentqBh&}qC(U xml:spaceqDUpreserveqEh+]h*]h(]h)]h.]uh0Kh1hh2]qFh;XAny change that adds a feature or fixes a bug should have an entry here. Most simply need an additional bulleted list item, but more significant changes can be given a subsection of their own.qGqH}qI(hUhh@ubaubcdocutils.nodes paragraph qJ)qK}qL(hXgThe following are the release notes for Buildbot v0.8.8 Buildbot v0.8.8 was released on August 22, 2013qMhhhh"h$U paragraphqNh&}qO(h(]h)]h*]h+]h.]uh0K h1hh2]qPh;XgThe following are the release notes for Buildbot v0.8.8 Buildbot v0.8.8 was released on August 22, 2013qQqR}qS(hhMhhKubaubh)qT}qU(hUhhhh"h$h%h&}qV(h(]h)]h*]h+]qWUmasterqXah.]qYh auh0K h1hh2]qZ(h4)q[}q\(hXMasterq]hhThh"h$h8h&}q^(h(]h)]h*]h+]h.]uh0K h1hh2]q_h;XMasterq`qa}qb(hh]hh[ubaubh)qc}qd(hUhKhhThh"h$h%h&}qe(h(]qfXfeaturesqgah)]h*]h+]qhUfeaturesqiah.]uh0Kh1hh2]qj(h4)qk}ql(hXFeaturesqmhhchh"h$h8h&}qn(h(]h)]h*]h+]h.]uh0Kh1hh2]qoh;XFeaturesqpqq}qr(hhmhhkubaubcdocutils.nodes bullet_list qs)qt}qu(hUhhchh"h$U bullet_listqvh&}qw(UbulletqxX*h+]h*]h(]h)]h.]uh0Kh1hh2]qy(cdocutils.nodes list_item qz)q{}q|(hX\The ``MasterShellCommand`` step now correctly handles environment variables passed as list. hhthh"h$U list_itemq}h&}q~(h(]h)]h*]h+]h.]uh0Nh1hh2]qhJ)q}q(hX[The ``MasterShellCommand`` step now correctly handles environment variables passed as list.hh{hh"h$hNh&}q(h(]h)]h*]h+]h.]uh0Kh2]q(h;XThe qq}q(hXThe hhubcdocutils.nodes literal q)q}q(hX``MasterShellCommand``h&}q(h(]h)]h*]h+]h.]uhhh2]qh;XMasterShellCommandqq}q(hUhhubah$Uliteralqubh;XA step now correctly handles environment variables passed as list.qq}q(hXA step now correctly handles environment variables passed as list.hhubeubaubhz)q}q(hX`The master now poll the database for pending tasks when running buildbot in multi-master mode. hhthh"h$h}h&}q(h(]h)]h*]h+]h.]uh0Nh1hh2]qhJ)q}q(hX^The master now poll the database for pending tasks when running buildbot in multi-master mode.qhhhh"h$hNh&}q(h(]h)]h*]h+]h.]uh0Kh2]qh;X^The master now poll the database for pending tasks when running buildbot in multi-master mode.qq}q(hhhhubaubaubhz)q}q(hXeThe algorithm to match build requests to slaves has been rewritten in :bb:pull:`615`. The new algorithm automatically takes locks into account, and will not schedule a build only to have it wait on a lock. The algorithm also introduces a ``canStartBuild`` builder configuration option which can be used to prevent a build request being assigned to a slave. hhthh"h$h}h&}q(h(]h)]h*]h+]h.]uh0Nh1hh2]qhJ)q}q(hXdThe algorithm to match build requests to slaves has been rewritten in :bb:pull:`615`. The new algorithm automatically takes locks into account, and will not schedule a build only to have it wait on a lock. The algorithm also introduces a ``canStartBuild`` builder configuration option which can be used to prevent a build request being assigned to a slave.hhhh"h$hNh&}q(h(]h)]h*]h+]h.]uh0Kh2]q(h;XFThe algorithm to match build requests to slaves has been rewritten in qq}q(hXFThe algorithm to match build requests to slaves has been rewritten in hhubcdocutils.nodes reference q)q}q(hUh&}q(UreftitleqXpull request 615qUrefuriqX-https://github.com/buildbot/buildbot/pull/615h+]h*]h(]h)]h.]uhhh2]qh;Xpull request 615qq}q(hhhhubah$U referencequbh;X. The new algorithm automatically takes locks into account, and will not schedule a build only to have it wait on a lock. The algorithm also introduces a qq}q(hX. The new algorithm automatically takes locks into account, and will not schedule a build only to have it wait on a lock. The algorithm also introduces a hhubh)q}q(hX``canStartBuild``h&}q(h(]h)]h*]h+]h.]uhhh2]qh;X canStartBuildqq}q(hUhhubah$hubh;Xe builder configuration option which can be used to prevent a build request being assigned to a slave.qq}q(hXe builder configuration option which can be used to prevent a build request being assigned to a slave.hhubeubaubhz)q}q(hX``buildbot stop`` and ``buildbot restart`` now accept ``--clean`` to stop or restart the master cleanly (allowing all running builds to complete first). hhthh"h$h}h&}q(h(]h)]h*]h+]h.]uh0Nh1hh2]qhJ)q}q(hX``buildbot stop`` and ``buildbot restart`` now accept ``--clean`` to stop or restart the master cleanly (allowing all running builds to complete first).hhhh"h$hNh&}q(h(]h)]h*]h+]h.]uh0Kh2]q(h)q}q(hX``buildbot stop``h&}q(h(]h)]h*]h+]h.]uhhh2]qh;X buildbot stopqυq}q(hUhhubah$hubh;X and q҅q}q(hX and hhubh)q}q(hX``buildbot restart``h&}q(h(]h)]h*]h+]h.]uhhh2]qh;Xbuildbot restartqمq}q(hUhhubah$hubh;X now accept q܅q}q(hX now accept hhubh)q}q(hX ``--clean``h&}q(h(]h)]h*]h+]h.]uhhh2]qh;X--cleanqㅁq}q(hUhhubah$hubh;XW to stop or restart the master cleanly (allowing all running builds to complete first).q慁q}q(hXW to stop or restart the master cleanly (allowing all running builds to complete first).hhubeubaubhz)q}q(hXThe :bb:status:`IRC` bot now supports clean shutdown and immediate shutdown by using the command 'shutdown'. To allow the command to function, you must provide `allowShutdown=True`. hhthh"h$h}h&}q(h(]h)]h*]h+]h.]uh0Nh1hh2]qhJ)q}q(hXThe :bb:status:`IRC` bot now supports clean shutdown and immediate shutdown by using the command 'shutdown'. To allow the command to function, you must provide `allowShutdown=True`.hhhh"h$hNh&}q(h(]h)]h*]h+]h.]uh0Kh2]q(h;XThe qq}q(hXThe hhubcsphinx.addnodes pending_xref q)q}q(hX:bb:status:`IRC`qhhhh"h$U pending_xrefqh&}q(UreftypeXstatusUrefwarnqU reftargetqXIRCU refdomainXbbqh+]h*]U refexplicith(]h)]h.]UrefdocqXrelnotes/0.8.8quh0Kh2]qh)r}r(hhh&}r(h(]h)]r(UxrefrhX bb-statusreh*]h+]h.]uhhh2]rh;XIRCrr}r (hUhjubah$hubaubh;X bot now supports clean shutdown and immediate shutdown by using the command 'shutdown'. To allow the command to function, you must provide r r }r (hX bot now supports clean shutdown and immediate shutdown by using the command 'shutdown'. To allow the command to function, you must provide hhubcdocutils.nodes title_reference r )r}r(hX`allowShutdown=True`h&}r(h(]h)]h*]h+]h.]uhhh2]rh;XallowShutdown=Truerr}r(hUhjubah$Utitle_referencerubh;X.r}r(hX.hhubeubaubhz)r}r(hX):bb:step:`CopyDirectory` has been added. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hX(:bb:step:`CopyDirectory` has been added.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Kh2]r(h)r }r!(hX:bb:step:`CopyDirectory`r"hjhh"h$hh&}r#(UreftypeXstephhX CopyDirectoryU refdomainXbbr$h+]h*]U refexplicith(]h)]h.]hhuh0Kh2]r%h)r&}r'(hj"h&}r((h(]h)]r)(jj$Xbb-stepr*eh*]h+]h.]uhj h2]r+h;X CopyDirectoryr,r-}r.(hUhj&ubah$hubaubh;X has been added.r/r0}r1(hX has been added.hjubeubaubhz)r2}r3(hX{:bb:sched:`BuildslaveChoiceParameter` has been added to provide a way to explicitly choose a buildslave for a given build. hhthh"h$h}h&}r4(h(]h)]h*]h+]h.]uh0Nh1hh2]r5hJ)r6}r7(hXz:bb:sched:`BuildslaveChoiceParameter` has been added to provide a way to explicitly choose a buildslave for a given build.hj2hh"h$hNh&}r8(h(]h)]h*]h+]h.]uh0K!h2]r9(h)r:}r;(hX%:bb:sched:`BuildslaveChoiceParameter`r<hj6hh"h$hh&}r=(UreftypeXschedhhXBuildslaveChoiceParameterU refdomainXbbr>h+]h*]U refexplicith(]h)]h.]hhuh0K!h2]r?h)r@}rA(hj<h&}rB(h(]h)]rC(jj>Xbb-schedrDeh*]h+]h.]uhj:h2]rEh;XBuildslaveChoiceParameterrFrG}rH(hUhj@ubah$hubaubh;XU has been added to provide a way to explicitly choose a buildslave for a given build.rIrJ}rK(hXU has been added to provide a way to explicitly choose a buildslave for a given build.hj6ubeubaubhz)rL}rM(hX4default.css now wraps preformatted text by default. hhthh"h$h}h&}rN(h(]h)]h*]h+]h.]uh0Nh1hh2]rOhJ)rP}rQ(hX3default.css now wraps preformatted text by default.rRhjLhh"h$hNh&}rS(h(]h)]h*]h+]h.]uh0K$h2]rTh;X3default.css now wraps preformatted text by default.rUrV}rW(hjRhjPubaubaubhz)rX}rY(hX1Slaves can now be paused through the web status. hhthh"h$h}h&}rZ(h(]h)]h*]h+]h.]uh0Nh1hh2]r[hJ)r\}r](hX0Slaves can now be paused through the web status.r^hjXhh"h$hNh&}r_(h(]h)]h*]h+]h.]uh0K&h2]r`h;X0Slaves can now be paused through the web status.rarb}rc(hj^hj\ubaubaubhz)rd}re(hXGThe latent buildslave support is less buggy, thanks to :bb:pull:`646`. hhthh"h$h}h&}rf(h(]h)]h*]h+]h.]uh0Nh1hh2]rghJ)rh}ri(hXFThe latent buildslave support is less buggy, thanks to :bb:pull:`646`.hjdhh"h$hNh&}rj(h(]h)]h*]h+]h.]uh0K(h2]rk(h;X7The latent buildslave support is less buggy, thanks to rlrm}rn(hX7The latent buildslave support is less buggy, thanks to hjhubh)ro}rp(hUh&}rq(hXpull request 646rrhX-https://github.com/buildbot/buildbot/pull/646h+]h*]h(]h)]h.]uhjhh2]rsh;Xpull request 646rtru}rv(hjrhjoubah$hubh;X.rw}rx(hX.hjhubeubaubhz)ry}rz(hXThe ``treeStableTimer`` for ``AnyBranchScheduler`` now maintains separate timers for separate branches, codebases, projects, and repositories. hhthh"h$h}h&}r{(h(]h)]h*]h+]h.]uh0Nh1hh2]r|hJ)r}}r~(hXThe ``treeStableTimer`` for ``AnyBranchScheduler`` now maintains separate timers for separate branches, codebases, projects, and repositories.hjyhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K*h2]r(h;XThe rr}r(hXThe hj}ubh)r}r(hX``treeStableTimer``h&}r(h(]h)]h*]h+]h.]uhj}h2]rh;XtreeStableTimerrr}r(hUhjubah$hubh;X for rr}r(hX for hj}ubh)r}r(hX``AnyBranchScheduler``h&}r(h(]h)]h*]h+]h.]uhj}h2]rh;XAnyBranchSchedulerrr}r(hUhjubah$hubh;X\ now maintains separate timers for separate branches, codebases, projects, and repositories.rr}r(hX\ now maintains separate timers for separate branches, codebases, projects, and repositories.hj}ubeubaubhz)r}r(hXr:bb:step:`SVN` has a new option `preferLastChangedRev=True` to use the last changed revision for ``got_revision`` hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXq:bb:step:`SVN` has a new option `preferLastChangedRev=True` to use the last changed revision for ``got_revision``hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K,h2]r(h)r}r(hX:bb:step:`SVN`rhjhh"h$hh&}r(UreftypeXstephhXSVNU refdomainXbbrh+]h*]U refexplicith(]h)]h.]hhuh0K,h2]rh)r}r(hjh&}r(h(]h)]r(jjXbb-stepreh*]h+]h.]uhjh2]rh;XSVNrr}r(hUhjubah$hubaubh;X has a new option rr}r(hX has a new option hjubj )r}r(hX`preferLastChangedRev=True`h&}r(h(]h)]h*]h+]h.]uhjh2]rh;XpreferLastChangedRev=Truerr}r(hUhjubah$jubh;X& to use the last changed revision for rr}r(hX& to use the last changed revision for hjubh)r}r(hX``got_revision``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X got_revisionrr}r(hUhjubah$hubeubaubhz)r}r(hXThe build request DB connector method :py:meth:`~buildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequests` can now filter by branch and repository. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXThe build request DB connector method :py:meth:`~buildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequests` can now filter by branch and repository.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K.h2]r(h;X&The build request DB connector method rr}r(hX&The build request DB connector method hjubh)r}r(hXV:py:meth:`~buildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequests`rhjhh"h$hh&}r(UreftypeXmethhhXJbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestsU refdomainXpyrh+]h*]U refexplicith(]h)]h.]hhUpy:classrNU py:modulerNuh0K.h2]rh)r}r(hjh&}r(h(]h)]r(jjXpy-methreh*]h+]h.]uhjh2]rh;XgetBuildRequestsrr}r(hUhjubah$hubaubh;X) can now filter by branch and repository.rr}r(hX) can now filter by branch and repository.hjubeubaubhz)r}r(hXA new :bb:step:`SetProperty` step has been added in ``buildbot.steps.master`` which can set a property directly without accessing the slave. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXA new :bb:step:`SetProperty` step has been added in ``buildbot.steps.master`` which can set a property directly without accessing the slave.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K0h2]r(h;XA new rr}r(hXA new hjubh)r}r(hX:bb:step:`SetProperty`rhjhh"h$hh&}r(UreftypeXstephhX SetPropertyU refdomainXbbrh+]h*]U refexplicith(]h)]h.]hhuh0K0h2]rh)r}r(hjh&}r(h(]h)]r(jjXbb-stepreh*]h+]h.]uhjh2]rh;X SetPropertyrr}r(hUhjubah$hubaubh;X step has been added in rr}r(hX step has been added in hjubh)r}r(hX``buildbot.steps.master``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xbuildbot.steps.masterrr}r(hUhjubah$hubh;X? which can set a property directly without accessing the slave.rr}r(hX? which can set a property directly without accessing the slave.hjubeubaubhz)r }r (hXThe new :bb:step:`LogRenderable` step logs Python objects, which can contain renderables, to the logfile. This is helpful for debugging property values during a build. hhthh"h$h}h&}r (h(]h)]h*]h+]h.]uh0Nh1hh2]r hJ)r }r(hXThe new :bb:step:`LogRenderable` step logs Python objects, which can contain renderables, to the logfile. This is helpful for debugging property values during a build.hj hh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K2h2]r(h;XThe new rr}r(hXThe new hj ubh)r}r(hX:bb:step:`LogRenderable`rhj hh"h$hh&}r(UreftypeXstephhX LogRenderableU refdomainXbbrh+]h*]U refexplicith(]h)]h.]hhuh0K2h2]rh)r}r(hjh&}r(h(]h)]r(jjXbb-stepreh*]h+]h.]uhjh2]rh;X LogRenderabler r!}r"(hUhjubah$hubaubh;X step logs Python objects, which can contain renderables, to the logfile. This is helpful for debugging property values during a build.r#r$}r%(hX step logs Python objects, which can contain renderables, to the logfile. This is helpful for debugging property values during a build.hj ubeubaubhz)r&}r'(hX 'buildbot try' now has an additional :option:`--property` option to set properties. Unlike the existing :option:`--properties` option, this new option supports setting only a single property and therefore allows commas to be included in the property name and value. hhthh"h$h}h&}r((h(]h)]h*]h+]h.]uh0Nh1hh2]r)hJ)r*}r+(hX 'buildbot try' now has an additional :option:`--property` option to set properties. Unlike the existing :option:`--properties` option, this new option supports setting only a single property and therefore allows commas to be included in the property name and value.hj&hh"h$hNh&}r,(h(]h)]h*]h+]h.]uh0K5h2]r-(h;X%'buildbot try' now has an additional r.r/}r0(hX%'buildbot try' now has an additional hj*ubh)r1}r2(hX:option:`--property`r3hj*hh"h$hh&}r4(UreftypeXoptionhhX --propertyU refdomainXstdr5U refprogramr6Nh+]h*]U refexplicith(]h)]h.]hhuh0K5h2]r7csphinx.addnodes literal_emphasis r8)r9}r:(hj3h&}r;(h(]h)]r<(jj5X std-optionr=eh*]h+]h.]uhj1h2]r>h;X --propertyr?r@}rA(hUhj9ubah$Uliteral_emphasisrBubaubh;X/ option to set properties. Unlike the existing rCrD}rE(hX/ option to set properties. Unlike the existing hj*ubh)rF}rG(hX:option:`--properties`rHhj*hh"h$hh&}rI(UreftypeXoptionhhX --propertiesU refdomainXstdrJj6Nh+]h*]U refexplicith(]h)]h.]hhuh0K5h2]rKj8)rL}rM(hjHh&}rN(h(]h)]rO(jjJX std-optionrPeh*]h+]h.]uhjFh2]rQh;X --propertiesrRrS}rT(hUhjLubah$jBubaubh;X option, this new option supports setting only a single property and therefore allows commas to be included in the property name and value.rUrV}rW(hX option, this new option supports setting only a single property and therefore allows commas to be included in the property name and value.hj*ubeubaubhz)rX}rY(hXThe ``Git`` step has a new ``config`` option, which accepts a dict of git configuration options to pass to the low-level git commands. See :bb:step:`Git` for details. hhthh"h$h}h&}rZ(h(]h)]h*]h+]h.]uh0Nh1hh2]r[hJ)r\}r](hXThe ``Git`` step has a new ``config`` option, which accepts a dict of git configuration options to pass to the low-level git commands. See :bb:step:`Git` for details.hjXhh"h$hNh&}r^(h(]h)]h*]h+]h.]uh0K:h2]r_(h;XThe r`ra}rb(hXThe hj\ubh)rc}rd(hX``Git``h&}re(h(]h)]h*]h+]h.]uhj\h2]rfh;XGitrgrh}ri(hUhjcubah$hubh;X step has a new rjrk}rl(hX step has a new hj\ubh)rm}rn(hX ``config``h&}ro(h(]h)]h*]h+]h.]uhj\h2]rph;Xconfigrqrr}rs(hUhjmubah$hubh;Xg option, which accepts a dict of git configuration options to pass to the low-level git commands. See rtru}rv(hXg option, which accepts a dict of git configuration options to pass to the low-level git commands. See hj\ubh)rw}rx(hX:bb:step:`Git`ryhj\hh"h$hh&}rz(UreftypeXstephhXGitU refdomainXbbr{h+]h*]U refexplicith(]h)]h.]hhuh0K:h2]r|h)r}}r~(hjyh&}r(h(]h)]r(jj{Xbb-stepreh*]h+]h.]uhjwh2]rh;XGitrr}r(hUhj}ubah$hubaubh;X for details.rr}r(hX for details.hj\ubeubaubhz)r}r(hXIn :bb:step:`ShellCommand` ShellCommand now validates its arguments during config and will identify any invalid arguments before a build is started. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXIn :bb:step:`ShellCommand` ShellCommand now validates its arguments during config and will identify any invalid arguments before a build is started.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K=h2]r(h;XIn rr}r(hXIn hjubh)r}r(hX:bb:step:`ShellCommand`rhjhh"h$hh&}r(UreftypeXstephhX ShellCommandU refdomainXbbrh+]h*]U refexplicith(]h)]h.]hhuh0K=h2]rh)r}r(hjh&}r(h(]h)]r(jjXbb-stepreh*]h+]h.]uhjh2]rh;X ShellCommandrr}r(hUhjubah$hubaubh;Xz ShellCommand now validates its arguments during config and will identify any invalid arguments before a build is started.rr}r(hXz ShellCommand now validates its arguments during config and will identify any invalid arguments before a build is started.hjubeubaubhz)r}r(hXBThe list of force schedulers in the web UI is now sorted by name. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXAThe list of force schedulers in the web UI is now sorted by name.rhjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K?h2]rh;XAThe list of force schedulers in the web UI is now sorted by name.rr}r(hjhjubaubaubhz)r}r(hXIOpenStack-based Latent Buildslave support was added. See :bb:pull:`666`. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXHOpenStack-based Latent Buildslave support was added. See :bb:pull:`666`.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0KAh2]r(h;X9OpenStack-based Latent Buildslave support was added. See rr}r(hX9OpenStack-based Latent Buildslave support was added. See hjubh)r}r(hUh&}r(hXpull request 666rhX-https://github.com/buildbot/buildbot/pull/666h+]h*]h(]h)]h.]uhjh2]rh;Xpull request 666rr}r(hjhjubah$hubh;X.r}r(hX.hjubeubaubhz)r}r(hXMaster-side support for P4 is available, and provides a great deal more flexibility than the old slave-side step. See :bb:pull:`596`. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXMaster-side support for P4 is available, and provides a great deal more flexibility than the old slave-side step. See :bb:pull:`596`.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0KDh2]r(h;XvMaster-side support for P4 is available, and provides a great deal more flexibility than the old slave-side step. See rr}r(hXvMaster-side support for P4 is available, and provides a great deal more flexibility than the old slave-side step. See hjubh)r}r(hUh&}r(hXpull request 596rhX-https://github.com/buildbot/buildbot/pull/596h+]h*]h(]h)]h.]uhjh2]rh;Xpull request 596rr}r(hjhjubah$hubh;X.r}r(hX.hjubeubaubhz)r}r(hX;Master-side support for Repo is available. The step parameters changed to camelCase. ``repo_downloads``, and ``manifest_override_url`` properties are no longer hardcoded, but instead consult as default values via renderables. Renderable are used in favor of callables for ``syncAllBranches`` and ``updateTarball``. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hX:Master-side support for Repo is available. The step parameters changed to camelCase. ``repo_downloads``, and ``manifest_override_url`` properties are no longer hardcoded, but instead consult as default values via renderables. Renderable are used in favor of callables for ``syncAllBranches`` and ``updateTarball``.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0KGh2]r(h;XUMaster-side support for Repo is available. The step parameters changed to camelCase. rr}r(hXUMaster-side support for Repo is available. The step parameters changed to camelCase. hjubh)r}r(hX``repo_downloads``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xrepo_downloadsrr}r(hUhjubah$hubh;X, and rr}r(hX, and hjubh)r}r(hX``manifest_override_url``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xmanifest_override_urlrr}r(hUhjubah$hubh;X properties are no longer hardcoded, but instead consult as default values via renderables. Renderable are used in favor of callables for rr}r(hX properties are no longer hardcoded, but instead consult as default values via renderables. Renderable are used in favor of callables for hjubh)r}r(hX``syncAllBranches``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;XsyncAllBranchesrr}r(hUhjubah$hubh;X and rr}r(hX and hjubh)r}r(hX``updateTarball``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X updateTarballr r }r (hUhjubah$hubh;X.r }r (hX.hjubeubaubhz)r}r(hXBuilder configurations can now include a ``description``, which will appear in the web UI to help humans figure out what the builder does. hhthh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXBuilder configurations can now include a ``description``, which will appear in the web UI to help humans figure out what the builder does.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0KLh2]r(h;X)Builder configurations can now include a rr}r(hX)Builder configurations can now include a hjubh)r}r(hX``description``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X descriptionrr}r(hUhjubah$hubh;XR, which will appear in the web UI to help humans figure out what the builder does.r r!}r"(hXR, which will appear in the web UI to help humans figure out what the builder does.hjubeubaubhz)r#}r$(hXPGNUAutoconf and other pre-defined factories now work correctly (:bb:bug:`2402`) hhthh"h$h}h&}r%(h(]h)]h*]h+]h.]uh0Nh1hh2]r&hJ)r'}r((hXOGNUAutoconf and other pre-defined factories now work correctly (:bb:bug:`2402`)hj#hh"h$hNh&}r)(h(]h)]h*]h+]h.]uh0KNh2]r*(h;X@GNUAutoconf and other pre-defined factories now work correctly (r+r,}r-(hX@GNUAutoconf and other pre-defined factories now work correctly (hj'ubh)r.}r/(hUh&}r0(hX bug #2402hX$http://trac.buildbot.net/ticket/2402h+]h*]h(]h)]h.]uhj'h2]r1h;X bug #2402r2r3}r4(hUhj.ubah$hubh;X)r5}r6(hX)hj'ubeubaubhz)r7}r8(hXDThe pubDate in RSS feeds is now rendered correctly (:bb:bug:`2530`) hhthh"h$h}h&}r9(h(]h)]h*]h+]h.]uh0Nh1hh2]r:hJ)r;}r<(hXCThe pubDate in RSS feeds is now rendered correctly (:bb:bug:`2530`)hj7hh"h$hNh&}r=(h(]h)]h*]h+]h.]uh0KPh2]r>(h;X4The pubDate in RSS feeds is now rendered correctly (r?r@}rA(hX4The pubDate in RSS feeds is now rendered correctly (hj;ubh)rB}rC(hUh&}rD(hX bug #2530hX$http://trac.buildbot.net/ticket/2530h+]h*]h(]h)]h.]uhj;h2]rEh;X bug #2530rFrG}rH(hUhjBubah$hubh;X)rI}rJ(hX)hj;ubeubaubeubeubh)rK}rL(hUhKhhThh"h$h%h&}rM(h(]rNX2deprecations, removals, and non-compatible changesrOah)]h*]h+]rPU0deprecations-removals-and-non-compatible-changesrQah.]uh0KSh1hh2]rR(h4)rS}rT(hX2Deprecations, Removals, and Non-Compatible ChangesrUhjKhh"h$h8h&}rV(h(]h)]h*]h+]h.]uh0KSh1hh2]rWh;X2Deprecations, Removals, and Non-Compatible ChangesrXrY}rZ(hjUhjSubaubhs)r[}r\(hUhjKhh"h$hvh&}r](hxX*h+]h*]h(]h)]h.]uh0KUh1hh2]r^(hz)r_}r`(hXThe ``split_file`` function for :bb:chsrc:`SVNPoller` may now return a dictionary instead of a tuple. This allows it to add extra information about a change (such as ``project`` or ``repository``). hj[hh"h$h}h&}ra(h(]h)]h*]h+]h.]uh0Nh1hh2]rbhJ)rc}rd(hXThe ``split_file`` function for :bb:chsrc:`SVNPoller` may now return a dictionary instead of a tuple. This allows it to add extra information about a change (such as ``project`` or ``repository``).hj_hh"h$hNh&}re(h(]h)]h*]h+]h.]uh0KUh2]rf(h;XThe rgrh}ri(hXThe hjcubh)rj}rk(hX``split_file``h&}rl(h(]h)]h*]h+]h.]uhjch2]rmh;X split_filernro}rp(hUhjjubah$hubh;X function for rqrr}rs(hX function for hjcubh)rt}ru(hX:bb:chsrc:`SVNPoller`rvhjchh"h$hh&}rw(UreftypeXchsrchhX SVNPollerU refdomainXbbrxh+]h*]U refexplicith(]h)]h.]hhuh0KUh2]ryh)rz}r{(hjvh&}r|(h(]h)]r}(jjxXbb-chsrcr~eh*]h+]h.]uhjth2]rh;X SVNPollerrr}r(hUhjzubah$hubaubh;Xq may now return a dictionary instead of a tuple. This allows it to add extra information about a change (such as rr}r(hXq may now return a dictionary instead of a tuple. This allows it to add extra information about a change (such as hjcubh)r}r(hX ``project``h&}r(h(]h)]h*]h+]h.]uhjch2]rh;Xprojectrr}r(hUhjubah$hubh;X or rr}r(hX or hjcubh)r}r(hX``repository``h&}r(h(]h)]h*]h+]h.]uhjch2]rh;X repositoryrr}r(hUhjubah$hubh;X).rr}r(hX).hjcubeubaubhz)r}r(hXThe ``workdir`` build property has been renamed to ``builddir``. This change accurately reflects its content; the term "workdir" means something different. ``workdir`` is currently still supported for backwards compatability, but will be removed eventually. hj[hh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXThe ``workdir`` build property has been renamed to ``builddir``. This change accurately reflects its content; the term "workdir" means something different. ``workdir`` is currently still supported for backwards compatability, but will be removed eventually.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0KXh2]r(h;XThe rr}r(hXThe hjubh)r}r(hX ``workdir``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xworkdirrr}r(hUhjubah$hubh;X$ build property has been renamed to rr}r(hX$ build property has been renamed to hjubh)r}r(hX ``builddir``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xbuilddirrr}r(hUhjubah$hubh;X]. This change accurately reflects its content; the term "workdir" means something different. rr}r(hX]. This change accurately reflects its content; the term "workdir" means something different. hjubh)r}r(hX ``workdir``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xworkdirrr}r(hUhjubah$hubh;XZ is currently still supported for backwards compatability, but will be removed eventually.rr}r(hXZ is currently still supported for backwards compatability, but will be removed eventually.hjubeubaubhz)r}r(hX'The ``Blocker`` step has been removed. hj[hh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hX&The ``Blocker`` step has been removed.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K\h2]r(h;XThe rr}r(hXThe hjubh)r}r(hX ``Blocker``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;XBlockerrr}r(hUhjubah$hubh;X step has been removed.rr}r(hX step has been removed.hjubeubaubhz)r}r(hXSeveral polling ChangeSources are now documented to take a ``pollInterval`` argument, instead of ``pollinterval``. The old name is still supported. hj[hh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXSeveral polling ChangeSources are now documented to take a ``pollInterval`` argument, instead of ``pollinterval``. The old name is still supported.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K^h2]r(h;X;Several polling ChangeSources are now documented to take a rr}r(hX;Several polling ChangeSources are now documented to take a hjubh)r}r(hX``pollInterval``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X pollIntervalrr}r(hUhjubah$hubh;X argument, instead of rr}r(hX argument, instead of hjubh)r}r(hX``pollinterval``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X pollintervalrr}r(hUhjubah$hubh;X". The old name is still supported.rr}r(hX". The old name is still supported.hjubeubaubhz)r}r(hXStatusReceivers' checkConfig method should no longer take an `errors` parameter. It should indicate errors by calling :py:func:`~buildbot.config.error`. hj[hh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXStatusReceivers' checkConfig method should no longer take an `errors` parameter. It should indicate errors by calling :py:func:`~buildbot.config.error`.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Kah2]r(h;X=StatusReceivers' checkConfig method should no longer take an rr}r(hX=StatusReceivers' checkConfig method should no longer take an hjubj )r}r(hX`errors`h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xerrorsrr}r(hUhjubah$jubh;X1 parameter. It should indicate errors by calling r r }r (hX1 parameter. It should indicate errors by calling hjubh)r }r (hX!:py:func:`~buildbot.config.error`rhjhh"h$hh&}r(UreftypeXfunchhXbuildbot.config.errorU refdomainXpyrh+]h*]U refexplicith(]h)]h.]hhjNjNuh0Kah2]rh)r}r(hjh&}r(h(]h)]r(jjXpy-funcreh*]h+]h.]uhj h2]rh;Xerrorrr}r(hUhjubah$hubaubh;X.r}r(hX.hjubeubaubhz)r}r(hX{Build steps now require that their name be a string. Previously, they would accept anything, but not behave appropriately. hj[hh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]r hJ)r!}r"(hXzBuild steps now require that their name be a string. Previously, they would accept anything, but not behave appropriately.r#hjhh"h$hNh&}r$(h(]h)]h*]h+]h.]uh0Kdh2]r%h;XzBuild steps now require that their name be a string. Previously, they would accept anything, but not behave appropriately.r&r'}r((hj#hj!ubaubaubhz)r)}r*(hXyThe web status no longer displays a potentially misleading message, indicating whether the build can be rebuilt exactly. hj[hh"h$h}h&}r+(h(]h)]h*]h+]h.]uh0Nh1hh2]r,hJ)r-}r.(hXxThe web status no longer displays a potentially misleading message, indicating whether the build can be rebuilt exactly.r/hj)hh"h$hNh&}r0(h(]h)]h*]h+]h.]uh0Kgh2]r1h;XxThe web status no longer displays a potentially misleading message, indicating whether the build can be rebuilt exactly.r2r3}r4(hj/hj-ubaubaubhz)r5}r6(hXlThe ``SetProperty`` step in ``buildbot.steps.shell`` has been renamed to :bb:step:`SetPropertyFromCommand`. hj[hh"h$h}h&}r7(h(]h)]h*]h+]h.]uh0Nh1hh2]r8hJ)r9}r:(hXkThe ``SetProperty`` step in ``buildbot.steps.shell`` has been renamed to :bb:step:`SetPropertyFromCommand`.hj5hh"h$hNh&}r;(h(]h)]h*]h+]h.]uh0Kjh2]r<(h;XThe r=r>}r?(hXThe hj9ubh)r@}rA(hX``SetProperty``h&}rB(h(]h)]h*]h+]h.]uhj9h2]rCh;X SetPropertyrDrE}rF(hUhj@ubah$hubh;X step in rGrH}rI(hX step in hj9ubh)rJ}rK(hX``buildbot.steps.shell``h&}rL(h(]h)]h*]h+]h.]uhj9h2]rMh;Xbuildbot.steps.shellrNrO}rP(hUhjJubah$hubh;X has been renamed to rQrR}rS(hX has been renamed to hj9ubh)rT}rU(hX!:bb:step:`SetPropertyFromCommand`rVhj9hh"h$hh&}rW(UreftypeXstephhXSetPropertyFromCommandU refdomainXbbrXh+]h*]U refexplicith(]h)]h.]hhuh0Kjh2]rYh)rZ}r[(hjVh&}r\(h(]h)]r](jjXXbb-stepr^eh*]h+]h.]uhjTh2]r_h;XSetPropertyFromCommandr`ra}rb(hUhjZubah$hubaubh;X.rc}rd(hX.hj9ubeubaubhz)re}rf(hXThe EC2 and libvirt latent slaves have been moved to ``buildbot.buildslave.ec2`` and ``buildbot.buildslave.libirt`` respectively. hj[hh"h$h}h&}rg(h(]h)]h*]h+]h.]uh0Nh1hh2]rhhJ)ri}rj(hXThe EC2 and libvirt latent slaves have been moved to ``buildbot.buildslave.ec2`` and ``buildbot.buildslave.libirt`` respectively.hjehh"h$hNh&}rk(h(]h)]h*]h+]h.]uh0Klh2]rl(h;X5The EC2 and libvirt latent slaves have been moved to rmrn}ro(hX5The EC2 and libvirt latent slaves have been moved to hjiubh)rp}rq(hX``buildbot.buildslave.ec2``h&}rr(h(]h)]h*]h+]h.]uhjih2]rsh;Xbuildbot.buildslave.ec2rtru}rv(hUhjpubah$hubh;X and rwrx}ry(hX and hjiubh)rz}r{(hX``buildbot.buildslave.libirt``h&}r|(h(]h)]h*]h+]h.]uhjih2]r}h;Xbuildbot.buildslave.libirtr~r}r(hUhjzubah$hubh;X respectively.rr}r(hX respectively.hjiubeubaubhz)r}r(hXPre v0.8.7 versions of buildbot supported passing keyword arguments to ``buildbot.process.BuildFactory.addStep``, but this was dropped. Support was added again, while still being deprecated, to ease transition. hj[hh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXPre v0.8.7 versions of buildbot supported passing keyword arguments to ``buildbot.process.BuildFactory.addStep``, but this was dropped. Support was added again, while still being deprecated, to ease transition.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Knh2]r(h;XGPre v0.8.7 versions of buildbot supported passing keyword arguments to rr}r(hXGPre v0.8.7 versions of buildbot supported passing keyword arguments to hjubh)r}r(hX)``buildbot.process.BuildFactory.addStep``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X%buildbot.process.BuildFactory.addSteprr}r(hUhjubah$hubh;Xb, but this was dropped. Support was added again, while still being deprecated, to ease transition.rr}r(hXb, but this was dropped. Support was added again, while still being deprecated, to ease transition.hjubeubaubeubeubh)r}r(hUhhThh"h$h%h&}r(h(]h)]h*]h+]rUchanges-for-developersrah.]rh auh0Krh1hh2]r(h4)r}r(hXChanges for Developersrhjhh"h$h8h&}r(h(]h)]h*]h+]h.]uh0Krh1hh2]rh;XChanges for Developersrr}r(hjhjubaubhs)r}r(hUhjhh"h$hvh&}r(hxX*h+]h*]h(]h)]h.]uh0Kth1hh2]r(hz)r}r(hXAdded an optional build start callback to ``buildbot.status.status_gerrit.GerritStatusPush`` This release includes the fix for :bb:bug:`2536`. hjhh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXAdded an optional build start callback to ``buildbot.status.status_gerrit.GerritStatusPush`` This release includes the fix for :bb:bug:`2536`.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Kth2]r(h;X*Added an optional build start callback to rr}r(hX*Added an optional build start callback to hjubh)r}r(hX2``buildbot.status.status_gerrit.GerritStatusPush``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X.buildbot.status.status_gerrit.GerritStatusPushrr}r(hUhjubah$hubh;X# This release includes the fix for rr}r(hX# This release includes the fix for hjubh)r}r(hUh&}r(hX bug #2536hX$http://trac.buildbot.net/ticket/2536h+]h*]h(]h)]h.]uhjh2]rh;X bug #2536rr}r(hUhjubah$hubh;X.r}r(hX.hjubeubaubhz)r}r(hXAn optional ``startCB`` callback to :bb:status:`GerritStatusPush` can be used to send a message back to the committer. See the linked documentation for details. hjhh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXAn optional ``startCB`` callback to :bb:status:`GerritStatusPush` can be used to send a message back to the committer. See the linked documentation for details.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Kwh2]r(h;X An optional rr}r(hX An optional hjubh)r}r(hX ``startCB``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;XstartCBrr}r(hUhjubah$hubh;X callback to rr}r(hX callback to hjubh)r}r(hX:bb:status:`GerritStatusPush`rhjhh"h$hh&}r(UreftypeXstatushhXGerritStatusPushU refdomainXbbrh+]h*]U refexplicith(]h)]h.]hhuh0Kwh2]rh)r}r(hjh&}r(h(]h)]r(jjX bb-statusreh*]h+]h.]uhjh2]rh;XGerritStatusPushrr}r(hUhjubah$hubaubh;X_ can be used to send a message back to the committer. See the linked documentation for details.rr}r(hX_ can be used to send a message back to the committer. See the linked documentation for details.hjubeubaubhz)r}r(hXbb:sched:`ChoiceStringParameter` has a new method ``getChoices`` that can be used to generate content dynamically for Force scheduler forms. hjhh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXbb:sched:`ChoiceStringParameter` has a new method ``getChoices`` that can be used to generate content dynamically for Force scheduler forms.hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0K{h2]r(h;X bb:sched:rr}r(hX bb:sched:hjubj )r}r(hX`ChoiceStringParameter`h&}r(h(]h)]h*]h+]h.]uhjh2]rh;XChoiceStringParameterrr}r(hUhjubah$jubh;X has a new method rr}r(hX has a new method hjubh)r}r(hX``getChoices``h&}r(h(]h)]h*]h+]h.]uhjh2]r h;X getChoicesr r }r (hUhjubah$hubh;XL that can be used to generate content dynamically for Force scheduler forms.r r}r(hXL that can be used to generate content dynamically for Force scheduler forms.hjubeubaubeubeubeubhh)r}r(hUhhhh"h$h%h&}r(h(]h)]h*]h+]rUdetailsrah.]rh auh0Kh1hh2]r(h4)r}r(hXDetailsrhjhh"h$h8h&}r(h(]h)]h*]h+]h.]uh0Kh1hh2]rh;XDetailsrr}r(hjhjubaubhJ)r}r (hX\For a more detailed description of the changes made in this version, see the git log itself:r!hjhh"h$hNh&}r"(h(]h)]h*]h+]h.]uh0Kh1hh2]r#h;X\For a more detailed description of the changes made in this version, see the git log itself:r$r%}r&(hj!hjubaubcdocutils.nodes literal_block r')r(}r)(hXgit log v0.8.7..v0.8.8hjhh"h$U literal_blockr*h&}r+(Ulinenosr,Ulanguager-XnonehDhEh+]h*]h(]h)]h.]uh0Kh1hh2]r.h;Xgit log v0.8.7..v0.8.8r/r0}r1(hUhj(ubaubeubh)r2}r3(hUhhhh"h$h%h&}r4(h(]h)]h*]h+]r5Uolder-versionsr6ah.]r7h auh0Kh1hh2]r8(h4)r9}r:(hXOlder Versionsr;hj2hh"h$h8h&}r<(h(]h)]h*]h+]h.]uh0Kh1hh2]r=h;XOlder Versionsr>r?}r@(hj;hj9ubaubhJ)rA}rB(hXRelease notes for older versions of Buildbot are available in the :bb:src:`master/docs/relnotes/` directory of the source tree. Newer versions are also available here:hj2hh"h$hNh&}rC(h(]h)]h*]h+]h.]uh0Kh1hh2]rD(h;XBRelease notes for older versions of Buildbot are available in the rErF}rG(hXBRelease notes for older versions of Buildbot are available in the hjAubh)rH}rI(hUh&}rJ(hXmaster/docs/relnotes/rKhXFhttps://github.com/buildbot/buildbot/blob/master/master/docs/relnotes/h+]h*]h(]h)]h.]uhjAh2]rLh)rM}rN(hjKh&}rO(h(]h)]h*]h+]h.]uhjHh2]rPh;Xmaster/docs/relnotes/rQrR}rS(hUhjMubah$hubah$hubh;XF directory of the source tree. Newer versions are also available here:rTrU}rV(hXF directory of the source tree. Newer versions are also available here:hjAubeubcdocutils.nodes compound rW)rX}rY(hUhj2hh"h$UcompoundrZh&}r[(h(]h)]r\Utoctree-wrapperr]ah*]h+]h.]uh0Nh1hh2]r^csphinx.addnodes toctree r_)r`}ra(hUhjXhh"h$Utoctreerbh&}rc(UnumberedrdKU includehiddenrehhU titlesonlyrfUglobrgh+]h*]h(]h)]h.]Uentriesrh]ri(NXrelnotes/0.8.7rjrkNXrelnotes/0.8.6rlrmeUhiddenrnU includefilesro]rp(jjjleUmaxdepthrqKuh0Kh2]ubaubeubeubhh"h$h%h&}rr(h(]h)]h*]h+]rsUslavertah.]ruhauh0Kh1hh2]rv(h4)rw}rx(hXSlaveryhhhh"h$h8h&}rz(h(]h)]h*]h+]h.]uh0Kh1hh2]r{h;XSlaver|r}}r~(hjyhjwubaubhh)r}r(hUhKhhhh"h$h%h&}r(h(]rjOah)]h*]h+]rUid2rah.]uh0Kh1hh2]rh4)r}r(hX2Deprecations, Removals, and Non-Compatible Changesrhjhh"h$h8h&}r(h(]h)]h*]h+]h.]uh0Kh1hh2]rh;X2Deprecations, Removals, and Non-Compatible Changesrr}r(hjhjubaubaubeubhh"h$h%h&}r(h(]rhgah)]h*]h+]rUid1rah.]uh0Kh1hh2]r(h4)r}r(hXFeaturesrhhhh"h$h8h&}r(h(]h)]h*]h+]h.]uh0Kh1hh2]rh;XFeaturesrr}r(hjhjubaubhs)r}r(hUhhhh"h$hvh&}r(hxX*h+]h*]h(]h)]h.]uh0Kh1hh2]r(hz)r}r(hXThe fix for Twisted bug #5079 is now applied on the slave side, too. This fixes a perspective broker memory leak in older versions of Twisted. This fix was added on the master in Buildbot-0.8.4 (see :bb:bug:`1958`). hjhh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXThe fix for Twisted bug #5079 is now applied on the slave side, too. This fixes a perspective broker memory leak in older versions of Twisted. This fix was added on the master in Buildbot-0.8.4 (see :bb:bug:`1958`).hjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Kh2]r(h;XThe fix for Twisted bug #5079 is now applied on the slave side, too. This fixes a perspective broker memory leak in older versions of Twisted. This fix was added on the master in Buildbot-0.8.4 (see rr}r(hXThe fix for Twisted bug #5079 is now applied on the slave side, too. This fixes a perspective broker memory leak in older versions of Twisted. This fix was added on the master in Buildbot-0.8.4 (see hjubh)r}r(hUh&}r(hX bug #1958hX$http://trac.buildbot.net/ticket/1958h+]h*]h(]h)]h.]uhjh2]rh;X bug #1958rr}r(hUhjubah$hubh;X).rr}r(hX).hjubeubaubhz)r}r(hXpThe ``--nodaemon`` option to ``buildslave start`` now correctly prevents the slave from forking before running. hjhh"h$h}h&}r(h(]h)]h*]h+]h.]uh0Nh1hh2]rhJ)r}r(hXoThe ``--nodaemon`` option to ``buildslave start`` now correctly prevents the slave from forking before running.rhjhh"h$hNh&}r(h(]h)]h*]h+]h.]uh0Kh2]r(h;XThe rr}r(hXThe hjubh)r}r(hX``--nodaemon``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;X --nodaemonrr}r(hUhjubah$hubh;X option to rr}r(hX option to hjubh)r}r(hX``buildslave start``h&}r(h(]h)]h*]h+]h.]uhjh2]rh;Xbuildslave startrr}r(hUhjubah$hubh;X> now correctly prevents the slave from forking before running.rr}r(hX> now correctly prevents the slave from forking before running.hjubeubaubeubeubhh"h$Usystem_messagerh&}r(h(]UlevelKh+]h*]rjaUsourceh"h)]h.]UlineKUtypeUINFOruh0Kh1hh2]rhJ)r}r(hUh&}r(h(]h)]h*]h+]h.]uhhh2]rh;X+Duplicate implicit target name: "features".rr}r(hUhjubah$hNubaubh)r}r(hUhjhh"h$jh&}r(h(]UlevelKh+]h*]rjaUsourceh"h)]h.]UlineKUtypejuh0Kh1hh2]rhJ)r}r(hUh&}r(h(]h)]h*]h+]h.]uhjh2]rh;XUDuplicate implicit target name: "deprecations, removals, and non-compatible changes".rr}r(hUhjubah$hNubaubeUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hjthNhNh h-h jh j6h hXh juh2]rhahUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh1hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]r Usettingsr (cdocutils.frontend Values r or }r (Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh8NUerror_encoding_error_handlerrUbackslashreplacerUdebugr NUembed_stylesheetr!Uoutput_encoding_error_handlerr"Ustrictr#U sectnum_xformr$KUdump_transformsr%NU docinfo_xformr&KUwarning_streamr'NUpep_file_url_templater(Upep-%04dr)Uexit_status_levelr*KUconfigr+NUstrict_visitorr,NUcloak_email_addressesr-Utrim_footnote_reference_spacer.Uenvr/NUdump_pseudo_xmlr0NUexpose_internalsr1NUsectsubtitle_xformr2U source_linkr3NUrfc_referencesr4NUoutput_encodingr5Uutf-8r6U source_urlr7NUinput_encodingr8U utf-8-sigr9U_disable_configr:NU id_prefixr;UU tab_widthr<KUerror_encodingr=UUTF-8r>U_sourcer?UO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/relnotes/0.8.8.rstr@Ugettext_compactrAU generatorrBNUdump_internalsrCNU smart_quotesrDU pep_base_urlrEUhttp://www.python.org/dev/peps/rFUsyntax_highlightrGUlongrHUinput_encoding_error_handlerrIj#Uauto_id_prefixrJUidrKUdoctitle_xformrLUstrip_elements_with_classesrMNU _config_filesrN]Ufile_insertion_enabledrOU raw_enabledrPKU dump_settingsrQNubUsymbol_footnote_startrRKUidsrS}rT(jthhihch-hjjjQjKjhjjhXhTjjj6j2uUsubstitution_namesrU}rVh$h1h&}rW(h(]h+]h*]Usourceh"h)]h.]uU footnotesrX]rYUrefidsrZ}r[ub.PK7D?\֕KK0buildbot-v0.8.9/.doctrees/relnotes/index.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XslaveqNXfeaturesqNXforward compatibilityqNXfixesq NX release notes for buildbot 0.8.9q NXchanges for developersq NXolder versionsq NXmasterq NXdetailsqNXgithub commit statusqX2deprecations, removals, and non-compatible changesqNuUsubstitution_defsq}qUparse_messagesq]q(cdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhh)q}q(hUhh)q }q!(hUhhUsourceq"cdocutils.nodes reprunicode q#XO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/relnotes/index.rstq$q%}q&bUtagnameq'Usectionq(U attributesq)}q*(Udupnamesq+]Uclassesq,]Ubackrefsq-]Uidsq.]q/U release-notes-for-buildbot-0-8-9q0aUnamesq1]q2h auUlineq3KUdocumentq4hUchildrenq5]q6(cdocutils.nodes title q7)q8}q9(hX Release Notes for Buildbot 0.8.9q:hh h"h%h'Utitleq;h)}q<(h+]h,]h-]h.]h1]uh3Kh4hh5]q=cdocutils.nodes Text q>X Release Notes for Buildbot 0.8.9q?q@}qA(hh:hh8ubaubcdocutils.nodes comment qB)qC}qD(hXAny change that adds a feature or fixes a bug should have an entry here. Most simply need an additional bulleted list item, but more significant changes can be given a subsection of their own.hh h"h%h'UcommentqEh)}qF(U xml:spaceqGUpreserveqHh.]h-]h+]h,]h1]uh3Kh4hh5]qIh>XAny change that adds a feature or fixes a bug should have an entry here. Most simply need an additional bulleted list item, but more significant changes can be given a subsection of their own.qJqK}qL(hUhhCubaubcdocutils.nodes paragraph qM)qN}qO(hXeThe following are the release notes for Buildbot 0.8.9. Buildbot 0.8.9 was released on 14 June, 2014.qPhh h"h%h'U paragraphqQh)}qR(h+]h,]h-]h.]h1]uh3K h4hh5]qSh>XeThe following are the release notes for Buildbot 0.8.9. Buildbot 0.8.9 was released on 14 June, 2014.qTqU}qV(hhPhhNubaubh)qW}qX(hUhh h"h%h'h(h)}qY(h+]h,]h-]h.]qZUmasterq[ah1]q\h auh3K h4hh5]q](h7)q^}q_(hXMasterq`hhWh"h%h'h;h)}qa(h+]h,]h-]h.]h1]uh3K h4hh5]qbh>XMasterqcqd}qe(hh`hh^ubaubh)qf}qg(hUhKhhWh"h%h'h(h)}qh(h+]qiXfeaturesqjah,]h-]h.]qkUfeaturesqlah1]uh3Kh4hh5]qm(h7)qn}qo(hXFeaturesqphhfh"h%h'h;h)}qq(h+]h,]h-]h.]h1]uh3Kh4hh5]qrh>XFeaturesqsqt}qu(hhphhnubaubcdocutils.nodes bullet_list qv)qw}qx(hUhhfh"h%h'U bullet_listqyh)}qz(Ubulletq{X*h.]h-]h+]h,]h1]uh3Kh4hh5]q|(cdocutils.nodes list_item q})q~}q(hX]The following optional parameters have been added to :py:class:`EC2LatentBuildSlave` * Boolean parameter ``spot_instance``, default False, creates a spot instance. * Float parameter ``max_spot_price`` defines the maximum bid for a spot instance. * List parameter ``volumes``, takes a list of (volume_id, mount_point) tuples. * String parameter ``placement`` is appended to the ``region`` parameter, e.g. ``region='us-west-2', placement='b'`` will result in the spot request being placed in us-west-2b. * Float parameter ``price_multiplier`` specifies the percentage bid above the 24-hour average spot price. * Dict parameter ``tags`` specifies AWS tags as key/value pairs to be applied to new instances. With ``spot_instance=True``, an ``EC2LatentBuildSlave`` will attempt to create a spot instance with the provided spot price, placement, and so on. hhwh"h%h'U list_itemqh)}q(h+]h,]h-]h.]h1]uh3Nh4hh5]q(cdocutils.nodes definition_list q)q}q(hUh)}q(h+]h,]h-]h.]h1]uhh~h5]qcdocutils.nodes definition_list_item q)q}q(hXThe following optional parameters have been added to :py:class:`EC2LatentBuildSlave` * Boolean parameter ``spot_instance``, default False, creates a spot instance. * Float parameter ``max_spot_price`` defines the maximum bid for a spot instance. * List parameter ``volumes``, takes a list of (volume_id, mount_point) tuples. * String parameter ``placement`` is appended to the ``region`` parameter, e.g. ``region='us-west-2', placement='b'`` will result in the spot request being placed in us-west-2b. * Float parameter ``price_multiplier`` specifies the percentage bid above the 24-hour average spot price. * Dict parameter ``tags`` specifies AWS tags as key/value pairs to be applied to new instances. hhh"h%h'Udefinition_list_itemqh)}q(h+]h,]h-]h.]h1]uh3Kh5]q(cdocutils.nodes term q)q}q(hXTThe following optional parameters have been added to :py:class:`EC2LatentBuildSlave`hhh"h%h'Utermqh)}q(h+]h,]h-]h.]h1]uh3Kh5]q(h>X5The following optional parameters have been added to qq}q(hX5The following optional parameters have been added to hhubcsphinx.addnodes pending_xref q)q}q(hX:py:class:`EC2LatentBuildSlave`qhhh"h%h'U pending_xrefqh)}q(UreftypeXclassUrefwarnqU reftargetqXEC2LatentBuildSlaveU refdomainXpyqh.]h-]U refexplicith+]h,]h1]UrefdocqXrelnotes/indexqUpy:classqNU py:moduleqNuh3Kh5]qcdocutils.nodes literal q)q}q(hhh)}q(h+]h,]q(UxrefqhXpy-classqeh-]h.]h1]uhhh5]qh>XEC2LatentBuildSlaveqq}q(hUhhubah'Uliteralqubaubeubcdocutils.nodes definition q)q}q(hUh)}q(h+]h,]h-]h.]h1]uhhh5]qhv)q}q(hUh)}q(h{X*h.]h-]h+]h,]h1]uhhh5]q(h})q}q(hXLBoolean parameter ``spot_instance``, default False, creates a spot instance.qh)}q(h+]h,]h-]h.]h1]uhhh5]qhM)q}q(hhhhh"h%h'hQh)}q(h+]h,]h-]h.]h1]uh3Kh5]q(h>XBoolean parameter qÅq}q(hXBoolean parameter hhubh)q}q(hX``spot_instance``h)}q(h+]h,]h-]h.]h1]uhhh5]qh>X spot_instanceqʅq}q(hUhhubah'hubh>X), default False, creates a spot instance.qͅq}q(hX), default False, creates a spot instance.hhubeubah'hubh})q}q(hXOFloat parameter ``max_spot_price`` defines the maximum bid for a spot instance.qh)}q(h+]h,]h-]h.]h1]uhhh5]qhM)q}q(hhhhh"h%h'hQh)}q(h+]h,]h-]h.]h1]uh3Kh5]q(h>XFloat parameter qمq}q(hXFloat parameter hhubh)q}q(hX``max_spot_price``h)}q(h+]h,]h-]h.]h1]uhhh5]qh>Xmax_spot_priceqq}q(hUhhubah'hubh>X- defines the maximum bid for a spot instance.qㅁq}q(hX- defines the maximum bid for a spot instance.hhubeubah'hubh})q}q(hXLList parameter ``volumes``, takes a list of (volume_id, mount_point) tuples.qh)}q(h+]h,]h-]h.]h1]uhhh5]qhM)q}q(hhhhh"h%h'hQh)}q(h+]h,]h-]h.]h1]uh3Kh5]q(h>XList parameter qq}q(hXList parameter hhubh)q}q(hX ``volumes``h)}q(h+]h,]h-]h.]h1]uhhh5]qh>Xvolumesqq}q(hUhhubah'hubh>X2, takes a list of (volume_id, mount_point) tuples.qq}q(hX2, takes a list of (volume_id, mount_point) tuples.hhubeubah'hubh})q}q(hXString parameter ``placement`` is appended to the ``region`` parameter, e.g. ``region='us-west-2', placement='b'`` will result in the spot request being placed in us-west-2b.h)}q(h+]h,]h-]h.]h1]uhhh5]qhM)r}r(hXString parameter ``placement`` is appended to the ``region`` parameter, e.g. ``region='us-west-2', placement='b'`` will result in the spot request being placed in us-west-2b.hhh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>XString parameter rr}r(hXString parameter hjubh)r}r(hX ``placement``h)}r (h+]h,]h-]h.]h1]uhjh5]r h>X placementr r }r (hUhjubah'hubh>X is appended to the rr}r(hX is appended to the hjubh)r}r(hX ``region``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xregionrr}r(hUhjubah'hubh>X parameter, e.g. rr}r(hX parameter, e.g. hjubh)r}r(hX%``region='us-west-2', placement='b'``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X!region='us-west-2', placement='b'rr }r!(hUhjubah'hubh>X< will result in the spot request being placed in us-west-2b.r"r#}r$(hX< will result in the spot request being placed in us-west-2b.hjubeubah'hubh})r%}r&(hXgFloat parameter ``price_multiplier`` specifies the percentage bid above the 24-hour average spot price.r'h)}r((h+]h,]h-]h.]h1]uhhh5]r)hM)r*}r+(hj'hj%h"h%h'hQh)}r,(h+]h,]h-]h.]h1]uh3Kh5]r-(h>XFloat parameter r.r/}r0(hXFloat parameter hj*ubh)r1}r2(hX``price_multiplier``h)}r3(h+]h,]h-]h.]h1]uhj*h5]r4h>Xprice_multiplierr5r6}r7(hUhj1ubah'hubh>XC specifies the percentage bid above the 24-hour average spot price.r8r9}r:(hXC specifies the percentage bid above the 24-hour average spot price.hj*ubeubah'hubh})r;}r<(hX^Dict parameter ``tags`` specifies AWS tags as key/value pairs to be applied to new instances. h)}r=(h+]h,]h-]h.]h1]uhhh5]r>hM)r?}r@(hX]Dict parameter ``tags`` specifies AWS tags as key/value pairs to be applied to new instances.hj;h"h%h'hQh)}rA(h+]h,]h-]h.]h1]uh3Kh5]rB(h>XDict parameter rCrD}rE(hXDict parameter hj?ubh)rF}rG(hX``tags``h)}rH(h+]h,]h-]h.]h1]uhj?h5]rIh>XtagsrJrK}rL(hUhjFubah'hubh>XF specifies AWS tags as key/value pairs to be applied to new instances.rMrN}rO(hXF specifies AWS tags as key/value pairs to be applied to new instances.hj?ubeubah'hubeh'hyubah'U definitionrPubeubah'Udefinition_listrQubhM)rR}rS(hXWith ``spot_instance=True``, an ``EC2LatentBuildSlave`` will attempt to create a spot instance with the provided spot price, placement, and so on.hh~h"h%h'hQh)}rT(h+]h,]h-]h.]h1]uh3Kh5]rU(h>XWith rVrW}rX(hXWith hjRubh)rY}rZ(hX``spot_instance=True``h)}r[(h+]h,]h-]h.]h1]uhjRh5]r\h>Xspot_instance=Truer]r^}r_(hUhjYubah'hubh>X, an r`ra}rb(hX, an hjRubh)rc}rd(hX``EC2LatentBuildSlave``h)}re(h+]h,]h-]h.]h1]uhjRh5]rfh>XEC2LatentBuildSlavergrh}ri(hUhjcubah'hubh>X[ will attempt to create a spot instance with the provided spot price, placement, and so on.rjrk}rl(hX[ will attempt to create a spot instance with the provided spot price, placement, and so on.hjRubeubeubh})rm}rn(hXGThe web hooks now include support for Bitbucket, GitLab and Gitorious. hhwh"h%h'hh)}ro(h+]h,]h-]h.]h1]uh3Nh4hh5]rphM)rq}rr(hXFThe web hooks now include support for Bitbucket, GitLab and Gitorious.rshjmh"h%h'hQh)}rt(h+]h,]h-]h.]h1]uh3Kh5]ruh>XFThe web hooks now include support for Bitbucket, GitLab and Gitorious.rvrw}rx(hjshjqubaubaubh})ry}rz(hXOThe GitHub webhook has been updated to work with v3 of the GitHub webhook API. hhwh"h%h'hh)}r{(h+]h,]h-]h.]h1]uh3Nh4hh5]r|hM)r}}r~(hXNThe GitHub webhook has been updated to work with v3 of the GitHub webhook API.rhjyh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K h5]rh>XNThe GitHub webhook has been updated to work with v3 of the GitHub webhook API.rr}r(hjhj}ubaubaubh})r}r(hXTThe GitHub webhook can now optionally ignore non-distinct commits (:bb:bug:`1861`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXSThe GitHub webhook can now optionally ignore non-distinct commits (:bb:bug:`1861`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K"h5]r(h>XCThe GitHub webhook can now optionally ignore non-distinct commits (rr}r(hXCThe GitHub webhook can now optionally ignore non-distinct commits (hjubcdocutils.nodes reference r)r}r(hUh)}r(UreftitlerX bug #1861UrefurirX$http://trac.buildbot.net/ticket/1861h.]h-]h+]h,]h1]uhjh5]rh>X bug #1861rr}r(hUhjubah'U referencerubh>X).rr}r(hX).hjubeubaubh})r}r(hXThe :bb:chsrc:`HgPoller` and :bb:chsrc:`GitPoller` now split filenames on newlines, rather than whitespace, so files containing whitespace are handled correctly. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXThe :bb:chsrc:`HgPoller` and :bb:chsrc:`GitPoller` now split filenames on newlines, rather than whitespace, so files containing whitespace are handled correctly.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K$h5]r(h>XThe rr}r(hXThe hjubh)r}r(hX:bb:chsrc:`HgPoller`rhjh"h%h'hh)}r(UreftypeXchsrchhXHgPollerU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K$h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-chsrcreh-]h.]h1]uhjh5]rh>XHgPollerrr}r(hUhjubah'hubaubh>X and rr}r(hX and hjubh)r}r(hX:bb:chsrc:`GitPoller`rhjh"h%h'hh)}r(UreftypeXchsrchhX GitPollerU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K$h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-chsrcreh-]h.]h1]uhjh5]rh>X GitPollerrr}r(hUhjubah'hubaubh>Xo now split filenames on newlines, rather than whitespace, so files containing whitespace are handled correctly.rr}r(hXo now split filenames on newlines, rather than whitespace, so files containing whitespace are handled correctly.hjubeubaubh})r}r(hXAdd 'pollAtLaunch' flag for polling change sources. This allows a poller to poll immediately on launch and get changes that occurred while it was down. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXAdd 'pollAtLaunch' flag for polling change sources. This allows a poller to poll immediately on launch and get changes that occurred while it was down.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K&h5]rh>XAdd 'pollAtLaunch' flag for polling change sources. This allows a poller to poll immediately on launch and get changes that occurred while it was down.rr}r(hjhjubaubaubh})r}r(hX?Added the :bb:chsrc:`BitbucketPullrequestPoller` changesource. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX>Added the :bb:chsrc:`BitbucketPullrequestPoller` changesource.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K(h5]r(h>X Added the rr}r(hX Added the hjubh)r}r(hX&:bb:chsrc:`BitbucketPullrequestPoller`rhjh"h%h'hh)}r(UreftypeXchsrchhXBitbucketPullrequestPollerU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K(h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-chsrcreh-]h.]h1]uhjh5]rh>XBitbucketPullrequestPollerrr}r(hUhjubah'hubaubh>X changesource.rr}r(hX changesource.hjubeubaubh})r}r(hXbThe :bb:chsrc:`GitPoller` can now be configured to poll all available branches (:bb:pull:`1010`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXaThe :bb:chsrc:`GitPoller` can now be configured to poll all available branches (:bb:pull:`1010`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K*h5]r(h>XThe rr}r(hXThe hjubh)r}r(hX:bb:chsrc:`GitPoller`rhjh"h%h'hh)}r(UreftypeXchsrchhX GitPollerU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K*h5]rh)r}r(hjh)}r (h+]h,]r (hjXbb-chsrcr eh-]h.]h1]uhjh5]r h>X GitPollerr r}r(hUhjubah'hubaubh>X7 can now be configured to poll all available branches (rr}r(hX7 can now be configured to poll all available branches (hjubj)r}r(hUh)}r(jXpull request 1010rjX.https://github.com/buildbot/buildbot/pull/1010h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 1010rr}r(hjhjubah'jubh>X).rr}r(hX).hjubeubaubh})r}r(hXThe :bb:chsrc:`P4Source` changesource now supports Perforce servers in a different timezone than the buildbot master (:bb:pull:`728`). hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r!hM)r"}r#(hXThe :bb:chsrc:`P4Source` changesource now supports Perforce servers in a different timezone than the buildbot master (:bb:pull:`728`).hjh"h%h'hQh)}r$(h+]h,]h-]h.]h1]uh3K,h5]r%(h>XThe r&r'}r((hXThe hj"ubh)r)}r*(hX:bb:chsrc:`P4Source`r+hj"h"h%h'hh)}r,(UreftypeXchsrchhXP4SourceU refdomainXbbr-h.]h-]U refexplicith+]h,]h1]hhuh3K,h5]r.h)r/}r0(hj+h)}r1(h+]h,]r2(hj-Xbb-chsrcr3eh-]h.]h1]uhj)h5]r4h>XP4Sourcer5r6}r7(hUhj/ubah'hubaubh>X^ changesource now supports Perforce servers in a different timezone than the buildbot master (r8r9}r:(hX^ changesource now supports Perforce servers in a different timezone than the buildbot master (hj"ubj)r;}r<(hUh)}r=(jXpull request 728r>jX-https://github.com/buildbot/buildbot/pull/728h.]h-]h+]h,]h1]uhj"h5]r?h>Xpull request 728r@rA}rB(hj>hj;ubah'jubh>X).rCrD}rE(hX).hj"ubeubaubh})rF}rG(hXkEach Scheduler type can now take a 'reason' argument to customize the reason it uses for triggered builds. hhwh"h%h'hh)}rH(h+]h,]h-]h.]h1]uh3Nh4hh5]rIhM)rJ}rK(hXjEach Scheduler type can now take a 'reason' argument to customize the reason it uses for triggered builds.rLhjFh"h%h'hQh)}rM(h+]h,]h-]h.]h1]uh3K.h5]rNh>XjEach Scheduler type can now take a 'reason' argument to customize the reason it uses for triggered builds.rOrP}rQ(hjLhjJubaubaubh})rR}rS(hXA new argument ``createAbsoluteSourceStamps`` has been added to :bb:sched:`SingleBranchScheduler` for use with multiple codebases. hhwh"h%h'hh)}rT(h+]h,]h-]h.]h1]uh3Nh4hh5]rUhM)rV}rW(hXA new argument ``createAbsoluteSourceStamps`` has been added to :bb:sched:`SingleBranchScheduler` for use with multiple codebases.hjRh"h%h'hQh)}rX(h+]h,]h-]h.]h1]uh3K0h5]rY(h>XA new argument rZr[}r\(hXA new argument hjVubh)r]}r^(hX``createAbsoluteSourceStamps``h)}r_(h+]h,]h-]h.]h1]uhjVh5]r`h>XcreateAbsoluteSourceStampsrarb}rc(hUhj]ubah'hubh>X has been added to rdre}rf(hX has been added to hjVubh)rg}rh(hX!:bb:sched:`SingleBranchScheduler`rihjVh"h%h'hh)}rj(UreftypeXschedhhXSingleBranchSchedulerU refdomainXbbrkh.]h-]U refexplicith+]h,]h1]hhuh3K0h5]rlh)rm}rn(hjih)}ro(h+]h,]rp(hjkXbb-schedrqeh-]h.]h1]uhjgh5]rrh>XSingleBranchSchedulerrsrt}ru(hUhjmubah'hubaubh>X! for use with multiple codebases.rvrw}rx(hX! for use with multiple codebases.hjVubeubaubh})ry}rz(hXuA new argument ``createAbsoluteSourceStamps`` has been added to :bb:sched:`Nightly` for use with multiple codebases. hhwh"h%h'hh)}r{(h+]h,]h-]h.]h1]uh3Nh4hh5]r|hM)r}}r~(hXtA new argument ``createAbsoluteSourceStamps`` has been added to :bb:sched:`Nightly` for use with multiple codebases.hjyh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K2h5]r(h>XA new argument rr}r(hXA new argument hj}ubh)r}r(hX``createAbsoluteSourceStamps``h)}r(h+]h,]h-]h.]h1]uhj}h5]rh>XcreateAbsoluteSourceStampsrr}r(hUhjubah'hubh>X has been added to rr}r(hX has been added to hj}ubh)r}r(hX:bb:sched:`Nightly`rhj}h"h%h'hh)}r(UreftypeXschedhhXNightlyU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K2h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-schedreh-]h.]h1]uhjh5]rh>XNightlyrr}r(hUhjubah'hubaubh>X! for use with multiple codebases.rr}r(hX! for use with multiple codebases.hj}ubeubaubh})r}r(hX;The :bb:sched:`Periodic` scheduler now supports codebases. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX:The :bb:sched:`Periodic` scheduler now supports codebases.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K4h5]r(h>XThe rr}r(hXThe hjubh)r}r(hX:bb:sched:`Periodic`rhjh"h%h'hh)}r(UreftypeXschedhhXPeriodicU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K4h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-schedreh-]h.]h1]uhjh5]rh>XPeriodicrr}r(hUhjubah'hubaubh>X" scheduler now supports codebases.rr}r(hX" scheduler now supports codebases.hjubeubaubh})r}r(hX~The :bb:sched:`ForceScheduler` now takes a ``buttonName`` argument to specify the name of the button on the force-build form. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX}The :bb:sched:`ForceScheduler` now takes a ``buttonName`` argument to specify the name of the button on the force-build form.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K6h5]r(h>XThe rr}r(hXThe hjubh)r}r(hX:bb:sched:`ForceScheduler`rhjh"h%h'hh)}r(UreftypeXschedhhXForceSchedulerU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K6h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-schedreh-]h.]h1]uhjh5]rh>XForceSchedulerrr}r(hUhjubah'hubaubh>X now takes a rr}r(hX now takes a hjubh)r}r(hX``buttonName``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X buttonNamerr}r(hUhjubah'hubh>XD argument to specify the name of the button on the force-build form.rr}r(hXD argument to specify the name of the button on the force-build form.hjubeubaubh})r}r(hXMaster side source checkout steps now support patches (:bb:bug:`2098`). The :bb:step:`Git` and :bb:step:`Mercurial` steps use their inbuilt commands to apply patches (:bb:bug:`2563`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXMaster side source checkout steps now support patches (:bb:bug:`2098`). The :bb:step:`Git` and :bb:step:`Mercurial` steps use their inbuilt commands to apply patches (:bb:bug:`2563`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K8h5]r(h>X7Master side source checkout steps now support patches (rr}r(hX7Master side source checkout steps now support patches (hjubj)r}r(hUh)}r(jX bug #2098jX$http://trac.buildbot.net/ticket/2098h.]h-]h+]h,]h1]uhjh5]rh>X bug #2098rr}r(hUhjubah'jubh>X). The rr}r(hX). The hjubh)r}r(hX:bb:step:`Git`rhjh"h%h'hh)}r(UreftypeXstephhXGitU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K8h5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XGitrr}r(hUhjubah'hubaubh>X and rr }r (hX and hjubh)r }r (hX:bb:step:`Mercurial`r hjh"h%h'hh)}r(UreftypeXstephhX MercurialU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3K8h5]rh)r}r(hj h)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhj h5]rh>X Mercurialrr}r(hUhjubah'hubaubh>X4 steps use their inbuilt commands to apply patches (rr}r(hX4 steps use their inbuilt commands to apply patches (hjubj)r}r(hUh)}r(jX bug #2563jX$http://trac.buildbot.net/ticket/2563h.]h-]h+]h,]h1]uhjh5]r h>X bug #2563r!r"}r#(hUhjubah'jubh>X).r$r%}r&(hX).hjubeubaubh})r'}r((hXMMaster side source checkout steps now support retry option (:bb:bug:`2465`). hhwh"h%h'hh)}r)(h+]h,]h-]h.]h1]uh3Nh4hh5]r*hM)r+}r,(hXLMaster side source checkout steps now support retry option (:bb:bug:`2465`).hj'h"h%h'hQh)}r-(h+]h,]h-]h.]h1]uh3K:h5]r.(h>X<Master side source checkout steps now support retry option (r/r0}r1(hX<Master side source checkout steps now support retry option (hj+ubj)r2}r3(hUh)}r4(jX bug #2465jX$http://trac.buildbot.net/ticket/2465h.]h-]h+]h,]h1]uhj+h5]r5h>X bug #2465r6r7}r8(hUhj2ubah'jubh>X).r9r:}r;(hX).hj+ubeubaubh})r<}r=(hX[Master-side source checkout steps now respond to the "stop build" button (:bb:bug:`2356`). hhwh"h%h'hh)}r>(h+]h,]h-]h.]h1]uh3Nh4hh5]r?hM)r@}rA(hXZMaster-side source checkout steps now respond to the "stop build" button (:bb:bug:`2356`).hj<h"h%h'hQh)}rB(h+]h,]h-]h.]h1]uh3KXJMaster-side source checkout steps now respond to the "stop build" button (rDrE}rF(hXJMaster-side source checkout steps now respond to the "stop build" button (hj@ubj)rG}rH(hUh)}rI(jX bug #2356jX$http://trac.buildbot.net/ticket/2356h.]h-]h+]h,]h1]uhj@h5]rJh>X bug #2356rKrL}rM(hUhjGubah'jubh>X).rNrO}rP(hX).hj@ubeubaubh})rQ}rR(hXI:bb:step:`Git` source checkout step now supports reference repositories. hhwh"h%h'hh)}rS(h+]h,]h-]h.]h1]uh3Nh4hh5]rThM)rU}rV(hXH:bb:step:`Git` source checkout step now supports reference repositories.hjQh"h%h'hQh)}rW(h+]h,]h-]h.]h1]uh3K>h5]rX(h)rY}rZ(hX:bb:step:`Git`r[hjUh"h%h'hh)}r\(UreftypeXstephhXGitU refdomainXbbr]h.]h-]U refexplicith+]h,]h1]hhuh3K>h5]r^h)r_}r`(hj[h)}ra(h+]h,]rb(hj]Xbb-steprceh-]h.]h1]uhjYh5]rdh>XGitrerf}rg(hUhj_ubah'hubaubh>X: source checkout step now supports reference repositories.rhri}rj(hX: source checkout step now supports reference repositories.hjUubeubaubh})rk}rl(hXThe :bb:step:`Git` step now uses the `git clean` option `-f` twice, to also remove untracked directories managed by another git repository. See :bb:bug:`2560`. hhwh"h%h'hh)}rm(h+]h,]h-]h.]h1]uh3Nh4hh5]rnhM)ro}rp(hXThe :bb:step:`Git` step now uses the `git clean` option `-f` twice, to also remove untracked directories managed by another git repository. See :bb:bug:`2560`.hjkh"h%h'hQh)}rq(h+]h,]h-]h.]h1]uh3K@h5]rr(h>XThe rsrt}ru(hXThe hjoubh)rv}rw(hX:bb:step:`Git`rxhjoh"h%h'hh)}ry(UreftypeXstephhXGitU refdomainXbbrzh.]h-]U refexplicith+]h,]h1]hhuh3K@h5]r{h)r|}r}(hjxh)}r~(h+]h,]r(hjzXbb-stepreh-]h.]h1]uhjvh5]rh>XGitrr}r(hUhj|ubah'hubaubh>X step now uses the rr}r(hX step now uses the hjoubcdocutils.nodes title_reference r)r}r(hX `git clean`h)}r(h+]h,]h-]h.]h1]uhjoh5]rh>X git cleanrr}r(hUhjubah'Utitle_referencerubh>X option rr}r(hX option hjoubj)r}r(hX`-f`h)}r(h+]h,]h-]h.]h1]uhjoh5]rh>X-frr}r(hUhjubah'jubh>XT twice, to also remove untracked directories managed by another git repository. See rr}r(hXT twice, to also remove untracked directories managed by another git repository. See hjoubj)r}r(hUh)}r(jX bug #2560jX$http://trac.buildbot.net/ticket/2560h.]h-]h+]h,]h1]uhjoh5]rh>X bug #2560rr}r(hUhjubah'jubh>X.r}r(hX.hjoubeubaubh})r}r(hXYThe ``branch`` and ``codebase`` arguments to the :bb:step:`Git` step are now renderable. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXXThe ``branch`` and ``codebase`` arguments to the :bb:step:`Git` step are now renderable.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KCh5]r(h>XThe rr}r(hXThe hjubh)r}r(hX ``branch``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xbranchrr}r(hUhjubah'hubh>X and rr}r(hX and hjubh)r}r(hX ``codebase``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xcodebaserr}r(hUhjubah'hubh>X arguments to the rr}r(hX arguments to the hjubh)r}r(hX:bb:step:`Git`rhjh"h%h'hh)}r(UreftypeXstephhXGitU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3KCh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XGitrr}r(hUhjubah'hubaubh>X step are now renderable.rr}r(hX step are now renderable.hjubeubaubh})r}r(hXTGerrit integration with :bb:step:`Git` Source step on master side (:bb:bug:`2485`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXSGerrit integration with :bb:step:`Git` Source step on master side (:bb:bug:`2485`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KEh5]r(h>XGerrit integration with rr}r(hXGerrit integration with hjubh)r}r(hX:bb:step:`Git`rhjh"h%h'hh)}r(UreftypeXstephhXGitU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3KEh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XGitrr}r(hUhjubah'hubaubh>X Source step on master side (rr}r(hX Source step on master side (hjubj)r}r(hUh)}r(jX bug #2485jX$http://trac.buildbot.net/ticket/2485h.]h-]h+]h,]h1]uhjh5]rh>X bug #2485rr}r(hUhjubah'jubh>X).rr}r(hX).hjubeubaubh})r}r(hX>:bb:step:`P4` source step now supports more advanced options. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX=:bb:step:`P4` source step now supports more advanced options.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KGh5]r(h)r}r(hX :bb:step:`P4`r hjh"h%h'hh)}r (UreftypeXstephhXP4U refdomainXbbr h.]h-]U refexplicith+]h,]h1]hhuh3KGh5]r h)r }r(hj h)}r(h+]h,]r(hj Xbb-stepreh-]h.]h1]uhjh5]rh>XP4rr}r(hUhj ubah'hubaubh>X0 source step now supports more advanced options.rr}r(hX0 source step now supports more advanced options.hjubeubaubh})r}r(hXhThe master-side :bb:step:`SVN` step now supports authentication for mode=export, fixing :bb:bug:`2463`. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXgThe master-side :bb:step:`SVN` step now supports authentication for mode=export, fixing :bb:bug:`2463`.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KIh5]r (h>XThe master-side r!r"}r#(hXThe master-side hjubh)r$}r%(hX:bb:step:`SVN`r&hjh"h%h'hh)}r'(UreftypeXstephhXSVNU refdomainXbbr(h.]h-]U refexplicith+]h,]h1]hhuh3KIh5]r)h)r*}r+(hj&h)}r,(h+]h,]r-(hj(Xbb-stepr.eh-]h.]h1]uhj$h5]r/h>XSVNr0r1}r2(hUhj*ubah'hubaubh>X: step now supports authentication for mode=export, fixing r3r4}r5(hX: step now supports authentication for mode=export, fixing hjubj)r6}r7(hUh)}r8(jX bug #2463jX$http://trac.buildbot.net/ticket/2463h.]h-]h+]h,]h1]uhjh5]r9h>X bug #2463r:r;}r<(hUhj6ubah'jubh>X.r=}r>(hX.hjubeubaubh})r?}r@(hX^The :bb:step:`SVN` step will now canonicalize URL's before matching them for better accuracy. hhwh"h%h'hh)}rA(h+]h,]h-]h.]h1]uh3Nh4hh5]rBhM)rC}rD(hX]The :bb:step:`SVN` step will now canonicalize URL's before matching them for better accuracy.hj?h"h%h'hQh)}rE(h+]h,]h-]h.]h1]uh3KKh5]rF(h>XThe rGrH}rI(hXThe hjCubh)rJ}rK(hX:bb:step:`SVN`rLhjCh"h%h'hh)}rM(UreftypeXstephhXSVNU refdomainXbbrNh.]h-]U refexplicith+]h,]h1]hhuh3KKh5]rOh)rP}rQ(hjLh)}rR(h+]h,]rS(hjNXbb-steprTeh-]h.]h1]uhjJh5]rUh>XSVNrVrW}rX(hUhjPubah'hubaubh>XK step will now canonicalize URL's before matching them for better accuracy.rYrZ}r[(hXK step will now canonicalize URL's before matching them for better accuracy.hjCubeubaubh})r\}r](hX[The :bb:step:`SVN` step now obfuscates the password in status logs, fixing :bb:bug:`2468`. hhwh"h%h'hh)}r^(h+]h,]h-]h.]h1]uh3Nh4hh5]r_hM)r`}ra(hXZThe :bb:step:`SVN` step now obfuscates the password in status logs, fixing :bb:bug:`2468`.hj\h"h%h'hQh)}rb(h+]h,]h-]h.]h1]uh3KMh5]rc(h>XThe rdre}rf(hXThe hj`ubh)rg}rh(hX:bb:step:`SVN`rihj`h"h%h'hh)}rj(UreftypeXstephhXSVNU refdomainXbbrkh.]h-]U refexplicith+]h,]h1]hhuh3KMh5]rlh)rm}rn(hjih)}ro(h+]h,]rp(hjkXbb-steprqeh-]h.]h1]uhjgh5]rrh>XSVNrsrt}ru(hUhjmubah'hubaubh>X9 step now obfuscates the password in status logs, fixing rvrw}rx(hX9 step now obfuscates the password in status logs, fixing hj`ubj)ry}rz(hUh)}r{(jX bug #2468jX$http://trac.buildbot.net/ticket/2468h.]h-]h+]h,]h1]uhj`h5]r|h>X bug #2468r}r~}r(hUhjyubah'jubh>X.r}r(hX.hj`ubeubaubh})r}r(hXs:bb:step:`SVN` source step and ShellCommand now support password obfuscation. (:bb:bug:`2468` and :bb:bug:`1478`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXr:bb:step:`SVN` source step and ShellCommand now support password obfuscation. (:bb:bug:`2468` and :bb:bug:`1478`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KOh5]r(h)r}r(hX:bb:step:`SVN`rhjh"h%h'hh)}r(UreftypeXstephhXSVNU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3KOh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XSVNrr}r(hUhjubah'hubaubh>XA source step and ShellCommand now support password obfuscation. (rr}r(hXA source step and ShellCommand now support password obfuscation. (hjubj)r}r(hUh)}r(jX bug #2468jX$http://trac.buildbot.net/ticket/2468h.]h-]h+]h,]h1]uhjh5]rh>X bug #2468rr}r(hUhjubah'jubh>X and rr}r(hX and hjubj)r}r(hUh)}r(jX bug #1478jX$http://trac.buildbot.net/ticket/1478h.]h-]h+]h,]h1]uhjh5]rh>X bug #1478rr}r(hUhjubah'jubh>X).rr}r(hX).hjubeubaubh})r}r(hX:bb:step:`CVS` source step now checks for "sticky dates" from a previous checkout before updating an existing source directory. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX:bb:step:`CVS` source step now checks for "sticky dates" from a previous checkout before updating an existing source directory.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KQh5]r(h)r}r(hX:bb:step:`CVS`rhjh"h%h'hh)}r(UreftypeXstephhXCVSU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3KQh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XCVSrr}r(hUhjubah'hubaubh>Xq source step now checks for "sticky dates" from a previous checkout before updating an existing source directory.rr}r(hXq source step now checks for "sticky dates" from a previous checkout before updating an existing source directory.hjubeubaubh})r}r(hX::bb:step:`Repo` now supports a ``depth`` flag when initializing the repo. This controls the amount of git history to download. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX::bb:step:`Repo` now supports a ``depth`` flag when initializing the repo. This controls the amount of git history to download.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KSh5]r(h>X:r}r(hX:hjubh)r}r(hX:bb:step:`Repo`rhjh"h%h'hh)}r(UreftypeXstephhXRepoU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3KSh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XReporr}r(hUhjubah'hubaubh>X now supports a rr}r(hX now supports a hjubh)r}r(hX ``depth``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xdepthrr}r(hUhjubah'hubh>XV flag when initializing the repo. This controls the amount of git history to download.rr}r(hXV flag when initializing the repo. This controls the amount of git history to download.hjubeubaubh})r}r(hXDThe ``manifestBranch`` of the bb:step:`Repo` step is now renderable hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXCThe ``manifestBranch`` of the bb:step:`Repo` step is now renderablehjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KUh5]r(h>XThe rr}r(hXThe hjubh)r}r(hX``manifestBranch``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XmanifestBranchrr}r(hUhjubah'hubh>X of the bb:step:rr}r(hX of the bb:step:hjubj)r}r(hX`Repo`h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XRepor r }r (hUhjubah'jubh>X step is now renderabler r }r(hX step is now renderablehjubeubaubh})r}r(hX:New source step :bb:step:`Monotone` added on master side. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX9New source step :bb:step:`Monotone` added on master side.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3KWh5]r(h>XNew source step rr}r(hXNew source step hjubh)r}r(hX:bb:step:`Monotone`rhjh"h%h'hh)}r(UreftypeXstephhXMonotoneU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3KWh5]rh)r }r!(hjh)}r"(h+]h,]r#(hjXbb-stepr$eh-]h.]h1]uhjh5]r%h>XMonotoner&r'}r((hUhj ubah'hubaubh>X added on master side.r)r*}r+(hX added on master side.hjubeubaubh})r,}r-(hX7New source step :bb:step:`Darcs` added on master side. hhwh"h%h'hh)}r.(h+]h,]h-]h.]h1]uh3Nh4hh5]r/hM)r0}r1(hX6New source step :bb:step:`Darcs` added on master side.hj,h"h%h'hQh)}r2(h+]h,]h-]h.]h1]uh3KYh5]r3(h>XNew source step r4r5}r6(hXNew source step hj0ubh)r7}r8(hX:bb:step:`Darcs`r9hj0h"h%h'hh)}r:(UreftypeXstephhXDarcsU refdomainXbbr;h.]h-]U refexplicith+]h,]h1]hhuh3KYh5]r<h)r=}r>(hj9h)}r?(h+]h,]r@(hj;Xbb-steprAeh-]h.]h1]uhj7h5]rBh>XDarcsrCrD}rE(hUhj=ubah'hubaubh>X added on master side.rFrG}rH(hX added on master side.hj0ubeubaubh})rI}rJ(hXSA new :bb:step:`Robocopy` step is available for Windows builders (:bb:pull:`728`). hhwh"h%h'hh)}rK(h+]h,]h-]h.]h1]uh3Nh4hh5]rLhM)rM}rN(hXRA new :bb:step:`Robocopy` step is available for Windows builders (:bb:pull:`728`).hjIh"h%h'hQh)}rO(h+]h,]h-]h.]h1]uh3K[h5]rP(h>XA new rQrR}rS(hXA new hjMubh)rT}rU(hX:bb:step:`Robocopy`rVhjMh"h%h'hh)}rW(UreftypeXstephhXRobocopyU refdomainXbbrXh.]h-]U refexplicith+]h,]h1]hhuh3K[h5]rYh)rZ}r[(hjVh)}r\(h+]h,]r](hjXXbb-stepr^eh-]h.]h1]uhjTh5]r_h>XRobocopyr`ra}rb(hUhjZubah'hubaubh>X) step is available for Windows builders (rcrd}re(hX) step is available for Windows builders (hjMubj)rf}rg(hUh)}rh(jXpull request 728rijX-https://github.com/buildbot/buildbot/pull/728h.]h-]h+]h,]h1]uhjMh5]rjh>Xpull request 728rkrl}rm(hjihjfubah'jubh>X).rnro}rp(hX).hjMubeubaubh})rq}rr(hX The attributes ``description``, ``descriptionDone`` and ``descriptionSuffix`` have been moved from :py:class:`ShellCommand` to its superclass :py:class:`BuildStep` so that any class that inherits from :py:class:`BuildStep` can provide a suitable description of itself. hhwh"h%h'hh)}rs(h+]h,]h-]h.]h1]uh3Nh4hh5]rthM)ru}rv(hX The attributes ``description``, ``descriptionDone`` and ``descriptionSuffix`` have been moved from :py:class:`ShellCommand` to its superclass :py:class:`BuildStep` so that any class that inherits from :py:class:`BuildStep` can provide a suitable description of itself.hjqh"h%h'hQh)}rw(h+]h,]h-]h.]h1]uh3K]h5]rx(h>XThe attributes ryrz}r{(hXThe attributes hjuubh)r|}r}(hX``description``h)}r~(h+]h,]h-]h.]h1]uhjuh5]rh>X descriptionrr}r(hUhj|ubah'hubh>X, rr}r(hX, hjuubh)r}r(hX``descriptionDone``h)}r(h+]h,]h-]h.]h1]uhjuh5]rh>XdescriptionDonerr}r(hUhjubah'hubh>X and rr}r(hX and hjuubh)r}r(hX``descriptionSuffix``h)}r(h+]h,]h-]h.]h1]uhjuh5]rh>XdescriptionSuffixrr}r(hUhjubah'hubh>X have been moved from rr}r(hX have been moved from hjuubh)r}r(hX:py:class:`ShellCommand`rhjuh"h%h'hh)}r(UreftypeXclasshhX ShellCommandU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3K]h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>X ShellCommandrr}r(hUhjubah'hubaubh>X to its superclass rr}r(hX to its superclass hjuubh)r}r(hX:py:class:`BuildStep`rhjuh"h%h'hh)}r(UreftypeXclasshhX BuildStepU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3K]h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>X BuildSteprr}r(hUhjubah'hubaubh>X& so that any class that inherits from rr}r(hX& so that any class that inherits from hjuubh)r}r(hX:py:class:`BuildStep`rhjuh"h%h'hh)}r(UreftypeXclasshhX BuildStepU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3K]h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>X BuildSteprr}r(hUhjubah'hubaubh>X. can provide a suitable description of itself.rr}r(hX. can provide a suitable description of itself.hjuubeubaubh})r}r(hXXA new :py:class:`FlattenList` Renderable has been added which can flatten nested lists. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXWA new :py:class:`FlattenList` Renderable has been added which can flatten nested lists.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K_h5]r(h>XA new rr}r(hXA new hjubh)r}r(hX:py:class:`FlattenList`rhjh"h%h'hh)}r(UreftypeXclasshhX FlattenListU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3K_h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>X FlattenListrr}r(hUhjubah'hubaubh>X: Renderable has been added which can flatten nested lists.rr}r(hX: Renderable has been added which can flatten nested lists.hjubeubaubh})r}r(hXWAdded new build steps for :bb:step:`VC12`, :bb:step:`VS2013` and :bb:step:`MsBuild12`. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXVAdded new build steps for :bb:step:`VC12`, :bb:step:`VS2013` and :bb:step:`MsBuild12`.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kah5]r(h>XAdded new build steps for rr}r(hXAdded new build steps for hjubh)r}r(hX:bb:step:`VC12`rhjh"h%h'hh)}r(UreftypeXstephhXVC12U refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3Kah5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XVC12rr}r(hUhjubah'hubaubh>X, rr}r (hX, hjubh)r }r (hX:bb:step:`VS2013`r hjh"h%h'hh)}r (UreftypeXstephhXVS2013U refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3Kah5]rh)r}r(hj h)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhj h5]rh>XVS2013rr}r(hUhjubah'hubaubh>X and rr}r(hX and hjubh)r}r(hX:bb:step:`MsBuild12`rhjh"h%h'hh)}r(UreftypeXstephhX MsBuild12U refdomainXbbr h.]h-]U refexplicith+]h,]h1]hhuh3Kah5]r!h)r"}r#(hjh)}r$(h+]h,]r%(hj Xbb-stepr&eh-]h.]h1]uhjh5]r'h>X MsBuild12r(r)}r*(hUhj"ubah'hubaubh>X.r+}r,(hX.hjubeubaubh})r-}r.(hXKThe ``mode`` parameter of the VS steps is now renderable (:bb:bug:`2592`). hhwh"h%h'hh)}r/(h+]h,]h-]h.]h1]uh3Nh4hh5]r0hM)r1}r2(hXJThe ``mode`` parameter of the VS steps is now renderable (:bb:bug:`2592`).hj-h"h%h'hQh)}r3(h+]h,]h-]h.]h1]uh3Kch5]r4(h>XThe r5r6}r7(hXThe hj1ubh)r8}r9(hX``mode``h)}r:(h+]h,]h-]h.]h1]uhj1h5]r;h>Xmoder<r=}r>(hUhj8ubah'hubh>X. parameter of the VS steps is now renderable (r?r@}rA(hX. parameter of the VS steps is now renderable (hj1ubj)rB}rC(hUh)}rD(jX bug #2592jX$http://trac.buildbot.net/ticket/2592h.]h-]h+]h,]h1]uhj1h5]rEh>X bug #2592rFrG}rH(hUhjBubah'jubh>X).rIrJ}rK(hX).hj1ubeubaubh})rL}rM(hXThe :bb:step:`HTTPStep` step can make arbitrary HTTP requests from the master, allowing communication with external APIs. This new feature requires the optional ``txrequests`` and ``requests`` Python packages. hhwh"h%h'hh)}rN(h+]h,]h-]h.]h1]uh3Nh4hh5]rOhM)rP}rQ(hXThe :bb:step:`HTTPStep` step can make arbitrary HTTP requests from the master, allowing communication with external APIs. This new feature requires the optional ``txrequests`` and ``requests`` Python packages.hjLh"h%h'hQh)}rR(h+]h,]h-]h.]h1]uh3Keh5]rS(h>XThe rTrU}rV(hXThe hjPubh)rW}rX(hX:bb:step:`HTTPStep`rYhjPh"h%h'hh)}rZ(UreftypeXstephhXHTTPStepU refdomainXbbr[h.]h-]U refexplicith+]h,]h1]hhuh3Keh5]r\h)r]}r^(hjYh)}r_(h+]h,]r`(hj[Xbb-stepraeh-]h.]h1]uhjWh5]rbh>XHTTPSteprcrd}re(hUhj]ubah'hubaubh>X step can make arbitrary HTTP requests from the master, allowing communication with external APIs. This new feature requires the optional rfrg}rh(hX step can make arbitrary HTTP requests from the master, allowing communication with external APIs. This new feature requires the optional hjPubh)ri}rj(hX``txrequests``h)}rk(h+]h,]h-]h.]h1]uhjPh5]rlh>X txrequestsrmrn}ro(hUhjiubah'hubh>X and rprq}rr(hX and hjPubh)rs}rt(hX ``requests``h)}ru(h+]h,]h-]h.]h1]uhjPh5]rvh>Xrequestsrwrx}ry(hUhjsubah'hubh>X Python packages.rzr{}r|(hX Python packages.hjPubeubaubh})r}}r~(hXwA new :bb:step:`MultipleFileUpload` step was added to allow uploading several files (or directories) in a single step. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXvA new :bb:step:`MultipleFileUpload` step was added to allow uploading several files (or directories) in a single step.hj}h"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Khh5]r(h>XA new rr}r(hXA new hjubh)r}r(hX:bb:step:`MultipleFileUpload`rhjh"h%h'hh)}r(UreftypeXstephhXMultipleFileUploadU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3Khh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>XMultipleFileUploadrr}r(hUhjubah'hubaubh>XS step was added to allow uploading several files (or directories) in a single step.rr}r(hXS step was added to allow uploading several files (or directories) in a single step.hjubeubaubh})r}r(hXInformation about the buildslaves (admin, host, etc) is now persisted in the database and available even if the slave is not connected. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXInformation about the buildslaves (admin, host, etc) is now persisted in the database and available even if the slave is not connected.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kjh5]rh>XInformation about the buildslaves (admin, host, etc) is now persisted in the database and available even if the slave is not connected.rr}r(hjhjubaubaubh})r}r(hXiBuildslave info can now be retrieved via :ref:`Interpolate` and a new :bb:step:`SetSlaveInfo` buildstep. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXhBuildslave info can now be retrieved via :ref:`Interpolate` and a new :bb:step:`SetSlaveInfo` buildstep.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kmh5]r(h>X)Buildslave info can now be retrieved via rr}r(hX)Buildslave info can now be retrieved via hjubh)r}r(hX:ref:`Interpolate`rhjh"h%h'hh)}r(UreftypeXrefhhX interpolateU refdomainXstdrh.]h-]U refexplicith+]h,]h1]hhuh3Kmh5]rcdocutils.nodes emphasis r)r}r(hjh)}r(h+]h,]r(hjXstd-refreh-]h.]h1]uhjh5]rh>X Interpolaterr}r(hUhjubah'Uemphasisrubaubh>X and a new rr}r(hX and a new hjubh)r}r(hX:bb:step:`SetSlaveInfo`rhjh"h%h'hh)}r(UreftypeXstephhX SetSlaveInfoU refdomainXbbrh.]h-]U refexplicith+]h,]h1]hhuh3Kmh5]rh)r}r(hjh)}r(h+]h,]r(hjXbb-stepreh-]h.]h1]uhjh5]rh>X SetSlaveInforr}r(hUhjubah'hubaubh>X buildstep.rr}r(hX buildstep.hjubeubaubh})r}r(hX_The ``GNUAutotools`` factory now has a reconf option to run autoreconf before ``./configure``. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX^The ``GNUAutotools`` factory now has a reconf option to run autoreconf before ``./configure``.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Koh5]r(h>XThe rr}r(hXThe hjubh)r}r(hX``GNUAutotools``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X GNUAutotoolsrr}r(hUhjubah'hubh>X: factory now has a reconf option to run autoreconf before rr}r(hX: factory now has a reconf option to run autoreconf before hjubh)r}r(hX``./configure``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X ./configurerr}r(hUhjubah'hubh>X.r}r(hX.hjubeubaubh})r}r(hXBuilder configurations can now include a ``description``, which will appear in the web UI to help humans figure out what the builder does. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXBuilder configurations can now include a ``description``, which will appear in the web UI to help humans figure out what the builder does.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kqh5]r(h>X)Builder configurations can now include a rr}r(hX)Builder configurations can now include a hjubh)r}r(hX``description``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X descriptionrr}r(hUhjubah'hubh>XR, which will appear in the web UI to help humans figure out what the builder does.rr}r (hXR, which will appear in the web UI to help humans figure out what the builder does.hjubeubaubh})r }r (hXThe WebStatus builder page can now filter pending/current/finished builds by property parameters of the form ``?property.=``. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r}r(hXThe WebStatus builder page can now filter pending/current/finished builds by property parameters of the form ``?property.=``.hj h"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Ksh5]r(h>XmThe WebStatus builder page can now filter pending/current/finished builds by property parameters of the form rr}r(hXmThe WebStatus builder page can now filter pending/current/finished builds by property parameters of the form hjubh)r}r(hX``?property.=``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X?property.=rr}r(hUhjubah'hubh>X.r}r(hX.hjubeubaubh})r}r(hXUThe WebStatus ``StatusResourceBuilder`` page can now take the ``maxsearch`` argument hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r!hM)r"}r#(hXTThe WebStatus ``StatusResourceBuilder`` page can now take the ``maxsearch`` argumenthjh"h%h'hQh)}r$(h+]h,]h-]h.]h1]uh3Kuh5]r%(h>XThe WebStatus r&r'}r((hXThe WebStatus hj"ubh)r)}r*(hX``StatusResourceBuilder``h)}r+(h+]h,]h-]h.]h1]uhj"h5]r,h>XStatusResourceBuilderr-r.}r/(hUhj)ubah'hubh>X page can now take the r0r1}r2(hX page can now take the hj"ubh)r3}r4(hX ``maxsearch``h)}r5(h+]h,]h-]h.]h1]uhj"h5]r6h>X maxsearchr7r8}r9(hUhj3ubah'hubh>X argumentr:r;}r<(hX argumenthj"ubeubaubh})r=}r>(hXqThe WebStatus has a new authz "view" action that allows you to require users to logged in to view the WebStatus. hhwh"h%h'hh)}r?(h+]h,]h-]h.]h1]uh3Nh4hh5]r@hM)rA}rB(hXpThe WebStatus has a new authz "view" action that allows you to require users to logged in to view the WebStatus.rChj=h"h%h'hQh)}rD(h+]h,]h-]h.]h1]uh3Kwh5]rEh>XpThe WebStatus has a new authz "view" action that allows you to require users to logged in to view the WebStatus.rFrG}rH(hjChjAubaubaubh})rI}rJ(hX[The WebStatus now shows revisions (+ codebase) where it used to simply say "multiple rev". hhwh"h%h'hh)}rK(h+]h,]h-]h.]h1]uh3Nh4hh5]rLhM)rM}rN(hXZThe WebStatus now shows revisions (+ codebase) where it used to simply say "multiple rev".rOhjIh"h%h'hQh)}rP(h+]h,]h-]h.]h1]uh3Kyh5]rQh>XZThe WebStatus now shows revisions (+ codebase) where it used to simply say "multiple rev".rRrS}rT(hjOhjMubaubaubh})rU}rV(hX)The Console view now supports codebases. hhwh"h%h'hh)}rW(h+]h,]h-]h.]h1]uh3Nh4hh5]rXhM)rY}rZ(hX(The Console view now supports codebases.r[hjUh"h%h'hQh)}r\(h+]h,]h-]h.]h1]uh3K{h5]r]h>X(The Console view now supports codebases.r^r_}r`(hj[hjYubaubaubh})ra}rb(hXThe web UI for Builders has been updated: * shows the build 'reason' and 'interested users' * shows sourcestamp information for builders that use multiple codebases (instead of the generic "multiple rev" placeholder that was shown before). hhwh"Nh'hh)}rc(h+]h,]h-]h.]h1]uh3Nh4hh5]rdh)re}rf(hUh)}rg(h+]h,]h-]h.]h1]uhjah5]rhh)ri}rj(hXThe web UI for Builders has been updated: * shows the build 'reason' and 'interested users' * shows sourcestamp information for builders that use multiple codebases (instead of the generic "multiple rev" placeholder that was shown before). hjeh"h%h'hh)}rk(h+]h,]h-]h.]h1]uh3Kh5]rl(h)rm}rn(hX)The web UI for Builders has been updated:rohjih"h%h'hh)}rp(h+]h,]h-]h.]h1]uh3Kh5]rqh>X)The web UI for Builders has been updated:rrrs}rt(hjohjmubaubh)ru}rv(hUh)}rw(h+]h,]h-]h.]h1]uhjih5]rxhv)ry}rz(hUh)}r{(h{X*h.]h-]h+]h,]h1]uhjuh5]r|(h})r}}r~(hX/shows the build 'reason' and 'interested users'rh)}r(h+]h,]h-]h.]h1]uhjyh5]rhM)r}r(hjhj}h"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3K~h5]rh>X/shows the build 'reason' and 'interested users'rr}r(hjhjubaubah'hubh})r}r(hXshows sourcestamp information for builders that use multiple codebases (instead of the generic "multiple rev" placeholder that was shown before). h)}r(h+]h,]h-]h.]h1]uhjyh5]rhM)r}r(hXshows sourcestamp information for builders that use multiple codebases (instead of the generic "multiple rev" placeholder that was shown before).rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]rh>Xshows sourcestamp information for builders that use multiple codebases (instead of the generic "multiple rev" placeholder that was shown before).rr}r(hjhjubaubah'hubeh'hyubah'jPubeubah'jQubaubh})r}r(hXTThe waterfall and atom/rss feeds can be filtered with the ``project`` url paramter. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXSThe waterfall and atom/rss feeds can be filtered with the ``project`` url paramter.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>X:The waterfall and atom/rss feeds can be filtered with the rr}r(hX:The waterfall and atom/rss feeds can be filtered with the hjubh)r}r(hX ``project``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xprojectrr}r(hUhjubah'hubh>X url paramter.rr}r(hX url paramter.hjubeubaubh})r}r(hXThe WebStatus :ref:`Authorization` support now includes a ``view`` action which can be used to restrict read-only access to the Buildbot instance. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXThe WebStatus :ref:`Authorization` support now includes a ``view`` action which can be used to restrict read-only access to the Buildbot instance.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>XThe WebStatus rr}r(hXThe WebStatus hjubh)r}r(hX:ref:`Authorization`rhjh"h%h'hh)}r(UreftypeXrefhhX authorizationU refdomainXstdrh.]h-]U refexplicith+]h,]h1]hhuh3Kh5]rj)r}r(hjh)}r(h+]h,]r(hjXstd-refreh-]h.]h1]uhjh5]rh>X Authorizationrr}r(hUhjubah'jubaubh>X support now includes a rr}r(hX support now includes a hjubh)r}r(hX``view``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xviewrr}r(hUhjubah'hubh>XP action which can be used to restrict read-only access to the Buildbot instance.rr}r(hXP action which can be used to restrict read-only access to the Buildbot instance.hjubeubaubh})r}r(hXEThe web status now has options to cancel some or all pending builds. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXDThe web status now has options to cancel some or all pending builds.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]rh>XDThe web status now has options to cancel some or all pending builds.rr}r(hjhjubaubaubh})r}r(hX?The WebStatus now interprets ANSI color codes in stdio output. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX>The WebStatus now interprets ANSI color codes in stdio output.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]rh>X>The WebStatus now interprets ANSI color codes in stdio output.rr}r(hjhjubaubaubh})r}r(hXFIt is now possible to select categories to show in the waterfall help hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXEIt is now possible to select categories to show in the waterfall helprhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]rh>XEIt is now possible to select categories to show in the waterfall helprr}r(hjhjubaubaubh})r}r(hXHThe web status now automatically scrolls output logs (:bb:pull:`1078`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXGThe web status now automatically scrolls output logs (:bb:pull:`1078`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>X6The web status now automatically scrolls output logs (rr}r(hX6The web status now automatically scrolls output logs (hjubj)r}r(hUh)}r(jXpull request 1078rjX.https://github.com/buildbot/buildbot/pull/1078h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 1078rr}r(hjhjubah'jubh>X).rr }r (hX).hjubeubaubh})r }r (hXEThe web UI now supports a PNG Status Resource that can be accessed publicly from for example README.md files or wikis or whatever other resource. This view produces an image in PNG format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXDThe web UI now supports a PNG Status Resource that can be accessed publicly from for example README.md files or wikis or whatever other resource. This view produces an image in PNG format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view.rhj h"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]rh>XDThe web UI now supports a PNG Status Resource that can be accessed publicly from for example README.md files or wikis or whatever other resource. This view produces an image in PNG format with information about the last build for the given builder name or whatever other build number if is passed as an argument to the view.rr}r(hjhjubaubaubh})r}r(hXSRevision links for commits on SouceForge (Allura) are now automatically generated. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXRRevision links for commits on SouceForge (Allura) are now automatically generated.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]rh>XRRevision links for commits on SouceForge (Allura) are now automatically generated.r r!}r"(hjhjubaubaubh})r#}r$(hXThe 'Rebuild' button on the web pages for builds features a dropdown to choose whether to rebuild from exact revisions or from the same sourcestamps (ie, update branch references) hhwh"h%h'hh)}r%(h+]h,]h-]h.]h1]uh3Nh4hh5]r&hM)r'}r((hXThe 'Rebuild' button on the web pages for builds features a dropdown to choose whether to rebuild from exact revisions or from the same sourcestamps (ie, update branch references)r)hj#h"h%h'hQh)}r*(h+]h,]h-]h.]h1]uh3Kh5]r+h>XThe 'Rebuild' button on the web pages for builds features a dropdown to choose whether to rebuild from exact revisions or from the same sourcestamps (ie, update branch references)r,r-}r.(hj)hj'ubaubaubh})r/}r0(hXBuild status can be sent to GitHub. Depends on txgithub package. See :bb:status:`GitHubStatus` and `GitHub Commit Status `_. hhwh"h%h'hh)}r1(h+]h,]h-]h.]h1]uh3Nh4hh5]r2hM)r3}r4(hXBuild status can be sent to GitHub. Depends on txgithub package. See :bb:status:`GitHubStatus` and `GitHub Commit Status `_.hj/h"h%h'hQh)}r5(h+]h,]h-]h.]h1]uh3Kh5]r6(h>XEBuild status can be sent to GitHub. Depends on txgithub package. See r7r8}r9(hXEBuild status can be sent to GitHub. Depends on txgithub package. See hj3ubh)r:}r;(hX:bb:status:`GitHubStatus`r<hj3h"h%h'hh)}r=(UreftypeXstatushhX GitHubStatusU refdomainXbbr>h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r?h)r@}rA(hj<h)}rB(h+]h,]rC(hj>X bb-statusrDeh-]h.]h1]uhj:h5]rEh>X GitHubStatusrFrG}rH(hUhj@ubah'hubaubh>X and rIrJ}rK(hX and hj3ubj)rL}rM(hXH`GitHub Commit Status `_h)}rN(UnameXGitHub Commit StatusjX.https://github.com/blog/1227-commit-status-apirOh.]h-]h+]h,]h1]uhj3h5]rPh>XGitHub Commit StatusrQrR}rS(hUhjLubah'jubcdocutils.nodes target rT)rU}rV(hX1 hKhj3h'UtargetrWh)}rX(UrefurijOh.]rYUgithub-commit-statusrZah-]h+]h,]h1]r[hauh5]ubh>X.r\}r](hX.hj3ubeubaubh})r^}r_(hXThe IRC bot of :bb:status:`IRC` will, unless useRevisions is set, shorten long lists of revisions printed when a build starts; it will only show two, and the number of additional revisions included in the build. hhwh"h%h'hh)}r`(h+]h,]h-]h.]h1]uh3Nh4hh5]rahM)rb}rc(hXThe IRC bot of :bb:status:`IRC` will, unless useRevisions is set, shorten long lists of revisions printed when a build starts; it will only show two, and the number of additional revisions included in the build.hj^h"h%h'hQh)}rd(h+]h,]h-]h.]h1]uh3Kh5]re(h>XThe IRC bot of rfrg}rh(hXThe IRC bot of hjbubh)ri}rj(hX:bb:status:`IRC`rkhjbh"h%h'hh)}rl(UreftypeXstatushhXIRCU refdomainXbbrmh.]h-]U refexplicith+]h,]h1]hhuh3Kh5]rnh)ro}rp(hjkh)}rq(h+]h,]rr(hjmX bb-statusrseh-]h.]h1]uhjih5]rth>XIRCrurv}rw(hUhjoubah'hubaubh>X will, unless useRevisions is set, shorten long lists of revisions printed when a build starts; it will only show two, and the number of additional revisions included in the build.rxry}rz(hX will, unless useRevisions is set, shorten long lists of revisions printed when a build starts; it will only show two, and the number of additional revisions included in the build.hjbubeubaubh})r{}r|(hXA new argument ``summaryCB`` has been added to ``GerritStatusPush``, to allow sending one review per buildset. Sending a single "summary" review per buildset is now the default if neither ``summaryCB`` nor ``reviewCB`` are specified. hhwh"h%h'hh)}r}(h+]h,]h-]h.]h1]uh3Nh4hh5]r~hM)r}r(hXA new argument ``summaryCB`` has been added to ``GerritStatusPush``, to allow sending one review per buildset. Sending a single "summary" review per buildset is now the default if neither ``summaryCB`` nor ``reviewCB`` are specified.hj{h"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>XA new argument rr}r(hXA new argument hjubh)r}r(hX ``summaryCB``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X summaryCBrr}r(hUhjubah'hubh>X has been added to rr}r(hX has been added to hjubh)r}r(hX``GerritStatusPush``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XGerritStatusPushrr}r(hUhjubah'hubh>Xy, to allow sending one review per buildset. Sending a single "summary" review per buildset is now the default if neither rr}r(hXy, to allow sending one review per buildset. Sending a single "summary" review per buildset is now the default if neither hjubh)r}r(hX ``summaryCB``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X summaryCBrr}r(hUhjubah'hubh>X nor rr}r(hX nor hjubh)r}r(hX ``reviewCB``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XreviewCBrr}r(hUhjubah'hubh>X are specified.rr}r(hX are specified.hjubeubaubh})r}r(hXThe ``comments`` field of changes is no longer limited to 1024 characters on MySQL and Postgres. See :bb:bug:`2367` and :bb:pull:`736`. hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXThe ``comments`` field of changes is no longer limited to 1024 characters on MySQL and Postgres. See :bb:bug:`2367` and :bb:pull:`736`.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>XThe rr}r(hXThe hjubh)r}r(hX ``comments``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xcommentsrr}r(hUhjubah'hubh>XV field of changes is no longer limited to 1024 characters on MySQL and Postgres. See rr}r(hXV field of changes is no longer limited to 1024 characters on MySQL and Postgres. See hjubj)r}r(hUh)}r(jX bug #2367jX$http://trac.buildbot.net/ticket/2367h.]h-]h+]h,]h1]uhjh5]rh>X bug #2367rr}r(hUhjubah'jubh>X and rr}r(hX and hjubj)r}r(hUh)}r(jXpull request 736rjX-https://github.com/buildbot/buildbot/pull/736h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 736rr}r(hjhjubah'jubh>X.r}r(hX.hjubeubaubh})r}r(hXHHTML log files are no longer stored in status pickles (:bb:pull:`1077`) hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXGHTML log files are no longer stored in status pickles (:bb:pull:`1077`)hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>X7HTML log files are no longer stored in status pickles (rr}r(hX7HTML log files are no longer stored in status pickles (hjubj)r}r(hUh)}r(jXpull request 1077rjX.https://github.com/buildbot/buildbot/pull/1077h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 1077rr}r(hjhjubah'jubh>X)r}r(hX)hjubeubaubh})r}r(hX@Builds are now retried after a slave is lost (:bb:pull:`1049`). hhwh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX?Builds are now retried after a slave is lost (:bb:pull:`1049`).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Kh5]r(h>X.Builds are now retried after a slave is lost (rr}r(hX.Builds are now retried after a slave is lost (hjubj)r}r(hUh)}r(jXpull request 1049rjX.https://github.com/buildbot/buildbot/pull/1049h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 1049rr}r(hjhjubah'jubh>X).rr }r (hX).hjubeubaubh})r }r (hX]The buildbot status client can now access a build properties via the ``getProperties`` call. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hX\The buildbot status client can now access a build properties via the ``getProperties`` call.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XEThe buildbot status client can now access a build properties via the r r }r (hXEThe buildbot status client can now access a build properties via the hj ubh)r }r (hX``getProperties``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X getPropertiesr r }r (hUhj ubah'hubh>X call.r r }r (hX call.hj ubeubaubh})r }r (hXThe ``start``, ``restart``, and ``reconfig`` commands will now wait for longer than 10 seconds as long as the master continues producing log lines indicating that the configuration is progressing. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXThe ``start``, ``restart``, and ``reconfig`` commands will now wait for longer than 10 seconds as long as the master continues producing log lines indicating that the configuration is progressing.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XThe r r }r! (hXThe hj ubh)r" }r# (hX ``start``h)}r$ (h+]h,]h-]h.]h1]uhj h5]r% h>Xstartr& r' }r( (hUhj" ubah'hubh>X, r) r* }r+ (hX, hj ubh)r, }r- (hX ``restart``h)}r. (h+]h,]h-]h.]h1]uhj h5]r/ h>Xrestartr0 r1 }r2 (hUhj, ubah'hubh>X, and r3 r4 }r5 (hX, and hj ubh)r6 }r7 (hX ``reconfig``h)}r8 (h+]h,]h-]h.]h1]uhj h5]r9 h>Xreconfigr: r; }r< (hUhj6 ubah'hubh>X commands will now wait for longer than 10 seconds as long as the master continues producing log lines indicating that the configuration is progressing.r= r> }r? (hX commands will now wait for longer than 10 seconds as long as the master continues producing log lines indicating that the configuration is progressing.hj ubeubaubh})r@ }rA (hXeAdded new config option ``protocols`` which allows to configure multiple protocols on single master. hhwh"h%h'hh)}rB (h+]h,]h-]h.]h1]uh3Nh4hh5]rC hM)rD }rE (hXdAdded new config option ``protocols`` which allows to configure multiple protocols on single master.hj@ h"h%h'hQh)}rF (h+]h,]h-]h.]h1]uh3Kh5]rG (h>XAdded new config option rH rI }rJ (hXAdded new config option hjD ubh)rK }rL (hX ``protocols``h)}rM (h+]h,]h-]h.]h1]uhjD h5]rN h>X protocolsrO rP }rQ (hUhjK ubah'hubh>X? which allows to configure multiple protocols on single master.rR rS }rT (hX? which allows to configure multiple protocols on single master.hjD ubeubaubh})rU }rV (hXRemoteShellCommands can be killed by SIGTERM with the sigtermTime parameter before resorting to SIGKILL (:bb:bug:`751`). If the slave's version is less than 0.8.9, the slave will kill the process with SIGKILL regardless of whether sigtermTime is supplied. hhwh"h%h'hh)}rW (h+]h,]h-]h.]h1]uh3Nh4hh5]rX hM)rY }rZ (hXRemoteShellCommands can be killed by SIGTERM with the sigtermTime parameter before resorting to SIGKILL (:bb:bug:`751`). If the slave's version is less than 0.8.9, the slave will kill the process with SIGKILL regardless of whether sigtermTime is supplied.hjU h"h%h'hQh)}r[ (h+]h,]h-]h.]h1]uh3Kh5]r\ (h>XiRemoteShellCommands can be killed by SIGTERM with the sigtermTime parameter before resorting to SIGKILL (r] r^ }r_ (hXiRemoteShellCommands can be killed by SIGTERM with the sigtermTime parameter before resorting to SIGKILL (hjY ubj)r` }ra (hUh)}rb (jXbug #751jX#http://trac.buildbot.net/ticket/751h.]h-]h+]h,]h1]uhjY h5]rc h>Xbug #751rd re }rf (hUhj` ubah'jubh>X). If the slave's version is less than 0.8.9, the slave will kill the process with SIGKILL regardless of whether sigtermTime is supplied.rg rh }ri (hX). If the slave's version is less than 0.8.9, the slave will kill the process with SIGKILL regardless of whether sigtermTime is supplied.hjY ubeubaubh})rj }rk (hX|Introduce an alternative way to deploy Buildbot and try the pyflakes tutorial using :ref:`Docker `. hhwh"h%h'hh)}rl (h+]h,]h-]h.]h1]uh3Nh4hh5]rm hM)rn }ro (hX{Introduce an alternative way to deploy Buildbot and try the pyflakes tutorial using :ref:`Docker `.hjj h"h%h'hQh)}rp (h+]h,]h-]h.]h1]uh3Kh5]rq (h>XTIntroduce an alternative way to deploy Buildbot and try the pyflakes tutorial using rr rs }rt (hXTIntroduce an alternative way to deploy Buildbot and try the pyflakes tutorial using hjn ubh)ru }rv (hX&:ref:`Docker `rw hjn h"h%h'hh)}rx (UreftypeXrefhhXfirst-run-docker-labelU refdomainXstdry h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]rz j)r{ }r| (hjw h)}r} (h+]h,]r~ (hjy Xstd-refr eh-]h.]h1]uhju h5]r h>XDockerr r }r (hUhj{ ubah'jubaubh>X.r }r (hX.hjn ubeubaubh})r }r (hXCAdded zsh and bash tab-completions support for 'buildbot' command. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXBAdded zsh and bash tab-completions support for 'buildbot' command.r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r h>XBAdded zsh and bash tab-completions support for 'buildbot' command.r r }r (hj hj ubaubaubh})r }r (hXzAn example of a declarative configuration is included in :bb:src:`master/contrib/SimpleConfig.py`, with copious comments. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXyAn example of a declarative configuration is included in :bb:src:`master/contrib/SimpleConfig.py`, with copious comments.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X9An example of a declarative configuration is included in r r }r (hX9An example of a declarative configuration is included in hj ubj)r }r (hUh)}r (jXmaster/contrib/SimpleConfig.pyr jXOhttps://github.com/buildbot/buildbot/blob/master/master/contrib/SimpleConfig.pyh.]h-]h+]h,]h1]uhj h5]r h)r }r (hj h)}r (h+]h,]h-]h.]h1]uhj h5]r h>Xmaster/contrib/SimpleConfig.pyr r }r (hUhj ubah'hubah'jubh>X, with copious comments.r r }r (hX, with copious comments.hj ubeubaubh})r }r (hXSSystemd unit files for Buildbot are available in the :bb:src:`contrib/` directory. hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXRSystemd unit files for Buildbot are available in the :bb:src:`contrib/` directory.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X5Systemd unit files for Buildbot are available in the r r }r (hX5Systemd unit files for Buildbot are available in the hj ubj)r }r (hUh)}r (jXcontrib/r jX9https://github.com/buildbot/buildbot/blob/master/contrib/h.]h-]h+]h,]h1]uhj h5]r h)r }r (hj h)}r (h+]h,]h-]h.]h1]uhj h5]r h>Xcontrib/r r }r (hUhj ubah'hubah'jubh>X directory.r r }r (hX directory.hj ubeubaubh})r }r (hXmWe've added some extra checking to make sure that you have a valid locale before starting buildbot (#2608). hhwh"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXkWe've added some extra checking to make sure that you have a valid locale before starting buildbot (#2608).r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r h>XkWe've added some extra checking to make sure that you have a valid locale before starting buildbot (#2608).r r }r (hj hj ubaubaubeubeubh)r }r (hUhhWh"h%h'h(h)}r (h+]h,]h-]h.]r Uforward-compatibilityr ah1]r hauh3Kh4hh5]r (h7)r }r (hXForward Compatibilityr hj h"h%h'h;h)}r (h+]h,]h-]h.]h1]uh3Kh4hh5]r h>XForward Compatibilityr r }r (hj hj ubaubhM)r }r (hX@In preparation for a more asynchronous implementation of build steps in Buildbot 0.9.0, this version introduces support for new-style steps. Existing old-style steps will continue to function correctly in Buildbot 0.8.x releases and in Buildbot 0.9.0, but support will be dropped soon afterward. See :ref:`New-Style-Build-Steps` for guidance on rewriting existing steps in this new style. To eliminate ambiguity, the documentation for this version only reflects support for new-style steps. Refer to the documentation for previous versions for infrormation on old-style steps.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh4hh5]r (h>X,In preparation for a more asynchronous implementation of build steps in Buildbot 0.9.0, this version introduces support for new-style steps. Existing old-style steps will continue to function correctly in Buildbot 0.8.x releases and in Buildbot 0.9.0, but support will be dropped soon afterward. See r r }r (hX,In preparation for a more asynchronous implementation of build steps in Buildbot 0.9.0, this version introduces support for new-style steps. Existing old-style steps will continue to function correctly in Buildbot 0.8.x releases and in Buildbot 0.9.0, but support will be dropped soon afterward. See hj ubh)r }r (hX:ref:`New-Style-Build-Steps`r hj h"h%h'hh)}r (UreftypeXrefhhXnew-style-build-stepsU refdomainXstdr h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r j)r }r (hj h)}r (h+]h,]r (hj Xstd-refr eh-]h.]h1]uhj h5]r h>XNew-Style-Build-Stepsr r }r (hUhj ubah'jubaubh>X for guidance on rewriting existing steps in this new style. To eliminate ambiguity, the documentation for this version only reflects support for new-style steps. Refer to the documentation for previous versions for infrormation on old-style steps.r r }r (hX for guidance on rewriting existing steps in this new style. To eliminate ambiguity, the documentation for this version only reflects support for new-style steps. Refer to the documentation for previous versions for infrormation on old-style steps.hj ubeubeubh)r }r (hUhKhhWh"h%h'h(h)}r (h+]r Xfixesr ah,]h-]h.]r Ufixesr ah1]uh3Kh4hh5]r (h7)r }r (hXFixesr hj h"h%h'h;h)}r (h+]h,]h-]h.]h1]uh3Kh4hh5]r h>XFixesr r }r (hj hj ubaubhv)r }r (hUhj h"h%h'hyh)}r (h{X*h.]h-]h+]h,]h1]uh3Kh4hh5]r (h})r }r (hXFixes an issue where :bb:chsrc:`GitPoller` sets the change branch to ``refs/heads/master`` - which isn't compatible with :bb:step:`Git` (:bb:pull:`1069`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXFixes an issue where :bb:chsrc:`GitPoller` sets the change branch to ``refs/heads/master`` - which isn't compatible with :bb:step:`Git` (:bb:pull:`1069`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XFixes an issue where r r }r (hXFixes an issue where hj ubh)r }r (hX:bb:chsrc:`GitPoller`r hj h"h%h'hh)}r (UreftypeXchsrchhX GitPollerU refdomainXbbr h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r h)r }r (hj h)}r! (h+]h,]r" (hj Xbb-chsrcr# eh-]h.]h1]uhj h5]r$ h>X GitPollerr% r& }r' (hUhj ubah'hubaubh>X sets the change branch to r( r) }r* (hX sets the change branch to hj ubh)r+ }r, (hX``refs/heads/master``h)}r- (h+]h,]h-]h.]h1]uhj h5]r. h>Xrefs/heads/masterr/ r0 }r1 (hUhj+ ubah'hubh>X - which isn't compatible with r2 r3 }r4 (hX - which isn't compatible with hj ubh)r5 }r6 (hX:bb:step:`Git`r7 hj h"h%h'hh)}r8 (UreftypeXstephhXGitU refdomainXbbr9 h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r: h)r; }r< (hj7 h)}r= (h+]h,]r> (hj9 Xbb-stepr? eh-]h.]h1]uhj5 h5]r@ h>XGitrA rB }rC (hUhj; ubah'hubaubh>X (rD rE }rF (hX (hj ubj)rG }rH (hUh)}rI (jXpull request 1069rJ jX.https://github.com/buildbot/buildbot/pull/1069h.]h-]h+]h,]h1]uhj h5]rK h>Xpull request 1069rL rM }rN (hjJ hjG ubah'jubh>X).rO rP }rQ (hX).hj ubeubaubh})rR }rS (hXFixed an issue where the :bb:step:`Git` and :bb:step:`CVS` source steps silently changed the ``workdir`` to ``'build'`` when the 'copy' method is used. hj h"h%h'hh)}rT (h+]h,]h-]h.]h1]uh3Nh4hh5]rU hM)rV }rW (hXFixed an issue where the :bb:step:`Git` and :bb:step:`CVS` source steps silently changed the ``workdir`` to ``'build'`` when the 'copy' method is used.hjR h"h%h'hQh)}rX (h+]h,]h-]h.]h1]uh3Kh5]rY (h>XFixed an issue where the rZ r[ }r\ (hXFixed an issue where the hjV ubh)r] }r^ (hX:bb:step:`Git`r_ hjV h"h%h'hh)}r` (UreftypeXstephhXGitU refdomainXbbra h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]rb h)rc }rd (hj_ h)}re (h+]h,]rf (hja Xbb-steprg eh-]h.]h1]uhj] h5]rh h>XGitri rj }rk (hUhjc ubah'hubaubh>X and rl rm }rn (hX and hjV ubh)ro }rp (hX:bb:step:`CVS`rq hjV h"h%h'hh)}rr (UreftypeXstephhXCVSU refdomainXbbrs h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]rt h)ru }rv (hjq h)}rw (h+]h,]rx (hjs Xbb-stepry eh-]h.]h1]uhjo h5]rz h>XCVSr{ r| }r} (hUhju ubah'hubaubh>X# source steps silently changed the r~ r }r (hX# source steps silently changed the hjV ubh)r }r (hX ``workdir``h)}r (h+]h,]h-]h.]h1]uhjV h5]r h>Xworkdirr r }r (hUhj ubah'hubh>X to r r }r (hX to hjV ubh)r }r (hX ``'build'``h)}r (h+]h,]h-]h.]h1]uhjV h5]r h>X'build'r r }r (hUhj ubah'hubh>X when the 'copy' method is used.r r }r (hX when the 'copy' method is used.hjV ubeubaubh})r }r (hXCThe :bb:step:`CVS` source step now respects the timeout parameter. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXBThe :bb:step:`CVS` source step now respects the timeout parameter.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XThe r r }r (hXThe hj ubh)r }r (hX:bb:step:`CVS`r hj h"h%h'hh)}r (UreftypeXstephhXCVSU refdomainXbbr h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r h)r }r (hj h)}r (h+]h,]r (hj Xbb-stepr eh-]h.]h1]uhj h5]r h>XCVSr r }r (hUhj ubah'hubaubh>X0 source step now respects the timeout parameter.r r }r (hX0 source step now respects the timeout parameter.hj ubeubaubh})r }r (hXThe :bb:step:`Git` step now uses the `git submodule update` option `--init` when updating the submodules of an existing repository, so that it will receive any newly added submodules. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXThe :bb:step:`Git` step now uses the `git submodule update` option `--init` when updating the submodules of an existing repository, so that it will receive any newly added submodules.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XThe r r }r (hXThe hj ubh)r }r (hX:bb:step:`Git`r hj h"h%h'hh)}r (UreftypeXstephhXGitU refdomainXbbr h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r h)r }r (hj h)}r (h+]h,]r (hj Xbb-stepr eh-]h.]h1]uhj h5]r h>XGitr r }r (hUhj ubah'hubaubh>X step now uses the r r }r (hX step now uses the hj ubj)r }r (hX`git submodule update`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>Xgit submodule updater r }r (hUhj ubah'jubh>X option r r }r (hX option hj ubj)r }r (hX`--init`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X--initr r }r (hUhj ubah'jubh>Xl when updating the submodules of an existing repository, so that it will receive any newly added submodules.r r }r (hXl when updating the submodules of an existing repository, so that it will receive any newly added submodules.hj ubeubaubh})r }r (hXThe web status no longer relies on the current working directory, which is not set correctly by some initscripts, to find the ``templates/`` directory (:bb:bug:`2586`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXThe web status no longer relies on the current working directory, which is not set correctly by some initscripts, to find the ``templates/`` directory (:bb:bug:`2586`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X~The web status no longer relies on the current working directory, which is not set correctly by some initscripts, to find the r r }r (hX~The web status no longer relies on the current working directory, which is not set correctly by some initscripts, to find the hj ubh)r }r (hX``templates/``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X templates/r r }r (hUhj ubah'hubh>X directory (r r }r (hX directory (hj ubj)r }r (hUh)}r (jX bug #2586jX$http://trac.buildbot.net/ticket/2586h.]h-]h+]h,]h1]uhj h5]r h>X bug #2586r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXThe Perforce source step uses the correct path separator when the master is on Windows and the build slave is on a POSIX OS (:bb:pull:`1114`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXThe Perforce source step uses the correct path separator when the master is on Windows and the build slave is on a POSIX OS (:bb:pull:`1114`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X}The Perforce source step uses the correct path separator when the master is on Windows and the build slave is on a POSIX OS (r r }r (hX}The Perforce source step uses the correct path separator when the master is on Windows and the build slave is on a POSIX OS (hj ubj)r }r (hUh)}r (jXpull request 1114r jX.https://github.com/buildbot/buildbot/pull/1114h.]h-]h+]h,]h1]uhj h5]r h>Xpull request 1114r r }r (hj hj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXBThe source steps now correctly interpolate properties in ``env``. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXAThe source steps now correctly interpolate properties in ``env``.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X9The source steps now correctly interpolate properties in r r! }r" (hX9The source steps now correctly interpolate properties in hj ubh)r# }r$ (hX``env``h)}r% (h+]h,]h-]h.]h1]uhj h5]r& h>Xenvr' r( }r) (hUhj# ubah'hubh>X.r* }r+ (hX.hj ubeubaubh})r, }r- (hXK``GerritStatusPush`` now supports setting scores with Gerrit 2.6 and newer hj h"h%h'hh)}r. (h+]h,]h-]h.]h1]uh3Nh4hh5]r/ hM)r0 }r1 (hXJ``GerritStatusPush`` now supports setting scores with Gerrit 2.6 and newerhj, h"h%h'hQh)}r2 (h+]h,]h-]h.]h1]uh3Kh5]r3 (h)r4 }r5 (hX``GerritStatusPush``h)}r6 (h+]h,]h-]h.]h1]uhj0 h5]r7 h>XGerritStatusPushr8 r9 }r: (hUhj4 ubah'hubh>X6 now supports setting scores with Gerrit 2.6 and newerr; r< }r= (hX6 now supports setting scores with Gerrit 2.6 and newerhj0 ubeubaubh})r> }r? (hX_The change hook no longer fails when passing unicode to ``change_hook_auth`` (:bb:pull:`996`). hj h"h%h'hh)}r@ (h+]h,]h-]h.]h1]uh3Nh4hh5]rA hM)rB }rC (hX^The change hook no longer fails when passing unicode to ``change_hook_auth`` (:bb:pull:`996`).hj> h"h%h'hQh)}rD (h+]h,]h-]h.]h1]uh3Kh5]rE (h>X8The change hook no longer fails when passing unicode to rF rG }rH (hX8The change hook no longer fails when passing unicode to hjB ubh)rI }rJ (hX``change_hook_auth``h)}rK (h+]h,]h-]h.]h1]uhjB h5]rL h>Xchange_hook_authrM rN }rO (hUhjI ubah'hubh>X (rP rQ }rR (hX (hjB ubj)rS }rT (hUh)}rU (jXpull request 996rV jX-https://github.com/buildbot/buildbot/pull/996h.]h-]h+]h,]h1]uhjB h5]rW h>Xpull request 996rX rY }rZ (hjV hjS ubah'jubh>X).r[ r\ }r] (hX).hjB ubeubaubh})r^ }r_ (hXBThe source steps now correctly interpolate properties in ``env``. hj h"h%h'hh)}r` (h+]h,]h-]h.]h1]uh3Nh4hh5]ra hM)rb }rc (hXAThe source steps now correctly interpolate properties in ``env``.hj^ h"h%h'hQh)}rd (h+]h,]h-]h.]h1]uh3Kh5]re (h>X9The source steps now correctly interpolate properties in rf rg }rh (hX9The source steps now correctly interpolate properties in hjb ubh)ri }rj (hX``env``h)}rk (h+]h,]h-]h.]h1]uhjb h5]rl h>Xenvrm rn }ro (hUhji ubah'hubh>X.rp }rq (hX.hjb ubeubaubh})rr }rs (hXWhitespace is properly handled for StringParameter, so that appropriate validation errors are raised for ``required`` parameters (:bb:pull:`1084`). hj h"h%h'hh)}rt (h+]h,]h-]h.]h1]uh3Nh4hh5]ru hM)rv }rw (hXWhitespace is properly handled for StringParameter, so that appropriate validation errors are raised for ``required`` parameters (:bb:pull:`1084`).hjr h"h%h'hQh)}rx (h+]h,]h-]h.]h1]uh3Kh5]ry (h>XiWhitespace is properly handled for StringParameter, so that appropriate validation errors are raised for rz r{ }r| (hXiWhitespace is properly handled for StringParameter, so that appropriate validation errors are raised for hjv ubh)r} }r~ (hX ``required``h)}r (h+]h,]h-]h.]h1]uhjv h5]r h>Xrequiredr r }r (hUhj} ubah'hubh>X parameters (r r }r (hX parameters (hjv ubj)r }r (hUh)}r (jXpull request 1084r jX.https://github.com/buildbot/buildbot/pull/1084h.]h-]h+]h,]h1]uhjv h5]r h>Xpull request 1084r r }r (hj hj ubah'jubh>X).r r }r (hX).hjv ubeubaubh})r }r (hX^Fix a rare case where a buildtep might fail from a GeneratorExit exception (:bb:pull:`1063`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hX]Fix a rare case where a buildtep might fail from a GeneratorExit exception (:bb:pull:`1063`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XLFix a rare case where a buildtep might fail from a GeneratorExit exception (r r }r (hXLFix a rare case where a buildtep might fail from a GeneratorExit exception (hj ubj)r }r (hUh)}r (jXpull request 1063r jX.https://github.com/buildbot/buildbot/pull/1063h.]h-]h+]h,]h1]uhj h5]r h>Xpull request 1063r r }r (hj hj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXTFixed an issue where UTF-8 data in logs caused RSS feed exceptions (:bb:bug:`951`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXSFixed an issue where UTF-8 data in logs caused RSS feed exceptions (:bb:bug:`951`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XDFixed an issue where UTF-8 data in logs caused RSS feed exceptions (r r }r (hXDFixed an issue where UTF-8 data in logs caused RSS feed exceptions (hj ubj)r }r (hUh)}r (jXbug #951jX#http://trac.buildbot.net/ticket/951h.]h-]h+]h,]h1]uhj h5]r h>Xbug #951r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXUFix an issue with unescaped author names causing invalid RSS feeds (:bb:bug:`2596`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXTFix an issue with unescaped author names causing invalid RSS feeds (:bb:bug:`2596`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XDFix an issue with unescaped author names causing invalid RSS feeds (r r }r (hXDFix an issue with unescaped author names causing invalid RSS feeds (hj ubj)r }r (hUh)}r (jX bug #2596jX$http://trac.buildbot.net/ticket/2596h.]h-]h+]h,]h1]uhj h5]r h>X bug #2596r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hX-Fixed an issue with pubDate format in feeds. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hX,Fixed an issue with pubDate format in feeds.r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r h>X,Fixed an issue with pubDate format in feeds.r r }r (hj hj ubaubaubh})r }r (hXqFixed an issue where the step text value could cause a ``TypeError`` in the build detail page (:bb:pull:`1061`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXpFixed an issue where the step text value could cause a ``TypeError`` in the build detail page (:bb:pull:`1061`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X7Fixed an issue where the step text value could cause a r r }r (hX7Fixed an issue where the step text value could cause a hj ubh)r }r (hX ``TypeError``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X TypeErrorr r }r (hUhj ubah'hubh>X in the build detail page (r r }r (hX in the build detail page (hj ubj)r }r (hUh)}r (jXpull request 1061r jX.https://github.com/buildbot/buildbot/pull/1061h.]h-]h+]h,]h1]uhj h5]r h>Xpull request 1061r r }r (hj hj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXQFix failures where ``git clean`` fails but could be clobbered (:bb:pull:`1058`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXPFix failures where ``git clean`` fails but could be clobbered (:bb:pull:`1058`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XFix failures where r r }r (hXFix failures where hj ubh)r }r (hX ``git clean``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X git cleanr r }r (hUhj ubah'hubh>X fails but could be clobbered (r r }r (hX fails but could be clobbered (hj ubj)r }r (hUh)}r (jXpull request 1058r jX.https://github.com/buildbot/buildbot/pull/1058h.]h-]h+]h,]h1]uhj h5]r h>Xpull request 1058r r }r (hj hj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXPBuild step now correctly fails when the git clone step fails (:bb:pull:`1057`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r! hM)r" }r# (hXOBuild step now correctly fails when the git clone step fails (:bb:pull:`1057`).hj h"h%h'hQh)}r$ (h+]h,]h-]h.]h1]uh3Kh5]r% (h>X>Build step now correctly fails when the git clone step fails (r& r' }r( (hX>Build step now correctly fails when the git clone step fails (hj" ubj)r) }r* (hUh)}r+ (jXpull request 1057r, jX.https://github.com/buildbot/buildbot/pull/1057h.]h-]h+]h,]h1]uhj" h5]r- h>Xpull request 1057r. r/ }r0 (hj, hj) ubah'jubh>X).r1 r2 }r3 (hX).hj" ubeubaubh})r4 }r5 (hX<Fixed a race condition in slave shutdown (:bb:pull:`1019`). hj h"h%h'hh)}r6 (h+]h,]h-]h.]h1]uh3Nh4hh5]r7 hM)r8 }r9 (hX;Fixed a race condition in slave shutdown (:bb:pull:`1019`).hj4 h"h%h'hQh)}r: (h+]h,]h-]h.]h1]uh3Kh5]r; (h>X*Fixed a race condition in slave shutdown (r< r= }r> (hX*Fixed a race condition in slave shutdown (hj8 ubj)r? }r@ (hUh)}rA (jXpull request 1019rB jX.https://github.com/buildbot/buildbot/pull/1019h.]h-]h+]h,]h1]uhj8 h5]rC h>Xpull request 1019rD rE }rF (hjB hj? ubah'jubh>X).rG rH }rI (hX).hj8 ubeubaubh})rJ }rK (hX_Now correctly unsubscribes StatusPush from status updates when reconfiguring (:bb:pull:`997`). hj h"h%h'hh)}rL (h+]h,]h-]h.]h1]uh3Nh4hh5]rM hM)rN }rO (hX^Now correctly unsubscribes StatusPush from status updates when reconfiguring (:bb:pull:`997`).hjJ h"h%h'hQh)}rP (h+]h,]h-]h.]h1]uh3Kh5]rQ (h>XNNow correctly unsubscribes StatusPush from status updates when reconfiguring (rR rS }rT (hXNNow correctly unsubscribes StatusPush from status updates when reconfiguring (hjN ubj)rU }rV (hUh)}rW (jXpull request 997rX jX-https://github.com/buildbot/buildbot/pull/997h.]h-]h+]h,]h1]uhjN h5]rY h>Xpull request 997rZ r[ }r\ (hjX hjU ubah'jubh>X).r] r^ }r_ (hX).hjN ubeubaubh})r` }ra (hX2Fixes parsing git commit messages that are blank. hj h"h%h'hh)}rb (h+]h,]h-]h.]h1]uh3Nh4hh5]rc hM)rd }re (hX1Fixes parsing git commit messages that are blank.rf hj` h"h%h'hQh)}rg (h+]h,]h-]h.]h1]uh3Kh5]rh h>X1Fixes parsing git commit messages that are blank.ri rj }rk (hjf hjd ubaubaubh})rl }rm (hX[:bb:step:`Git` no longer fails when work dir exists but isn't a checkout (:bb:bug:`2531`). hj h"h%h'hh)}rn (h+]h,]h-]h.]h1]uh3Nh4hh5]ro hM)rp }rq (hXZ:bb:step:`Git` no longer fails when work dir exists but isn't a checkout (:bb:bug:`2531`).hjl h"h%h'hQh)}rr (h+]h,]h-]h.]h1]uh3Kh5]rs (h)rt }ru (hX:bb:step:`Git`rv hjp h"h%h'hh)}rw (UreftypeXstephhXGitU refdomainXbbrx h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]ry h)rz }r{ (hjv h)}r| (h+]h,]r} (hjx Xbb-stepr~ eh-]h.]h1]uhjt h5]r h>XGitr r }r (hUhjz ubah'hubaubh>X< no longer fails when work dir exists but isn't a checkout (r r }r (hX< no longer fails when work dir exists but isn't a checkout (hjp ubj)r }r (hUh)}r (jX bug #2531jX$http://trac.buildbot.net/ticket/2531h.]h-]h+]h,]h1]uhjp h5]r h>X bug #2531r r }r (hUhj ubah'jubh>X).r r }r (hX).hjp ubeubaubh})r }r (hXuThe `haltOnFailure` and `flunkOnFailure` attricutes of :bb:step:`ShellCommand` are now renderable. (:bb:bug `2486`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXtThe `haltOnFailure` and `flunkOnFailure` attricutes of :bb:step:`ShellCommand` are now renderable. (:bb:bug `2486`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XThe r r }r (hXThe hj ubj)r }r (hX`haltOnFailure`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X haltOnFailurer r }r (hUhj ubah'jubh>X and r r }r (hX and hj ubj)r }r (hX`flunkOnFailure`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>XflunkOnFailurer r }r (hUhj ubah'jubh>X attricutes of r r }r (hX attricutes of hj ubh)r }r (hX:bb:step:`ShellCommand`r hj h"h%h'hh)}r (UreftypeXstephhX ShellCommandU refdomainXbbr h.]h-]U refexplicith+]h,]h1]hhuh3Kh5]r h)r }r (hj h)}r (h+]h,]r (hj Xbb-stepr eh-]h.]h1]uhj h5]r h>X ShellCommandr r }r (hUhj ubah'hubaubh>X are now renderable. (:bb:bug r r }r (hX are now renderable. (:bb:bug hj ubj)r }r (hX`2486`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X2486r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXThe `rotateLength` and `maxRotatedFile` arguments are no longer treated as strings in buildbot.tac. This fixes log rotation. The upgrade_master command will notify users if they have this problem. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXThe `rotateLength` and `maxRotatedFile` arguments are no longer treated as strings in buildbot.tac. This fixes log rotation. The upgrade_master command will notify users if they have this problem.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XThe r r }r (hXThe hj ubj)r }r (hX`rotateLength`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X rotateLengthr r }r (hUhj ubah'jubh>X and r r }r (hX and hj ubj)r }r (hX`maxRotatedFile`h)}r (h+]h,]h-]h.]h1]uhj h5]r h>XmaxRotatedFiler r }r (hUhj ubah'jubh>X arguments are no longer treated as strings in buildbot.tac. This fixes log rotation. The upgrade_master command will notify users if they have this problem.r r }r (hX arguments are no longer treated as strings in buildbot.tac. This fixes log rotation. The upgrade_master command will notify users if they have this problem.hj ubeubaubh})r }r (hXVBuilbot no longer specifies a revision when pulling from a mercurial (:bb:bug:`438`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXUBuilbot no longer specifies a revision when pulling from a mercurial (:bb:bug:`438`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>XFBuilbot no longer specifies a revision when pulling from a mercurial (r r }r (hXFBuilbot no longer specifies a revision when pulling from a mercurial (hj ubj)r }r (hUh)}r (jXbug #438jX#http://trac.buildbot.net/ticket/438h.]h-]h+]h,]h1]uhj h5]r h>Xbug #438r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXPThe WebStatus no longer incorrectly refers to fields that might not be visible. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXOThe WebStatus no longer incorrectly refers to fields that might not be visible.r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r h>XOThe WebStatus no longer incorrectly refers to fields that might not be visible.r r }r (hj hj ubaubaubh})r }r (hXThe GerritChangeSource now sets a default author, fixing an exception that occured when Gerrit didn't report an owner name/email. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXThe GerritChangeSource now sets a default author, fixing an exception that occured when Gerrit didn't report an owner name/email.r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r h>XThe GerritChangeSource now sets a default author, fixing an exception that occured when Gerrit didn't report an owner name/email.r r }r (hj hj ubaubaubh})r }r (hX8Respects the ``RETRY`` status when an interrupt occurs. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hX7Respects the ``RETRY`` status when an interrupt occurs.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Kh5]r (h>X Respects the r r }r! (hX Respects the hj ubh)r" }r# (hX ``RETRY``h)}r$ (h+]h,]h-]h.]h1]uhj h5]r% h>XRETRYr& r' }r( (hUhj" ubah'hubh>X! status when an interrupt occurs.r) r* }r+ (hX! status when an interrupt occurs.hj ubeubaubh})r, }r- (hXPFixes an off-by-one error when the tryclient is finding the current git branch. hj h"h%h'hh)}r. (h+]h,]h-]h.]h1]uh3Nh4hh5]r/ hM)r0 }r1 (hXOFixes an off-by-one error when the tryclient is finding the current git branch.r2 hj, h"h%h'hQh)}r3 (h+]h,]h-]h.]h1]uh3Mh5]r4 h>XOFixes an off-by-one error when the tryclient is finding the current git branch.r5 r6 }r7 (hj2 hj0 ubaubaubh})r8 }r9 (hXAImprove the Mercurial source stamp extraction in the try client. hj h"h%h'hh)}r: (h+]h,]h-]h.]h1]uh3Nh4hh5]r; hM)r< }r= (hX@Improve the Mercurial source stamp extraction in the try client.r> hj8 h"h%h'hQh)}r? (h+]h,]h-]h.]h1]uh3Mh5]r@ h>X@Improve the Mercurial source stamp extraction in the try client.rA rB }rC (hj> hj< ubaubaubh})rD }rE (hXTFixes some edge cases in timezone handling for python < ``2.7.4`` (:bb:bug:`2522`). hj h"h%h'hh)}rF (h+]h,]h-]h.]h1]uh3Nh4hh5]rG hM)rH }rI (hXSFixes some edge cases in timezone handling for python < ``2.7.4`` (:bb:bug:`2522`).hjD h"h%h'hQh)}rJ (h+]h,]h-]h.]h1]uh3Mh5]rK (h>X8Fixes some edge cases in timezone handling for python < rL rM }rN (hX8Fixes some edge cases in timezone handling for python < hjH ubh)rO }rP (hX ``2.7.4``h)}rQ (h+]h,]h-]h.]h1]uhjH h5]rR h>X2.7.4rS rT }rU (hUhjO ubah'hubh>X (rV rW }rX (hX (hjH ubj)rY }rZ (hUh)}r[ (jX bug #2522jX$http://trac.buildbot.net/ticket/2522h.]h-]h+]h,]h1]uhjH h5]r\ h>X bug #2522r] r^ }r_ (hUhjY ubah'jubh>X).r` ra }rb (hX).hjH ubeubaubh})rc }rd (hXDThe ``EC2LatentBuildSlave`` will now only consider available AMI's. hj h"h%h'hh)}re (h+]h,]h-]h.]h1]uh3Nh4hh5]rf hM)rg }rh (hXCThe ``EC2LatentBuildSlave`` will now only consider available AMI's.hjc h"h%h'hQh)}ri (h+]h,]h-]h.]h1]uh3Mh5]rj (h>XThe rk rl }rm (hXThe hjg ubh)rn }ro (hX``EC2LatentBuildSlave``h)}rp (h+]h,]h-]h.]h1]uhjg h5]rq h>XEC2LatentBuildSlaverr rs }rt (hUhjn ubah'hubh>X( will now only consider available AMI's.ru rv }rw (hX( will now only consider available AMI's.hjg ubeubaubh})rx }ry (hXnFixes a case where the first build runs on an old slave instead of a new one after reconfig (:bb:bug:`2507`). hj h"h%h'hh)}rz (h+]h,]h-]h.]h1]uh3Nh4hh5]r{ hM)r| }r} (hXmFixes a case where the first build runs on an old slave instead of a new one after reconfig (:bb:bug:`2507`).hjx h"h%h'hQh)}r~ (h+]h,]h-]h.]h1]uh3M h5]r (h>X]Fixes a case where the first build runs on an old slave instead of a new one after reconfig (r r }r (hX]Fixes a case where the first build runs on an old slave instead of a new one after reconfig (hj| ubj)r }r (hUh)}r (jX bug #2507jX$http://trac.buildbot.net/ticket/2507h.]h-]h+]h,]h1]uhj| h5]r h>X bug #2507r r }r (hUhj ubah'jubh>X).r r }r (hX).hj| ubeubaubh})r }r (hXVThe e-mail address validation for the MailNotifier status receiver has been improved. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXUThe e-mail address validation for the MailNotifier status receiver has been improved.r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3M h5]r h>XUThe e-mail address validation for the MailNotifier status receiver has been improved.r r }r (hj hj ubaubaubh})r }r (hXGThe ``--db`` parameter of ``buildbot create-master`` is now validated. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXFThe ``--db`` parameter of ``buildbot create-master`` is now validated.hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3M h5]r (h>XThe r r }r (hXThe hj ubh)r }r (hX``--db``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X--dbr r }r (hUhj ubah'hubh>X parameter of r r }r (hX parameter of hj ubh)r }r (hX``buildbot create-master``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>Xbuildbot create-masterr r }r (hUhj ubah'hubh>X is now validated.r r }r (hX is now validated.hj ubeubaubh})r }r (hXDNo longer ignores default choice for ForceScheduler list parameters hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXCNo longer ignores default choice for ForceScheduler list parametersr hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Mh5]r h>XCNo longer ignores default choice for ForceScheduler list parametersr r }r (hj hj ubaubaubh})r }r (hXTNow correctly handles ``BuilderConfig(..., mergeRequests=False)`` (:bb:bug:`2555`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXSNow correctly handles ``BuilderConfig(..., mergeRequests=False)`` (:bb:bug:`2555`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Mh5]r (h>XNow correctly handles r r }r (hXNow correctly handles hj ubh)r }r (hX+``BuilderConfig(..., mergeRequests=False)``h)}r (h+]h,]h-]h.]h1]uhj h5]r h>X'BuilderConfig(..., mergeRequests=False)r r }r (hUhj ubah'hubh>X (r r }r (hX (hj ubj)r }r (hUh)}r (jX bug #2555jX$http://trac.buildbot.net/ticket/2555h.]h-]h+]h,]h1]uhj h5]r h>X bug #2555r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXTNow excludes changes from sourcestamps when they aren't in the DB (:bb:bug:`2554`). hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXSNow excludes changes from sourcestamps when they aren't in the DB (:bb:bug:`2554`).hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Mh5]r (h>XCNow excludes changes from sourcestamps when they aren't in the DB (r r }r (hXCNow excludes changes from sourcestamps when they aren't in the DB (hj ubj)r }r (hUh)}r (jX bug #2554jX$http://trac.buildbot.net/ticket/2554h.]h-]h+]h,]h1]uhj h5]r h>X bug #2554r r }r (hUhj ubah'jubh>X).r r }r (hX).hj ubeubaubh})r }r (hXHFixes a compatibility issue with HPCloud in the OpenStack latent slave. hj h"h%h'hh)}r (h+]h,]h-]h.]h1]uh3Nh4hh5]r hM)r }r (hXGFixes a compatibility issue with HPCloud in the OpenStack latent slave.r hj h"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Mh5]rh>XGFixes a compatibility issue with HPCloud in the OpenStack latent slave.rr}r(hj hj ubaubaubh})r}r(hX:Allow ``_`` as a valid character in JSONP callback names. hj h"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r (hX9Allow ``_`` as a valid character in JSONP callback names.hjh"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3Mh5]r (h>XAllow r r }r(hXAllow hjubh)r}r(hX``_``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X_r}r(hUhjubah'hubh>X. as a valid character in JSONP callback names.rr}r(hX. as a valid character in JSONP callback names.hjubeubaubh})r}r(hX;Fix build start time retrieval in the WebStatus grid view. hj h"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX:Fix build start time retrieval in the WebStatus grid view.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Mh5]r h>X:Fix build start time retrieval in the WebStatus grid view.r!r"}r#(hjhjubaubaubh})r$}r%(hXgIncrease the length of the DB fields ``changes.comments`` and ``buildset_properties.property_value``. hj h"h%h'hh)}r&(h+]h,]h-]h.]h1]uh3Nh4hh5]r'hM)r(}r)(hXeIncrease the length of the DB fields ``changes.comments`` and ``buildset_properties.property_value``.hj$h"h%h'hQh)}r*(h+]h,]h-]h.]h1]uh3Mh5]r+(h>X%Increase the length of the DB fields r,r-}r.(hX%Increase the length of the DB fields hj(ubh)r/}r0(hX``changes.comments``h)}r1(h+]h,]h-]h.]h1]uhj(h5]r2h>Xchanges.commentsr3r4}r5(hUhj/ubah'hubh>X and r6r7}r8(hX and hj(ubh)r9}r:(hX&``buildset_properties.property_value``h)}r;(h+]h,]h-]h.]h1]uhj(h5]r<h>X"buildset_properties.property_valuer=r>}r?(hUhj9ubah'hubh>X.r@}rA(hX.hj(ubeubaubeubeubh)rB}rC(hUhKhhWh"h%h'h(h)}rD(h+]rEX2deprecations, removals, and non-compatible changesrFah,]h-]h.]rGU0deprecations-removals-and-non-compatible-changesrHah1]uh3Mh4hh5]rI(h7)rJ}rK(hX2Deprecations, Removals, and Non-Compatible ChangesrLhjBh"h%h'h;h)}rM(h+]h,]h-]h.]h1]uh3Mh4hh5]rNh>X2Deprecations, Removals, and Non-Compatible ChangesrOrP}rQ(hjLhjJubaubhv)rR}rS(hUhjBh"h%h'hyh)}rT(h{X*h.]h-]h+]h,]h1]uh3M!h4hh5]rU(h})rV}rW(hXDThe slave-side source steps are deprecated in this version of Buildbot, and master-side support will be removed in a future version. Please convert any use of slave-side steps (imported directly from ``buildbot.steps.source``, rather than from a specific module like ``buildbot.steps.source.svn``) to use master-side steps. hjRh"h%h'hh)}rX(h+]h,]h-]h.]h1]uh3Nh4hh5]rYhM)rZ}r[(hXCThe slave-side source steps are deprecated in this version of Buildbot, and master-side support will be removed in a future version. Please convert any use of slave-side steps (imported directly from ``buildbot.steps.source``, rather than from a specific module like ``buildbot.steps.source.svn``) to use master-side steps.hjVh"h%h'hQh)}r\(h+]h,]h-]h.]h1]uh3M!h5]r](h>XThe slave-side source steps are deprecated in this version of Buildbot, and master-side support will be removed in a future version. Please convert any use of slave-side steps (imported directly from r^r_}r`(hXThe slave-side source steps are deprecated in this version of Buildbot, and master-side support will be removed in a future version. Please convert any use of slave-side steps (imported directly from hjZubh)ra}rb(hX``buildbot.steps.source``h)}rc(h+]h,]h-]h.]h1]uhjZh5]rdh>Xbuildbot.steps.sourcererf}rg(hUhjaubah'hubh>X*, rather than from a specific module like rhri}rj(hX*, rather than from a specific module like hjZubh)rk}rl(hX``buildbot.steps.source.svn``h)}rm(h+]h,]h-]h.]h1]uhjZh5]rnh>Xbuildbot.steps.source.svnrorp}rq(hUhjkubah'hubh>X) to use master-side steps.rrrs}rt(hX) to use master-side steps.hjZubeubaubh})ru}rv(hXBoth old-style and new-style steps are supported in this version of Buildbot. Upgrade your steps to new-style now, as support for old-style steps will be dropped after Buildbot-0.9.0. See :ref:`New-Style-Build-Steps` for details. * The ``LoggingBuildStep`` class has been deprecated, and support will be removed along with support for old-style steps after the Buildbot-0.9.0 release. Instead, subclass :class:`~buildbot.process.buildstep.BuildStep` and mix in :class:`~buildbot.process.buildstep.ShellMixin` to get similar behavior. hjRh"Nh'hh)}rw(h+]h,]h-]h.]h1]uh3Nh4hh5]rx(hM)ry}rz(hXBoth old-style and new-style steps are supported in this version of Buildbot. Upgrade your steps to new-style now, as support for old-style steps will be dropped after Buildbot-0.9.0. See :ref:`New-Style-Build-Steps` for details.hjuh"h%h'hQh)}r{(h+]h,]h-]h.]h1]uh3M$h5]r|(h>XBoth old-style and new-style steps are supported in this version of Buildbot. Upgrade your steps to new-style now, as support for old-style steps will be dropped after Buildbot-0.9.0. See r}r~}r(hXBoth old-style and new-style steps are supported in this version of Buildbot. Upgrade your steps to new-style now, as support for old-style steps will be dropped after Buildbot-0.9.0. See hjyubh)r}r(hX:ref:`New-Style-Build-Steps`rhjyh"h%h'hh)}r(UreftypeXrefhhXnew-style-build-stepsU refdomainXstdrh.]h-]U refexplicith+]h,]h1]hhuh3M$h5]rj)r}r(hjh)}r(h+]h,]r(hjXstd-refreh-]h.]h1]uhjh5]rh>XNew-Style-Build-Stepsrr}r(hUhjubah'jubaubh>X for details.rr}r(hX for details.hjyubeubhv)r}r(hUh)}r(h{X*h.]h-]h+]h,]h1]uhjuh5]rh})r}r(hX.The ``LoggingBuildStep`` class has been deprecated, and support will be removed along with support for old-style steps after the Buildbot-0.9.0 release. Instead, subclass :class:`~buildbot.process.buildstep.BuildStep` and mix in :class:`~buildbot.process.buildstep.ShellMixin` to get similar behavior. h)}r(h+]h,]h-]h.]h1]uhjh5]rhM)r}r(hX-The ``LoggingBuildStep`` class has been deprecated, and support will be removed along with support for old-style steps after the Buildbot-0.9.0 release. Instead, subclass :class:`~buildbot.process.buildstep.BuildStep` and mix in :class:`~buildbot.process.buildstep.ShellMixin` to get similar behavior.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M(h5]r(h>XThe rr}r(hXThe hjubh)r}r(hX``LoggingBuildStep``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XLoggingBuildSteprr}r(hUhjubah'hubh>X class has been deprecated, and support will be removed along with support for old-style steps after the Buildbot-0.9.0 release. Instead, subclass rr}r(hX class has been deprecated, and support will be removed along with support for old-style steps after the Buildbot-0.9.0 release. Instead, subclass hjubh)r}r(hX.:class:`~buildbot.process.buildstep.BuildStep`rhjh"h%h'hh)}r(UreftypeXclasshhX$buildbot.process.buildstep.BuildStepU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3M(h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>X BuildSteprr}r(hUhjubah'hubaubh>X and mix in rr}r(hX and mix in hjubh)r}r(hX/:class:`~buildbot.process.buildstep.ShellMixin`rhjh"h%h'hh)}r(UreftypeXclasshhX%buildbot.process.buildstep.ShellMixinU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3M(h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>X ShellMixinrr}r(hUhjubah'hubaubh>X to get similar behavior.rr}r(hX to get similar behavior.hjubeubah'hubah'hyubeubh})r}r(hXb``slavePortnum`` option deprecated, please use ``c['protocols']['pb']['port']`` to set up PB port hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXa``slavePortnum`` option deprecated, please use ``c['protocols']['pb']['port']`` to set up PB porthjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M+h5]r(h)r}r(hX``slavePortnum``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X slavePortnumrr}r(hUhjubah'hubh>X option deprecated, please use rr}r(hX option deprecated, please use hjubh)r}r(hX ``c['protocols']['pb']['port']``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xc['protocols']['pb']['port']rr}r(hUhjubah'hubh>X to set up PB portrr}r(hX to set up PB porthjubeubaubh})r}r(hX_The buildbot.process.mtrlogobserver module have been renamed to buildbot.steps.mtrlogobserver. hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX^The buildbot.process.mtrlogobserver module have been renamed to buildbot.steps.mtrlogobserver.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M-h5]rh>X^The buildbot.process.mtrlogobserver module have been renamed to buildbot.steps.mtrlogobserver.rr}r(hjhjubaubaubh})r}r(hX6The buildmaster now requires at least Twisted-11.0.0. hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX5The buildmaster now requires at least Twisted-11.0.0.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M/h5]rh>X5The buildmaster now requires at least Twisted-11.0.0.rr}r(hjhjubaubaubh})r}r(hX@The buildmaster now requires at least sqlalchemy-migrate 0.6.1. hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX?The buildmaster now requires at least sqlalchemy-migrate 0.6.1.r hjh"h%h'hQh)}r (h+]h,]h-]h.]h1]uh3M1h5]r h>X?The buildmaster now requires at least sqlalchemy-migrate 0.6.1.r r }r(hj hjubaubaubh})r}r(hX The ``hgbuildbot`` Mercurial hook has been moved to ``contrib/``, and does not work with recent versions of Mercurial and Twisted. The runtimes for these two tools are incompatible, yet ``hgbuildbot`` attempts to run both in the same Python interpreter. Mayhem ensues. hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX The ``hgbuildbot`` Mercurial hook has been moved to ``contrib/``, and does not work with recent versions of Mercurial and Twisted. The runtimes for these two tools are incompatible, yet ``hgbuildbot`` attempts to run both in the same Python interpreter. Mayhem ensues.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M3h5]r(h>XThe rr}r(hXThe hjubh)r}r(hX``hgbuildbot``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>X hgbuildbotrr}r (hUhjubah'hubh>X" Mercurial hook has been moved to r!r"}r#(hX" Mercurial hook has been moved to hjubh)r$}r%(hX ``contrib/``h)}r&(h+]h,]h-]h.]h1]uhjh5]r'h>Xcontrib/r(r)}r*(hUhj$ubah'hubh>Xz, and does not work with recent versions of Mercurial and Twisted. The runtimes for these two tools are incompatible, yet r+r,}r-(hXz, and does not work with recent versions of Mercurial and Twisted. The runtimes for these two tools are incompatible, yet hjubh)r.}r/(hX``hgbuildbot``h)}r0(h+]h,]h-]h.]h1]uhjh5]r1h>X hgbuildbotr2r3}r4(hUhj.ubah'hubh>XD attempts to run both in the same Python interpreter. Mayhem ensues.r5r6}r7(hXD attempts to run both in the same Python interpreter. Mayhem ensues.hjubeubaubh})r8}r9(hXbThe try scheduler's ``--connect=ssh`` method no longer supports waiting for results (``--wait``). hjRh"h%h'hh)}r:(h+]h,]h-]h.]h1]uh3Nh4hh5]r;hM)r<}r=(hXaThe try scheduler's ``--connect=ssh`` method no longer supports waiting for results (``--wait``).hj8h"h%h'hQh)}r>(h+]h,]h-]h.]h1]uh3M7h5]r?(h>XThe try scheduler's r@rA}rB(hXThe try scheduler's hj<ubh)rC}rD(hX``--connect=ssh``h)}rE(h+]h,]h-]h.]h1]uhj<h5]rFh>X --connect=sshrGrH}rI(hUhjCubah'hubh>X0 method no longer supports waiting for results (rJrK}rL(hX0 method no longer supports waiting for results (hj<ubh)rM}rN(hX ``--wait``h)}rO(h+]h,]h-]h.]h1]uhj<h5]rPh>X--waitrQrR}rS(hUhjMubah'hubh>X).rTrU}rV(hX).hj<ubeubaubh})rW}rX(hXThe former ``buildbot.process.buildstep.RemoteCommand`` class and its subclasses are now in :py:mod:`buildbot.process.remotecommand`, although imports from the previous path will continue to work. Similarly, the former ``buildbot.process.buildstep.LogObserver`` class and its subclasses are now in :py:mod:`buildbot.process.logobserver`, although imports from the previous path will continue to work. hjRh"h%h'hh)}rY(h+]h,]h-]h.]h1]uh3Nh4hh5]rZhM)r[}r\(hXThe former ``buildbot.process.buildstep.RemoteCommand`` class and its subclasses are now in :py:mod:`buildbot.process.remotecommand`, although imports from the previous path will continue to work. Similarly, the former ``buildbot.process.buildstep.LogObserver`` class and its subclasses are now in :py:mod:`buildbot.process.logobserver`, although imports from the previous path will continue to work.hjWh"h%h'hQh)}r](h+]h,]h-]h.]h1]uh3M9h5]r^(h>X The former r_r`}ra(hX The former hj[ubh)rb}rc(hX,``buildbot.process.buildstep.RemoteCommand``h)}rd(h+]h,]h-]h.]h1]uhj[h5]reh>X(buildbot.process.buildstep.RemoteCommandrfrg}rh(hUhjbubah'hubh>X% class and its subclasses are now in rirj}rk(hX% class and its subclasses are now in hj[ubh)rl}rm(hX(:py:mod:`buildbot.process.remotecommand`rnhj[h"h%h'hh)}ro(UreftypeXmodhhXbuildbot.process.remotecommandU refdomainXpyrph.]h-]U refexplicith+]h,]h1]hhhNhNuh3M9h5]rqh)rr}rs(hjnh)}rt(h+]h,]ru(hjpXpy-modrveh-]h.]h1]uhjlh5]rwh>Xbuildbot.process.remotecommandrxry}rz(hUhjrubah'hubaubh>XW, although imports from the previous path will continue to work. Similarly, the former r{r|}r}(hXW, although imports from the previous path will continue to work. Similarly, the former hj[ubh)r~}r(hX*``buildbot.process.buildstep.LogObserver``h)}r(h+]h,]h-]h.]h1]uhj[h5]rh>X&buildbot.process.buildstep.LogObserverrr}r(hUhj~ubah'hubh>X% class and its subclasses are now in rr}r(hX% class and its subclasses are now in hj[ubh)r}r(hX&:py:mod:`buildbot.process.logobserver`rhj[h"h%h'hh)}r(UreftypeXmodhhXbuildbot.process.logobserverU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3M9h5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-modreh-]h.]h1]uhjh5]rh>Xbuildbot.process.logobserverrr}r(hUhjubah'hubaubh>X@, although imports from the previous path will continue to work.rr}r(hX@, although imports from the previous path will continue to work.hj[ubeubaubh})r}r(hXThe undocumented BuildStep method ``checkDisconnect`` is deprecated and now does nothing as the handling of disconnects is now handled in the ``failed`` method. Any custom steps adding this method as a callback or errback should no longer do so. hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXThe undocumented BuildStep method ``checkDisconnect`` is deprecated and now does nothing as the handling of disconnects is now handled in the ``failed`` method. Any custom steps adding this method as a callback or errback should no longer do so.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M<h5]r(h>X"The undocumented BuildStep method rr}r(hX"The undocumented BuildStep method hjubh)r}r(hX``checkDisconnect``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XcheckDisconnectrr}r(hUhjubah'hubh>XY is deprecated and now does nothing as the handling of disconnects is now handled in the rr}r(hXY is deprecated and now does nothing as the handling of disconnects is now handled in the hjubh)r}r(hX ``failed``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xfailedrr}r(hUhjubah'hubh>X] method. Any custom steps adding this method as a callback or errback should no longer do so.rr}r(hX] method. Any custom steps adding this method as a callback or errback should no longer do so.hjubeubaubh})r}r(hXThe build step ``MsBuild`` is now called ``MsBuild4`` as multiple versions are now supported. An alias is provided so existing setups will continue to work, but this will be removed in a future release. hjRh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXThe build step ``MsBuild`` is now called ``MsBuild4`` as multiple versions are now supported. An alias is provided so existing setups will continue to work, but this will be removed in a future release.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M?h5]r(h>XThe build step rr}r(hXThe build step hjubh)r}r(hX ``MsBuild``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XMsBuildrr}r(hUhjubah'hubh>X is now called rr}r(hX is now called hjubh)r}r(hX ``MsBuild4``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>XMsBuild4rr}r(hUhjubah'hubh>X as multiple versions are now supported. An alias is provided so existing setups will continue to work, but this will be removed in a future release.rr}r(hX as multiple versions are now supported. An alias is provided so existing setups will continue to work, but this will be removed in a future release.hjubeubaubeubeubh)r}r(hUhhWh"h%h'h(h)}r(h+]h,]h-]h.]rUchanges-for-developersrah1]rh auh3MCh4hh5]r(h7)r}r(hXChanges for Developersrhjh"h%h'h;h)}r(h+]h,]h-]h.]h1]uh3MCh4hh5]rh>XChanges for Developersrr}r(hjhjubaubhv)r}r(hUhjh"h%h'hyh)}r(h{X*h.]h-]h+]h,]h1]uh3MEh4hh5]r(h})r}r(hXThe :py:class:`CompositeStepMixin` now provides a ``runGlob`` method to check for files on the slave that match a given shell-style pattern. hjh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXThe :py:class:`CompositeStepMixin` now provides a ``runGlob`` method to check for files on the slave that match a given shell-style pattern.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3MEh5]r(h>XThe rr}r(hXThe hjubh)r}r(hX:py:class:`CompositeStepMixin`rhjh"h%h'hh)}r(UreftypeXclasshhXCompositeStepMixinU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3MEh5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>XCompositeStepMixinrr}r(hUhjubah'hubaubh>X now provides a rr}r(hX now provides a hjubh)r}r (hX ``runGlob``h)}r (h+]h,]h-]h.]h1]uhjh5]r h>XrunGlobr r }r(hUhjubah'hubh>XO method to check for files on the slave that match a given shell-style pattern.rr}r(hXO method to check for files on the slave that match a given shell-style pattern.hjubeubaubh})r}r(hXdThe :py:class:`BuilderStatus` now allows you to pass a ``filter_fn`` arguent to ``generateBuilds``. hjh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXcThe :py:class:`BuilderStatus` now allows you to pass a ``filter_fn`` arguent to ``generateBuilds``.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3MGh5]r(h>XThe rr}r(hXThe hjubh)r}r(hX:py:class:`BuilderStatus`rhjh"h%h'hh)}r (UreftypeXclasshhX BuilderStatusU refdomainXpyr!h.]h-]U refexplicith+]h,]h1]hhhNhNuh3MGh5]r"h)r#}r$(hjh)}r%(h+]h,]r&(hj!Xpy-classr'eh-]h.]h1]uhjh5]r(h>X BuilderStatusr)r*}r+(hUhj#ubah'hubaubh>X now allows you to pass a r,r-}r.(hX now allows you to pass a hjubh)r/}r0(hX ``filter_fn``h)}r1(h+]h,]h-]h.]h1]uhjh5]r2h>X filter_fnr3r4}r5(hUhj/ubah'hubh>X arguent to r6r7}r8(hX arguent to hjubh)r9}r:(hX``generateBuilds``h)}r;(h+]h,]h-]h.]h1]uhjh5]r<h>XgenerateBuildsr=r>}r?(hUhj9ubah'hubh>X.r@}rA(hX.hjubeubaubeubeubeubhh)rB}rC(hUhh h"h%h'h(h)}rD(h+]h,]h-]h.]rEUdetailsrFah1]rGhauh3Mhh4hh5]rH(h7)rI}rJ(hXDetailsrKhjBh"h%h'h;h)}rL(h+]h,]h-]h.]h1]uh3Mhh4hh5]rMh>XDetailsrNrO}rP(hjKhjIubaubhM)rQ}rR(hX\For a more detailed description of the changes made in this version, see the git log itself:rShjBh"h%h'hQh)}rT(h+]h,]h-]h.]h1]uh3Mjh4hh5]rUh>X\For a more detailed description of the changes made in this version, see the git log itself:rVrW}rX(hjShjQubaubcdocutils.nodes literal_block rY)rZ}r[(hXgit log v0.8.8..v0.8.9hjBh"h%h'U literal_blockr\h)}r](Ulinenosr^Ulanguager_XbashhGhHh.]h-]h+]h,]h1]uh3Mmh4hh5]r`h>Xgit log v0.8.8..v0.8.9rarb}rc(hUhjZubaubeubh)rd}re(hUhh h"h%h'h(h)}rf(h+]h,]h-]h.]rgUolder-versionsrhah1]rih auh3Mrh4hh5]rj(h7)rk}rl(hXOlder Versionsrmhjdh"h%h'h;h)}rn(h+]h,]h-]h.]h1]uh3Mrh4hh5]roh>XOlder Versionsrprq}rr(hjmhjkubaubhM)rs}rt(hXRelease notes for older versions of Buildbot are available in the :bb:src:`master/docs/relnotes/` directory of the source tree. Newer versions are also available here:hjdh"h%h'hQh)}ru(h+]h,]h-]h.]h1]uh3Mth4hh5]rv(h>XBRelease notes for older versions of Buildbot are available in the rwrx}ry(hXBRelease notes for older versions of Buildbot are available in the hjsubj)rz}r{(hUh)}r|(jXmaster/docs/relnotes/r}jXFhttps://github.com/buildbot/buildbot/blob/master/master/docs/relnotes/h.]h-]h+]h,]h1]uhjsh5]r~h)r}r(hj}h)}r(h+]h,]h-]h.]h1]uhjzh5]rh>Xmaster/docs/relnotes/rr}r(hUhjubah'hubah'jubh>XF directory of the source tree. Newer versions are also available here:rr}r(hXF directory of the source tree. Newer versions are also available here:hjsubeubcdocutils.nodes compound r)r}r(hUhjdh"h%h'Ucompoundrh)}r(h+]h,]rUtoctree-wrapperrah-]h.]h1]uh3Nh4hh5]rcsphinx.addnodes toctree r)r}r(hUhjh"h%h'Utoctreerh)}r(UnumberedrKU includehiddenrhhU titlesonlyrUglobrh.]h-]h+]h,]h1]Uentriesr]r(NXrelnotes/0.8.8rrNXrelnotes/0.8.7rrNXrelnotes/0.8.6rreUhiddenrU includefilesr]r(jjjeUmaxdepthrKuh3Mwh5]ubaubeubeubh"h%h'h(h)}r(h+]h,]h-]h.]rUslaverah1]rhauh3MJh4hh5]r(h7)r}r(hXSlaverhhh"h%h'h;h)}r(h+]h,]h-]h.]h1]uh3MJh4hh5]rh>XSlaverr}r(hjhjubaubhh)r}r(hUhKhhh"h%h'h(h)}r(h+]rj ah,]h-]h.]rUid2rah1]uh3MVh4hh5]r(h7)r}r(hXFixesrhjh"h%h'h;h)}r(h+]h,]h-]h.]h1]uh3MVh4hh5]rh>XFixesrr}r(hjhjubaubhv)r}r(hUhjh"h%h'hyh)}r(h{X*h.]h-]h+]h,]h1]uh3MXh4hh5]r(h})r}r(hXFixed an issue when buildstep stop() was raising an exception incorrectly if timeout for buildstep wasn't set or was None (see :bb:pull:`753`) thus keeping watched logfiles open (this prevented their removal on Windows in subsequent builds). hjh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXFixed an issue when buildstep stop() was raising an exception incorrectly if timeout for buildstep wasn't set or was None (see :bb:pull:`753`) thus keeping watched logfiles open (this prevented their removal on Windows in subsequent builds).hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3MXh5]r(h>XFixed an issue when buildstep stop() was raising an exception incorrectly if timeout for buildstep wasn't set or was None (see rr}r(hXFixed an issue when buildstep stop() was raising an exception incorrectly if timeout for buildstep wasn't set or was None (see hjubj)r}r(hUh)}r(jXpull request 753rjX-https://github.com/buildbot/buildbot/pull/753h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 753rr}r(hjhjubah'jubh>Xd) thus keeping watched logfiles open (this prevented their removal on Windows in subsequent builds).rr}r(hXd) thus keeping watched logfiles open (this prevented their removal on Windows in subsequent builds).hjubeubaubh})r}r(hXKFixed a bug in P4 source step where the ``timeout`` parameter was ignored. hjh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXJFixed a bug in P4 source step where the ``timeout`` parameter was ignored.hjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M\h5]r(h>X(Fixed a bug in P4 source step where the rr}r(hX(Fixed a bug in P4 source step where the hjubh)r}r(hX ``timeout``h)}r(h+]h,]h-]h.]h1]uhjh5]rh>Xtimeoutrr}r(hUhjubah'hubh>X parameter was ignored.rr}r(hX parameter was ignored.hjubeubaubh})r}r(hXFixed a bug in P4 source step where using a custom view-spec could result in failed syncs due to incorrectly generated command-lines. hjh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hXFixed a bug in P4 source step where using a custom view-spec could result in failed syncs due to incorrectly generated command-lines.rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3M^h5]rh>XFixed a bug in P4 source step where using a custom view-spec could result in failed syncs due to incorrectly generated command-lines.rr}r(hjhjubaubaubh})r}r(hXbThe logwatcher will use ``/usr/xpg4/bin/tail`` on Solaris, it if is available (:bb:pull:`1065`). hjh"h%h'hh)}r(h+]h,]h-]h.]h1]uh3Nh4hh5]rhM)r}r(hX`The logwatcher will use ``/usr/xpg4/bin/tail`` on Solaris, it if is available (:bb:pull:`1065`).rhjh"h%h'hQh)}r(h+]h,]h-]h.]h1]uh3Mah5]r(h>XThe logwatcher will use rr}r(hXThe logwatcher will use hjubh)r }r (hX``/usr/xpg4/bin/tail``h)}r (h+]h,]h-]h.]h1]uhjh5]r h>X/usr/xpg4/bin/tailr r}r(hUhj ubah'hubh>X! on Solaris, it if is available (rr}r(hX! on Solaris, it if is available (hjubj)r}r(hUh)}r(jXpull request 1065rjX.https://github.com/buildbot/buildbot/pull/1065h.]h-]h+]h,]h1]uhjh5]rh>Xpull request 1065rr}r(hjhjubah'jubh>X).rr}r(hX).hjubeubaubeubeubh)r}r(hUhKhhh"h%h'h(h)}r (h+]r!jFah,]h-]h.]r"Uid3r#ah1]uh3Meh4hh5]r$h7)r%}r&(hX2Deprecations, Removals, and Non-Compatible Changesr'hjh"h%h'h;h)}r((h+]h,]h-]h.]h1]uh3Meh4hh5]r)h>X2Deprecations, Removals, and Non-Compatible Changesr*r+}r,(hj'hj%ubaubaubeubh"h%h'h(h)}r-(h+]r.hjah,]h-]h.]r/Uid1r0ah1]uh3MMh4hh5]r1(h7)r2}r3(hXFeaturesr4hhh"h%h'h;h)}r5(h+]h,]h-]h.]h1]uh3MMh4hh5]r6h>XFeaturesr7r8}r9(hj4hj2ubaubhv)r:}r;(hUhhh"h%h'hyh)}r<(h{X*h.]h-]h+]h,]h1]uh3MOh4hh5]r=(h})r>}r?(hXDAdded zsh and bash tab-completions support for 'buildslave' command.r@hj:h"h%h'hh)}rA(h+]h,]h-]h.]h1]uh3Nh4hh5]rBhM)rC}rD(hj@hj>h"h%h'hQh)}rE(h+]h,]h-]h.]h1]uh3MOh5]rFh>XDAdded zsh and bash tab-completions support for 'buildslave' command.rGrH}rI(hj@hjCubaubaubh})rJ}rK(hXRemoteShellCommands accept the new sigtermTime parameter from master. This allows processes to be killed by SIGTERM before resorting to SIGKILL (:bb:bug:`751`)hj:h"h%h'hh)}rL(h+]h,]h-]h.]h1]uh3Nh4hh5]rMhM)rN}rO(hXRemoteShellCommands accept the new sigtermTime parameter from master. This allows processes to be killed by SIGTERM before resorting to SIGKILL (:bb:bug:`751`)hjJh"h%h'hQh)}rP(h+]h,]h-]h.]h1]uh3MPh5]rQ(h>XRemoteShellCommands accept the new sigtermTime parameter from master. This allows processes to be killed by SIGTERM before resorting to SIGKILL (rRrS}rT(hXRemoteShellCommands accept the new sigtermTime parameter from master. This allows processes to be killed by SIGTERM before resorting to SIGKILL (hjNubj)rU}rV(hUh)}rW(jXbug #751jX#http://trac.buildbot.net/ticket/751h.]h-]h+]h,]h1]uhjNh5]rXh>Xbug #751rYrZ}r[(hUhjUubah'jubh>X)r\}r](hX)hjNubeubaubh})r^}r_(hXKCommands will now throw a ``ValueError`` if mandatory args are not present.r`hj:h"h%h'hh)}ra(h+]h,]h-]h.]h1]uh3Nh4hh5]rbhM)rc}rd(hj`hj^h"h%h'hQh)}re(h+]h,]h-]h.]h1]uh3MRh5]rf(h>XCommands will now throw a rgrh}ri(hXCommands will now throw a hjcubh)rj}rk(hX``ValueError``h)}rl(h+]h,]h-]h.]h1]uhjch5]rmh>X ValueErrorrnro}rp(hUhjjubah'hubh>X# if mandatory args are not present.rqrr}rs(hX# if mandatory args are not present.hjcubeubaubh})rt}ru(hXnAdded a new remote command :py:class:`GlobPath` that can be used to call Python's ``glob.glob`` on the slave. hj:h"h%h'hh)}rv(h+]h,]h-]h.]h1]uh3Nh4hh5]rwhM)rx}ry(hXmAdded a new remote command :py:class:`GlobPath` that can be used to call Python's ``glob.glob`` on the slave.hjth"h%h'hQh)}rz(h+]h,]h-]h.]h1]uh3MSh5]r{(h>XAdded a new remote command r|r}}r~(hXAdded a new remote command hjxubh)r}r(hX:py:class:`GlobPath`rhjxh"h%h'hh)}r(UreftypeXclasshhXGlobPathU refdomainXpyrh.]h-]U refexplicith+]h,]h1]hhhNhNuh3MSh5]rh)r}r(hjh)}r(h+]h,]r(hjXpy-classreh-]h.]h1]uhjh5]rh>XGlobPathrr}r(hUhjubah'hubaubh>X# that can be used to call Python's rr}r(hX# that can be used to call Python's hjxubh)r}r(hX ``glob.glob``h)}r(h+]h,]h-]h.]h1]uhjxh5]rh>X glob.globrr}r(hUhjubah'hubh>X on the slave.rr}r(hX on the slave.hjxubeubaubeubeubh"h%h'Usystem_messagerh)}r(h+]UlevelKh.]h-]rj0aUsourceh%h,]h1]UlineMMUtypeUINFOruh3MMh4hh5]rhM)r}r(hUh)}r(h+]h,]h-]h.]h1]uhhh5]rh>X+Duplicate implicit target name: "features".rr}r(hUhjubah'hQubaubh)r}r(hUhjh"h%h'jh)}r(h+]UlevelKh.]h-]rjaUsourceh%h,]h1]UlineMVUtypejuh3MVh4hh5]rhM)r}r(hUh)}r(h+]h,]h-]h.]h1]uhjh5]rh>X(Duplicate implicit target name: "fixes".rr}r(hUhjubah'hQubaubh)r}r(hUhjh"h%h'jh)}r(h+]UlevelKh.]h-]rj#aUsourceh%h,]h1]UlineMeUtypejuh3Meh4hh5]rhM)r}r(hUh)}r(h+]h,]h-]h.]h1]uhjh5]rh>XUDuplicate implicit target name: "deprecations, removals, and non-compatible changes".rr}r(hUhjubah'hQubaubeUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hjhNhj h Nh h0h jh jhh h[hjFhjZhNuh5]rh ahUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh4hU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh;NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8r U source_urlr NUinput_encodingr U utf-8-sigr U_disable_configr NU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUO/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/relnotes/index.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesr NU _config_filesr!]Ufile_insertion_enabledr"U raw_enabledr#KU dump_settingsr$NubUsymbol_footnote_startr%KUidsr&}r'(jhhlhfjZjUjjj j j#jjHjBh0h jjh[hWj j jhjdj0hjFjBuUsubstitution_namesr(}r)h'h4h)}r*(h+]h.]h-]Usourceh%h,]h1]uU footnotesr+]r,Urefidsr-}r.ub.PK3D۳&&;buildbot-v0.8.9/.doctrees/developer/cls-iproperties.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X hasPropertyqX setPropertyqX getPropertyqX ipropertiesq NX getPropertiesq uUsubstitution_defsq }q Uparse_messagesq ]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hhhhhhh U ipropertiesqh h uUchildrenq]q(csphinx.addnodes index q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-iproperties.rstqq}q bUtagnameq!Uindexq"U attributesq#}q$(Uidsq%]Ubackrefsq&]Udupnamesq']Uclassesq(]Unamesq)]Uentriesq*]q+(Usingleq,XProperties; IPropertiesUindex-0q-Utq.aUinlineq/uUlineq0KUdocumentq1hh]ubcdocutils.nodes target q2)q3}q4(hUhhhhh!Utargetq5h#}q6(h%]h&]h']h(]h)]Urefidq7h-uh0Kh1hh]ubcdocutils.nodes section q8)q9}q:(hUhhhhUexpect_referenced_by_nameq;}h!Usectionq(hh-eh)]q?h auh0Kh1hUexpect_referenced_by_idq@}qAh-h3sh]qB(cdocutils.nodes title qC)qD}qE(hX IPropertiesqFhh9hhh!UtitleqGh#}qH(h']h(]h&]h%]h)]uh0Kh1hh]qIcdocutils.nodes Text qJX IPropertiesqKqL}qM(hhFhhDubaubh)qN}qO(hUhh9hNh!h"h#}qP(h%]h&]h']h(]h)]Uentries]uh0Nh1hh]ubcsphinx.addnodes desc qQ)qR}qS(hUhh9hNh!UdescqTh#}qU(UnoindexqVUdomainqWXpyh%]h&]h']h(]h)]UobjtypeqXXclassqYUdesctypeqZhYuh0Nh1hh]q[(csphinx.addnodes desc_signature q\)q]}q^(hX!buildbot.interfaces.IProperties::q_hhRhhh!Udesc_signatureq`h#}qa(h%]h&]h']h(]h)]Ufirstqbuh0Kh1hh]qccsphinx.addnodes desc_name qd)qe}qf(hh_hh]hhh!U desc_nameqgh#}qh(h']h(]h&]h%]h)]uh0Kh1hh]qihJX!buildbot.interfaces.IProperties::qjqk}ql(hUhheubaubaubcsphinx.addnodes desc_content qm)qn}qo(hUhhRhhh!U desc_contentqph#}qq(h']h(]h&]h%]h)]uh0Kh1hh]qr(cdocutils.nodes paragraph qs)qt}qu(hXMProviders of this interface allow get and set access to a build's properties.qvhhnhhh!U paragraphqwh#}qx(h']h(]h&]h%]h)]uh0Kh1hh]qyhJXMProviders of this interface allow get and set access to a build's properties.qzq{}q|(hhvhhtubaubh)q}}q~(hUhhnhhh!h"h#}q(h%]h&]h']h(]h)]Uentries]q(h,X getProperty()hUtqauh0Nh1hh]ubhQ)q}q(hUhhnhhh!hTh#}q(hVhWXpyh%]h&]h']h(]h)]hXXmethodqhZhuh0Nh1hh]q(h\)q}q(hX#getProperty(propname, default=None)hhhhh!h`h#}q(h%]qhaUmoduleqNh&]h']h(]h)]qhaUfullnameqhUclassqUhbuh0K h1hh]q(hd)q}q(hhhhhhh!hgh#}q(h']h(]h&]h%]h)]uh0K h1hh]qhJX getPropertyqq}q(hUhhubaubcsphinx.addnodes desc_parameterlist q)q}q(hUhhhhh!Udesc_parameterlistqh#}q(h']h(]h&]h%]h)]uh0K h1hh]q(csphinx.addnodes desc_parameter q)q}q(hXpropnameh#}q(h']h(]h&]h%]h)]uhhh]qhJXpropnameqq}q(hUhhubah!Udesc_parameterqubh)q}q(hX default=Noneh#}q(h']h(]h&]h%]h)]uhhh]qhJX default=Noneqq}q(hUhhubah!hubeubeubhm)q}q(hUhhhhh!hph#}q(h']h(]h&]h%]h)]uh0K h1hh]qhs)q}q(hXOGet a named property, returning the default value if the property is not found.qhhhhh!hwh#}q(h']h(]h&]h%]h)]uh0K h1hh]qhJXOGet a named property, returning the default value if the property is not found.qq}q(hhhhubaubaubeubh)q}q(hUhhnhhh!h"h#}q(h%]h&]h']h(]h)]Uentries]q(h,X hasProperty()hUtqauh0Nh1hh]ubhQ)q}q(hUhhnhhh!hTh#}q(hVhWXpyh%]h&]h']h(]h)]hXXmethodqhZhuh0Nh1hh]q(h\)q}q(hXhasProperty(propname)hhhhh!h`h#}q(h%]qhahNh&]h']h(]h)]qhahhhUhbuh0Kh1hh]q(hd)q}q(hhhhhhh!hgh#}q(h']h(]h&]h%]h)]uh0Kh1hh]qhJX hasPropertyqͅq}q(hUhhubaubh)q}q(hUhhhhh!hh#}q(h']h(]h&]h%]h)]uh0Kh1hh]qh)q}q(hXpropnameh#}q(h']h(]h&]h%]h)]uhhh]qhJXpropnameq؅q}q(hUhhubah!hubaubeubhm)q}q(hUhhhhh!hph#}q(h']h(]h&]h%]h)]uh0Kh1hh]qhs)q}q(hX,Determine whether the named property exists.qhhhhh!hwh#}q(h']h(]h&]h%]h)]uh0Kh1hh]qhJX,Determine whether the named property exists.q䅁q}q(hhhhubaubaubeubh)q}q(hUhhnhhh!h"h#}q(h%]h&]h']h(]h)]Uentries]q(h,X setProperty()hUtqauh0Nh1hh]ubhQ)q}q(hUhhnhhh!hTh#}q(hVhWXpyh%]h&]h']h(]h)]hXXmethodqhZhuh0Nh1hh]q(h\)q}q(hX$setProperty(propname, value, source)hhhhh!h`h#}q(h%]qhahNh&]h']h(]h)]qhahhhUhbuh0Kh1hh]q(hd)q}q(hhhhhhh!hgh#}q(h']h(]h&]h%]h)]uh0Kh1hh]qhJX setPropertyqq}q(hUhhubaubh)q}q(hUhhhhh!hh#}r(h']h(]h&]h%]h)]uh0Kh1hh]r(h)r}r(hXpropnameh#}r(h']h(]h&]h%]h)]uhhh]rhJXpropnamerr}r(hUhjubah!hubh)r }r (hXvalueh#}r (h']h(]h&]h%]h)]uhhh]r hJXvaluer r}r(hUhj ubah!hubh)r}r(hXsourceh#}r(h']h(]h&]h%]h)]uhhh]rhJXsourcerr}r(hUhjubah!hubeubeubhm)r}r(hUhhhhh!hph#}r(h']h(]h&]h%]h)]uh0Kh1hh]rhs)r}r(hXBSet a property's value, also specifying the source for this value.rhjhhh!hwh#}r(h']h(]h&]h%]h)]uh0Kh1hh]rhJXBSet a property's value, also specifying the source for this value.r r!}r"(hjhjubaubaubeubh)r#}r$(hUhhnhhh!h"h#}r%(h%]h&]h']h(]h)]Uentries]r&(h,XgetProperties()h Utr'auh0Nh1hh]ubhQ)r(}r)(hUhhnhhh!hTh#}r*(hVhWXpyh%]h&]h']h(]h)]hXXmethodr+hZj+uh0Nh1hh]r,(h\)r-}r.(hXgetProperties()r/hj(hhh!h`h#}r0(h%]r1h ahNh&]h']h(]h)]r2h ahh hUhbuh0Kh1hh]r3(hd)r4}r5(hh hj-hhh!hgh#}r6(h']h(]h&]h%]h)]uh0Kh1hh]r7hJX getPropertiesr8r9}r:(hUhj4ubaubh)r;}r<(hUhj-hhh!hh#}r=(h']h(]h&]h%]h)]uh0Kh1hh]ubeubhm)r>}r?(hUhj(hhh!hph#}r@(h']h(]h&]h%]h)]uh0Kh1hh]rAhs)rB}rC(hXGet a :class:`buildbot.process.properties.Properties` instance. The interface of this class is not finalized; where possible, use the other ``IProperties`` methods.hj>hhh!hwh#}rD(h']h(]h&]h%]h)]uh0Kh1hh]rE(hJXGet a rFrG}rH(hXGet a hjBubcsphinx.addnodes pending_xref rI)rJ}rK(hX/:class:`buildbot.process.properties.Properties`rLhjBhhh!U pending_xrefrMh#}rN(UreftypeXclassUrefwarnrOU reftargetrPX&buildbot.process.properties.PropertiesU refdomainXpyrQh%]h&]U refexplicith']h(]h)]UrefdocrRXdeveloper/cls-ipropertiesrSUpy:classrTNU py:modulerUNuh0Kh]rVcdocutils.nodes literal rW)rX}rY(hjLh#}rZ(h']h(]r[(Uxrefr\jQXpy-classr]eh&]h%]h)]uhjJh]r^hJX&buildbot.process.properties.Propertiesr_r`}ra(hUhjXubah!UliteralrbubaubhJXX instance. The interface of this class is not finalized; where possible, use the other rcrd}re(hXX instance. The interface of this class is not finalized; where possible, use the other hjBubjW)rf}rg(hX``IProperties``h#}rh(h']h(]h&]h%]h)]uhjBh]rihJX IPropertiesrjrk}rl(hUhjfubah!jbubhJX methods.rmrn}ro(hX methods.hjBubeubaubeubeubeubeubehUU transformerrpNU footnote_refsrq}rrUrefnamesrs}rtUsymbol_footnotesru]rvUautofootnote_refsrw]rxUsymbol_footnote_refsry]rzU citationsr{]r|h1hU current_liner}NUtransform_messagesr~]rcdocutils.nodes system_message r)r}r(hUh#}r(h']UlevelKh%]h&]Usourcehh(]h)]UlineKUtypeUINFOruh]rhs)r}r(hUh#}r(h']h(]h&]h%]h)]uhjh]rhJX-Hyperlink target "index-0" is not referenced.rr}r(hUhjubah!hwubah!Usystem_messagerubaUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhGNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-iproperties.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]rUfile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhhhhh9h-h9h j-hhuUsubstitution_namesr}rh!h1h#}r(h']h%]h&]Usourcehh(]h)]uU footnotesr]rUrefidsr}rh-]rh3asub.PK4D@1buildbot-v0.8.9/.doctrees/developer/tests.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X good testsqNX unit testsqNX be correctqNXprefer fakes to mocksq NXfakesq Xindependent of timeq NX small testsq NXtests-independent-of-timeq X fuzz testsqNX keeping stateqNXmockqXsuitesqNXregression testsqNXintegration testsqNXmixinsqNXassert only one thingqNX be helpfulqNX good nameqNXbuildbot's test suiteqNX isolationqNX clean codeqNXinterface testsqNuUsubstitution_defsq}qUparse_messagesq]qcdocutils.nodes system_message q )q!}q"(U rawsourceq#UUparentq$cdocutils.nodes section q%)q&}q'(h#UU referencedq(Kh$h%)q)}q*(h#Uh$hUsourceq+cdocutils.nodes reprunicode q,XP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/tests.rstq-q.}q/bUtagnameq0Usectionq1U attributesq2}q3(Udupnamesq4]Uclassesq5]Ubackrefsq6]Uidsq7]q8Ubuildbot-s-test-suiteq9aUnamesq:]q;hauUlineq]q?(cdocutils.nodes title q@)qA}qB(h#XBuildbot's Test SuiteqCh$h)h+h.h0UtitleqDh2}qE(h4]h5]h6]h7]h:]uh]qFcdocutils.nodes Text qGXBuildbot's Test SuiteqHqI}qJ(h#hCh$hAubaubcdocutils.nodes paragraph qK)qL}qM(h#XBuildbot's tests are under ``buildbot.test`` and, for the buildslave, ``buildslave.test``. Tests for the slave are similar to the master, although in some cases helpful functionality on the master is not re-implemented on the slave.h$h)h+h.h0U paragraphqNh2}qO(h4]h5]h6]h7]h:]uh]qP(hGXBuildbot's tests are under qQqR}qS(h#XBuildbot's tests are under h$hLubcdocutils.nodes literal qT)qU}qV(h#X``buildbot.test``h2}qW(h4]h5]h6]h7]h:]uh$hLh>]qXhGX buildbot.testqYqZ}q[(h#Uh$hUubah0Uliteralq\ubhGX and, for the buildslave, q]q^}q_(h#X and, for the buildslave, h$hLubhT)q`}qa(h#X``buildslave.test``h2}qb(h4]h5]h6]h7]h:]uh$hLh>]qchGXbuildslave.testqdqe}qf(h#Uh$h`ubah0h\ubhGX. Tests for the slave are similar to the master, although in some cases helpful functionality on the master is not re-implemented on the slave.qgqh}qi(h#X. Tests for the slave are similar to the master, although in some cases helpful functionality on the master is not re-implemented on the slave.h$hLubeubh%)qj}qk(h#Uh$h)h+h.h0h1h2}ql(h4]h5]h6]h7]qmUsuitesqnah:]qohauh]qp(h@)qq}qr(h#XSuitesqsh$hjh+h.h0hDh2}qt(h4]h5]h6]h7]h:]uh]quhGXSuitesqvqw}qx(h#hsh$hqubaubhK)qy}qz(h#X$Tests are divided into a few suites:q{h$hjh+h.h0hNh2}q|(h4]h5]h6]h7]h:]uh]q}hGX$Tests are divided into a few suites:q~q}q(h#h{h$hyubaubcdocutils.nodes bullet_list q)q}q(h#Uh$hjh+h.h0U bullet_listqh2}q(UbulletqX*h7]h6]h4]h5]h:]uh]q(cdocutils.nodes list_item q)q}q(h#XUnit tests (``buildbot.test.unit``) - these follow unit-testing practices and attempt to maximally isolate the system under test. Unit tests are the main mechanism of achieving test coverage, and all new code should be well-covered by corresponding unit tests. h$hh+h.h0U list_itemqh2}q(h4]h5]h6]h7]h:]uh]qhK)q}q(h#XUnit tests (``buildbot.test.unit``) - these follow unit-testing practices and attempt to maximally isolate the system under test. Unit tests are the main mechanism of achieving test coverage, and all new code should be well-covered by corresponding unit tests.h$hh+h.h0hNh2}q(h4]h5]h6]h7]h:]uh]q(hGX Unit tests (qq}q(h#X Unit tests (h$hubhT)q}q(h#X``buildbot.test.unit``h2}q(h4]h5]h6]h7]h:]uh$hh>]qhGXbuildbot.test.unitqq}q(h#Uh$hubah0h\ubhGX) - these follow unit-testing practices and attempt to maximally isolate the system under test. Unit tests are the main mechanism of achieving test coverage, and all new code should be well-covered by corresponding unit tests.qq}q(h#X) - these follow unit-testing practices and attempt to maximally isolate the system under test. Unit tests are the main mechanism of achieving test coverage, and all new code should be well-covered by corresponding unit tests.h$hubeubaubh)q}q(h#XInterface tests (``buildbot.test.interface``). In many cases, Buildbot has multiple implementations of the same interface -- at least one "real" implementation and a fake implementation used in unit testing. The interface tests ensure that these implementations all meet the same standards. This ensures consistency between implementations, and also ensures that the unit tests are testing against realistic fakes. h$hh+h.h0hh2}q(h4]h5]h6]h7]h:]uh]qhK)q}q(h#XInterface tests (``buildbot.test.interface``). In many cases, Buildbot has multiple implementations of the same interface -- at least one "real" implementation and a fake implementation used in unit testing. The interface tests ensure that these implementations all meet the same standards. This ensures consistency between implementations, and also ensures that the unit tests are testing against realistic fakes.h$hh+h.h0hNh2}q(h4]h5]h6]h7]h:]uh]q(hGXInterface tests (qq}q(h#XInterface tests (h$hubhT)q}q(h#X``buildbot.test.interface``h2}q(h4]h5]h6]h7]h:]uh$hh>]qhGXbuildbot.test.interfaceqq}q(h#Uh$hubah0h\ubhGXu). In many cases, Buildbot has multiple implementations of the same interface -- at least one "real" implementation and a fake implementation used in unit testing. The interface tests ensure that these implementations all meet the same standards. This ensures consistency between implementations, and also ensures that the unit tests are testing against realistic fakes.qq}q(h#Xu). In many cases, Buildbot has multiple implementations of the same interface -- at least one "real" implementation and a fake implementation used in unit testing. The interface tests ensure that these implementations all meet the same standards. This ensures consistency between implementations, and also ensures that the unit tests are testing against realistic fakes.h$hubeubaubh)q}q(h#XIntegration tests (``buildbot.test.integration``) - these test combinations of multiple units. Of necessity, integration tests are incomplete - they cannot test every condition; difficult to maintain - they tend to be complex and touch a lot of code; and slow - they usually require considerable setup and execute a lot of code. As such, use of integration tests is limited to a few, broad tests to act as a failsafe for the unit and interface tests. h$hh+h.h0hh2}q(h4]h5]h6]h7]h:]uh]qhK)q}q(h#XIntegration tests (``buildbot.test.integration``) - these test combinations of multiple units. Of necessity, integration tests are incomplete - they cannot test every condition; difficult to maintain - they tend to be complex and touch a lot of code; and slow - they usually require considerable setup and execute a lot of code. As such, use of integration tests is limited to a few, broad tests to act as a failsafe for the unit and interface tests.h$hh+h.h0hNh2}q(h4]h5]h6]h7]h:]uh]q(hGXIntegration tests (qq}q(h#XIntegration tests (h$hubhT)q}q(h#X``buildbot.test.integration``h2}q(h4]h5]h6]h7]h:]uh$hh>]qhGXbuildbot.test.integrationqÅq}q(h#Uh$hubah0h\ubhGX) - these test combinations of multiple units. Of necessity, integration tests are incomplete - they cannot test every condition; difficult to maintain - they tend to be complex and touch a lot of code; and slow - they usually require considerable setup and execute a lot of code. As such, use of integration tests is limited to a few, broad tests to act as a failsafe for the unit and interface tests.qƅq}q(h#X) - these test combinations of multiple units. Of necessity, integration tests are incomplete - they cannot test every condition; difficult to maintain - they tend to be complex and touch a lot of code; and slow - they usually require considerable setup and execute a lot of code. As such, use of integration tests is limited to a few, broad tests to act as a failsafe for the unit and interface tests.h$hubeubaubh)q}q(h#XRegression tests (``buildbot.test.regressions``) - these test to prevent re-occurrence of historical bugs. In most cases, a regression is better tested by a test in the other suites, or unlike to recur, so this suite tends to be small. h$hh+h.h0hh2}q(h4]h5]h6]h7]h:]uh]qhK)q}q(h#XRegression tests (``buildbot.test.regressions``) - these test to prevent re-occurrence of historical bugs. In most cases, a regression is better tested by a test in the other suites, or unlike to recur, so this suite tends to be small.h$hh+h.h0hNh2}q(h4]h5]h6]h7]h:]uh]q(hGXRegression tests (qхq}q(h#XRegression tests (h$hubhT)q}q(h#X``buildbot.test.regressions``h2}q(h4]h5]h6]h7]h:]uh$hh>]qhGXbuildbot.test.regressionsq؅q}q(h#Uh$hubah0h\ubhGX) - these test to prevent re-occurrence of historical bugs. In most cases, a regression is better tested by a test in the other suites, or unlike to recur, so this suite tends to be small.qۅq}q(h#X) - these test to prevent re-occurrence of historical bugs. In most cases, a regression is better tested by a test in the other suites, or unlike to recur, so this suite tends to be small.h$hubeubaubh)q}q(h#XFuzz tests (``buildbot.test.fuzz``) - these tests run for a long time and apply randomization to try to reproduce rare or unusual failures. The Buildbot project does not currently have a framework to run fuzz tests regularly. h$hh+h.h0hh2}q(h4]h5]h6]h7]h:]uh]qhK)q}q(h#XFuzz tests (``buildbot.test.fuzz``) - these tests run for a long time and apply randomization to try to reproduce rare or unusual failures. The Buildbot project does not currently have a framework to run fuzz tests regularly.h$hh+h.h0hNh2}q(h4]h5]h6]h7]h:]uh]q(hGX Fuzz tests (q慁q}q(h#X Fuzz tests (h$hubhT)q}q(h#X``buildbot.test.fuzz``h2}q(h4]h5]h6]h7]h:]uh$hh>]qhGXbuildbot.test.fuzzq텁q}q(h#Uh$hubah0h\ubhGX) - these tests run for a long time and apply randomization to try to reproduce rare or unusual failures. The Buildbot project does not currently have a framework to run fuzz tests regularly.qq}q(h#X) - these tests run for a long time and apply randomization to try to reproduce rare or unusual failures. The Buildbot project does not currently have a framework to run fuzz tests regularly.h$hubeubaubeubh%)q}q(h#Uh$hjh+h.h0h1h2}q(h4]h5]h6]h7]qU unit-testsqah:]qhauh]q(h@)q}q(h#X Unit Testsqh$hh+h.h0hDh2}q(h4]h5]h6]h7]h:]uh]qhGX Unit Testsqr}r(h#hh$hubaubhK)r}r(h#XEvery code module should have corresponding unit tests. This is not currently true of Buildbot, due to a large body of legacy code, but is a goal of the project. All new code must meet this requirement.rh$hh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXEvery code module should have corresponding unit tests. This is not currently true of Buildbot, due to a large body of legacy code, but is a goal of the project. All new code must meet this requirement.rr}r (h#jh$jubaubhK)r }r (h#XUnit test modules are be named after the package or class they test, replacing ``.`` with ``_`` and omitting the ``buildbot_``. For example, :file:`test_status_web_authz_Authz.py` tests the :class:`Authz` class in :file:`buildbot/status/web/authz.py`. Modules with only one class, or a few trivial classes, can be tested in a single test module. For more complex situations, prefer to use multiple test modules.h$hh+h.h0hNh2}r (h4]h5]h6]h7]h:]uh]r (hGXOUnit test modules are be named after the package or class they test, replacing rr}r(h#XOUnit test modules are be named after the package or class they test, replacing h$j ubhT)r}r(h#X``.``h2}r(h4]h5]h6]h7]h:]uh$j h>]rhGX.r}r(h#Uh$jubah0h\ubhGX with rr}r(h#X with h$j ubhT)r}r(h#X``_``h2}r(h4]h5]h6]h7]h:]uh$j h>]rhGX_r}r(h#Uh$jubah0h\ubhGX and omitting the r r!}r"(h#X and omitting the h$j ubhT)r#}r$(h#X ``buildbot_``h2}r%(h4]h5]h6]h7]h:]uh$j h>]r&hGX buildbot_r'r(}r)(h#Uh$j#ubah0h\ubhGX. For example, r*r+}r,(h#X. For example, h$j ubhT)r-}r.(h#Uh2}r/(h7]h6]h4]h5]r0Xfiler1aUrolej1h:]uh$j h>]r2hGXtest_status_web_authz_Authz.pyr3r4}r5(h#Xtest_status_web_authz_Authz.pyh$j-ubah0h\ubhGX tests the r6r7}r8(h#X tests the h$j ubcsphinx.addnodes pending_xref r9)r:}r;(h#X:class:`Authz`r<h$j h+h.h0U pending_xrefr=h2}r>(UreftypeXclassUrefwarnr?U reftargetr@XAuthzU refdomainXpyrAh7]h6]U refexplicith4]h5]h:]UrefdocrBXdeveloper/testsrCUpy:classrDNU py:modulerENuh]rFhT)rG}rH(h#j<h2}rI(h4]h5]rJ(UxrefrKjAXpy-classrLeh6]h7]h:]uh$j:h>]rMhGXAuthzrNrO}rP(h#Uh$jGubah0h\ubaubhGX class in rQrR}rS(h#X class in h$j ubhT)rT}rU(h#Uh2}rV(h7]h6]h4]h5]rWXfilerXaUrolejXh:]uh$j h>]rYhGXbuildbot/status/web/authz.pyrZr[}r\(h#Xbuildbot/status/web/authz.pyh$jTubah0h\ubhGX. Modules with only one class, or a few trivial classes, can be tested in a single test module. For more complex situations, prefer to use multiple test modules.r]r^}r_(h#X. Modules with only one class, or a few trivial classes, can be tested in a single test module. For more complex situations, prefer to use multiple test modules.h$j ubeubeubh%)r`}ra(h#Uh$hjh+h.h0h1h2}rb(h4]h5]h6]h7]rcUinterface-testsrdah:]rehauh]rf(h@)rg}rh(h#XInterface Testsrih$j`h+h.h0hDh2}rj(h4]h5]h6]h7]h:]uh]rkhGXInterface Testsrlrm}rn(h#jih$jgubaubhK)ro}rp(h#X%Interface tests exist to verify that multiple implementations of an interface meet the same requirements. Note that the name 'interface' should not be confused with the sparse use of Zope Interfaces in the Buildbot code -- in this context, an interface is any boundary between testable units.rqh$j`h+h.h0hNh2}rr(h4]h5]h6]h7]h:]uh]rshGX%Interface tests exist to verify that multiple implementations of an interface meet the same requirements. Note that the name 'interface' should not be confused with the sparse use of Zope Interfaces in the Buildbot code -- in this context, an interface is any boundary between testable units.rtru}rv(h#jqh$joubaubhK)rw}rx(h#X}Ideally, all interfaces, both public and private, should be tested. Certainly, any *public* interfaces need interface tests.h$j`h+h.h0hNh2}ry(h4]h5]h6]h7]h:]uh]rz(hGXTIdeally, all interfaces, both public and private, should be tested. Certainly, any r{r|}r}(h#XTIdeally, all interfaces, both public and private, should be tested. Certainly, any h$jwubcdocutils.nodes emphasis r~)r}r(h#X*public*h2}r(h4]h5]h6]h7]h:]uh$jwh>]rhGXpublicrr}r(h#Uh$jubah0UemphasisrubhGX! interfaces need interface tests.rr}r(h#X! interfaces need interface tests.h$jwubeubhK)r}r(h#XInterface test modules are named after the interface they are testing, e.g., :file:`test_mq.py`. They generally begin as follows::h$j`h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXMInterface test modules are named after the interface they are testing, e.g., rr}r(h#XMInterface test modules are named after the interface they are testing, e.g., h$jubhT)r}r(h#Uh2}r(h7]h6]h4]h5]rXfileraUrolejh:]uh$jh>]rhGX test_mq.pyrr}r(h#X test_mq.pyh$jubah0h\ubhGX#. They generally begin as follows:rr}r(h#X#. They generally begin as follows:h$jubeubcdocutils.nodes literal_block r)r}r(h#Xfrom buildbot.test.util import interfaces from twistd.trial import unittest class Tests(interfaces.InterfaceTests): # define methods that must be overridden per implementation def someSetupMethod(self): raise NotImplementedError # tests that all implementations must pass def test_signature_someMethod(self): @self.assertArgSpecMatches(self.systemUnderTest.someMethod) def someMethod(self, arg1, arg2): pass def test_something(self): pass # ... class RealTests(Tests): # tests that all *real* implementations must pass def test_something_else(self): pass # ...h$j`h+h.h0U literal_blockrh2}r(U xml:spacerUpreserverh7]h6]h4]h5]h:]uh]rhGXfrom buildbot.test.util import interfaces from twistd.trial import unittest class Tests(interfaces.InterfaceTests): # define methods that must be overridden per implementation def someSetupMethod(self): raise NotImplementedError # tests that all implementations must pass def test_signature_someMethod(self): @self.assertArgSpecMatches(self.systemUnderTest.someMethod) def someMethod(self, arg1, arg2): pass def test_something(self): pass # ... class RealTests(Tests): # tests that all *real* implementations must pass def test_something_else(self): pass # ...rr}r(h#Uh$jubaubhK)r}r(h#XAll of the test methods are defined here, segregated into tests that all implementations must pass, and tests that the fake implementation is not expected to pass. The ``test_signature_someMethod`` test above illustrates the ``assertArgSpecMatches`` decorator, which can be used to compare the argument specification of a callable with a reference implementation conveniently written as a nested function.h$j`h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXAll of the test methods are defined here, segregated into tests that all implementations must pass, and tests that the fake implementation is not expected to pass. The rr}r(h#XAll of the test methods are defined here, segregated into tests that all implementations must pass, and tests that the fake implementation is not expected to pass. The h$jubhT)r}r(h#X``test_signature_someMethod``h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXtest_signature_someMethodrr}r(h#Uh$jubah0h\ubhGX test above illustrates the rr}r(h#X test above illustrates the h$jubhT)r}r(h#X``assertArgSpecMatches``h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXassertArgSpecMatchesrr}r(h#Uh$jubah0h\ubhGX decorator, which can be used to compare the argument specification of a callable with a reference implementation conveniently written as a nested function.rr}r(h#X decorator, which can be used to compare the argument specification of a callable with a reference implementation conveniently written as a nested function.h$jubeubhK)r}r(h#XAt the bottom of the test module, a subclass is created for each implementation, implementing the setup methods that were stubbed out in the parent classes::h$j`h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXAt the bottom of the test module, a subclass is created for each implementation, implementing the setup methods that were stubbed out in the parent classes:rr}r(h#XAt the bottom of the test module, a subclass is created for each implementation, implementing the setup methods that were stubbed out in the parent classes:h$jubaubj)r}r(h#Xclass TestFakeThing(unittest.TestCase, Tests): def someSetupMethod(self): pass # ... class TestRealThing(unittest.TestCase, RealTests): def someSetupMethod(self): pass # ...h$j`h+h.h0jh2}r(jjh7]h6]h4]h5]h:]uh]rhGXclass TestFakeThing(unittest.TestCase, Tests): def someSetupMethod(self): pass # ... class TestRealThing(unittest.TestCase, RealTests): def someSetupMethod(self): pass # ...rr}r(h#Uh$jubaubhK)r}r(h#XFor implementations which require optional software, this is the appropriate place to signal that tests should be skipped when their prerequisites are not available.rh$j`h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXFor implementations which require optional software, this is the appropriate place to signal that tests should be skipped when their prerequisites are not available.rr}r(h#jh$jubaubeubh%)r}r(h#Uh$hjh+h.h0h1h2}r(h4]h5]h6]h7]rUintegration-testsrah:]rhauh]r(h@)r}r(h#XIntegration Testsrh$jh+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGXIntegration Testsrr}r(h#jh$jubaubhK)r}r(h#XIntegration test modules test several units at once, including their interactions. In general, they serve as a catch-all for failures and bugs that were not detected by the unit and interface tests. As such, they should not aim to be exhaustive, but merely representative.rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXIntegration test modules test several units at once, including their interactions. In general, they serve as a catch-all for failures and bugs that were not detected by the unit and interface tests. As such, they should not aim to be exhaustive, but merely representative.rr}r(h#jh$jubaubhK)r}r(h#XkIntegration tests are very difficult to maintain if they reach into the internals of any part of Buildbot. Where possible, try to use the same means as a user would to set up, run, and check the results of an integration test. That may mean writing a :file:`master.cfg` to be parsed, and checking the results by examining the database (or fake DB API) afterward.h$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXIntegration tests are very difficult to maintain if they reach into the internals of any part of Buildbot. Where possible, try to use the same means as a user would to set up, run, and check the results of an integration test. That may mean writing a rr}r(h#XIntegration tests are very difficult to maintain if they reach into the internals of any part of Buildbot. Where possible, try to use the same means as a user would to set up, run, and check the results of an integration test. That may mean writing a h$jubhT)r}r(h#Uh2}r(h7]h6]h4]h5]rXfileraUrolejh:]uh$jh>]rhGX master.cfgrr}r(h#X master.cfgh$jubah0h\ubhGX] to be parsed, and checking the results by examining the database (or fake DB API) afterward.rr}r(h#X] to be parsed, and checking the results by examining the database (or fake DB API) afterward.h$jubeubeubh%)r}r(h#Uh$hjh+h.h0h1h2}r(h4]h5]h6]h7]rUregression-testsrah:]rhauh]r (h@)r }r (h#XRegression Testsr h$jh+h.h0hDh2}r (h4]h5]h6]h7]h:]uh]rhGXRegression Testsrr}r(h#j h$j ubaubhK)r}r(h#XRegression tests are even more rare in Buildbot than integration tests. In many cases, a regression test is not necessary -- either the test is better-suited as a unit or interface test, or the failure is so specific that a test will never fail again.rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXRegression tests are even more rare in Buildbot than integration tests. In many cases, a regression test is not necessary -- either the test is better-suited as a unit or interface test, or the failure is so specific that a test will never fail again.rr}r(h#jh$jubaubhK)r}r(h#XRegression tests tend to be closely tied to the code in which the error occurred. When that code is refactored, the regression test generally becomes obsolete, and is deleted.rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXRegression tests tend to be closely tied to the code in which the error occurred. When that code is refactored, the regression test generally becomes obsolete, and is deleted.rr }r!(h#jh$jubaubeubh%)r"}r#(h#Uh$hjh+h.h0h1h2}r$(h4]h5]h6]h7]r%U fuzz-testsr&ah:]r'hauh]r((h@)r)}r*(h#X Fuzz Testsr+h$j"h+h.h0hDh2}r,(h4]h5]h6]h7]h:]uh]r-hGX Fuzz Testsr.r/}r0(h#j+h$j)ubaubhK)r1}r2(h#XFuzz tests generally run for a fixed amount of time, running randomized tests against a system. They do not run at all during normal runs of the Buildbot tests, unless ``BUILDBOT_FUZZ`` is defined. This is accomplished with something like the following at the end of each test module::h$j"h+h.h0hNh2}r3(h4]h5]h6]h7]h:]uh]r4(hGXFuzz tests generally run for a fixed amount of time, running randomized tests against a system. They do not run at all during normal runs of the Buildbot tests, unless r5r6}r7(h#XFuzz tests generally run for a fixed amount of time, running randomized tests against a system. They do not run at all during normal runs of the Buildbot tests, unless h$j1ubhT)r8}r9(h#X``BUILDBOT_FUZZ``h2}r:(h4]h5]h6]h7]h:]uh$j1h>]r;hGX BUILDBOT_FUZZr<r=}r>(h#Uh$j8ubah0h\ubhGXc is defined. This is accomplished with something like the following at the end of each test module:r?r@}rA(h#Xc is defined. This is accomplished with something like the following at the end of each test module:h$j1ubeubj)rB}rC(h#X<if 'BUILDBOT_FUZZ' not in os.environ: del LRUCacheFuzzerh$j"h+h.h0jh2}rD(jjh7]h6]h4]h5]h:]uh]rEhGX<if 'BUILDBOT_FUZZ' not in os.environ: del LRUCacheFuzzerrFrG}rH(h#Uh$jBubaubeubeubh%)rI}rJ(h#Uh$h)h+h.h0h1h2}rK(h4]h5]h6]h7]rLUmixinsrMah:]rNhauh]rO(h@)rP}rQ(h#XMixinsrRh$jIh+h.h0hDh2}rS(h4]h5]h6]h7]h:]uh]rThGXMixinsrUrV}rW(h#jRh$jPubaubhK)rX}rY(h#XBuildbot provides a number of purpose-specific mixin classes in :bb:src:`master/buildbot/util`. These generally define a set of utility functions as well as ``setUpXxx`` and ``tearDownXxx`` methods. These methods should be called explicitly from your subclass's ``setUp`` and ``tearDown`` methods. Note that some of these methods return Deferreds, which should be handled properly by the caller.h$jIh+h.h0hNh2}rZ(h4]h5]h6]h7]h:]uh]r[(hGX@Buildbot provides a number of purpose-specific mixin classes in r\r]}r^(h#X@Buildbot provides a number of purpose-specific mixin classes in h$jXubcdocutils.nodes reference r_)r`}ra(h#Uh2}rb(UreftitlercXmaster/buildbot/utilrdUrefurireXEhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/utilh7]h6]h4]h5]h:]uh$jXh>]rfhT)rg}rh(h#jdh2}ri(h4]h5]h6]h7]h:]uh$j`h>]rjhGXmaster/buildbot/utilrkrl}rm(h#Uh$jgubah0h\ubah0U referencernubhGX@. These generally define a set of utility functions as well as rorp}rq(h#X@. These generally define a set of utility functions as well as h$jXubhT)rr}rs(h#X ``setUpXxx``h2}rt(h4]h5]h6]h7]h:]uh$jXh>]ruhGXsetUpXxxrvrw}rx(h#Uh$jrubah0h\ubhGX and ryrz}r{(h#X and h$jXubhT)r|}r}(h#X``tearDownXxx``h2}r~(h4]h5]h6]h7]h:]uh$jXh>]rhGX tearDownXxxrr}r(h#Uh$j|ubah0h\ubhGXJ methods. These methods should be called explicitly from your subclass's rr}r(h#XJ methods. These methods should be called explicitly from your subclass's h$jXubhT)r}r(h#X ``setUp``h2}r(h4]h5]h6]h7]h:]uh$jXh>]rhGXsetUprr}r(h#Uh$jubah0h\ubhGX and rr}r(h#X and h$jXubhT)r}r(h#X ``tearDown``h2}r(h4]h5]h6]h7]h:]uh$jXh>]rhGXtearDownrr}r(h#Uh$jubah0h\ubhGXl methods. Note that some of these methods return Deferreds, which should be handled properly by the caller.rr}r(h#Xl methods. Note that some of these methods return Deferreds, which should be handled properly by the caller.h$jXubeubcdocutils.nodes target r)r}r(h#X .. _Fakes:h$jIh+h.h0Utargetrh2}r(h7]h6]h4]h5]h:]UrefidrUfakesruh]ubeubh&h%)r}r(h#Uh$h)h+h.h0h1h2}r(h4]h5]h6]h7]rU good-testsrah:]rhauh]r(h@)r}r(h#X Good Testsrh$jh+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGX Good Testsrr}r(h#jh$jubaubhK)r}r(h#XBad tests are worse than no tests at all, since they waste developers' time wondering "was that a spurious failure?" or "what the heck is this test trying to do?" Buildbot needs good tests. So what makes a good test?rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXBad tests are worse than no tests at all, since they waste developers' time wondering "was that a spurious failure?" or "what the heck is this test trying to do?" Buildbot needs good tests. So what makes a good test?rr}r(h#jh$jubaubj)r}r(h#X.. _Tests-Independent-of-Time:h$jh+h.h0jh2}r(h7]h6]h4]h5]h:]jUtests-independent-of-timeruh]ubh%)r}r(h#Uh$jh+h.Uexpect_referenced_by_namer}rh jsh0h1h2}r(h4]h5]h6]h7]r(Uindependent-of-timerjeh:]r(h h euh]r(h@)r}r(h#XIndependent of Timerh$jh+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGXIndependent of Timerr}r(h#jh$jubaubhK)r}r(h#XTests that depend on wall time will fail. As a bonus, they run very slowly. Do not use :meth:`reactor.callLater` to wait "long enough" for something to happen.h$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXWTests that depend on wall time will fail. As a bonus, they run very slowly. Do not use rr}r(h#XWTests that depend on wall time will fail. As a bonus, they run very slowly. Do not use h$jubj9)r}r(h#X:meth:`reactor.callLater`rh$jh+h.h0j=h2}r(UreftypeXmethj?j@Xreactor.callLaterU refdomainXpyrh7]h6]U refexplicith4]h5]h:]jBjCjDNjENuh]rhT)r}r(h#jh2}r(h4]h5]r(jKjXpy-methreh6]h7]h:]uh$jh>]rhGXreactor.callLaterrr}r(h#Uh$jubah0h\ubaubhGX/ to wait "long enough" for something to happen.rr}r(h#X/ to wait "long enough" for something to happen.h$jubeubhK)r}r(h#XSFor testing things that themselves depend on time, consider using :class:`twisted.internet.tasks.Clock`. This may mean passing a clock instance to the code under test, and propagating that instance as necessary to ensure that all of the code using :meth:`callLater` uses it. Refactoring code for testability is difficult, but worthwhile.h$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXBFor testing things that themselves depend on time, consider using rr}r(h#XBFor testing things that themselves depend on time, consider using h$jubj9)r}r(h#X%:class:`twisted.internet.tasks.Clock`rh$jh+h.h0j=h2}r(UreftypeXclassj?j@Xtwisted.internet.tasks.ClockU refdomainXpyrh7]h6]U refexplicith4]h5]h:]jBjCjDNjENuh]rhT)r}r(h#jh2}r(h4]h5]r(jKjXpy-classreh6]h7]h:]uh$jh>]rhGXtwisted.internet.tasks.Clockrr}r(h#Uh$jubah0h\ubaubhGX. This may mean passing a clock instance to the code under test, and propagating that instance as necessary to ensure that all of the code using rr}r(h#X. This may mean passing a clock instance to the code under test, and propagating that instance as necessary to ensure that all of the code using h$jubj9)r}r(h#X:meth:`callLater`rh$jh+h.h0j=h2}r(UreftypeXmethj?j@X callLaterU refdomainXpyrh7]h6]U refexplicith4]h5]h:]jBjCjDNjENuh]rhT)r}r(h#jh2}r (h4]h5]r (jKjXpy-methr eh6]h7]h:]uh$jh>]r hGX callLaterr r}r(h#Uh$jubah0h\ubaubhGXI uses it. Refactoring code for testability is difficult, but worthwhile.rr}r(h#XI uses it. Refactoring code for testability is difficult, but worthwhile.h$jubeubhK)r}r(h#XFor testing things that do not depend on time, but for which you cannot detect the "end" of an operation: add a way to detect the end of the operation!rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXFor testing things that do not depend on time, but for which you cannot detect the "end" of an operation: add a way to detect the end of the operation!rr}r(h#jh$jubaubeubh%)r}r(h#Uh$jh+h.h0h1h2}r(h4]h5]h6]h7]rU clean-coderah:]r hauh]r!(h@)r"}r#(h#X Clean Coder$h$jh+h.h0hDh2}r%(h4]h5]h6]h7]h:]uh]r&hGX Clean Coder'r(}r)(h#j$h$j"ubaubhK)r*}r+(h#X6Make your tests readable. This is no place to skimp on comments! Others will attempt to learn about the expected behavior of your class by reading the tests. As a side note, if you use a :class:`Deferred` chain in your test, write the callbacks as nested functions, rather than using methods with funny names::h$jh+h.h0hNh2}r,(h4]h5]h6]h7]h:]uh]r-(hGXMake your tests readable. This is no place to skimp on comments! Others will attempt to learn about the expected behavior of your class by reading the tests. As a side note, if you use a r.r/}r0(h#XMake your tests readable. This is no place to skimp on comments! Others will attempt to learn about the expected behavior of your class by reading the tests. As a side note, if you use a h$j*ubj9)r1}r2(h#X:class:`Deferred`r3h$j*h+h.h0j=h2}r4(UreftypeXclassj?j@XDeferredU refdomainXpyr5h7]h6]U refexplicith4]h5]h:]jBjCjDNjENuh]r6hT)r7}r8(h#j3h2}r9(h4]h5]r:(jKj5Xpy-classr;eh6]h7]h:]uh$j1h>]r<hGXDeferredr=r>}r?(h#Uh$j7ubah0h\ubaubhGXi chain in your test, write the callbacks as nested functions, rather than using methods with funny names:r@rA}rB(h#Xi chain in your test, write the callbacks as nested functions, rather than using methods with funny names:h$j*ubeubj)rC}rD(h#Xdef testSomething(self): d = doThisFirst() def andThisNext(res): pass # ... d.addCallback(andThisNext) return dh$jh+h.h0jh2}rE(jjh7]h6]h4]h5]h:]uh]rFhGXdef testSomething(self): d = doThisFirst() def andThisNext(res): pass # ... d.addCallback(andThisNext) return drGrH}rI(h#Uh$jCubaubhK)rJ}rK(h#XThis isolates the entire test into one indented block. It is OK to add methods for common functionality, but give them real names and explain in detail what they do.rLh$jh+h.h0hNh2}rM(h4]h5]h6]h7]h:]uh]rNhGXThis isolates the entire test into one indented block. It is OK to add methods for common functionality, but give them real names and explain in detail what they do.rOrP}rQ(h#jLh$jJubaubeubh%)rR}rS(h#Uh$jh+h.h0h1h2}rT(h4]h5]h6]h7]rUU good-namerVah:]rWhauh]rX(h@)rY}rZ(h#X Good Namer[h$jRh+h.h0hDh2}r\(h4]h5]h6]h7]h:]uh]r]hGX Good Namer^r_}r`(h#j[h$jYubaubhK)ra}rb(h#XTest method names should follow the pattern :samp:`test_{METHOD}_{CONDITION}` where *METHOD* is the method being tested, and *CONDITION* is the condition under which it's tested. Since we can't always test a single method, this is not a hard-and-fast rule.h$jRh+h.h0hNh2}rc(h4]h5]h6]h7]h:]uh]rd(hGX,Test method names should follow the pattern rerf}rg(h#X,Test method names should follow the pattern h$jaubhT)rh}ri(h#Uh2}rj(h7]h6]h4]h5]rkXsamprlaUrolejlh:]uh$jah>]rm(hGXtest_rnro}rp(h#Xtest_h$jhubj~)rq}rr(h#XMETHODh2}rs(h4]h5]h6]h7]h:]uh$jhh>]rthGXMETHODrurv}rw(h#Uh$jqubah0jubhGX_rx}ry(h#X_h$jhubj~)rz}r{(h#X CONDITIONh2}r|(h4]h5]h6]h7]h:]uh$jhh>]r}hGX CONDITIONr~r}r(h#Uh$jzubah0jubeh0h\ubhGX where rr}r(h#X where h$jaubj~)r}r(h#X*METHOD*h2}r(h4]h5]h6]h7]h:]uh$jah>]rhGXMETHODrr}r(h#Uh$jubah0jubhGX! is the method being tested, and rr}r(h#X! is the method being tested, and h$jaubj~)r}r(h#X *CONDITION*h2}r(h4]h5]h6]h7]h:]uh$jah>]rhGX CONDITIONrr}r(h#Uh$jubah0jubhGXx is the condition under which it's tested. Since we can't always test a single method, this is not a hard-and-fast rule.rr}r(h#Xx is the condition under which it's tested. Since we can't always test a single method, this is not a hard-and-fast rule.h$jaubeubeubh%)r}r(h#Uh$jh+h.h0h1h2}r(h4]h5]h6]h7]rUassert-only-one-thingrah:]rhauh]r(h@)r}r(h#XAssert Only One Thingrh$jh+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGXAssert Only One Thingrr}r(h#jh$jubaubhK)r}r(h#XXWhere practical, each test should have a single assertion. This may require a little bit of work to get several related pieces of information into a single Python object for comparison. The problem with multiple assertions is that, if the first assertion fails, the remainder are not tested. The test results then do not tell the entire story.rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXXWhere practical, each test should have a single assertion. This may require a little bit of work to get several related pieces of information into a single Python object for comparison. The problem with multiple assertions is that, if the first assertion fails, the remainder are not tested. The test results then do not tell the entire story.rr}r(h#jh$jubaubeubh%)r}r(h#Uh$jh+h.h0h1h2}r(h4]h5]h6]h7]rUprefer-fakes-to-mocksrah:]rh auh]r(h@)r}r(h#XPrefer Fakes to Mocksrh$jh+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGXPrefer Fakes to Mocksrr}r(h#jh$jubaubhK)r}r(h#XMock objects are too "compliant", and this often masks errors in the system under test. For example, a mis-spelled method name on a mock object will not raise an exception.rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXMock objects are too "compliant", and this often masks errors in the system under test. For example, a mis-spelled method name on a mock object will not raise an exception.rr}r(h#jh$jubaubhK)r}r(h#XWhere possible, use one of the pre-written fake objects (see :ref:`Fakes`) instead of a mock object. Fakes themselves should be well-tested using interface tests.h$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGX=Where possible, use one of the pre-written fake objects (see rr}r(h#X=Where possible, use one of the pre-written fake objects (see h$jubj9)r}r(h#X :ref:`Fakes`rh$jh+h.h0j=h2}r(UreftypeXrefj?j@XfakesU refdomainXstdrh7]h6]U refexplicith4]h5]h:]jBjCuh]rj~)r}r(h#jh2}r(h4]h5]r(jKjXstd-refreh6]h7]h:]uh$jh>]rhGXFakesrr}r(h#Uh$jubah0jubaubhGXZ) instead of a mock object. Fakes themselves should be well-tested using interface tests.rr}r(h#XZ) instead of a mock object. Fakes themselves should be well-tested using interface tests.h$jubeubhK)r}r(h#XWhere they are appropriate, Mock objects can be constructed easily using the aptly-named `mock `_ module, which is a requirement for Buildbot's tests.h$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXYWhere they are appropriate, Mock objects can be constructed easily using the aptly-named rr}r(h#XYWhere they are appropriate, Mock objects can be constructed easily using the aptly-named h$jubj_)r}r(h#X2`mock `_h2}r(UnamehjeX(http://www.voidspace.org.uk/python/mock/rh7]h6]h4]h5]h:]uh$jh>]rhGXmockrr}r(h#Uh$jubah0jnubj)r}r(h#X+ h(Kh$jh0jh2}r(Urefurijh7]rUmockrah6]h4]h5]h:]rhauh>]ubhGX5 module, which is a requirement for Buildbot's tests.rr}r(h#X5 module, which is a requirement for Buildbot's tests.h$jubeubeubh%)r}r(h#Uh$jh+h.h0h1h2}r(h4]h5]h6]h7]rU small-testsrah:]rh auh]r(h@)r}r(h#X Small Testsrh$jh+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGX Small Testsrr}r(h#jh$jubaubhK)r}r(h#XSThe shorter each test is, the better. Test as little code as possible in each test.rh$jh+h.h0hNh2}r (h4]h5]h6]h7]h:]uh]r hGXSThe shorter each test is, the better. Test as little code as possible in each test.r r }r (h#jh$jubaubhK)r}r(h#XIt is fine, and in fact encouraged, to write the code under test in such a way as to facilitate this. As an illustrative example, if you are testing a new Step subclass, but your tests require instantiating a BuildMaster, you're probably doing something wrong!rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXIt is fine, and in fact encouraged, to write the code under test in such a way as to facilitate this. As an illustrative example, if you are testing a new Step subclass, but your tests require instantiating a BuildMaster, you're probably doing something wrong!rr}r(h#jh$jubaubhK)r}r(h#XwThis also applies to test modules. Several short, easily-digested test modules are preferred over a 1000-line monster.rh$jh+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXwThis also applies to test modules. Several short, easily-digested test modules are preferred over a 1000-line monster.rr}r(h#jh$jubaubeubh%)r}r(h#Uh$jh+h.h0h1h2}r (h4]h5]h6]h7]r!U isolationr"ah:]r#hauh]r$(h@)r%}r&(h#X Isolationr'h$jh+h.h0hDh2}r((h4]h5]h6]h7]h:]uh]r)hGX Isolationr*r+}r,(h#j'h$j%ubaubhK)r-}r.(h#XEach test should be maximally independent of other tests. Do not leave files laying around after your test has finished, and do not assume that some other test has run beforehand. It's fine to use caching techniques to avoid repeated, lengthy setup times.r/h$jh+h.h0hNh2}r0(h4]h5]h6]h7]h:]uh]r1hGXEach test should be maximally independent of other tests. Do not leave files laying around after your test has finished, and do not assume that some other test has run beforehand. It's fine to use caching techniques to avoid repeated, lengthy setup times.r2r3}r4(h#j/h$j-ubaubeubh%)r5}r6(h#Uh$jh+h.h0h1h2}r7(h4]h5]h6]h7]r8U be-correctr9ah:]r:hauh]r;(h@)r<}r=(h#X Be Correctr>h$j5h+h.h0hDh2}r?(h4]h5]h6]h7]h:]uh]r@hGX Be CorrectrArB}rC(h#j>h$j<ubaubhK)rD}rE(h#X'Tests should be as robust as possible, which at a basic level means using the available frameworks correctly. All Deferreds should have callbacks and be chained properly. Error conditions should be checked properly. Race conditions should not exist (see :ref:`Tests-Independent-of-Time`, above).h$j5h+h.h0hNh2}rF(h4]h5]h6]h7]h:]uh]rG(hGXTests should be as robust as possible, which at a basic level means using the available frameworks correctly. All Deferreds should have callbacks and be chained properly. Error conditions should be checked properly. Race conditions should not exist (see rHrI}rJ(h#XTests should be as robust as possible, which at a basic level means using the available frameworks correctly. All Deferreds should have callbacks and be chained properly. Error conditions should be checked properly. Race conditions should not exist (see h$jDubj9)rK}rL(h#X :ref:`Tests-Independent-of-Time`rMh$jDh+h.h0j=h2}rN(UreftypeXrefj?j@Xtests-independent-of-timeU refdomainXstdrOh7]h6]U refexplicith4]h5]h:]jBjCuh]rPj~)rQ}rR(h#jMh2}rS(h4]h5]rT(jKjOXstd-refrUeh6]h7]h:]uh$jKh>]rVhGXTests-Independent-of-TimerWrX}rY(h#Uh$jQubah0jubaubhGX , above).rZr[}r\(h#X , above).h$jDubeubeubh%)r]}r^(h#Uh$jh+h.h0h1h2}r_(h4]h5]h6]h7]r`U be-helpfulraah:]rbhauh]rc(h@)rd}re(h#X Be Helpfulrfh$j]h+h.h0hDh2}rg(h4]h5]h6]h7]h:]uh]rhhGX Be Helpfulrirj}rk(h#jfh$jdubaubhK)rl}rm(h#XgNote that tests will pass most of the time, but the moment when they are most useful is when they fail.rnh$j]h+h.h0hNh2}ro(h4]h5]h6]h7]h:]uh]rphGXgNote that tests will pass most of the time, but the moment when they are most useful is when they fail.rqrr}rs(h#jnh$jlubaubhK)rt}ru(h#XWhen the test fails, it should produce output that is helpful to the person chasing it down. This is particularly important when the tests are run remotely, in which case the person chasing down the bug does not have access to the system on which the test fails. A test which fails sporadically with no more information than "AssertionFailed" is a prime candidate for deletion if the error isn't obvious. Making the error obvious also includes adding comments describing the ways a test might fail.rvh$j]h+h.h0hNh2}rw(h4]h5]h6]h7]h:]uh]rxhGXWhen the test fails, it should produce output that is helpful to the person chasing it down. This is particularly important when the tests are run remotely, in which case the person chasing down the bug does not have access to the system on which the test fails. A test which fails sporadically with no more information than "AssertionFailed" is a prime candidate for deletion if the error isn't obvious. Making the error obvious also includes adding comments describing the ways a test might fail.ryrz}r{(h#jvh$jtubaubeubh%)r|}r}(h#Uh$jh+h.h0h1h2}r~(h4]h5]h6]h7]rU keeping-staterah:]rhauh]r(h@)r}r(h#X Keeping Staterh$j|h+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGX Keeping Staterr}r(h#jh$jubaubhK)r}r(h#XPython does not allow assignment to anything but the innermost local scope or the global scope with the ``global`` keyword. This presents a problem when creating nested functions::h$j|h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXhPython does not allow assignment to anything but the innermost local scope or the global scope with the rr}r(h#XhPython does not allow assignment to anything but the innermost local scope or the global scope with the h$jubhT)r}r(h#X ``global``h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXglobalrr}r(h#Uh$jubah0h\ubhGXB keyword. This presents a problem when creating nested functions:rr}r(h#XB keyword. This presents a problem when creating nested functions:h$jubeubj)r}r(h#Xdef test_localVariable(self): cb_called = False def cb(): cb_called = True cb() self.assertTrue(cb_called) # will fail!h$j|h+h.h0jh2}r(jjh7]h6]h4]h5]h:]uh]rhGXdef test_localVariable(self): cb_called = False def cb(): cb_called = True cb() self.assertTrue(cb_called) # will fail!rr}r(h#Uh$jubaubhK)r}r(h#XThe ``cb_called = True`` assigns to a *different variable* than ``cb_called = False``. In production code, it's usually best to work around such problems, but in tests this is often the clearest way to express the behavior under test.h$j|h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXThe rr}r(h#XThe h$jubhT)r}r(h#X``cb_called = True``h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXcb_called = Truerr}r(h#Uh$jubah0h\ubhGX assigns to a rr}r(h#X assigns to a h$jubj~)r}r(h#X*different variable*h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXdifferent variablerr}r(h#Uh$jubah0jubhGX than rr}r(h#X than h$jubhT)r}r(h#X``cb_called = False``h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXcb_called = Falserr}r(h#Uh$jubah0h\ubhGX. In production code, it's usually best to work around such problems, but in tests this is often the clearest way to express the behavior under test.rr}r(h#X. In production code, it's usually best to work around such problems, but in tests this is often the clearest way to express the behavior under test.h$jubeubhK)r}r(h#XThe solution is to change something in a common mutable object. While a simple list can serve as such a mutable object, this leads to code that is hard to read. Instead, use :class:`State`::h$j|h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXThe solution is to change something in a common mutable object. While a simple list can serve as such a mutable object, this leads to code that is hard to read. Instead, use rr}r(h#XThe solution is to change something in a common mutable object. While a simple list can serve as such a mutable object, this leads to code that is hard to read. Instead, use h$jubj9)r}r(h#X:class:`State`rh$jh+h.h0j=h2}r(UreftypeXclassj?j@XStateU refdomainXpyrh7]h6]U refexplicith4]h5]h:]jBjCjDNjENuh]rhT)r}r(h#jh2}r(h4]h5]r(jKjXpy-classreh6]h7]h:]uh$jh>]rhGXStaterr}r(h#Uh$jubah0h\ubaubhGX:r}r(h#X:h$jubeubj)r}r(h#Xfrom buildbot.test.state import State def test_localVariable(self): state = State(cb_called=False) def cb(): state.cb_called = True cb() self.assertTrue(state.cb_called) # passesh$j|h+h.h0jh2}r(jjh7]h6]h4]h5]h:]uh]rhGXfrom buildbot.test.state import State def test_localVariable(self): state = State(cb_called=False) def cb(): state.cb_called = True cb() self.assertTrue(state.cb_called) # passesrr}r(h#Uh$jubaubhK)r}r(h#XGThis is almost as readable as the first example, but it actually works.rh$j|h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXGThis is almost as readable as the first example, but it actually works.rr}r(h#jh$jubaubeubeubeubh+h.j}rh jsh0h1h2}r(h4]rXfakesrah5]h6]h7]r(jUid1reh:]rh auh]r(h@)r}r(h#XFakesrh$h&h+h.h0hDh2}r(h4]h5]h6]h7]h:]uh]rhGXFakesrr}r(h#jh$jubaubhK)r}r(h#XBuildbot provides a number of pre-defined fake implementations of internal interfaces, in :bb:src:`master/buildbot/fake`. These are designed to be used in unit tests to limit the scope of the test. For example, the fake DB API eliminates the need to create a real database when testing code that uses the DB API, and isolates bugs in the system under test from bugs in the real DB implementation.h$h&h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]r(hGXZBuildbot provides a number of pre-defined fake implementations of internal interfaces, in rr}r(h#XZBuildbot provides a number of pre-defined fake implementations of internal interfaces, in h$jubj_)r}r(h#Uh2}r (jcXmaster/buildbot/faker jeXEhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/fakeh7]h6]h4]h5]h:]uh$jh>]r hT)r }r (h#j h2}r(h4]h5]h6]h7]h:]uh$jh>]rhGXmaster/buildbot/fakerr}r(h#Uh$j ubah0h\ubah0jnubhGX. These are designed to be used in unit tests to limit the scope of the test. For example, the fake DB API eliminates the need to create a real database when testing code that uses the DB API, and isolates bugs in the system under test from bugs in the real DB implementation.rr}r(h#X. These are designed to be used in unit tests to limit the scope of the test. For example, the fake DB API eliminates the need to create a real database when testing code that uses the DB API, and isolates bugs in the system under test from bugs in the real DB implementation.h$jubeubhK)r}r(h#XDThe danger of using fakes is that the fake interface and the real interface can differ. The interface tests exist to solve this problem. All fakes should be fully tested in an integration test, so that the fakes pass the same tests as the "real" thing. It is particularly important that the method signatures be compared.rh$h&h+h.h0hNh2}r(h4]h5]h6]h7]h:]uh]rhGXDThe danger of using fakes is that the fake interface and the real interface can differ. The interface tests exist to solve this problem. All fakes should be fully tested in an integration test, so that the fakes pass the same tests as the "real" thing. It is particularly important that the method signatures be compared.rr}r(h#jh$jubaubeubh+h.h0Usystem_messagerh2}r(h4]UlevelKh7]h6]r jaUsourceh.h5]h:]UlineKUtypeUINFOr!uh]r"hK)r#}r$(h#Uh2}r%(h4]h5]h6]h7]h:]uh$h!h>]r&hGX(Duplicate implicit target name: "fakes".r'r(}r)(h#Uh$j#ubah0hNubaubaUcurrent_sourcer*NU decorationr+NUautofootnote_startr,KUnameidsr-}r.(hjhhhj9h jh jh jh jh jhj&hjhjhhnhjhjhjMhjhjahjVhh9hj"hjhjduh>]r/h)ah#UU transformerr0NU footnote_refsr1}r2Urefnamesr3}r4Usymbol_footnotesr5]r6Uautofootnote_refsr7]r8Usymbol_footnote_refsr9]r:U citationsr;]r<h=hU current_liner=NUtransform_messagesr>]r?(h )r@}rA(h#Uh2}rB(h4]UlevelKh7]h6]Usourceh.h5]h:]UlineKUtypej!uh>]rChK)rD}rE(h#Uh2}rF(h4]h5]h6]h7]h:]uh$j@h>]rGhGX+Hyperlink target "fakes" is not referenced.rHrI}rJ(h#Uh$jDubah0hNubah0jubh )rK}rL(h#Uh2}rM(h4]UlevelKh7]h6]Usourceh.h5]h:]UlineKUtypej!uh>]rNhK)rO}rP(h#Uh2}rQ(h4]h5]h6]h7]h:]uh$jKh>]rRhGX?Hyperlink target "tests-independent-of-time" is not referenced.rSrT}rU(h#Uh$jOubah0hNubah0jubeUreporterrVNUid_startrWKU autofootnotesrX]rYU citation_refsrZ}r[Uindirect_targetsr\]r]Usettingsr^(cdocutils.frontend Values r_or`}ra(Ufootnote_backlinksrbKUrecord_dependenciesrcNU rfc_base_urlrdUhttp://tools.ietf.org/html/reU tracebackrfUpep_referencesrgNUstrip_commentsrhNU toc_backlinksriUentryrjU language_coderkUenrlU datestamprmNU report_levelrnKU _destinationroNU halt_levelrpKU strip_classesrqNhDNUerror_encoding_error_handlerrrUbackslashreplacersUdebugrtNUembed_stylesheetruUoutput_encoding_error_handlerrvUstrictrwU sectnum_xformrxKUdump_transformsryNU docinfo_xformrzKUwarning_streamr{NUpep_file_url_templater|Upep-%04dr}Uexit_status_levelr~KUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/tests.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjwUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]rUfile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jjjjjjjjjh&hhjjj9j5h9h)jjhnhjjjjjjMjIjj|jdj`jjjh&j"jjVjRj&j"jaj]jjuUsubstitution_namesr}rh0h=h2}r(h4]h7]h6]Usourceh.h5]h:]uU footnotesr]rUrefidsr}r(j]rjaj]rjauub.PK4DoRNN5buildbot-v0.8.9/.doctrees/developer/encodings.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xstring encodingsqNXoutputsqNXinputsqNuUsubstitution_defsq }q Uparse_messagesq ]q Ucurrent_sourceq NU decorationqNUautofootnote_startqKUnameidsq}q(hUstring-encodingsqhUoutputsqhUinputsquUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/encodings.rstqq}q bUtagnameq!Usectionq"U attributesq#}q$(Udupnamesq%]Uclassesq&]Ubackrefsq']Uidsq(]q)haUnamesq*]q+hauUlineq,KUdocumentq-hh]q.(cdocutils.nodes title q/)q0}q1(hXString Encodingsq2hhhhh!Utitleq3h#}q4(h%]h&]h']h(]h*]uh,Kh-hh]q5cdocutils.nodes Text q6XString Encodingsq7q8}q9(hh2hh0ubaubcdocutils.nodes paragraph q:)q;}q<(hX[Buildbot expects all strings used internally to be valid Unicode strings - not bytestrings.q=hhhhh!U paragraphq>h#}q?(h%]h&]h']h(]h*]uh,Kh-hh]q@h6X[Buildbot expects all strings used internally to be valid Unicode strings - not bytestrings.qAqB}qC(hh=hh;ubaubh:)qD}qE(hXtNote that Buildbot rarely feeds strings back into external tools in such a way that those strings must match. For example, Buildbot does not attempt to access the filenames specified in a Change. So it is more important to store strings in a manner that will be most useful to a human reader (e.g., in logfiles, web status, etc.) than to store them in a lossless format.qFhhhhh!h>h#}qG(h%]h&]h']h(]h*]uh,Kh-hh]qHh6XtNote that Buildbot rarely feeds strings back into external tools in such a way that those strings must match. For example, Buildbot does not attempt to access the filenames specified in a Change. So it is more important to store strings in a manner that will be most useful to a human reader (e.g., in logfiles, web status, etc.) than to store them in a lossless format.qIqJ}qK(hhFhhDubaubh)qL}qM(hUhhhhh!h"h#}qN(h%]h&]h']h(]qOhah*]qPhauh,Kh-hh]qQ(h/)qR}qS(hXInputsqThhLhhh!h3h#}qU(h%]h&]h']h(]h*]uh,Kh-hh]qVh6XInputsqWqX}qY(hhThhRubaubh:)qZ}q[(hXOn input, strings should be decoded, if their encoding is known. Where necessary, the assumed input encoding should be configurable. In some cases, such as filenames, this encoding is not known or not well-defined (e.g., a utf-8 encoded filename in a latin-1 directory). In these cases, the input mechanisms should make a best effort at decoding, and use e.g., the ``errors='replace'`` option to fail gracefully on un-decodable characters.hhLhhh!h>h#}q\(h%]h&]h']h(]h*]uh,Kh-hh]q](h6XpOn input, strings should be decoded, if their encoding is known. Where necessary, the assumed input encoding should be configurable. In some cases, such as filenames, this encoding is not known or not well-defined (e.g., a utf-8 encoded filename in a latin-1 directory). In these cases, the input mechanisms should make a best effort at decoding, and use e.g., the q^q_}q`(hXpOn input, strings should be decoded, if their encoding is known. Where necessary, the assumed input encoding should be configurable. In some cases, such as filenames, this encoding is not known or not well-defined (e.g., a utf-8 encoded filename in a latin-1 directory). In these cases, the input mechanisms should make a best effort at decoding, and use e.g., the hhZubcdocutils.nodes literal qa)qb}qc(hX``errors='replace'``h#}qd(h%]h&]h']h(]h*]uhhZh]qeh6Xerrors='replace'qfqg}qh(hUhhbubah!Uliteralqiubh6X6 option to fail gracefully on un-decodable characters.qjqk}ql(hX6 option to fail gracefully on un-decodable characters.hhZubeubeubh)qm}qn(hUhhhhh!h"h#}qo(h%]h&]h']h(]qphah*]qqhauh,Kh-hh]qr(h/)qs}qt(hXOutputsquhhmhhh!h3h#}qv(h%]h&]h']h(]h*]uh,Kh-hh]qwh6XOutputsqxqy}qz(hhuhhsubaubh:)q{}q|(hXEAt most points where Buildbot outputs a string, the target encoding is known. For example, the web status can encode to utf-8. In cases where it is not known, it should be configurable, with a safe fallback (e.g., ascii with ``errors='replace'``. For HTML/XML outputs, consider using ``errors='xmlcharrefreplace'`` instead.hhmhhh!h>h#}q}(h%]h&]h']h(]h*]uh,Kh-hh]q~(h6XAt most points where Buildbot outputs a string, the target encoding is known. For example, the web status can encode to utf-8. In cases where it is not known, it should be configurable, with a safe fallback (e.g., ascii with qq}q(hXAt most points where Buildbot outputs a string, the target encoding is known. For example, the web status can encode to utf-8. In cases where it is not known, it should be configurable, with a safe fallback (e.g., ascii with hh{ubha)q}q(hX``errors='replace'``h#}q(h%]h&]h']h(]h*]uhh{h]qh6Xerrors='replace'qq}q(hUhhubah!hiubh6X(. For HTML/XML outputs, consider using qq}q(hX(. For HTML/XML outputs, consider using hh{ubha)q}q(hX``errors='xmlcharrefreplace'``h#}q(h%]h&]h']h(]h*]uhh{h]qh6Xerrors='xmlcharrefreplace'qq}q(hUhhubah!hiubh6X instead.qq}q(hX instead.hh{ubeubeubeubahUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh-hU current_lineqNUtransform_messagesq]qUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh3NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqʼnUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqшUtrim_footnote_reference_spaceq҉UenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformq։U source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/encodings.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}q(hhLhhhhmuUsubstitution_namesq}qh!h-h#}q(h%]h(]h']Usourcehh&]h*]uU footnotesq]qUrefidsq}qub.PK4D #cbb;buildbot-v0.8.9/.doctrees/developer/master-overview.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xmaster organizationqNXmaster-service-hierarchyqXbuildmaster service hierarchyqNuUsubstitution_defsq }q Uparse_messagesq ]q Ucurrent_sourceq NU decorationqNUautofootnote_startqKUnameidsq}q(hUmaster-organizationqhUmaster-service-hierarchyqhUbuildmaster-service-hierarchyquUchildrenq]q(cdocutils.nodes target q)q}q(U rawsourceqX.. _master-service-hierarchy:UparentqhUsourceqcdocutils.nodes reprunicode qXZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/master-overview.rstqq}q bUtagnameq!Utargetq"U attributesq#}q$(Uidsq%]Ubackrefsq&]Udupnamesq']Uclassesq(]Unamesq)]Urefidq*huUlineq+KUdocumentq,hh]ubcdocutils.nodes section q-)q.}q/(hUhhhhUexpect_referenced_by_nameq0}q1hhsh!Usectionq2h#}q3(h']h(]h&]h%]q4(hheh)]q5(hheuh+Kh,hUexpect_referenced_by_idq6}q7hhsh]q8(cdocutils.nodes title q9)q:}q;(hXMaster Organizationq(h']h(]h&]h%]h)]uh+Kh,hh]q?cdocutils.nodes Text q@XMaster OrganizationqAqB}qC(hh(hUhj6ubah!hubaubh@X instance that handles incoming PB connections, potentially on multiple ports, and dispatching those connections to appropriate components based on the supplied username.r?r@}rA(hX instance that handles incoming PB connections, potentially on multiple ports, and dispatching those connections to appropriate components based on the supplied username.hj)ubeubah!hubeubh)rB}rC(hX``master.change_svc`` A :py:class:`buildbot.changes.manager.ChangeManager` instance that manages the active change sources, as well as the stream of changes received from those sources. All active change sources are child services of this instance. hhhhh!hh#}rD(h']h(]h&]h%]h)]uh+K&h,hh]rE(h)rF}rG(hX``master.change_svc``rHhjBhhh!hh#}rI(h']h(]h&]h%]h)]uh+K&h]rJh)rK}rL(hjHh#}rM(h']h(]h&]h%]h)]uhjFh]rNh@Xmaster.change_svcrOrP}rQ(hUhjKubah!hubaubh)rR}rS(hUh#}rT(h']h(]h&]h%]h)]uhjBh]rUhD)rV}rW(hXA :py:class:`buildbot.changes.manager.ChangeManager` instance that manages the active change sources, as well as the stream of changes received from those sources. All active change sources are child services of this instance.hjRhhh!hGh#}rX(h']h(]h&]h%]h)]uh+K$h]rY(h@XA rZr[}r\(hXA hjVubhM)r]}r^(hX2:py:class:`buildbot.changes.manager.ChangeManager`r_hjVhhh!hQh#}r`(UreftypeXclasshShTX&buildbot.changes.manager.ChangeManagerU refdomainXpyrah%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K$h]rbh)rc}rd(hj_h#}re(h']h(]rf(h^jaXpy-classrgeh&]h%]h)]uhj]h]rhh@X&buildbot.changes.manager.ChangeManagerrirj}rk(hUhjcubah!hubaubh@X instance that manages the active change sources, as well as the stream of changes received from those sources. All active change sources are child services of this instance.rlrm}rn(hX instance that manages the active change sources, as well as the stream of changes received from those sources. All active change sources are child services of this instance.hjVubeubah!hubeubh)ro}rp(hX``master.botmaster`` A :py:class:`buildbot.process.botmaster.BotMaster` instance that manages all of the slaves and builders as child services. The botmaster acts as the parent service for a :py:class:`buildbot.process.botmaster.BuildRequestDistributor` instance (at ``master.botmaster.brd``) as well as all active slaves (:py:class:`buildbot.buildslave.AbstractBuildSlave` instances) and builders (:py:class:`buildbot.process.builder.Builder` instances). hhhhh!hh#}rq(h']h(]h&]h%]h)]uh+K0h,hh]rr(h)rs}rt(hX``master.botmaster``ruhjohhh!hh#}rv(h']h(]h&]h%]h)]uh+K0h]rwh)rx}ry(hjuh#}rz(h']h(]h&]h%]h)]uhjsh]r{h@Xmaster.botmasterr|r}}r~(hUhjxubah!hubaubh)r}r(hUh#}r(h']h(]h&]h%]h)]uhjoh]r(hD)r}r(hXzA :py:class:`buildbot.process.botmaster.BotMaster` instance that manages all of the slaves and builders as child services.hjhhh!hGh#}r(h']h(]h&]h%]h)]uh+K)h]r(h@XA rr}r(hXA hjubhM)r}r(hX0:py:class:`buildbot.process.botmaster.BotMaster`rhjhhh!hQh#}r(UreftypeXclasshShTX$buildbot.process.botmaster.BotMasterU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K)h]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]rh@X$buildbot.process.botmaster.BotMasterrr}r(hUhjubah!hubaubh@XH instance that manages all of the slaves and builders as child services.rr}r(hXH instance that manages all of the slaves and builders as child services.hjubeubhD)r}r(hX7The botmaster acts as the parent service for a :py:class:`buildbot.process.botmaster.BuildRequestDistributor` instance (at ``master.botmaster.brd``) as well as all active slaves (:py:class:`buildbot.buildslave.AbstractBuildSlave` instances) and builders (:py:class:`buildbot.process.builder.Builder` instances).hjhhh!hGh#}r(h']h(]h&]h%]h)]uh+K,h]r(h@X/The botmaster acts as the parent service for a rr}r(hX/The botmaster acts as the parent service for a hjubhM)r}r(hX>:py:class:`buildbot.process.botmaster.BuildRequestDistributor`rhjhhh!hQh#}r(UreftypeXclasshShTX2buildbot.process.botmaster.BuildRequestDistributorU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K,h]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]rh@X2buildbot.process.botmaster.BuildRequestDistributorrr}r(hUhjubah!hubaubh@X instance (at rr}r(hX instance (at hjubh)r}r(hX``master.botmaster.brd``h#}r(h']h(]h&]h%]h)]uhjh]rh@Xmaster.botmaster.brdrr}r(hUhjubah!hubh@X ) as well as all active slaves (rr}r(hX ) as well as all active slaves (hjubhM)r}r(hX2:py:class:`buildbot.buildslave.AbstractBuildSlave`rhjhhh!hQh#}r(UreftypeXclasshShTX&buildbot.buildslave.AbstractBuildSlaveU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K,h]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]rh@X&buildbot.buildslave.AbstractBuildSlaverr}r(hUhjubah!hubaubh@X instances) and builders (rr}r(hX instances) and builders (hjubhM)r}r(hX,:py:class:`buildbot.process.builder.Builder`rhjhhh!hQh#}r(UreftypeXclasshShTX buildbot.process.builder.BuilderU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K,h]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]rh@X buildbot.process.builder.Builderrr}r(hUhjubah!hubaubh@X instances).rr}r(hX instances).hjubeubeh!hubeubh)r}r(hX``master.scheduler_manager`` A :py:class:`buildbot.schedulers.manager.SchedulerManager` instance that manages the active schedulers. All active schedulers are child services of this instance. hhhhh!hh#}r(h']h(]h&]h%]h)]uh+K5h,hh]r(h)r}r(hX``master.scheduler_manager``rhjhhh!hh#}r(h']h(]h&]h%]h)]uh+K5h]rh)r}r(hjh#}r(h']h(]h&]h%]h)]uhjh]rh@Xmaster.scheduler_managerrr}r(hUhjubah!hubaubh)r}r(hUh#}r(h']h(]h&]h%]h)]uhjh]rhD)r}r(hXA :py:class:`buildbot.schedulers.manager.SchedulerManager` instance that manages the active schedulers. All active schedulers are child services of this instance.hjhhh!hGh#}r(h']h(]h&]h%]h)]uh+K3h]r(h@XA rr}r(hXA hjubhM)r}r(hX8:py:class:`buildbot.schedulers.manager.SchedulerManager`rhjhhh!hQh#}r(UreftypeXclasshShTX,buildbot.schedulers.manager.SchedulerManagerU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K3h]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]r h@X,buildbot.schedulers.manager.SchedulerManagerr r }r (hUhjubah!hubaubh@Xi instance that manages the active schedulers. All active schedulers are child services of this instance.r r}r(hXi instance that manages the active schedulers. All active schedulers are child services of this instance.hjubeubah!hubeubh)r}r(hX``master.user_manager`` A :py:class:`buildbot.process.users.manager.UserManagerManager` instance that manages access to users. All active user managers are child services of this instance. hhhhh!hh#}r(h']h(]h&]h%]h)]uh+K:h,hh]r(h)r}r(hX``master.user_manager``rhjhhh!hh#}r(h']h(]h&]h%]h)]uh+K:h]rh)r}r(hjh#}r(h']h(]h&]h%]h)]uhjh]rh@Xmaster.user_managerrr}r(hUhjubah!hubaubh)r }r!(hUh#}r"(h']h(]h&]h%]h)]uhjh]r#hD)r$}r%(hXA :py:class:`buildbot.process.users.manager.UserManagerManager` instance that manages access to users. All active user managers are child services of this instance.hj hhh!hGh#}r&(h']h(]h&]h%]h)]uh+K8h]r'(h@XA r(r)}r*(hXA hj$ubhM)r+}r,(hX=:py:class:`buildbot.process.users.manager.UserManagerManager`r-hj$hhh!hQh#}r.(UreftypeXclasshShTX1buildbot.process.users.manager.UserManagerManagerU refdomainXpyr/h%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K8h]r0h)r1}r2(hj-h#}r3(h']h(]r4(h^j/Xpy-classr5eh&]h%]h)]uhj+h]r6h@X1buildbot.process.users.manager.UserManagerManagerr7r8}r9(hUhj1ubah!hubaubh@Xf instance that manages access to users. All active user managers are child services of this instance.r:r;}r<(hXf instance that manages access to users. All active user managers are child services of this instance.hj$ubeubah!hubeubh)r=}r>(hX``master.db`` A :py:class:`buildbot.db.connector.DBConnector` instance that manages access to the buildbot database. See :ref:`developer-database` for more information. hhhhh!hh#}r?(h']h(]h&]h%]h)]uh+K?h,hh]r@(h)rA}rB(hX ``master.db``rChj=hhh!hh#}rD(h']h(]h&]h%]h)]uh+K?h]rEh)rF}rG(hjCh#}rH(h']h(]h&]h%]h)]uhjAh]rIh@X master.dbrJrK}rL(hUhjFubah!hubaubh)rM}rN(hUh#}rO(h']h(]h&]h%]h)]uhj=h]rPhD)rQ}rR(hXA :py:class:`buildbot.db.connector.DBConnector` instance that manages access to the buildbot database. See :ref:`developer-database` for more information.hjMhhh!hGh#}rS(h']h(]h&]h%]h)]uh+K=h]rT(h@XA rUrV}rW(hXA hjQubhM)rX}rY(hX-:py:class:`buildbot.db.connector.DBConnector`rZhjQhhh!hQh#}r[(UreftypeXclasshShTX!buildbot.db.connector.DBConnectorU refdomainXpyr\h%]h&]U refexplicith']h(]h)]hVhWhNhNuh+K=h]r]h)r^}r_(hjZh#}r`(h']h(]ra(h^j\Xpy-classrbeh&]h%]h)]uhjXh]rch@X!buildbot.db.connector.DBConnectorrdre}rf(hUhj^ubah!hubaubh@X= instance that manages access to the buildbot database. See rgrh}ri(hX= instance that manages access to the buildbot database. See hjQubhM)rj}rk(hX:ref:`developer-database`rlhjQhhh!hQh#}rm(UreftypeXrefhShTXdeveloper-databaseU refdomainXstdrnh%]h&]U refexplicith']h(]h)]hVhWuh+K=h]rohY)rp}rq(hjlh#}rr(h']h(]rs(h^jnXstd-refrteh&]h%]h)]uhjjh]ruh@Xdeveloper-databaservrw}rx(hUhjpubah!hdubaubh@X for more information.ryrz}r{(hX for more information.hjQubeubah!hubeubh)r|}r}(hX``master.debug`` A :py:class:`buildbot.process.debug.DebugServices` instance that manages debugging-related access -- the debug client and manhole. hhhhh!hh#}r~(h']h(]h&]h%]h)]uh+KCh,hh]r(h)r}r(hX``master.debug``rhj|hhh!hh#}r(h']h(]h&]h%]h)]uh+KCh]rh)r}r(hjh#}r(h']h(]h&]h%]h)]uhjh]rh@X master.debugrr}r(hUhjubah!hubaubh)r}r(hUh#}r(h']h(]h&]h%]h)]uhj|h]rhD)r}r(hXA :py:class:`buildbot.process.debug.DebugServices` instance that manages debugging-related access -- the debug client and manhole.hjhhh!hGh#}r(h']h(]h&]h%]h)]uh+KBh]r(h@XA rr}r(hXA hjubhM)r}r(hX0:py:class:`buildbot.process.debug.DebugServices`rhjhhh!hQh#}r(UreftypeXclasshShTX$buildbot.process.debug.DebugServicesU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+KBh]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]rh@X$buildbot.process.debug.DebugServicesrr}r(hUhjubah!hubaubh@XP instance that manages debugging-related access -- the debug client and manhole.rr}r(hXP instance that manages debugging-related access -- the debug client and manhole.hjubeubah!hubeubh)r}r(hX``master.status`` A :py:class:`buildbot.status.master.Status` instance that provides access to all status data. This instance is also the service parent for all status listeners.hhhhh!hh#}r(h']h(]h&]h%]h)]uh+KGh,hh]r(h)r}r(hX``master.status``rhjhhh!hh#}r(h']h(]h&]h%]h)]uh+KGh]rh)r}r(hjh#}r(h']h(]h&]h%]h)]uhjh]rh@X master.statusrr}r(hUhjubah!hubaubh)r}r(hUh#}r(h']h(]h&]h%]h)]uhjh]rhD)r}r(hXA :py:class:`buildbot.status.master.Status` instance that provides access to all status data. This instance is also the service parent for all status listeners.hjhhh!hGh#}r(h']h(]h&]h%]h)]uh+KFh]r(h@XA rr}r(hXA hjubhM)r}r(hX):py:class:`buildbot.status.master.Status`rhjhhh!hQh#}r(UreftypeXclasshShTXbuildbot.status.master.StatusU refdomainXpyrh%]h&]U refexplicith']h(]h)]hVhWhNhNuh+KFh]rh)r}r(hjh#}r(h']h(]r(h^jXpy-classreh&]h%]h)]uhjh]rh@Xbuildbot.status.master.Statusrr}r(hUhjubah!hubaubh@Xv instance that provides access to all status data. This instance is also the service parent for all status listeners.rr}r(hXv instance that provides access to all status data. This instance is also the service parent for all status listeners.hjubeubah!hubeubeubeubeubehUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh,hU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(hUh#}r(h']UlevelKh%]h&]Usourcehh(]h)]UlineKUtypeUINFOruh]rhD)r}r(hUh#}r(h']h(]h&]h%]h)]uhjh]rh@X>Hyperlink target "master-service-hierarchy" is not referenced.rr}r(hUhjubah!hGubah!Usystem_messagerubaUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coder Uenr U datestampr NU report_levelr KU _destinationr NU halt_levelrKU strip_classesrNh=NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacer Uenvr!NUdump_pseudo_xmlr"NUexpose_internalsr#NUsectsubtitle_xformr$U source_linkr%NUrfc_referencesr&NUoutput_encodingr'Uutf-8r(U source_urlr)NUinput_encodingr*U utf-8-sigr+U_disable_configr,NU id_prefixr-UU tab_widthr.KUerror_encodingr/UUTF-8r0U_sourcer1UZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/master-overview.rstr2Ugettext_compactr3U generatorr4NUdump_internalsr5NU smart_quotesr6U pep_base_urlr7Uhttp://www.python.org/dev/peps/r8Usyntax_highlightr9Ulongr:Uinput_encoding_error_handlerr;jUauto_id_prefixr<Uidr=Udoctitle_xformr>Ustrip_elements_with_classesr?NU _config_filesr@]Ufile_insertion_enabledrAU raw_enabledrBKU dump_settingsrCNubUsymbol_footnote_startrDKUidsrE}rF(hh.hhhhh.uUsubstitution_namesrG}rHh!h,h#}rI(h']h%]h&]Usourcehh(]h)]uU footnotesrJ]rKUrefidsrL}rMh]rNhasub.PK4D")@)@5buildbot-v0.8.9/.doctrees/developer/webstatus.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xjinja web templatesqNX whitespaceqNXweb authorization frameworkqNXweb-authorization-frameworkq X web statusq NXjinja-web-templatesq Xits own documentationq uUsubstitution_defsq }qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUid1qhU whitespaceqhUid2qh Uweb-authorization-frameworkqh U web-statusqh Ujinja-web-templatesqh Uits-own-documentationquUchildrenq]qcdocutils.nodes section q)q }q!(U rawsourceq"UUparentq#hUsourceq$cdocutils.nodes reprunicode q%XT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/webstatus.rstq&q'}q(bUtagnameq)Usectionq*U attributesq+}q,(Udupnamesq-]Uclassesq.]Ubackrefsq/]Uidsq0]q1haUnamesq2]q3h auUlineq4KUdocumentq5hh]q6(cdocutils.nodes title q7)q8}q9(h"X Web Statusq:h#h h$h'h)Utitleq;h+}q<(h-]h.]h/]h0]h2]uh4Kh5hh]q=cdocutils.nodes Text q>X Web Statusq?q@}qA(h"h:h#h8ubaubcdocutils.nodes target qB)qC}qD(h"X.. _Jinja-Web-Templates:h#h h$h'h)UtargetqEh+}qF(h0]h/]h-]h.]h2]UrefidqGhuh4Kh5hh]ubh)qH}qI(h"Uh#h h$h'Uexpect_referenced_by_nameqJ}qKh hCsh)h*h+}qL(h-]h.]h/]h0]qM(hheh2]qN(hh euh4Kh5hUexpect_referenced_by_idqO}qPhhCsh]qQ(h7)qR}qS(h"XJinja Web TemplatesqTh#hHh$h'h)h;h+}qU(h-]h.]h/]h0]h2]uh4Kh5hh]qVh>XJinja Web TemplatesqWqX}qY(h"hTh#hRubaubcdocutils.nodes paragraph qZ)q[}q\(h"XBuildbot uses Jinja2 to render its web interface. The authoritative source for this templating engine is `its own documentation `_, of course, but a few notes are in order for those who are making only minor modifications.h#hHh$h'h)U paragraphq]h+}q^(h-]h.]h/]h0]h2]uh4K h5hh]q_(h>XjBuildbot uses Jinja2 to render its web interface. The authoritative source for this templating engine is q`qa}qb(h"XjBuildbot uses Jinja2 to render its web interface. The authoritative source for this templating engine is h#h[ubcdocutils.nodes reference qc)qd}qe(h"XB`its own documentation `_h+}qf(UnameXits own documentationUrefuriqgX'http://jinja.pocoo.org/2/documentation/qhh0]h/]h-]h.]h2]uh#h[h]qih>Xits own documentationqjqk}ql(h"Uh#hdubah)U referenceqmubhB)qn}qo(h"X* U referencedqpKh#h[h)hEh+}qq(Urefurihhh0]qrhah/]h-]h.]h2]qsh auh]ubh>X\, of course, but a few notes are in order for those who are making only minor modifications.qtqu}qv(h"X\, of course, but a few notes are in order for those who are making only minor modifications.h#h[ubeubh)qw}qx(h"Uh#hHh$h'h)h*h+}qy(h-]h.]h/]h0]qzhah2]q{hauh4Kh5hh]q|(h7)q}}q~(h"X Whitespaceqh#hwh$h'h)h;h+}q(h-]h.]h/]h0]h2]uh4Kh5hh]qh>X Whitespaceqq}q(h"hh#h}ubaubhZ)q}q(h"XJinja directives are enclosed in ``{% .. %}``, and sometimes also have dashes. These dashes strip whitespace in the output. For example:h#hwh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4Kh5hh]q(h>X!Jinja directives are enclosed in qq}q(h"X!Jinja directives are enclosed in h#hubcdocutils.nodes literal q)q}q(h"X ``{% .. %}``h+}q(h-]h.]h/]h0]h2]uh#hh]qh>X{% .. %}qq}q(h"Uh#hubah)Uliteralqubh>X], and sometimes also have dashes. These dashes strip whitespace in the output. For example:qq}q(h"X], and sometimes also have dashes. These dashes strip whitespace in the output. For example:h#hubeubcdocutils.nodes literal_block q)q}q(h"X>{% for entry in entries %}
  • {{ entry }}
  • {% endfor %}h#hwh$h'h)U literal_blockqh+}q(UlinenosqUlanguageqXnoneU xml:spaceqUpreserveqh0]h/]h-]h.]h2]uh4Kh5hh]qh>X>{% for entry in entries %}
  • {{ entry }}
  • {% endfor %}qq}q(h"Uh#hubaubhZ)q}q(h"X-will produce output with too much whitespace:qh#hwh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4Kh5hh]qh>X-will produce output with too much whitespace:qq}q(h"hh#hubaubh)q}q(h"X
  • pigs
  • cows
  • h#hwh$h'h)hh+}q(hhXhtmlhhh0]h/]h-]h.]h2]uh4Kh5hh]qh>X
  • pigs
  • cows
  • qq}q(h"Uh#hubaubhZ)q}q(h"X?But adding the dashes will collapse that whitespace completely:qh#hwh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4K%h5hh]qh>X?But adding the dashes will collapse that whitespace completely:qq}q(h"hh#hubaubh)q}q(h"X@{% for entry in entries -%}
  • {{ entry }}
  • {%- endfor %}h#hwh$h'h)hh+}q(hhXnonehhh0]h/]h-]h.]h2]uh4K'h5hh]qh>X@{% for entry in entries -%}
  • {{ entry }}
  • {%- endfor %}qq}q(h"Uh#hubaubhZ)q}q(h"Xyieldsqh#hwh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4K-h5hh]qh>Xyieldsqȅq}q(h"hh#hubaubh)q}q(h"X
  • pigs
  • cows
  • h#hwh$h'h)hh+}q(hhXhtmlhhh0]h/]h-]h.]h2]uh4K/h5hh]qh>X
  • pigs
  • cows
  • qυq}q(h"Uh#hubaubhB)q}q(h"X .. _Web-Authorization-Framework:h#hwh$h'h)hEh+}q(h0]h/]h-]h.]h2]hGhuh4K3h5hh]ubeubeubh)q}q(h"Uh#h h$h'hJ}qh hsh)h*h+}q(h-]h.]h/]h0]q(hheh2]q(hh euh4K6h5hhO}qhhsh]q(h7)q}q(h"XWeb Authorization Frameworkqh#hh$h'h)h;h+}q(h-]h.]h/]h0]h2]uh4K6h5hh]qh>XWeb Authorization Frameworkq⅁q}q(h"hh#hubaubhZ)q}q(h"XWhenever any part of the web framework wants to perform some action on the buildmaster, it should check the user's authorization first.qh#hh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4K8h5hh]qh>XWhenever any part of the web framework wants to perform some action on the buildmaster, it should check the user's authorization first.qꅁq}q(h"hh#hubaubhZ)q}q(h"XAlways check authorization twice: once to decide whether to show the option to the user (link, button, form, whatever); and once before actually performing the action.qh#hh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4K;h5hh]qh>XAlways check authorization twice: once to decide whether to show the option to the user (link, button, form, whatever); and once before actually performing the action.qq}q(h"hh#hubaubhZ)q}q(h"XTo check whether to display the option, you'll usually want to pass an authz object to the Jinja template in your :class:`HtmlResource` subclass::h#hh$h'h)h]h+}q(h-]h.]h/]h0]h2]uh4K?h5hh]q(h>XrTo check whether to display the option, you'll usually want to pass an authz object to the Jinja template in your qq}q(h"XrTo check whether to display the option, you'll usually want to pass an authz object to the Jinja template in your h#hubcsphinx.addnodes pending_xref q)q}q(h"X:class:`HtmlResource`qh#hh$h'h)U pending_xrefrh+}r(UreftypeXclassUrefwarnrU reftargetrX HtmlResourceU refdomainXpyrh0]h/]U refexplicith-]h.]h2]UrefdocrXdeveloper/webstatusrUpy:classrNU py:modulerNuh4K?h]r h)r }r (h"hh+}r (h-]h.]r (UxrefrjXpy-classreh/]h0]h2]uh#hh]rh>X HtmlResourcerr}r(h"Uh#j ubah)hubaubh>X subclass:rr}r(h"X subclass:h#hubeubh)r}r(h"Xdef content(self, req, cxt): # ... cxt['authz'] = self.getAuthz(req) template = ... return template.render(**cxt)h#hh$h'h)hh+}r(hhh0]h/]h-]h.]h2]uh4KBh5hh]rh>Xdef content(self, req, cxt): # ... cxt['authz'] = self.getAuthz(req) template = ... return template.render(**cxt)rr}r(h"Uh#jubaubhZ)r}r(h"XCand then determine whether to advertise the action in the template:r h#hh$h'h)h]h+}r!(h-]h.]h/]h0]h2]uh4KHh5hh]r"h>XCand then determine whether to advertise the action in the template:r#r$}r%(h"j h#jubaubh)r&}r'(h"Xc{{ if authz.advertiseAction('myNewTrick') }}
    ... {{ endif }}h#hh$h'h)hh+}r((hhXnonehhh0]h/]h-]h.]h2]uh4KJh5hh]r)h>Xc{{ if authz.advertiseAction('myNewTrick') }} ... {{ endif }}r*r+}r,(h"Uh#j&ubaubhZ)r-}r.(h"XActions can optionally require authentication, so use ``needAuthForm`` to determine whether to require a 'username' and 'passwd' field in the generated form. These fields are usually generated by :meth:`authFormIfNeeded()`:h#hh$h'h)h]h+}r/(h-]h.]h/]h0]h2]uh4KPh5hh]r0(h>X6Actions can optionally require authentication, so use r1r2}r3(h"X6Actions can optionally require authentication, so use h#j-ubh)r4}r5(h"X``needAuthForm``h+}r6(h-]h.]h/]h0]h2]uh#j-h]r7h>X needAuthFormr8r9}r:(h"Uh#j4ubah)hubh>X to determine whether to require a 'username' and 'passwd' field in the generated form. These fields are usually generated by r;r<}r=(h"X to determine whether to require a 'username' and 'passwd' field in the generated form. These fields are usually generated by h#j-ubh)r>}r?(h"X:meth:`authFormIfNeeded()`r@h#j-h$h'h)jh+}rA(UreftypeXmethjjXauthFormIfNeededU refdomainXpyrBh0]h/]U refexplicith-]h.]h2]jjjNjNuh4KPh]rCh)rD}rE(h"j@h+}rF(h-]h.]rG(jjBXpy-methrHeh/]h0]h2]uh#j>h]rIh>XauthFormIfNeededrJrK}rL(h"Uh#jDubah)hubaubh>X:rM}rN(h"X:h#j-ubeubh)rO}rP(h"X+{{ authFormIfNeeded(authz, 'myNewTrick') }}h#hh$h'h)hh+}rQ(hhXnonehhh0]h/]h-]h.]h2]uh4KTh5hh]rRh>X+{{ authFormIfNeeded(authz, 'myNewTrick') }}rSrT}rU(h"Uh#jOubaubhZ)rV}rW(h"XlOnce the POST request comes in, it's time to check authorization again. This usually looks something like ::h#hh$h'h)h]h+}rX(h-]h.]h/]h0]h2]uh4KXh5hh]rYh>XiOnce the POST request comes in, it's time to check authorization again. This usually looks something likerZr[}r\(h"XiOnce the POST request comes in, it's time to check authorization again. This usually looks something likeh#jVubaubh)r]}r^(h"Xres = yield self.getAuthz(req).actionAllowed('myNewTrick', req, someExtraArg) if not res: defer.returnValue(Redirect(path_to_authfail(req))) returnh#hh$h'h)hh+}r_(hhh0]h/]h-]h.]h2]uh4K[h5hh]r`h>Xres = yield self.getAuthz(req).actionAllowed('myNewTrick', req, someExtraArg) if not res: defer.returnValue(Redirect(path_to_authfail(req))) returnrarb}rc(h"Uh#j]ubaubhZ)rd}re(h"X@The ``someExtraArg`` is optional (it's handled with ``*args``, so you can have several if you want), and is given to the user's authorization function. For example, a build-related action should pass the build status, so that the user's authorization function could ensure that devs can only operate on their own builds.h#hh$h'h)h]h+}rf(h-]h.]h/]h0]h2]uh4K`h5hh]rg(h>XThe rhri}rj(h"XThe h#jdubh)rk}rl(h"X``someExtraArg``h+}rm(h-]h.]h/]h0]h2]uh#jdh]rnh>X someExtraArgrorp}rq(h"Uh#jkubah)hubh>X is optional (it's handled with rrrs}rt(h"X is optional (it's handled with h#jdubh)ru}rv(h"X ``*args``h+}rw(h-]h.]h/]h0]h2]uh#jdh]rxh>X*argsryrz}r{(h"Uh#juubah)hubh>X, so you can have several if you want), and is given to the user's authorization function. For example, a build-related action should pass the build status, so that the user's authorization function could ensure that devs can only operate on their own builds.r|r}}r~(h"X, so you can have several if you want), and is given to the user's authorization function. For example, a build-related action should pass the build status, so that the user's authorization function could ensure that devs can only operate on their own builds.h#jdubeubhZ)r}r(h"XNote that ``actionAllowed`` returns a ``Deferred`` instance, so you must wait for the ``Deferred`` and yield the ``Redirect`` instead of returning it.h#hh$h'h)h]h+}r(h-]h.]h/]h0]h2]uh4Kfh5hh]r(h>X Note that rr}r(h"X Note that h#jubh)r}r(h"X``actionAllowed``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>X actionAllowedrr}r(h"Uh#jubah)hubh>X returns a rr}r(h"X returns a h#jubh)r}r(h"X ``Deferred``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>XDeferredrr}r(h"Uh#jubah)hubh>X$ instance, so you must wait for the rr}r(h"X$ instance, so you must wait for the h#jubh)r}r(h"X ``Deferred``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>XDeferredrr}r(h"Uh#jubah)hubh>X and yield the rr}r(h"X and yield the h#jubh)r}r(h"X ``Redirect``h+}r(h-]h.]h/]h0]h2]uh#jh]rh>XRedirectrr}r(h"Uh#jubah)hubh>X instead of returning it.rr}r(h"X instead of returning it.h#jubeubhZ)r}r(h"X>The available actions are described in :bb:status:`WebStatus`.rh#hh$h'h)h]h+}r(h-]h.]h/]h0]h2]uh4Kih5hh]r(h>X'The available actions are described in rr}r(h"X'The available actions are described in h#jubh)r}r(h"X:bb:status:`WebStatus`rh#jh$h'h)jh+}r(UreftypeXstatusjjX WebStatusU refdomainXbbrh0]h/]U refexplicith-]h.]h2]jjuh4Kih]rh)r}r(h"jh+}r(h-]h.]r(jjX bb-statusreh/]h0]h2]uh#jh]rh>X WebStatusrr}r(h"Uh#jubah)hubaubh>X.r}r(h"X.h#jubeubeubeubah"UU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh5hU current_linerNUtransform_messagesr]r(cdocutils.nodes system_message r)r}r(h"Uh+}r(h-]UlevelKh0]h/]Usourceh'h.]h2]UlineKUtypeUINFOruh]rhZ)r}r(h"Uh+}r(h-]h.]h/]h0]h2]uh#jh]rh>X9Hyperlink target "jinja-web-templates" is not referenced.rr}r(h"Uh#jubah)h]ubah)Usystem_messagerubj)r}r(h"Uh+}r(h-]UlevelKh0]h/]Usourceh'h.]h2]UlineK3Utypejuh]rhZ)r}r(h"Uh+}r(h-]h.]h/]h0]h2]uh#jh]rh>XAHyperlink target "web-authorization-framework" is not referenced.rr}r(h"Uh#jubah)h]ubah)jubeUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationr NU halt_levelr KU strip_classesr Nh;NUerror_encoding_error_handlerr Ubackslashreplacer UdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformr U source_linkr!NUrfc_referencesr"NUoutput_encodingr#Uutf-8r$U source_urlr%NUinput_encodingr&U utf-8-sigr'U_disable_configr(NU id_prefixr)UU tab_widthr*KUerror_encodingr+UUTF-8r,U_sourcer-UT/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/webstatus.rstr.Ugettext_compactr/U generatorr0NUdump_internalsr1NU smart_quotesr2U pep_base_urlr3Uhttp://www.python.org/dev/peps/r4Usyntax_highlightr5Ulongr6Uinput_encoding_error_handlerr7jUauto_id_prefixr8Uidr9Udoctitle_xformr:Ustrip_elements_with_classesr;NU _config_filesr<]Ufile_insertion_enabledr=U raw_enabledr>KU dump_settingsr?NubUsymbol_footnote_startr@KUidsrA}rB(hhwhhhhhhHhhHhhnhh uUsubstitution_namesrC}rDh)h5h+}rE(h-]h0]h/]Usourceh'h.]h2]uU footnotesrF]rGUrefidsrH}rI(h]rJhCah]rKhauub.PK3DοK;buildbot-v0.8.9/.doctrees/developer/cls-irenderable.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X irenderableqNXgetRenderingForquUsubstitution_defsq}q Uparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startqKUnameidsq}q(hU irenderableqhhuUchildrenq]q(csphinx.addnodes index q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-irenderable.rstqq}qbUtagnameqUindexqU attributesq }q!(Uidsq"]Ubackrefsq#]Udupnamesq$]Uclassesq%]Unamesq&]Uentriesq']q((Usingleq)XProperties; IRenderableUindex-0q*Utq+aUinlineq,uUlineq-KUdocumentq.hh]ubcdocutils.nodes target q/)q0}q1(hUhhhhhUtargetq2h }q3(h"]h#]h$]h%]h&]Urefidq4h*uh-Kh.hh]ubcdocutils.nodes section q5)q6}q7(hUhhhhUexpect_referenced_by_nameq8}hUsectionq9h }q:(h$]h%]h#]h"]q;(hh*eh&]qh*h0sh]q?(cdocutils.nodes title q@)qA}qB(hX IRenderableqChh6hhhUtitleqDh }qE(h$]h%]h#]h"]h&]uh-Kh.hh]qFcdocutils.nodes Text qGX IRenderableqHqI}qJ(hhChhAubaubh)qK}qL(hUhh6hNhhh }qM(h"]h#]h$]h%]h&]Uentries]uh-Nh.hh]ubcsphinx.addnodes desc qN)qO}qP(hUhh6hNhUdescqQh }qR(UnoindexqSUdomainqTXpyh"]h#]h$]h%]h&]UobjtypeqUXclassqVUdesctypeqWhVuh-Nh.hh]qX(csphinx.addnodes desc_signature qY)qZ}q[(hX!buildbot.interfaces.IRenderable::q\hhOhhhUdesc_signatureq]h }q^(h"]h#]h$]h%]h&]Ufirstq_uh-Kh.hh]q`csphinx.addnodes desc_name qa)qb}qc(hh\hhZhhhU desc_nameqdh }qe(h$]h%]h#]h"]h&]uh-Kh.hh]qfhGX!buildbot.interfaces.IRenderable::qgqh}qi(hUhhbubaubaubcsphinx.addnodes desc_content qj)qk}ql(hUhhOhhhU desc_contentqmh }qn(h$]h%]h#]h"]h&]uh-Kh.hh]qo(cdocutils.nodes paragraph qp)qq}qr(hXbProviders of this class can be "rendered", based on available properties, when a build is started.qshhkhhhU paragraphqth }qu(h$]h%]h#]h"]h&]uh-Kh.hh]qvhGXbProviders of this class can be "rendered", based on available properties, when a build is started.qwqx}qy(hhshhqubaubh)qz}q{(hUhhkhhhhh }q|(h"]h#]h$]h%]h&]Uentries]q}(h)XgetRenderingFor()hUtq~auh-Nh.hh]ubhN)q}q(hUhhkhhhhQh }q(hShTXpyh"]h#]h$]h%]h&]hUXmethodqhWhuh-Nh.hh]q(hY)q}q(hXgetRenderingFor(iprops)qhhhhhh]h }q(h"]qhaUmoduleqNh#]h$]h%]h&]qhaUfullnameqhUclassqUh_uh-Kh.hh]q(ha)q}q(hhhhhhhhdh }q(h$]h%]h#]h"]h&]uh-Kh.hh]qhGXgetRenderingForqq}q(hUhhubaubcsphinx.addnodes desc_parameterlist q)q}q(hUhhhhhUdesc_parameterlistqh }q(h$]h%]h#]h"]h&]uh-Kh.hh]qcsphinx.addnodes desc_parameter q)q}q(hXipropsh }q(h$]h%]h#]h"]h&]uhhh]qhGXipropsqq}q(hUhhubahUdesc_parameterqubaubeubhj)q}q(hUhhhhhhmh }q(h$]h%]h#]h"]h&]uh-Kh.hh]q(cdocutils.nodes field_list q)q}q(hUhhhhhU field_listqh }q(h$]h%]h#]h"]h&]uh-Nh.hh]qcdocutils.nodes field q)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh]q(cdocutils.nodes field_name q)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh]qhGX Parametersqq}q(hUhhubahU field_namequbcdocutils.nodes field_body q)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh]qhp)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh]q(cdocutils.nodes strong q)q}q(hXipropsh }q(h$]h%]h#]h"]h&]uhhh]qhGXipropsqʅq}q(hUhhubahUstrongqubhGX -- q΅q}q(hUhhubhGXthe qхq}q(hXthe hhubcsphinx.addnodes pending_xref q)q}q(hX):class:`~buildbot.interfaces.IProperties`qhhhhhU pending_xrefqh }q(UreftypeXclassUrefwarnqډU reftargetqXbuildbot.interfaces.IPropertiesU refdomainXpyqh"]h#]U refexplicith$]h%]h&]UrefdocqXdeveloper/cls-irenderableqUpy:classqNU py:moduleqNuh-K h]qcdocutils.nodes literal q)q}q(hhh }q(h$]h%]q(UxrefqhXpy-classqeh#]h"]h&]uhhh]qhGX IPropertiesqꅁq}q(hUhhubahUliteralqubaubhGX0 provider supplying the properties of the build.qq}q(hX0 provider supplying the properties of the build.hhubehhtubahU field_bodyqubehUfieldqubaubhp)q}q(hXMReturns the interpretation of the given properties, optionally in a Deferred.qhhhhhhth }q(h$]h%]h#]h"]h&]uh-Kh.hh]qhGXMReturns the interpretation of the given properties, optionally in a Deferred.qq}q(hhhhubaubeubeubeubeubeubehUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh.hU current_linerNUtransform_messagesr ]r cdocutils.nodes system_message r )r }r (hUh }r(h$]UlevelKh"]h#]Usourcehh%]h&]UlineKUtypeUINFOruh]rhp)r}r(hUh }r(h$]h%]h#]h"]h&]uhj h]rhGX-Hyperlink target "index-0" is not referenced.rr}r(hUhjubahhtubahUsystem_messagerubaUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]r Usettingsr!(cdocutils.frontend Values r"or#}r$(Ufootnote_backlinksr%KUrecord_dependenciesr&NU rfc_base_urlr'Uhttp://tools.ietf.org/html/r(U tracebackr)Upep_referencesr*NUstrip_commentsr+NU toc_backlinksr,Uentryr-U language_coder.Uenr/U datestampr0NU report_levelr1KU _destinationr2NU halt_levelr3KU strip_classesr4NhDNUerror_encoding_error_handlerr5Ubackslashreplacer6Udebugr7NUembed_stylesheetr8Uoutput_encoding_error_handlerr9Ustrictr:U sectnum_xformr;KUdump_transformsr<NU docinfo_xformr=KUwarning_streamr>NUpep_file_url_templater?Upep-%04dr@Uexit_status_levelrAKUconfigrBNUstrict_visitorrCNUcloak_email_addressesrDUtrim_footnote_reference_spacerEUenvrFNUdump_pseudo_xmlrGNUexpose_internalsrHNUsectsubtitle_xformrIU source_linkrJNUrfc_referencesrKNUoutput_encodingrLUutf-8rMU source_urlrNNUinput_encodingrOU utf-8-sigrPU_disable_configrQNU id_prefixrRUU tab_widthrSKUerror_encodingrTUUTF-8rUU_sourcerVUZ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-irenderable.rstrWUgettext_compactrXU generatorrYNUdump_internalsrZNU smart_quotesr[U pep_base_urlr\Uhttp://www.python.org/dev/peps/r]Usyntax_highlightr^Ulongr_Uinput_encoding_error_handlerr`j:Uauto_id_prefixraUidrbUdoctitle_xformrcUstrip_elements_with_classesrdNU _config_filesre]Ufile_insertion_enabledrfU raw_enabledrgKU dump_settingsrhNubUsymbol_footnote_startriKUidsrj}rk(hh6h*h6hhuUsubstitution_namesrl}rmhh.h }rn(h$]h"]h#]Usourcehh%]h&]uU footnotesro]rpUrefidsrq}rrh*]rsh0asub.PK3D+3buildbot-v0.8.9/.doctrees/developer/classes.doctreecdocutils.nodes document q)q}q(U nametypesq}qXclassesqNsUsubstitution_defsq}qUparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startq KUnameidsq}qhUclassesqsUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/classes.rstqq}qbUtagnameqUsectionqU attributesq}q (Udupnamesq!]Uclassesq"]Ubackrefsq#]Uidsq$]q%haUnamesq&]q'hauUlineq(KUdocumentq)hh]q*(cdocutils.nodes title q+)q,}q-(hXClassesq.hhhhhUtitleq/h}q0(h!]h"]h#]h$]h&]uh(Kh)hh]q1cdocutils.nodes Text q2XClassesq3q4}q5(hh.hh,ubaubcdocutils.nodes paragraph q6)q7}q8(hXLThe sections contained here document classes that can be used or subclassed.q9hhhhhU paragraphq:h}q;(h!]h"]h#]h$]h&]uh(Kh)hh]q}q?(hh9hh7ubaubcdocutils.nodes note q@)qA}qB(hXSome of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.hhhhhUnoteqCh}qD(h!]h"]h#]h$]h&]uh(Nh)hh]qEh6)qF}qG(hXSome of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.qHhhAhhhh:h}qI(h!]h"]h#]h$]h&]uh(Kh]qJh2XSome of this information duplicates information available in the source code itself. Consider this information authoritative, and the source code a demonstration of the current implementation which is subject to change.qKqL}qM(hhHhhFubaubaubcdocutils.nodes compound qN)qO}qP(hUhhhhhUcompoundqQh}qR(h!]h"]qSUtoctree-wrapperqTah#]h$]h&]uh(Nh)hh]qUcsphinx.addnodes toctree qV)qW}qX(hUhhOhhhUtoctreeqYh}qZ(Unumberedq[KU includehiddenq\hXdeveloper/classesq]U titlesonlyq^Uglobq_h$]h#]h!]h"]h&]Uentriesq`]qa(NXdeveloper/cls-buildfactoryqbqcNX*developer/cls-buildsetsummarynotifiermixinqdqeNXdeveloper/cls-remotecommandsqfqgNXdeveloper/cls-buildstepsqhqiNXdeveloper/cls-forceschedqjqkNXdeveloper/cls-irenderableqlqmNXdeveloper/cls-ipropertiesqnqoeUhiddenqpU includefilesqq]qr(hbhdhfhhhjhlhneUmaxdepthqsKuh(K h]ubaubcdocutils.nodes target qt)qu}qv(hUhhhhhUtargetqwh}qx(h$]h#]h!]h"]h&]UrefidqyUindex-0qzuh(Nh)hh]ubcsphinx.ext.todo todo_node q{)q|}q}(hXcls-logobserverq~hhhhUexpect_referenced_by_nameq}hU todo_nodeqh}q(h!]h"]qUadmonition-todoqah#]h$]qhzah&]uh(Kh)hUexpect_referenced_by_idq}qhzhush]q(h+)q}q(hXTodoqh}q(h!]h"]h#]h$]h&]uhh|h]qh2XTodoqq}q(hhhhubahh/ubh6)q}q(hh~hh|hhhh:h}q(h!]h"]h#]h$]h&]uh(Kh]qh2Xcls-logobserverqq}q(hh~hhubaubeubeubahUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh)hU current_lineqNUtransform_messagesq]qcdocutils.nodes system_message q)q}q(hUh}q(h!]UlevelKh$]h#]Usourcehh"]h&]UtypeUINFOquh]qh6)q}q(hUh}q(h!]h"]h#]h$]h&]uhhh]qh2X-Hyperlink target "index-0" is not referenced.qq}q(hUhhubahh:ubahUsystem_messagequbaUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqňUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh/NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqԉUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesqUtrim_footnote_reference_spaceqUenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformqU source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/classes.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhhzh|uUsubstitution_namesr}r hh)h}r (h!]h$]h#]Usourcehh"]h&]uU footnotesr ]r Urefidsr }rhz]rhuasub.PK3Du[3[3>buildbot-v0.8.9/.doctrees/developer/cls-remotecommands.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X6buildbot.process.buildstep.RemoteCommand.remote_updateqX,buildbot.process.buildstep.RemoteCommand.runqX-buildbot.process.buildstep.RemoteCommand.logsqX6buildbot.process.buildstep.RemoteCommand.useLogDelayedq X remotecommandq NX(buildbot.process.buildstep.RemoteCommandq X1buildbot.process.buildstep.RemoteCommand.addToLogq X0buildbot.process.buildstep.RemoteCommand.didFailq X2buildbot.process.buildstep.RemoteCommand.interruptqX2buildbot.process.buildstep.RemoteCommand.addStderrqX8buildbot.process.buildstep.RemoteCommand.remote_completeqX/buildbot.process.buildstep.RemoteCommand.stdoutqX2buildbot.process.buildstep.RemoteCommand.addHeaderqX-buildbot.process.buildstep.RemoteShellCommandqX5buildbot.process.buildstep.RemoteCommand.remoteUpdateqX2buildbot.process.buildstep.RemoteCommand.addStdoutqX0buildbot.process.buildstep.RemoteCommand.resultsqX7buildbot.process.buildstep.RemoteCommand.remoteCompleteqX/buildbot.process.buildstep.RemoteCommand.activeqXremotecommandsqNX/buildbot.process.buildstep.RemoteCommand.useLogqX+buildbot.process.buildstep.RemoteCommand.rcquUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceq NU decorationq!NUautofootnote_startq"KUnameidsq#}q$(hhhhhhh h h U remotecommandq%h h h h h h hhhhhhhhhhhhhhhhhhhhhhhUremotecommandsq&hhhhuUchildrenq']q(cdocutils.nodes section q))q*}q+(U rawsourceq,UUparentq-hUsourceq.cdocutils.nodes reprunicode q/X]/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-remotecommands.rstq0q1}q2bUtagnameq3Usectionq4U attributesq5}q6(Udupnamesq7]Uclassesq8]Ubackrefsq9]Uidsq:]q;h&aUnamesq<]q=hauUlineq>KUdocumentq?hh']q@(cdocutils.nodes title qA)qB}qC(h,XRemoteCommandsqDh-h*h.h1h3UtitleqEh5}qF(h7]h8]h9]h:]h<]uh>Kh?hh']qGcdocutils.nodes Text qHXRemoteCommandsqIqJ}qK(h,hDh-hBubaubcdocutils.nodes paragraph qL)qM}qN(h,XMost of the action in build steps consists of performing operations on the slave. This is accomplished via :class:`RemoteCommand` and its subclasses. Each represents a single operation on the slave.h-h*h.h1h3U paragraphqOh5}qP(h7]h8]h9]h:]h<]uh>Kh?hh']qQ(hHXlMost of the action in build steps consists of performing operations on the slave. This is accomplished via qRqS}qT(h,XlMost of the action in build steps consists of performing operations on the slave. This is accomplished via h-hMubcsphinx.addnodes pending_xref qU)qV}qW(h,X:class:`RemoteCommand`qXh-hMh.h1h3U pending_xrefqYh5}qZ(UreftypeXclassUrefwarnq[U reftargetq\X RemoteCommandU refdomainXpyq]h:]h9]U refexplicith7]h8]h<]Urefdocq^Xdeveloper/cls-remotecommandsq_Upy:classq`NU py:moduleqaXbuildbot.process.buildstepqbuh>Kh']qccdocutils.nodes literal qd)qe}qf(h,hXh5}qg(h7]h8]qh(Uxrefqih]Xpy-classqjeh9]h:]h<]uh-hVh']qkhHX RemoteCommandqlqm}qn(h,Uh-heubah3UliteralqoubaubhHXE and its subclasses. Each represents a single operation on the slave.qpqq}qr(h,XE and its subclasses. Each represents a single operation on the slave.h-hMubeubhL)qs}qt(h,XvMost data is returned to a command via updates. These updates are described in detail in :ref:`master-slave-updates`.h-h*h.h1h3hOh5}qu(h7]h8]h9]h:]h<]uh>K h?hh']qv(hHXZMost data is returned to a command via updates. These updates are described in detail in qwqx}qy(h,XZMost data is returned to a command via updates. These updates are described in detail in h-hsubhU)qz}q{(h,X:ref:`master-slave-updates`q|h-hsh.h1h3hYh5}q}(UreftypeXrefh[h\Xmaster-slave-updatesU refdomainXstdq~h:]h9]U refexplicith7]h8]h<]h^h_uh>K h']qcdocutils.nodes emphasis q)q}q(h,h|h5}q(h7]h8]q(hih~Xstd-refqeh9]h:]h<]uh-hzh']qhHXmaster-slave-updatesqq}q(h,Uh-hubah3UemphasisqubaubhHX.q}q(h,X.h-hsubeubh))q}q(h,Uh-h*h.h1h3h4h5}q(h7]h8]h9]h:]qh%ah<]qh auh>Kh?hh']q(hA)q}q(h,X RemoteCommandqh-hh.h1h3hEh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHX RemoteCommandqq}q(h,hh-hubaubcsphinx.addnodes index q)q}q(h,Uh-hh.h1h3Uindexqh5}q(h:]h9]h7]h8]h<]Uentries]q(UsingleqX3RemoteCommand (class in buildbot.process.buildstep)h Utqauh>Nh?hh']ubcsphinx.addnodes desc q)q}q(h,Uh-hh.h1h3Udescqh5}q(UnoindexqUdomainqXpyqh:]h9]h7]h8]h<]UobjtypeqXclassqUdesctypeqhuh>Nh?hh']q(csphinx.addnodes desc_signature q)q}q(h,X`RemoteCommand(remote_command, args, collectStdout=False, ignore_updates=False, decodeRC=dict(0))h-hh.h1h3Udesc_signatureqh5}q(h:]qh aUmoduleqhbh9]h7]h8]h<]qh aUfullnameqX RemoteCommandqUclassqUUfirstquh>Kh?hh']q(csphinx.addnodes desc_annotation q)q}q(h,Xclass h-hh.h1h3Udesc_annotationqh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXclass q…q}q(h,Uh-hubaubcsphinx.addnodes desc_addname q)q}q(h,Xbuildbot.process.buildstep.h-hh.h1h3U desc_addnameqh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXbuildbot.process.buildstep.q˅q}q(h,Uh-hubaubcsphinx.addnodes desc_name q)q}q(h,hh-hh.h1h3U desc_nameqh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHX RemoteCommandqԅq}q(h,Uh-hubaubcsphinx.addnodes desc_parameterlist q)q}q(h,Uh-hh.h1h3Udesc_parameterlistqh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']q(csphinx.addnodes desc_parameter q)q}q(h,Xremote_commandh5}q(h7]h8]h9]h:]h<]uh-hh']qhHXremote_commandq⅁q}q(h,Uh-hubah3Udesc_parameterqubh)q}q(h,Xargsh5}q(h7]h8]h9]h:]h<]uh-hh']qhHXargsqꅁq}q(h,Uh-hubah3hubh)q}q(h,XcollectStdout=Falseh5}q(h7]h8]h9]h:]h<]uh-hh']qhHXcollectStdout=Falseqq}q(h,Uh-hubah3hubh)q}q(h,Xignore_updates=Falseh5}q(h7]h8]h9]h:]h<]uh-hh']qhHXignore_updates=Falseqq}q(h,Uh-hubah3hubh)q}q(h,XdecodeRC=dict(0)h5}q(h7]h8]h9]h:]h<]uh-hh']qhHXdecodeRC=dict(0)qr}r(h,Uh-hubah3hubeubeubcsphinx.addnodes desc_content r)r}r(h,Uh-hh.h1h3U desc_contentrh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(cdocutils.nodes field_list r)r }r (h,Uh-jh.h1h3U field_listr h5}r (h7]h8]h9]h:]h<]uh>Nh?hh']r cdocutils.nodes field r)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-j h']r(cdocutils.nodes field_name r)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r(h,Uh-jubah3U field_namerubcdocutils.nodes field_body r)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r cdocutils.nodes bullet_list r!)r"}r#(h,Uh5}r$(h7]h8]h9]h:]h<]uh-jh']r%(cdocutils.nodes list_item r&)r'}r((h,Uh5}r)(h7]h8]h9]h:]h<]uh-j"h']r*hL)r+}r,(h,Uh5}r-(h7]h8]h9]h:]h<]uh-j'h']r.(cdocutils.nodes strong r/)r0}r1(h,Xremote_commandh5}r2(h7]h8]h9]h:]h<]uh-j+h']r3hHXremote_commandr4r5}r6(h,Uh-j0ubah3Ustrongr7ubhHX (r8r9}r:(h,Uh-j+ubhU)r;}r<(h,Uh5}r=(UreftypeUobjr>U reftargetXstringr?U refdomainhh:]h9]U refexplicith7]h8]h<]uh-j+h']r@h)rA}rB(h,j?h5}rC(h7]h8]h9]h:]h<]uh-j;h']rDhHXstringrErF}rG(h,Uh-jAubah3hubah3hYubhHX)rH}rI(h,Uh-j+ubhHX -- rJrK}rL(h,Uh-j+ubhHXcommand to run on the slaverMrN}rO(h,Xcommand to run on the slaverPh-j+ubeh3hOubah3U list_itemrQubj&)rR}rS(h,Uh5}rT(h7]h8]h9]h:]h<]uh-j"h']rUhL)rV}rW(h,Uh5}rX(h7]h8]h9]h:]h<]uh-jRh']rY(j/)rZ}r[(h,Xargsh5}r\(h7]h8]h9]h:]h<]uh-jVh']r]hHXargsr^r_}r`(h,Uh-jZubah3j7ubhHX (rarb}rc(h,Uh-jVubhU)rd}re(h,Uh5}rf(Ureftypej>U reftargetX dictionaryrgU refdomainhh:]h9]U refexplicith7]h8]h<]uh-jVh']rhh)ri}rj(h,jgh5}rk(h7]h8]h9]h:]h<]uh-jdh']rlhHX dictionaryrmrn}ro(h,Uh-jiubah3hubah3hYubhHX)rp}rq(h,Uh-jVubhHX -- rrrs}rt(h,Uh-jVubhHX arguments to pass to the commandrurv}rw(h,X arguments to pass to the commandrxh-jVubeh3hOubah3jQubj&)ry}rz(h,Uh5}r{(h7]h8]h9]h:]h<]uh-j"h']r|hL)r}}r~(h,Uh5}r(h7]h8]h9]h:]h<]uh-jyh']r(j/)r}r(h,X collectStdouth5}r(h7]h8]h9]h:]h<]uh-j}h']rhHX collectStdoutrr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-j}ubhHX%if True, collect the command's stdoutrr}r(h,X%if True, collect the command's stdoutrh-j}ubeh3hOubah3jQubj&)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-j"h']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xignore_updatesh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXignore_updatesrr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXtrue to ignore remote updatesrr}r(h,Xtrue to ignore remote updatesrh-jubeh3hOubah3jQubj&)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-j"h']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,XdecodeRCh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXdecodeRCrr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXdictionary associating rr}r(h,Xdictionary associating h-jubhd)r}r(h,X``rc``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXrcrr}r(h,Uh-jubah3houbhHX. values to buildsteps results constants (e.g. rr}r(h,X. values to buildsteps results constants (e.g. h-jubhd)r}r(h,X ``SUCCESS``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXSUCCESSrr}r(h,Uh-jubah3houbhHX, rr}r(h,X, h-jubhd)r}r(h,X ``FAILURE``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXFAILURErr}r(h,Uh-jubah3houbhHX, rr}r(h,X, h-jubhd)r}r(h,X ``WARNINGS``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXWARNINGSrr}r(h,Uh-jubah3houbhHX)r}r(h,X)h-jubeh3hOubah3jQubeh3U bullet_listrubah3U field_bodyrubeh3UfieldrubaubhL)r}r(h,XThis class handles running commands, consisting of a command name and a dictionary of arguments. If true, ``ignore_updates`` will suppress any updates sent from the slave.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXkThis class handles running commands, consisting of a command name and a dictionary of arguments. If true, rr}r(h,XkThis class handles running commands, consisting of a command name and a dictionary of arguments. If true, h-jubhd)r}r(h,X``ignore_updates``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXignore_updatesrr}r(h,Uh-jubah3houbhHX/ will suppress any updates sent from the slave.rr}r(h,X/ will suppress any updates sent from the slave.h-jubeubhL)r}r(h,XThis class handles updates for ``stdout``, ``stderr``, and ``header`` by appending them to a ``stdio`` logfile, if one is in use. It handles updates for ``rc`` by recording the value in its ``rc`` attribute.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXThis class handles updates for rr}r(h,XThis class handles updates for h-jubhd)r}r(h,X ``stdout``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXstdoutrr}r(h,Uh-jubah3houbhHX, rr}r(h,X, h-jubhd)r}r(h,X ``stderr``h5}r(h7]h8]h9]h:]h<]uh-jh']r hHXstderrr r }r (h,Uh-jubah3houbhHX, and r r}r(h,X, and h-jubhd)r}r(h,X ``header``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXheaderrr}r(h,Uh-jubah3houbhHX by appending them to a rr}r(h,X by appending them to a h-jubhd)r}r(h,X ``stdio``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXstdiorr}r (h,Uh-jubah3houbhHX4 logfile, if one is in use. It handles updates for r!r"}r#(h,X4 logfile, if one is in use. It handles updates for h-jubhd)r$}r%(h,X``rc``h5}r&(h7]h8]h9]h:]h<]uh-jh']r'hHXrcr(r)}r*(h,Uh-j$ubah3houbhHX by recording the value in its r+r,}r-(h,X by recording the value in its h-jubhd)r.}r/(h,X``rc``h5}r0(h7]h8]h9]h:]h<]uh-jh']r1hHXrcr2r3}r4(h,Uh-j.ubah3houbhHX attribute.r5r6}r7(h,X attribute.h-jubeubhL)r8}r9(h,XMost slave-side commands, even those which do not spawn a new process on the slave, generate logs and an ``rc``, requiring this class or one of its subclasses. See :ref:`master-slave-updates` for the updates that each command may send.h-jh.h1h3hOh5}r:(h7]h8]h9]h:]h<]uh>K#h?hh']r;(hHXiMost slave-side commands, even those which do not spawn a new process on the slave, generate logs and an r<r=}r>(h,XiMost slave-side commands, even those which do not spawn a new process on the slave, generate logs and an h-j8ubhd)r?}r@(h,X``rc``h5}rA(h7]h8]h9]h:]h<]uh-j8h']rBhHXrcrCrD}rE(h,Uh-j?ubah3houbhHX6, requiring this class or one of its subclasses. See rFrG}rH(h,X6, requiring this class or one of its subclasses. See h-j8ubhU)rI}rJ(h,X:ref:`master-slave-updates`rKh-j8h.h1h3hYh5}rL(UreftypeXrefh[h\Xmaster-slave-updatesU refdomainXstdrMh:]h9]U refexplicith7]h8]h<]h^h_uh>K#h']rNh)rO}rP(h,jKh5}rQ(h7]h8]rR(hijMXstd-refrSeh9]h:]h<]uh-jIh']rThHXmaster-slave-updatesrUrV}rW(h,Uh-jOubah3hubaubhHX, for the updates that each command may send.rXrY}rZ(h,X, for the updates that each command may send.h-j8ubeubh)r[}r\(h,Uh-jh.h1h3hh5}r](h:]h9]h7]h8]h<]Uentries]r^(hX;active (buildbot.process.buildstep.RemoteCommand attribute)hUtr_auh>Nh?hh']ubh)r`}ra(h,Uh-jh.h1h3hh5}rb(hhXpyh:]h9]h7]h8]h<]hX attributerchjcuh>Nh?hh']rd(h)re}rf(h,Xactivergh-j`h.h1h3hh5}rh(h:]rihahhbh9]h7]h8]h<]rjhahXRemoteCommand.activehhhuh>K+h?hh']rkh)rl}rm(h,jgh-jeh.h1h3hh5}rn(h7]h8]h9]h:]h<]uh>K+h?hh']rohHXactiverprq}rr(h,Uh-jlubaubaubj)rs}rt(h,Uh-j`h.h1h3jh5}ru(h7]h8]h9]h:]h<]uh>K+h?hh']rvhL)rw}rx(h,X(True if the command is currently runningryh-jsh.h1h3hOh5}rz(h7]h8]h9]h:]h<]uh>K*h?hh']r{hHX(True if the command is currently runningr|r}}r~(h,jyh-jwubaubaubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hX7run() (buildbot.process.buildstep.RemoteCommand method)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,Xrun(step, remote)h-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.runhhhuh>K6h?hh']r(h)r}r(h,Xrunh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>K6h?hh']rhHXrunrr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>K6h?hh']r(h)r}r(h,Xsteph5}r(h7]h8]h9]h:]h<]uh-jh']rhHXsteprr}r(h,Uh-jubah3hubh)r}r(h,Xremoteh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXremoterr}r(h,Uh-jubah3hubeubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>K6h?hh']r(j)r}r(h,Uh-jh.h1h3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rj!)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j&)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xsteph5}r(h7]h8]h9]h:]h<]uh-jh']rhHXsteprr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHX#the buildstep invoking this commandrr}r(h,X#the buildstep invoking this commandrh-jubeh3hOubah3jQubj&)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xremoteh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXremoterr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXa reference to the remote rr}r(h,Xa reference to the remote h-jubhU)r}r(h,X:class:`SlaveBuilder`rh-jh.h1h3hYh5}r(UreftypeXclassh[h\X SlaveBuilderU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>K/h']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-classreh9]h:]h<]uh-jh']rhHX SlaveBuilderrr}r(h,Uh-jubah3houbaubhHX instancerr}r(h,X instanceh-jubeh3hOubah3jQubeh3jubah3jubeh3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXReturnsrr }r (h,Uh-jubah3jubj)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-j h']rhHXDeferredrr}r(h,XDeferredrh-jubah3hOubah3jubeh3jubeubhL)r}r(h,XRun the command. Call this method to initiate the command; the returned Deferred will fire when the command is complete. The Deferred fires with the :class:`RemoteCommand` instance as its value.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>K3h?hh']r(hHXRun the command. Call this method to initiate the command; the returned Deferred will fire when the command is complete. The Deferred fires with the rr}r(h,XRun the command. Call this method to initiate the command; the returned Deferred will fire when the command is complete. The Deferred fires with the h-jubhU)r}r(h,X:class:`RemoteCommand`r h-jh.h1h3hYh5}r!(UreftypeXclassh[h\X RemoteCommandU refdomainXpyr"h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>K3h']r#hd)r$}r%(h,j h5}r&(h7]h8]r'(hij"Xpy-classr(eh9]h:]h<]uh-jh']r)hHX RemoteCommandr*r+}r,(h,Uh-j$ubah3houbaubhHX instance as its value.r-r.}r/(h,X instance as its value.h-jubeubeubeubh)r0}r1(h,Uh-jh.h1h3hh5}r2(h:]h9]h7]h8]h<]Uentries]r3(hX=interrupt() (buildbot.process.buildstep.RemoteCommand method)hUtr4auh>Nh?hh']ubh)r5}r6(h,Uh-jh.h1h3hh5}r7(hhXpyr8h:]h9]h7]h8]h<]hXmethodr9hj9uh>Nh?hh']r:(h)r;}r<(h,Xinterrupt(why)h-j5h.h1h3hh5}r=(h:]r>hahhbh9]h7]h8]h<]r?hahXRemoteCommand.interrupthhhuh>KAh?hh']r@(h)rA}rB(h,X interrupth-j;h.h1h3hh5}rC(h7]h8]h9]h:]h<]uh>KAh?hh']rDhHX interruptrErF}rG(h,Uh-jAubaubh)rH}rI(h,Uh-j;h.h1h3hh5}rJ(h7]h8]h9]h:]h<]uh>KAh?hh']rKh)rL}rM(h,Xwhyh5}rN(h7]h8]h9]h:]h<]uh-jHh']rOhHXwhyrPrQ}rR(h,Uh-jLubah3hubaubeubj)rS}rT(h,Uh-j5h.h1h3jh5}rU(h7]h8]h9]h:]h<]uh>KAh?hh']rV(j)rW}rX(h,Uh-jSh.h1h3j h5}rY(h7]h8]h9]h:]h<]uh>Nh?hh']rZ(j)r[}r\(h,Uh5}r](h7]h8]h9]h:]h<]uh-jWh']r^(j)r_}r`(h,Uh5}ra(h7]h8]h9]h:]h<]uh-j[h']rbhHX Parametersrcrd}re(h,Uh-j_ubah3jubj)rf}rg(h,Uh5}rh(h7]h8]h9]h:]h<]uh-j[h']rihL)rj}rk(h,Uh5}rl(h7]h8]h9]h:]h<]uh-jfh']rm(j/)rn}ro(h,Xwhyh5}rp(h7]h8]h9]h:]h<]uh-jjh']rqhHXwhyrrrs}rt(h,Uh-jnubah3j7ubhHX (rurv}rw(h,Uh-jjubhU)rx}ry(h,Uh5}rz(Ureftypej>U reftargetXTwisted Failurer{U refdomainj8h:]h9]U refexplicith7]h8]h<]uh-jjh']r|h)r}}r~(h,j{h5}r(h7]h8]h9]h:]h<]uh-jxh']rhHXTwisted Failurerr}r(h,Uh-j}ubah3hubah3hYubhHX)r}r(h,Uh-jjubhHX -- rr}r(h,Uh-jjubhHXreason for interruptrr}r(h,Xreason for interrupth-jjubeh3hOubah3jubeh3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jWh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXReturnsrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXDeferredrr}r(h,XDeferredh-jubah3hOubah3jubeh3jubeubhL)r}r(h,X This method attempts to stop the running command early. The Deferred it returns will fire when the interrupt request is received by the slave; this may be a long time before the command itself completes, at which time the Deferred returned from :meth:`run` will fire.h-jSh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>K=h?hh']r(hHXThis method attempts to stop the running command early. The Deferred it returns will fire when the interrupt request is received by the slave; this may be a long time before the command itself completes, at which time the Deferred returned from rr}r(h,XThis method attempts to stop the running command early. The Deferred it returns will fire when the interrupt request is received by the slave; this may be a long time before the command itself completes, at which time the Deferred returned from h-jubhU)r}r(h,X :meth:`run`rh-jh.h1h3hYh5}r(UreftypeXmethh[h\XrunU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>K=h']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-methreh9]h:]h<]uh-jh']rhHXrunrr}r(h,Uh-jubah3houbaubhHX will fire.rr}r(h,X will fire.h-jubeubeubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hX;results() (buildbot.process.buildstep.RemoteCommand method)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,X results()h-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.resultshhhuh>KGh?hh']r(h)r}r(h,Xresultsh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>KGh?hh']rhHXresultsrr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>KGh?hh']ubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>KGh?hh']r(j)r}r(h,Uh-jh.h1h3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXReturnsrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXresults constantrr}r(h,Xresults constantrh-jubah3hOubah3jubeh3jubaubhL)r}r(h,X[This method checks the ``rc`` against the decodeRC dictionary, and returns results constanth-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>KFh?hh']r(hHXThis method checks the rr}r(h,XThis method checks the h-jubhd)r}r(h,X``rc``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXrcrr}r(h,Uh-jubah3houbhHX> against the decodeRC dictionary, and returns results constantrr}r(h,X> against the decodeRC dictionary, and returns results constanth-jubeubeubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hX;didFail() (buildbot.process.buildstep.RemoteCommand method)h Utr auh>Nh?hh']ubh)r }r (h,Uh-jh.h1h3hh5}r (hhXpyh:]h9]h7]h8]h<]hXmethodr hj uh>Nh?hh']r(h)r}r(h,X didFail()h-j h.h1h3hh5}r(h:]rh ahhbh9]h7]h8]h<]rh ahXRemoteCommand.didFailhhhuh>KMh?hh']r(h)r}r(h,XdidFailh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>KMh?hh']rhHXdidFailrr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>KMh?hh']ubeubj)r}r (h,Uh-j h.h1h3jh5}r!(h7]h8]h9]h:]h<]uh>KMh?hh']r"(j)r#}r$(h,Uh-jh.h1h3j h5}r%(h7]h8]h9]h:]h<]uh>Nh?hh']r&j)r'}r((h,Uh5}r)(h7]h8]h9]h:]h<]uh-j#h']r*(j)r+}r,(h,Uh5}r-(h7]h8]h9]h:]h<]uh-j'h']r.hHXReturnsr/r0}r1(h,Uh-j+ubah3jubj)r2}r3(h,Uh5}r4(h7]h8]h9]h:]h<]uh-j'h']r5hL)r6}r7(h,Uh5}r8(h7]h8]h9]h:]h<]uh-j2h']r9hHXboolr:r;}r<(h,Xboolh-j6ubah3hOubah3jubeh3jubaubhL)r=}r>(h,XBThis method returns True if the results() function returns FAILUREr?h-jh.h1h3hOh5}r@(h7]h8]h9]h:]h<]uh>KLh?hh']rAhHXBThis method returns True if the results() function returns FAILURErBrC}rD(h,j?h-j=ubaubeubeubhL)rE}rF(h,XVThe following methods are invoked from the slave. They should not be called directly.rGh-jh.h1h3hOh5}rH(h7]h8]h9]h:]h<]uh>KNh?hh']rIhHXVThe following methods are invoked from the slave. They should not be called directly.rJrK}rL(h,jGh-jEubaubh)rM}rN(h,Uh-jh.h1h3hh5}rO(h:]h9]h7]h8]h<]Uentries]rP(hXAremote_update() (buildbot.process.buildstep.RemoteCommand method)hUtrQauh>Nh?hh']ubh)rR}rS(h,Uh-jh.h1h3hh5}rT(hhXpyh:]h9]h7]h8]h<]hXmethodrUhjUuh>Nh?hh']rV(h)rW}rX(h,Xremote_update(updates)h-jRh.h1h3hh5}rY(h:]rZhahhbh9]h7]h8]h<]r[hahXRemoteCommand.remote_updatehhhuh>KYh?hh']r\(h)r]}r^(h,X remote_updateh-jWh.h1h3hh5}r_(h7]h8]h9]h:]h<]uh>KYh?hh']r`hHX remote_updaterarb}rc(h,Uh-j]ubaubh)rd}re(h,Uh-jWh.h1h3hh5}rf(h7]h8]h9]h:]h<]uh>KYh?hh']rgh)rh}ri(h,Xupdatesh5}rj(h7]h8]h9]h:]h<]uh-jdh']rkhHXupdatesrlrm}rn(h,Uh-jhubah3hubaubeubj)ro}rp(h,Uh-jRh.h1h3jh5}rq(h7]h8]h9]h:]h<]uh>KYh?hh']rr(j)rs}rt(h,Uh-joh.h1h3j h5}ru(h7]h8]h9]h:]h<]uh>Nh?hh']rvj)rw}rx(h,Uh5}ry(h7]h8]h9]h:]h<]uh-jsh']rz(j)r{}r|(h,Uh5}r}(h7]h8]h9]h:]h<]uh-jwh']r~hHX Parametersrr}r(h,Uh-j{ubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jwh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xupdatesh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXupdatesrr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXnew information from the slaverr}r(h,Xnew information from the slaverh-jubeh3hOubah3jubeh3jubaubhL)r}r(h,XHandles updates from the slave on the running command. See :ref:`master-slave-updates` for the content of the updates. This class splits the updates out, and handles the ``ignore_updates`` option, then calls :meth:`remoteUpdate` to process the update.h-joh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>KUh?hh']r(hHX<Handles updates from the slave on the running command. See rr}r(h,X<Handles updates from the slave on the running command. See h-jubhU)r}r(h,X:ref:`master-slave-updates`rh-jh.h1h3hYh5}r(UreftypeXrefh[h\Xmaster-slave-updatesU refdomainXstdrh:]h9]U refexplicith7]h8]h<]h^h_uh>KUh']rh)r}r(h,jh5}r(h7]h8]r(hijXstd-refreh9]h:]h<]uh-jh']rhHXmaster-slave-updatesrr}r(h,Uh-jubah3hubaubhHXU for the content of the updates. This class splits the updates out, and handles the rr}r(h,XU for the content of the updates. This class splits the updates out, and handles the h-jubhd)r}r(h,X``ignore_updates``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXignore_updatesrr}r(h,Uh-jubah3houbhHX option, then calls rr}r(h,X option, then calls h-jubhU)r}r(h,X:meth:`remoteUpdate`rh-jh.h1h3hYh5}r(UreftypeXmethh[h\X remoteUpdateU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>KUh']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-methreh9]h:]h<]uh-jh']rhHX remoteUpdaterr}r(h,Uh-jubah3houbaubhHX to process the update.rr}r(h,X to process the update.h-jubeubeubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hXCremote_complete() (buildbot.process.buildstep.RemoteCommand method)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,Xremote_complete(failure=None)h-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.remote_completehhhuh>Kch?hh']r(h)r}r(h,Xremote_completeh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kch?hh']rhHXremote_completerr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kch?hh']rh)r}r(h,X failure=Noneh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX failure=Nonerr}r(h,Uh-jubah3hubaubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>Kch?hh']r(j)r}r(h,Uh-jh.h1h3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r (j/)r }r (h,Xfailureh5}r (h7]h8]h9]h:]h<]uh-jh']r hHXfailurerr}r(h,Uh-j ubah3j7ubhHX -- rr}r(h,Uh-jubhHXAthe failure that caused the step to complete, or None for successrr}r(h,XAthe failure that caused the step to complete, or None for successh-jubeh3hOubah3jubeh3jubaubhL)r}r(h,XCalled by the slave to indicate that the command is complete. Normal completion (even with a nonzero ``rc``) will finish with no failure; if ``failure`` is set, then the step should finish with status :attr:`~buildbot.status.results.EXCEPTION`.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>K_h?hh']r(hHXfCalled by the slave to indicate that the command is complete. Normal completion (even with a nonzero rr}r(h,XfCalled by the slave to indicate that the command is complete. Normal completion (even with a nonzero h-jubhd)r}r(h,X``rc``h5}r (h7]h8]h9]h:]h<]uh-jh']r!hHXrcr"r#}r$(h,Uh-jubah3houbhHX") will finish with no failure; if r%r&}r'(h,X") will finish with no failure; if h-jubhd)r(}r)(h,X ``failure``h5}r*(h7]h8]h9]h:]h<]uh-jh']r+hHXfailurer,r-}r.(h,Uh-j(ubah3houbhHX1 is set, then the step should finish with status r/r0}r1(h,X1 is set, then the step should finish with status h-jubhU)r2}r3(h,X*:attr:`~buildbot.status.results.EXCEPTION`r4h-jh.h1h3hYh5}r5(UreftypeXattrh[h\X!buildbot.status.results.EXCEPTIONU refdomainXpyr6h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>K_h']r7hd)r8}r9(h,j4h5}r:(h7]h8]r;(hij6Xpy-attrr<eh9]h:]h<]uh-j2h']r=hHX EXCEPTIONr>r?}r@(h,Uh-j8ubah3houbaubhHX.rA}rB(h,X.h-jubeubeubeubhL)rC}rD(h,X<These methods are hooks for subclasses to add functionality.rEh-jh.h1h3hOh5}rF(h7]h8]h9]h:]h<]uh>Kdh?hh']rGhHX<These methods are hooks for subclasses to add functionality.rHrI}rJ(h,jEh-jCubaubh)rK}rL(h,Uh-jh.h1h3hh5}rM(h:]h9]h7]h8]h<]Uentries]rN(hX@remoteUpdate() (buildbot.process.buildstep.RemoteCommand method)hUtrOauh>Nh?hh']ubh)rP}rQ(h,Uh-jh.h1h3hh5}rR(hhXpyh:]h9]h7]h8]h<]hXmethodrShjSuh>Nh?hh']rT(h)rU}rV(h,XremoteUpdate(update)h-jPh.h1h3hh5}rW(h:]rXhahhbh9]h7]h8]h<]rYhahXRemoteCommand.remoteUpdatehhhuh>Kkh?hh']rZ(h)r[}r\(h,X remoteUpdateh-jUh.h1h3hh5}r](h7]h8]h9]h:]h<]uh>Kkh?hh']r^hHX remoteUpdater_r`}ra(h,Uh-j[ubaubh)rb}rc(h,Uh-jUh.h1h3hh5}rd(h7]h8]h9]h:]h<]uh>Kkh?hh']reh)rf}rg(h,Xupdateh5}rh(h7]h8]h9]h:]h<]uh-jbh']rihHXupdaterjrk}rl(h,Uh-jfubah3hubaubeubj)rm}rn(h,Uh-jPh.h1h3jh5}ro(h7]h8]h9]h:]h<]uh>Kkh?hh']rp(j)rq}rr(h,Uh-jmh.h1h3j h5}rs(h7]h8]h9]h:]h<]uh>Nh?hh']rtj)ru}rv(h,Uh5}rw(h7]h8]h9]h:]h<]uh-jqh']rx(j)ry}rz(h,Uh5}r{(h7]h8]h9]h:]h<]uh-juh']r|hHX Parametersr}r~}r(h,Uh-jyubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-juh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xupdateh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXupdaterr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXthe update to handlerr}r(h,Xthe update to handlerh-jubeh3hOubah3jubeh3jubaubhL)r}r(h,X>Handle a single update. Subclasses must override this method.rh-jmh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kjh?hh']rhHX>Handle a single update. Subclasses must override this method.rr}r(h,jh-jubaubeubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hXBremoteComplete() (buildbot.process.buildstep.RemoteCommand method)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,XremoteComplete(failure)h-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.remoteCompletehhhuh>Kuh?hh']r(h)r}r(h,XremoteCompleteh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kuh?hh']rhHXremoteCompleterr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kuh?hh']rh)r}r(h,Xfailureh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXfailurerr}r(h,Uh-jubah3hubaubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>Kuh?hh']r(j)r}r(h,Uh-jh.h1h3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xfailureh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXfailurerr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXAthe failure that caused the step to complete, or None for successrr}r(h,XAthe failure that caused the step to complete, or None for successrh-jubeh3hOubah3jubeh3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXReturnsrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXDeferredrr}r(h,XDeferredrh-jubah3hOubah3jubeh3jubeubhL)r}r(h,XHandle command completion, performing any necessary cleanup. Subclasses should override this method. If ``failure`` is not None, it should be returned to ensure proper processing.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Krh?hh']r(hHXiHandle command completion, performing any necessary cleanup. Subclasses should override this method. If rr}r(h,XiHandle command completion, performing any necessary cleanup. Subclasses should override this method. If h-jubhd)r}r(h,X ``failure``h5}r (h7]h8]h9]h:]h<]uh-jh']r hHXfailurer r }r (h,Uh-jubah3houbhHX@ is not None, it should be returned to ensure proper processing.rr}r(h,X@ is not None, it should be returned to ensure proper processing.h-jubeubeubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hX9logs (buildbot.process.buildstep.RemoteCommand attribute)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hX attributerhjuh>Nh?hh']r(h)r}r(h,Xlogsrh-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]r hahXRemoteCommand.logshhhuh>K{h?hh']r!h)r"}r#(h,jh-jh.h1h3hh5}r$(h7]h8]h9]h:]h<]uh>K{h?hh']r%hHXlogsr&r'}r((h,Uh-j"ubaubaubj)r)}r*(h,Uh-jh.h1h3jh5}r+(h7]h8]h9]h:]h<]uh>K{h?hh']r,hL)r-}r.(h,XA dictionary of :class:`~buildbot.status.logfile.LogFile` instances representing active logs. Do not modify this directly -- use :meth:`useLog` instead.h-j)h.h1h3hOh5}r/(h7]h8]h9]h:]h<]uh>Kxh?hh']r0(hHXA dictionary of r1r2}r3(h,XA dictionary of h-j-ubhU)r4}r5(h,X):class:`~buildbot.status.logfile.LogFile`r6h-j-h.h1h3hYh5}r7(UreftypeXclassh[h\Xbuildbot.status.logfile.LogFileU refdomainXpyr8h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kxh']r9hd)r:}r;(h,j6h5}r<(h7]h8]r=(hij8Xpy-classr>eh9]h:]h<]uh-j4h']r?hHXLogFiler@rA}rB(h,Uh-j:ubah3houbaubhHXI instances representing active logs. Do not modify this directly -- use rCrD}rE(h,XI instances representing active logs. Do not modify this directly -- use h-j-ubhU)rF}rG(h,X:meth:`useLog`rHh-j-h.h1h3hYh5}rI(UreftypeXmethh[h\XuseLogU refdomainXpyrJh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kxh']rKhd)rL}rM(h,jHh5}rN(h7]h8]rO(hijJXpy-methrPeh9]h:]h<]uh-jFh']rQhHXuseLogrRrS}rT(h,Uh-jLubah3houbaubhHX instead.rUrV}rW(h,X instead.h-j-ubeubaubeubh)rX}rY(h,Uh-jh.h1h3hh5}rZ(h:]h9]h7]h8]h<]Uentries]r[(hX7rc (buildbot.process.buildstep.RemoteCommand attribute)hUtr\auh>Nh?hh']ubh)r]}r^(h,Uh-jh.h1h3hh5}r_(hhXpyh:]h9]h7]h8]h<]hX attributer`hj`uh>Nh?hh']ra(h)rb}rc(h,Xrcrdh-j]h.h1h3hh5}re(h:]rfhahhbh9]h7]h8]h<]rghahXRemoteCommand.rchhhuh>Kh?hh']rhh)ri}rj(h,jdh-jbh.h1h3hh5}rk(h7]h8]h9]h:]h<]uh>Kh?hh']rlhHXrcrmrn}ro(h,Uh-jiubaubaubj)rp}rq(h,Uh-j]h.h1h3jh5}rr(h7]h8]h9]h:]h<]uh>Kh?hh']rshL)rt}ru(h,XSet to the return code of the command, after the command has completed. For compatibility with shell commands, 0 is taken to indicate success, while nonzero return codes indicate failure.rvh-jph.h1h3hOh5}rw(h7]h8]h9]h:]h<]uh>K~h?hh']rxhHXSet to the return code of the command, after the command has completed. For compatibility with shell commands, 0 is taken to indicate success, while nonzero return codes indicate failure.ryrz}r{(h,jvh-jtubaubaubeubh)r|}r}(h,Uh-jh.h1h3hh5}r~(h:]h9]h7]h8]h<]Uentries]r(hX;stdout (buildbot.process.buildstep.RemoteCommand attribute)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hX attributerhjuh>Nh?hh']r(h)r}r(h,Xstdoutrh-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.stdouthhhuh>Kh?hh']rh)r}r(h,jh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXstdoutrr}r(h,Uh-jubaubaubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhL)r}r(h,X@If the ``collectStdout`` constructor argument is true, then this attribute will contain all data from stdout, as a single string. This is helpful when running informational commands (e.g., ``svnversion``), but is not appropriate for commands that will produce a large amount of output, as that output is held in memory.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXIf the rr}r(h,XIf the h-jubhd)r}r(h,X``collectStdout``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHX collectStdoutrr}r(h,Uh-jubah3houbhHX constructor argument is true, then this attribute will contain all data from stdout, as a single string. This is helpful when running informational commands (e.g., rr}r(h,X constructor argument is true, then this attribute will contain all data from stdout, as a single string. This is helpful when running informational commands (e.g., h-jubhd)r}r(h,X``svnversion``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHX svnversionrr}r(h,Uh-jubah3houbhHXt), but is not appropriate for commands that will produce a large amount of output, as that output is held in memory.rr}r(h,Xt), but is not appropriate for commands that will produce a large amount of output, as that output is held in memory.h-jubeubaubeubhL)r}r(h,X[To set up logging, use :meth:`useLog` or :meth:`useLogDelayed` before starting the command:h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXTo set up logging, use rr}r(h,XTo set up logging, use h-jubhU)r}r(h,X:meth:`useLog`rh-jh.h1h3hYh5}r(UreftypeXmethh[h\XuseLogU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-methreh9]h:]h<]uh-jh']rhHXuseLogrr}r(h,Uh-jubah3houbaubhHX or rr}r(h,X or h-jubhU)r}r(h,X:meth:`useLogDelayed`rh-jh.h1h3hYh5}r(UreftypeXmethh[h\X useLogDelayedU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-methreh9]h:]h<]uh-jh']rhHX useLogDelayedrr}r(h,Uh-jubah3houbaubhHX before starting the command:rr}r(h,X before starting the command:h-jubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hX:useLog() (buildbot.process.buildstep.RemoteCommand method)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,X6useLog(log, closeWhenFinished=False, logfileName=None)h-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.useLoghhhuh>Kh?hh']r(h)r}r(h,XuseLogh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXuseLogrr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(h)r}r(h,Xlogh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXlogrr}r(h,Uh-jubah3hubh)r}r(h,XcloseWhenFinished=Falseh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXcloseWhenFinished=Falserr}r(h,Uh-jubah3hubh)r}r(h,XlogfileName=Noneh5}r (h7]h8]h9]h:]h<]uh-jh']r hHXlogfileName=Noner r }r (h,Uh-jubah3hubeubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(j)r}r(h,Uh-jh.h1h3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r (h,Uh-jubah3jubj)r!}r"(h,Uh5}r#(h7]h8]h9]h:]h<]uh-jh']r$j!)r%}r&(h,Uh5}r'(h7]h8]h9]h:]h<]uh-j!h']r((j&)r)}r*(h,Uh5}r+(h7]h8]h9]h:]h<]uh-j%h']r,hL)r-}r.(h,Uh5}r/(h7]h8]h9]h:]h<]uh-j)h']r0(j/)r1}r2(h,Xlogh5}r3(h7]h8]h9]h:]h<]uh-j-h']r4hHXlogr5r6}r7(h,Uh-j1ubah3j7ubhHX -- r8r9}r:(h,Uh-j-ubhHXthe r;r<}r=(h,Xthe h-j-ubhU)r>}r?(h,X):class:`~buildbot.status.logfile.LogFile`r@h-j-h.h1h3hYh5}rA(UreftypeXclassh[h\Xbuildbot.status.logfile.LogFileU refdomainXpyrBh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rChd)rD}rE(h,j@h5}rF(h7]h8]rG(hijBXpy-classrHeh9]h:]h<]uh-j>h']rIhHXLogFilerJrK}rL(h,Uh-jDubah3houbaubhHX instance to add to.rMrN}rO(h,X instance to add to.h-j-ubeh3hOubah3jQubj&)rP}rQ(h,Uh5}rR(h7]h8]h9]h:]h<]uh-j%h']rShL)rT}rU(h,Uh5}rV(h7]h8]h9]h:]h<]uh-jPh']rW(j/)rX}rY(h,XcloseWhenFinishedh5}rZ(h7]h8]h9]h:]h<]uh-jTh']r[hHXcloseWhenFinishedr\r]}r^(h,Uh-jXubah3j7ubhHX -- r_r`}ra(h,Uh-jTubhHXif true, call rbrc}rd(h,Xif true, call h-jTubhU)re}rf(h,X/:meth:`~buildbot.status.logfile.LogFile.finish`rgh-jTh.h1h3hYh5}rh(UreftypeXmethh[h\X&buildbot.status.logfile.LogFile.finishU refdomainXpyrih:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rjhd)rk}rl(h,jgh5}rm(h7]h8]rn(hijiXpy-methroeh9]h:]h<]uh-jeh']rphHXfinishrqrr}rs(h,Uh-jkubah3houbaubhHX when the command is finished.rtru}rv(h,X when the command is finished.h-jTubeh3hOubah3jQubj&)rw}rx(h,Uh5}ry(h7]h8]h9]h:]h<]uh-j%h']rzhL)r{}r|(h,Uh5}r}(h7]h8]h9]h:]h<]uh-jwh']r~(j/)r}r(h,X logfileNameh5}r(h7]h8]h9]h:]h<]uh-j{h']rhHX logfileNamerr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-j{ubhHX8the name of the logfile, as given to the slave. This is rr}r(h,X8the name of the logfile, as given to the slave. This is h-j{ubhd)r}r(h,X ``stdio``h5}r(h7]h8]h9]h:]h<]uh-j{h']rhHXstdiorr}r(h,Uh-jubah3houbhHX for standard streams.rr}r(h,X for standard streams.h-j{ubeh3hOubah3jQubeh3jubah3jubeh3jubaubhL)r}r(h,XRoute log-related updates to the given logfile. Note that ``stdio`` is not included by default, and must be added explicitly. The ``logfileName`` must match the name given by the slave in any ``log`` updates.h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHX;Route log-related updates to the given logfile. Note that rr}r(h,X;Route log-related updates to the given logfile. Note that h-jubhd)r}r(h,X ``stdio``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXstdiorr}r(h,Uh-jubah3houbhHX@ is not included by default, and must be added explicitly. The rr}r(h,X@ is not included by default, and must be added explicitly. The h-jubhd)r}r(h,X``logfileName``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHX logfileNamerr}r(h,Uh-jubah3houbhHX/ must match the name given by the slave in any rr}r(h,X/ must match the name given by the slave in any h-jubhd)r}r(h,X``log``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXlogrr}r(h,Uh-jubah3houbhHX updates.rr}r(h,X updates.h-jubeubeubeubh)r}r(h,Uh-jh.h1h3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hXAuseLogDelayed() (buildbot.process.buildstep.RemoteCommand method)h Utrauh>Nh?hh']ubh)r}r(h,Uh-jh.h1h3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,XEuseLogDelayed(logfileName, activateCallback, closeWhenFinished=False)h-jh.h1h3hh5}r(h:]rh ahhbh9]h7]h8]h<]rh ahXRemoteCommand.useLogDelayedhhhuh>Kh?hh']r(h)r}r(h,X useLogDelayedh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHX useLogDelayedrr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(h)r}r(h,X logfileNameh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX logfileNamerr}r(h,Uh-jubah3hubh)r}r(h,XactivateCallbackh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXactivateCallbackrr}r(h,Uh-jubah3hubh)r}r(h,XcloseWhenFinished=Falseh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXcloseWhenFinished=Falserr}r(h,Uh-jubah3hubeubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(j)r}r(h,Uh-jh.h1h3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rj!)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j&)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-jh']r (j/)r}r(h,X logfileNameh5}r(h7]h8]h9]h:]h<]uh-j h']rhHX logfileNamerr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-j ubhHX8the name of the logfile, as given to the slave. This is rr}r(h,X8the name of the logfile, as given to the slave. This is h-j ubhd)r}r(h,X ``stdio``h5}r(h7]h8]h9]h:]h<]uh-j h']rhHXstdiorr }r!(h,Uh-jubah3houbhHX for standard streams.r"r#}r$(h,X for standard streams.h-j ubeh3hOubah3jQubj&)r%}r&(h,Uh5}r'(h7]h8]h9]h:]h<]uh-jh']r(hL)r)}r*(h,Uh5}r+(h7]h8]h9]h:]h<]uh-j%h']r,(j/)r-}r.(h,XactivateCallbackh5}r/(h7]h8]h9]h:]h<]uh-j)h']r0hHXactivateCallbackr1r2}r3(h,Uh-j-ubah3j7ubhHX -- r4r5}r6(h,Uh-j)ubhHX-callback for when the log is added; see belowr7r8}r9(h,X-callback for when the log is added; see belowh-j)ubeh3hOubah3jQubj&)r:}r;(h,Uh5}r<(h7]h8]h9]h:]h<]uh-jh']r=hL)r>}r?(h,Uh5}r@(h7]h8]h9]h:]h<]uh-j:h']rA(j/)rB}rC(h,XcloseWhenFinishedh5}rD(h7]h8]h9]h:]h<]uh-j>h']rEhHXcloseWhenFinishedrFrG}rH(h,Uh-jBubah3j7ubhHX -- rIrJ}rK(h,Uh-j>ubhHXif true, call rLrM}rN(h,Xif true, call h-j>ubhU)rO}rP(h,X/:meth:`~buildbot.status.logfile.LogFile.finish`rQh-j>h.h1h3hYh5}rR(UreftypeXmethh[h\X&buildbot.status.logfile.LogFile.finishU refdomainXpyrSh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rThd)rU}rV(h,jQh5}rW(h7]h8]rX(hijSXpy-methrYeh9]h:]h<]uh-jOh']rZhHXfinishr[r\}r](h,Uh-jUubah3houbaubhHX when the command is finished.r^r_}r`(h,X when the command is finished.h-j>ubeh3hOubah3jQubeh3jubah3jubeh3jubaubhL)ra}rb(h,X Similar to :meth:`useLog`, but the logfile is only actually added when an update arrives for it. The callback, ``activateCallback``, will be called with the :class:`~buildbot.process.buildstep.RemoteCommand` instance when the first update for the log is delivered.h-jh.h1h3hOh5}rc(h7]h8]h9]h:]h<]uh>Kh?hh']rd(hHX Similar to rerf}rg(h,X Similar to h-jaubhU)rh}ri(h,X:meth:`useLog`rjh-jah.h1h3hYh5}rk(UreftypeXmethh[h\XuseLogU refdomainXpyrlh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rmhd)rn}ro(h,jjh5}rp(h7]h8]rq(hijlXpy-methrreh9]h:]h<]uh-jhh']rshHXuseLogrtru}rv(h,Uh-jnubah3houbaubhHXW, but the logfile is only actually added when an update arrives for it. The callback, rwrx}ry(h,XW, but the logfile is only actually added when an update arrives for it. The callback, h-jaubhd)rz}r{(h,X``activateCallback``h5}r|(h7]h8]h9]h:]h<]uh-jah']r}hHXactivateCallbackr~r}r(h,Uh-jzubah3houbhHX, will be called with the rr}r(h,X, will be called with the h-jaubhU)r}r(h,X2:class:`~buildbot.process.buildstep.RemoteCommand`rh-jah.h1h3hYh5}r(UreftypeXclassh[h\X(buildbot.process.buildstep.RemoteCommandU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-classreh9]h:]h<]uh-jh']rhHX RemoteCommandrr}r(h,Uh-jubah3houbaubhHX9 instance when the first update for the log is delivered.rr}r(h,X9 instance when the first update for the log is delivered.h-jaubeubeubeubhL)r}r(h,XWith that finished, run the command using the inherited :meth:`~buildbot.process.buildstep.RemoteCommand.run` method. During the run, you can inject data into the logfiles with any of these methods:h-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHX8With that finished, run the command using the inherited rr}r(h,X8With that finished, run the command using the inherited h-jubhU)r}r(h,X5:meth:`~buildbot.process.buildstep.RemoteCommand.run`rh-jh.h1h3hYh5}r(UreftypeXmethh[h\X,buildbot.process.buildstep.RemoteCommand.runU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rhd)r}r(h,jh5}r(h7]h8]r(hijXpy-methreh9]h:]h<]uh-jh']rhHXrunrr}r(h,Uh-jubah3houbaubhHXZ method. During the run, you can inject data into the logfiles with any of these methods:rr}r(h,XZ method. During the run, you can inject data into the logfiles with any of these methods:h-jubeubh)r}r(h,Uh-jh.Nh3hh5}r(h:]h9]h7]h8]h<]Uentries]r(hX=addStdout() (buildbot.process.buildstep.RemoteCommand method)hUtrauh>Nh?hh']ubh)r}r(h,Uh-jh.Nh3hh5}r(hhXpyh:]h9]h7]h8]h<]hXmethodrhjuh>Nh?hh']r(h)r}r(h,XaddStdout(data)h-jh.h1h3hh5}r(h:]rhahhbh9]h7]h8]h<]rhahXRemoteCommand.addStdouthhhuh>Kh?hh']r(h)r}r(h,X addStdouth-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHX addStdoutrr}r(h,Uh-jubaubh)r}r(h,Uh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rh)r}r(h,Xdatah5}r(h7]h8]h9]h:]h<]uh-jh']rhHXdatarr}r(h,Uh-jubah3hubaubeubj)r}r(h,Uh-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rj)r}r(h,Uh-jh.Nh3j h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhHX Parametersrr}r(h,Uh-jubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']r(j/)r}r(h,Xdatah5}r(h7]h8]h9]h:]h<]uh-jh']rhHXdatarr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXdata to add to the logfilerr}r(h,Xdata to add to the logfileh-jubeh3hOubah3jubeh3jubaubaubeubhL)r}r(h,X%Add stdout data to the ``stdio`` log.rh-jh.h1h3hOh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXAdd stdout data to the rr}r (h,XAdd stdout data to the h-jubhd)r }r (h,X ``stdio``h5}r (h7]h8]h9]h:]h<]uh-jh']r hHXstdior r }r (h,Uh-j ubah3houbhHX log.r r }r (h,X log.h-jubeubh)r }r (h,Uh-jh.Nh3hh5}r (h:]h9]h7]h8]h<]Uentries]r (hX=addStderr() (buildbot.process.buildstep.RemoteCommand method)hUtr auh>Nh?hh']ubh)r }r (h,Uh-jh.Nh3hh5}r (hhXpyh:]h9]h7]h8]h<]hXmethodr hj uh>Nh?hh']r (h)r }r (h,XaddStderr(data)h-j h.h1h3hh5}r (h:]r hahhbh9]h7]h8]h<]r hahXRemoteCommand.addStderrhhhuh>Kh?hh']r (h)r }r (h,X addStderrh-j h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r hHX addStderrr r }r! (h,Uh-j ubaubh)r" }r# (h,Uh-j h.h1h3hh5}r$ (h7]h8]h9]h:]h<]uh>Kh?hh']r% h)r& }r' (h,Xdatah5}r( (h7]h8]h9]h:]h<]uh-j" h']r) hHXdatar* r+ }r, (h,Uh-j& ubah3hubaubeubj)r- }r. (h,Uh-j h.h1h3jh5}r/ (h7]h8]h9]h:]h<]uh>Kh?hh']r0 j)r1 }r2 (h,Uh-j- h.Nh3j h5}r3 (h7]h8]h9]h:]h<]uh>Nh?hh']r4 j)r5 }r6 (h,Uh5}r7 (h7]h8]h9]h:]h<]uh-j1 h']r8 (j)r9 }r: (h,Uh5}r; (h7]h8]h9]h:]h<]uh-j5 h']r< hHX Parametersr= r> }r? (h,Uh-j9 ubah3jubj)r@ }rA (h,Uh5}rB (h7]h8]h9]h:]h<]uh-j5 h']rC hL)rD }rE (h,Uh5}rF (h7]h8]h9]h:]h<]uh-j@ h']rG (j/)rH }rI (h,Xdatah5}rJ (h7]h8]h9]h:]h<]uh-jD h']rK hHXdatarL rM }rN (h,Uh-jH ubah3j7ubhHX -- rO rP }rQ (h,Uh-jD ubhHXdata to add to the logfilerR rS }rT (h,Xdata to add to the logfileh-jD ubeh3hOubah3jubeh3jubaubaubeubhL)rU }rV (h,X%Add stderr data to the ``stdio`` log.rW h-jh.h1h3hOh5}rX (h7]h8]h9]h:]h<]uh>Kh?hh']rY (hHXAdd stderr data to the rZ r[ }r\ (h,XAdd stderr data to the h-jU ubhd)r] }r^ (h,X ``stdio``h5}r_ (h7]h8]h9]h:]h<]uh-jU h']r` hHXstdiora rb }rc (h,Uh-j] ubah3houbhHX log.rd re }rf (h,X log.h-jU ubeubh)rg }rh (h,Uh-jh.Nh3hh5}ri (h:]h9]h7]h8]h<]Uentries]rj (hX=addHeader() (buildbot.process.buildstep.RemoteCommand method)hUtrk auh>Nh?hh']ubh)rl }rm (h,Uh-jh.Nh3hh5}rn (hhXpyh:]h9]h7]h8]h<]hXmethodro hjo uh>Nh?hh']rp (h)rq }rr (h,XaddHeader(data)h-jl h.h1h3hh5}rs (h:]rt hahhbh9]h7]h8]h<]ru hahXRemoteCommand.addHeaderhhhuh>Kh?hh']rv (h)rw }rx (h,X addHeaderh-jq h.h1h3hh5}ry (h7]h8]h9]h:]h<]uh>Kh?hh']rz hHX addHeaderr{ r| }r} (h,Uh-jw ubaubh)r~ }r (h,Uh-jq h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r h)r }r (h,Xdatah5}r (h7]h8]h9]h:]h<]uh-j~ h']r hHXdatar r }r (h,Uh-j ubah3hubaubeubj)r }r (h,Uh-jl h.h1h3jh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r j)r }r (h,Uh-j h.Nh3j h5}r (h7]h8]h9]h:]h<]uh>Nh?hh']r j)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hHX Parametersr r }r (h,Uh-j ubah3jubj)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,Xdatah5}r (h7]h8]h9]h:]h<]uh-j h']r hHXdatar r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHXdata to add to the logfiler r }r (h,Xdata to add to the logfileh-j ubeh3hOubah3jubeh3jubaubaubeubhL)r }r (h,X%Add header data to the ``stdio`` log.r h-jh.h1h3hOh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r (hHXAdd header data to the r r }r (h,XAdd header data to the h-j ubhd)r }r (h,X ``stdio``h5}r (h7]h8]h9]h:]h<]uh-j h']r hHXstdior r }r (h,Uh-j ubah3houbhHX log.r r }r (h,X log.h-j ubeubh)r }r (h,Uh-jh.Nh3hh5}r (h:]h9]h7]h8]h<]Uentries]r (hX<addToLog() (buildbot.process.buildstep.RemoteCommand method)h Utr auh>Nh?hh']ubh)r }r (h,Uh-jh.Nh3hh5}r (hhXpyh:]h9]h7]h8]h<]hXmethodr hj uh>Nh?hh']r (h)r }r (h,XaddToLog(logname, data)h-j h.h1h3hh5}r (h:]r h ahhbh9]h7]h8]h<]r h ahXRemoteCommand.addToLoghhhuh>Kh?hh']r (h)r }r (h,XaddToLogh-j h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r hHXaddToLogr r }r (h,Uh-j ubaubh)r }r (h,Uh-j h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r (h)r }r (h,Xlognameh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXlognamer r }r (h,Uh-j ubah3hubh)r }r (h,Xdatah5}r (h7]h8]h9]h:]h<]uh-j h']r hHXdatar r }r (h,Uh-j ubah3hubeubeubj)r }r (h,Uh-j h.h1h3jh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r j)r }r (h,Uh-j h.Nh3j h5}r (h7]h8]h9]h:]h<]uh>Nh?hh']r j)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hHX Parametersr r }r (h,Uh-j ubah3jubj)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r j!)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,Xlognameh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXlognamer r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHXthe logfile to receive the datar r }r (h,Xthe logfile to receive the datar h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r! }r" (h,Uh5}r# (h7]h8]h9]h:]h<]uh-j h']r$ (j/)r% }r& (h,Xdatah5}r' (h7]h8]h9]h:]h<]uh-j! h']r( hHXdatar) r* }r+ (h,Uh-j% ubah3j7ubhHX -- r, r- }r. (h,Uh-j! ubhHXdata to add to the logfiler/ r0 }r1 (h,Xdata to add to the logfiler2 h-j! ubeh3hOubah3jQubeh3jubah3jubeh3jubaubaubeubhL)r3 }r4 (h,X+Add data to a logfile other than ``stdio``.r5 h-jh.h1h3hOh5}r6 (h7]h8]h9]h:]h<]uh>Kh?hh']r7 (hHX!Add data to a logfile other than r8 r9 }r: (h,X!Add data to a logfile other than h-j3 ubhd)r; }r< (h,X ``stdio``h5}r= (h7]h8]h9]h:]h<]uh-j3 h']r> hHXstdior? r@ }rA (h,Uh-j; ubah3houbhHX.rB }rC (h,X.h-j3 ubeubeubeubh)rD }rE (h,Uh-hh.h1h3hh5}rF (h:]h9]h7]h8]h<]Uentries]rG (hX8RemoteShellCommand (class in buildbot.process.buildstep)hUtrH auh>Nh?hh']ubh)rI }rJ (h,Uh-hh.h1h3hh5}rK (hhXpyrL h:]h9]h7]h8]h<]hXclassrM hjM uh>Nh?hh']rN (h)rO }rP (h,XRemoteShellCommand(workdir, command, env=None, want_stdout=True, want_stderr=True, timeout=20*60, maxTime=None, sigtermTime=None, logfiles={}, usePTY="slave-config", logEnviron=True, collectStdio=False)h-jI h.h1h3hh5}rQ (h:]rR hahhbh9]h7]h8]h<]rS hahXRemoteShellCommandrT hUhuh>Kh?hh']rU (h)rV }rW (h,Xclass h-jO h.h1h3hh5}rX (h7]h8]h9]h:]h<]uh>Kh?hh']rY hHXclass rZ r[ }r\ (h,Uh-jV ubaubh)r] }r^ (h,Xbuildbot.process.buildstep.h-jO h.h1h3hh5}r_ (h7]h8]h9]h:]h<]uh>Kh?hh']r` hHXbuildbot.process.buildstep.ra rb }rc (h,Uh-j] ubaubh)rd }re (h,jT h-jO h.h1h3hh5}rf (h7]h8]h9]h:]h<]uh>Kh?hh']rg hHXRemoteShellCommandrh ri }rj (h,Uh-jd ubaubh)rk }rl (h,Uh-jO h.h1h3hh5}rm (h7]h8]h9]h:]h<]uh>Kh?hh']rn (h)ro }rp (h,Xworkdirh5}rq (h7]h8]h9]h:]h<]uh-jk h']rr hHXworkdirrs rt }ru (h,Uh-jo ubah3hubh)rv }rw (h,Xcommandh5}rx (h7]h8]h9]h:]h<]uh-jk h']ry hHXcommandrz r{ }r| (h,Uh-jv ubah3hubh)r} }r~ (h,Xenv=Noneh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXenv=Noner r }r (h,Uh-j} ubah3hubh)r }r (h,Xwant_stdout=Trueh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXwant_stdout=Truer r }r (h,Uh-j ubah3hubh)r }r (h,Xwant_stderr=Trueh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXwant_stderr=Truer r }r (h,Uh-j ubah3hubh)r }r (h,X timeout=20*60h5}r (h7]h8]h9]h:]h<]uh-jk h']r hHX timeout=20*60r r }r (h,Uh-j ubah3hubh)r }r (h,X maxTime=Noneh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHX maxTime=Noner r }r (h,Uh-j ubah3hubh)r }r (h,XsigtermTime=Noneh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXsigtermTime=Noner r }r (h,Uh-j ubah3hubh)r }r (h,X logfiles={}h5}r (h7]h8]h9]h:]h<]uh-jk h']r hHX logfiles={}r r }r (h,Uh-j ubah3hubh)r }r (h,XusePTY="slave-config"h5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXusePTY="slave-config"r r }r (h,Uh-j ubah3hubh)r }r (h,XlogEnviron=Trueh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXlogEnviron=Truer r }r (h,Uh-j ubah3hubh)r }r (h,XcollectStdio=Falseh5}r (h7]h8]h9]h:]h<]uh-jk h']r hHXcollectStdio=Falser r }r (h,Uh-j ubah3hubeubeubj)r }r (h,Uh-jI h.h1h3jh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r (j)r }r (h,Uh-j h.h1h3j h5}r (h7]h8]h9]h:]h<]uh>Nh?hh']r j)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hHX Parametersr r }r (h,Uh-j ubah3jubj)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r j!)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,Xworkdirh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXworkdirr r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHXQdirectory in which command should be executed, relative to the builder's basedir.r r }r (h,XQdirectory in which command should be executed, relative to the builder's basedir.r h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,Xcommandh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXcommandr r }r (h,Uh-j ubah3j7ubhHX (r r }r (h,Uh-j ubhU)r }r (h,Uh5}r (Ureftypej>U reftargetXstring or listr U refdomainjL h:]h9]U refexplicith7]h8]h<]uh-j h']r h)r }r (h,j h5}r (h7]h8]h9]h:]h<]uh-j h']r hHXstring or listr r }r (h,Uh-j ubah3hubah3hYubhHX)r }r (h,Uh-j ubhHX -- r r }r (h,Uh-j ubhHXshell command to runr r }r (h,Xshell command to runr h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r! (h7]h8]h9]h:]h<]uh-j h']r" (j/)r# }r$ (h,X want_stdouth5}r% (h7]h8]h9]h:]h<]uh-j h']r& hHX want_stdoutr' r( }r) (h,Uh-j# ubah3j7ubhHX -- r* r+ }r, (h,Uh-j ubhHX2If false, then no updates will be sent for stdout.r- r. }r/ (h,X2If false, then no updates will be sent for stdout.r0 h-j ubeh3hOubah3jQubj&)r1 }r2 (h,Uh5}r3 (h7]h8]h9]h:]h<]uh-j h']r4 hL)r5 }r6 (h,Uh5}r7 (h7]h8]h9]h:]h<]uh-j1 h']r8 (j/)r9 }r: (h,X want_stderrh5}r; (h7]h8]h9]h:]h<]uh-j5 h']r< hHX want_stderrr= r> }r? (h,Uh-j9 ubah3j7ubhHX -- r@ rA }rB (h,Uh-j5 ubhHX2If false, then no updates will be sent for stderr.rC rD }rE (h,X2If false, then no updates will be sent for stderr.rF h-j5 ubeh3hOubah3jQubj&)rG }rH (h,Uh5}rI (h7]h8]h9]h:]h<]uh-j h']rJ hL)rK }rL (h,Uh5}rM (h7]h8]h9]h:]h<]uh-jG h']rN (j/)rO }rP (h,Xtimeouth5}rQ (h7]h8]h9]h:]h<]uh-jK h']rR hHXtimeoutrS rT }rU (h,Uh-jO ubah3j7ubhHX -- rV rW }rX (h,Uh-jK ubhHX9Maximum time without output before the command is killed.rY rZ }r[ (h,X9Maximum time without output before the command is killed.r\ h-jK ubeh3hOubah3jQubj&)r] }r^ (h,Uh5}r_ (h7]h8]h9]h:]h<]uh-j h']r` hL)ra }rb (h,Uh5}rc (h7]h8]h9]h:]h<]uh-j] h']rd (j/)re }rf (h,XmaxTimeh5}rg (h7]h8]h9]h:]h<]uh-ja h']rh hHXmaxTimeri rj }rk (h,Uh-je ubah3j7ubhHX -- rl rm }rn (h,Uh-ja ubhHXAMaximum overall time from the start before the command is killed.ro rp }rq (h,XAMaximum overall time from the start before the command is killed.rr h-ja ubeh3hOubah3jQubj&)rs }rt (h,Uh5}ru (h7]h8]h9]h:]h<]uh-j h']rv hL)rw }rx (h,Uh5}ry (h7]h8]h9]h:]h<]uh-js h']rz (j/)r{ }r| (h,X sigtermTimeh5}r} (h7]h8]h9]h:]h<]uh-jw h']r~ hHX sigtermTimer r }r (h,Uh-j{ ubah3j7ubhHX -- r r }r (h,Uh-jw ubhHXTry to kill the command with SIGTERM and wait for sigtermTime seconds before firing SIGKILL. If None, SIGTERM will not be fired.r r }r (h,XTry to kill the command with SIGTERM and wait for sigtermTime seconds before firing SIGKILL. If None, SIGTERM will not be fired.r h-jw ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,Xenvh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXenvr r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHXbA dictionary of environment variables to augment or replace the existing environment on the slave.r r }r (h,XbA dictionary of environment variables to augment or replace the existing environment on the slave.r h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,Xlogfilesh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXlogfilesr r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHX.Additional logfiles to request from the slave.r r }r (h,X.Additional logfiles to request from the slave.r h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,XusePTYh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXusePTYr r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHXfTrue to use a PTY, false to not use a PTY; the default value uses the default configured on the slave.r r }r (h,XfTrue to use a PTY, false to not use a PTY; the default value uses the default configured on the slave.r h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,X logEnvironh5}r (h7]h8]h9]h:]h<]uh-j h']r hHX logEnvironr r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHX2If false, do not log the environment on the slave.r r }r (h,X2If false, do not log the environment on the slave.r h-j ubeh3hOubah3jQubj&)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r hL)r }r (h,Uh5}r (h7]h8]h9]h:]h<]uh-j h']r (j/)r }r (h,X collectStdouth5}r (h7]h8]h9]h:]h<]uh-j h']r hHX collectStdoutr r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHX&If True, collect the command's stdout.r r }r (h,X&If True, collect the command's stdout.r h-j ubeh3hOubah3jQubeh3jubah3jubeh3jubaubhL)r }r (h,XMost of the constructor arguments are sent directly to the slave; see :ref:`shell-command-args` for the details of the formats. The ``collectStdout`` parameter is as described for the parent class.h-j h.h1h3hOh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r (hHXFMost of the constructor arguments are sent directly to the slave; see r r }r (h,XFMost of the constructor arguments are sent directly to the slave; see h-j ubhU)r }r (h,X:ref:`shell-command-args`r h-j h.h1h3hYh5}r (UreftypeXrefh[h\Xshell-command-argsU refdomainXstdr h:]h9]U refexplicith7]h8]h<]h^h_uh>Kh']r h)r }r (h,j h5}r (h7]h8]r (hij Xstd-refr eh9]h:]h<]uh-j h']r hHXshell-command-argsr r }r (h,Uh-j ubah3hubaubhHX& for the details of the formats. The r r }r (h,X& for the details of the formats. The h-j ubhd)r }r (h,X``collectStdout``h5}r (h7]h8]h9]h:]h<]uh-j h']r hHX collectStdoutr r }r (h,Uh-j ubah3houbhHX0 parameter is as described for the parent class.r r }r (h,X0 parameter is as described for the parent class.h-j ubeubhL)r }r (h,XIf shell command contains passwords they can be hidden from log files by passing them as tuple in command argument. Eg. ``['print', ('obfuscated', 'password', 'dummytext')]`` is logged as ``['print', 'dummytext']``.h-j h.h1h3hOh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r (hHXxIf shell command contains passwords they can be hidden from log files by passing them as tuple in command argument. Eg. r r }r (h,XxIf shell command contains passwords they can be hidden from log files by passing them as tuple in command argument. Eg. h-j ubhd)r! }r" (h,X6``['print', ('obfuscated', 'password', 'dummytext')]``h5}r# (h7]h8]h9]h:]h<]uh-j h']r$ hHX2['print', ('obfuscated', 'password', 'dummytext')]r% r& }r' (h,Uh-j! ubah3houbhHX is logged as r( r) }r* (h,X is logged as h-j ubhd)r+ }r, (h,X``['print', 'dummytext']``h5}r- (h7]h8]h9]h:]h<]uh-j h']r. hHX['print', 'dummytext']r/ r0 }r1 (h,Uh-j+ ubah3houbhHX.r2 }r3 (h,X.h-j ubeubhL)r4 }r5 (h,XqThis class is used by the :bb:step:`ShellCommand` step, and by steps that run multiple customized shell commands.h-j h.h1h3hOh5}r6 (h7]h8]h9]h:]h<]uh>Kh?hh']r7 (hHXThis class is used by the r8 r9 }r: (h,XThis class is used by the h-j4 ubhU)r; }r< (h,X:bb:step:`ShellCommand`r= h-j4 h.h1h3hYh5}r> (UreftypeXsteph[h\X ShellCommandU refdomainXbbr? h:]h9]U refexplicith7]h8]h<]h^h_uh>Kh']r@ hd)rA }rB (h,j= h5}rC (h7]h8]rD (hij? Xbb-steprE eh9]h:]h<]uh-j; h']rF hHX ShellCommandrG rH }rI (h,Uh-jA ubah3houbaubhHX@ step, and by steps that run multiple customized shell commands.rJ rK }rL (h,X@ step, and by steps that run multiple customized shell commands.h-j4 ubeubeubeubeubeubah,UU transformerrM NU footnote_refsrN }rO UrefnamesrP }rQ Usymbol_footnotesrR ]rS Uautofootnote_refsrT ]rU Usymbol_footnote_refsrV ]rW U citationsrX ]rY h?hU current_linerZ NUtransform_messagesr[ ]r\ Ureporterr] NUid_startr^ KU autofootnotesr_ ]r` U citation_refsra }rb Uindirect_targetsrc ]rd Usettingsre (cdocutils.frontend Values rf org }rh (Ufootnote_backlinksri KUrecord_dependenciesrj NU rfc_base_urlrk Uhttp://tools.ietf.org/html/rl U tracebackrm Upep_referencesrn NUstrip_commentsro NU toc_backlinksrp Uentryrq U language_coderr Uenrs U datestamprt NU report_levelru KU _destinationrv NU halt_levelrw KU strip_classesrx NhENUerror_encoding_error_handlerry Ubackslashreplacerz Udebugr{ NUembed_stylesheetr| Uoutput_encoding_error_handlerr} Ustrictr~ U sectnum_xformr KUdump_transformsr NU docinfo_xformr KUwarning_streamr NUpep_file_url_templater Upep-%04dr Uexit_status_levelr KUconfigr NUstrict_visitorr NUcloak_email_addressesr Utrim_footnote_reference_spacer Uenvr NUdump_pseudo_xmlr NUexpose_internalsr NUsectsubtitle_xformr U source_linkr NUrfc_referencesr NUoutput_encodingr Uutf-8r U source_urlr NUinput_encodingr U utf-8-sigr U_disable_configr NU id_prefixr UU tab_widthr KUerror_encodingr UUTF-8r U_sourcer U]/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-remotecommands.rstr Ugettext_compactr U generatorr NUdump_internalsr NU smart_quotesr U pep_base_urlr Uhttp://www.python.org/dev/peps/r Usyntax_highlightr Ulongr Uinput_encoding_error_handlerr j~ Uauto_id_prefixr Uidr Udoctitle_xformr Ustrip_elements_with_classesr NU _config_filesr ]Ufile_insertion_enabledr U raw_enabledr KU dump_settingsr NubUsymbol_footnote_startr KUidsr }r (hjWhjhjh jh%hh hh j h jhj;hj hjhjhjq hjO hjUhjhjhjhjeh&h*hjhjbuUsubstitution_namesr }r h3h?h5}r (h7]h:]h9]Usourceh1h8]h<]uU footnotesr ]r Urefidsr }r ub.PK4DXbEbE7buildbot-v0.8.9/.doctrees/developer/definitions.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XprojectqNX definitionsqNXversion control comparisonqNX repositoryq NuUsubstitution_defsq }q Uparse_messagesq ]q (cdocutils.nodes system_message q)q}q(U rawsourceqUU attributesq}q(Udupnamesq]UlevelKUidsq]Ubackrefsq]Usourcecdocutils.nodes reprunicode qXV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/definitions.rstqq}qbUclassesq]Unamesq]UlineK UtypeUINFOquUparentqcdocutils.nodes entry q)q }q!(hUh}q"(h]h]h]h]h]uhcdocutils.nodes row q#)q$}q%(hUh}q&(h]h]h]h]h]uhcdocutils.nodes tbody q')q(}q)(hUh}q*(h]h]h]h]h]uhcdocutils.nodes tgroup q+)q,}q-(hUh}q.(h]h]h]h]h]UcolsKuhcdocutils.nodes table q/)q0}q1(hUhcdocutils.nodes section q2)q3}q4(hUhh2)q5}q6(hUhhUsourceq7hUtagnameq8Usectionq9h}q:(h]h]h]h]q;U definitionsqKUdocumentq?hUchildrenq@]qA(cdocutils.nodes title qB)qC}qD(hX DefinitionsqEhh5h7hh8UtitleqFh}qG(h]h]h]h]h]uh>Kh?hh@]qHcdocutils.nodes Text qIX DefinitionsqJqK}qL(hhEhhCubaubcdocutils.nodes paragraph qM)qN}qO(hXBBuildbot uses some terms and concepts that have specific meanings.qPhh5h7hh8U paragraphqQh}qR(h]h]h]h]h]uh>Kh?hh@]qShIXBBuildbot uses some terms and concepts that have specific meanings.qTqU}qV(hhPhhNubaubh2)qW}qX(hUhh5h7hh8h9h}qY(h]h]h]h]qZU repositoryq[ah]q\h auh>Kh?hh@]q](hB)q^}q_(hX Repositoryq`hhWh7hh8hFh}qa(h]h]h]h]h]uh>Kh?hh@]qbhIX Repositoryqcqd}qe(hh`hh^ubaubhM)qf}qg(hXSee :ref:`Attr-Repository`.qhhhWh7hh8hQh}qi(h]h]h]h]h]uh>K h?hh@]qj(hIXSee qkql}qm(hXSee hhfubcsphinx.addnodes pending_xref qn)qo}qp(hX:ref:`Attr-Repository`qqhhfh7hh8U pending_xrefqrh}qs(UreftypeXrefUrefwarnqtU reftargetquXattr-repositoryU refdomainXstdqvh]h]U refexplicith]h]h]UrefdocqwXdeveloper/definitionsqxuh>K h@]qycdocutils.nodes emphasis qz)q{}q|(hhqh}q}(h]h]q~(UxrefqhvXstd-refqeh]h]h]uhhoh@]qhIXAttr-Repositoryqq}q(hUhh{ubah8UemphasisqubaubhIX.q}q(hX.hhfubeubeubh2)q}q(hUhh5h7hh8h9h}q(h]h]h]h]qUprojectqah]qhauh>K h?hh@]q(hB)q}q(hXProjectqhhh7hh8hFh}q(h]h]h]h]h]uh>K h?hh@]qhIXProjectqq}q(hhhhubaubhM)q}q(hXSee :ref:`Attr-Project`.qhhh7hh8hQh}q(h]h]h]h]h]uh>Kh?hh@]q(hIXSee qq}q(hXSee hhubhn)q}q(hX:ref:`Attr-Project`qhhh7hh8hrh}q(UreftypeXrefhthuX attr-projectU refdomainXstdqh]h]U refexplicith]h]h]hwhxuh>Kh@]qhz)q}q(hhh}q(h]h]q(hhXstd-refqeh]h]h]uhhh@]qhIX Attr-Projectqq}q(hUhhubah8hubaubhIX.q}q(hX.hhubeubeubh3eubh7hh8h9h}q(h]h]h]h]qUversion-control-comparisonqah]qhauh>Kh?hh@]q(hB)q}q(hXVersion Control Comparisonqhh3h7hh8hFh}q(h]h]h]h]h]uh>Kh?hh@]qhIXVersion Control Comparisonqq}q(hhhhubaubhM)q}q(hXBuildbot supports a number of version control systems, and they don't all agree on their terms. This table should help to disambiguate them.qhh3h7hh8hQh}q(h]h]h]h]h]uh>Kh?hh@]qhIXBuildbot supports a number of version control systems, and they don't all agree on their terms. This table should help to disambiguate them.q…q}q(hhhhubaubh0cdocutils.nodes bullet_list q)q}q(hUhh3h7hh8U bullet_listqh}q(UbulletqX*h]h]h]h]h]uh>K%h?hh@]q(cdocutils.nodes list_item q)q}q(hX[1] note that CVS only tracks patches to individual files. Buildbot tries to recognize coordinated changes to multiple files by correlating change times. hhh7hh8U list_itemqh}q(h]h]h]h]h]uh>Nh?hh@]qhM)q}q(hX[1] note that CVS only tracks patches to individual files. Buildbot tries to recognize coordinated changes to multiple files by correlating change times.qhhh7hh8hQh}q(h]h]h]h]h]uh>K%h@]qhIX[1] note that CVS only tracks patches to individual files. Buildbot tries to recognize coordinated changes to multiple files by correlating change times.qׅq}q(hhhhubaubaubh)q}q(hXZ[2] Darcs does not have a concise way of representing a particular revision of the source.hhh7hh8hh}q(h]h]h]h]h]uh>Nh?hh@]qhM)q}q(hXZ[2] Darcs does not have a concise way of representing a particular revision of the source.qhhh7hh8hQh}q(h]h]h]h]h]uh>K(h@]qhIXZ[2] Darcs does not have a concise way of representing a particular revision of the source.qㅁq}q(hhhhubaubaubeubeubh7hh8Utableqh}q(h]h]h]h]h]uh>Nh?hh@]qh,aubh@]q(cdocutils.nodes colspec q)q}q(hUh}q(h]h]h]h]h]UcolwidthK uhh,h@]h8Ucolspecqubh)q}q(hUh}q(h]h]h]h]h]UcolwidthK uhh,h@]h8hubh)q}q(hUh}q(h]h]h]h]h]UcolwidthK uhh,h@]h8hubh)q}q(hUh}q(h]h]h]h]h]UcolwidthKuhh,h@]h8hubcdocutils.nodes thead q)q}q(hUh}q(h]h]h]h]h]uhh,h@]qh#)q}q(hUh}q(h]h]h]h]h]uhhh@]r(h)r}r(hUh}r(h]h]h]h]h]uhhh@]rhM)r}r(hXNamerhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]r hIXNamer r }r (hjhjubaubah8Uentryr ubh)r}r(hUh}r(h]h]h]h]h]uhhh@]rhM)r}r(hXChangerhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXChangerr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhhh@]rhM)r}r(hXRevisionr hjh7hh8hQh}r!(h]h]h]h]h]uh>Kh@]r"hIXRevisionr#r$}r%(hj hjubaubah8j ubh)r&}r'(hUh}r((h]h]h]h]h]uhhh@]r)hM)r*}r+(hXBranchesr,hj&h7hh8hQh}r-(h]h]h]h]h]uh>Kh@]r.hIXBranchesr/r0}r1(hj,hj*ubaubah8j ubeh8Urowr2ubah8Utheadr3ubh(eh8Utgroupr4ubh@]r5(h#)r6}r7(hUh}r8(h]h]h]h]h]uhh(h@]r9(h)r:}r;(hUh}r<(h]h]h]h]h]uhj6h@]r=hM)r>}r?(hXCVSr@hj:h7hh8hQh}rA(h]h]h]h]h]uh>Kh@]rBhIXCVSrCrD}rE(hj@hj>ubaubah8j ubh)rF}rG(hUh}rH(h]h]h]h]h]uhj6h@]rIhM)rJ}rK(hX patch [1]rLhjFh7hh8hQh}rM(h]h]h]h]h]uh>Kh@]rNhIX patch [1]rOrP}rQ(hjLhjJubaubah8j ubh)rR}rS(hUh}rT(h]h]h]h]h]uhj6h@]rUhM)rV}rW(hX timestamprXhjRh7hh8hQh}rY(h]h]h]h]h]uh>Kh@]rZhIX timestampr[r\}r](hjXhjVubaubah8j ubh)r^}r_(hUh}r`(h]h]h]h]h]uhj6h@]rahM)rb}rc(hXunnamedrdhj^h7hh8hQh}re(h]h]h]h]h]uh>Kh@]rfhIXunnamedrgrh}ri(hjdhjbubaubah8j ubeh8j2ubh#)rj}rk(hUh}rl(h]h]h]h]h]uhh(h@]rm(h)rn}ro(hUh}rp(h]h]h]h]h]uhjjh@]rqhM)rr}rs(hX Subversionrthjnh7hh8hQh}ru(h]h]h]h]h]uh>Kh@]rvhIX Subversionrwrx}ry(hjthjrubaubah8j ubh)rz}r{(hUh}r|(h]h]h]h]h]uhjjh@]r}hM)r~}r(hXrevisionrhjzh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXrevisionrr}r(hjhj~ubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjjh@]rhM)r}r(hXintegerrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXintegerrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjjh@]rhM)r}r(hX directoriesrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX directoriesrr}r(hjhjubaubah8j ubeh8j2ubh#)r}r(hUh}r(h]h]h]h]h]uhh(h@]r(h)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hXGitrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXGitrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hXcommitrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXcommitrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX sha1 hashrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX sha1 hashrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX named refsrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX named refsrr}r(hjhjubaubah8j ubeh8j2ubh#)r}r(hUh}r(h]h]h]h]h]uhh(h@]r(h)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX Mercurialrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX Mercurialrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX changesetrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX changesetrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX sha1 hashrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX sha1 hashrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX.different repos or (permanently) named commitsrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX.different repos or (permanently) named commitsrr}r(hjhjubaubah8j ubeh8j2ubh$h#)r}r(hUh}r(h]h]h]h]h]uhh(h@]r (h)r }r (hUh}r (h]h]h]h]h]uhjh@]r hM)r}r(hXBazaarrhj h7hh8hQh}r(h]h]h]h]h]uh>K h@]rhIXBazaarrr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjh@]rhM)r}r(hX?hjh7hh8hQh}r(h]h]h]h]h]uh>K h@]rhIX?r}r(hX?hjubaubah8j ubh)r }r!(hUh}r"(h]h]h]h]h]uhjh@]r#hM)r$}r%(hX?hj h7hh8hQh}r&(h]h]h]h]h]uh>K h@]r'hIX?r(}r)(hX?hj$ubaubah8j ubh)r*}r+(hUh}r,(h]h]h]h]h]uhjh@]r-hM)r.}r/(hX?hj*h7hh8hQh}r0(h]h]h]h]h]uh>K h@]r1hIX?r2}r3(hX?hj.ubaubah8j ubeh8j2ubh#)r4}r5(hUh}r6(h]h]h]h]h]uhh(h@]r7(h)r8}r9(hUh}r:(h]h]h]h]h]uhj4h@]r;hM)r<}r=(hXPerforcer>hj8h7hh8hQh}r?(h]h]h]h]h]uh>K!h@]r@hIXPerforcerArB}rC(hj>hj<ubaubah8j ubh)rD}rE(hUh}rF(h]h]h]h]h]uhj4h@]rGhM)rH}rI(hX?hjDh7hh8hQh}rJ(h]h]h]h]h]uh>K!h@]rKhIX?rL}rM(hX?hjHubaubah8j ubh)rN}rO(hUh}rP(h]h]h]h]h]uhj4h@]rQhM)rR}rS(hX?hjNh7hh8hQh}rT(h]h]h]h]h]uh>K!h@]rUhIX?rV}rW(hX?hjRubaubah8j ubh)rX}rY(hUh}rZ(h]h]h]h]h]uhj4h@]r[hM)r\}r](hX?hjXh7hh8hQh}r^(h]h]h]h]h]uh>K!h@]r_hIX?r`}ra(hX?hj\ubaubah8j ubeh8j2ubh#)rb}rc(hUh}rd(h]h]h]h]h]uhh(h@]re(h)rf}rg(hUh}rh(h]h]h]h]h]uhjbh@]rihM)rj}rk(hX BitKeeperrlhjfh7hh8hQh}rm(h]h]h]h]h]uh>K"h@]rnhIX BitKeeperrorp}rq(hjlhjjubaubah8j ubh)rr}rs(hUh}rt(h]h]h]h]h]uhjbh@]ruhM)rv}rw(hX changesetrxhjrh7hh8hQh}ry(h]h]h]h]h]uh>K"h@]rzhIX changesetr{r|}r}(hjxhjvubaubah8j ubh)r~}r(hUh}r(h]h]h]h]h]uhjbh@]rhM)r}r(hX?hj~h7hh8hQh}r(h]h]h]h]h]uh>K"h@]rhIX?r}r(hX?hjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhjbh@]rhM)r}r(hXdifferent reposrhjh7hh8hQh}r(h]h]h]h]h]uh>K"h@]rhIXdifferent reposrr}r(hjhjubaubah8j ubeh8j2ubeh8Utbodyrubh@]r(h)r}r(hUh}r(h]h]h]h]h]uhh$h@]rhM)r}r(hXDarcsrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXDarcsrr}r(hjhjubaubah8j ubh h)r}r(hUh}r(h]h]h]h]h]uhh$h@]rhM)r}r(hXnone [2]rhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXnone [2]rr}r(hjhjubaubah8j ubh)r}r(hUh}r(h]h]h]h]h]uhh$h@]rhM)r}r(hXdifferent reposrhjh7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIXdifferent reposrr}r(hjhjubaubah8j ubeh8j2ubh@]rhM)r}r(hX?hh h7hh8hQh}r(h]h]h]h]h]uh>Kh@]rhIX?r}r(hX?hjubaubah8j ubh@]rhM)r}r(hUh}r(h]h]h]h]h]uhhh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8Usystem_messagerubh)r}r(hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK!Utypehuhjh@]rhM)r}r(hUh}r(h]h]h]h]h]uhjh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8jubh)r}r(hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK!Utypehuhj h@]rhM)r}r(hUh}r(h]h]h]h]h]uhjh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8jubh)r}r(hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK!Utypehuhj*h@]rhM)r}r(hUh}r(h]h]h]h]h]uhjh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8jubh)r}r(hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK"UtypehuhjDh@]rhM)r}r(hUh}r(h]h]h]h]h]uhjh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8jubh)r}r(hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK"UtypehuhjNh@]rhM)r}r(hUh}r(h]h]h]h]h]uhjh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8jubh)r}r(hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK"UtypehuhjXh@]rhM)r}r(hUh}r(h]h]h]h]h]uhjh@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.r r }r (hUhjubah8hQubah8jubh)r }r (hUh}r(h]UlevelKh]h]Usourcehh]h]UlineK#Utypehuhj~h@]rhM)r}r(hUh}r(h]h]h]h]h]uhj h@]rhIXeUnexpected possible title overline or transition. Treating it as ordinary text because it's so short.rr}r(hUhjubah8hQubah8jubeUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hhhhNUstrip_commentsr?NU toc_backlinksr@j U language_coderAUenrBU datestamprCNU report_levelrDKU _destinationrENU halt_levelrFKU strip_classesrGNhFNUerror_encoding_error_handlerrHUbackslashreplacerIUdebugrJNUembed_stylesheetrKUoutput_encoding_error_handlerrLUstrictrMU sectnum_xformrNKUdump_transformsrONU docinfo_xformrPKUwarning_streamrQNUpep_file_url_templaterRUpep-%04drSUexit_status_levelrTKUconfigrUNUstrict_visitorrVNUcloak_email_addressesrWUtrim_footnote_reference_spacerXUenvrYNUdump_pseudo_xmlrZNUexpose_internalsr[NUsectsubtitle_xformr\U source_linkr]NUrfc_referencesr^NUoutput_encodingr_Uutf-8r`U source_urlraNUinput_encodingrbU utf-8-sigrcU_disable_configrdNU id_prefixreUU tab_widthrfKUerror_encodingrgUUTF-8rhU_sourceriUV/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/definitions.rstrjUgettext_compactrkU generatorrlNUdump_internalsrmNU smart_quotesrnU pep_base_urlroUhttp://www.python.org/dev/peps/rpUsyntax_highlightrqUlongrrUinput_encoding_error_handlerrsjMUauto_id_prefixrtUidruUdoctitle_xformrvUstrip_elements_with_classesrwNU _config_filesrx]Ufile_insertion_enabledryU raw_enabledrzKU dump_settingsr{NubUsymbol_footnote_startr|KUidsr}}r~(hhhhUbuildslave-methodsq?hUbuildingq@hUcommandsqAhUsetupqBhU downloadfileqChUsource-commandsqDh U connectionqEh!UpingingqFuUchildrenqG]qHcdocutils.nodes section qI)qJ}qK(U rawsourceqLUUparentqMhUsourceqNcdocutils.nodes reprunicode qOXW/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/master-slave.rstqPqQ}qRbUtagnameqSUsectionqTU attributesqU}qV(UdupnamesqW]UclassesqX]UbackrefsqY]UidsqZ]q[h+aUnamesq\]q]hauUlineq^KUdocumentq_hhG]q`(cdocutils.nodes title qa)qb}qc(hLXMaster-Slave APIqdhMhJhNhQhSUtitleqehU}qf(hW]hX]hY]hZ]h\]uh^Kh_hhG]qgcdocutils.nodes Text qhXMaster-Slave APIqiqj}qk(hLhdhMhbubaubcdocutils.nodes paragraph ql)qm}qn(hLX2This section describes the master-slave interface.qohMhJhNhQhSU paragraphqphU}qq(hW]hX]hY]hZ]h\]uh^Kh_hhG]qrhhX2This section describes the master-slave interface.qsqt}qu(hLhohMhmubaubhI)qv}qw(hLUhMhJhNhQhShThU}qx(hW]hX]hY]hZ]qyhEah\]qzh auh^Kh_hhG]q{(ha)q|}q}(hLX Connectionq~hMhvhNhQhShehU}q(hW]hX]hY]hZ]h\]uh^Kh_hhG]qhhX Connectionqq}q(hLh~hMh|ubaubhl)q}q(hLX\The interface is based on Twisted's Perspective Broker, which operates over TCP connections.qhMhvhNhQhShphU}q(hW]hX]hY]hZ]h\]uh^K h_hhG]qhhX\The interface is based on Twisted's Perspective Broker, which operates over TCP connections.qq}q(hLhhMhubaubhl)q}q(hLXThe slave connects to the master, using the parameters supplied to :command:`buildslave create-slave`. It uses a reconnecting process with an exponential backoff, and will automatically reconnect on disconnection.hMhvhNhQhShphU}q(hW]hX]hY]hZ]h\]uh^K h_hhG]q(hhXCThe slave connects to the master, using the parameters supplied to qq}q(hLXCThe slave connects to the master, using the parameters supplied to hMhubcdocutils.nodes strong q)q}q(hLX":command:`buildslave create-slave`hU}q(hW]hX]qUcommandqahY]hZ]h\]uhMhhG]qhhXbuildslave create-slaveqq}q(hLUhMhubahSUstrongqubhhXq. It uses a reconnecting process with an exponential backoff, and will automatically reconnect on disconnection.qq}q(hLXq. It uses a reconnecting process with an exponential backoff, and will automatically reconnect on disconnection.hMhubeubhl)q}q(hLXOnce connected, the slave authenticates with the Twisted Cred (newcred) mechanism, using the username and password supplied to :command:`buildslave create-slave`. The *mind* is the slave bot instance (class :class:`buildslave.bot.Bot`).hMhvhNhQhShphU}q(hW]hX]hY]hZ]h\]uh^Kh_hhG]q(hhXOnce connected, the slave authenticates with the Twisted Cred (newcred) mechanism, using the username and password supplied to qq}q(hLXOnce connected, the slave authenticates with the Twisted Cred (newcred) mechanism, using the username and password supplied to hMhubh)q}q(hLX":command:`buildslave create-slave`hU}q(hW]hX]qhahY]hZ]h\]uhMhhG]qhhXbuildslave create-slaveqq}q(hLUhMhubahShubhhX. The qq}q(hLX. The hMhubcdocutils.nodes emphasis q)q}q(hLX*mind*hU}q(hW]hX]hY]hZ]h\]uhMhhG]qhhXmindqq}q(hLUhMhubahSUemphasisqubhhX" is the slave bot instance (class qq}q(hLX" is the slave bot instance (class hMhubcsphinx.addnodes pending_xref q)q}q(hLX:class:`buildslave.bot.Bot`qhMhhNhQhSU pending_xrefqhU}q(UreftypeXclassUrefwarnqʼnU reftargetqXbuildslave.bot.BotU refdomainXpyqhZ]hY]U refexplicithW]hX]h\]UrefdocqXdeveloper/master-slaveqUpy:classqNU py:moduleqNuh^KhG]qcdocutils.nodes literal q)q}q(hLhhU}q(hW]hX]q(UxrefqhXpy-classqehY]hZ]h\]uhMhhG]qhhXbuildslave.bot.BotqՅq}q(hLUhMhubahSUliteralqubaubhhX).qمq}q(hLX).hMhubeubhl)q}q(hLXOn the master side, the realm is implemented by :class:`buildbot.master.Dispatcher`, which examines the username of incoming avatar requests. There are special cases for ``change``, ``debug``, and ``statusClient``, which are not discussed here. For all other usernames, the botmaster is consulted, and if a slave with that name is configured, its :class:`buildbot.buildslave.BuildSlave` instance is returned as the perspective.hMhvhNhQhShphU}q(hW]hX]hY]hZ]h\]uh^Kh_hhG]q(hhX0On the master side, the realm is implemented by qq}q(hLX0On the master side, the realm is implemented by hMhubh)q}q(hLX#:class:`buildbot.master.Dispatcher`qhMhhNhQhShhU}q(UreftypeXclasshʼnhXbuildbot.master.DispatcherU refdomainXpyqhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]qh)q}q(hLhhU}q(hW]hX]q(hhXpy-classqehY]hZ]h\]uhMhhG]qhhXbuildbot.master.Dispatcherqq}q(hLUhMhubahShubaubhhXX, which examines the username of incoming avatar requests. There are special cases for qq}q(hLXX, which examines the username of incoming avatar requests. There are special cases for hMhubh)q}q(hLX ``change``hU}q(hW]hX]hY]hZ]h\]uhMhhG]qhhXchangeqq}q(hLUhMhubahShubhhX, qq}q(hLX, hMhubh)q}r(hLX ``debug``hU}r(hW]hX]hY]hZ]h\]uhMhhG]rhhXdebugrr}r(hLUhMhubahShubhhX, and rr}r(hLX, and hMhubh)r }r (hLX``statusClient``hU}r (hW]hX]hY]hZ]h\]uhMhhG]r hhX statusClientr r}r(hLUhMj ubahShubhhX, which are not discussed here. For all other usernames, the botmaster is consulted, and if a slave with that name is configured, its rr}r(hLX, which are not discussed here. For all other usernames, the botmaster is consulted, and if a slave with that name is configured, its hMhubh)r}r(hLX':class:`buildbot.buildslave.BuildSlave`rhMhhNhQhShhU}r(UreftypeXclasshʼnhXbuildbot.buildslave.BuildSlaveU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-classrehY]hZ]h\]uhMjhG]rhhXbuildbot.buildslave.BuildSlaverr }r!(hLUhMjubahShubaubhhX) instance is returned as the perspective.r"r#}r$(hLX) instance is returned as the perspective.hMhubeubeubhI)r%}r&(hLUhMhJhNhQhShThU}r'(hW]hX]hY]hZ]r(h-ah\]r)hauh^Kh_hhG]r*(ha)r+}r,(hLX Build Slavesr-hMj%hNhQhShehU}r.(hW]hX]hY]hZ]h\]uh^Kh_hhG]r/hhX Build Slavesr0r1}r2(hLj-hMj+ubaubhl)r3}r4(hLXAt this point, the master-side BuildSlave object has a pointer to the remote, slave-side Bot object in its ``self.slave``, and the slave-side Bot object has a reference to the master-side BuildSlave object in its ``self.perspective``.hMj%hNhQhShphU}r5(hW]hX]hY]hZ]h\]uh^Kh_hhG]r6(hhXkAt this point, the master-side BuildSlave object has a pointer to the remote, slave-side Bot object in its r7r8}r9(hLXkAt this point, the master-side BuildSlave object has a pointer to the remote, slave-side Bot object in its hMj3ubh)r:}r;(hLX``self.slave``hU}r<(hW]hX]hY]hZ]h\]uhMj3hG]r=hhX self.slaver>r?}r@(hLUhMj:ubahShubhhX\, and the slave-side Bot object has a reference to the master-side BuildSlave object in its rArB}rC(hLX\, and the slave-side Bot object has a reference to the master-side BuildSlave object in its hMj3ubh)rD}rE(hLX``self.perspective``hU}rF(hW]hX]hY]hZ]h\]uhMj3hG]rGhhXself.perspectiverHrI}rJ(hLUhMjDubahShubhhX.rK}rL(hLX.hMj3ubeubhI)rM}rN(hLUhMj%hNhQhShThU}rO(hW]hX]hY]hZ]rPh2ah\]rQh auh^K$h_hhG]rR(ha)rS}rT(hLX Bot methodsrUhMjMhNhQhShehU}rV(hW]hX]hY]hZ]h\]uh^K$h_hhG]rWhhX Bot methodsrXrY}rZ(hLjUhMjSubaubhl)r[}r\(hLX;The slave-side Bot object has the following remote methods:r]hMjMhNhQhShphU}r^(hW]hX]hY]hZ]h\]uh^K&h_hhG]r_hhX;The slave-side Bot object has the following remote methods:r`ra}rb(hLj]hMj[ubaubcdocutils.nodes definition_list rc)rd}re(hLUhMjMhNhQhSUdefinition_listrfhU}rg(hW]hX]hY]hZ]h\]uh^Nh_hhG]rh(cdocutils.nodes definition_list_item ri)rj}rk(hLX{:meth:`~buildslave.bot.Bot.remote_getCommands` Returns a list of ``(name, version)`` for all commands the slave recognizes hMjdhNhQhSUdefinition_list_itemrlhU}rm(hW]hX]hY]hZ]h\]uh^K)hG]rn(cdocutils.nodes term ro)rp}rq(hLX.:meth:`~buildslave.bot.Bot.remote_getCommands`rrhMjjhNhQhSUtermrshU}rt(hW]hX]hY]hZ]h\]uh^K)hG]ruh)rv}rw(hLjrhMjphNhQhShhU}rx(UreftypeXmethhʼnhX%buildslave.bot.Bot.remote_getCommandsU refdomainXpyryhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K)hG]rzh)r{}r|(hLjrhU}r}(hW]hX]r~(hjyXpy-methrehY]hZ]h\]uhMjvhG]rhhXremote_getCommandsrr}r(hLUhMj{ubahShubaubaubcdocutils.nodes definition r)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjjhG]rhl)r}r(hLXKReturns a list of ``(name, version)`` for all commands the slave recognizeshMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^K)hG]r(hhXReturns a list of rr}r(hLXReturns a list of hMjubh)r}r(hLX``(name, version)``hU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhX(name, version)rr}r(hLUhMjubahShubhhX& for all commands the slave recognizesrr}r(hLX& for all commands the slave recognizeshMjubeubahSU definitionrubeubji)r}r(hLXg:meth:`~buildslave.bot.Bot.remote_setBuilderList` Given a list of builders and their build directories, ensures that those builders, and only those builders, are running. This can be called after the initial connection is established, with a new list, to add or remove builders. This method returns a dictionary of :class:`SlaveBuilder` objects - see below hMjdhNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^K1h_hhG]r(jo)r}r(hLX1:meth:`~buildslave.bot.Bot.remote_setBuilderList`rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^K1hG]rh)r}r(hLjhMjhNhQhShhU}r(UreftypeXmethhʼnhX(buildslave.bot.Bot.remote_setBuilderListU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K1hG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhXremote_setBuilderListrr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]r(hl)r}r(hLXGiven a list of builders and their build directories, ensures that those builders, and only those builders, are running. This can be called after the initial connection is established, with a new list, to add or remove builders.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^K,hG]rhhXGiven a list of builders and their build directories, ensures that those builders, and only those builders, are running. This can be called after the initial connection is established, with a new list, to add or remove builders.rr}r(hLjhMjubaubhl)r}r(hLXMThis method returns a dictionary of :class:`SlaveBuilder` objects - see belowhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^K1hG]r(hhX$This method returns a dictionary of rr}r(hLX$This method returns a dictionary of hMjubh)r}r(hLX:class:`SlaveBuilder`rhMjhNhQhShhU}r(UreftypeXclasshʼnhX SlaveBuilderU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K1hG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-classrehY]hZ]h\]uhMjhG]rhhX SlaveBuilderrr}r(hLUhMjubahShubaubhhX objects - see belowrr}r(hLX objects - see belowhMjubeubehSjubeubji)r}r(hLXM:meth:`~buildslave.bot.Bot.remote_print` Adds a message to the slave logfile hMjdhNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^K4h_hhG]r(jo)r}r(hLX(:meth:`~buildslave.bot.Bot.remote_print`rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^K4hG]rh)r}r(hLjhMjhNhQhShhU}r(UreftypeXmethhʼnhXbuildslave.bot.Bot.remote_printU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K4hG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhX remote_printrr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhl)r}r(hLX#Adds a message to the slave logfilerhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^K4hG]rhhX#Adds a message to the slave logfilerr}r(hLjhMjubaubahSjubeubji)r}r(hLX8:meth:`~buildslave.bot.Bot.remote_getSlaveInfo` Returns the contents of the slave's :file:`info/` directory. This also contains the keys ``environ`` copy of the slaves environment ``system`` OS the slave is running (extracted from Python's os.name) ``basedir`` base directory where slave is running hMjdhNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^K?h_hhG]r(jo)r}r(hLX/:meth:`~buildslave.bot.Bot.remote_getSlaveInfo`rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^K?hG]rh)r}r(hLjhMjhNhQhShhU}r(UreftypeXmethhʼnhX&buildslave.bot.Bot.remote_getSlaveInfoU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K?hG]rh)r}r (hLjhU}r (hW]hX]r (hjXpy-methr ehY]hZ]h\]uhMjhG]r hhXremote_getSlaveInforr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]r(hl)r}r(hLXXReturns the contents of the slave's :file:`info/` directory. This also contains the keyshMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^K7hG]r(hhX$Returns the contents of the slave's rr}r(hLX$Returns the contents of the slave's hMjubh)r}r(hLUhU}r(hZ]hY]hW]hX]rXfiler aUrolej h\]uhMjhG]r!hhXinfo/r"r#}r$(hLXinfo/hMjubahShubhhX' directory. This also contains the keysr%r&}r'(hLX' directory. This also contains the keyshMjubeubjc)r(}r)(hLUhU}r*(hW]hX]hY]hZ]h\]uhMjhG]r+(ji)r,}r-(hLX*``environ`` copy of the slaves environmenthMj(hNhQhSjlhU}r.(hW]hX]hY]hZ]h\]uh^K:hG]r/(jo)r0}r1(hLX ``environ``r2hMj,hNhQhSjshU}r3(hW]hX]hY]hZ]h\]uh^K:hG]r4h)r5}r6(hLj2hU}r7(hW]hX]hY]hZ]h\]uhMj0hG]r8hhXenvironr9r:}r;(hLUhMj5ubahShubaubj)r<}r=(hLUhU}r>(hW]hX]hY]hZ]h\]uhMj,hG]r?hl)r@}rA(hLXcopy of the slaves environmentrBhMj<hNhQhShphU}rC(hW]hX]hY]hZ]h\]uh^K;hG]rDhhXcopy of the slaves environmentrErF}rG(hLjBhMj@ubaubahSjubeubji)rH}rI(hLXD``system`` OS the slave is running (extracted from Python's os.name)hMj(hNhQhSjlhU}rJ(hW]hX]hY]hZ]h\]uh^Kr?}r@(hLUhMj8ubahShubaubhhX method, then the rArB}rC(hLX method, then the hMj+ubh)rD}rE(hLX :meth:`print`rFhMj+hNhQhShhU}rG(UreftypeXmethhʼnhXprintU refdomainXpyrHhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KVhG]rIh)rJ}rK(hLjFhU}rL(hW]hX]rM(hjHXpy-methrNehY]hZ]h\]uhMjDhG]rOhhXprintrPrQ}rR(hLUhMjJubahShubaubhhX method.rSrT}rU(hLX method.hMj+ubeubeubhI)rV}rW(hLUhMhJhNhQhShThU}rX(hW]hX]hY]hZ]rYhFah\]rZh!auh^KZh_hhG]r[(ha)r\}r](hLXPingingr^hMjVhNhQhShehU}r_(hW]hX]hY]hZ]h\]uh^KZh_hhG]r`hhXPingingrarb}rc(hLj^hMj\ubaubhl)rd}re(hLXITo ping a remote SlaveBuilder, the master calls its :meth:`print` method.rfhMjVhNhQhShphU}rg(hW]hX]hY]hZ]h\]uh^K\h_hhG]rh(hhX4To ping a remote SlaveBuilder, the master calls its rirj}rk(hLX4To ping a remote SlaveBuilder, the master calls its hMjdubh)rl}rm(hLX :meth:`print`rnhMjdhNhQhShhU}ro(UreftypeXmethhʼnhXprintU refdomainXpyrphZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K\hG]rqh)rr}rs(hLjnhU}rt(hW]hX]ru(hjpXpy-methrvehY]hZ]h\]uhMjlhG]rwhhXprintrxry}rz(hLUhMjrubahShubaubhhX method.r{r|}r}(hLX method.hMjdubeubeubhI)r~}r(hLUhMhJhNhQhShThU}r(hW]hX]hY]hZ]rh@ah\]rhauh^K_h_hhG]r(ha)r}r(hLXBuildingrhMj~hNhQhShehU}r(hW]hX]hY]hZ]h\]uh^K_h_hhG]rhhXBuildingrr}r(hLjhMjubaubhl)r}r(hLXsWhen a build starts, the master calls the slave's :meth:`startBuild` method. Each BuildStep instance will subsequently call the :meth:`startCommand` method, passing a reference to itself as the ``stepRef`` parameter. The :meth:`startCommand` method returns immediately, and the end of the command is signalled with a call to a method on the master-side BuildStep object.hMj~hNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kah_hhG]r(hhX2When a build starts, the master calls the slave's rr}r(hLX2When a build starts, the master calls the slave's hMjubh)r}r(hLX:meth:`startBuild`rhMjhNhQhShhU}r(UreftypeXmethhʼnhX startBuildU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KahG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhX startBuildrr}r(hLUhMjubahShubaubhhX< method. Each BuildStep instance will subsequently call the rr}r(hLX< method. Each BuildStep instance will subsequently call the hMjubh)r}r(hLX:meth:`startCommand`rhMjhNhQhShhU}r(UreftypeXmethhʼnhX startCommandU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KahG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhX startCommandrr}r(hLUhMjubahShubaubhhX. method, passing a reference to itself as the rr}r(hLX. method, passing a reference to itself as the hMjubh)r}r(hLX ``stepRef``hU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXstepRefrr}r(hLUhMjubahShubhhX parameter. The rr}r(hLX parameter. The hMjubh)r}r(hLX:meth:`startCommand`rhMjhNhQhShhU}r(UreftypeXmethhʼnhX startCommandU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KahG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhX startCommandrr}r(hLUhMjubahShubaubhhX method returns immediately, and the end of the command is signalled with a call to a method on the master-side BuildStep object.rr}r(hLX method returns immediately, and the end of the command is signalled with a call to a method on the master-side BuildStep object.hMjubeubeubhI)r}r(hLUhMhJhNhQhShThU}r(hW]hX]hY]hZ]rh/ah\]rh auh^Khh_hhG]r(ha)r}r(hLXSlave BuildersrhMjhNhQhShehU}r(hW]hX]hY]hZ]h\]uh^Khh_hhG]rhhXSlave Buildersrr}r(hLjhMjubaubhl)r}r(hLXEach build slave has a set of builders which can run on it. These are represented by distinct classes on the master and slave, just like the BuildSlave and Bot objects described above.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kjh_hhG]rhhXEach build slave has a set of builders which can run on it. These are represented by distinct classes on the master and slave, just like the BuildSlave and Bot objects described above.rr}r(hLjhMjubaubhl)r}r(hLXOn the slave side, builders are represented as instances of the :class:`buildslave.bot.SlaveBuilder` class. On the master side, they are represented by the :class:`buildbot.process.slavebuilder.SlaveBuilder` class. The identical names are a source of confusion. The following will refer to these as the slave-side and master-side SlaveBuilder classes. Each object keeps a reference to its opposite in ``self.remote``.hMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Knh_hhG]r(hhX@On the slave side, builders are represented as instances of the rr}r(hLX@On the slave side, builders are represented as instances of the hMjubh)r}r(hLX$:class:`buildslave.bot.SlaveBuilder`rhMjhNhQhShhU}r(UreftypeXclasshʼnhXbuildslave.bot.SlaveBuilderU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KnhG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-classrehY]hZ]h\]uhMjhG]rhhXbuildslave.bot.SlaveBuilderrr}r(hLUhMjubahShubaubhhX9 class. On the master side, they are represented by the rr}r(hLX9 class. On the master side, they are represented by the hMjubh)r}r(hLX3:class:`buildbot.process.slavebuilder.SlaveBuilder`rhMjhNhQhShhU}r(UreftypeXclasshʼnhX*buildbot.process.slavebuilder.SlaveBuilderU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KnhG]rh)r}r (hLjhU}r (hW]hX]r (hjXpy-classr ehY]hZ]h\]uhMjhG]r hhX*buildbot.process.slavebuilder.SlaveBuilderrr}r(hLUhMjubahShubaubhhX class. The identical names are a source of confusion. The following will refer to these as the slave-side and master-side SlaveBuilder classes. Each object keeps a reference to its opposite in rr}r(hLX class. The identical names are a source of confusion. The following will refer to these as the slave-side and master-side SlaveBuilder classes. Each object keeps a reference to its opposite in hMjubh)r}r(hLX``self.remote``hU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhX self.remoterr}r(hLUhMjubahShubhhX.r}r(hLX.hMjubeubhI)r}r(hLUhMjhNhQhShThU}r(hW]hX]hY]hZ]r h5ah\]r!hauh^Kvh_hhG]r"(ha)r#}r$(hLXSlave-Side SlaveBuilder Methodsr%hMjhNhQhShehU}r&(hW]hX]hY]hZ]h\]uh^Kvh_hhG]r'hhXSlave-Side SlaveBuilder Methodsr(r)}r*(hLj%hMj#ubaubjc)r+}r,(hLUhMjhNhQhSjfhU}r-(hW]hX]hY]hZ]h\]uh^Nh_hhG]r.(ji)r/}r0(hLXk:meth:`~buildslave.bot.SlaveBuilder.remote_setMaster` Provides a reference to the master-side SlaveBuilder hMj+hNhQhSjlhU}r1(hW]hX]hY]hZ]h\]uh^KyhG]r2(jo)r3}r4(hLX5:meth:`~buildslave.bot.SlaveBuilder.remote_setMaster`r5hMj/hNhQhSjshU}r6(hW]hX]hY]hZ]h\]uh^KyhG]r7h)r8}r9(hLj5hMj3hNhQhShhU}r:(UreftypeXmethhʼnhX,buildslave.bot.SlaveBuilder.remote_setMasterU refdomainXpyr;hZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KyhG]r<h)r=}r>(hLj5hU}r?(hW]hX]r@(hj;Xpy-methrAehY]hZ]h\]uhMj8hG]rBhhXremote_setMasterrCrD}rE(hLUhMj=ubahShubaubaubj)rF}rG(hLUhU}rH(hW]hX]hY]hZ]h\]uhMj/hG]rIhl)rJ}rK(hLX4Provides a reference to the master-side SlaveBuilderrLhMjFhNhQhShphU}rM(hW]hX]hY]hZ]h\]uh^KyhG]rNhhX4Provides a reference to the master-side SlaveBuilderrOrP}rQ(hLjLhMjJubaubahSjubeubji)rR}rS(hLX}:meth:`~buildslave.bot.SlaveBuilder.remote_print` Adds a message to the slave logfile; used to check round-trip connectivity hMj+hNhQhSjlhU}rT(hW]hX]hY]hZ]h\]uh^K|h_hhG]rU(jo)rV}rW(hLX1:meth:`~buildslave.bot.SlaveBuilder.remote_print`rXhMjRhNhQhSjshU}rY(hW]hX]hY]hZ]h\]uh^K|hG]rZh)r[}r\(hLjXhMjVhNhQhShhU}r](UreftypeXmethhʼnhX(buildslave.bot.SlaveBuilder.remote_printU refdomainXpyr^hZ]hY]U refexplicithW]hX]h\]hhhNhNuh^K|hG]r_h)r`}ra(hLjXhU}rb(hW]hX]rc(hj^Xpy-methrdehY]hZ]h\]uhMj[hG]rehhX remote_printrfrg}rh(hLUhMj`ubahShubaubaubj)ri}rj(hLUhU}rk(hW]hX]hY]hZ]h\]uhMjRhG]rlhl)rm}rn(hLXJAdds a message to the slave logfile; used to check round-trip connectivityrohMjihNhQhShphU}rp(hW]hX]hY]hZ]h\]uh^K|hG]rqhhXJAdds a message to the slave logfile; used to check round-trip connectivityrrrs}rt(hLjohMjmubaubahSjubeubji)ru}rv(hLX:meth:`~buildslave.bot.SlaveBuilder.remote_startBuild` Indicates that a build is about to start, and that any subsequent commands are part of that build hMj+hNhQhSjlhU}rw(hW]hX]hY]hZ]h\]uh^Kh_hhG]rx(jo)ry}rz(hLX6:meth:`~buildslave.bot.SlaveBuilder.remote_startBuild`r{hMjuhNhQhSjshU}r|(hW]hX]hY]hZ]h\]uh^KhG]r}h)r~}r(hLj{hMjyhNhQhShhU}r(UreftypeXmethhʼnhX-buildslave.bot.SlaveBuilder.remote_startBuildU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rh)r}r(hLj{hU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMj~hG]rhhXremote_startBuildrr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjuhG]rhl)r}r(hLXaIndicates that a build is about to start, and that any subsequent commands are part of that buildrhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhXaIndicates that a build is about to start, and that any subsequent commands are part of that buildrr}r(hLjhMjubaubahSjubeubji)r}r(hLX]:meth:`~buildslave.bot.SlaveBuilder.remote_startCommand` Invokes a command on the slave side hMj+hNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]r(jo)r}r(hLX8:meth:`~buildslave.bot.SlaveBuilder.remote_startCommand`rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^KhG]rh)r}r(hLjhMjhNhQhShhU}r(UreftypeXmethhʼnhX/buildslave.bot.SlaveBuilder.remote_startCommandU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhXremote_startCommandrr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhl)r}r(hLX#Invokes a command on the slave siderhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhX#Invokes a command on the slave siderr}r(hLjhMjubaubahSjubeubji)r}r(hLXf:meth:`~buildslave.bot.SlaveBuilder.remote_interruptCommand` Interrupts the currently-running command hMj+hNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]r(jo)r}r(hLX<:meth:`~buildslave.bot.SlaveBuilder.remote_interruptCommand`rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^KhG]rh)r}r(hLjhMjhNhQhShhU}r(UreftypeXmethhʼnhX3buildslave.bot.SlaveBuilder.remote_interruptCommandU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhXremote_interruptCommandrr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhl)r}r(hLX(Interrupts the currently-running commandrhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhX(Interrupts the currently-running commandrr}r(hLjhMjubaubahSjubeubji)r}r(hLXR:meth:`~buildslave.bot.SlaveBuilder.remote_shutdown` Shuts down the slave cleanly hMj+hNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]r(jo)r}r(hLX4:meth:`~buildslave.bot.SlaveBuilder.remote_shutdown`rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^KhG]rh)r}r(hLjhMjhNhQhShhU}r(UreftypeXmethhʼnhX+buildslave.bot.SlaveBuilder.remote_shutdownU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhXremote_shutdownrr}r(hLUhMjubahShubaubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhl)r}r(hLXShuts down the slave cleanlyrhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhXShuts down the slave cleanlyrr}r(hLjhMjubaubahSjubeubeubeubhI)r}r(hLUhMjhNhQhShThU}r(hW]hX]hY]hZ]rh8ah\]rhauh^Kh_hhG]r(ha)r}r(hLX Master-side SlaveBuilder Methodsr hMjhNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Kh_hhG]r hhX Master-side SlaveBuilder Methodsr r }r(hLj hMjubaubhl)r}r(hLX<The master side does not have any remotely-callable methods.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rhhX<The master side does not have any remotely-callable methods.rr}r(hLjhMjubaubeubeubhI)r}r(hLUhMhJhNhQhShThU}r(hW]hX]hY]hZ]rhAah\]rhauh^Kh_hhG]r(ha)r}r(hLXCommandsrhMjhNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Kh_hhG]r!hhXCommandsr"r#}r$(hLjhMjubaubhl)r%}r&(hLXActual work done by the slave is represented on the master side by a :class:`buildbot.process.buildstep.RemoteCommand` instance.hMjhNhQhShphU}r'(hW]hX]hY]hZ]h\]uh^Kh_hhG]r((hhXEActual work done by the slave is represented on the master side by a r)r*}r+(hLXEActual work done by the slave is represented on the master side by a hMj%ubh)r,}r-(hLX1:class:`buildbot.process.buildstep.RemoteCommand`r.hMj%hNhQhShhU}r/(UreftypeXclasshʼnhX(buildbot.process.buildstep.RemoteCommandU refdomainXpyr0hZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]r1h)r2}r3(hLj.hU}r4(hW]hX]r5(hj0Xpy-classr6ehY]hZ]h\]uhMj,hG]r7hhX(buildbot.process.buildstep.RemoteCommandr8r9}r:(hLUhMj2ubahShubaubhhX instance.r;r<}r=(hLX instance.hMj%ubeubhl)r>}r?(hLX]The command instance keeps a reference to the slave-side :class:`buildslave.bot.SlaveBuilder`, and calls methods like :meth:`~buildslave.bot.SlaveBuilder.remote_startCommand` to start new commands. Once that method is called, the :class:`~buildslave.bot.SlaveBuilder` instance keeps a reference to the command, and calls the following methods on it:hMjhNhQhShphU}r@(hW]hX]hY]hZ]h\]uh^Kh_hhG]rA(hhX9The command instance keeps a reference to the slave-side rBrC}rD(hLX9The command instance keeps a reference to the slave-side hMj>ubh)rE}rF(hLX$:class:`buildslave.bot.SlaveBuilder`rGhMj>hNhQhShhU}rH(UreftypeXclasshʼnhXbuildslave.bot.SlaveBuilderU refdomainXpyrIhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rJh)rK}rL(hLjGhU}rM(hW]hX]rN(hjIXpy-classrOehY]hZ]h\]uhMjEhG]rPhhXbuildslave.bot.SlaveBuilderrQrR}rS(hLUhMjKubahShubaubhhX, and calls methods like rTrU}rV(hLX, and calls methods like hMj>ubh)rW}rX(hLX8:meth:`~buildslave.bot.SlaveBuilder.remote_startCommand`rYhMj>hNhQhShhU}rZ(UreftypeXmethhʼnhX/buildslave.bot.SlaveBuilder.remote_startCommandU refdomainXpyr[hZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]r\h)r]}r^(hLjYhU}r_(hW]hX]r`(hj[Xpy-methraehY]hZ]h\]uhMjWhG]rbhhXremote_startCommandrcrd}re(hLUhMj]ubahShubaubhhX8 to start new commands. Once that method is called, the rfrg}rh(hLX8 to start new commands. Once that method is called, the hMj>ubh)ri}rj(hLX%:class:`~buildslave.bot.SlaveBuilder`rkhMj>hNhQhShhU}rl(UreftypeXclasshʼnhXbuildslave.bot.SlaveBuilderU refdomainXpyrmhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rnh)ro}rp(hLjkhU}rq(hW]hX]rr(hjmXpy-classrsehY]hZ]h\]uhMjihG]rthhX SlaveBuilderrurv}rw(hLUhMjoubahShubaubhhXR instance keeps a reference to the command, and calls the following methods on it:rxry}rz(hLXR instance keeps a reference to the command, and calls the following methods on it:hMj>ubeubhI)r{}r|(hLUhMjhNhQhShThU}r}(hW]hX]hY]hZ]r~h:meth:`~buildbot.process.buildstep.RemoteCommand.remoteUpdate`rhMjhNhQhShhU}r(UreftypeXmethhʼnhX5buildbot.process.buildstep.RemoteCommand.remoteUpdateU refdomainXpyrhZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]rh)r}r(hLjhU}r(hW]hX]r(hjXpy-methrehY]hZ]h\]uhMjhG]rhhX remoteUpdaterr}r(hLUhMjubahShubaubhhX.r}r(hLX.hMjubeubhl)r}r (hLXUpdates with different keys can be combined into a single dictionary or delivered sequentially as list elements, at the slave's option.r!hMjhNhQhShphU}r"(hW]hX]hY]hZ]h\]uh^Kh_hhG]r#hhXUpdates with different keys can be combined into a single dictionary or delivered sequentially as list elements, at the slave's option.r$r%}r&(hLj!hMjubaubhl)r'}r((hLXTo summarize, an ``updates`` parameter to :meth:`~buildbot.process.buildstep.RemoteCommand.remote_update` might look like this::hMjhNhQhShphU}r)(hW]hX]hY]hZ]h\]uh^Kh_hhG]r*(hhXTo summarize, an r+r,}r-(hLXTo summarize, an hMj'ubh)r.}r/(hLX ``updates``hU}r0(hW]hX]hY]hZ]h\]uhMj'hG]r1hhXupdatesr2r3}r4(hLUhMj.ubahShubhhX parameter to r5r6}r7(hLX parameter to hMj'ubh)r8}r9(hLX?:meth:`~buildbot.process.buildstep.RemoteCommand.remote_update`r:hMj'hNhQhShhU}r;(UreftypeXmethhʼnhX6buildbot.process.buildstep.RemoteCommand.remote_updateU refdomainXpyr<hZ]hY]U refexplicithW]hX]h\]hhhNhNuh^KhG]r=h)r>}r?(hLj:hU}r@(hW]hX]rA(hj<Xpy-methrBehY]hZ]h\]uhMj8hG]rChhX remote_updaterDrE}rF(hLUhMj>ubahShubaubhhX might look like this:rGrH}rI(hLX might look like this:hMj'ubeubcdocutils.nodes literal_block rJ)rK}rL(hLX[ [ { 'header' : 'running command..' }, 0 ], [ { 'stdout' : 'abcd', 'stderr' : 'local modifications' }, 0 ], [ { 'log' : ( 'cmd.log', 'cmd invoked at 12:33 pm\n' ) }, 0 ], [ { 'rc' : 0 }, 0 ], ]hMjhNhQhSU literal_blockrMhU}rN(U xml:spacerOUpreserverPhZ]hY]hW]hX]h\]uh^Kh_hhG]rQhhX[ [ { 'header' : 'running command..' }, 0 ], [ { 'stdout' : 'abcd', 'stderr' : 'local modifications' }, 0 ], [ { 'log' : ( 'cmd.log', 'cmd invoked at 12:33 pm\n' ) }, 0 ], [ { 'rc' : 0 }, 0 ], ]rRrS}rT(hLUhMjKubaubhI)rU}rV(hLUhMjhNhQhShThU}rW(hW]hX]hY]hZ]rXh7ah\]rYhauh^Kh_hhG]rZ(ha)r[}r\(hLXDefined Commandsr]hMjUhNhQhShehU}r^(hW]hX]hY]hZ]h\]uh^Kh_hhG]r_hhXDefined Commandsr`ra}rb(hLj]hMj[ubaubhl)rc}rd(hLX1The following commands are defined on the slaves.rehMjUhNhQhShphU}rf(hW]hX]hY]hZ]h\]uh^Kh_hhG]rghhX1The following commands are defined on the slaves.rhri}rj(hLjehMjcubaubj)rk}rl(hLX.. _shell-command-args:hMjUhNhQhSjhU}rm(hZ]hY]hW]hX]h\]jh0uh^Kh_hhG]ubhI)rn}ro(hLUhMjUhNhQj}rph jkshShThU}rq(hW]hX]hY]hZ]rr(h9h0eh\]rs(hh euh^Kh_hj}rth0jkshG]ru(ha)rv}rw(hLXshellrxhMjnhNhQhShehU}ry(hW]hX]hY]hZ]h\]uh^Kh_hhG]rzhhXshellr{r|}r}(hLjxhMjvubaubhl)r~}r(hLXORuns a shell command on the slave. This command takes the following arguments:rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rhhXORuns a shell command on the slave. This command takes the following arguments:rr}r(hLjhMj~ubaubhl)r}r(hLX ``command``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXcommandrr}r(hLUhMjubahShubaubcdocutils.nodes block_quote r)r}r(hLUhMjnhNhQhSU block_quoterhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLXThe command to run. If this is a string, will be passed to the system shell as a string. Otherwise, it must be a list, which will be executed directly.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhXThe command to run. If this is a string, will be passed to the system shell as a string. Otherwise, it must be a list, which will be executed directly.rr}r(hLjhMjubaubaubhl)r}r(hLX ``workdir``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXworkdirrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLXCDirectory in which to run the command, relative to the builder dir.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhXCDirectory in which to run the command, relative to the builder dir.rr}r(hLjhMjubaubaubhl)r}r(hLX``env``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXenvrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLX A dictionary of environment variables to augment or replace the existing environment on the slave. In this dictionary, ``PYTHONPATH`` is treated specially: it should be a list of path components, rather than a string, and will be prepended to the existing Python path.hMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]r(hhXxA dictionary of environment variables to augment or replace the existing environment on the slave. In this dictionary, rr}r(hLXxA dictionary of environment variables to augment or replace the existing environment on the slave. In this dictionary, hMjubh)r}r(hLX``PYTHONPATH``hU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhX PYTHONPATHrr}r(hLUhMjubahShubhhX is treated specially: it should be a list of path components, rather than a string, and will be prepended to the existing Python path.rr}r(hLX is treated specially: it should be a list of path components, rather than a string, and will be prepended to the existing Python path.hMjubeubaubhl)r}r(hLX``initial_stdin``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhX initial_stdinrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLXSA string which will be written to the command's standard input before it is closed.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhXSA string which will be written to the command's standard input before it is closed.rr}r(hLjhMjubaubaubhl)r}r(hLX``want_stdout``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhX want_stdoutrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLX2If false, then no updates will be sent for stdout.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhX2If false, then no updates will be sent for stdout.rr}r(hLjhMjubaubaubhl)r }r (hLX``want_stderr``r hMjnhNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Kh_hhG]r h)r}r(hLj hU}r(hW]hX]hY]hZ]h\]uhMj hG]rhhX want_stderrrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLX2If false, then no updates will be sent for stderr.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhX2If false, then no updates will be sent for stderr.rr}r (hLjhMjubaubaubhl)r!}r"(hLX ``usePTY``r#hMjnhNhQhShphU}r$(hW]hX]hY]hZ]h\]uh^Kh_hhG]r%h)r&}r'(hLj#hU}r((hW]hX]hY]hZ]h\]uhMj!hG]r)hhXusePTYr*r+}r,(hLUhMj&ubahShubaubj)r-}r.(hLUhMjnhNhQhSjhU}r/(hW]hX]hY]hZ]h\]uh^Nh_hhG]r0hl)r1}r2(hLXIf true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's ``buildbot.tac``.hMj-hNhQhShphU}r3(hW]hX]hY]hZ]h\]uh^KhG]r4(hhXqIf true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's r5r6}r7(hLXqIf true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's hMj1ubh)r8}r9(hLX``buildbot.tac``hU}r:(hW]hX]hY]hZ]h\]uhMj1hG]r;hhX buildbot.tacr<r=}r>(hLUhMj8ubahShubhhX.r?}r@(hLX.hMj1ubeubaubhl)rA}rB(hLX``not_really``rChMjnhNhQhShphU}rD(hW]hX]hY]hZ]h\]uh^Kh_hhG]rEh)rF}rG(hLjChU}rH(hW]hX]hY]hZ]h\]uhMjAhG]rIhhX not_reallyrJrK}rL(hLUhMjFubahShubaubj)rM}rN(hLUhMjnhNhQhSjhU}rO(hW]hX]hY]hZ]h\]uh^Nh_hhG]rPhl)rQ}rR(hLX7If true, skip execution and return an update with rc=0.rShMjMhNhQhShphU}rT(hW]hX]hY]hZ]h\]uh^KhG]rUhhX7If true, skip execution and return an update with rc=0.rVrW}rX(hLjShMjQubaubaubhl)rY}rZ(hLX ``timeout``r[hMjnhNhQhShphU}r\(hW]hX]hY]hZ]h\]uh^Kh_hhG]r]h)r^}r_(hLj[hU}r`(hW]hX]hY]hZ]h\]uhMjYhG]rahhXtimeoutrbrc}rd(hLUhMj^ubahShubaubj)re}rf(hLUhMjnhNhQhSjhU}rg(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhhl)ri}rj(hLX9Maximum time without output before the command is killed.rkhMjehNhQhShphU}rl(hW]hX]hY]hZ]h\]uh^KhG]rmhhX9Maximum time without output before the command is killed.rnro}rp(hLjkhMjiubaubaubhl)rq}rr(hLX ``maxTime``rshMjnhNhQhShphU}rt(hW]hX]hY]hZ]h\]uh^Kh_hhG]ruh)rv}rw(hLjshU}rx(hW]hX]hY]hZ]h\]uhMjqhG]ryhhXmaxTimerzr{}r|(hLUhMjvubahShubaubj)r}}r~(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLXAMaximum overall time from the start before the command is killed.rhMj}hNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]rhhXAMaximum overall time from the start before the command is killed.rr}r(hLjhMjubaubaubhl)r}r(hLX ``logfiles``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Kh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXlogfilesrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]r(hl)r}r(hLX1A dictionary specifying logfiles other than stdio. Keys are the logfile names, and values give the workdir-relative filename of the logfile. Alternately, a value can be a dictionary; in this case, the dictionary must have a ``filename`` key specifying the filename, and can also have the following keys:hMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^KhG]r(hhXA dictionary specifying logfiles other than stdio. Keys are the logfile names, and values give the workdir-relative filename of the logfile. Alternately, a value can be a dictionary; in this case, the dictionary must have a rr}r(hLXA dictionary specifying logfiles other than stdio. Keys are the logfile names, and values give the workdir-relative filename of the logfile. Alternately, a value can be a dictionary; in this case, the dictionary must have a hMjubh)r}r(hLX ``filename``hU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXfilenamerr}r(hLUhMjubahShubhhXC key specifying the filename, and can also have the following keys:rr}r(hLXC key specifying the filename, and can also have the following keys:hMjubeubhl)r}r(hLX ``follow``rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^MhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXfollowrr}r(hLUhMjubahShubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhl)r}r(hLX[Only follow the file from its current end-of-file, rather that starting from the beginning.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^MhG]rhhX[Only follow the file from its current end-of-file, rather that starting from the beginning.rr}r(hLjhMjubaubahSjubeubhl)r}r(hLX``logEnviron``rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^Mh_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhX logEnvironrr}r(hLUhMjubahShubaubj)r}r(hLUhMjnhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLX7If false, the command's environment will not be logged.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^MhG]rhhX7If false, the command's environment will not be logged.rr}r(hLjhMjubaubaubhl)r}r(hLX2The ``shell`` command sends the following updates:rhMjnhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M h_hhG]r(hhXThe rr}r(hLXThe hMjubh)r}r(hLX ``shell``hU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXshellrr}r(hLUhMjubahShubhhX% command sends the following updates:rr}r(hLX% command sends the following updates:hMjubeubjc)r}r(hLUhMjnhNhQhSjfhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]r(ji)r}r(hLX``stdout`` The data is a bytestring which represents a continuation of the stdout stream. Note that the bytestring boundaries are not necessarily aligned with newlines. hMjhNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^MhG]r(jo)r}r(hLX ``stdout``rhMjhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^MhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXstdoutrr}r(hLUhMjubahShubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhl)r}r(hLXThe data is a bytestring which represents a continuation of the stdout stream. Note that the bytestring boundaries are not necessarily aligned with newlines.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M hG]rhhXThe data is a bytestring which represents a continuation of the stdout stream. Note that the bytestring boundaries are not necessarily aligned with newlines.r r }r (hLjhMjubaubahSjubeubji)r }r (hLX<``stderr`` Similar to ``stdout``, but for the error stream. hMjhNhQhSjlhU}r(hW]hX]hY]hZ]h\]uh^Mh_hhG]r(jo)r}r(hLX ``stderr``rhMj hNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^MhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXstderrrr}r(hLUhMjubahShubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMj hG]rhl)r }r!(hLX0Similar to ``stdout``, but for the error stream.hMjhNhQhShphU}r"(hW]hX]hY]hZ]h\]uh^MhG]r#(hhX Similar to r$r%}r&(hLX Similar to hMj ubh)r'}r((hLX ``stdout``hU}r)(hW]hX]hY]hZ]h\]uhMj hG]r*hhXstdoutr+r,}r-(hLUhMj'ubahShubhhX, but for the error stream.r.r/}r0(hLX, but for the error stream.hMj ubeubahSjubeubji)r1}r2(hLXb``header`` Similar to ``stdout``, but containing data for a stream of buildbot-specific metadata. hMjhNhQhSjlhU}r3(hW]hX]hY]hZ]h\]uh^Mh_hhG]r4(jo)r5}r6(hLX ``header``r7hMj1hNhQhSjshU}r8(hW]hX]hY]hZ]h\]uh^MhG]r9h)r:}r;(hLj7hU}r<(hW]hX]hY]hZ]h\]uhMj5hG]r=hhXheaderr>r?}r@(hLUhMj:ubahShubaubj)rA}rB(hLUhU}rC(hW]hX]hY]hZ]h\]uhMj1hG]rDhl)rE}rF(hLXVSimilar to ``stdout``, but containing data for a stream of buildbot-specific metadata.hMjAhNhQhShphU}rG(hW]hX]hY]hZ]h\]uh^MhG]rH(hhX Similar to rIrJ}rK(hLX Similar to hMjEubh)rL}rM(hLX ``stdout``hU}rN(hW]hX]hY]hZ]h\]uhMjEhG]rOhhXstdoutrPrQ}rR(hLUhMjLubahShubhhXA, but containing data for a stream of buildbot-specific metadata.rSrT}rU(hLXA, but containing data for a stream of buildbot-specific metadata.hMjEubeubahSjubeubji)rV}rW(hLX``rc`` The exit status of the command, where -- in keeping with UNIX tradition -- 0 indicates success and any nonzero value is considered a failure. No further updates should be sent after an ``rc``. hMjhNhQhSjlhU}rX(hW]hX]hY]hZ]h\]uh^Mh_hhG]rY(jo)rZ}r[(hLX``rc``r\hMjVhNhQhSjshU}r](hW]hX]hY]hZ]h\]uh^MhG]r^h)r_}r`(hLj\hU}ra(hW]hX]hY]hZ]h\]uhMjZhG]rbhhXrcrcrd}re(hLUhMj_ubahShubaubj)rf}rg(hLUhU}rh(hW]hX]hY]hZ]h\]uhMjVhG]rihl)rj}rk(hLXThe exit status of the command, where -- in keeping with UNIX tradition -- 0 indicates success and any nonzero value is considered a failure. No further updates should be sent after an ``rc``.hMjfhNhQhShphU}rl(hW]hX]hY]hZ]h\]uh^MhG]rm(hhXThe exit status of the command, where -- in keeping with UNIX tradition -- 0 indicates success and any nonzero value is considered a failure. No further updates should be sent after an rnro}rp(hLXThe exit status of the command, where -- in keeping with UNIX tradition -- 0 indicates success and any nonzero value is considered a failure. No further updates should be sent after an hMjjubh)rq}rr(hLX``rc``hU}rs(hW]hX]hY]hZ]h\]uhMjjhG]rthhXrcrurv}rw(hLUhMjqubahShubhhX.rx}ry(hLX.hMjjubeubahSjubeubji)rz}r{(hLX``log`` This update contains data for a logfile other than stdio. The data associated with the update is a tuple of the log name and the data for that log. Note that non-stdio logs do not distinguish output, error, and header streams. hMjhNhQhSjlhU}r|(hW]hX]hY]hZ]h\]uh^M!h_hhG]r}(jo)r~}r(hLX``log``rhMjzhNhQhSjshU}r(hW]hX]hY]hZ]h\]uh^M!hG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMj~hG]rhhXlogrr}r(hLUhMjubahShubaubj)r}r(hLUhU}r(hW]hX]hY]hZ]h\]uhMjzhG]rhl)r}r(hLXThis update contains data for a logfile other than stdio. The data associated with the update is a tuple of the log name and the data for that log. Note that non-stdio logs do not distinguish output, error, and header streams.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^MhG]rhhXThis update contains data for a logfile other than stdio. The data associated with the update is a tuple of the log name and the data for that log. Note that non-stdio logs do not distinguish output, error, and header streams.rr}r(hLjhMjubaubahSjubeubeubeubhI)r}r(hLUhMjUhNhQhShThU}r(hW]hX]hY]hZ]rh:ah\]rhauh^M$h_hhG]r(ha)r}r(hLX uploadFilerhMjhNhQhShehU}r(hW]hX]hY]hZ]h\]uh^M$h_hhG]rhhX uploadFilerr}r(hLjhMjubaubhl)r}r(hLX>Upload a file from the slave to the master. The arguments arerhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M&h_hhG]rhhX>Upload a file from the slave to the master. The arguments arerr}r(hLjhMjubaubhl)r}r(hLX ``workdir``rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M(h_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXworkdirrr}r(hLUhMjubahShubaubj)r}r(hLUhMjhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLXGThe base directory for the filename, relative to the builder's basedir.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M*hG]rhhXGThe base directory for the filename, relative to the builder's basedir.rr}r(hLjhMjubaubaubhl)r}r(hLX ``slavesrc``rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M,h_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXslavesrcrr}r(hLUhMjubahShubaubj)r}r(hLUhMjhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLX<Name of the filename to read from., relative to the workdir.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M.hG]rhhX<Name of the filename to read from., relative to the workdir.rr}r(hLjhMjubaubaubhl)r}r(hLX ``writer``rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M0h_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXwriterrr}r(hLUhMjubahShubaubj)r}r(hLUhMjhNhQhSjhU}r(hW]hX]hY]hZ]h\]uh^Nh_hhG]rhl)r}r(hLX7A remote reference to a writer object, described below.rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M2hG]rhhX7A remote reference to a writer object, described below.rr}r(hLjhMjubaubaubhl)r}r(hLX ``maxsize``rhMjhNhQhShphU}r(hW]hX]hY]hZ]h\]uh^M4h_hhG]rh)r}r(hLjhU}r(hW]hX]hY]hZ]h\]uhMjhG]rhhXmaxsizerr}r(hLUhMjubahShubaubj)r }r (hLUhMjhNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXeMaximum size, in bytes, of the file to write. The operation will fail if the file exceeds this size.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^M6hG]r hhXeMaximum size, in bytes, of the file to write. The operation will fail if the file exceeds this size.r r }r (hLj hMj ubaubaubhl)r }r (hLX ``blocksize``r hMjhNhQhShphU}r (hW]hX]hY]hZ]h\]uh^M9h_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX blocksizer r }r (hLUhMj ubahShubaubj)r }r (hLUhMjhNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX/The block size with which to transfer the file.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^M;hG]r hhX/The block size with which to transfer the file.r! r" }r# (hLj hMj ubaubaubhl)r$ }r% (hLX ``keepstamp``r& hMjhNhQhShphU}r' (hW]hX]hY]hZ]h\]uh^M=h_hhG]r( h)r) }r* (hLj& hU}r+ (hW]hX]hY]hZ]h\]uhMj$ hG]r, hhX keepstampr- r. }r/ (hLUhMj) ubahShubaubj)r0 }r1 (hLUhMjhNhQhSjhU}r2 (hW]hX]hY]hZ]h\]uh^Nh_hhG]r3 hl)r4 }r5 (hLX7If true, preserve the file modified and accessed times.r6 hMj0 hNhQhShphU}r7 (hW]hX]hY]hZ]h\]uh^M?hG]r8 hhX7If true, preserve the file modified and accessed times.r9 r: }r; (hLj6 hMj4 ubaubaubhl)r< }r= (hLX*The slave calls a few remote methods on the writer object. First, the ``write`` method is called with a bytestring containing data, until all of the data has been transmitted. Then, the slave calls the writer's ``close``, followed (if ``keepstamp`` is true) by a call to ``upload(atime, mtime)``.hMjhNhQhShphU}r> (hW]hX]hY]hZ]h\]uh^MAh_hhG]r? (hhXGThe slave calls a few remote methods on the writer object. First, the r@ rA }rB (hLXGThe slave calls a few remote methods on the writer object. First, the hMj< ubh)rC }rD (hLX ``write``hU}rE (hW]hX]hY]hZ]h\]uhMj< hG]rF hhXwriterG rH }rI (hLUhMjC ubahShubhhX method is called with a bytestring containing data, until all of the data has been transmitted. Then, the slave calls the writer's rJ rK }rL (hLX method is called with a bytestring containing data, until all of the data has been transmitted. Then, the slave calls the writer's hMj< ubh)rM }rN (hLX ``close``hU}rO (hW]hX]hY]hZ]h\]uhMj< hG]rP hhXcloserQ rR }rS (hLUhMjM ubahShubhhX, followed (if rT rU }rV (hLX, followed (if hMj< ubh)rW }rX (hLX ``keepstamp``hU}rY (hW]hX]hY]hZ]h\]uhMj< hG]rZ hhX keepstampr[ r\ }r] (hLUhMjW ubahShubhhX is true) by a call to r^ r_ }r` (hLX is true) by a call to hMj< ubh)ra }rb (hLX``upload(atime, mtime)``hU}rc (hW]hX]hY]hZ]h\]uhMj< hG]rd hhXupload(atime, mtime)re rf }rg (hLUhMja ubahShubhhX.rh }ri (hLX.hMj< ubeubhl)rj }rk (hLXWThis command sends ``rc`` and ``stderr`` updates, as defined for the ``shell`` command.hMjhNhQhShphU}rl (hW]hX]hY]hZ]h\]uh^MFh_hhG]rm (hhXThis command sends rn ro }rp (hLXThis command sends hMjj ubh)rq }rr (hLX``rc``hU}rs (hW]hX]hY]hZ]h\]uhMjj hG]rt hhXrcru rv }rw (hLUhMjq ubahShubhhX and rx ry }rz (hLX and hMjj ubh)r{ }r| (hLX ``stderr``hU}r} (hW]hX]hY]hZ]h\]uhMjj hG]r~ hhXstderrr r }r (hLUhMj{ ubahShubhhX updates, as defined for the r r }r (hLX updates, as defined for the hMjj ubh)r }r (hLX ``shell``hU}r (hW]hX]hY]hZ]h\]uhMjj hG]r hhXshellr r }r (hLUhMj ubahShubhhX command.r r }r (hLX command.hMjj ubeubeubhI)r }r (hLUhMjUhNhQhShThU}r (hW]hX]hY]hZ]r h>ah\]r hauh^MJh_hhG]r (ha)r }r (hLXuploadDirectoryr hMj hNhQhShehU}r (hW]hX]hY]hZ]h\]uh^MJh_hhG]r hhXuploadDirectoryr r }r (hLj hMj ubaubhl)r }r (hLXSimilar to ``uploadFile``, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MLh_hhG]r (hhX Similar to r r }r (hLX Similar to hMj ubh)r }r (hLX``uploadFile``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX uploadFiler r }r (hLUhMj ubahShubhhXz, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:r r }r (hLXz, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:hMj ubeubhl)r }r (hLX=``workdir`` ``slavesrc`` ``writer`` ``maxsize`` ``blocksize``hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MOh_hhG]r (h)r }r (hLX ``workdir``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXworkdirr r }r (hLUhMj ubahShubhhX r }r (hLX hMj ubh)r }r (hLX ``slavesrc``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXslavesrcr r }r (hLUhMj ubahShubhhX r }r (hLX hMj ubh)r }r (hLX ``writer``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXwriterr r }r (hLUhMj ubahShubhhX r }r (hLX hMj ubh)r }r (hLX ``maxsize``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXmaxsizer r }r (hLUhMj ubahShubhhX r }r (hLX hMj ubh)r }r (hLX ``blocksize``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX blocksizer r }r (hLUhMj ubahShubeubj)r }r (hLUhMj hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXSee ``uploadFile``hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MUhG]r (hhXSee r r }r (hLXSee hMj ubh)r }r (hLX``uploadFile``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX uploadFiler r }r (hLUhMj ubahShubeubaubhl)r }r (hLX ``compress``r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MWh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXcompressr r }r (hLUhMj ubahShubaubj)r }r (hLUhMj hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXHCompression algorithm to use -- one of ``None``, ``'bz2'``, or ``'gz'``.hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MYhG]r (hhX'Compression algorithm to use -- one of r r }r (hLX'Compression algorithm to use -- one of hMj ubh)r }r (hLX``None``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXNoner r }r (hLUhMj ubahShubhhX, r r }r (hLX, hMj ubh)r }r (hLX ``'bz2'``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX'bz2'r r }r (hLUhMj ubahShubhhX, or r r }r (hLX, or hMj ubh)r }r (hLX``'gz'``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX'gz'r r }r (hLUhMj ubahShubhhX.r! }r" (hLX.hMj ubeubaubhl)r# }r$ (hLXThe writer object is treated similarly to the ``uploadFile`` command, but after the file is closed, the slave calls the master's ``unpack`` method with no arguments to extract the tarball.hMj hNhQhShphU}r% (hW]hX]hY]hZ]h\]uh^M[h_hhG]r& (hhX.The writer object is treated similarly to the r' r( }r) (hLX.The writer object is treated similarly to the hMj# ubh)r* }r+ (hLX``uploadFile``hU}r, (hW]hX]hY]hZ]h\]uhMj# hG]r- hhX uploadFiler. r/ }r0 (hLUhMj* ubahShubhhXE command, but after the file is closed, the slave calls the master's r1 r2 }r3 (hLXE command, but after the file is closed, the slave calls the master's hMj# ubh)r4 }r5 (hLX ``unpack``hU}r6 (hW]hX]hY]hZ]h\]uhMj# hG]r7 hhXunpackr8 r9 }r: (hLUhMj4 ubahShubhhX1 method with no arguments to extract the tarball.r; r< }r= (hLX1 method with no arguments to extract the tarball.hMj# ubeubhl)r> }r? (hLXWThis command sends ``rc`` and ``stderr`` updates, as defined for the ``shell`` command.hMj hNhQhShphU}r@ (hW]hX]hY]hZ]h\]uh^M_h_hhG]rA (hhXThis command sends rB rC }rD (hLXThis command sends hMj> ubh)rE }rF (hLX``rc``hU}rG (hW]hX]hY]hZ]h\]uhMj> hG]rH hhXrcrI rJ }rK (hLUhMjE ubahShubhhX and rL rM }rN (hLX and hMj> ubh)rO }rP (hLX ``stderr``hU}rQ (hW]hX]hY]hZ]h\]uhMj> hG]rR hhXstderrrS rT }rU (hLUhMjO ubahShubhhX updates, as defined for the rV rW }rX (hLX updates, as defined for the hMj> ubh)rY }rZ (hLX ``shell``hU}r[ (hW]hX]hY]hZ]h\]uhMj> hG]r\ hhXshellr] r^ }r_ (hLUhMjY ubahShubhhX command.r` ra }rb (hLX command.hMj> ubeubeubhI)rc }rd (hLUhMjUhNhQhShThU}re (hW]hX]hY]hZ]rf hCah\]rg hauh^Mch_hhG]rh (ha)ri }rj (hLX downloadFilerk hMjc hNhQhShehU}rl (hW]hX]hY]hZ]h\]uh^Mch_hhG]rm hhX downloadFilern ro }rp (hLjk hMji ubaubhl)rq }rr (hLXbThis command will download a file from the master to the slave. It takes the following arguments:rs hMjc hNhQhShphU}rt (hW]hX]hY]hZ]h\]uh^Meh_hhG]ru hhXbThis command will download a file from the master to the slave. It takes the following arguments:rv rw }rx (hLjs hMjq ubaubhl)ry }rz (hLX ``workdir``r{ hMjc hNhQhShphU}r| (hW]hX]hY]hZ]h\]uh^Mhh_hhG]r} h)r~ }r (hLj{ hU}r (hW]hX]hY]hZ]h\]uhMjy hG]r hhXworkdirr r }r (hLUhMj~ ubahShubaubj)r }r (hLUhMjc hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXMBase directory for the destination filename, relative to the builder basedir.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MjhG]r hhXMBase directory for the destination filename, relative to the builder basedir.r r }r (hLj hMj ubaubaubhl)r }r (hLX ``slavedest``r hMjc hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mlh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX slavedestr r }r (hLUhMj ubahShubaubj)r }r (hLUhMjc hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX.Filename to write to, relative to the workdir.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MnhG]r hhX.Filename to write to, relative to the workdir.r r }r (hLj hMj ubaubaubhl)r }r (hLX ``reader``r hMjc hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mph_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXreaderr r }r (hLUhMj ubahShubaubj)r }r (hLUhMjc hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX7A remote reference to a reader object, described below.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MrhG]r hhX7A remote reference to a reader object, described below.r r }r (hLj hMj ubaubaubhl)r }r (hLX ``maxsize``r hMjc hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mth_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXmaxsizer r }r (hLUhMj ubahShubaubj)r }r (hLUhMjc hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXMaximum size of the file.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MvhG]r hhXMaximum size of the file.r r }r (hLj hMj ubaubaubhl)r }r (hLX ``blocksize``r hMjc hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mxh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX blocksizer r }r (hLUhMj ubahShubaubj)r }r (hLUhMjc hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX/The block size with which to transfer the file.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MzhG]r hhX/The block size with which to transfer the file.r r }r (hLj hMj ubaubaubhl)r }r (hLX``mode``r hMjc hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^M|h_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXmoder r }r (hLUhMj ubahShubaubj)r }r (hLUhMjc hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXAccess mode for the new file.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^M~hG]r hhXAccess mode for the new file.r r }r (hLj hMj ubaubaubhl)r }r (hLXThe reader object's ``read(maxsize)`` method will be called with a maximum size, which will return no more than that number of bytes as a bytestring. At EOF, it will return an empty string. Once EOF is received, the slave will call the remote ``close`` method.hMjc hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r (hhXThe reader object's r r }r (hLXThe reader object's hMj ubh)r }r (hLX``read(maxsize)``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX read(maxsize)r r }r (hLUhMj ubahShubhhX method will be called with a maximum size, which will return no more than that number of bytes as a bytestring. At EOF, it will return an empty string. Once EOF is received, the slave will call the remote r r }r (hLX method will be called with a maximum size, which will return no more than that number of bytes as a bytestring. At EOF, it will return an empty string. Once EOF is received, the slave will call the remote hMj ubh)r }r (hLX ``close``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXcloser r }r (hLUhMj ubahShubhhX method.r! r" }r# (hLX method.hMj ubeubhl)r$ }r% (hLXWThis command sends ``rc`` and ``stderr`` updates, as defined for the ``shell`` command.hMjc hNhQhShphU}r& (hW]hX]hY]hZ]h\]uh^Mh_hhG]r' (hhXThis command sends r( r) }r* (hLXThis command sends hMj$ ubh)r+ }r, (hLX``rc``hU}r- (hW]hX]hY]hZ]h\]uhMj$ hG]r. hhXrcr/ r0 }r1 (hLUhMj+ ubahShubhhX and r2 r3 }r4 (hLX and hMj$ ubh)r5 }r6 (hLX ``stderr``hU}r7 (hW]hX]hY]hZ]h\]uhMj$ hG]r8 hhXstderrr9 r: }r; (hLUhMj5 ubahShubhhX updates, as defined for the r< r= }r> (hLX updates, as defined for the hMj$ ubh)r? }r@ (hLX ``shell``hU}rA (hW]hX]hY]hZ]h\]uhMj$ hG]rB hhXshellrC rD }rE (hLUhMj? ubahShubhhX command.rF rG }rH (hLX command.hMj$ ubeubeubhI)rI }rJ (hLUhMjUhNhQhShThU}rK (hW]hX]hY]hZ]rL h3ah\]rM hauh^Mh_hhG]rN (ha)rO }rP (hLXmkdirrQ hMjI hNhQhShehU}rR (hW]hX]hY]hZ]h\]uh^Mh_hhG]rS hhXmkdirrT rU }rV (hLjQ hMjO ubaubhl)rW }rX (hLXThis command will create a directory on the slave. It will also create any intervening directories required. It takes the following argument:rY hMjI hNhQhShphU}rZ (hW]hX]hY]hZ]h\]uh^Mh_hhG]r[ hhXThis command will create a directory on the slave. It will also create any intervening directories required. It takes the following argument:r\ r] }r^ (hLjY hMjW ubaubhl)r_ }r` (hLX``dir``ra hMjI hNhQhShphU}rb (hW]hX]hY]hZ]h\]uh^Mh_hhG]rc h)rd }re (hLja hU}rf (hW]hX]hY]hZ]h\]uhMj_ hG]rg hhXdirrh ri }rj (hLUhMjd ubahShubaubj)rk }rl (hLUhMjI hNhQhSjhU}rm (hW]hX]hY]hZ]h\]uh^Nh_hhG]rn hl)ro }rp (hLXDirectory to create.rq hMjk hNhQhShphU}rr (hW]hX]hY]hZ]h\]uh^MhG]rs hhXDirectory to create.rt ru }rv (hLjq hMjo ubaubaubhl)rw }rx (hLX=The ``mkdir`` command produces the same updates as ``shell``.ry hMjI hNhQhShphU}rz (hW]hX]hY]hZ]h\]uh^Mh_hhG]r{ (hhXThe r| r} }r~ (hLXThe hMjw ubh)r }r (hLX ``mkdir``hU}r (hW]hX]hY]hZ]h\]uhMjw hG]r hhXmkdirr r }r (hLUhMj ubahShubhhX& command produces the same updates as r r }r (hLX& command produces the same updates as hMjw ubh)r }r (hLX ``shell``hU}r (hW]hX]hY]hZ]h\]uhMjw hG]r hhXshellr r }r (hLUhMj ubahShubhhX.r }r (hLX.hMjw ubeubeubhI)r }r (hLUhMjUhNhQhShThU}r (hW]hX]hY]hZ]r h6ah\]r hauh^Mh_hhG]r (ha)r }r (hLXrmdirr hMj hNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXrmdirr r }r (hLj hMj ubaubhl)r }r (hLX]This command will remove a directory or file on the slave. It takes the following arguments:r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhX]This command will remove a directory or file on the slave. It takes the following arguments:r r }r (hLj hMj ubaubhl)r }r (hLX``dir``r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXdirr r }r (hLUhMj ubahShubaubj)r }r (hLUhMj hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXDirectory to remove.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MhG]r hhXDirectory to remove.r r }r (hLj hMj ubaubaubhl)r }r (hLX``timeout`` ``maxTime``hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r (h)r }r (hLX ``timeout``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXtimeoutr r }r (hLUhMj ubahShubhhX r }r (hLX hMj ubh)r }r (hLX ``maxTime``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXmaxTimer r }r (hLUhMj ubahShubeubj)r }r (hLUhMj hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLXSee ``shell``, above.hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MhG]r (hhXSee r r }r (hLXSee hMj ubh)r }r (hLX ``shell``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXshellr r }r (hLUhMj ubahShubhhX, above.r r }r (hLX, above.hMj ubeubaubhl)r }r (hLX=The ``rmdir`` command produces the same updates as ``shell``.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r (hhXThe r r }r (hLXThe hMj ubh)r }r (hLX ``rmdir``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXrmdirr r }r (hLUhMj ubahShubhhX& command produces the same updates as r r }r (hLX& command produces the same updates as hMj ubh)r }r (hLX ``shell``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXshellr r }r (hLUhMj ubahShubhhX.r }r (hLX.hMj ubeubeubhI)r }r (hLUhMjUhNhQhShThU}r (hW]hX]hY]hZ]r h1ah\]r h auh^Mh_hhG]r (ha)r }r (hLXcpdirr hMj hNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXcpdirr r }r (hLj hMj ubaubhl)r }r (hLXgThis command will copy a directory from place to place on the slave. It takes the following arguments:r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXgThis command will copy a directory from place to place on the slave. It takes the following arguments:r r }r (hLj hMj ubaubhl)r }r (hLX ``fromdir``r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r h)r }r (hLj hU}r! (hW]hX]hY]hZ]h\]uhMj hG]r" hhXfromdirr# r$ }r% (hLUhMj ubahShubaubj)r& }r' (hLUhMj hNhQhSjhU}r( (hW]hX]hY]hZ]h\]uh^Nh_hhG]r) hl)r* }r+ (hLXKSource directory for the copy operation, relative to the builder's basedir.r, hMj& hNhQhShphU}r- (hW]hX]hY]hZ]h\]uh^MhG]r. hhXKSource directory for the copy operation, relative to the builder's basedir.r/ r0 }r1 (hLj, hMj* ubaubaubhl)r2 }r3 (hLX ``todir``r4 hMj hNhQhShphU}r5 (hW]hX]hY]hZ]h\]uh^Mh_hhG]r6 h)r7 }r8 (hLj4 hU}r9 (hW]hX]hY]hZ]h\]uhMj2 hG]r: hhXtodirr; r< }r= (hLUhMj7 ubahShubaubj)r> }r? (hLUhMj hNhQhSjhU}r@ (hW]hX]hY]hZ]h\]uh^Nh_hhG]rA hl)rB }rC (hLXPDestination directory for the copy operation, relative to the builder's basedir.rD hMj> hNhQhShphU}rE (hW]hX]hY]hZ]h\]uh^MhG]rF hhXPDestination directory for the copy operation, relative to the builder's basedir.rG rH }rI (hLjD hMjB ubaubaubhl)rJ }rK (hLX``timeout`` ``maxTime``hMj hNhQhShphU}rL (hW]hX]hY]hZ]h\]uh^Mh_hhG]rM (h)rN }rO (hLX ``timeout``hU}rP (hW]hX]hY]hZ]h\]uhMjJ hG]rQ hhXtimeoutrR rS }rT (hLUhMjN ubahShubhhX rU }rV (hLX hMjJ ubh)rW }rX (hLX ``maxTime``hU}rY (hW]hX]hY]hZ]h\]uhMjJ hG]rZ hhXmaxTimer[ r\ }r] (hLUhMjW ubahShubeubj)r^ }r_ (hLUhMj hNhQhSjhU}r` (hW]hX]hY]hZ]h\]uh^Nh_hhG]ra hl)rb }rc (hLXSee ``shell``, above.hMj^ hNhQhShphU}rd (hW]hX]hY]hZ]h\]uh^MhG]re (hhXSee rf rg }rh (hLXSee hMjb ubh)ri }rj (hLX ``shell``hU}rk (hW]hX]hY]hZ]h\]uhMjb hG]rl hhXshellrm rn }ro (hLUhMji ubahShubhhX, above.rp rq }rr (hLX, above.hMjb ubeubaubhl)rs }rt (hLX=The ``cpdir`` command produces the same updates as ``shell``.ru hMj hNhQhShphU}rv (hW]hX]hY]hZ]h\]uh^Mh_hhG]rw (hhXThe rx ry }rz (hLXThe hMjs ubh)r{ }r| (hLX ``cpdir``hU}r} (hW]hX]hY]hZ]h\]uhMjs hG]r~ hhXcpdirr r }r (hLUhMj{ ubahShubhhX& command produces the same updates as r r }r (hLX& command produces the same updates as hMjs ubh)r }r (hLX ``shell``hU}r (hW]hX]hY]hZ]h\]uhMjs hG]r hhXshellr r }r (hLUhMj ubahShubhhX.r }r (hLX.hMjs ubeubeubhI)r }r (hLUhMjUhNhQhShThU}r (hW]hX]hY]hZ]r h.ah\]r h auh^Mh_hhG]r (ha)r }r (hLXstatr hMj hNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXstatr r }r (hLj hMj ubaubhl)r }r (hLXThis command returns status information about a file or directory. It takes a single parameter, ``file``, specifying the filename relative to the builder's basedir.hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r (hhXaThis command returns status information about a file or directory. It takes a single parameter, r r }r (hLXaThis command returns status information about a file or directory. It takes a single parameter, hMj ubh)r }r (hLX``file``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXfiler r }r (hLUhMj ubahShubhhX<, specifying the filename relative to the builder's basedir.r r }r (hLX<, specifying the filename relative to the builder's basedir.hMj ubeubhl)r }r (hLXIt produces two status updates:r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXIt produces two status updates:r r }r (hLj hMj ubaubhl)r }r (hLX``stat``r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXstatr r }r (hLUhMj ubahShubaubj)r }r (hLUhMj hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX+The return value from Python's ``os.stat``.hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MhG]r (hhXThe return value from Python's r r }r (hLXThe return value from Python's hMj ubh)r }r (hLX ``os.stat``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXos.statr r }r (hLUhMj ubahShubhhX.r }r (hLX.hMj ubeubaubhl)r }r (hLX``rc``r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXrcr r }r (hLUhMj ubahShubaubj)r }r (hLUhMj hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX$0 if the file is found, otherwise 1.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MhG]r hhX$0 if the file is found, otherwise 1.r r }r (hLj hMj ubaubaubeubhI)r }r (hLUhMjUhNhQhShThU}r (hW]hX]hY]hZ]r h;ah\]r hauh^Mh_hhG]r (ha)r }r (hLXglobr hMj hNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXglobr r }r (hLj hMj ubaubhl)r }r (hLXThis command finds all pathnames matching a specified pattern that uses shell-style wildcards. It takes a single parameter, ``pathname``, specifying the pattern to pass to Python's ``glob.glob`` function.hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r (hhX|This command finds all pathnames matching a specified pattern that uses shell-style wildcards. It takes a single parameter, r r }r (hLX|This command finds all pathnames matching a specified pattern that uses shell-style wildcards. It takes a single parameter, hMj ubh)r }r (hLX ``pathname``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXpathnamer r }r (hLUhMj ubahShubhhX-, specifying the pattern to pass to Python's r r }r (hLX-, specifying the pattern to pass to Python's hMj ubh)r }r (hLX ``glob.glob``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX glob.globr r }r (hLUhMj ubahShubhhX function.r r }r (hLX function.hMj ubeubhl)r }r (hLXIt produces two status updates:r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXIt produces two status updates:r r }r (hLj hMj ubaubhl)r }r (hLX ``files``r hMj hNhQhShphU}r! (hW]hX]hY]hZ]h\]uh^Mh_hhG]r" h)r# }r$ (hLj hU}r% (hW]hX]hY]hZ]h\]uhMj hG]r& hhXfilesr' r( }r) (hLUhMj# ubahShubaubj)r* }r+ (hLUhMj hNhQhSjhU}r, (hW]hX]hY]hZ]h\]uh^Nh_hhG]r- hl)r. }r/ (hLX6The list of matching files returned from ``glob.glob``hMj* hNhQhShphU}r0 (hW]hX]hY]hZ]h\]uh^MhG]r1 (hhX)The list of matching files returned from r2 r3 }r4 (hLX)The list of matching files returned from hMj. ubh)r5 }r6 (hLX ``glob.glob``hU}r7 (hW]hX]hY]hZ]h\]uhMj. hG]r8 hhX glob.globr9 r: }r; (hLUhMj5 ubahShubeubaubhl)r< }r= (hLX``rc``r> hMj hNhQhShphU}r? (hW]hX]hY]hZ]h\]uh^Mh_hhG]r@ h)rA }rB (hLj> hU}rC (hW]hX]hY]hZ]h\]uhMj< hG]rD hhXrcrE rF }rG (hLUhMjA ubahShubaubj)rH }rI (hLUhMj hNhQhSjhU}rJ (hW]hX]hY]hZ]h\]uh^Nh_hhG]rK hl)rL }rM (hLX=0 if the ``glob.glob`` does not raise exception, otherwise 1.hMjH hNhQhShphU}rN (hW]hX]hY]hZ]h\]uh^MhG]rO (hhX 0 if the rP rQ }rR (hLX 0 if the hMjL ubh)rS }rT (hLX ``glob.glob``hU}rU (hW]hX]hY]hZ]h\]uhMjL hG]rV hhX glob.globrW rX }rY (hLUhMjS ubahShubhhX' does not raise exception, otherwise 1.rZ r[ }r\ (hLX' does not raise exception, otherwise 1.hMjL ubeubaubeubhI)r] }r^ (hLUhMjUhNhQhShThU}r_ (hW]hX]hY]hZ]r` h4ah\]ra hauh^Mh_hhG]rb (ha)rc }rd (hLXlistdirre hMj] hNhQhShehU}rf (hW]hX]hY]hZ]h\]uh^Mh_hhG]rg hhXlistdirrh ri }rj (hLje hMjc ubaubhl)rk }rl (hLXThis command reads the directory and returns the list with directory contents. It takes a single parameter, ``dir``, specifying the directory relative to builder's basedir.hMj] hNhQhShphU}rm (hW]hX]hY]hZ]h\]uh^Mh_hhG]rn (hhXlThis command reads the directory and returns the list with directory contents. It takes a single parameter, ro rp }rq (hLXlThis command reads the directory and returns the list with directory contents. It takes a single parameter, hMjk ubh)rr }rs (hLX``dir``hU}rt (hW]hX]hY]hZ]h\]uhMjk hG]ru hhXdirrv rw }rx (hLUhMjr ubahShubhhX9, specifying the directory relative to builder's basedir.ry rz }r{ (hLX9, specifying the directory relative to builder's basedir.hMjk ubeubhl)r| }r} (hLXIt produces two status updates:r~ hMj] hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXIt produces two status updates:r r }r (hLj~ hMj| ubaubhl)r }r (hLX ``files``r hMj] hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXfilesr r }r (hLUhMj ubahShubaubj)r }r (hLUhMj] hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX?The list of files in the directory returned from ``os.listdir``hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MhG]r (hhX1The list of files in the directory returned from r r }r (hLX1The list of files in the directory returned from hMj ubh)r }r (hLX``os.listdir``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX os.listdirr r }r (hLUhMj ubahShubeubaubhl)r }r (hLX``rc``r hMj] hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r h)r }r (hLj hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXrcr r }r (hLUhMj ubahShubaubj)r }r (hLUhMj] hNhQhSjhU}r (hW]hX]hY]hZ]h\]uh^Nh_hhG]r hl)r }r (hLX>0 if the ``os.listdir`` does not raise exception, otherwise 1.r hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^MhG]r (hhX 0 if the r r }r (hLX 0 if the hMj ubh)r }r (hLX``os.listdir``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhX os.listdirr r }r (hLUhMj ubahShubhhX' does not raise exception, otherwise 1.r r }r (hLX' does not raise exception, otherwise 1.hMj ubeubaubeubhI)r }r (hLUhMjUhNhQhShThU}r (hW]hX]hY]hZ]r hDah\]r hauh^Mh_hhG]r (ha)r }r (hLXSource Commandsr hMj hNhQhShehU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r hhXSource Commandsr r }r (hLj hMj ubaubhl)r }r (hLXThe source commands (``bk``, ``cvs``, ``darcs``, ``git``, ``repo``, ``bzr``, ``hg``, ``p4``, ``p4sync``, and ``mtn``) are deprecated. See the docstrings in the source code for more information.hMj hNhQhShphU}r (hW]hX]hY]hZ]h\]uh^Mh_hhG]r (hhXThe source commands (r r }r (hLXThe source commands (hMj ubh)r }r (hLX``bk``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXbkr r }r (hLUhMj ubahShubhhX, r r }r (hLX, hMj ubh)r }r (hLX``cvs``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXcvsr r }r (hLUhMj ubahShubhhX, r r }r (hLX, hMj ubh)r }r (hLX ``darcs``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXdarcsr r }r (hLUhMj ubahShubhhX, r r }r (hLX, hMj ubh)r }r (hLX``git``hU}r (hW]hX]hY]hZ]h\]uhMj hG]r hhXgitr r }r (hLUhMj ubahShubhhX, r r }r(hLX, hMj ubh)r}r(hLX``repo``hU}r(hW]hX]hY]hZ]h\]uhMj hG]rhhXreporr}r(hLUhMjubahShubhhX, rr }r (hLX, hMj ubh)r }r (hLX``bzr``hU}r (hW]hX]hY]hZ]h\]uhMj hG]rhhXbzrrr}r(hLUhMj ubahShubhhX, rr}r(hLX, hMj ubh)r}r(hLX``hg``hU}r(hW]hX]hY]hZ]h\]uhMj hG]rhhXhgrr}r(hLUhMjubahShubhhX, rr}r(hLX, hMj ubh)r}r (hLX``p4``hU}r!(hW]hX]hY]hZ]h\]uhMj hG]r"hhXp4r#r$}r%(hLUhMjubahShubhhX, r&r'}r((hLX, hMj ubh)r)}r*(hLX ``p4sync``hU}r+(hW]hX]hY]hZ]h\]uhMj hG]r,hhXp4syncr-r.}r/(hLUhMj)ubahShubhhX, and r0r1}r2(hLX, and hMj ubh)r3}r4(hLX``mtn``hU}r5(hW]hX]hY]hZ]h\]uhMj hG]r6hhXmtnr7r8}r9(hLUhMj3ubahShubhhXN) are deprecated. See the docstrings in the source code for more information.r:r;}r<(hLXN) are deprecated. See the docstrings in the source code for more information.hMj ubeubeubeubeubeubahLUU transformerr=NU footnote_refsr>}r?Urefnamesr@}rAUsymbol_footnotesrB]rCUautofootnote_refsrD]rEUsymbol_footnote_refsrF]rGU citationsrH]rIh_hU current_linerJNUtransform_messagesrK]rL(cdocutils.nodes system_message rM)rN}rO(hLUhU}rP(hW]UlevelKhZ]hY]UsourcehQhX]h\]UlineKUtypeUINFOrQuhG]rRhl)rS}rT(hLUhU}rU(hW]hX]hY]hZ]h\]uhMjNhG]rVhhX:Hyperlink target "master-slave-updates" is not referenced.rWrX}rY(hLUhMjSubahShpubahSUsystem_messagerZubjM)r[}r\(hLUhU}r](hW]UlevelKhZ]hY]UsourcehQhX]h\]UlineKUtypejQuhG]r^hl)r_}r`(hLUhU}ra(hW]hX]hY]hZ]h\]uhMj[hG]rbhhX8Hyperlink target "shell-command-args" is not referenced.rcrd}re(hLUhMj_ubahShpubahSjZubeUreporterrfNUid_startrgKU autofootnotesrh]riU citation_refsrj}rkUindirect_targetsrl]rmUsettingsrn(cdocutils.frontend Values roorp}rq(Ufootnote_backlinksrrKUrecord_dependenciesrsNU rfc_base_urlrtUhttp://tools.ietf.org/html/ruU tracebackrvUpep_referencesrwNUstrip_commentsrxNU toc_backlinksryUentryrzU language_coder{Uenr|U datestampr}NU report_levelr~KU _destinationrNU halt_levelrKU strip_classesrNheNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUW/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/master-slave.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(h,jh4j] h-j%h0jnh1j h5jh2jMh3jI h6j h7jUh.j h9jnh:jh/jh;j h8jh=jh>j hh$}q?(h(]h)]h']h&]h*]uh-Kh.hh/]q@cdocutils.nodes Text qAXMetricsqBqC}qD(hh=hh;ubaubcdocutils.nodes paragraph qE)qF}qG(hXNew in buildbot 0.8.4 is support for tracking various performance metrics inside the buildbot master process. Currently these are logged periodically according to the ``log_interval`` configuration setting of the @ref{Metrics Options} configuration.hhhhh"U paragraphqHh$}qI(h(]h)]h']h&]h*]uh-Kh.hh/]qJ(hAXNew in buildbot 0.8.4 is support for tracking various performance metrics inside the buildbot master process. Currently these are logged periodically according to the qKqL}qM(hXNew in buildbot 0.8.4 is support for tracking various performance metrics inside the buildbot master process. Currently these are logged periodically according to the hhFubcdocutils.nodes literal qN)qO}qP(hX``log_interval``h$}qQ(h(]h)]h']h&]h*]uhhFh/]qRhAX log_intervalqSqT}qU(hUhhOubah"UliteralqVubhAXB configuration setting of the @ref{Metrics Options} configuration.qWqX}qY(hXB configuration setting of the @ref{Metrics Options} configuration.hhFubeubhE)qZ}q[(hX_If :bb:status:`WebStatus` is enabled, the metrics data is also available via ``/json/metrics``.hhhhh"hHh$}q\(h(]h)]h']h&]h*]uh-K h.hh/]q](hAXIf q^q_}q`(hXIf hhZubcsphinx.addnodes pending_xref qa)qb}qc(hX:bb:status:`WebStatus`qdhhZhhh"U pending_xrefqeh$}qf(UreftypeXstatusUrefwarnqgU reftargetqhX WebStatusU refdomainXbbqih&]h']U refexplicith(]h)]h*]UrefdocqjXdeveloper/metricsqkuh-K h/]qlhN)qm}qn(hhdh$}qo(h(]h)]qp(UxrefqqhiX bb-statusqreh']h&]h*]uhhbh/]qshAX WebStatusqtqu}qv(hUhhmubah"hVubaubhAX4 is enabled, the metrics data is also available via qwqx}qy(hX4 is enabled, the metrics data is also available via hhZubhN)qz}q{(hX``/json/metrics``h$}q|(h(]h)]h']h&]h*]uhhZh/]q}hAX /json/metricsq~q}q(hUhhzubah"hVubhAX.q}q(hX.hhZubeubhE)q}q(hX#The metrics subsystem is implemented in :mod:`buildbot.process.metrics`. It makes use of twisted's logging system to pass metrics data from all over buildbot's code to a central :class:`MetricsLogObserver` object, which is available at ``BuildMaster.metrics`` or via ``Status.getMetrics()``.hhhhh"hHh$}q(h(]h)]h']h&]h*]uh-Kh.hh/]q(hAX(The metrics subsystem is implemented in qq}q(hX(The metrics subsystem is implemented in hhubha)q}q(hX:mod:`buildbot.process.metrics`qhhhhh"heh$}q(UreftypeXmodhghhXbuildbot.process.metricsU refdomainXpyqh&]h']U refexplicith(]h)]h*]hjhkUpy:classqNU py:moduleqNuh-Kh/]qhN)q}q(hhh$}q(h(]h)]q(hqhXpy-modqeh']h&]h*]uhhh/]qhAXbuildbot.process.metricsqq}q(hUhhubah"hVubaubhAXk. It makes use of twisted's logging system to pass metrics data from all over buildbot's code to a central qq}q(hXk. It makes use of twisted's logging system to pass metrics data from all over buildbot's code to a central hhubha)q}q(hX:class:`MetricsLogObserver`qhhhhh"heh$}q(UreftypeXclasshghhXMetricsLogObserverU refdomainXpyqh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Kh/]qhN)q}q(hhh$}q(h(]h)]q(hqhXpy-classqeh']h&]h*]uhhh/]qhAXMetricsLogObserverqq}q(hUhhubah"hVubaubhAX object, which is available at qq}q(hX object, which is available at hhubhN)q}q(hX``BuildMaster.metrics``h$}q(h(]h)]h']h&]h*]uhhh/]qhAXBuildMaster.metricsqq}q(hUhhubah"hVubhAX or via qq}q(hX or via hhubhN)q}q(hX``Status.getMetrics()``h$}q(h(]h)]h']h&]h*]uhhh/]qhAXStatus.getMetrics()qq}q(hUhhubah"hVubhAX.q}q(hX.hhubeubh)q}q(hUhhhhh"h0h$}q(h(]h)]h']h&]qU metric-eventsqah*]qhauh-Kh.hh/]q(h:)q}q(hX Metric Eventsqhhhhh"h>h$}q(h(]h)]h']h&]h*]uh-Kh.hh/]qhAX Metric Eventsqυq}q(hhhhubaubhE)q}q(hXl:class:`MetricEvent` objects represent individual items to monitor. There are three sub-classes implemented:hhhhh"hHh$}q(h(]h)]h']h&]h*]uh-Kh.hh/]q(ha)q}q(hX:class:`MetricEvent`qhhhhh"heh$}q(UreftypeXclasshghhX MetricEventU refdomainXpyqh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Kh/]qhN)q}q(hhh$}q(h(]h)]q(hqhXpy-classqeh']h&]h*]uhhh/]qhAX MetricEventq⅁q}q(hUhhubah"hVubaubhAXX objects represent individual items to monitor. There are three sub-classes implemented:q允q}q(hXX objects represent individual items to monitor. There are three sub-classes implemented:hhubeubcdocutils.nodes definition_list q)q}q(hUhhhhh"Udefinition_listqh$}q(h(]h)]h']h&]h*]uh-Nh.hh/]q(cdocutils.nodes definition_list_item q)q}q(hX[:class:`MetricCountEvent` Records incremental increase or decrease of some value, or an absolute measure of some value. :: from buildbot.process.metrics import MetricCountEvent # We got a new widget! MetricCountEvent.log('num_widgets', 1) # We have exactly 10 widgets MetricCountEvent.log('num_widgets', 10, absolute=True) hhhhh"Udefinition_list_itemqh$}q(h(]h)]h']h&]h*]uh-K&h/]q(cdocutils.nodes term q)q}q(hX:class:`MetricCountEvent`qhhhhh"Utermqh$}q(h(]h)]h']h&]h*]uh-K&h/]qha)q}q(hhhhhhh"heh$}q(UreftypeXclasshghhXMetricCountEventU refdomainXpyqh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-K&h/]qhN)r}r(hhh$}r(h(]h)]r(hqhXpy-classreh']h&]h*]uhhh/]rhAXMetricCountEventrr}r(hUhjubah"hVubaubaubcdocutils.nodes definition r )r }r (hUh$}r (h(]h)]h']h&]h*]uhhh/]r (hE)r}r(hX`Records incremental increase or decrease of some value, or an absolute measure of some value. ::hj hhh"hHh$}r(h(]h)]h']h&]h*]uh-Kh/]rhAX]Records incremental increase or decrease of some value, or an absolute measure of some value.rr}r(hX]Records incremental increase or decrease of some value, or an absolute measure of some value.hjubaubcdocutils.nodes literal_block r)r}r(hXfrom buildbot.process.metrics import MetricCountEvent # We got a new widget! MetricCountEvent.log('num_widgets', 1) # We have exactly 10 widgets MetricCountEvent.log('num_widgets', 10, absolute=True)hj h"U literal_blockrh$}r(U xml:spacerUpreserverh&]h']h(]h)]h*]uh-K h/]rhAXfrom buildbot.process.metrics import MetricCountEvent # We got a new widget! MetricCountEvent.log('num_widgets', 1) # We have exactly 10 widgets MetricCountEvent.log('num_widgets', 10, absolute=True)rr}r(hUhjubaubeh"U definitionr ubeubh)r!}r"(hX:class:`MetricTimeEvent` Measures how long things take. By default the average of the last 10 times will be reported. :: from buildbot.process.metrics import MetricTimeEvent # function took 0.001s MetricTimeEvent.log('time_function', 0.001) hhhhh"hh$}r#(h(]h)]h']h&]h*]uh-K/h.hh/]r$(h)r%}r&(hX:class:`MetricTimeEvent`r'hj!hhh"hh$}r((h(]h)]h']h&]h*]uh-K/h/]r)ha)r*}r+(hj'hj%hhh"heh$}r,(UreftypeXclasshghhXMetricTimeEventU refdomainXpyr-h&]h']U refexplicith(]h)]h*]hjhkhNhNuh-K/h/]r.hN)r/}r0(hj'h$}r1(h(]h)]r2(hqj-Xpy-classr3eh']h&]h*]uhj*h/]r4hAXMetricTimeEventr5r6}r7(hUhj/ubah"hVubaubaubj )r8}r9(hUh$}r:(h(]h)]h']h&]h*]uhj!h/]r;(hE)r<}r=(hX_Measures how long things take. By default the average of the last 10 times will be reported. ::hj8hhh"hHh$}r>(h(]h)]h']h&]h*]uh-K)h/]r?hAX\Measures how long things take. By default the average of the last 10 times will be reported.r@rA}rB(hX\Measures how long things take. By default the average of the last 10 times will be reported.hj<ubaubj)rC}rD(hXxfrom buildbot.process.metrics import MetricTimeEvent # function took 0.001s MetricTimeEvent.log('time_function', 0.001)hj8h"jh$}rE(jjh&]h']h(]h)]h*]uh-K,h/]rFhAXxfrom buildbot.process.metrics import MetricTimeEvent # function took 0.001s MetricTimeEvent.log('time_function', 0.001)rGrH}rI(hUhjCubaubeh"j ubeubh)rJ}rK(hX:class:`MetricAlarmEvent` Indicates the health of various metrics. :: from buildbot.process.metrics import MetricAlarmEvent, ALARM_OK # num_slaves looks ok MetricAlarmEvent.log('num_slaves', level=ALARM_OK) hhhhh"hh$}rL(h(]h)]h']h&]h*]uh-K7h.hh/]rM(h)rN}rO(hX:class:`MetricAlarmEvent`rPhjJhhh"hh$}rQ(h(]h)]h']h&]h*]uh-K7h/]rRha)rS}rT(hjPhjNhhh"heh$}rU(UreftypeXclasshghhXMetricAlarmEventU refdomainXpyrVh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-K7h/]rWhN)rX}rY(hjPh$}rZ(h(]h)]r[(hqjVXpy-classr\eh']h&]h*]uhjSh/]r]hAXMetricAlarmEventr^r_}r`(hUhjXubah"hVubaubaubj )ra}rb(hUh$}rc(h(]h)]h']h&]h*]uhjJh/]rd(hE)re}rf(hX+Indicates the health of various metrics. ::hjahhh"hHh$}rg(h(]h)]h']h&]h*]uh-K2h/]rhhAX(Indicates the health of various metrics.rirj}rk(hX(Indicates the health of various metrics.hjeubaubj)rl}rm(hXfrom buildbot.process.metrics import MetricAlarmEvent, ALARM_OK # num_slaves looks ok MetricAlarmEvent.log('num_slaves', level=ALARM_OK)hjah"jh$}rn(jjh&]h']h(]h)]h*]uh-K4h/]rohAXfrom buildbot.process.metrics import MetricAlarmEvent, ALARM_OK # num_slaves looks ok MetricAlarmEvent.log('num_slaves', level=ALARM_OK)rprq}rr(hUhjlubaubeh"j ubeubeubeubh)rs}rt(hUhhhhh"h0h$}ru(h(]h)]h']h&]rvUmetric-handlersrwah*]rxh auh-K:h.hh/]ry(h:)rz}r{(hXMetric Handlersr|hjshhh"h>h$}r}(h(]h)]h']h&]h*]uh-K:h.hh/]r~hAXMetric Handlersrr}r(hj|hjzubaubhE)r}r(hX:class:`MetricsHandler` objects are responsible for collecting :class:`MetricEvent`\s of a specific type and keeping track of their values for future reporting. There are :class:`MetricsHandler` classes corresponding to each of the :class:`MetricEvent` types.hjshhh"hHh$}r(h(]h)]h']h&]h*]uh-Kh$}r(h(]h)]h']h&]h*]uh-KBh.hh/]rhAXMetric Watchersrr}r(hjhjubaubhE)r}r(hXWatcher objects can be added to :class:`MetricsHandlers` to be called when metric events of a certain type are received. Watchers are generally used to record alarm events in response to count or time events.hjhhh"hHh$}r(h(]h)]h']h&]h*]uh-KDh.hh/]r(hAX Watcher objects can be added to rr}r(hX Watcher objects can be added to hjubha)r}r(hX:class:`MetricsHandlers`rhjhhh"heh$}r(UreftypeXclasshghhXMetricsHandlersU refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-KDh/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-classreh']h&]h*]uhjh/]rhAXMetricsHandlersrr}r(hUhjubah"hVubaubhAX to be called when metric events of a certain type are received. Watchers are generally used to record alarm events in response to count or time events.rr}r(hX to be called when metric events of a certain type are received. Watchers are generally used to record alarm events in response to count or time events.hjubeubeubh)r}r(hUhhhhh"h0h$}r(h(]h)]h']h&]rUmetric-helpersrah*]rh auh-KJh.hh/]r(h:)r}r(hXMetric Helpersrhjhhh"h>h$}r(h(]h)]h']h&]h*]uh-KJh.hh/]rhAXMetric Helpersrr}r(hjhjubaubh)r}r(hUhjhhh"hh$}r(h(]h)]h']h&]h*]uh-Nh.hh/]r(h)r }r (hX:func:`countMethod(name)` A function decorator that counts how many times the function is called. :: from buildbot.process.metrics import countMethod @countMethod('foo_called') def foo(): return "foo!" hjhhh"hh$}r (h(]h)]h']h&]h*]uh-KTh/]r (h)r }r(hX:func:`countMethod(name)`rhj hhh"hh$}r(h(]h)]h']h&]h*]uh-KTh/]rha)r}r(hjhj hhh"heh$}r(UreftypeXfunchghhXcountMethod(name)U refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-KTh/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-funcreh']h&]h*]uhjh/]rhAXcountMethod(name)rr}r(hUhjubah"hVubaubaubj )r }r!(hUh$}r"(h(]h)]h']h&]h*]uhj h/]r#(hE)r$}r%(hXJA function decorator that counts how many times the function is called. ::hj hhh"hHh$}r&(h(]h)]h']h&]h*]uh-KMh/]r'hAXGA function decorator that counts how many times the function is called.r(r)}r*(hXGA function decorator that counts how many times the function is called.hj$ubaubj)r+}r,(hXifrom buildbot.process.metrics import countMethod @countMethod('foo_called') def foo(): return "foo!"hj h"jh$}r-(jjh&]h']h(]h)]h*]uh-KPh/]r.hAXifrom buildbot.process.metrics import countMethod @countMethod('foo_called') def foo(): return "foo!"r/r0}r1(hUhj+ubaubeh"j ubeubh)r2}r3(hX":func:`Timer(name)` :class:`Timer` objects can be used to make timing events easier. When ``Timer.stop()`` is called, a :class:`MetricTimeEvent` is logged with the elapsed time since ``timer.start()`` was called. :: from buildbot.process.metrics import Timer def foo(): t = Timer('time_foo') t.start() try: for i in range(1000): calc(i) return "foo!" finally: t.stop() :class:`Timer` objects also provide a pair of decorators, :func:`startTimer`/\ :func:`stopTimer` to decorate other functions. :: from buildbot.process.metrics import Timer t = Timer('time_thing') @t.startTimer def foo(): return "foo!" @t.stopTimer def bar(): return "bar!" foo() bar() hjhhh"hh$}r4(h(]h)]h']h&]h*]uh-Kxh.hh/]r5(h)r6}r7(hX:func:`Timer(name)`r8hj2hhh"hh$}r9(h(]h)]h']h&]h*]uh-Kxh/]r:ha)r;}r<(hj8hj6hhh"heh$}r=(UreftypeXfunchghhX Timer(name)U refdomainXpyr>h&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Kxh/]r?hN)r@}rA(hj8h$}rB(h(]h)]rC(hqj>Xpy-funcrDeh']h&]h*]uhj;h/]rEhAX Timer(name)rFrG}rH(hUhj@ubah"hVubaubaubj )rI}rJ(hUh$}rK(h(]h)]h']h&]h*]uhj2h/]rL(hE)rM}rN(hX:class:`Timer` objects can be used to make timing events easier. When ``Timer.stop()`` is called, a :class:`MetricTimeEvent` is logged with the elapsed time since ``timer.start()`` was called. ::hjIhhh"hHh$}rO(h(]h)]h']h&]h*]uh-KWh/]rP(ha)rQ}rR(hX:class:`Timer`rShjMhhh"heh$}rT(UreftypeXclasshghhXTimerU refdomainXpyrUh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-KWh/]rVhN)rW}rX(hjSh$}rY(h(]h)]rZ(hqjUXpy-classr[eh']h&]h*]uhjQh/]r\hAXTimerr]r^}r_(hUhjWubah"hVubaubhAX8 objects can be used to make timing events easier. When r`ra}rb(hX8 objects can be used to make timing events easier. When hjMubhN)rc}rd(hX``Timer.stop()``h$}re(h(]h)]h']h&]h*]uhjMh/]rfhAX Timer.stop()rgrh}ri(hUhjcubah"hVubhAX is called, a rjrk}rl(hX is called, a hjMubha)rm}rn(hX:class:`MetricTimeEvent`rohjMhhh"heh$}rp(UreftypeXclasshghhXMetricTimeEventU refdomainXpyrqh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-KWh/]rrhN)rs}rt(hjoh$}ru(h(]h)]rv(hqjqXpy-classrweh']h&]h*]uhjmh/]rxhAXMetricTimeEventryrz}r{(hUhjsubah"hVubaubhAX' is logged with the elapsed time since r|r}}r~(hX' is logged with the elapsed time since hjMubhN)r}r(hX``timer.start()``h$}r(h(]h)]h']h&]h*]uhjMh/]rhAX timer.start()rr}r(hUhjubah"hVubhAX was called.rr}r(hX was called.hjMubeubj)r}r(hXfrom buildbot.process.metrics import Timer def foo(): t = Timer('time_foo') t.start() try: for i in range(1000): calc(i) return "foo!" finally: t.stop()hjIh"jh$}r(jjh&]h']h(]h)]h*]uh-K\h/]rhAXfrom buildbot.process.metrics import Timer def foo(): t = Timer('time_foo') t.start() try: for i in range(1000): calc(i) return "foo!" finally: t.stop()rr}r(hUhjubaubhE)r}r(hX:class:`Timer` objects also provide a pair of decorators, :func:`startTimer`/\ :func:`stopTimer` to decorate other functions. ::hjIhhh"hHh$}r(h(]h)]h']h&]h*]uh-Khh/]r(ha)r}r(hX:class:`Timer`rhjhhh"heh$}r(UreftypeXclasshghhXTimerU refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Khh/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-classreh']h&]h*]uhjh/]rhAXTimerrr}r(hUhjubah"hVubaubhAX, objects also provide a pair of decorators, rr}r(hX, objects also provide a pair of decorators, hjubha)r}r(hX:func:`startTimer`rhjhhh"heh$}r(UreftypeXfunchghhX startTimerU refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Khh/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-funcreh']h&]h*]uhjh/]rhAX startTimerrr}r(hUhjubah"hVubaubhAX/r}r(hX/\ hjubha)r}r(hX:func:`stopTimer`rhjhhh"heh$}r(UreftypeXfunchghhX stopTimerU refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Khh/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-funcreh']h&]h*]uhjh/]rhAX stopTimerrr}r(hUhjubah"hVubaubhAX to decorate other functions.rr}r(hX to decorate other functions.hjubeubj)r}r(hXfrom buildbot.process.metrics import Timer t = Timer('time_thing') @t.startTimer def foo(): return "foo!" @t.stopTimer def bar(): return "bar!" foo() bar()hjIh"jh$}r(jjh&]h']h(]h)]h*]uh-Kkh/]rhAXfrom buildbot.process.metrics import Timer t = Timer('time_thing') @t.startTimer def foo(): return "foo!" @t.stopTimer def bar(): return "bar!" foo() bar()rr}r(hUhjubaubeh"j ubeubh)r}r(hX:func:`timeMethod(name)` A function decorator that measures how long a function takes to execute. Note that many functions in buildbot return deferreds, so may return before all the work they set up has completed. Using an explicit :class:`Timer` is better in this case. :: from buildbot.process.metrics import timeMethod @timeMethod('time_foo') def foo(): for i in range(1000): calc(i) return "foo!" hjhhh"hh$}r(h(]h)]h']h&]h*]uh-Kh.hh/]r(h)r}r(hX:func:`timeMethod(name)`rhjhhh"hh$}r(h(]h)]h']h&]h*]uh-Kh/]rha)r}r(hjhjhhh"heh$}r(UreftypeXfunchghhXtimeMethod(name)U refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-Kh/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-funcreh']h&]h*]uhjh/]rhAXtimeMethod(name)rr}r(hUhjubah"hVubaubaubj )r}r(hUh$}r(h(]h)]h']h&]h*]uhjh/]r(hE)r}r(hXA function decorator that measures how long a function takes to execute. Note that many functions in buildbot return deferreds, so may return before all the work they set up has completed. Using an explicit :class:`Timer` is better in this case. ::hjhhh"hHh$}r(h(]h)]h']h&]h*]uh-K{h/]r(hAXA function decorator that measures how long a function takes to execute. Note that many functions in buildbot return deferreds, so may return before all the work they set up has completed. Using an explicit rr}r(hXA function decorator that measures how long a function takes to execute. Note that many functions in buildbot return deferreds, so may return before all the work they set up has completed. Using an explicit hjubha)r}r(hX:class:`Timer`rhjhhh"heh$}r(UreftypeXclasshghhXTimerU refdomainXpyrh&]h']U refexplicith(]h)]h*]hjhkhNhNuh-K{h/]rhN)r}r(hjh$}r(h(]h)]r(hqjXpy-classreh']h&]h*]uhjh/]rhAXTimerrr}r(hUhjubah"hVubaubhAX is better in this case.rr}r(hX is better in this case.hjubeubj)r}r(hXfrom buildbot.process.metrics import timeMethod @timeMethod('time_foo') def foo(): for i in range(1000): calc(i) return "foo!"hjh"jh$}r(jjh&]h']h(]h)]h*]uh-Kh/]rhAXfrom buildbot.process.metrics import timeMethod @timeMethod('time_foo') def foo(): for i in range(1000): calc(i) return "foo!"rr }r (hUhjubaubeh"j ubeubeubeubeubhhh"Usystem_messager h$}r (h(]UlevelKh&]h']r h5aUsourcehh)]h*]UlineKUtypeUINFOruh-Kh.hh/]rhE)r}r(hUh$}r(h(]h)]h']h&]h*]uhhh/]rhAX*Duplicate implicit target name: "metrics".rr}r(hUhjubah"hHubaubaUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hh,hjhhh jwh juh/]r(h hehUU transformerrNU footnote_refsr}rUrefnamesr }r!Usymbol_footnotesr"]r#Uautofootnote_refsr$]r%Usymbol_footnote_refsr&]r'U citationsr(]r)h.hU current_liner*NUtransform_messagesr+]r,h)r-}r.(hUh$}r/(h(]UlevelKh&]h']Usourcehh)]h*]UlineKUtypejuh/]r0hE)r1}r2(hUh$}r3(h(]h)]h']h&]h*]uhj-h/]r4hAX-Hyperlink target "metrics" is not referenced.r5r6}r7(hUhj1ubah"hHubah"j ubaUreporterr8NUid_startr9KU autofootnotesr:]r;U citation_refsr<}r=Uindirect_targetsr>]r?Usettingsr@(cdocutils.frontend Values rAorB}rC(Ufootnote_backlinksrDKUrecord_dependenciesrENU rfc_base_urlrFUhttp://tools.ietf.org/html/rGU tracebackrHUpep_referencesrINUstrip_commentsrJNU toc_backlinksrKUentryrLU language_coderMUenrNU datestamprONU report_levelrPKU _destinationrQNU halt_levelrRKU strip_classesrSNh>NUerror_encoding_error_handlerrTUbackslashreplacerUUdebugrVNUembed_stylesheetrWUoutput_encoding_error_handlerrXUstrictrYU sectnum_xformrZKUdump_transformsr[NU docinfo_xformr\KUwarning_streamr]NUpep_file_url_templater^Upep-%04dr_Uexit_status_levelr`KUconfigraNUstrict_visitorrbNUcloak_email_addressesrcUtrim_footnote_reference_spacerdUenvreNUdump_pseudo_xmlrfNUexpose_internalsrgNUsectsubtitle_xformrhU source_linkriNUrfc_referencesrjNUoutput_encodingrkUutf-8rlU source_urlrmNUinput_encodingrnU utf-8-sigroU_disable_configrpNU id_prefixrqUU tab_widthrrKUerror_encodingrsUUTF-8rtU_sourceruUR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/metrics.rstrvUgettext_compactrwU generatorrxNUdump_internalsryNU smart_quotesrzU pep_base_urlr{Uhttp://www.python.org/dev/peps/r|Usyntax_highlightr}Ulongr~Uinput_encoding_error_handlerrjYUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jwjsjjhhh5hh,hjjuUsubstitution_namesr}rh"h.h$}r(h(]h&]h']Usourcehh)]h*]uU footnotesr]rUrefidsr}rh,]rh asub.PK4DeW1buildbot-v0.8.9/.doctrees/developer/utils.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X%buildbot.util.debounce.Debouncer.stopqX"raymond hettinger's implementationqX'buildbot.util.misc.SerializedInvocationqX'buildbot.util.state.StateMixin.getStateq X%buildbot.util.state.StateMixin.masterq Xbuildbot.util.debounceq NXbuildbot.util.subscriptionq NX netstringsq X-buildbot.util.netstrings.NetstringParser.feedqX buildbot.util.sautils.sa_versionqXbuildbot.util.lru.hitsqXbuildbot.util.asyncSleepqXbuildbot.util.safeTranslateqXbuildbot.util.makeListqX-buildbot.util.identifiers.incrementIdentifierqXbuildbot.util.eventualqNXbuildbot.util.stateqNX1buildbot.util.maildir.MaildirService.moveToCurDirqXbuildbot.util.identifiersqNXbuildbot.util.debounce.methodqXbuildbot.util.naturalSortqX&buildbot.util.sautils.InsertFromSelectqXbuildbot.util.lru.max_sizeqXbuildbot.util.maildirqNXbuildbot.util.bbcollectionsqNX$buildbot.util.maildir.MaildirServiceqXbuildbot.util.diffSetsq X!buildbot.util.eventual.eventuallyq!Xbuildbot.util.UTCq"Xbuildbot.util.lru.invq#Xmaildirsq$X&buildbot.util.identifiers.isIdentifierq%Xbuildbot.util.in_reactorq&X)buildbot.util.eventual.flushEventualQueueq'X4buildbot.util.maildir.MaildirService.messageReceivedq(Xbuildbot.util.epoch2datetimeq)X%buildbot.util.bbcollections.KeyedSetsq*Xbuildbot.util.datetime2epochq+X compiler.htmlq,Xbuildbot.util.lruq-NXbuildbot.util.lru.missesq.X utilitiesq/NX%buildbot.util.eventual.fireEventuallyq0X buildbot.util.debounce.Debouncerq1X#buildbot.util.state.StateMixin.nameq2X(buildbot.util.netstrings.NetstringParserq3X'buildbot.util.bbcollections.defaultdictq4Xbuildbot.util.ComparableMixinq5Xbuildbot.util.flattenq6Xbuildbot.util.netstringsq7NX0buildbot.util.netstrings.NetstringParser.stringsq8X!buildbot.util.misc.deferredLockedq9Xbuildbot.util.lru.refhitsq:X&buildbot.util.debounce.Debouncer.startq;X)buildbot.util.identifiers.forceIdentifierqXbuildbot.util.lru.putq?Xbuildbot.util.miscq@NXbuildbot.util.nowqAXbuildbot.util.lru.getqBXbuildbot.util.state.StateMixinqCXbuildbot.util.formatIntervalqDXbuildbot.util.croniterqENX/buildbot.util.maildir.MaildirService.setBasedirqFXbuildbot.util.sautilsqGNXbuildbot.util.NotABranchqHuUsubstitution_defsqI}qJUparse_messagesqK]qLUcurrent_sourceqMNU decorationqNNUautofootnote_startqOKUnameidsqP}qQ(hhhU"raymond-hettinger-s-implementationqRhhh h h h h Ubuildbot-util-debounceqSh Ubuildbot-util-subscriptionqTh U netstringsqUhhhhhhhhhhhhhhhUbuildbot-util-eventualqVhUbuildbot-util-stateqWhhhUbuildbot-util-identifiersqXhhhhhhhhhUbuildbot-util-maildirqYhUbuildbot-util-bbcollectionsqZhhh h h!h!h"h"h#h#h$Umaildirsq[h%h%h&h&h'h'h(h(h)h)h*h*h+h+h,U compiler-htmlq\h-Ubuildbot-util-lruq]h.h.h/U utilitiesq^h0h0h1h1h2h2h3h3h4h4h5h5h6h6h7Ubuildbot-util-netstringsq_h8h8h9h9h:h:h;h;hh>h?h?h@Ubuildbot-util-miscqahAhAhBhBhChChDhDhEUbuildbot-util-croniterqbhFhFhGUbuildbot-util-sautilsqchHhHuUchildrenqd]qecdocutils.nodes section qf)qg}qh(U rawsourceqiUUparentqjhUsourceqkcdocutils.nodes reprunicode qlXP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/utils.rstqmqn}qobUtagnameqpUsectionqqU attributesqr}qs(Udupnamesqt]Uclassesqu]Ubackrefsqv]Uidsqw]qx(Xmodule-buildbot.utilqyh^eUnamesqz]q{h/auUlineq|KUdocumentq}hhd]q~(cdocutils.nodes title q)q}q(hiX UtilitiesqhjhghkhnhpUtitleqhr}q(ht]hu]hv]hw]hz]uh|Kh}hhd]qcdocutils.nodes Text qX Utilitiesqq}q(hihhjhubaubcsphinx.addnodes index q)q}q(hiUhjhghkhnhpUindexqhr}q(hw]hv]ht]hu]hz]Uentries]q(UsingleqXbuildbot.util (module)Xmodule-buildbot.utilUtqauh|Kh}hhd]ubcdocutils.nodes paragraph q)q}q(hiXTSeveral small utilities are available at the top-level :mod:`buildbot.util` package.hjhghkhnhpU paragraphqhr}q(ht]hu]hv]hw]hz]uh|Kh}hhd]q(hX7Several small utilities are available at the top-level qq}q(hiX7Several small utilities are available at the top-level hjhubcsphinx.addnodes pending_xref q)q}q(hiX:mod:`buildbot.util`qhjhhkhnhpU pending_xrefqhr}q(UreftypeXmodUrefwarnqU reftargetqX buildbot.utilU refdomainXpyqhw]hv]U refexplicitht]hu]hz]UrefdocqXdeveloper/utilsqUpy:classqNU py:moduleqX buildbot.utilquh|Khd]qcdocutils.nodes literal q)q}q(hihhr}q(ht]hu]q(UxrefqhXpy-modqehv]hw]hz]uhjhhd]qhX buildbot.utilqq}q(hiUhjhubahpUliteralqubaubhX package.qq}q(hiX package.hjhubeubh)q}q(hiUhjhghkhnhphhr}q(hw]hv]ht]hu]hz]Uentries]q(hX'naturalSort() (in module buildbot.util)hUtqauh|Nh}hhd]ubcsphinx.addnodes desc q)q}q(hiUhjhghkhnhpUdescqhr}q(UnoindexqÉUdomainqXpyhw]hv]ht]hu]hz]UobjtypeqXfunctionqUdesctypeqhuh|Nh}hhd]q(csphinx.addnodes desc_signature q)q}q(hiXnaturalSort(list)hjhhkhnhpUdesc_signatureqhr}q(hw]qhaUmoduleqhhv]ht]hu]hz]qhaUfullnameqX naturalSortqUclassqUUfirstqԉuh|Kh}hhd]q(csphinx.addnodes desc_addname q)q}q(hiXbuildbot.util.hjhhkhnhpU desc_addnameqhr}q(ht]hu]hv]hw]hz]uh|Kh}hhd]qhXbuildbot.util.q܅q}q(hiUhjhubaubcsphinx.addnodes desc_name q)q}q(hihhjhhkhnhpU desc_nameqhr}q(ht]hu]hv]hw]hz]uh|Kh}hhd]qhX naturalSortq允q}q(hiUhjhubaubcsphinx.addnodes desc_parameterlist q)q}q(hiUhjhhkhnhpUdesc_parameterlistqhr}q(ht]hu]hv]hw]hz]uh|Kh}hhd]qcsphinx.addnodes desc_parameter q)q}q(hiXlisthr}q(ht]hu]hv]hw]hz]uhjhhd]qhXlistqq}q(hiUhjhubahpUdesc_parameterqubaubeubcsphinx.addnodes desc_content q)q}q(hiUhjhhkhnhpU desc_contentqhr}q(ht]hu]hv]hw]hz]uh|Kh}hhd]q(cdocutils.nodes field_list q)q}q(hiUhjhhkhnhpU field_listrhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(cdocutils.nodes field r)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjhhd]r(cdocutils.nodes field_name r)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjjhd]r hX Parametersr r}r(hiUhjj ubahpU field_namerubcdocutils.nodes field_body r)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(cdocutils.nodes strong r)r}r(hiXlisthr}r(ht]hu]hv]hw]hz]uhjjhd]rhXlistrr }r!(hiUhjjubahpUstrongr"ubhX -- r#r$}r%(hiUhjjubhXlist of stringsr&r'}r((hiXlist of stringshjjubehphubahpU field_bodyr)ubehpUfieldr*ubj)r+}r,(hiUhr}r-(ht]hu]hv]hw]hz]uhjhhd]r.(j)r/}r0(hiUhr}r1(ht]hu]hv]hw]hz]uhjj+hd]r2hXReturnsr3r4}r5(hiUhjj/ubahpjubj)r6}r7(hiUhr}r8(ht]hu]hv]hw]hz]uhjj+hd]r9h)r:}r;(hiUhr}r<(ht]hu]hv]hw]hz]uhjj6hd]r=hXsorted stringsr>r?}r@(hiXsorted stringshjj:ubahphubahpj)ubehpj*ubeubh)rA}rB(hiXThis function sorts strings "naturally", with embedded numbers sorted numerically. This ordering is good for objects which might have a numeric suffix, e.g., ``winslave1``, ``winslave2``hjhhkhnhphhr}rC(ht]hu]hv]hw]hz]uh|Kh}hhd]rD(hXThis function sorts strings "naturally", with embedded numbers sorted numerically. This ordering is good for objects which might have a numeric suffix, e.g., rErF}rG(hiXThis function sorts strings "naturally", with embedded numbers sorted numerically. This ordering is good for objects which might have a numeric suffix, e.g., hjjAubh)rH}rI(hiX ``winslave1``hr}rJ(ht]hu]hv]hw]hz]uhjjAhd]rKhX winslave1rLrM}rN(hiUhjjHubahphubhX, rOrP}rQ(hiX, hjjAubh)rR}rS(hiX ``winslave2``hr}rT(ht]hu]hv]hw]hz]uhjjAhd]rUhX winslave2rVrW}rX(hiUhjjRubahphubeubeubeubh)rY}rZ(hiUhjhghkhnhphhr}r[(hw]hv]ht]hu]hz]Uentries]r\(hX*formatInterval() (in module buildbot.util)hDUtr]auh|Nh}hhd]ubh)r^}r_(hiUhjhghkhnhphhr}r`(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrahjauh|Nh}hhd]rb(h)rc}rd(hiXformatInterval(interval)hjj^hkhnhphhr}re(hw]rfhDahhhv]ht]hu]hz]rghDahXformatIntervalrhhUhԉuh|Kh}hhd]ri(h)rj}rk(hiXbuildbot.util.hjjchkhnhphhr}rl(ht]hu]hv]hw]hz]uh|Kh}hhd]rmhXbuildbot.util.rnro}rp(hiUhjjjubaubh)rq}rr(hijhhjjchkhnhphhr}rs(ht]hu]hv]hw]hz]uh|Kh}hhd]rthXformatIntervalrurv}rw(hiUhjjqubaubh)rx}ry(hiUhjjchkhnhphhr}rz(ht]hu]hv]hw]hz]uh|Kh}hhd]r{h)r|}r}(hiXintervalhr}r~(ht]hu]hv]hw]hz]uhjjxhd]rhXintervalrr}r(hiUhjj|ubahphubaubeubh)r}r(hiUhjj^hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXintervalhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXintervalrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhXduration in secondsrr}r(hiXduration in secondshjjubehphubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX#human-readable (English) equivalentrr}r(hiX#human-readable (English) equivalenthjjubahphubahpj)ubehpj*ubeubh)r}r(hiXiThis function will return a human-readable string describing a length of time, given a number of seconds.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXiThis function will return a human-readable string describing a length of time, given a number of seconds.rr}r(hijhjjubaubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX(ComparableMixin (class in buildbot.util)h5Utrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXclassrhjuh|Nh}hhd]r(h)r}r(hiXComparableMixinrhjjhkhnhphhr}r(hw]rh5ahhhv]ht]hu]hz]rh5ahjhUhԉuh|K+h}hhd]r(csphinx.addnodes desc_annotation r)r}r(hiXclass hjjhkhnhpUdesc_annotationrhr}r(ht]hu]hv]hw]hz]uh|K+h}hhd]rhXclass rr}r(hiUhjjubaubh)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K+h}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K+h}hhd]rhXComparableMixinrr}r(hiUhjjubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K+h}hhd]r(h)r}r(hiXFThis mixin class adds comparability to a subclass. Use it like this::hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXEThis mixin class adds comparability to a subclass. Use it like this:rr}r(hiXEThis mixin class adds comparability to a subclass. Use it like this:hjjubaubcdocutils.nodes literal_block r)r}r(hiXfclass Widget(FactoryProduct, ComparableMixin): compare_attrs = [ 'radius', 'thickness' ] # ...hjjhkhnhpU literal_blockrhr}r(U xml:spacerUpreserverhw]hv]ht]hu]hz]uh|Kh}hhd]rhXfclass Widget(FactoryProduct, ComparableMixin): compare_attrs = [ 'radius', 'thickness' ] # ...rr}r(hiUhjjubaubh)r}r(hiX&Any attributes not in ``compare_attrs`` will not be considered when comparing objects. This is particularly useful in implementing buildbot's reconfig logic, where a simple comparison between the new and existing objects can determine whether the new object should replace the existing object.hjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|K"h}hhd]r (hXAny attributes not in r r }r (hiXAny attributes not in hjjubh)r}r(hiX``compare_attrs``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhX compare_attrsrr}r(hiUhjjubahphubhX will not be considered when comparing objects. This is particularly useful in implementing buildbot's reconfig logic, where a simple comparison between the new and existing objects can determine whether the new object should replace the existing object.rr}r(hiX will not be considered when comparing objects. This is particularly useful in implementing buildbot's reconfig logic, where a simple comparison between the new and existing objects can determine whether the new object should replace the existing object.hjjubeubh)r}r(hiXA point to note is that the compare_attrs list is cumulative; that is, when a subclass also has a compare_attrs and the parent class has a compare_attrs, the subclass' compare_attrs also includes the parent class' compare_attrs.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K'h}hhd]rhXA point to note is that the compare_attrs list is cumulative; that is, when a subclass also has a compare_attrs and the parent class has a compare_attrs, the subclass' compare_attrs also includes the parent class' compare_attrs.rr}r(hijhjjubaubeubeubh)r }r!(hiUhjhghkhnhphhr}r"(hw]hv]ht]hu]hz]Uentries]r#(hX)safeTranslate() (in module buildbot.util)hUtr$auh|Nh}hhd]ubh)r%}r&(hiUhjhghkhnhphhr}r'(hÉhXpyhw]hv]ht]hu]hz]hXfunctionr(hj(uh|Nh}hhd]r)(h)r*}r+(hiXsafeTranslate(str)hjj%hkhnhphhr}r,(hw]r-hahhhv]ht]hu]hz]r.hahX safeTranslater/hUhԉuh|K4h}hhd]r0(h)r1}r2(hiXbuildbot.util.hjj*hkhnhphhr}r3(ht]hu]hv]hw]hz]uh|K4h}hhd]r4hXbuildbot.util.r5r6}r7(hiUhjj1ubaubh)r8}r9(hij/hjj*hkhnhphhr}r:(ht]hu]hv]hw]hz]uh|K4h}hhd]r;hX safeTranslater<r=}r>(hiUhjj8ubaubh)r?}r@(hiUhjj*hkhnhphhr}rA(ht]hu]hv]hw]hz]uh|K4h}hhd]rBh)rC}rD(hiXstrhr}rE(ht]hu]hv]hw]hz]uhjj?hd]rFhXstrrGrH}rI(hiUhjjCubahphubaubeubh)rJ}rK(hiUhjj%hkhnhphhr}rL(ht]hu]hv]hw]hz]uh|K4h}hhd]rM(h)rN}rO(hiUhjjJhkhnhpjhr}rP(ht]hu]hv]hw]hz]uh|Nh}hhd]rQ(j)rR}rS(hiUhr}rT(ht]hu]hv]hw]hz]uhjjNhd]rU(j)rV}rW(hiUhr}rX(ht]hu]hv]hw]hz]uhjjRhd]rYhX ParametersrZr[}r\(hiUhjjVubahpjubj)r]}r^(hiUhr}r_(ht]hu]hv]hw]hz]uhjjRhd]r`h)ra}rb(hiUhr}rc(ht]hu]hv]hw]hz]uhjj]hd]rd(j)re}rf(hiXstrhr}rg(ht]hu]hv]hw]hz]uhjjahd]rhhXstrrirj}rk(hiUhjjeubahpj"ubhX -- rlrm}rn(hiUhjjaubhX input stringrorp}rq(hiX input stringhjjaubehphubahpj)ubehpj*ubj)rr}rs(hiUhr}rt(ht]hu]hv]hw]hz]uhjjNhd]ru(j)rv}rw(hiUhr}rx(ht]hu]hv]hw]hz]uhjjrhd]ryhXReturnsrzr{}r|(hiUhjjvubahpjubj)r}}r~(hiUhr}r(ht]hu]hv]hw]hz]uhjjrhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjj}hd]rhXsafe version of the inputrr}r(hiXsafe version of the inputhjjubahphubahpj)ubehpj*ubeubh)r}r(hiXThis function will filter out some inappropriate characters for filenames; it is suitable for adapting strings from the configuration for use as filenames. It is not suitable for use with strings from untrusted sources.rhjjJhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K1h}hhd]rhXThis function will filter out some inappropriate characters for filenames; it is suitable for adapting strings from the configuration for use as filenames. It is not suitable for use with strings from untrusted sources.rr}r(hijhjjubaubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX*epoch2datetime() (in module buildbot.util)h)Utrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXepoch2datetime(epoch)hjjhkhnhphhr}r(hw]rh)ahhhv]ht]hu]hz]rh)ahXepoch2datetimerhUhԉuh|K=h}hhd]r(h)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K=h}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K=h}hhd]rhXepoch2datetimerr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K=h}hhd]rh)r}r(hiXepochhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXepochrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K=h}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXepochhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXepochrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhXan epoch time (integer)rr}r(hiXan epoch time (integer)hjjubehphubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXequivalent datetime objectrr}r(hiXequivalent datetime objecthjjubahphubahpj)ubehpj*ubeubh)r}r(hiXConvert a UNIX epoch timestamp to a Python datetime object, in the UTC timezone. Note that timestamps specify UTC time (modulo leap seconds and a few other minor details).rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K:h}hhd]rhXConvert a UNIX epoch timestamp to a Python datetime object, in the UTC timezone. Note that timestamps specify UTC time (modulo leap seconds and a few other minor details).rr}r(hijhjjubaubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX*datetime2epoch() (in module buildbot.util)h+Utrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r (h)r }r (hiXdatetime2epoch(datetime)hjjhkhnhphhr}r (hw]r h+ahhhv]ht]hu]hz]rh+ahXdatetime2epochrhUhԉuh|KDh}hhd]r(h)r}r(hiXbuildbot.util.hjj hkhnhphhr}r(ht]hu]hv]hw]hz]uh|KDh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjj hkhnhphhr}r(ht]hu]hv]hw]hz]uh|KDh}hhd]rhXdatetime2epochrr}r(hiUhjjubaubh)r}r (hiUhjj hkhnhphhr}r!(ht]hu]hv]hw]hz]uh|KDh}hhd]r"h)r#}r$(hiXdatetimehr}r%(ht]hu]hv]hw]hz]uhjjhd]r&hXdatetimer'r(}r)(hiUhjj#ubahphubaubeubh)r*}r+(hiUhjjhkhnhphhr}r,(ht]hu]hv]hw]hz]uh|KDh}hhd]r-(h)r.}r/(hiUhjj*hkhnhpjhr}r0(ht]hu]hv]hw]hz]uh|Nh}hhd]r1(j)r2}r3(hiUhr}r4(ht]hu]hv]hw]hz]uhjj.hd]r5(j)r6}r7(hiUhr}r8(ht]hu]hv]hw]hz]uhjj2hd]r9hX Parametersr:r;}r<(hiUhjj6ubahpjubj)r=}r>(hiUhr}r?(ht]hu]hv]hw]hz]uhjj2hd]r@h)rA}rB(hiUhr}rC(ht]hu]hv]hw]hz]uhjj=hd]rD(j)rE}rF(hiXdatetimehr}rG(ht]hu]hv]hw]hz]uhjjAhd]rHhXdatetimerIrJ}rK(hiUhjjEubahpj"ubhX -- rLrM}rN(hiUhjjAubhXa datetime objectrOrP}rQ(hiXa datetime objecthjjAubehphubahpj)ubehpj*ubj)rR}rS(hiUhr}rT(ht]hu]hv]hw]hz]uhjj.hd]rU(j)rV}rW(hiUhr}rX(ht]hu]hv]hw]hz]uhjjRhd]rYhXReturnsrZr[}r\(hiUhjjVubahpjubj)r]}r^(hiUhr}r_(ht]hu]hv]hw]hz]uhjjRhd]r`h)ra}rb(hiUhr}rc(ht]hu]hv]hw]hz]uhjj]hd]rdhXequivalent epoch time (integer)rerf}rg(hiXequivalent epoch time (integer)hjjaubahphubahpj)ubehpj*ubeubh)rh}ri(hiXHConvert an arbitrary Python datetime object into a UNIX epoch timestamp.rjhjj*hkhnhphhr}rk(ht]hu]hv]hw]hz]uh|KCh}hhd]rlhXHConvert an arbitrary Python datetime object into a UNIX epoch timestamp.rmrn}ro(hijjhjjhubaubeubeubh)rp}rq(hiUhjhghkhnhphhr}rr(hw]hv]ht]hu]hz]Uentries]rs(hXUTC (in module buildbot.util)h"Utrtauh|Nh}hhd]ubh)ru}rv(hiUhjhghkhnhphhr}rw(hÉhXpyhw]hv]ht]hu]hz]hXdatarxhjxuh|Nh}hhd]ry(h)rz}r{(hiXUTCr|hjjuhkhnhphhr}r}(hw]r~h"ahhhv]ht]hu]hz]rh"ahj|hUhԉuh|KMh}hhd]r(h)r}r(hiXbuildbot.util.hjjzhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KMh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hij|hjjzhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KMh}hhd]rhXUTCrr}r(hiUhjjubaubeubh)r}r(hiUhjjuhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KMh}hhd]r(h)r}r(hiXA ``datetime.tzinfo`` subclass representing UTC time. A similar class has finally been added to Python in version 3.2, but the implementation is simple enough to include here. This is mostly used in tests to create timezone-aware datetime objects in UTC::hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KGh}hhd]r(hXA rr}r(hiXA hjjubh)r}r(hiX``datetime.tzinfo``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXdatetime.tzinforr}r(hiUhjjubahphubhX subclass representing UTC time. A similar class has finally been added to Python in version 3.2, but the implementation is simple enough to include here. This is mostly used in tests to create timezone-aware datetime objects in UTC:rr}r(hiX subclass representing UTC time. A similar class has finally been added to Python in version 3.2, but the implementation is simple enough to include here. This is mostly used in tests to create timezone-aware datetime objects in UTC:hjjubeubj)r}r(hiX;dt = datetime.datetime(1978, 6, 15, 12, 31, 15, tzinfo=UTC)hjjhkhnhpjhr}r(jjhw]hv]ht]hu]hz]uh|KLh}hhd]rhX;dt = datetime.datetime(1978, 6, 15, 12, 31, 15, tzinfo=UTC)rr}r(hiUhjjubaubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX$diffSets() (in module buildbot.util)h Utrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyrhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXdiffSets(old, new)hjjhkhnhphhr}r(hw]rh ahhhv]ht]hu]hz]rh ahXdiffSetsrhUhԉuh|KYh}hhd]r(h)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KYh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KYh}hhd]rhXdiffSetsrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KYh}hhd]r(h)r}r(hiXoldhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXoldrr}r(hiUhjjubahphubh)r}r(hiXnewhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXnewrr}r(hiUhjjubahphubeubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|KYh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rcdocutils.nodes bullet_list r)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(cdocutils.nodes list_item r)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXoldhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXoldrr}r(hiUhjjubahpj"ubhX (r r }r (hiUhjjubh)r }r (hiUhr}r(UreftypeUobjrU reftargetXset or iterablerU refdomainjhw]hv]U refexplicitht]hu]hz]uhjjhd]rcdocutils.nodes emphasis r)r}r(hijhr}r(ht]hu]hv]hw]hz]uhjj hd]rhXset or iterablerr}r(hiUhjjubahpUemphasisrubahphubhX)r}r(hiUhjjubhX -- rr}r(hiUhjjubhXold setr r!}r"(hiXold sethjjubehphubahpU list_itemr#ubj)r$}r%(hiUhr}r&(ht]hu]hv]hw]hz]uhjjhd]r'h)r(}r)(hiUhr}r*(ht]hu]hv]hw]hz]uhjj$hd]r+(j)r,}r-(hiXnewhr}r.(ht]hu]hv]hw]hz]uhjj(hd]r/hXnewr0r1}r2(hiUhjj,ubahpj"ubhX (r3r4}r5(hiUhjj(ubh)r6}r7(hiUhr}r8(UreftypejU reftargetXset or iterabler9U refdomainjhw]hv]U refexplicitht]hu]hz]uhjj(hd]r:j)r;}r<(hij9hr}r=(ht]hu]hv]hw]hz]uhjj6hd]r>hXset or iterabler?r@}rA(hiUhjj;ubahpjubahphubhX)rB}rC(hiUhjj(ubhX -- rDrE}rF(hiUhjj(ubhXnew setrGrH}rI(hiXnew sethjj(ubehphubahpj#ubehpU bullet_listrJubahpj)ubehpj*ubj)rK}rL(hiUhr}rM(ht]hu]hv]hw]hz]uhjjhd]rN(j)rO}rP(hiUhr}rQ(ht]hu]hv]hw]hz]uhjjKhd]rRhXReturnsrSrT}rU(hiUhjjOubahpjubj)rV}rW(hiUhr}rX(ht]hu]hv]hw]hz]uhjjKhd]rYh)rZ}r[(hiUhr}r\(ht]hu]hv]hw]hz]uhjjVhd]r]hXa tuple, (removed, added)r^r_}r`(hiXa tuple, (removed, added)hjjZubahphubahpj)ubehpj*ubeubh)ra}rb(hiXThis function compares two sets of objects, returning elements that were added and elements that were removed. This is largely a convenience function for reconfiguring services.rchjjhkhnhphhr}rd(ht]hu]hv]hw]hz]uh|KVh}hhd]rehXThis function compares two sets of objects, returning elements that were added and elements that were removed. This is largely a convenience function for reconfiguring services.rfrg}rh(hijchjjaubaubeubeubh)ri}rj(hiUhjhghkhnhphhr}rk(hw]hv]ht]hu]hz]Uentries]rl(hX$makeList() (in module buildbot.util)hUtrmauh|Nh}hhd]ubh)rn}ro(hiUhjhghkhnhphhr}rp(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrqhjquh|Nh}hhd]rr(h)rs}rt(hiXmakeList(input)hjjnhkhnhphhr}ru(hw]rvhahhhv]ht]hu]hz]rwhahXmakeListrxhUhԉuh|Kdh}hhd]ry(h)rz}r{(hiXbuildbot.util.hjjshkhnhphhr}r|(ht]hu]hv]hw]hz]uh|Kdh}hhd]r}hXbuildbot.util.r~r}r(hiUhjjzubaubh)r}r(hijxhjjshkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kdh}hhd]rhXmakeListrr}r(hiUhjjubaubh)r}r(hiUhjjshkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kdh}hhd]rh)r}r(hiXinputhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXinputrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjnhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kdh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXinputhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXinputrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhXa thingrr}r(hiXa thinghjjubehphubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXa list of zero or more thingsrr}r(hiXa list of zero or more thingshjjubahphubahpj)ubehpj*ubeubh)r}r(hiXUThis function is intended to support the many places in Buildbot where the user can specify either a string or a list of strings, but the implementation wishes to always consider lists. It converts any string to a single-element list, ``None`` to an empty list, and any iterable to a list. Input lists are copied, avoiding aliasing issues.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|K_h}hhd]r(hXThis function is intended to support the many places in Buildbot where the user can specify either a string or a list of strings, but the implementation wishes to always consider lists. It converts any string to a single-element list, rr}r(hiXThis function is intended to support the many places in Buildbot where the user can specify either a string or a list of strings, but the implementation wishes to always consider lists. It converts any string to a single-element list, hjjubh)r}r(hiX``None``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXNonerr}r(hiUhjjubahphubhXa to an empty list, and any iterable to a list. Input lists are copied, avoiding aliasing issues.rr}r(hiXa to an empty list, and any iterable to a list. Input lists are copied, avoiding aliasing issues.hjjubeubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hXnow() (in module buildbot.util)hAUtrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXnow()hjjhkhnhphhr}r(hw]rhAahhhv]ht]hu]hz]rhAahXnowrhUhԉuh|Kkh}hhd]r(h)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kkh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kkh}hhd]rhXnowrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kkh}hhd]ubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kkh}hhd]r(h)r}r (hiUhjjhkhnhpjhr}r (ht]hu]hv]hw]hz]uh|Nh}hhd]r j)r }r (hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjj hd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjj hd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXepoch time (integer)rr }r!(hiXepoch time (integer)hjjubahphubahpj)ubehpj*ubaubh)r"}r#(hiXMReturn the current time, using either ``reactor.seconds`` or ``time.time()``.hjjhkhnhphhr}r$(ht]hu]hv]hw]hz]uh|Kih}hhd]r%(hX&Return the current time, using either r&r'}r((hiX&Return the current time, using either hjj"ubh)r)}r*(hiX``reactor.seconds``hr}r+(ht]hu]hv]hw]hz]uhjj"hd]r,hXreactor.secondsr-r.}r/(hiUhjj)ubahphubhX or r0r1}r2(hiX or hjj"ubh)r3}r4(hiX``time.time()``hr}r5(ht]hu]hv]hw]hz]uhjj"hd]r6hX time.time()r7r8}r9(hiUhjj3ubahphubhX.r:}r;(hiX.hjj"ubeubeubeubh)r<}r=(hiUhjhghkhnhphhr}r>(hw]hv]ht]hu]hz]Uentries]r?(hX#flatten() (in module buildbot.util)h6Utr@auh|Nh}hhd]ubh)rA}rB(hiUhjhghkhnhphhr}rC(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrDhjDuh|Nh}hhd]rE(h)rF}rG(hiX flatten(list)hjjAhkhnhphhr}rH(hw]rIh6ahhhv]ht]hu]hz]rJh6ahXflattenrKhUhԉuh|Kzh}hhd]rL(h)rM}rN(hiXbuildbot.util.hjjFhkhnhphhr}rO(ht]hu]hv]hw]hz]uh|Kzh}hhd]rPhXbuildbot.util.rQrR}rS(hiUhjjMubaubh)rT}rU(hijKhjjFhkhnhphhr}rV(ht]hu]hv]hw]hz]uh|Kzh}hhd]rWhXflattenrXrY}rZ(hiUhjjTubaubh)r[}r\(hiUhjjFhkhnhphhr}r](ht]hu]hv]hw]hz]uh|Kzh}hhd]r^h)r_}r`(hiXlisthr}ra(ht]hu]hv]hw]hz]uhjj[hd]rbhXlistrcrd}re(hiUhjj_ubahphubaubeubh)rf}rg(hiUhjjAhkhnhphhr}rh(ht]hu]hv]hw]hz]uh|Kzh}hhd]ri(h)rj}rk(hiUhjjfhkhnhpjhr}rl(ht]hu]hv]hw]hz]uh|Nh}hhd]rm(j)rn}ro(hiUhr}rp(ht]hu]hv]hw]hz]uhjjjhd]rq(j)rr}rs(hiUhr}rt(ht]hu]hv]hw]hz]uhjjnhd]ruhX Parametersrvrw}rx(hiUhjjrubahpjubj)ry}rz(hiUhr}r{(ht]hu]hv]hw]hz]uhjjnhd]r|h)r}}r~(hiUhr}r(ht]hu]hv]hw]hz]uhjjyhd]r(j)r}r(hiXlisthr}r(ht]hu]hv]hw]hz]uhjj}hd]rhXlistrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjj}ubhXpotentially nested listrr}r(hiXpotentially nested listhjj}ubehphubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX flat listrr}r(hiX flat listhjjubahphubahpj)ubehpj*ubeubh)r}r(hiXIFlatten nested lists into a list containing no other lists. For example:rhjjfhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kqh}hhd]rhXIFlatten nested lists into a list containing no other lists. For example:rr}r(hijhjjubaubj)r}r(hiX7>>> flatten([ [ 1, 2 ], 3, [ [ 4 ] ] ]) [ 1, 2, 3, 4 ]hjjfhkhnhpjhr}r(UlinenosrUlanguagerXnonejjhw]hv]ht]hu]hz]uh|Ksh}hhd]rhX7>>> flatten([ [ 1, 2 ], 3, [ [ 4 ] ] ]) [ 1, 2, 3, 4 ]rr}r(hiUhjjubaubh)r}r(hiXRNote that this looks strictly for lists -- tuples, for example, are not flattened.rhjjfhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kxh}hhd]rhXRNote that this looks strictly for lists -- tuples, for example, are not flattened.rr}r(hijhjjubaubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX'none_or_str() (in module buildbot.util)h>Utrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXnone_or_str(obj)hjjhkhnhphhr}r(hw]rh>ahhhv]ht]hu]hz]rh>ahX none_or_strrhUhԉuh|Kh}hhd]r(h)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhX none_or_strrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiXobjhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXobjrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXobjhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXobjrr}r(hiUhjjubahpj"ubhX -- r r }r (hiUhjjubhX input valuer r }r(hiX input valuehjjubehphubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r (ht]hu]hv]hw]hz]uhjjhd]r!(hX string or r"r#}r$(hiX string or hjjubh)r%}r&(hiX``None``hr}r'(ht]hu]hv]hw]hz]uhjjhd]r(hXNoner)r*}r+(hiUhjj%ubahphubehphubahpj)ubehpj*ubeubh)r,}r-(hiX9If ``obj`` is not None, return its string representation.hjjhkhnhphhr}r.(ht]hu]hv]hw]hz]uh|Kh}hhd]r/(hXIf r0r1}r2(hiXIf hjj,ubh)r3}r4(hiX``obj``hr}r5(ht]hu]hv]hw]hz]uhjj,hd]r6hXobjr7r8}r9(hiUhjj3ubahphubhX/ is not None, return its string representation.r:r;}r<(hiX/ is not None, return its string representation.hjj,ubeubeubeubh)r=}r>(hiUhjhghkhnhphhr}r?(hw]hv]ht]hu]hz]Uentries]r@(hX$NotABranch (in module buildbot.util)hHUtrAauh|Nh}hhd]ubh)rB}rC(hiUhjhghkhnhphhr}rD(hÉhXpyhw]hv]ht]hu]hz]hXdatarEhjEuh|Nh}hhd]rF(h)rG}rH(hiX NotABranchrIhjjBhkhnhphhr}rJ(hw]rKhHahhhv]ht]hu]hz]rLhHahjIhUhԉuh|Kh}hhd]rM(h)rN}rO(hiXbuildbot.util.hjjGhkhnhphhr}rP(ht]hu]hv]hw]hz]uh|Kh}hhd]rQhXbuildbot.util.rRrS}rT(hiUhjjNubaubh)rU}rV(hijIhjjGhkhnhphhr}rW(ht]hu]hv]hw]hz]uh|Kh}hhd]rXhX NotABranchrYrZ}r[(hiUhjjUubaubeubh)r\}r](hiUhjjBhkhnhphhr}r^(ht]hu]hv]hw]hz]uh|Kh}hhd]r_(h)r`}ra(hiXThis is a sentinel value used to indicate that no branch is specified. It is necessary since schedulers and change sources consider ``None`` a valid name for a branch. This is generally used as a default value in a method signature, and then tested against with ``is``::hjj\hkhnhphhr}rb(ht]hu]hv]hw]hz]uh|Kh}hhd]rc(hXThis is a sentinel value used to indicate that no branch is specified. It is necessary since schedulers and change sources consider rdre}rf(hiXThis is a sentinel value used to indicate that no branch is specified. It is necessary since schedulers and change sources consider hjj`ubh)rg}rh(hiX``None``hr}ri(ht]hu]hv]hw]hz]uhjj`hd]rjhXNonerkrl}rm(hiUhjjgubahphubhX{ a valid name for a branch. This is generally used as a default value in a method signature, and then tested against with rnro}rp(hiX{ a valid name for a branch. This is generally used as a default value in a method signature, and then tested against with hjj`ubh)rq}rr(hiX``is``hr}rs(ht]hu]hv]hw]hz]uhjj`hd]rthXisrurv}rw(hiUhjjqubahphubhX:rx}ry(hiX:hjj`ubeubj)rz}r{(hiX'if branch is NotABranch: pass # ...hjj\hkhnhpjhr}r|(jjhw]hv]ht]hu]hz]uh|Kh}hhd]r}hX'if branch is NotABranch: pass # ...r~r}r(hiUhjjzubaubeubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX&in_reactor() (in module buildbot.util)h&Utrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXin_reactor(fn)hjjhkhnhphhr}r(hw]rh&ahhhv]ht]hu]hz]rh&ahX in_reactorrhUhԉuh|Kh}hhd]r(h)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhX in_reactorrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiXfnhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXfnrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiX This decorator will cause the wrapped function to be run in the Twisted reactor, with the reactor stopped when the function completes. It returns the result of the wrapped function. If the wrapped function fails, its traceback will be printed, the reactor halted, and ``None`` returned.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(hXThis decorator will cause the wrapped function to be run in the Twisted reactor, with the reactor stopped when the function completes. It returns the result of the wrapped function. If the wrapped function fails, its traceback will be printed, the reactor halted, and rr}r(hiXThis decorator will cause the wrapped function to be run in the Twisted reactor, with the reactor stopped when the function completes. It returns the result of the wrapped function. If the wrapped function fails, its traceback will be printed, the reactor halted, and hjjubh)r}r(hiX``None``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXNonerr}r(hiUhjjubahphubhX returned.rr}r(hiX returned.hjjubeubaubeubh)r}r(hiUhjhghkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX&asyncSleep() (in module buildbot.util)hUtrauh|Nh}hhd]ubh)r}r(hiUhjhghkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXasyncSleep(secs)hjjhkhnhphhr}r(hw]rhahhhv]ht]hu]hz]rhahX asyncSleeprhUhԉuh|Kh}hhd]r(h)r}r(hiXbuildbot.util.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhX asyncSleeprr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiXsecshr}r(ht]hu]hv]hw]hz]uhjjhd]rhXsecsrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiXYield a deferred that will fire with no result after ``secs`` seconds. This is the asynchronous equivalent to ``time.sleep``, and can be useful in tests.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(hX5Yield a deferred that will fire with no result after rr}r(hiX5Yield a deferred that will fire with no result after hjjubh)r}r(hiX``secs``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXsecsrr}r(hiUhjjubahphubhX1 seconds. This is the asynchronous equivalent to rr}r(hiX1 seconds. This is the asynchronous equivalent to hjjubh)r}r(hiX``time.sleep``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhX time.sleeprr}r(hiUhjjubahphubhX, and can be useful in tests.rr}r(hiX, and can be useful in tests.hjjubeubaubeubhf)r }r (hiUhjhghkhnhphqhr}r (ht]hu]hv]hw]r (Xmodule-buildbot.util.lrur h]ehz]rh-auh|Kh}hhd]r(h)r}r(hiXbuildbot.util.lrurhjj hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.lrurr}r(hijhjjubaubh)r}r(hiUhjj hkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hXbuildbot.util.lru (module)Xmodule-buildbot.util.lruUtrauh|Kh}hhd]ubh)r}r(hiUhjj hkNhphhr}r(hw]hv]ht]hu]hz]Uentries]uh|Nh}hhd]ubh)r }r!(hiUhjj hkNhphhr}r"(hÉhXpyhw]hv]ht]hu]hz]hXclassr#hj#uh|Nh}hhd]r$(h)r%}r&(hiXLRUCache(miss_fn, max_size=50):r'hjj hkhnhphhr}r((hw]hv]ht]hu]hz]hԉuh|Kh}hhd]r)h)r*}r+(hij'hjj%hkhnhphhr}r,(ht]hu]hv]hw]hz]uh|Kh}hhd]r-hXLRUCache(miss_fn, max_size=50):r.r/}r0(hiUhjj*ubaubaubh)r1}r2(hiUhjj hkhnhphhr}r3(ht]hu]hv]hw]hz]uh|Kh}hhd]r4(h)r5}r6(hiUhjj1hkNhpjhr}r7(ht]hu]hv]hw]hz]uh|Nh}hhd]r8j)r9}r:(hiUhr}r;(ht]hu]hv]hw]hz]uhjj5hd]r<(j)r=}r>(hiUhr}r?(ht]hu]hv]hw]hz]uhjj9hd]r@hX ParametersrArB}rC(hiUhjj=ubahpjubj)rD}rE(hiUhr}rF(ht]hu]hv]hw]hz]uhjj9hd]rGj)rH}rI(hiUhr}rJ(ht]hu]hv]hw]hz]uhjjDhd]rK(j)rL}rM(hiUhr}rN(ht]hu]hv]hw]hz]uhjjHhd]rOh)rP}rQ(hiUhr}rR(ht]hu]hv]hw]hz]uhjjLhd]rS(j)rT}rU(hiXmiss_fnhr}rV(ht]hu]hv]hw]hz]uhjjPhd]rWhXmiss_fnrXrY}rZ(hiUhjjTubahpj"ubhX -- r[r\}r](hiUhjjPubhXfunction to call, with key as parameter, for cache misses. The function should return the value associated with the key argument, or None if there is no value associated with the key.r^r_}r`(hiXfunction to call, with key as parameter, for cache misses. The function should return the value associated with the key argument, or None if there is no value associated with the key.hjjPubehphubahpj#ubj)ra}rb(hiUhr}rc(ht]hu]hv]hw]hz]uhjjHhd]rdh)re}rf(hiUhr}rg(ht]hu]hv]hw]hz]uhjjahd]rh(j)ri}rj(hiXmax_sizehr}rk(ht]hu]hv]hw]hz]uhjjehd]rlhXmax_sizermrn}ro(hiUhjjiubahpj"ubhX -- rprq}rr(hiUhjjeubhX'maximum number of objects in the cache.rsrt}ru(hiX'maximum number of objects in the cache.hjjeubehphubahpj#ubehpjJubahpj)ubehpj*ubaubh)rv}rw(hiXThis is a simple least-recently-used cache. When the cache grows beyond the maximum size, the least-recently used items will be automatically removed from the cache.rxhjj1hkhnhphhr}ry(ht]hu]hv]hw]hz]uh|Kh}hhd]rzhXThis is a simple least-recently-used cache. When the cache grows beyond the maximum size, the least-recently used items will be automatically removed from the cache.r{r|}r}(hijxhjjvubaubh)r~}r(hiXThis cache is designed to control memory usage by minimizing duplication of objects, while avoiding unnecessary re-fetching of the same rows from the database.rhjj1hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXThis cache is designed to control memory usage by minimizing duplication of objects, while avoiding unnecessary re-fetching of the same rows from the database.rr}r(hijhjj~ubaubh)r}r(hiXAll values are also stored in a weak valued dictionary, even after they have expired from the cache. This allows values that are used elsewhere in Buildbot to "stick" in the cache in case they are needed by another component. Weak references cannot be used for some types, so these types are not compatible with this class. Note that dictionaries can be weakly referenced if they are an instance of a subclass of ``dict``.hjj1hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(hXAll values are also stored in a weak valued dictionary, even after they have expired from the cache. This allows values that are used elsewhere in Buildbot to "stick" in the cache in case they are needed by another component. Weak references cannot be used for some types, so these types are not compatible with this class. Note that dictionaries can be weakly referenced if they are an instance of a subclass of rr}r(hiXAll values are also stored in a weak valued dictionary, even after they have expired from the cache. This allows values that are used elsewhere in Buildbot to "stick" in the cache in case they are needed by another component. Weak references cannot be used for some types, so these types are not compatible with this class. Note that dictionaries can be weakly referenced if they are an instance of a subclass of hjjubh)r}r(hiX``dict``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXdictrr}r(hiUhjjubahphubhX.r}r(hiX.hjjubeubh)r}r(hiXIf the result of the ``miss_fn`` is ``None``, then the value is not cached; this is intended to avoid caching negative results.hjj1hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(hXIf the result of the rr}r(hiXIf the result of the hjjubh)r}r(hiX ``miss_fn``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXmiss_fnrr}r(hiUhjjubahphubhX is rr}r(hiX is hjjubh)r}r(hiX``None``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXNonerr}r(hiUhjjubahphubhXS, then the value is not cached; this is intended to avoid caching negative results.rr}r(hiXS, then the value is not cached; this is intended to avoid caching negative results.hjjubeubh)r}r(hiXThis is based on `Raymond Hettinger's implementation `_, licensed under the PSF license, which is GPL-compatiblie.hjj1hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(hXThis is based on rr}r(hiXThis is based on hjjubcdocutils.nodes reference r)r}r(hiXp`Raymond Hettinger's implementation `_hr}r(UnameX"Raymond Hettinger's implementationUrefurirXHhttp://code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/rhw]hv]ht]hu]hz]uhjjhd]rhX"Raymond Hettinger's implementationrr}r(hiUhjjubahpU referencerubcdocutils.nodes target r)r}r(hiXK U referencedrKhjjhpUtargetrhr}r(Urefurijhw]rhRahv]ht]hu]hz]rhauhd]ubhX;, licensed under the PSF license, which is GPL-compatiblie.rr}r(hiX;, licensed under the PSF license, which is GPL-compatiblie.hjjubeubh)r}r(hiUhjj1hkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX"hits (in module buildbot.util.lru)hUtrauh|Nh}hhd]ubh)r}r(hiUhjj1hkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hX attributerhjuh|Nh}hhd]r(h)r}r(hiXhitsrhjjhkhnhphhr}r(hw]rhahXbuildbot.util.lrurhv]ht]hu]hz]rhahjhUhԉuh|Kh}hhd]r(h)r}r(hiXbuildbot.util.lru.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.lru.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXhitsrr}r(hiUhjjubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiXcache hits so farrhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXcache hits so farrr}r(hijhjjubaubaubeubh)r}r(hiUhjj1hkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX%refhits (in module buildbot.util.lru)h:Utrauh|Nh}hhd]ubh)r}r(hiUhjj1hkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hX attributerhjuh|Nh}hhd]r(h)r}r(hiXrefhitsrhjjhkhnhphhr}r(hw]rh:ahjhv]ht]hu]hz]r h:ahjhUhԉuh|Kh}hhd]r (h)r }r (hiXbuildbot.util.lru.hjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.lru.rr}r(hiUhjj ubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXrefhitsrr}r(hiUhjjubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rh)r}r(hiX5cache misses found in the weak ref dictionary, so farrhjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r!hX5cache misses found in the weak ref dictionary, so farr"r#}r$(hijhjjubaubaubeubh)r%}r&(hiUhjj1hkhnhphhr}r'(hw]hv]ht]hu]hz]Uentries]r((hX$misses (in module buildbot.util.lru)h.Utr)auh|Nh}hhd]ubh)r*}r+(hiUhjj1hkhnhphhr}r,(hÉhXpyhw]hv]ht]hu]hz]hX attributer-hj-uh|Nh}hhd]r.(h)r/}r0(hiXmissesr1hjj*hkhnhphhr}r2(hw]r3h.ahjhv]ht]hu]hz]r4h.ahj1hUhԉuh|Kh}hhd]r5(h)r6}r7(hiXbuildbot.util.lru.hjj/hkhnhphhr}r8(ht]hu]hv]hw]hz]uh|Kh}hhd]r9hXbuildbot.util.lru.r:r;}r<(hiUhjj6ubaubh)r=}r>(hij1hjj/hkhnhphhr}r?(ht]hu]hv]hw]hz]uh|Kh}hhd]r@hXmissesrArB}rC(hiUhjj=ubaubeubh)rD}rE(hiUhjj*hkhnhphhr}rF(ht]hu]hv]hw]hz]uh|Kh}hhd]rGh)rH}rI(hiX*cache misses leading to re-fetches, so farrJhjjDhkhnhphhr}rK(ht]hu]hv]hw]hz]uh|Kh}hhd]rLhX*cache misses leading to re-fetches, so farrMrN}rO(hijJhjjHubaubaubeubh)rP}rQ(hiUhjj1hkhnhphhr}rR(hw]hv]ht]hu]hz]Uentries]rS(hX&max_size (in module buildbot.util.lru)hUtrTauh|Nh}hhd]ubh)rU}rV(hiUhjj1hkhnhphhr}rW(hÉhXpyhw]hv]ht]hu]hz]hX attributerXhjXuh|Nh}hhd]rY(h)rZ}r[(hiXmax_sizer\hjjUhkhnhphhr}r](hw]r^hahjhv]ht]hu]hz]r_hahj\hUhԉuh|Kh}hhd]r`(h)ra}rb(hiXbuildbot.util.lru.hjjZhkhnhphhr}rc(ht]hu]hv]hw]hz]uh|Kh}hhd]rdhXbuildbot.util.lru.rerf}rg(hiUhjjaubaubh)rh}ri(hij\hjjZhkhnhphhr}rj(ht]hu]hv]hw]hz]uh|Kh}hhd]rkhXmax_sizerlrm}rn(hiUhjjhubaubeubh)ro}rp(hiUhjjUhkhnhphhr}rq(ht]hu]hv]hw]hz]uh|Kh}hhd]rrh)rs}rt(hiX!maximum allowed size of the cacheruhjjohkhnhphhr}rv(ht]hu]hv]hw]hz]uh|Kh}hhd]rwhX!maximum allowed size of the cacherxry}rz(hijuhjjsubaubaubeubh)r{}r|(hiUhjj1hkhnhphhr}r}(hw]hv]ht]hu]hz]Uentries]r~(hX#get() (in module buildbot.util.lru)hBUtrauh|Nh}hhd]ubh)r}r(hiUhjj1hkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXget(key, **miss_fn_kwargs)hjjhkhnhphhr}r(hw]rhBahjhv]ht]hu]hz]rhBahXgetrhUhԉuh|Kh}hhd]r(h)r}r(hiXbuildbot.util.lru.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXbuildbot.util.lru.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]rhXgetrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(h)r}r(hiXkeyhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXkeyrr}r(hiUhjjubahphubh)r}r(hiX**miss_fn_kwargshr}r(ht]hu]hv]hw]hz]uhjjhd]rhX**miss_fn_kwargsrr}r(hiUhjjubahphubeubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Kh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXkeyhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXkeyrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhX cache keyrr}r(hiX cache keyhjjubehphubahpj#ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXmiss_fn_kwargshr}r(ht]hu]hv]hw]hz]uhjjhd]rhXmiss_fn_kwargsrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhXkeyword arguments to the rr}r(hiXkeyword arguments to the hjjubh)r}r(hiX ``miss_fn``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXmiss_fnrr}r(hiUhjjubahphubehphubahpj#ubehpjJubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsr r }r (hiUhjjubahpjubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjjhd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hXvalue via Deferredr r }r (hiXvalue via Deferredhjj ubahphubahpj)ubehpj*ubeubh)r }r (hiXpFetch a value from the cache by key, invoking ``miss_fn(key, **miss_fn_kwargs)`` if the key is not in the cache.hjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r (hX.Fetch a value from the cache by key, invoking r r }r (hiX.Fetch a value from the cache by key, invoking hjj ubh)r }r (hiX"``miss_fn(key, **miss_fn_kwargs)``hr}r (ht]hu]hv]hw]hz]uhjj hd]r hXmiss_fn(key, **miss_fn_kwargs)r r }r (hiUhjj ubahphubhX if the key is not in the cache.r r }r (hiX if the key is not in the cache.hjj ubeubh)r }r (hiXfAny additional keyword arguments are passed to the ``miss_fn`` as keyword arguments; these can supply additional information relating to the key. It is up to the caller to ensure that this information is functionally identical for each key value: if the key is already in the cache, the ``miss_fn`` will not be invoked, even if the keyword arguments differ.hjjhkhnhphhr}r! (ht]hu]hv]hw]hz]uh|Kh}hhd]r" (hX3Any additional keyword arguments are passed to the r# r$ }r% (hiX3Any additional keyword arguments are passed to the hjj ubh)r& }r' (hiX ``miss_fn``hr}r( (ht]hu]hv]hw]hz]uhjj hd]r) hXmiss_fnr* r+ }r, (hiUhjj& ubahphubhX as keyword arguments; these can supply additional information relating to the key. It is up to the caller to ensure that this information is functionally identical for each key value: if the key is already in the cache, the r- r. }r/ (hiX as keyword arguments; these can supply additional information relating to the key. It is up to the caller to ensure that this information is functionally identical for each key value: if the key is already in the cache, the hjj ubh)r0 }r1 (hiX ``miss_fn``hr}r2 (ht]hu]hv]hw]hz]uhjj hd]r3 hXmiss_fnr4 r5 }r6 (hiUhjj0 ubahphubhX; will not be invoked, even if the keyword arguments differ.r7 r8 }r9 (hiX; will not be invoked, even if the keyword arguments differ.hjj ubeubeubeubh)r: }r; (hiUhjj1hkhnhphhr}r< (hw]hv]ht]hu]hz]Uentries]r= (hX#put() (in module buildbot.util.lru)h?Utr> auh|Nh}hhd]ubh)r? }r@ (hiUhjj1hkhnhphhr}rA (hÉhXpyhw]hv]ht]hu]hz]hXmethodrB hjB uh|Nh}hhd]rC (h)rD }rE (hiXput(key, value)hjj? hkhnhphhr}rF (hw]rG h?ahjhv]ht]hu]hz]rH h?ahXputrI hUhԉuh|Kh}hhd]rJ (h)rK }rL (hiXbuildbot.util.lru.hjjD hkhnhphhr}rM (ht]hu]hv]hw]hz]uh|Kh}hhd]rN hXbuildbot.util.lru.rO rP }rQ (hiUhjjK ubaubh)rR }rS (hijI hjjD hkhnhphhr}rT (ht]hu]hv]hw]hz]uh|Kh}hhd]rU hXputrV rW }rX (hiUhjjR ubaubh)rY }rZ (hiUhjjD hkhnhphhr}r[ (ht]hu]hv]hw]hz]uh|Kh}hhd]r\ (h)r] }r^ (hiXkeyhr}r_ (ht]hu]hv]hw]hz]uhjjY hd]r` hXkeyra rb }rc (hiUhjj] ubahphubh)rd }re (hiXvaluehr}rf (ht]hu]hv]hw]hz]uhjjY hd]rg hXvaluerh ri }rj (hiUhjjd ubahphubeubeubh)rk }rl (hiUhjj? hkhnhphhr}rm (ht]hu]hv]hw]hz]uh|Kh}hhd]rn (h)ro }rp (hiUhjjk hkhnhpjhr}rq (ht]hu]hv]hw]hz]uh|Nh}hhd]rr j)rs }rt (hiUhr}ru (ht]hu]hv]hw]hz]uhjjo hd]rv (j)rw }rx (hiUhr}ry (ht]hu]hv]hw]hz]uhjjs hd]rz hX Parametersr{ r| }r} (hiUhjjw ubahpjubj)r~ }r (hiUhr}r (ht]hu]hv]hw]hz]uhjjs hd]r j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj~ hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXkeyhr}r (ht]hu]hv]hw]hz]uhjj hd]r hXkeyr r }r (hiUhjj ubahpj"ubhX -- r r }r (hiUhjj ubhXkey at which to place the valuer r }r (hiXkey at which to place the valuer hjj ubehphubahpj#ubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXvaluehr}r (ht]hu]hv]hw]hz]uhjj hd]r hXvaluer r }r (hiUhjj ubahpj"ubhX -- r r }r (hiUhjj ubhXvalue to place therer r }r (hiXvalue to place therer hjj ubehphubahpj#ubehpjJubahpj)ubehpj*ubaubh)r }r (hiXAdd the given key and value into the cache. The purpose of this method is to insert a new value into the cache *without* invoking the miss_fn (e.g., to avoid unnecessary overhead).hjjk hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r (hXpAdd the given key and value into the cache. The purpose of this method is to insert a new value into the cache r r }r (hiXpAdd the given key and value into the cache. The purpose of this method is to insert a new value into the cache hjj ubj)r }r (hiX *without*hr}r (ht]hu]hv]hw]hz]uhjj hd]r hXwithoutr r }r (hiUhjj ubahpjubhX< invoking the miss_fn (e.g., to avoid unnecessary overhead).r r }r (hiX< invoking the miss_fn (e.g., to avoid unnecessary overhead).hjj ubeubeubeubcdocutils.nodes comment r )r }r (hiXpy:method set_max_size(max_size) :param max_size: new maximum cache size Change the cache's maximum size. If the size is reduced, cached elements will be evicted. This method exists to support dynamic reconfiguration of cache sizes in a running process.hjj1hkhnhpUcommentr hr}r (jjhw]hv]ht]hu]hz]uh|Kh}hhd]r hXpy:method set_max_size(max_size) :param max_size: new maximum cache size Change the cache's maximum size. If the size is reduced, cached elements will be evicted. This method exists to support dynamic reconfiguration of cache sizes in a running process.r r }r (hiUhjj ubaubh)r }r (hiUhjj1hkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]r (hX#inv() (in module buildbot.util.lru)h#Utr auh|Nh}hhd]ubh)r }r (hiUhjj1hkhnhphhr}r (hÉhXpyhw]hv]ht]hu]hz]hXmethodr hj uh|Nh}hhd]r (h)r }r (hiXinv()hjj hkhnhphhr}r (hw]r h#ahjhv]ht]hu]hz]r h#ahXinvr hUhԉuh|Kh}hhd]r (h)r }r (hiXbuildbot.util.lru.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r hXbuildbot.util.lru.r r }r (hiUhjj ubaubh)r }r (hij hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r hXinvr r }r (hiUhjj ubaubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]ubeubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r h)r }r (hiXHCheck invariants on the cache. This is intended for debugging purposes.r hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r hXHCheck invariants on the cache. This is intended for debugging purposes.r r }r (hij hjj ubaubaubeubeubeubh)r }r (hiUhjj hkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]uh|Nh}hhd]ubh)r }r (hiUhjj hkhnhphhr}r (hÉhXpyhw]hv]ht]hu]hz]hXclassr hj uh|Nh}hhd]r (h)r }r (hiX$AsyncLRUCache(miss_fn, max_size=50):r hjj hkhnhphhr}r (hw]hv]ht]hu]hz]hԉuh|Kh}hhd]r h)r }r (hij hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r hX$AsyncLRUCache(miss_fn, max_size=50):r r }r (hiUhjj ubaubaubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Kh}hhd]r (h)r }r (hiUhjj hkhnhpjhr}r (ht]hu]hv]hw]hz]uh|Nh}hhd]r j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hX Parametersr r }r (hiUhjj ubahpjubj)r! }r" (hiUhr}r# (ht]hu]hv]hw]hz]uhjj hd]r$ j)r% }r& (hiUhr}r' (ht]hu]hv]hw]hz]uhjj! hd]r( (j)r) }r* (hiUhr}r+ (ht]hu]hv]hw]hz]uhjj% hd]r, h)r- }r. (hiUhr}r/ (ht]hu]hv]hw]hz]uhjj) hd]r0 (j)r1 }r2 (hiXmiss_fnhr}r3 (ht]hu]hv]hw]hz]uhjj- hd]r4 hXmiss_fnr5 r6 }r7 (hiUhjj1 ubahpj"ubhX -- r8 r9 }r: (hiUhjj- ubhX[This is the same as the miss_fn for class LRUCache, with the difference that this function r; r< }r= (hiX[This is the same as the miss_fn for class LRUCache, with the difference that this function hjj- ubj)r> }r? (hiX*must*hr}r@ (ht]hu]hv]hw]hz]uhjj- hd]rA hXmustrB rC }rD (hiUhjj> ubahpjubhX return a Deferred.rE rF }rG (hiX return a Deferred.hjj- ubehphubahpj#ubj)rH }rI (hiUhr}rJ (ht]hu]hv]hw]hz]uhjj% hd]rK h)rL }rM (hiUhr}rN (ht]hu]hv]hw]hz]uhjjH hd]rO (j)rP }rQ (hiXmax_sizehr}rR (ht]hu]hv]hw]hz]uhjjL hd]rS hXmax_sizerT rU }rV (hiUhjjP ubahpj"ubhX -- rW rX }rY (hiUhjjL ubhX'maximum number of objects in the cache.rZ r[ }r\ (hiX'maximum number of objects in the cache.r] hjjL ubehphubahpj#ubehpjJubahpj)ubehpj*ubaubh)r^ }r_ (hiXThis class has the same functional interface as LRUCache, but asynchronous locking is used to ensure that in the common case of multiple concurrent requests for the same key, only one fetch is performed.r` hjj hkhnhphhr}ra (ht]hu]hv]hw]hz]uh|Kh}hhd]rb hXThis class has the same functional interface as LRUCache, but asynchronous locking is used to ensure that in the common case of multiple concurrent requests for the same key, only one fetch is performed.rc rd }re (hij` hjj^ ubaubeubeubeubhf)rf }rg (hiUhjhghkhnhphqhr}rh (ht]hu]hv]hw]ri (X"module-buildbot.util.bbcollectionsrj hZehz]rk hauh|Kh}hhd]rl (h)rm }rn (hiXbuildbot.util.bbcollectionsro hjjf hkhnhphhr}rp (ht]hu]hv]hw]hz]uh|Kh}hhd]rq hXbuildbot.util.bbcollectionsrr rs }rt (hijo hjjm ubaubh)ru }rv (hiUhjjf hkhnhphhr}rw (hw]hv]ht]hu]hz]Uentries]rx (hX$buildbot.util.bbcollections (module)X"module-buildbot.util.bbcollectionsUtry auh|Kh}hhd]ubh)rz }r{ (hiX6This package provides a few useful collection objects.r| hjjf hkhnhphhr}r} (ht]hu]hv]hw]hz]uh|Kh}hhd]r~ hX6This package provides a few useful collection objects.r r }r (hij| hjjz ubaubcdocutils.nodes note r )r }r (hiXThis module used to be named ``collections``, but without absolute imports (:pep:`328`), this precluded using the standard library's ``collections`` module.hjjf hkhnhpUnoter hr}r (ht]hu]hv]hw]hz]uh|Nh}hhd]r h)r }r (hiXThis module used to be named ``collections``, but without absolute imports (:pep:`328`), this precluded using the standard library's ``collections`` module.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mhd]r (hXThis module used to be named r r }r (hiXThis module used to be named hjj ubh)r }r (hiX``collections``hr}r (ht]hu]hv]hw]hz]uhjj hd]r hX collectionsr r }r (hiUhjj ubahphubhX , but without absolute imports (r r }r (hiX , but without absolute imports (hjj ubh)r }r (hiUhr}r (hw]hv]ht]hu]hz]Uentriesr ]r (hX%Python Enhancement Proposals; PEP 328Uindex-0r Utr auhjj hd]hphubj)r }r (hiUhr}r (ht]hu]hv]hw]r j ahz]uhjj hd]hpjubj)r }r (hiUhr}r (UrefuriU'http://www.python.org/dev/peps/pep-0328hw]hv]ht]hu]r Xpepr ahz]Uinternaluhjj hd]r j)r }r (hiXPEP 328hr}r (ht]hu]hv]hw]hz]uhjj hd]r hXPEP 328r r }r (hiUhjj ubahpj"ubahpjubhX/), this precluded using the standard library's r r }r (hiX/), this precluded using the standard library's hjj ubh)r }r (hiX``collections``hr}r (ht]hu]hv]hw]hz]uhjj hd]r hX collectionsr r }r (hiUhjj ubahphubhX module.r r }r (hiX module.hjj ubeubaubh)r }r (hiUhjjf hkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]r (hX2defaultdict (class in buildbot.util.bbcollections)h4Utr auh|Nh}hhd]ubh)r }r (hiUhjjf hkhnhphhr}r (hÉhXpyhw]hv]ht]hu]hz]hXclassr hj uh|Nh}hhd]r (h)r }r (hiX defaultdictr hjj hkhnhphhr}r (hw]r h4ahXbuildbot.util.bbcollectionsr hv]ht]hu]hz]r h4ahj hUhԉuh|M h}hhd]r (j)r }r (hiXclass hjj hkhnhpjhr}r (ht]hu]hv]hw]hz]uh|M h}hhd]r hXclass r r }r (hiUhjj ubaubh)r }r (hiXbuildbot.util.bbcollections.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|M h}hhd]r hXbuildbot.util.bbcollections.r r }r (hiUhjj ubaubh)r }r (hij hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|M h}hhd]r hX defaultdictr r }r (hiUhjj ubaubeubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|M h}hhd]r h)r }r (hiXThis is a clone of the Python :class:`collections.defaultdict` for use in Python-2.4. In later versions, this is simply a reference to the built-in :class:`defaultdict`, so buildbot code can simply use :class:`buildbot.util.collections.defaultdict` everywhere.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mh}hhd]r (hXThis is a clone of the Python r r }r (hiXThis is a clone of the Python hjj ubh)r }r (hiX :class:`collections.defaultdict`r hjj hkhnhphhr}r (UreftypeXclasshhXcollections.defaultdictU refdomainXpyr hw]hv]U refexplicitht]hu]hz]hhhj hj uh|Mhd]r h)r }r (hij hr}r (ht]hu]r (hj Xpy-classr ehv]hw]hz]uhjj hd]r hXcollections.defaultdictr r }r (hiUhjj ubahphubaubhXW for use in Python-2.4. In later versions, this is simply a reference to the built-in r r }r (hiXW for use in Python-2.4. In later versions, this is simply a reference to the built-in hjj ubh)r }r (hiX:class:`defaultdict`r hjj hkhnhphhr}r (UreftypeXclasshhX defaultdictU refdomainXpyr hw]hv]U refexplicitht]hu]hz]hhhj hj uh|Mhd]r h)r }r (hij hr}r (ht]hu]r (hj Xpy-classr ehv]hw]hz]uhjj hd]r hX defaultdictr r }r (hiUhjj ubahphubaubhX", so buildbot code can simply use r r }r (hiX", so buildbot code can simply use hjj ubh)r }r (hiX.:class:`buildbot.util.collections.defaultdict`r hjj hkhnhphhr}r (UreftypeXclasshhX%buildbot.util.collections.defaultdictU refdomainXpyr hw]hv]U refexplicitht]hu]hz]hhhj hj uh|Mhd]r h)r }r (hij hr}r (ht]hu]r (hj Xpy-classr ehv]hw]hz]uhjj hd]r hX%buildbot.util.collections.defaultdictr r! }r" (hiUhjj ubahphubaubhX everywhere.r# r$ }r% (hiX everywhere.hjj ubeubaubeubh)r& }r' (hiUhjjf hkhnhphhr}r( (hw]hv]ht]hu]hz]Uentries]r) (hX0KeyedSets (class in buildbot.util.bbcollections)h*Utr* auh|Nh}hhd]ubh)r+ }r, (hiUhjjf hkhnhphhr}r- (hÉhXpyhw]hv]ht]hu]hz]hXclassr. hj. uh|Nh}hhd]r/ (h)r0 }r1 (hiX KeyedSetsr2 hjj+ hkhnhphhr}r3 (hw]r4 h*ahj hv]ht]hu]hz]r5 h*ahj2 hUhԉuh|M%h}hhd]r6 (j)r7 }r8 (hiXclass hjj0 hkhnhpjhr}r9 (ht]hu]hv]hw]hz]uh|M%h}hhd]r: hXclass r; r< }r= (hiUhjj7 ubaubh)r> }r? (hiXbuildbot.util.bbcollections.hjj0 hkhnhphhr}r@ (ht]hu]hv]hw]hz]uh|M%h}hhd]rA hXbuildbot.util.bbcollections.rB rC }rD (hiUhjj> ubaubh)rE }rF (hij2 hjj0 hkhnhphhr}rG (ht]hu]hv]hw]hz]uh|M%h}hhd]rH hX KeyedSetsrI rJ }rK (hiUhjjE ubaubeubh)rL }rM (hiUhjj+ hkhnhphhr}rN (ht]hu]hv]hw]hz]uh|M%h}hhd]rO (h)rP }rQ (hiXThis is a collection of named sets. In principal, it contains an empty set for every name, and you can add things to sets, discard things from sets, and so on. ::hjjL hkhnhphhr}rR (ht]hu]hv]hw]hz]uh|Mh}hhd]rS hXThis is a collection of named sets. In principal, it contains an empty set for every name, and you can add things to sets, discard things from sets, and so on.rT rU }rV (hiXThis is a collection of named sets. In principal, it contains an empty set for every name, and you can add things to sets, discard things from sets, and so on.hjjP ubaubj)rW }rX (hiX>>> ks = KeyedSets() >>> ks['tim'] # get a named set set([]) >>> ks.add('tim', 'friendly') # add an element to a set >>> ks.add('tim', 'dexterous') >>> ks['tim'] set(['friendly', 'dexterous']) >>> 'tim' in ks # membership testing True >>> 'ron' in ks False >>> ks.discard('tim', 'friendly')# discard set element >>> ks.pop('tim') # return set and reset to empty set(['dexterous']) >>> ks['tim'] set([])hjjL hkhnhpjhr}rY (jjhw]hv]ht]hu]hz]uh|Mh}hhd]rZ hX>>> ks = KeyedSets() >>> ks['tim'] # get a named set set([]) >>> ks.add('tim', 'friendly') # add an element to a set >>> ks.add('tim', 'dexterous') >>> ks['tim'] set(['friendly', 'dexterous']) >>> 'tim' in ks # membership testing True >>> 'ron' in ks False >>> ks.discard('tim', 'friendly')# discard set element >>> ks.pop('tim') # return set and reset to empty set(['dexterous']) >>> ks['tim'] set([])r[ r\ }r] (hiUhjjW ubaubh)r^ }r_ (hiXTThis class is careful to conserve memory space - empty sets do not occupy any space.r` hjjL hkhnhphhr}ra (ht]hu]hv]hw]hz]uh|M#h}hhd]rb hXTThis class is careful to conserve memory space - empty sets do not occupy any space.rc rd }re (hij` hjj^ ubaubeubeubeubhf)rf }rg (hiUhjhghkhnhphqhr}rh (ht]hu]hv]hw]ri (Xmodule-buildbot.util.eventualrj hVehz]rk hauh|M'h}hhd]rl (h)rm }rn (hiXbuildbot.util.eventualro hjjf hkhnhphhr}rp (ht]hu]hv]hw]hz]uh|M'h}hhd]rq hXbuildbot.util.eventualrr rs }rt (hijo hjjm ubaubh)ru }rv (hiUhjjf hkhnhphhr}rw (hw]hv]ht]hu]hz]Uentries]rx (hXbuildbot.util.eventual (module)Xmodule-buildbot.util.eventualUtry auh|M*h}hhd]ubh)rz }r{ (hiXQThis function provides a simple way to say "please do this later". For example::r| hjjf hkhnhphhr}r} (ht]hu]hv]hw]hz]uh|M+h}hhd]r~ hXPThis function provides a simple way to say "please do this later". For example:r r }r (hiXPThis function provides a simple way to say "please do this later". For example:hjjz ubaubj)r }r (hiXfrom buildbot.util.eventual import eventually def do_what_I_say(what, where): # ... return d eventually(do_what_I_say, "clean up", "your bedroom")hjjf hkhnhpjhr}r (jjhw]hv]ht]hu]hz]uh|M-h}hhd]r hXfrom buildbot.util.eventual import eventually def do_what_I_say(what, where): # ... return d eventually(do_what_I_say, "clean up", "your bedroom")r r }r (hiUhjj ubaubh)r }r (hiXThe package defines "later" as "next time the reactor has control", so this is a good way to avoid long loops that block other activity in the reactor.r hjjf hkhnhphhr}r (ht]hu]hv]hw]hz]uh|M3h}hhd]r hXThe package defines "later" as "next time the reactor has control", so this is a good way to avoid long loops that block other activity in the reactor.r r }r (hij hjj ubaubh)r }r (hiUhjjf hkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]r (hX/eventually() (in module buildbot.util.eventual)h!Utr auh|Nh}hhd]ubh)r }r (hiUhjjf hkhnhphhr}r (hÉhXpyhw]hv]ht]hu]hz]hXfunctionr hj uh|Nh}hhd]r (h)r }r (hiXeventually(cb, *args, **kwargs)hjj hkhnhphhr}r (hw]r h!ahXbuildbot.util.eventualr hv]ht]hu]hz]r h!ahX eventuallyr hUhԉuh|MHh}hhd]r (h)r }r (hiXbuildbot.util.eventual.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MHh}hhd]r hXbuildbot.util.eventual.r r }r (hiUhjj ubaubh)r }r (hij hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MHh}hhd]r hX eventuallyr r }r (hiUhjj ubaubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MHh}hhd]r (h)r }r (hiXcbhr}r (ht]hu]hv]hw]hz]uhjj hd]r hXcbr r }r (hiUhjj ubahphubh)r }r (hiX*argshr}r (ht]hu]hv]hw]hz]uhjj hd]r hX*argsr r }r (hiUhjj ubahphubh)r }r (hiX**kwargshr}r (ht]hu]hv]hw]hz]uhjj hd]r hX**kwargsr r }r (hiUhjj ubahphubeubeubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MHh}hhd]r (h)r }r (hiUhjj hkhnhpjhr}r (ht]hu]hv]hw]hz]uh|Nh}hhd]r j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hX Parametersr r }r (hiUhjj ubahpjubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXcbhr}r (ht]hu]hv]hw]hz]uhjj hd]r hXcbr r }r (hiUhjj ubahpj"ubhX -- r r }r (hiUhjj ubhXcallable to invoke laterr r }r (hiXcallable to invoke laterhjj ubehphubahpj#ubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXargshr}r (ht]hu]hv]hw]hz]uhjj hd]r hXargsr r }r (hiUhjj ubahpj"ubhX -- r r }r (hiUhjj ubhXargs to pass to r r }r (hiXargs to pass to hjj ubh)r }r (hiX``cb``hr}r (ht]hu]hv]hw]hz]uhjj hd]r hXcbr r }r (hiUhjj ubahphubehphubahpj#ubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXkwargshr}r (ht]hu]hv]hw]hz]uhjj hd]r! hXkwargsr" r# }r$ (hiUhjj ubahpj"ubhX -- r% r& }r' (hiUhjj ubhXkwargs to pass to r( r) }r* (hiXkwargs to pass to hjj ubh)r+ }r, (hiX``cb``hr}r- (ht]hu]hv]hw]hz]uhjj hd]r. hXcbr/ r0 }r1 (hiUhjj+ ubahphubehphubahpj#ubehpjJubahpj)ubehpj*ubaubh)r2 }r3 (hiX3Invoke the callable ``cb`` in a later reactor turn.hjj hkhnhphhr}r4 (ht]hu]hv]hw]hz]uh|M<h}hhd]r5 (hXInvoke the callable r6 r7 }r8 (hiXInvoke the callable hjj2 ubh)r9 }r: (hiX``cb``hr}r; (ht]hu]hv]hw]hz]uhjj2 hd]r< hXcbr= r> }r? (hiUhjj9 ubahphubhX in a later reactor turn.r@ rA }rB (hiX in a later reactor turn.hjj2 ubeubh)rC }rD (hiXCallables given to :func:`eventually` are guaranteed to be called in the same order as the calls to :func:`eventually` -- writing ``eventually(a); eventually(b)`` guarantees that ``a`` will be called before ``b``.hjj hkhnhphhr}rE (ht]hu]hv]hw]hz]uh|M>h}hhd]rF (hXCallables given to rG rH }rI (hiXCallables given to hjjC ubh)rJ }rK (hiX:func:`eventually`rL hjjC hkhnhphhr}rM (UreftypeXfunchhX eventuallyU refdomainXpyrN hw]hv]U refexplicitht]hu]hz]hhhNhj uh|M>hd]rO h)rP }rQ (hijL hr}rR (ht]hu]rS (hjN Xpy-funcrT ehv]hw]hz]uhjjJ hd]rU hX eventuallyrV rW }rX (hiUhjjP ubahphubaubhX? are guaranteed to be called in the same order as the calls to rY rZ }r[ (hiX? are guaranteed to be called in the same order as the calls to hjjC ubh)r\ }r] (hiX:func:`eventually`r^ hjjC hkhnhphhr}r_ (UreftypeXfunchhX eventuallyU refdomainXpyr` hw]hv]U refexplicitht]hu]hz]hhhNhj uh|M>hd]ra h)rb }rc (hij^ hr}rd (ht]hu]re (hj` Xpy-funcrf ehv]hw]hz]uhjj\ hd]rg hX eventuallyrh ri }rj (hiUhjjb ubahphubaubhX -- writing rk rl }rm (hiX -- writing hjjC ubh)rn }ro (hiX ``eventually(a); eventually(b)``hr}rp (ht]hu]hv]hw]hz]uhjjC hd]rq hXeventually(a); eventually(b)rr rs }rt (hiUhjjn ubahphubhX guarantees that ru rv }rw (hiX guarantees that hjjC ubh)rx }ry (hiX``a``hr}rz (ht]hu]hv]hw]hz]uhjjC hd]r{ hXar| }r} (hiUhjjx ubahphubhX will be called before r~ r }r (hiX will be called before hjjC ubh)r }r (hiX``b``hr}r (ht]hu]hv]hw]hz]uhjjC hd]r hXbr }r (hiUhjj ubahphubhX.r }r (hiX.hjjC ubeubh)r }r (hiXAny exceptions that occur in the callable will be logged with ``log.err()``. If you really want to ignore them, provide a callable that catches those exceptions.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MBh}hhd]r (hX>Any exceptions that occur in the callable will be logged with r r }r (hiX>Any exceptions that occur in the callable will be logged with hjj ubh)r }r (hiX ``log.err()``hr}r (ht]hu]hv]hw]hz]uhjj hd]r hX log.err()r r }r (hiUhjj ubahphubhXW. If you really want to ignore them, provide a callable that catches those exceptions.r r }r (hiXW. If you really want to ignore them, provide a callable that catches those exceptions.hjj ubeubh)r }r (hiXThis function returns None. If you care to know when the callable was run, be sure to provide a callable that notifies somebody.r hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MFh}hhd]r hXThis function returns None. If you care to know when the callable was run, be sure to provide a callable that notifies somebody.r r }r (hij hjj ubaubeubeubh)r }r (hiUhjjf hkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]r (hX3fireEventually() (in module buildbot.util.eventual)h0Utr auh|Nh}hhd]ubh)r }r (hiUhjjf hkhnhphhr}r (hÉhXpyhw]hv]ht]hu]hz]hXfunctionr hj uh|Nh}hhd]r (h)r }r (hiXfireEventually(value=None)hjj hkhnhphhr}r (hw]r h0ahj hv]ht]hu]hz]r h0ahXfireEventuallyr hUhԉuh|MRh}hhd]r (h)r }r (hiXbuildbot.util.eventual.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MRh}hhd]r hXbuildbot.util.eventual.r r }r (hiUhjj ubaubh)r }r (hij hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MRh}hhd]r hXfireEventuallyr r }r (hiUhjj ubaubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MRh}hhd]r h)r }r (hiX value=Nonehr}r (ht]hu]hv]hw]hz]uhjj hd]r hX value=Noner r }r (hiUhjj ubahphubaubeubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MRh}hhd]r (h)r }r (hiUhjj hkhnhpjhr}r (ht]hu]hv]hw]hz]uh|Nh}hhd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hX Parametersr r }r (hiUhjj ubahpjubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXvaluehr}r (ht]hu]hv]hw]hz]uhjj hd]r hXvaluer r }r (hiUhjj ubahpj"ubhX -- r r }r (hiUhjj ubhX)value with which the Deferred should firer r }r (hiX)value with which the Deferred should firehjj ubehphubahpj)ubehpj*ubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hXReturnsr r }r (hiUhjj ubahpjubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hXDeferredr r }r (hiXDeferredhjj ubahphubahpj)ubehpj*ubeubh)r }r (hiXThis function returns a Deferred which will fire in a later reactor turn, after the current call stack has been completed, and after all other Deferreds previously scheduled with :py:func:`eventually`. The returned Deferred will never fail.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|MNh}hhd]r (hXThis function returns a Deferred which will fire in a later reactor turn, after the current call stack has been completed, and after all other Deferreds previously scheduled with r r }r (hiXThis function returns a Deferred which will fire in a later reactor turn, after the current call stack has been completed, and after all other Deferreds previously scheduled with hjj ubh)r }r (hiX:py:func:`eventually`r hjj hkhnhphhr}r (UreftypeXfunchhX eventuallyU refdomainXpyr hw]hv]U refexplicitht]hu]hz]hhhNhj uh|MNhd]r h)r }r (hij hr}r (ht]hu]r (hj Xpy-funcr ehv]hw]hz]uhjj hd]r hX eventuallyr r }r (hiUhjj ubahphubaubhX). The returned Deferred will never fail.r r! }r" (hiX). The returned Deferred will never fail.hjj ubeubeubeubh)r# }r$ (hiUhjjf hkhnhphhr}r% (hw]hv]ht]hu]hz]Uentries]r& (hX7flushEventualQueue() (in module buildbot.util.eventual)h'Utr' auh|Nh}hhd]ubh)r( }r) (hiUhjjf hkhnhphhr}r* (hÉhXpyhw]hv]ht]hu]hz]hXfunctionr+ hj+ uh|Nh}hhd]r, (h)r- }r. (hiXflushEventualQueue()hjj( hkhnhphhr}r/ (hw]r0 h'ahj hv]ht]hu]hz]r1 h'ahXflushEventualQueuer2 hUhԉuh|MZh}hhd]r3 (h)r4 }r5 (hiXbuildbot.util.eventual.hjj- hkhnhphhr}r6 (ht]hu]hv]hw]hz]uh|MZh}hhd]r7 hXbuildbot.util.eventual.r8 r9 }r: (hiUhjj4 ubaubh)r; }r< (hij2 hjj- hkhnhphhr}r= (ht]hu]hv]hw]hz]uh|MZh}hhd]r> hXflushEventualQueuer? r@ }rA (hiUhjj; ubaubh)rB }rC (hiUhjj- hkhnhphhr}rD (ht]hu]hv]hw]hz]uh|MZh}hhd]ubeubh)rE }rF (hiUhjj( hkhnhphhr}rG (ht]hu]hv]hw]hz]uh|MZh}hhd]rH (h)rI }rJ (hiUhjjE hkhnhpjhr}rK (ht]hu]hv]hw]hz]uh|Nh}hhd]rL j)rM }rN (hiUhr}rO (ht]hu]hv]hw]hz]uhjjI hd]rP (j)rQ }rR (hiUhr}rS (ht]hu]hv]hw]hz]uhjjM hd]rT hXReturnsrU rV }rW (hiUhjjQ ubahpjubj)rX }rY (hiUhr}rZ (ht]hu]hv]hw]hz]uhjjM hd]r[ h)r\ }r] (hiUhr}r^ (ht]hu]hv]hw]hz]uhjjX hd]r_ hXDeferredr` ra }rb (hiXDeferredhjj\ ubahphubahpj)ubehpj*ubaubh)rc }rd (hiXThis returns a Deferred which fires when the eventual-send queue is finally empty. This is useful for tests and other circumstances where it is useful to know that "later" has arrived.re hjjE hkhnhphhr}rf (ht]hu]hv]hw]hz]uh|MWh}hhd]rg hXThis returns a Deferred which fires when the eventual-send queue is finally empty. This is useful for tests and other circumstances where it is useful to know that "later" has arrived.rh ri }rj (hije hjjc ubaubeubeubeubhf)rk }rl (hiUhjhghkhnhphqhr}rm (ht]hu]hv]hw]rn (Xmodule-buildbot.util.debouncero hSehz]rp h auh|M\h}hhd]rq (h)rr }rs (hiXbuildbot.util.debouncert hjjk hkhnhphhr}ru (ht]hu]hv]hw]hz]uh|M\h}hhd]rv hXbuildbot.util.debouncerw rx }ry (hijt hjjr ubaubh)rz }r{ (hiUhjjk hkhnhphhr}r| (hw]hv]ht]hu]hz]Uentries]r} (hXbuildbot.util.debounce (module)Xmodule-buildbot.util.debounceUtr~ auh|M_h}hhd]ubh)r }r (hiXOften, a method must be called exactly once at a time, but many events may trigger a call to the method. A simple example is the step method :py:meth:`~buildbot.process.buildstep.BuildStep.updateSummary`.hjjk hkhnhphhr}r (ht]hu]hv]hw]hz]uh|M`h}hhd]r (hXOften, a method must be called exactly once at a time, but many events may trigger a call to the method. A simple example is the step method r r }r (hiXOften, a method must be called exactly once at a time, but many events may trigger a call to the method. A simple example is the step method hjj ubh)r }r (hiX>:py:meth:`~buildbot.process.buildstep.BuildStep.updateSummary`r hjj hkhnhphhr}r (UreftypeXmethhhX2buildbot.process.buildstep.BuildStep.updateSummaryU refdomainXpyr hw]hv]U refexplicitht]hu]hz]hhhNhXbuildbot.util.debouncer uh|M`hd]r h)r }r (hij hr}r (ht]hu]r (hj Xpy-methr ehv]hw]hz]uhjj hd]r hX updateSummaryr r }r (hiUhjj ubahphubaubhX.r }r (hiX.hjj ubeubh)r }r (hiX@The ``debounce.method(wait)`` decorator is the tool for the job.r hjjk hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mch}hhd]r (hXThe r r }r (hiXThe hjj ubh)r }r (hiX``debounce.method(wait)``hr}r (ht]hu]hv]hw]hz]uhjj hd]r hXdebounce.method(wait)r r }r (hiUhjj ubahphubhX# decorator is the tool for the job.r r }r (hiX# decorator is the tool for the job.hjj ubeubh)r }r (hiUhjjk hkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]r (hX+method() (in module buildbot.util.debounce)hUtr auh|Nh}hhd]ubh)r }r (hiUhjjk hkhnhphhr}r (hÉhXpyhw]hv]ht]hu]hz]hXfunctionr hj uh|Nh}hhd]r (h)r }r (hiX method(wait)hjj hkhnhphhr}r (hw]r hahj hv]ht]hu]hz]r hahXmethodr hUhԉuh|Mqh}hhd]r (h)r }r (hiXbuildbot.util.debounce.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mqh}hhd]r hXbuildbot.util.debounce.r r }r (hiUhjj ubaubh)r }r (hij hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mqh}hhd]r hXmethodr r }r (hiUhjj ubaubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mqh}hhd]r h)r }r (hiXwaithr}r (ht]hu]hv]hw]hz]uhjj hd]r hXwaitr r }r (hiUhjj ubahphubaubeubh)r }r (hiUhjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mqh}hhd]r (h)r }r (hiUhjj hkhnhpjhr}r (ht]hu]hv]hw]hz]uh|Nh}hhd]r j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r hX Parametersr r }r (hiUhjj ubahpjubj)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r h)r }r (hiUhr}r (ht]hu]hv]hw]hz]uhjj hd]r (j)r }r (hiXwaithr}r (ht]hu]hv]hw]hz]uhjj hd]r hXwaitr r }r (hiUhjj ubahpj"ubhX -- r r }r (hiUhjj ubhX(time to wait before invoking, in secondsr r }r (hiX(time to wait before invoking, in secondshjj ubehphubahpj)ubehpj*ubaubh)r }r (hiXyReturns a decorator that debounces the underlying method. The underlying method must take no arguments (except ``self``).hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mih}hhd]r (hXoReturns a decorator that debounces the underlying method. The underlying method must take no arguments (except rr}r(hiXoReturns a decorator that debounces the underlying method. The underlying method must take no arguments (except hjj ubh)r}r(hiX``self``hr}r(ht]hu]hv]hw]hz]uhjj hd]rhXselfrr}r (hiUhjjubahphubhX).r r }r (hiX).hjj ubeubh)r }r(hiXFor each call to the decorated method, the underlying method will be invocation at least once within *wait* seconds (plus the time the method takes to execute). Calls are "debounced" during that time, meaning that multiple calls to the decorated method may result in a single invocation.hjj hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mlh}hhd]r(hXeFor each call to the decorated method, the underlying method will be invocation at least once within rr}r(hiXeFor each call to the decorated method, the underlying method will be invocation at least once within hjj ubj)r}r(hiX*wait*hr}r(ht]hu]hv]hw]hz]uhjj hd]rhXwaitrr}r(hiUhjjubahpjubhX seconds (plus the time the method takes to execute). Calls are "debounced" during that time, meaning that multiple calls to the decorated method may result in a single invocation.rr}r(hiX seconds (plus the time the method takes to execute). Calls are "debounced" during that time, meaning that multiple calls to the decorated method may result in a single invocation.hjj ubeubh)r}r(hiX"The decorated method is an instance of :py:class:`Debouncer`, allowing it to be started and stopped. This is useful when the method is a part of a Buidbot service: call ``method.start()`` from ``startService`` and ``method.stop()`` from ``stopService``, handling its Deferred appropriately.hjj hkhnhphhr}r (ht]hu]hv]hw]hz]uh|Moh}hhd]r!(hX'The decorated method is an instance of r"r#}r$(hiX'The decorated method is an instance of hjjubh)r%}r&(hiX:py:class:`Debouncer`r'hjjhkhnhphhr}r((UreftypeXclasshhX DebouncerU refdomainXpyr)hw]hv]U refexplicitht]hu]hz]hhhNhj uh|Mohd]r*h)r+}r,(hij'hr}r-(ht]hu]r.(hj)Xpy-classr/ehv]hw]hz]uhjj%hd]r0hX Debouncerr1r2}r3(hiUhjj+ubahphubaubhXm, allowing it to be started and stopped. This is useful when the method is a part of a Buidbot service: call r4r5}r6(hiXm, allowing it to be started and stopped. This is useful when the method is a part of a Buidbot service: call hjjubh)r7}r8(hiX``method.start()``hr}r9(ht]hu]hv]hw]hz]uhjjhd]r:hXmethod.start()r;r<}r=(hiUhjj7ubahphubhX from r>r?}r@(hiX from hjjubh)rA}rB(hiX``startService``hr}rC(ht]hu]hv]hw]hz]uhjjhd]rDhX startServicerErF}rG(hiUhjjAubahphubhX and rHrI}rJ(hiX and hjjubh)rK}rL(hiX``method.stop()``hr}rM(ht]hu]hv]hw]hz]uhjjhd]rNhX method.stop()rOrP}rQ(hiUhjjKubahphubhX from rRrS}rT(hiX from hjjubh)rU}rV(hiX``stopService``hr}rW(ht]hu]hv]hw]hz]uhjjhd]rXhX stopServicerYrZ}r[(hiUhjjUubahphubhX&, handling its Deferred appropriately.r\r]}r^(hiX&, handling its Deferred appropriately.hjjubeubeubeubh)r_}r`(hiUhjjk hkNhphhr}ra(hw]hv]ht]hu]hz]Uentries]rb(hX+Debouncer (class in buildbot.util.debounce)h1Utrcauh|Nh}hhd]ubh)rd}re(hiUhjjk hkNhphhr}rf(hÉhXpyhw]hv]ht]hu]hz]hXclassrghjguh|Nh}hhd]rh(h)ri}rj(hiX Debouncerrkhjjdhkhnhphhr}rl(hw]rmh1ahj hv]ht]hu]hz]rnh1ahjkhUhԉuh|Mh}hhd]ro(j)rp}rq(hiXclass hjjihkhnhpjhr}rr(ht]hu]hv]hw]hz]uh|Mh}hhd]rshXclass rtru}rv(hiUhjjpubaubh)rw}rx(hiXbuildbot.util.debounce.hjjihkhnhphhr}ry(ht]hu]hv]hw]hz]uh|Mh}hhd]rzhXbuildbot.util.debounce.r{r|}r}(hiUhjjwubaubh)r~}r(hijkhjjihkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhX Debouncerrr}r(hiUhjj~ubaubeubh)r}r(hiUhjjdhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(h)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX0stop() (buildbot.util.debounce.Debouncer method)hUtrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXstop()hjjhkhnhphhr}r(hw]rhahj hv]ht]hu]hz]rhahXDebouncer.stophjkhԉuh|M{h}hhd]r(h)r}r(hiXstophjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M{h}hhd]rhXstoprr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M{h}hhd]ubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M{h}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXDeferredrr}r(hiXDeferredhjjubahphubahpj)ubehpj*ubaubh)r}r(hiXStop the debouncer. While the debouncer is stopped, calls to the decorated method will be ignored. When the Deferred that ``stop`` returns fires, the underlying method is not executing.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mxh}hhd]r(hXzStop the debouncer. While the debouncer is stopped, calls to the decorated method will be ignored. When the Deferred that rr}r(hiXzStop the debouncer. While the debouncer is stopped, calls to the decorated method will be ignored. When the Deferred that hjjubh)r}r(hiX``stop``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXstoprr}r(hiUhjjubahphubhX7 returns fires, the underlying method is not executing.rr}r(hiX7 returns fires, the underlying method is not executing.hjjubeubeubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX1start() (buildbot.util.debounce.Debouncer method)h;Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXstart()hjjhkhnhphhr}r(hw]rh;ahj hv]ht]hu]hz]rh;ahXDebouncer.starthjkhԉuh|Mh}hhd]r(h)r}r(hiXstarthjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXstartrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]ubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiX|Start the debouncer. This reverses the effects of ``stop``. This method can be called on a started debouncer without issues.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M~h}hhd]r(hX2Start the debouncer. This reverses the effects of rr}r(hiX2Start the debouncer. This reverses the effects of hjjubh)r}r(hiX``stop``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXstoprr}r(hiUhjjubahphubhXB. This method can be called on a started debouncer without issues.rr}r(hiXB. This method can be called on a started debouncer without issues.hjjubeubaubeubeubeubeubhf)r}r(hiUhjhghkhnhphqhr}r(ht]hu]hv]hw]r(Xmodule-buildbot.util.jsonrh`ehz]rh=auh|Mh}hhd]r(h)r}r (hiXbuildbot.util.jsonr hjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mh}hhd]r hXbuildbot.util.jsonr r}r(hij hjjubaubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hXbuildbot.util.json (module)Xmodule-buildbot.util.jsonUtrauh|Mh}hhd]ubh)r}r(hiXThis package is just an import of the best available JSON module. Use it instead of a more complex conditional import of :mod:`simplejson` or :mod:`json`::hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXzThis package is just an import of the best available JSON module. Use it instead of a more complex conditional import of rr}r(hiXzThis package is just an import of the best available JSON module. Use it instead of a more complex conditional import of hjjubh)r}r(hiX:mod:`simplejson`rhjjhkhnhphhr}r(UreftypeXmodhhX simplejsonU refdomainXpyr hw]hv]U refexplicitht]hu]hz]hhhNhXbuildbot.util.jsonr!uh|Mhd]r"h)r#}r$(hijhr}r%(ht]hu]r&(hj Xpy-modr'ehv]hw]hz]uhjjhd]r(hX simplejsonr)r*}r+(hiUhjj#ubahphubaubhX or r,r-}r.(hiX or hjjubh)r/}r0(hiX :mod:`json`r1hjjhkhnhphhr}r2(UreftypeXmodhhXjsonU refdomainXpyr3hw]hv]U refexplicitht]hu]hz]hhhNhj!uh|Mhd]r4h)r5}r6(hij1hr}r7(ht]hu]r8(hj3Xpy-modr9ehv]hw]hz]uhjj/hd]r:hXjsonr;r<}r=(hiUhjj5ubahphubaubhX:r>}r?(hiX:hjjubeubj)r@}rA(hiXfrom buildbot.util import jsonhjjhkhnhpjhr}rB(jjhw]hv]ht]hu]hz]uh|Mh}hhd]rChXfrom buildbot.util import jsonrDrE}rF(hiUhjj@ubaubeubhf)rG}rH(hiUhjhghkhnhphqhr}rI(ht]hu]hv]hw]rJ(Xmodule-buildbot.util.maildirrKhYehz]rLhauh|Mh}hhd]rM(h)rN}rO(hiXbuildbot.util.maildirrPhjjGhkhnhphhr}rQ(ht]hu]hv]hw]hz]uh|Mh}hhd]rRhXbuildbot.util.maildirrSrT}rU(hijPhjjNubaubh)rV}rW(hiUhjjGhkhnhphhr}rX(hw]hv]ht]hu]hz]Uentries]rY(hXbuildbot.util.maildir (module)Xmodule-buildbot.util.maildirUtrZauh|Mh}hhd]ubh)r[}r\(hiXSeveral Buildbot components make use of `maildirs `_ to hand off messages between components. On the receiving end, there's a need to watch a maildir for incoming messages and trigger some action when one arrives.hjjGhkhnhphhr}r](ht]hu]hv]hw]hz]uh|Mh}hhd]r^(hX(Several Buildbot components make use of r_r`}ra(hiX(Several Buildbot components make use of hjj[ubj)rb}rc(hiX5`maildirs `_hr}rd(Unameh$jX'http://www.courier-mta.org/maildir.htmlrehw]hv]ht]hu]hz]uhjj[hd]rfhXmaildirsrgrh}ri(hiUhjjbubahpjubj)rj}rk(hiX* jKhjj[hpjhr}rl(Urefurijehw]rmh[ahv]ht]hu]hz]rnh$auhd]ubhX to hand off messages between components. On the receiving end, there's a need to watch a maildir for incoming messages and trigger some action when one arrives.rorp}rq(hiX to hand off messages between components. On the receiving end, there's a need to watch a maildir for incoming messages and trigger some action when one arrives.hjj[ubeubh)rr}rs(hiUhjjGhkNhphhr}rt(hw]hv]ht]hu]hz]Uentries]ru(hX/MaildirService (class in buildbot.util.maildir)hUtrvauh|Nh}hhd]ubh)rw}rx(hiUhjjGhkNhphhr}ry(hÉhXpyhw]hv]ht]hu]hz]hXclassrzhjzuh|Nh}hhd]r{(h)r|}r}(hiXMaildirService(basedir)hjjwhkhnhphhr}r~(hw]rhahXbuildbot.util.maildirrhv]ht]hu]hz]rhahXMaildirServicerhUhԉuh|Mh}hhd]r(j)r}r(hiXclass hjj|hkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXclass rr}r(hiUhjjubaubh)r}r(hiXbuildbot.util.maildir.hjj|hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXbuildbot.util.maildir.rr}r(hiUhjjubaubh)r}r(hijhjj|hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXMaildirServicerr}r(hiUhjjubaubh)r}r(hiUhjj|hkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiXbasedirhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXbasedirrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjwhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(cdocutils.nodes block_quote r)r}r(hiUhjjhkNhpU block_quoterhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rj)r}r(hiUhjjhkhnhpj*hr}r(ht]hu]hv]hw]hz]uh|Mhd]r(j)r}r(hiX param basedirrhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX param basedirrr}r(hijhjjubahpjubj)r}r(hiX)(optional) base directory of the maildir hr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiX((optional) base directory of the maildirrhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mhd]rhX((optional) base directory of the maildirrr}r(hijhjjubaubahpj)ubeubahpjubaubh)r}r(hiXA :py:class:`MaildirService` instance watches a maildir for new messages. It should be a child service of some :py:class:`~twisted.application.service.MultiService` instance. When running, this class uses the linux dirwatcher API (if available) or polls for new files in the 'new' maildir subdirectory. When it discovers a new message, it invokes its :py:meth:`messageReceived` method.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXA rr}r(hiXA hjjubh)r}r(hiX:py:class:`MaildirService`rhjjhkhnhphhr}r(UreftypeXclasshhXMaildirServiceU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-classrehv]hw]hz]uhjjhd]rhXMaildirServicerr}r(hiUhjjubahphubaubhXS instance watches a maildir for new messages. It should be a child service of some rr}r(hiXS instance watches a maildir for new messages. It should be a child service of some hjjubh)r}r(hiX5:py:class:`~twisted.application.service.MultiService`rhjjhkhnhphhr}r(UreftypeXclasshhX(twisted.application.service.MultiServiceU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-classrehv]hw]hz]uhjjhd]rhX MultiServicerr}r(hiUhjjubahphubaubhX instance. When running, this class uses the linux dirwatcher API (if available) or polls for new files in the 'new' maildir subdirectory. When it discovers a new message, it invokes its rr}r(hiX instance. When running, this class uses the linux dirwatcher API (if available) or polls for new files in the 'new' maildir subdirectory. When it discovers a new message, it invokes its hjjubh)r}r(hiX:py:meth:`messageReceived`rhjjhkhnhphhr}r(UreftypeXmethhhXmessageReceivedU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-methrehv]hw]hz]uhjjhd]rhXmessageReceivedrr}r(hiUhjjubahphubaubhX method.rr}r(hiX method.hjjubeubh)r}r(hiXdTo use this class, subclass it and implement a more interesting :py:meth:`messageReceived` function.hjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mh}hhd]r (hX@To use this class, subclass it and implement a more interesting r r }r (hiX@To use this class, subclass it and implement a more interesting hjjubh)r}r(hiX:py:meth:`messageReceived`rhjjhkhnhphhr}r(UreftypeXmethhhXmessageReceivedU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-methrehv]hw]hz]uhjjhd]rhXmessageReceivedrr}r(hiUhjjubahphubaubhX function.rr}r(hiX function.hjjubeubh)r }r!(hiUhjjhkhnhphhr}r"(hw]hv]ht]hu]hz]Uentries]r#(hX:setBasedir() (buildbot.util.maildir.MaildirService method)hFUtr$auh|Nh}hhd]ubh)r%}r&(hiUhjjhkhnhphhr}r'(hÉhXpyhw]hv]ht]hu]hz]hXmethodr(hj(uh|Nh}hhd]r)(h)r*}r+(hiXsetBasedir(basedir)hjj%hkhnhphhr}r,(hw]r-hFahjhv]ht]hu]hz]r.hFahXMaildirService.setBasedirhjhԉuh|Mh}hhd]r/(h)r0}r1(hiX setBasedirhjj*hkhnhphhr}r2(ht]hu]hv]hw]hz]uh|Mh}hhd]r3hX setBasedirr4r5}r6(hiUhjj0ubaubh)r7}r8(hiUhjj*hkhnhphhr}r9(ht]hu]hv]hw]hz]uh|Mh}hhd]r:h)r;}r<(hiXbasedirhr}r=(ht]hu]hv]hw]hz]uhjj7hd]r>hXbasedirr?r@}rA(hiUhjj;ubahphubaubeubh)rB}rC(hiUhjj%hkhnhphhr}rD(ht]hu]hv]hw]hz]uh|Mh}hhd]rE(h)rF}rG(hiUhjjBhkhnhpjhr}rH(ht]hu]hv]hw]hz]uh|Nh}hhd]rIj)rJ}rK(hiUhr}rL(ht]hu]hv]hw]hz]uhjjFhd]rM(j)rN}rO(hiUhr}rP(ht]hu]hv]hw]hz]uhjjJhd]rQhX ParametersrRrS}rT(hiUhjjNubahpjubj)rU}rV(hiUhr}rW(ht]hu]hv]hw]hz]uhjjJhd]rXh)rY}rZ(hiUhr}r[(ht]hu]hv]hw]hz]uhjjUhd]r\(j)r]}r^(hiXbasedirhr}r_(ht]hu]hv]hw]hz]uhjjYhd]r`hXbasedirrarb}rc(hiUhjj]ubahpj"ubhX -- rdre}rf(hiUhjjYubhXbase directory of the maildirrgrh}ri(hiXbase directory of the maildirhjjYubehphubahpj)ubehpj*ubaubh)rj}rk(hiXxIf no ``basedir`` is provided to the constructor, this method must be used to set the basedir before the service starts.hjjBhkhnhphhr}rl(ht]hu]hv]hw]hz]uh|Mh}hhd]rm(hXIf no rnro}rp(hiXIf no hjjjubh)rq}rr(hiX ``basedir``hr}rs(ht]hu]hv]hw]hz]uhjjjhd]rthXbasedirrurv}rw(hiUhjjqubahphubhXg is provided to the constructor, this method must be used to set the basedir before the service starts.rxry}rz(hiXg is provided to the constructor, this method must be used to set the basedir before the service starts.hjjjubeubeubeubh)r{}r|(hiUhjjhkhnhphhr}r}(hw]hv]ht]hu]hz]Uentries]r~(hX?messageReceived() (buildbot.util.maildir.MaildirService method)h(Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXmessageReceived(filename)hjjhkhnhphhr}r(hw]rh(ahjhv]ht]hu]hz]rh(ahXMaildirService.messageReceivedhjhԉuh|Mh}hhd]r(h)r}r(hiXmessageReceivedhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXmessageReceivedrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiXfilenamehr}r(ht]hu]hv]hw]hz]uhjjhd]rhXfilenamerr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXfilenamehr}r(ht]hu]hv]hw]hz]uhjjhd]rhXfilenamerr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhX'unqualified filename of the new messagerr}r(hiX'unqualified filename of the new messagehjjubehphubahpj)ubehpj*ubaubh)r}r(hiXThis method is called with the short filename of the new message. The full name of the new file can be obtained with ``os.path.join(maildir, 'new', filename)``. The method is un-implemented in the :py:class:`MaildirService` class, and must be implemented in subclasses.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXuThis method is called with the short filename of the new message. The full name of the new file can be obtained with rr}r(hiXuThis method is called with the short filename of the new message. The full name of the new file can be obtained with hjjubh)r}r(hiX*``os.path.join(maildir, 'new', filename)``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhX&os.path.join(maildir, 'new', filename)rr}r(hiUhjjubahphubhX'. The method is un-implemented in the rr}r(hiX'. The method is un-implemented in the hjjubh)r}r(hiX:py:class:`MaildirService`rhjjhkhnhphhr}r(UreftypeXclasshhXMaildirServiceU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-classrehv]hw]hz]uhjjhd]rhXMaildirServicerr}r(hiUhjjubahphubaubhX. class, and must be implemented in subclasses.rr}r(hiX. class, and must be implemented in subclasses.hjjubeubeubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX<moveToCurDir() (buildbot.util.maildir.MaildirService method)hUtrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXmoveToCurDir(filename)hjjhkhnhphhr}r(hw]rhahjhv]ht]hu]hz]rhahXMaildirService.moveToCurDirhjhԉuh|Mh}hhd]r(h)r}r(hiX moveToCurDirhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhX moveToCurDirrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiXfilenamehr}r(ht]hu]hv]hw]hz]uhjjhd]rhXfilenamerr}r (hiUhjjubahphubaubeubh)r }r (hiUhjjhkhnhphhr}r (ht]hu]hv]hw]hz]uh|Mh}hhd]r (h)r}r(hiUhjj hkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r h)r!}r"(hiUhr}r#(ht]hu]hv]hw]hz]uhjjhd]r$(j)r%}r&(hiXfilenamehr}r'(ht]hu]hv]hw]hz]uhjj!hd]r(hXfilenamer)r*}r+(hiUhjj%ubahpj"ubhX -- r,r-}r.(hiUhjj!ubhX'unqualified filename of the new messager/r0}r1(hiX'unqualified filename of the new messagehjj!ubehphubahpj)ubehpj*ubj)r2}r3(hiUhr}r4(ht]hu]hv]hw]hz]uhjjhd]r5(j)r6}r7(hiUhr}r8(ht]hu]hv]hw]hz]uhjj2hd]r9hXReturnsr:r;}r<(hiUhjj6ubahpjubj)r=}r>(hiUhr}r?(ht]hu]hv]hw]hz]uhjj2hd]r@h)rA}rB(hiUhr}rC(ht]hu]hv]hw]hz]uhjj=hd]rDhXopen file objectrErF}rG(hiXopen file objecthjjAubahphubahpj)ubehpj*ubeubh)rH}rI(hiXCall this from :py:meth:`messageReceived` to start processing the message; this moves the message file to the 'cur' directory and returns an open file handle for it.hjj hkhnhphhr}rJ(ht]hu]hv]hw]hz]uh|Mh}hhd]rK(hXCall this from rLrM}rN(hiXCall this from hjjHubh)rO}rP(hiX:py:meth:`messageReceived`rQhjjHhkhnhphhr}rR(UreftypeXmethhhXmessageReceivedU refdomainXpyrShw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rTh)rU}rV(hijQhr}rW(ht]hu]rX(hjSXpy-methrYehv]hw]hz]uhjjOhd]rZhXmessageReceivedr[r\}r](hiUhjjUubahphubaubhX| to start processing the message; this moves the message file to the 'cur' directory and returns an open file handle for it.r^r_}r`(hiX| to start processing the message; this moves the message file to the 'cur' directory and returns an open file handle for it.hjjHubeubeubeubeubeubeubhf)ra}rb(hiUhjhghkhnhphqhr}rc(ht]hu]hv]hw]rd(Xmodule-buildbot.util.miscrehaehz]rfh@auh|Mh}hhd]rg(h)rh}ri(hiXbuildbot.util.miscrjhjjahkhnhphhr}rk(ht]hu]hv]hw]hz]uh|Mh}hhd]rlhXbuildbot.util.miscrmrn}ro(hijjhjjhubaubh)rp}rq(hiUhjjahkhnhphhr}rr(hw]hv]ht]hu]hz]Uentries]rs(hXbuildbot.util.misc (module)Xmodule-buildbot.util.miscUtrtauh|Mh}hhd]ubh)ru}rv(hiUhjjahkhnhphhr}rw(hw]hv]ht]hu]hz]Uentries]rx(hX/deferredLocked() (in module buildbot.util.misc)h9Utryauh|Nh}hhd]ubh)rz}r{(hiUhjjahkhnhphhr}r|(hÉhXpyhw]hv]ht]hu]hz]hXfunctionr}hj}uh|Nh}hhd]r~(h)r}r(hiXdeferredLocked(lock)hjjzhkhnhphhr}r(hw]rh9ahXbuildbot.util.miscrhv]ht]hu]hz]rh9ahXdeferredLockedrhUhԉuh|Mh}hhd]r(h)r}r(hiXbuildbot.util.misc.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXbuildbot.util.misc.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXdeferredLockedrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiXlockhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXlockrr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjzhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXlockhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXlockrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhXa rr}r(hiXa hjjubh)r}r(hiX/:py:class:`twisted.internet.defer.DeferredLock`rhjjhkhnhphhr}r(UreftypeXclasshhX#twisted.internet.defer.DeferredLockU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhNhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-classrehv]hw]hz]uhjjhd]rhX#twisted.internet.defer.DeferredLockrr}r(hiUhjjubahphubaubhXA instance or a string naming an instance attribute containing onerr}r(hiXA instance or a string naming an instance attribute containing onehjjubehphubahpj)ubehpj*ubaubh)r}r(hiXThis is a decorator to wrap an event-driven method (one returning a ``Deferred``) in an acquire/release pair of a designated :py:class:`~twisted.internet.defer.DeferredLock`. For simple functions with a static lock, this is as easy as::hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXDThis is a decorator to wrap an event-driven method (one returning a rr}r(hiXDThis is a decorator to wrap an event-driven method (one returning a hjjubh)r}r(hiX ``Deferred``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXDeferredrr}r(hiUhjjubahphubhX-) in an acquire/release pair of a designated rr}r(hiX-) in an acquire/release pair of a designated hjjubh)r}r(hiX0:py:class:`~twisted.internet.defer.DeferredLock`rhjjhkhnhphhr}r(UreftypeXclasshhX#twisted.internet.defer.DeferredLockU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhNhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-classrehv]hw]hz]uhjjhd]rhX DeferredLockrr}r(hiUhjjubahphubaubhX?. For simple functions with a static lock, this is as easy as:rr}r(hiX?. For simple functions with a static lock, this is as easy as:hjjubeubj)r}r(hiXnsomeLock = defer.DeferredLock() @util.deferredLocked(someLock) def someLockedFunction(): # .. return dhjjhkhnhpjhr}r(jjhw]hv]ht]hu]hz]uh|Mh}hhd]rhXnsomeLock = defer.DeferredLock() @util.deferredLocked(someLock) def someLockedFunction(): # .. return drr}r(hiUhjjubaubh)r}r(hiXFor class methods which must access a lock that is an instance attribute, the lock can be specified by a string, which will be dynamically resolved to the specific instance at runtime::hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXFor class methods which must access a lock that is an instance attribute, the lock can be specified by a string, which will be dynamically resolved to the specific instance at runtime:rr }r (hiXFor class methods which must access a lock that is an instance attribute, the lock can be specified by a string, which will be dynamically resolved to the specific instance at runtime:hjjubaubj)r }r (hiXdef __init__(self): self.someLock = defer.DeferredLock() @util.deferredLocked('someLock') def someLockedFunction(): # .. return dhjjhkhnhpjhr}r (jjhw]hv]ht]hu]hz]uh|Mh}hhd]rhXdef __init__(self): self.someLock = defer.DeferredLock() @util.deferredLocked('someLock') def someLockedFunction(): # .. return drr}r(hiUhjj ubaubeubeubh)r}r(hiUhjjahkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX2SerializedInvocation (class in buildbot.util.misc)hUtrauh|Nh}hhd]ubh)r}r(hiUhjjahkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXclassrhjuh|Nh}hhd]r(h)r}r(hiXSerializedInvocation(method)hjjhkhnhphhr}r(hw]rhahjhv]ht]hu]hz]r hahXSerializedInvocationr!hUhԉuh|Mh}hhd]r"(j)r#}r$(hiXclass hjjhkhnhpjhr}r%(ht]hu]hv]hw]hz]uh|Mh}hhd]r&hXclass r'r(}r)(hiUhjj#ubaubh)r*}r+(hiXbuildbot.util.misc.hjjhkhnhphhr}r,(ht]hu]hv]hw]hz]uh|Mh}hhd]r-hXbuildbot.util.misc.r.r/}r0(hiUhjj*ubaubh)r1}r2(hij!hjjhkhnhphhr}r3(ht]hu]hv]hw]hz]uh|Mh}hhd]r4hXSerializedInvocationr5r6}r7(hiUhjj1ubaubh)r8}r9(hiUhjjhkhnhphhr}r:(ht]hu]hv]hw]hz]uh|Mh}hhd]r;h)r<}r=(hiXmethodhr}r>(ht]hu]hv]hw]hz]uhjj8hd]r?hXmethodr@rA}rB(hiUhjj<ubahphubaubeubh)rC}rD(hiUhjjhkhnhphhr}rE(ht]hu]hv]hw]hz]uh|Mh}hhd]rF(h)rG}rH(hiXThis is a method wrapper that will serialize calls to an asynchronous method. If a second call occurs while the first call is still executing, it will not begin until the first call has finished. If multiple calls queue up, they will be collapsed into a single call. The effect is that the underlying method is guaranteed to be called at least once after every call to the wrapper.rIhjjChkhnhphhr}rJ(ht]hu]hv]hw]hz]uh|Mh}hhd]rKhXThis is a method wrapper that will serialize calls to an asynchronous method. If a second call occurs while the first call is still executing, it will not begin until the first call has finished. If multiple calls queue up, they will be collapsed into a single call. The effect is that the underlying method is guaranteed to be called at least once after every call to the wrapper.rLrM}rN(hijIhjjGubaubh)rO}rP(hiXNote that if this class is used as a decorator on a method, it will serialize invocations across all class instances. For synchronization specific to each instance, wrap the method in the constructor::hjjChkhnhphhr}rQ(ht]hu]hv]hw]hz]uh|Mh}hhd]rRhXNote that if this class is used as a decorator on a method, it will serialize invocations across all class instances. For synchronization specific to each instance, wrap the method in the constructor:rSrT}rU(hiXNote that if this class is used as a decorator on a method, it will serialize invocations across all class instances. For synchronization specific to each instance, wrap the method in the constructor:hjjOubaubj)rV}rW(hiXOdef __init__(self): self.someMethod = SerializedInovcation(self.someMethod)hjjChkhnhpjhr}rX(jjhw]hv]ht]hu]hz]uh|Mh}hhd]rYhXOdef __init__(self): self.someMethod = SerializedInovcation(self.someMethod)rZr[}r\(hiUhjjVubaubh)r]}r^(hiXsTests can monkey-patch the ``_quiet`` method of the class to be notified when all planned invocations are complete.hjjChkhnhphhr}r_(ht]hu]hv]hw]hz]uh|Mh}hhd]r`(hXTests can monkey-patch the rarb}rc(hiXTests can monkey-patch the hjj]ubh)rd}re(hiX ``_quiet``hr}rf(ht]hu]hv]hw]hz]uhjj]hd]rghX_quietrhri}rj(hiUhjjdubahphubhXN method of the class to be notified when all planned invocations are complete.rkrl}rm(hiXN method of the class to be notified when all planned invocations are complete.hjj]ubeubeubeubeubhf)rn}ro(hiUhjhghkhnhphqhr}rp(ht]hu]hv]hw]rq(Xmodule-buildbot.util.netstringsrrh_ehz]rsh7auh|Mh}hhd]rt(h)ru}rv(hiXbuildbot.util.netstringsrwhjjnhkhnhphhr}rx(ht]hu]hv]hw]hz]uh|Mh}hhd]ryhXbuildbot.util.netstringsrzr{}r|(hijwhjjuubaubh)r}}r~(hiUhjjnhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX!buildbot.util.netstrings (module)Xmodule-buildbot.util.netstringsUtrauh|Mh}hhd]ubh)r}r(hiXSimilar to maildirs, `netstrings `_ are used occasionally in Buildbot to encode data for interchange. While Twisted supports a basic netstring receiver protocol, it does not have a simple way to apply that to a non-network situation.hjjnhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXSimilar to maildirs, rr}r(hiXSimilar to maildirs, hjjubj)r}r(hiX4`netstrings `_hr}r(Unameh jX$http://cr.yp.to/proto/netstrings.txtrhw]hv]ht]hu]hz]uhjjhd]rhX netstringsrr}r(hiUhjjubahpjubj)r}r(hiX' jKhjjhpjhr}r(Urefurijhw]rhUahv]ht]hu]hz]rh auhd]ubhX are used occasionally in Buildbot to encode data for interchange. While Twisted supports a basic netstring receiver protocol, it does not have a simple way to apply that to a non-network situation.rr}r(hiX are used occasionally in Buildbot to encode data for interchange. While Twisted supports a basic netstring receiver protocol, it does not have a simple way to apply that to a non-network situation.hjjubeubh)r}r(hiUhjjnhkNhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX3NetstringParser (class in buildbot.util.netstrings)h3Utrauh|Nh}hhd]ubh)r}r(hiUhjjnhkNhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXclassrhjuh|Nh}hhd]r(h)r}r(hiXNetstringParserrhjjhkhnhphhr}r(hw]rh3ahXbuildbot.util.netstringsrhv]ht]hu]hz]rh3ahjhUhԉuh|Mh}hhd]r(j)r}r(hiXclass hjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXclass rr}r(hiUhjjubaubh)r}r(hiXbuildbot.util.netstrings.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXbuildbot.util.netstrings.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXNetstringParserrr}r(hiUhjjubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(h)r}r(hiXxThis class parses strings piece by piece, either collecting the accumulated strings or invoking a callback for each one.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXxThis class parses strings piece by piece, either collecting the accumulated strings or invoking a callback for each one.rr}r(hijhjjubaubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX8feed() (buildbot.util.netstrings.NetstringParser method)hUtrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiX feed(data)hjjhkhnhphhr}r(hw]rhahjhv]ht]hu]hz]rhahXNetstringParser.feedhjhԉuh|Mh}hhd]r(h)r}r(hiXfeedhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXfeedrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiXdatahr}r(ht]hu]hv]hw]hz]uhjjhd]rhXdatarr}r(hiUhjjubahphubaubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r }r (hiXdatahr}r (ht]hu]hv]hw]hz]uhjjhd]r hXdatar r}r(hiUhjj ubahpj"ubhX -- rr}r(hiUhjjubhX%a portion of netstring-formatted datarr}r(hiX%a portion of netstring-formatted datahjjubehphubahpj)ubehpj*ubj)r}r(hiUhjjhkhnhpj*hr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(j)r}r(hiXraiseshr}r(ht]hu]hv]hw]hz]uhjjhd]rhXRaisesrr}r (hiUhjjubahpjubj)r!}r"(hiX6:py:exc:`twisted.protocols.basic.NetstringParseError` hr}r#(ht]hu]hv]hw]hz]uhjjhd]r$h)r%}r&(hiX5:py:exc:`twisted.protocols.basic.NetstringParseError`r'hjj!hkhnhphhr}r((ht]hu]hv]hw]hz]uh|Mhd]r)h)r*}r+(hij'hjj%hkhnhphhr}r,(UreftypeXexchhX+twisted.protocols.basic.NetstringParseErrorU refdomainXpyr-hw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]r.h)r/}r0(hij'hr}r1(ht]hu]r2(hj-Xpy-excr3ehv]hw]hz]uhjj*hd]r4hX+twisted.protocols.basic.NetstringParseErrorr5r6}r7(hiUhjj/ubahphubaubaubahpj)ubeubeubh)r8}r9(hiXAdd arbitrarily-sized ``data`` to the incoming-data buffer. Any complete netstrings will trigger a call to the :py:meth:`stringReceived` method.hjjhkhnhphhr}r:(ht]hu]hv]hw]hz]uh|Mh}hhd]r;(hXAdd arbitrarily-sized r<r=}r>(hiXAdd arbitrarily-sized hjj8ubh)r?}r@(hiX``data``hr}rA(ht]hu]hv]hw]hz]uhjj8hd]rBhXdatarCrD}rE(hiUhjj?ubahphubhXR to the incoming-data buffer. Any complete netstrings will trigger a call to the rFrG}rH(hiXR to the incoming-data buffer. Any complete netstrings will trigger a call to the hjj8ubh)rI}rJ(hiX:py:meth:`stringReceived`rKhjj8hkhnhphhr}rL(UreftypeXmethhhXstringReceivedU refdomainXpyrMhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rNh)rO}rP(hijKhr}rQ(ht]hu]rR(hjMXpy-methrSehv]hw]hz]uhjjIhd]rThXstringReceivedrUrV}rW(hiUhjjOubahphubaubhX method.rXrY}rZ(hiX method.hjj8ubeubh)r[}r\(hiXNote that this method (like the Twisted class it is based on) cannot detect a trailing partial netstring at EOF - the data will be silently ignored.r]hjjhkhnhphhr}r^(ht]hu]hv]hw]hz]uh|M h}hhd]r_hXNote that this method (like the Twisted class it is based on) cannot detect a trailing partial netstring at EOF - the data will be silently ignored.r`ra}rb(hij]hjj[ubaubeubeubh)rc}rd(hiUhjjhkhnhphhr}re(hw]hv]ht]hu]hz]Uentries]uh|Nh}hhd]ubh)rf}rg(hiUhjjhkhnhphhr}rh(hÉhXpyhw]hv]ht]hu]hz]hXmethodrihjiuh|Nh}hhd]rj(h)rk}rl(hiXstringReceived(string):rmhjjfhkhnhphhr}rn(hw]hv]ht]hu]hz]hԉuh|Mh}hhd]roh)rp}rq(hijmhjjkhkhnhphhr}rr(ht]hu]hv]hw]hz]uh|Mh}hhd]rshXstringReceived(string):rtru}rv(hiUhjjpubaubaubh)rw}rx(hiUhjjfhkhnhphhr}ry(ht]hu]hv]hw]hz]uh|Mh}hhd]rz(h)r{}r|(hiUhjjwhkhnhpjhr}r}(ht]hu]hv]hw]hz]uh|Nh}hhd]r~j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjj{hd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiXstringhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXstringrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhXthe decoded stringrr}r(hiXthe decoded stringhjjubehphubahpj)ubehpj*ubaubh)r}r(hiXThis method is called for each decoded string as soon as it is read completely. The default implementation appends the string to the :py:attr:`strings` attribute, but subclasses can do anything.hjjwhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXThis method is called for each decoded string as soon as it is read completely. The default implementation appends the string to the rr}r(hiXThis method is called for each decoded string as soon as it is read completely. The default implementation appends the string to the hjjubh)r}r(hiX:py:attr:`strings`rhjjhkhnhphhr}r(UreftypeXattrhhXstringsU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-attrrehv]hw]hz]uhjjhd]rhXstringsrr}r(hiUhjjubahphubaubhX+ attribute, but subclasses can do anything.rr}r(hiX+ attribute, but subclasses can do anything.hjjubeubeubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX<strings (buildbot.util.netstrings.NetstringParser attribute)h8Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hX attributerhjuh|Nh}hhd]r(h)r}r(hiXstringsrhjjhkhnhphhr}r(hw]rh8ahjhv]ht]hu]hz]rh8ahXNetstringParser.stringshjhԉuh|Mh}hhd]rh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXstringsrr}r(hiUhjjubaubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rh)r}r(hiXKThe strings decoded so far, if :py:meth:`stringReceived` is not overridden.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hXThe strings decoded so far, if rr}r(hiXThe strings decoded so far, if hjjubh)r}r(hiX:py:meth:`stringReceived`rhjjhkhnhphhr}r(UreftypeXmethhhXstringReceivedU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-methrehv]hw]hz]uhjjhd]rhXstringReceivedrr}r(hiUhjjubahphubaubhX is not overridden.rr}r(hiX is not overridden.hjjubeubaubeubeubeubeubhf)r}r(hiUhjhghkhnhphqhr}r(ht]hu]hv]hw]r(Xmodule-buildbot.util.sautilsrhcehz]rhGauh|Mh}hhd]r(h)r}r(hiXbuildbot.util.sautilsrhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]rhXbuildbot.util.sautilsrr}r(hijhjjubaubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hXbuildbot.util.sautils (module)Xmodule-buildbot.util.sautilsUtrauh|M h}hhd]ubh)r}r(hiXKThis module contains a few utilities that are not included with SQLAlchemy.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M!h}hhd]rhXKThis module contains a few utilities that are not included with SQLAlchemy.rr}r(hijhjjubaubh)r }r (hiUhjjhkhnhphhr}r (hw]hv]ht]hu]hz]Uentries]r (hX1InsertFromSelect (class in buildbot.util.sautils)hUtr auh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXclassrhjuh|Nh}hhd]r(h)r}r(hiXInsertFromSelect(table, select)hjjhkhnhphhr}r(hw]rhahXbuildbot.util.sautilsrhv]ht]hu]hz]rhahXInsertFromSelectrhUhԉuh|M,h}hhd]r(j)r}r(hiXclass hjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|M,h}hhd]rhXclass rr }r!(hiUhjjubaubh)r"}r#(hiXbuildbot.util.sautils.hjjhkhnhphhr}r$(ht]hu]hv]hw]hz]uh|M,h}hhd]r%hXbuildbot.util.sautils.r&r'}r((hiUhjj"ubaubh)r)}r*(hijhjjhkhnhphhr}r+(ht]hu]hv]hw]hz]uh|M,h}hhd]r,hXInsertFromSelectr-r.}r/(hiUhjj)ubaubh)r0}r1(hiUhjjhkhnhphhr}r2(ht]hu]hv]hw]hz]uh|M,h}hhd]r3(h)r4}r5(hiXtablehr}r6(ht]hu]hv]hw]hz]uhjj0hd]r7hXtabler8r9}r:(hiUhjj4ubahphubh)r;}r<(hiXselecthr}r=(ht]hu]hv]hw]hz]uhjj0hd]r>hXselectr?r@}rA(hiUhjj;ubahphubeubeubh)rB}rC(hiUhjjhkhnhphhr}rD(ht]hu]hv]hw]hz]uh|M,h}hhd]rE(h)rF}rG(hiUhjjBhkhnhpjhr}rH(ht]hu]hv]hw]hz]uh|Nh}hhd]rIj)rJ}rK(hiUhr}rL(ht]hu]hv]hw]hz]uhjjFhd]rM(j)rN}rO(hiUhr}rP(ht]hu]hv]hw]hz]uhjjJhd]rQhX ParametersrRrS}rT(hiUhjjNubahpjubj)rU}rV(hiUhr}rW(ht]hu]hv]hw]hz]uhjjJhd]rXj)rY}rZ(hiUhr}r[(ht]hu]hv]hw]hz]uhjjUhd]r\(j)r]}r^(hiUhr}r_(ht]hu]hv]hw]hz]uhjjYhd]r`h)ra}rb(hiUhr}rc(ht]hu]hv]hw]hz]uhjj]hd]rd(j)re}rf(hiXtablehr}rg(ht]hu]hv]hw]hz]uhjjahd]rhhXtablerirj}rk(hiUhjjeubahpj"ubhX -- rlrm}rn(hiUhjjaubhX+table into which insert should be performedrorp}rq(hiX+table into which insert should be performedhjjaubehphubahpj#ubj)rr}rs(hiUhr}rt(ht]hu]hv]hw]hz]uhjjYhd]ruh)rv}rw(hiUhr}rx(ht]hu]hv]hw]hz]uhjjrhd]ry(j)rz}r{(hiXselecthr}r|(ht]hu]hv]hw]hz]uhjjvhd]r}hXselectr~r}r(hiUhjjzubahpj"ubhX -- rr}r(hiUhjjvubhX,select query from which data should be drawnrr}r(hiX,select query from which data should be drawnhjjvubehphubahpj#ubehpjJubahpj)ubehpj*ubaubh)r}r(hiXThis class is taken directly from SQLAlchemy's `compiler.html `_, and allows a Pythonic representation of ``INSERT INTO .. SELECT ..`` queries.hjjBhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M(h}hhd]r(hX/This class is taken directly from SQLAlchemy's rr}r(hiX/This class is taken directly from SQLAlchemy's hjjubj)r}r(hiX|`compiler.html `_hr}r(Unameh,jXihttp://www.sqlalchemy.org/docs/core/compiler.html#compiling-sub-elements-of-a-custom-expression-constructrhw]hv]ht]hu]hz]uhjjhd]rhX compiler.htmlrr}r(hiUhjjubahpjubj)r}r(hiXl jKhjjhpjhr}r(Urefurijhw]rh\ahv]ht]hu]hz]rh,auhd]ubhX*, and allows a Pythonic representation of rr}r(hiX*, and allows a Pythonic representation of hjjubh)r}r(hiX``INSERT INTO .. SELECT ..``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXINSERT INTO .. SELECT ..rr}r(hiUhjjubahphubhX queries.rr}r(hiX queries.hjjubeubeubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX.sa_version() (in module buildbot.util.sautils)hUtrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiX sa_version()hjjhkhnhphhr}r(hw]rhahjhv]ht]hu]hz]rhahX sa_versionrhUhԉuh|M2h}hhd]r(h)r}r(hiXbuildbot.util.sautils.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M2h}hhd]rhXbuildbot.util.sautils.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M2h}hhd]rhX sa_versionrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M2h}hhd]ubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M2h}hhd]rh)r}r(hiXReturn a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a ``__version__`` attribute are represented by ``(0,0,0)``.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M/h}hhd]r(hXdReturn a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a rr}r(hiXdReturn a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a hjjubh)r}r(hiX``__version__``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhX __version__rr}r(hiUhjjubahphubhX attribute are represented by rr}r(hiX attribute are represented by hjjubh)r}r(hiX ``(0,0,0)``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhX(0,0,0)rr}r(hiUhjjubahphubhX.r}r(hiX.hjjubeubaubeubeubhf)r}r(hiUhjhghkhnhphqhr}r(ht]hu]hv]hw]rhTahz]rh auh|M4h}hhd]r(h)r}r(hiXbuildbot.util.subscriptionrhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M4h}hhd]rhXbuildbot.util.subscriptionrr}r(hijhjjubaubh)r}r(hiXThe classes in the :py:mod:`buildbot.util.subscription` module are used for master-local subscriptions. In the near future, all uses of this module will be replaced with message-queueing implementations that allow subscriptions and subscribers to span multiple masters.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M6h}hhd]r(hXThe classes in the rr}r(hiXThe classes in the hjjubh)r}r(hiX$:py:mod:`buildbot.util.subscription`rhjjhkhnhphhr}r(UreftypeXmodhhXbuildbot.util.subscriptionU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhNhjuh|M6hd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-modrehv]hw]hz]uhjjhd]rhXbuildbot.util.subscriptionr r }r (hiUhjjubahphubaubhX module are used for master-local subscriptions. In the near future, all uses of this module will be replaced with message-queueing implementations that allow subscriptions and subscribers to span multiple masters.r r }r(hiX module are used for master-local subscriptions. In the near future, all uses of this module will be replaced with message-queueing implementations that allow subscriptions and subscribers to span multiple masters.hjjubeubeubhf)r}r(hiUhjhghkhnhphqhr}r(ht]hu]hv]hw]rhbahz]rhEauh|M<h}hhd]r(h)r}r(hiXbuildbot.util.croniterrhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M<h}hhd]rhXbuildbot.util.croniterrr}r(hijhjjubaubh)r}r(hiXThis module is a copy of https://github.com/taichino/croniter, and provides support for converting cron-like time specifications into actual times.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M>h}hhd]r (hXThis module is a copy of r!r"}r#(hiXThis module is a copy of hjjubj)r$}r%(hiX$https://github.com/taichino/croniterr&hr}r'(Urefurij&hw]hv]ht]hu]hz]uhjjhd]r(hX$https://github.com/taichino/croniterr)r*}r+(hiUhjj$ubahpjubhXV, and provides support for converting cron-like time specifications into actual times.r,r-}r.(hiXV, and provides support for converting cron-like time specifications into actual times.hjjubeubeubhf)r/}r0(hiUhjhghkhnhphqhr}r1(ht]hu]hv]hw]r2(Xmodule-buildbot.util.stater3hWehz]r4hauh|MBh}hhd]r5(h)r6}r7(hiXbuildbot.util.stater8hjj/hkhnhphhr}r9(ht]hu]hv]hw]hz]uh|MBh}hhd]r:hXbuildbot.util.stater;r<}r=(hij8hjj6ubaubh)r>}r?(hiUhjj/hkhnhphhr}r@(hw]hv]ht]hu]hz]Uentries]rA(hXbuildbot.util.state (module)Xmodule-buildbot.util.stateUtrBauh|MDh}hhd]ubh)rC}rD(hiX}The classes in the :py:mod:`buildbot.util.subscription` module are used for dealing with object state stored in the database.rEhjj/hkhnhphhr}rF(ht]hu]hv]hw]hz]uh|MEh}hhd]rG(hXThe classes in the rHrI}rJ(hiXThe classes in the hjjCubh)rK}rL(hiX$:py:mod:`buildbot.util.subscription`rMhjjChkhnhphhr}rN(UreftypeXmodhhXbuildbot.util.subscriptionU refdomainXpyrOhw]hv]U refexplicitht]hu]hz]hhhNhXbuildbot.util.staterPuh|MEhd]rQh)rR}rS(hijMhr}rT(ht]hu]rU(hjOXpy-modrVehv]hw]hz]uhjjKhd]rWhXbuildbot.util.subscriptionrXrY}rZ(hiUhjjRubahphubaubhXF module are used for dealing with object state stored in the database.r[r\}r](hiXF module are used for dealing with object state stored in the database.hjjCubeubh)r^}r_(hiUhjj/hkNhphhr}r`(hw]hv]ht]hu]hz]Uentries]ra(hX)StateMixin (class in buildbot.util.state)hCUtrbauh|Nh}hhd]ubh)rc}rd(hiUhjj/hkNhphhr}re(hÉhXpyhw]hv]ht]hu]hz]hXclassrfhjfuh|Nh}hhd]rg(h)rh}ri(hiX StateMixinrjhjjchkhnhphhr}rk(hw]rlhCahjPhv]ht]hu]hz]rmhCahjjhUhԉuh|Mfh}hhd]rn(j)ro}rp(hiXclass hjjhhkhnhpjhr}rq(ht]hu]hv]hw]hz]uh|Mfh}hhd]rrhXclass rsrt}ru(hiUhjjoubaubh)rv}rw(hiXbuildbot.util.state.hjjhhkhnhphhr}rx(ht]hu]hv]hw]hz]uh|Mfh}hhd]ryhXbuildbot.util.state.rzr{}r|(hiUhjjvubaubh)r}}r~(hijjhjjhhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mfh}hhd]rhX StateMixinrr}r(hiUhjj}ubaubeubh)r}r(hiUhjjchkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mfh}hhd]r(h)r}r(hiXYThis class provides helper methods for accessing the object state stored in the database.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MIh}hhd]rhXYThis class provides helper methods for accessing the object state stored in the database.rr}r(hijhjjubaubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX/name (buildbot.util.state.StateMixin attribute)h2Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hX attributerhjuh|Nh}hhd]r(h)r}r(hiXnamerhjjhkhnhphhr}r(hw]rh2ahjPhv]ht]hu]hz]rh2ahXStateMixin.namehjjhԉuh|MNh}hhd]rh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MNh}hhd]rhXnamerr}r(hiUhjjubaubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MNh}hhd]rh)r}r(hiXPThis must be set to the name to be used to identify this object in the database.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MMh}hhd]rhXPThis must be set to the name to be used to identify this object in the database.rr}r(hijhjjubaubaubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX1master (buildbot.util.state.StateMixin attribute)h Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hX attributerhjuh|Nh}hhd]r(h)r}r(hiXmasterrhjjhkhnhphhr}r(hw]rh ahjPhv]ht]hu]hz]rh ahXStateMixin.masterhjjhԉuh|MRh}hhd]rh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MRh}hhd]rhXmasterrr}r(hiUhjjubaubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MRh}hhd]rh)r}r(hiX6This must point to the :py:class:`BuildMaster` object.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|MQh}hhd]r(hXThis must point to the rr}r(hiXThis must point to the hjjubh)r}r(hiX:py:class:`BuildMaster`rhjjhkhnhphhr}r(UreftypeXclasshhX BuildMasterU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhjjhjPuh|MQhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-classrehv]hw]hz]uhjjhd]rhX BuildMasterrr}r(hiUhjjubahphubaubhX object.rr}r(hiX object.hjjubeubaubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX2getState() (buildbot.util.state.StateMixin method)h Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyrhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXgetState(name, default)hjjhkhnhphhr}r(hw]rh ahjPhv]ht]hu]hz]rh ahXStateMixin.getStatehjjhԉuh|M\h}hhd]r(h)r}r(hiXgetStatehjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M\h}hhd]rhXgetStaterr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M\h}hhd]r(h)r}r(hiXnamehr}r(ht]hu]hv]hw]hz]uhjjhd]rhXnamer r }r (hiUhjjubahphubh)r }r (hiXdefaulthr}r(ht]hu]hv]hw]hz]uhjjhd]rhXdefaultrr}r(hiUhjj ubahphubeubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M\h}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r (hiUhr}r!(ht]hu]hv]hw]hz]uhjjhd]r"hX Parametersr#r$}r%(hiUhjjubahpjubj)r&}r'(hiUhr}r((ht]hu]hv]hw]hz]uhjjhd]r)j)r*}r+(hiUhr}r,(ht]hu]hv]hw]hz]uhjj&hd]r-(j)r.}r/(hiUhr}r0(ht]hu]hv]hw]hz]uhjj*hd]r1h)r2}r3(hiUhr}r4(ht]hu]hv]hw]hz]uhjj.hd]r5(j)r6}r7(hiXnamehr}r8(ht]hu]hv]hw]hz]uhjj2hd]r9hXnamer:r;}r<(hiUhjj6ubahpj"ubhX -- r=r>}r?(hiUhjj2ubhXname of the value to retriever@rA}rB(hiXname of the value to retrievehjj2ubehphubahpj#ubj)rC}rD(hiUhr}rE(ht]hu]hv]hw]hz]uhjj*hd]rFh)rG}rH(hiUhr}rI(ht]hu]hv]hw]hz]uhjjChd]rJ(j)rK}rL(hiXdefaulthr}rM(ht]hu]hv]hw]hz]uhjjGhd]rNhXdefaultrOrP}rQ(hiUhjjKubahpj"ubhX -- rRrS}rT(hiUhjjGubhX(optional) value to return if rUrV}rW(hiX(optional) value to return if hjjGubcdocutils.nodes title_reference rX)rY}rZ(hiX`name`hr}r[(ht]hu]hv]hw]hz]uhjjGhd]r\hXnamer]r^}r_(hiUhjjYubahpUtitle_referencer`ubhX is not presentrarb}rc(hiX is not presenthjjGubehphubahpj#ubehpjJubahpj)ubehpj*ubj)rd}re(hiUhr}rf(ht]hu]hv]hw]hz]uhjjhd]rg(j)rh}ri(hiUhr}rj(ht]hu]hv]hw]hz]uhjjdhd]rkhXReturnsrlrm}rn(hiUhjjhubahpjubj)ro}rp(hiUhr}rq(ht]hu]hv]hw]hz]uhjjdhd]rrh)rs}rt(hiUhr}ru(ht]hu]hv]hw]hz]uhjjohd]rvhXstate value via a Deferredrwrx}ry(hiXstate value via a Deferredhjjsubahphubahpj)ubehpj*ubj)rz}r{(hiUhr}r|(ht]hu]hv]hw]hz]uhjjhd]r}(j)r~}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjzhd]rhXRaisesrr}r(hiUhjj~ubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjzhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(h)r}r(hiUhr}r(UreftypeUexcrU reftargetXKeyErrorrU refdomainjhw]hv]U refexplicitht]hu]hz]uhjjhd]rj)r}r(hijhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXKeyErrorrr}r(hiUhjjubahpj"ubahphubhX -- rr}r(hiUhjjubhXif rr}r(hiXif hjjubjX)r}r(hiX`name`hr}r(ht]hu]hv]hw]hz]uhjjhd]rhXnamerr}r(hiUhjjubahpj`ubhX' is not present and no default is givenrr}r(hiX' is not present and no default is givenhjjubehphubahpj#ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(h)r}r(hiUhr}r(UreftypejU reftargetX TypeErrorrU refdomainjhw]hv]U refexplicitht]hu]hz]uhjjhd]rj)r}r(hijhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX TypeErrorrr}r(hiUhjjubahpj"ubahphubhX -- rr}r(hiUhjjubhXif JSON parsing failsrr}r(hiXif JSON parsing failshjjubehphubahpj#ubehpjJubahpj)ubehpj*ubeubh)r}r(hiX0Get a named state value from the object's state.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|M[h}hhd]rhX0Get a named state value from the object's state.rr}r(hijhjjubaubeubeubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX2getState() (buildbot.util.state.StateMixin method)X'buildbot.util.state.StateMixin.getStateUtrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyrhw]hv]ht]hu]hz]hXmethodrhjuh|Nh}hhd]r(h)r}r(hiXgetState(name, value)hjjhkhnhphhr}r(hw]hjPhv]ht]hu]hz]hXStateMixin.getStatehjjhԉuh|Meh}hhd]r(h)r}r(hiXgetStatehjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Meh}hhd]rhXgetStaterr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Meh}hhd]r(h)r}r(hiXnamehr}r(ht]hu]hv]hw]hz]uhjjhd]rhXnamerr}r(hiUhjjubahphubh)r}r(hiXvaluehr}r(ht]hu]hv]hw]hz]uhjjhd]rhXvaluerr}r(hiUhjjubahphubeubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Meh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r (hiUhr}r (ht]hu]hv]hw]hz]uhjjhd]r hX Parametersr r }r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r (hiXnamehr}r!(ht]hu]hv]hw]hz]uhjjhd]r"hXnamer#r$}r%(hiUhjjubahpj"ubhX -- r&r'}r((hiUhjjubhXthe name of the value to changer)r*}r+(hiXthe name of the value to changer,hjjubehphubahpj#ubj)r-}r.(hiUhr}r/(ht]hu]hv]hw]hz]uhjjhd]r0h)r1}r2(hiUhr}r3(ht]hu]hv]hw]hz]uhjj-hd]r4(j)r5}r6(hiXvaluehr}r7(ht]hu]hv]hw]hz]uhjj1hd]r8hXvaluer9r:}r;(hiUhjj5ubahpj"ubhX -- r<r=}r>(hiUhjj1ubhX,the value to set - must be a JSONable objectr?r@}rA(hiX,the value to set - must be a JSONable objectrBhjj1ubehphubahpj#ubj)rC}rD(hiUhr}rE(ht]hu]hv]hw]hz]uhjjhd]rFh)rG}rH(hiUhr}rI(ht]hu]hv]hw]hz]uhjjChd]rJ(j)rK}rL(hiXreturnshr}rM(ht]hu]hv]hw]hz]uhjjGhd]rNhXreturnsrOrP}rQ(hiUhjjKubahpj"ubhX -- rRrS}rT(hiUhjjGubhXDeferredrUrV}rW(hiXDeferredrXhjjGubehphubahpj#ubehpjJubahpj)ubehpj*ubj)rY}rZ(hiUhr}r[(ht]hu]hv]hw]hz]uhjjhd]r\(j)r]}r^(hiUhr}r_(ht]hu]hv]hw]hz]uhjjYhd]r`(hXRaisesrarb}rc(hiUhjj]ubhX rd}re(hiUhjj]ubh)rf}rg(hiUhr}rh(UreftypejU reftargetX TypeErrorriU refdomainjhw]hv]U refexplicitht]hu]hz]uhjj]hd]rjhX TypeErrorrkrl}rm(hijihjjfubahphubehpjubj)rn}ro(hiUhr}rp(ht]hu]hv]hw]hz]uhjjYhd]rqh)rr}rs(hiUhr}rt(ht]hu]hv]hw]hz]uhjjnhd]ruhXif JSONification failsrvrw}rx(hiXif JSONification failsryhjjrubahphubahpj)ubehpj*ubeubh)rz}r{(hiX\Set a named state value in the object's persistent state. Note that value must be json-able.r|hjjhkhnhphhr}r}(ht]hu]hv]hw]hz]uh|Mdh}hhd]r~hX\Set a named state value in the object's persistent state. Note that value must be json-able.rr}r(hij|hjjzubaubeubeubeubeubeubhf)r}r(hiUhjhghkhnhphqhr}r(ht]hu]hv]hw]r(X module-buildbot.util.identifiersrhXehz]rhauh|Mhh}hhd]r(h)r}r(hiXbuildbot.util.identifiersrhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mhh}hhd]rhXbuildbot.util.identifiersrr}r(hijhjjubaubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX"buildbot.util.identifiers (module)X module-buildbot.util.identifiersUtrauh|Mkh}hhd]ubh)r}r(hiX4This module makes it easy to manipulate identifiers.rhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mlh}hhd]rhX4This module makes it easy to manipulate identifiers.rr}r(hijhjjubaubh)r}r(hiUhjjhkhnhphhr}r(hw]hv]ht]hu]hz]Uentries]r(hX4isIdentifier() (in module buildbot.util.identifiers)h%Utrauh|Nh}hhd]ubh)r}r(hiUhjjhkhnhphhr}r(hÉhXpyhw]hv]ht]hu]hz]hXfunctionrhjuh|Nh}hhd]r(h)r}r(hiXisIdentifier(maxLength, object)hjjhkhnhphhr}r(hw]rh%ahXbuildbot.util.identifiersrhv]ht]hu]hz]rh%ahX isIdentifierrhUhԉuh|Muh}hhd]r(h)r}r(hiXbuildbot.util.identifiers.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Muh}hhd]rhXbuildbot.util.identifiers.rr}r(hiUhjjubaubh)r}r(hijhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Muh}hhd]rhX isIdentifierrr}r(hiUhjjubaubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Muh}hhd]r(h)r}r(hiX maxLengthhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX maxLengthrr}r(hiUhjjubahphubh)r}r(hiXobjecthr}r(ht]hu]hv]hw]hz]uhjjhd]rhXobjectrr}r(hiUhjjubahphubeubeubh)r}r(hiUhjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Muh}hhd]r(h)r}r(hiUhjjhkhnhpjhr}r(ht]hu]hv]hw]hz]uh|Nh}hhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX Parametersrr}r(hiUhjjubahpjubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiX maxLengthhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX maxLengthrr}r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhX maximum length of the identifierrr}r(hiX maximum length of the identifierhjjubehphubahpj#ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r (hiXobjecthr}r (ht]hu]hv]hw]hz]uhjjhd]r hXobjectr r }r(hiUhjjubahpj"ubhX -- rr}r(hiUhjjubhX"object to test for identifier-nessrr}r(hiX"object to test for identifier-nesshjjubehphubahpj#ubehpjJubahpj)ubehpj*ubj)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]r(j)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhXReturnsrr}r(hiUhjjubahpjubj)r }r!(hiUhr}r"(ht]hu]hv]hw]hz]uhjjhd]r#h)r$}r%(hiUhr}r&(ht]hu]hv]hw]hz]uhjj hd]r'hXbooleanr(r)}r*(hiXbooleanhjj$ubahphubahpj)ubehpj*ubeubh)r+}r,(hiXIs object an identifier?r-hjjhkhnhphhr}r.(ht]hu]hv]hw]hz]uh|Mth}hhd]r/hXIs object an identifier?r0r1}r2(hij-hjj+ubaubeubeubh)r3}r4(hiUhjjhkhnhphhr}r5(hw]hv]ht]hu]hz]Uentries]r6(hX7forceIdentifier() (in module buildbot.util.identifiers)h(hiXforceIdentifier(maxLength, str)hjj8hkhnhphhr}r?(hw]r@h(j)r?}r@(hiXstrhr}rA(ht]hu]hv]hw]hz]uhjj;hd]rBhXstrrCrD}rE(hiUhjj?ubahpj"ubhX -- rFrG}rH(hiUhjj;ubhXidentifier to incrementrIrJ}rK(hiXidentifier to incrementhjj;ubehphubahpj#ubehpjJubahpj)ubehpj*ubj)rL}rM(hiUhr}rN(ht]hu]hv]hw]hz]uhjj hd]rO(j)rP}rQ(hiUhr}rR(ht]hu]hv]hw]hz]uhjjLhd]rShXReturnsrTrU}rV(hiUhjjPubahpjubj)rW}rX(hiUhr}rY(ht]hu]hv]hw]hz]uhjjLhd]rZh)r[}r\(hiUhr}r](ht]hu]hv]hw]hz]uhjjWhd]r^(hXidentifer of maximum length r_r`}ra(hiXidentifer of maximum length hjj[ubh)rb}rc(hiX ``maxLength``hr}rd(ht]hu]hv]hw]hz]uhjj[hd]rehX maxLengthrfrg}rh(hiUhjjbubahphubehphubahpj)ubehpj*ubj)ri}rj(hiUhjj hkhnhpj*hr}rk(ht]hu]hv]hw]hz]uh|Mh}hhd]rl(j)rm}rn(hiXraiseshr}ro(ht]hu]hv]hw]hz]uhjjihd]rphXRaisesrqrr}rs(hiUhjjmubahpjubj)rt}ru(hiX8ValueError if no suitable identifier can be constructed hr}rv(ht]hu]hv]hw]hz]uhjjihd]rwh)rx}ry(hiX7ValueError if no suitable identifier can be constructedrzhjjthkhnhphhr}r{(ht]hu]hv]hw]hz]uh|Mhd]r|hX7ValueError if no suitable identifier can be constructedr}r~}r(hijzhjjxubaubahpj)ubeubeubh)r}r(hiX"Increment" an identifier by adding a numeric suffix, while keeping the total length limited. This is useful when selecting a unique identifier for an object. Maximum-length identifiers like ``_999999`` cannot be incremented and will raise :py:exc:`ValueError`.hjjhkhnhphhr}r(ht]hu]hv]hw]hz]uh|Mh}hhd]r(hX"Increment" an identifier by adding a numeric suffix, while keeping the total length limited. This is useful when selecting a unique identifier for an object. Maximum-length identifiers like rr}r(hiX"Increment" an identifier by adding a numeric suffix, while keeping the total length limited. This is useful when selecting a unique identifier for an object. Maximum-length identifiers like hjjubh)r}r(hiX ``_999999``hr}r(ht]hu]hv]hw]hz]uhjjhd]rhX_999999rr}r(hiUhjjubahphubhX& cannot be incremented and will raise rr}r(hiX& cannot be incremented and will raise hjjubh)r}r(hiX:py:exc:`ValueError`rhjjhkhnhphhr}r(UreftypeXexchhX ValueErrorU refdomainXpyrhw]hv]U refexplicitht]hu]hz]hhhNhjuh|Mhd]rh)r}r(hijhr}r(ht]hu]r(hjXpy-excrehv]hw]hz]uhjjhd]rhX ValueErrorrr}r(hiUhjjubahphubaubhX.r}r(hiX.hjjubeubeubeubeubeubahiUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh}hU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(hiUhr}r(ht]UlevelKhw]hv]Usourcehnhu]hz]UlineMUtypeUINFOruhd]rh)r}r(hiUhr}r(ht]hu]hv]hw]hz]uhjjhd]rhX-Hyperlink target "index-0" is not referenced.rr}r(hiUhjjubahphubahpUsystem_messagerubaUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/utils.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidr Udoctitle_xformr Ustrip_elements_with_classesr NU _config_filesr ]Ufile_insertion_enabledr U raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hjhbjh\jhZjf hjh jh jhTjj j)r}r(hiUhjj hkhnhpjhr}r(ht]hw]rj ahv]Uismodhu]hz]uh|Kh}hhd]ubhjo ahv]Uismodhu]hz]uh|M_h}hhd]ubh!j h]j h"jzhRjh[jjh0j h&jh'j- h(jh)jh*j0 h+j hFj*h8jh.j/h^hghVjf jKj)r?}r@(hiUhjjGhkhnhpjhr}rA(ht]hw]rBjKahv]Uismodhu]hz]uh|Mh}hhd]ubh1jih2jh`jh4j h5jh6jFhajah9jhYjGh:jh#j h>jh?jD hWj/hAjhBjh%jhCjhhDjch;jhjhHjGuUsubstitution_namesrC}rDhph}hr}rE(ht]hw]hv]Usourcehnhu]hz]uU footnotesrF]rGUrefidsrH}rIub.PK3D32buildbot-v0.8.9/.doctrees/developer/config.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X&buildbot.config.BuilderConfig.categoryqX(buildbot.config.MasterConfig.buildbotURLqX(buildbot.config.BuilderConfig.slavenamesqXbuildbot.config.ConfigErrorsq Xdeveloper-reconfigurationq X$buildbot.config.MasterConfig.manholeq X:buildbot.config.ReconfigurableServiceMixin.reconfigServiceq X'buildbot.config.MasterConfig.logMaxSizeq X0buildbot.config.MasterConfig.logCompressionLimitqX(buildbot.config.MasterConfig.multiMasterqX*buildbot.config.MasterConfig.mergeRequestsqX%buildbot.config.MasterConfig.buildersqXerror handlingqNXstatus receiversqNX#buildbot.config.BuilderConfig.locksqX'buildbot.config.MasterConfig.propertiesqX schedulersqNX#buildbot.config.ConfigErrors.errorsqXreconfigurable servicesqNX%buildbot.config.ConfigErrors.addErrorqX'buildbot.config.MasterConfig.logHorizonqX*buildbot.config.ReconfigurableServiceMixinqX+buildbot.config.BuilderConfig.slavebuilddirqX user managersqNX+buildbot.config.BuilderConfig.mergeRequestsqXslavesqNX'buildbot.config.BuilderConfig.nextSlaveq X)buildbot.config.BuilderConfig.descriptionq!X&buildbot.config.BuilderConfig.builddirq"Xbuildbot.config.MasterConfig.dbq#X%buildbot.config.MasterConfig.titleURLq$X#buildbot.config.MasterConfig.slavesq%X+buildbot.config.MasterConfig.logMaxTailSizeq&X*buildbot.config.MasterConfig.user_managersq'X%buildbot.config.BuilderConfig.factoryq(X.buildbot.config.MasterConfig.codebaseGeneratorq)X)buildbot.config.MasterConfig.eventHorizonq*X!buildbot.config.BuilderConfig.envq+X+buildbot.config.MasterConfig.change_sourcesq,X$buildbot.config.MasterConfig.metricsq-Xchange sourcesq.NX(buildbot.config.BuilderConfig.propertiesq/Xreconfigurationq0NX configurationq1NX#buildbot.config.MasterConfig.statusq2X+buildbot.config.BuilderConfig.canStartBuildq3Xbuildbot.config.errorq4X'buildbot.config.MasterConfig.validationq5X'buildbot.config.MasterConfig.schedulersq6Xbuildbot.config.MasterConfigq7X'buildbot.config.BuilderConfig.nextBuildq8X/buildbot.config.MasterConfig.prioritizeBuildersq9X"buildbot.config.MasterConfig.titleq:Xbuildbot.config.BuilderConfigq;X*buildbot.config.MasterConfig.debugPasswordqX)buildbot.config.MasterConfig.buildHorizonq?Xbuilder configurationq@NX"buildbot.config.BuilderConfig.nameqAXcustom subclassesqBNX&buildbot.config.MasterConfig.protocolsqCX#buildbot.config.MasterConfig.cachesqDX*buildbot.config.MasterConfig.changeHorizonqEX1buildbot.config.MasterConfig.logCompressionMethodqFuUsubstitution_defsqG}qHUparse_messagesqI]qJUcurrent_sourceqKNU decorationqLNUautofootnote_startqMKUnameidsqN}qO(hhhhhhh h h Udeveloper-reconfigurationqPh h h h h h hhhhhhhhhUerror-handlingqQhUstatus-receiversqRhhhhhU schedulersqShhhUreconfigurable-servicesqThhhhhhhhhU user-managersqUhhhUslavesqVh h h!h!h"h"h#h#h$h$h%h%h&h&h'h'h(h(h)h)h*h*h+h+h,h,h-h-h.Uchange-sourcesqWh/h/h0UreconfigurationqXh1U configurationqYh2h2h3h3h4h4h5h5h6h6h7h7h8h8h9h9h:h:h;h;hh>h?h?h@Ubuilder-configurationqZhAhAhBUcustom-subclassesq[hChChDhDhEhEhFhFuUchildrenq\]q]cdocutils.nodes section q^)q_}q`(U rawsourceqaUUparentqbhUsourceqccdocutils.nodes reprunicode qdXQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/config.rstqeqf}qgbUtagnameqhUsectionqiU attributesqj}qk(Udupnamesql]Uclassesqm]Ubackrefsqn]Uidsqo]qp(Xmodule-buildbot.configqqhYeUnamesqr]qsh1auUlineqtKUdocumentquhh\]qv(cdocutils.nodes title qw)qx}qy(haX Configurationqzhbh_hchfhhUtitleq{hj}q|(hl]hm]hn]ho]hr]uhtKhuhh\]q}cdocutils.nodes Text q~X Configurationqq}q(hahzhbhxubaubcsphinx.addnodes index q)q}q(haUhbh_hchfhhUindexqhj}q(ho]hn]hl]hm]hr]Uentries]q(UsingleqXbuildbot.config (module)Xmodule-buildbot.configUtqauhtKhuhh\]ubcdocutils.nodes paragraph q)q}q(haXHWherever possible, Buildbot components should access configuration information as needed from the canonical source, ``master.config``, which is an instance of :py:class:`MasterConfig`. For example, components should not keep a copy of the ``buildbotURL`` locally, as this value may change throughout the lifetime of the master.hbh_hchfhhU paragraphqhj}q(hl]hm]hn]ho]hr]uhtKhuhh\]q(h~XtWherever possible, Buildbot components should access configuration information as needed from the canonical source, qq}q(haXtWherever possible, Buildbot components should access configuration information as needed from the canonical source, hbhubcdocutils.nodes literal q)q}q(haX``master.config``hj}q(hl]hm]hn]ho]hr]uhbhh\]qh~X master.configqq}q(haUhbhubahhUliteralqubh~X, which is an instance of qq}q(haX, which is an instance of hbhubcsphinx.addnodes pending_xref q)q}q(haX:py:class:`MasterConfig`qhbhhchfhhU pending_xrefqhj}q(UreftypeXclassUrefwarnqU reftargetqX MasterConfigU refdomainXpyqho]hn]U refexplicithl]hm]hr]UrefdocqXdeveloper/configqUpy:classqNU py:moduleqXbuildbot.configquhtKh\]qh)q}q(hahhj}q(hl]hm]q(UxrefqhXpy-classqehn]ho]hr]uhbhh\]qh~X MasterConfigqq}q(haUhbhubahhhubaubh~X9. For example, components should not keep a copy of the qq}q(haX9. For example, components should not keep a copy of the hbhubh)q}q(haX``buildbotURL``hj}q(hl]hm]hn]ho]hr]uhbhh\]qh~X buildbotURLqq}q(haUhbhubahhhubh~XI locally, as this value may change throughout the lifetime of the master.q…q}q(haXI locally, as this value may change throughout the lifetime of the master.hbhubeubh)q}q(haXComponents which need to be notified of changes in the configuration should be implemented as services, subclassing :py:class:`ReconfigurableServiceMixin`, as described in :ref:`developer-Reconfiguration`.hbh_hchfhhhhj}q(hl]hm]hn]ho]hr]uhtK huhh\]q(h~XtComponents which need to be notified of changes in the configuration should be implemented as services, subclassing qɅq}q(haXtComponents which need to be notified of changes in the configuration should be implemented as services, subclassing hbhubh)q}q(haX&:py:class:`ReconfigurableServiceMixin`qhbhhchfhhhhj}q(UreftypeXclasshhXReconfigurableServiceMixinU refdomainXpyqho]hn]U refexplicithl]hm]hr]hhhNhhuhtK h\]qh)q}q(hahhj}q(hl]hm]q(hhXpy-classqehn]ho]hr]uhbhh\]qh~XReconfigurableServiceMixinq؅q}q(haUhbhubahhhubaubh~X, as described in qۅq}q(haX, as described in hbhubh)q}q(haX :ref:`developer-Reconfiguration`qhbhhchfhhhhj}q(UreftypeXrefhhXdeveloper-reconfigurationU refdomainXstdqho]hn]U refexplicithl]hm]hr]hhuhtK h\]qcdocutils.nodes emphasis q)q}q(hahhj}q(hl]hm]q(hhXstd-refqehn]ho]hr]uhbhh\]qh~Xdeveloper-Reconfigurationq녁q}q(haUhbhubahhUemphasisqubaubh~X.q}q(haX.hbhubeubh)q}q(haUhbh_hcNhhhhj}q(ho]hn]hl]hm]hr]Uentries]q(hX'MasterConfig (class in buildbot.config)h7UtqauhtNhuhh\]ubcsphinx.addnodes desc q)q}q(haUhbh_hcNhhUdescqhj}q(UnoindexqUdomainqXpyho]hn]hl]hm]hr]UobjtypeqXclassqUdesctypeqhuhtNhuhh\]r(csphinx.addnodes desc_signature r)r}r(haX MasterConfigrhbhhchfhhUdesc_signaturerhj}r(ho]rh7aUmodulerhhn]hl]hm]hr]r h7aUfullnamer jUclassr UUfirstr uhtKhuhh\]r (csphinx.addnodes desc_annotation r)r}r(haXclass hbjhchfhhUdesc_annotationrhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~Xclass rr}r(haUhbjubaubcsphinx.addnodes desc_addname r)r}r(haXbuildbot.config.hbjhchfhhU desc_addnamerhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~Xbuildbot.config.rr}r(haUhbjubaubcsphinx.addnodes desc_name r )r!}r"(hajhbjhchfhhU desc_namer#hj}r$(hl]hm]hn]ho]hr]uhtKhuhh\]r%h~X MasterConfigr&r'}r((haUhbj!ubaubeubcsphinx.addnodes desc_content r))r*}r+(haUhbhhchfhhU desc_contentr,hj}r-(hl]hm]hn]ho]hr]uhtKhuhh\]r.(h)r/}r0(haXThe master object makes much of the configuration available from an object named ``master.config``. Configuration is stored as attributes of this object. Where possible, other Buildbot components should access this configuration directly and not cache the configuration values anywhere else. This avoids the need to ensure that update-from-configuration methods are called on a reconfig.hbj*hchfhhhhj}r1(hl]hm]hn]ho]hr]uhtKhuhh\]r2(h~XQThe master object makes much of the configuration available from an object named r3r4}r5(haXQThe master object makes much of the configuration available from an object named hbj/ubh)r6}r7(haX``master.config``hj}r8(hl]hm]hn]ho]hr]uhbj/h\]r9h~X master.configr:r;}r<(haUhbj6ubahhhubh~X$. Configuration is stored as attributes of this object. Where possible, other Buildbot components should access this configuration directly and not cache the configuration values anywhere else. This avoids the need to ensure that update-from-configuration methods are called on a reconfig.r=r>}r?(haX$. Configuration is stored as attributes of this object. Where possible, other Buildbot components should access this configuration directly and not cache the configuration values anywhere else. This avoids the need to ensure that update-from-configuration methods are called on a reconfig.hbj/ubeubh)r@}rA(haXAside from validating the configuration, this class handles any backward-compatibility issues - renamed parameters, type changes, and so on - removing those concerns from other parts of Buildbot.rBhbj*hchfhhhhj}rC(hl]hm]hn]ho]hr]uhtKhuhh\]rDh~XAside from validating the configuration, this class handles any backward-compatibility issues - renamed parameters, type changes, and so on - removing those concerns from other parts of Buildbot.rErF}rG(hajBhbj@ubaubh)rH}rI(haXThis class may be instantiated directly, creating an entirely default configuration, or via :py:meth:`loadConfig`, which will load the configuration from a config file.hbj*hchfhhhhj}rJ(hl]hm]hn]ho]hr]uhtKhuhh\]rK(h~X\This class may be instantiated directly, creating an entirely default configuration, or via rLrM}rN(haX\This class may be instantiated directly, creating an entirely default configuration, or via hbjHubh)rO}rP(haX:py:meth:`loadConfig`rQhbjHhchfhhhhj}rR(UreftypeXmethhhX loadConfigU refdomainXpyrSho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]rTh)rU}rV(hajQhj}rW(hl]hm]rX(hjSXpy-methrYehn]ho]hr]uhbjOh\]rZh~X loadConfigr[r\}r](haUhbjUubahhhubaubh~X7, which will load the configuration from a config file.r^r_}r`(haX7, which will load the configuration from a config file.hbjHubeubh)ra}rb(haXThe following attributes are available from this class, representing the current configuration. This includes a number of global parameters:rchbj*hchfhhhhj}rd(hl]hm]hn]ho]hr]uhtK!huhh\]reh~XThe following attributes are available from this class, representing the current configuration. This includes a number of global parameters:rfrg}rh(hajchbjaubaubh)ri}rj(haUhbj*hchfhhhhj}rk(ho]hn]hl]hm]hr]Uentries]rl(hX.title (buildbot.config.MasterConfig attribute)h:UtrmauhtNhuhh\]ubh)rn}ro(haUhbj*hchfhhhhj}rp(hhXpyho]hn]hl]hm]hr]hX attributerqhjquhtNhuhh\]rr(j)rs}rt(haXtitleruhbjnhchfhhjhj}rv(ho]rwh:ajhhn]hl]hm]hr]rxh:aj XMasterConfig.titlej jj uhtK'huhh\]ryj )rz}r{(hajuhbjshchfhhj#hj}r|(hl]hm]hn]ho]hr]uhtK'huhh\]r}h~Xtitler~r}r(haUhbjzubaubaubj))r}r(haUhbjnhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtK'huhh\]rh)r}r(haX4The title of this buildmaster, from :bb:cfg:`title`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtK&huhh\]r(h~X$The title of this buildmaster, from rr}r(haX$The title of this buildmaster, from hbjubh)r}r(haX:bb:cfg:`title`rhbjhchfhhhhj}r(UreftypeXcfghhXtitleU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtK&h\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~Xtitlerr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX1titleURL (buildbot.config.MasterConfig attribute)h$UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXtitleURLrhbjhchfhhjhj}r(ho]rh$ajhhn]hl]hm]hr]rh$aj XMasterConfig.titleURLj jj uhtK+huhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtK+huhh\]rh~XtitleURLrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtK+huhh\]rh)r}r(haX<The URL corresponding to the title, from :bb:cfg:`titleURL`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtK*huhh\]r(h~X)The URL corresponding to the title, from rr}r(haX)The URL corresponding to the title, from hbjubh)r}r(haX:bb:cfg:`titleURL`rhbjhchfhhhhj}r(UreftypeXcfghhXtitleURLU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtK*h\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~XtitleURLrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX4buildbotURL (buildbot.config.MasterConfig attribute)hUtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX buildbotURLrhbjhchfhhjhj}r(ho]rhajhhn]hl]hm]hr]rhaj XMasterConfig.buildbotURLj jj uhtK0huhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtK0huhh\]rh~X buildbotURLrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtK0huhh\]rh)r}r(haX`The URL of this buildmaster, for use in constructing WebStatus URLs; from :bb:cfg:`buildbotURL`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtK.huhh\]r(h~XJThe URL of this buildmaster, for use in constructing WebStatus URLs; from rr}r(haXJThe URL of this buildmaster, for use in constructing WebStatus URLs; from hbjubh)r}r(haX:bb:cfg:`buildbotURL`rhbjhchfhhhhj}r(UreftypeXcfghhX buildbotURLU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtK.h\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X buildbotURLrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX6changeHorizon (buildbot.config.MasterConfig attribute)hEUtr auhtNhuhh\]ubh)r }r (haUhbj*hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r(j)r}r(haX changeHorizonrhbj hchfhhjhj}r(ho]rhEajhhn]hl]hm]hr]rhEaj XMasterConfig.changeHorizonj jj uhtK4huhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtK4huhh\]rh~X changeHorizonrr}r(haUhbjubaubaubj))r}r(haUhbj hchfhhj,hj}r(hl]hm]hn]ho]hr]uhtK4huhh\]r h)r!}r"(haX9The current change horizon, from :bb:cfg:`changeHorizon`.hbjhchfhhhhj}r#(hl]hm]hn]ho]hr]uhtK3huhh\]r$(h~X!The current change horizon, from r%r&}r'(haX!The current change horizon, from hbj!ubh)r(}r)(haX:bb:cfg:`changeHorizon`r*hbj!hchfhhhhj}r+(UreftypeXcfghhX changeHorizonU refdomainXbbr,ho]hn]U refexplicithl]hm]hr]hhuhtK3h\]r-h)r.}r/(haj*hj}r0(hl]hm]r1(hj,Xbb-cfgr2ehn]ho]hr]uhbj(h\]r3h~X changeHorizonr4r5}r6(haUhbj.ubahhhubaubh~X.r7}r8(haX.hbj!ubeubaubeubh)r9}r:(haUhbj*hchfhhhhj}r;(ho]hn]hl]hm]hr]Uentries]r<(hX5eventHorizon (buildbot.config.MasterConfig attribute)h*Utr=auhtNhuhh\]ubh)r>}r?(haUhbj*hchfhhhhj}r@(hhXpyho]hn]hl]hm]hr]hX attributerAhjAuhtNhuhh\]rB(j)rC}rD(haX eventHorizonrEhbj>hchfhhjhj}rF(ho]rGh*ajhhn]hl]hm]hr]rHh*aj XMasterConfig.eventHorizonj jj uhtK8huhh\]rIj )rJ}rK(hajEhbjChchfhhj#hj}rL(hl]hm]hn]ho]hr]uhtK8huhh\]rMh~X eventHorizonrNrO}rP(haUhbjJubaubaubj))rQ}rR(haUhbj>hchfhhj,hj}rS(hl]hm]hn]ho]hr]uhtK8huhh\]rTh)rU}rV(haX7The current event horizon, from :bb:cfg:`eventHorizon`.hbjQhchfhhhhj}rW(hl]hm]hn]ho]hr]uhtK7huhh\]rX(h~X The current event horizon, from rYrZ}r[(haX The current event horizon, from hbjUubh)r\}r](haX:bb:cfg:`eventHorizon`r^hbjUhchfhhhhj}r_(UreftypeXcfghhX eventHorizonU refdomainXbbr`ho]hn]U refexplicithl]hm]hr]hhuhtK7h\]rah)rb}rc(haj^hj}rd(hl]hm]re(hj`Xbb-cfgrfehn]ho]hr]uhbj\h\]rgh~X eventHorizonrhri}rj(haUhbjbubahhhubaubh~X.rk}rl(haX.hbjUubeubaubeubh)rm}rn(haUhbj*hchfhhhhj}ro(ho]hn]hl]hm]hr]Uentries]rp(hX3logHorizon (buildbot.config.MasterConfig attribute)hUtrqauhtNhuhh\]ubh)rr}rs(haUhbj*hchfhhhhj}rt(hhXpyho]hn]hl]hm]hr]hX attributeruhjuuhtNhuhh\]rv(j)rw}rx(haX logHorizonryhbjrhchfhhjhj}rz(ho]r{hajhhn]hl]hm]hr]r|haj XMasterConfig.logHorizonj jj uhtK(haUhbj*hchfhhhhj}r?(ho]hn]hl]hm]hr]Uentries]r@(hX3logMaxSize (buildbot.config.MasterConfig attribute)h UtrAauhtNhuhh\]ubh)rB}rC(haUhbj*hchfhhhhj}rD(hhXpyho]hn]hl]hm]hr]hX attributerEhjEuhtNhuhh\]rF(j)rG}rH(haX logMaxSizerIhbjBhchfhhjhj}rJ(ho]rKh ajhhn]hl]hm]hr]rLh aj XMasterConfig.logMaxSizej jj uhtKMhuhh\]rMj )rN}rO(hajIhbjGhchfhhj#hj}rP(hl]hm]hn]ho]hr]uhtKMhuhh\]rQh~X logMaxSizerRrS}rT(haUhbjNubaubaubj))rU}rV(haUhbjBhchfhhj,hj}rW(hl]hm]hn]ho]hr]uhtKMhuhh\]rXh)rY}rZ(haX8The current log maximum size, from :bb:cfg:`logMaxSize`.hbjUhchfhhhhj}r[(hl]hm]hn]ho]hr]uhtKLhuhh\]r\(h~X#The current log maximum size, from r]r^}r_(haX#The current log maximum size, from hbjYubh)r`}ra(haX:bb:cfg:`logMaxSize`rbhbjYhchfhhhhj}rc(UreftypeXcfghhX logMaxSizeU refdomainXbbrdho]hn]U refexplicithl]hm]hr]hhuhtKLh\]reh)rf}rg(hajbhj}rh(hl]hm]ri(hjdXbb-cfgrjehn]ho]hr]uhbj`h\]rkh~X logMaxSizerlrm}rn(haUhbjfubahhhubaubh~X.ro}rp(haX.hbjYubeubaubeubh)rq}rr(haUhbj*hchfhhhhj}rs(ho]hn]hl]hm]hr]Uentries]rt(hX7logMaxTailSize (buildbot.config.MasterConfig attribute)h&UtruauhtNhuhh\]ubh)rv}rw(haUhbj*hchfhhhhj}rx(hhXpyho]hn]hl]hm]hr]hX attributeryhjyuhtNhuhh\]rz(j)r{}r|(haXlogMaxTailSizer}hbjvhchfhhjhj}r~(ho]rh&ajhhn]hl]hm]hr]rh&aj XMasterConfig.logMaxTailSizej jj uhtKQhuhh\]rj )r}r(haj}hbj{hchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKQhuhh\]rh~XlogMaxTailSizerr}r(haUhbjubaubaubj))r}r(haUhbjvhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKQhuhh\]rh)r}r(haX<The current log maximum size, from :bb:cfg:`logMaxTailSize`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKPhuhh\]r(h~X#The current log maximum size, from rr}r(haX#The current log maximum size, from hbjubh)r}r(haX:bb:cfg:`logMaxTailSize`rhbjhchfhhhhj}r(UreftypeXcfghhXlogMaxTailSizeU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKPh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~XlogMaxTailSizerr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX3properties (buildbot.config.MasterConfig attribute)hUtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX propertiesrhbjhchfhhjhj}r(ho]rhajhhn]hl]hm]hr]rhaj XMasterConfig.propertiesj jj uhtKVhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKVhuhh\]rh~X propertiesrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKVhuhh\]rh)r}r(haXwA :py:class:`~buildbot.process.properties.Properties` instance containing global properties, from :bb:cfg:`properties`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKThuhh\]r(h~XA rr}r(haXA hbjubh)r}r(haX3:py:class:`~buildbot.process.properties.Properties`rhbjhchfhhhhj}r(UreftypeXclasshhX&buildbot.process.properties.PropertiesU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtKTh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~X Propertiesrr}r(haUhbjubahhhubaubh~X- instance containing global properties, from rr}r(haX- instance containing global properties, from hbjubh)r}r(haX:bb:cfg:`properties`rhbjhchfhhhhj}r(UreftypeXcfghhX propertiesU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKTh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X propertiesrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX6mergeRequests (buildbot.config.MasterConfig attribute)hUtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX mergeRequestsrhbjhchfhhjhj}r(ho]rhajhhn]hl]hm]hr]rhaj XMasterConfig.mergeRequestsj jj uhtK[huhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtK[huhh\]rh~X mergeRequestsrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtK[huhh\]rh)r}r(haX]A callable, or True or False, describing how to merge requests; from :bb:cfg:`mergeRequests`.hbjhchfhhhhj}r (hl]hm]hn]ho]hr]uhtKYhuhh\]r (h~XEA callable, or True or False, describing how to merge requests; from r r }r (haXEA callable, or True or False, describing how to merge requests; from hbjubh)r}r(haX:bb:cfg:`mergeRequests`rhbjhchfhhhhj}r(UreftypeXcfghhX mergeRequestsU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKYh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X mergeRequestsrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r (haUhbj*hchfhhhhj}r!(ho]hn]hl]hm]hr]Uentries]r"(hX;prioritizeBuilders (buildbot.config.MasterConfig attribute)h9Utr#auhtNhuhh\]ubh)r$}r%(haUhbj*hchfhhhhj}r&(hhXpyho]hn]hl]hm]hr]hX attributer'hj'uhtNhuhh\]r((j)r)}r*(haXprioritizeBuildersr+hbj$hchfhhjhj}r,(ho]r-h9ajhhn]hl]hm]hr]r.h9aj XMasterConfig.prioritizeBuildersj jj uhtK`huhh\]r/j )r0}r1(haj+hbj)hchfhhj#hj}r2(hl]hm]hn]ho]hr]uhtK`huhh\]r3h~XprioritizeBuildersr4r5}r6(haUhbj0ubaubaubj))r7}r8(haUhbj$hchfhhj,hj}r9(hl]hm]hn]ho]hr]uhtK`huhh\]r:h)r;}r<(haXTA callable, or None, used to prioritize builders; from :bb:cfg:`prioritizeBuilders`.hbj7hchfhhhhj}r=(hl]hm]hn]ho]hr]uhtK^huhh\]r>(h~X7A callable, or None, used to prioritize builders; from r?r@}rA(haX7A callable, or None, used to prioritize builders; from hbj;ubh)rB}rC(haX:bb:cfg:`prioritizeBuilders`rDhbj;hchfhhhhj}rE(UreftypeXcfghhXprioritizeBuildersU refdomainXbbrFho]hn]U refexplicithl]hm]hr]hhuhtK^h\]rGh)rH}rI(hajDhj}rJ(hl]hm]rK(hjFXbb-cfgrLehn]ho]hr]uhbjBh\]rMh~XprioritizeBuildersrNrO}rP(haUhbjHubahhhubaubh~X.rQ}rR(haX.hbj;ubeubaubeubh)rS}rT(haUhbj*hchfhhhhj}rU(ho]hn]hl]hm]hr]Uentries]rV(hX:codebaseGenerator (buildbot.config.MasterConfig attribute)h)UtrWauhtNhuhh\]ubh)rX}rY(haUhbj*hchfhhhhj}rZ(hhXpyho]hn]hl]hm]hr]hX attributer[hj[uhtNhuhh\]r\(j)r]}r^(haXcodebaseGeneratorr_hbjXhchfhhjhj}r`(ho]rah)ajhhn]hl]hm]hr]rbh)aj XMasterConfig.codebaseGeneratorj jj uhtKfhuhh\]rcj )rd}re(haj_hbj]hchfhhj#hj}rf(hl]hm]hn]ho]hr]uhtKfhuhh\]rgh~XcodebaseGeneratorrhri}rj(haUhbjdubaubaubj))rk}rl(haUhbjXhchfhhj,hj}rm(hl]hm]hn]ho]hr]uhtKfhuhh\]rnh)ro}rp(haXA callable, or None, used to determine the codebase from an incoming :py:class:`~buildbot.changes.changes.Change`, from :bb:cfg:`codebaseGenerator`hbjkhchfhhhhj}rq(hl]hm]hn]ho]hr]uhtKchuhh\]rr(h~XEA callable, or None, used to determine the codebase from an incoming rsrt}ru(haXEA callable, or None, used to determine the codebase from an incoming hbjoubh)rv}rw(haX,:py:class:`~buildbot.changes.changes.Change`rxhbjohchfhhhhj}ry(UreftypeXclasshhXbuildbot.changes.changes.ChangeU refdomainXpyrzho]hn]U refexplicithl]hm]hr]hhhjhhuhtKch\]r{h)r|}r}(hajxhj}r~(hl]hm]r(hjzXpy-classrehn]ho]hr]uhbjvh\]rh~XChangerr}r(haUhbj|ubahhhubaubh~X, from rr}r(haX, from hbjoubh)r}r(haX:bb:cfg:`codebaseGenerator`rhbjohchfhhhhj}r(UreftypeXcfghhXcodebaseGeneratorU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKch\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~XcodebaseGeneratorrr}r(haUhbjubahhhubaubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX2protocols (buildbot.config.MasterConfig attribute)hCUtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX protocolsrhbjhchfhhjhj}r(ho]rhCajhhn]hl]hm]hr]rhCaj XMasterConfig.protocolsj jj uhtKkhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKkhuhh\]rh~X protocolsrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKkhuhh\]rh)r}r(haXXThe per-protocol port specification for slave connections. Based on :bb:cfg:`protocols`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKihuhh\]r(h~XDThe per-protocol port specification for slave connections. Based on rr}r(haXDThe per-protocol port specification for slave connections. Based on hbjubh)r}r(haX:bb:cfg:`protocols`rhbjhchfhhhhj}r(UreftypeXcfghhX protocolsU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKih\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X protocolsrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX4multiMaster (buildbot.config.MasterConfig attribute)hUtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX multiMasterrhbjhchfhhjhj}r(ho]rhajhhn]hl]hm]hr]rhaj XMasterConfig.multiMasterj jj uhtKphuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKphuhh\]rh~X multiMasterrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKphuhh\]rh)r}r(haXOIf true, then this master is part of a cluster; based on :bb:cfg:`multiMaster`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKnhuhh\]r(h~X9If true, then this master is part of a cluster; based on rr}r(haX9If true, then this master is part of a cluster; based on hbjubh)r}r(haX:bb:cfg:`multiMaster`rhbjhchfhhhhj}r(UreftypeXcfghhX multiMasterU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKnh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X multiMasterrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX6debugPassword (buildbot.config.MasterConfig attribute)h(haXmanholer?hbj8hchfhhjhj}r@(ho]rAh ajhhn]hl]hm]hr]rBh aj XMasterConfig.manholej jj uhtKyhuhh\]rCj )rD}rE(haj?hbj=hchfhhj#hj}rF(hl]hm]hn]ho]hr]uhtKyhuhh\]rGh~XmanholerHrI}rJ(haUhbjDubaubaubj))rK}rL(haUhbj8hchfhhj,hj}rM(hl]hm]hn]ho]hr]uhtKyhuhh\]rNh)rO}rP(haX=The manhole instance to use, or None; from :bb:cfg:`manhole`.hbjKhchfhhhhj}rQ(hl]hm]hn]ho]hr]uhtKxhuhh\]rR(h~X+The manhole instance to use, or None; from rSrT}rU(haX+The manhole instance to use, or None; from hbjOubh)rV}rW(haX:bb:cfg:`manhole`rXhbjOhchfhhhhj}rY(UreftypeXcfghhXmanholeU refdomainXbbrZho]hn]U refexplicithl]hm]hr]hhuhtKxh\]r[h)r\}r](hajXhj}r^(hl]hm]r_(hjZXbb-cfgr`ehn]ho]hr]uhbjVh\]rah~Xmanholerbrc}rd(haUhbj\ubahhhubaubh~X.re}rf(haX.hbjOubeubaubeubh)rg}rh(haXYThe remaining attributes contain compound configuration structures, usually dictionaries:rihbj*hchfhhhhj}rj(hl]hm]hn]ho]hr]uhtKzhuhh\]rkh~XYThe remaining attributes contain compound configuration structures, usually dictionaries:rlrm}rn(hajihbjgubaubh)ro}rp(haUhbj*hchfhhhhj}rq(ho]hn]hl]hm]hr]Uentries]rr(hX3validation (buildbot.config.MasterConfig attribute)h5UtrsauhtNhuhh\]ubh)rt}ru(haUhbj*hchfhhhhj}rv(hhXpyho]hn]hl]hm]hr]hX attributerwhjwuhtNhuhh\]rx(j)ry}rz(haX validationr{hbjthchfhhjhj}r|(ho]r}h5ajhhn]hl]hm]hr]r~h5aj XMasterConfig.validationj jj uhtKhuhh\]rj )r}r(haj{hbjyhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~X validationrr}r(haUhbjubaubaubj))r}r(haUhbjthchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXValidation regular expressions, a dictionary from :bb:cfg:`validation`. It is safe to assume that all expected keys are present.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r(h~X2Validation regular expressions, a dictionary from rr}r(haX2Validation regular expressions, a dictionary from hbjubh)r}r(haX:bb:cfg:`validation`rhbjhchfhhhhj}r(UreftypeXcfghhX validationU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X validationrr}r(haUhbjubahhhubaubh~X:. It is safe to assume that all expected keys are present.rr}r(haX:. It is safe to assume that all expected keys are present.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX+db (buildbot.config.MasterConfig attribute)h#UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXdbrhbjhchfhhjhj}r(ho]rh#ajhhn]hl]hm]hr]rh#aj XMasterConfig.dbj jj uhtKhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~Xdbrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXDatabase specification, a dictionary with keys :bb:cfg:`db_url` and :bb:cfg:`db_poll_interval`. It is safe to assume that both keys are present.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r(h~X/Database specification, a dictionary with keys rr}r(haX/Database specification, a dictionary with keys hbjubh)r}r(haX:bb:cfg:`db_url`rhbjhchfhhhhj}r(UreftypeXcfghhXdb_urlU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~Xdb_urlrr}r(haUhbjubahhhubaubh~X and rr}r(haX and hbjubh)r}r(haX:bb:cfg:`db_poll_interval`rhbjhchfhhhhj}r(UreftypeXcfghhXdb_poll_intervalU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~Xdb_poll_intervalrr}r(haUhbjubahhhubaubh~X3. It is safe to assume that both keys are present.rr}r(haX3. It is safe to assume that both keys are present.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX0metrics (buildbot.config.MasterConfig attribute)h-UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXmetricsrhbjhchfhhjhj}r(ho]rh-ajhhn]hl]hm]hr]rh-aj XMasterConfig.metricsj jj uhtKhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~Xmetricsrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXTThe metrics configuration from :bb:cfg:`metrics`, or an empty dictionary by default.hbjhchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r (h~XThe metrics configuration from r r }r (haXThe metrics configuration from hbjubh)r}r(haX:bb:cfg:`metrics`rhbjhchfhhhhj}r(UreftypeXcfghhXmetricsU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~Xmetricsrr}r(haUhbjubahhhubaubh~X$, or an empty dictionary by default.rr}r(haX$, or an empty dictionary by default.hbjubeubaubeubh)r }r!(haUhbj*hchfhhhhj}r"(ho]hn]hl]hm]hr]Uentries]r#(hX/caches (buildbot.config.MasterConfig attribute)hDUtr$auhtNhuhh\]ubh)r%}r&(haUhbj*hchfhhhhj}r'(hhXpyho]hn]hl]hm]hr]hX attributer(hj(uhtNhuhh\]r)(j)r*}r+(haXcachesr,hbj%hchfhhjhj}r-(ho]r.hDajhhn]hl]hm]hr]r/hDaj XMasterConfig.cachesj jj uhtKhuhh\]r0j )r1}r2(haj,hbj*hchfhhj#hj}r3(hl]hm]hn]ho]hr]uhtKhuhh\]r4h~Xcachesr5r6}r7(haUhbj1ubaubaubj))r8}r9(haUhbj%hchfhhj,hj}r:(hl]hm]hn]ho]hr]uhtKhuhh\]r;(h)r<}r=(haXThe cache configuration, from :bb:cfg:`caches` as well as the deprecated :bb:cfg:`buildCacheSize` and :bb:cfg:`changeCacheSize` parameters.hbj8hchfhhhhj}r>(hl]hm]hn]ho]hr]uhtKhuhh\]r?(h~XThe cache configuration, from r@rA}rB(haXThe cache configuration, from hbj<ubh)rC}rD(haX:bb:cfg:`caches`rEhbj<hchfhhhhj}rF(UreftypeXcfghhXcachesU refdomainXbbrGho]hn]U refexplicithl]hm]hr]hhuhtKh\]rHh)rI}rJ(hajEhj}rK(hl]hm]rL(hjGXbb-cfgrMehn]ho]hr]uhbjCh\]rNh~XcachesrOrP}rQ(haUhbjIubahhhubaubh~X as well as the deprecated rRrS}rT(haX as well as the deprecated hbj<ubh)rU}rV(haX:bb:cfg:`buildCacheSize`rWhbj<hchfhhhhj}rX(UreftypeXcfghhXbuildCacheSizeU refdomainXbbrYho]hn]U refexplicithl]hm]hr]hhuhtKh\]rZh)r[}r\(hajWhj}r](hl]hm]r^(hjYXbb-cfgr_ehn]ho]hr]uhbjUh\]r`h~XbuildCacheSizerarb}rc(haUhbj[ubahhhubaubh~X and rdre}rf(haX and hbj<ubh)rg}rh(haX:bb:cfg:`changeCacheSize`rihbj<hchfhhhhj}rj(UreftypeXcfghhXchangeCacheSizeU refdomainXbbrkho]hn]U refexplicithl]hm]hr]hhuhtKh\]rlh)rm}rn(hajihj}ro(hl]hm]rp(hjkXbb-cfgrqehn]ho]hr]uhbjgh\]rrh~XchangeCacheSizersrt}ru(haUhbjmubahhhubaubh~X parameters.rvrw}rx(haX parameters.hbj<ubeubh)ry}rz(haXsThe keys ``Builds`` and ``Caches`` are always available; other keys should use ``config.caches.get(cachename, 1)``.hbj8hchfhhhhj}r{(hl]hm]hn]ho]hr]uhtKhuhh\]r|(h~X The keys r}r~}r(haX The keys hbjyubh)r}r(haX ``Builds``hj}r(hl]hm]hn]ho]hr]uhbjyh\]rh~XBuildsrr}r(haUhbjubahhhubh~X and rr}r(haX and hbjyubh)r}r(haX ``Caches``hj}r(hl]hm]hn]ho]hr]uhbjyh\]rh~XCachesrr}r(haUhbjubahhhubh~X- are always available; other keys should use rr}r(haX- are always available; other keys should use hbjyubh)r}r(haX#``config.caches.get(cachename, 1)``hj}r(hl]hm]hn]ho]hr]uhbjyh\]rh~Xconfig.caches.get(cachename, 1)rr}r(haUhbjubahhhubh~X.r}r(haX.hbjyubeubeubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX3schedulers (buildbot.config.MasterConfig attribute)h6UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX schedulersrhbjhchfhhjhj}r(ho]rh6ajhhn]hl]hm]hr]rh6aj XMasterConfig.schedulersj jj uhtKhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~X schedulersrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXJThe dictionary of scheduler instances, by name, from :bb:cfg:`schedulers`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r(h~X5The dictionary of scheduler instances, by name, from rr}r(haX5The dictionary of scheduler instances, by name, from hbjubh)r}r(haX:bb:cfg:`schedulers`rhbjhchfhhhhj}r(UreftypeXcfghhX schedulersU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X schedulersrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX1builders (buildbot.config.MasterConfig attribute)hUtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXbuildersrhbjhchfhhjhj}r(ho]rhajhhn]hl]hm]hr]rhaj XMasterConfig.buildersj jj uhtKhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~Xbuildersrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXThe list of :py:class:`BuilderConfig` instances from :bb:cfg:`builders`. Builders specified as dictionaries in the configuration file are converted to instances.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r(h~X The list of rr}r(haX The list of hbjubh)r}r(haX:py:class:`BuilderConfig`rhbjhchfhhhhj}r(UreftypeXclasshhX BuilderConfigU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~X BuilderConfigrr}r(haUhbjubahhhubaubh~X instances from rr}r(haX instances from hbjubh)r}r(haX:bb:cfg:`builders`rhbjhchfhhhhj}r (UreftypeXcfghhXbuildersU refdomainXbbr ho]hn]U refexplicithl]hm]hr]hhuhtKh\]r h)r }r (hajhj}r(hl]hm]r(hj Xbb-cfgrehn]ho]hr]uhbjh\]rh~Xbuildersrr}r(haUhbj ubahhhubaubh~X[. Builders specified as dictionaries in the configuration file are converted to instances.rr}r(haX[. Builders specified as dictionaries in the configuration file are converted to instances.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX/slaves (buildbot.config.MasterConfig attribute)h%UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r!(j)r"}r#(haXslavesr$hbjhchfhhjhj}r%(ho]r&h%ajhhn]hl]hm]hr]r'h%aj XMasterConfig.slavesj jj uhtKhuhh\]r(j )r)}r*(haj$hbj"hchfhhj#hj}r+(hl]hm]hn]ho]hr]uhtKhuhh\]r,h~Xslavesr-r.}r/(haUhbj)ubaubaubj))r0}r1(haUhbjhchfhhj,hj}r2(hl]hm]hn]ho]hr]uhtKhuhh\]r3h)r4}r5(haXCThe list of :py:class:`BuildSlave` instances from :bb:cfg:`slaves`.hbj0hchfhhhhj}r6(hl]hm]hn]ho]hr]uhtKhuhh\]r7(h~X The list of r8r9}r:(haX The list of hbj4ubh)r;}r<(haX:py:class:`BuildSlave`r=hbj4hchfhhhhj}r>(UreftypeXclasshhX BuildSlaveU refdomainXpyr?ho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]r@h)rA}rB(haj=hj}rC(hl]hm]rD(hj?Xpy-classrEehn]ho]hr]uhbj;h\]rFh~X BuildSlaverGrH}rI(haUhbjAubahhhubaubh~X instances from rJrK}rL(haX instances from hbj4ubh)rM}rN(haX:bb:cfg:`slaves`rOhbj4hchfhhhhj}rP(UreftypeXcfghhXslavesU refdomainXbbrQho]hn]U refexplicithl]hm]hr]hhuhtKh\]rRh)rS}rT(hajOhj}rU(hl]hm]rV(hjQXbb-cfgrWehn]ho]hr]uhbjMh\]rXh~XslavesrYrZ}r[(haUhbjSubahhhubaubh~X.r\}r](haX.hbj4ubeubaubeubh)r^}r_(haUhbj*hchfhhhhj}r`(ho]hn]hl]hm]hr]Uentries]ra(hX7change_sources (buildbot.config.MasterConfig attribute)h,UtrbauhtNhuhh\]ubh)rc}rd(haUhbj*hchfhhhhj}re(hhXpyho]hn]hl]hm]hr]hX attributerfhjfuhtNhuhh\]rg(j)rh}ri(haXchange_sourcesrjhbjchchfhhjhj}rk(ho]rlh,ajhhn]hl]hm]hr]rmh,aj XMasterConfig.change_sourcesj jj uhtKhuhh\]rnj )ro}rp(hajjhbjhhchfhhj#hj}rq(hl]hm]hn]ho]hr]uhtKhuhh\]rrh~Xchange_sourcesrsrt}ru(haUhbjoubaubaubj))rv}rw(haUhbjchchfhhj,hj}rx(hl]hm]hn]ho]hr]uhtKhuhh\]ryh)rz}r{(haXMThe list of :py:class:`IChangeSource` providers from :bb:cfg:`change_source`.hbjvhchfhhhhj}r|(hl]hm]hn]ho]hr]uhtKhuhh\]r}(h~X The list of r~r}r(haX The list of hbjzubh)r}r(haX:py:class:`IChangeSource`rhbjzhchfhhhhj}r(UreftypeXclasshhX IChangeSourceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~X IChangeSourcerr}r(haUhbjubahhhubaubh~X providers from rr}r(haX providers from hbjzubh)r}r(haX:bb:cfg:`change_source`rhbjzhchfhhhhj}r(UreftypeXcfghhX change_sourceU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X change_sourcerr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjzubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX/status (buildbot.config.MasterConfig attribute)h2UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXstatusrhbjhchfhhjhj}r(ho]rh2ajhhn]hl]hm]hr]rh2aj XMasterConfig.statusj jj uhtKhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~Xstatusrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXHThe list of :py:class:`IStatusReceiver` providers from :bb:cfg:`status`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r(h~X The list of rr}r(haX The list of hbjubh)r}r(haX:py:class:`IStatusReceiver`rhbjhchfhhhhj}r(UreftypeXclasshhXIStatusReceiverU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~XIStatusReceiverrr}r(haUhbjubahhhubaubh~X providers from rr}r(haX providers from hbjubh)r}r(haX:bb:cfg:`status`rhbjhchfhhhhj}r(UreftypeXcfghhXstatusU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~Xstatusrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haUhbj*hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX6user_managers (buildbot.config.MasterConfig attribute)h'UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX user_managersrhbjhchfhhjhj}r(ho]rh'ajhhn]hl]hm]hr]rh'aj XMasterConfig.user_managersj jj uhtKhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh~X user_managersrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKhuhh\]rh)r}r(haXAThe list of user managers providers from :bb:cfg:`user_managers`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r (h~X)The list of user managers providers from r r }r (haX)The list of user managers providers from hbjubh)r }r(haX:bb:cfg:`user_managers`rhbjhchfhhhhj}r(UreftypeXcfghhX user_managersU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbj h\]rh~X user_managersrr}r(haUhbjubahhhubaubh~X.r}r(haX.hbjubeubaubeubh)r}r(haXdLoading of the configuration file is generally triggered by the master, using the following methods:r hbj*hchfhhhhj}r!(hl]hm]hn]ho]hr]uhtKhuhh\]r"h~XdLoading of the configuration file is generally triggered by the master, using the following methods:r#r$}r%(haj hbjubaubh)r&}r'(haUhbj*hchfhhhhj}r((ho]hn]hl]hm]hr]Uentries]r)(hX8loadConfig() (buildbot.config.MasterConfig class method)h>Utr*auhtNhuhh\]ubh)r+}r,(haUhbj*hchfhhhhj}r-(hhXpyr.ho]hn]hl]hm]hr]hX classmethodr/hj/uhtNhuhh\]r0(j)r1}r2(haXloadConfig(basedir, filename)hbj+hchfhhjhj}r3(ho]r4h>ajhhn]hl]hm]hr]r5h>aj XMasterConfig.loadConfigj jj uhtKhuhh\]r6(j)r7}r8(haU classmethod r9hbj1hchfhhjhj}r:(hl]hm]hn]ho]hr]uhtKhuhh\]r;h~X classmethod r<r=}r>(haUhbj7ubaubj )r?}r@(haX loadConfighbj1hchfhhj#hj}rA(hl]hm]hn]ho]hr]uhtKhuhh\]rBh~X loadConfigrCrD}rE(haUhbj?ubaubcsphinx.addnodes desc_parameterlist rF)rG}rH(haUhbj1hchfhhUdesc_parameterlistrIhj}rJ(hl]hm]hn]ho]hr]uhtKhuhh\]rK(csphinx.addnodes desc_parameter rL)rM}rN(haXbasedirhj}rO(hl]hm]hn]ho]hr]uhbjGh\]rPh~XbasedirrQrR}rS(haUhbjMubahhUdesc_parameterrTubjL)rU}rV(haXfilenamehj}rW(hl]hm]hn]ho]hr]uhbjGh\]rXh~XfilenamerYrZ}r[(haUhbjUubahhjTubeubeubj))r\}r](haUhbj+hchfhhj,hj}r^(hl]hm]hn]ho]hr]uhtKhuhh\]r_(cdocutils.nodes field_list r`)ra}rb(haUhbj\hchfhhU field_listrchj}rd(hl]hm]hn]ho]hr]uhtNhuhh\]re(cdocutils.nodes field rf)rg}rh(haUhj}ri(hl]hm]hn]ho]hr]uhbjah\]rj(cdocutils.nodes field_name rk)rl}rm(haUhj}rn(hl]hm]hn]ho]hr]uhbjgh\]roh~X Parametersrprq}rr(haUhbjlubahhU field_namersubcdocutils.nodes field_body rt)ru}rv(haUhj}rw(hl]hm]hn]ho]hr]uhbjgh\]rxcdocutils.nodes bullet_list ry)rz}r{(haUhj}r|(hl]hm]hn]ho]hr]uhbjuh\]r}(cdocutils.nodes list_item r~)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjzh\]rh)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjh\]r(cdocutils.nodes strong r)r}r(haXbasedirhj}r(hl]hm]hn]ho]hr]uhbjh\]rh~Xbasedirrr}r(haUhbjubahhUstrongrubh~X (rr}r(haUhbjubh)r}r(haUhj}r(UreftypeUobjrU reftargetXstringrU refdomainj.ho]hn]U refexplicithl]hm]hr]uhbjh\]rh)r}r(hajhj}r(hl]hm]hn]ho]hr]uhbjh\]rh~Xstringrr}r(haUhbjubahhhubahhhubh~X)r}r(haUhbjubh~X -- rr}r(haUhbjubh~X%directory to which config is relativerr}r(haX%directory to which config is relativehbjubehhhubahhU list_itemrubj~)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjzh\]rh)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjh\]r(j)r}r(haXfilenamehj}r(hl]hm]hn]ho]hr]uhbjh\]rh~Xfilenamerr}r(haUhbjubahhjubh~X (rr}r(haUhbjubh)r}r(haUhj}r(UreftypejU reftargetXstringrU refdomainj.ho]hn]U refexplicithl]hm]hr]uhbjh\]rh)r}r(hajhj}r(hl]hm]hn]ho]hr]uhbjh\]rh~Xstringrr}r(haUhbjubahhhubahhhubh~X)r}r(haUhbjubh~X -- rr}r(haUhbjubh~Xthe configuration file to loadrr}r(haXthe configuration file to loadhbjubehhhubahhjubehhU bullet_listrubahhU field_bodyrubehhUfieldrubjf)r}r(haUhbjahchfhhjhj}r(hl]hm]hn]ho]hr]uhtKhuhh\]r(jk)r}r(haXraiseshj}r(hl]hm]hn]ho]hr]uhbjh\]rh~XRaisesrr}r(haUhbjubahhjsubjt)r}r(haX*:py:exc:`ConfigErrors` if any errors occurrhj}r(hl]hm]hn]ho]hr]uhbjh\]rh)r}r(hajhbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKh\]r(h)r}r(haX:py:exc:`ConfigErrors`rhbjhchfhhhhj}r(UreftypeXexchhX ConfigErrorsU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-excrehn]ho]hr]uhbjh\]rh~X ConfigErrorsrr}r(haUhbjubahhhubaubh~X if any errors occurrr}r(haX if any errors occurhbjubeubahhjubeubjf)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjah\]r(jk)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjh\]rh~XReturnsr r }r (haUhbjubahhjsubjt)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbjh\]r h)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r (h~Xnew r r }r (haXnew hbj ubh)r }r (haX:py:class:`MasterConfig`r hbj hchfhhhhj}r (UreftypeXclasshhX MasterConfigU refdomainXpyr ho]hn]U refexplicithl]hm]hr]hhhjhhuhtKh\]r h)r }r (haj hj}r (hl]hm]r (hj Xpy-classr ehn]ho]hr]uhbj h\]r h~X MasterConfigr r }r (haUhbj ubahhhubaubh~X instancer r }r (haX instancehbj ubehhhubahhjubehhjubeubh)r }r! (haXLoad the configuration in the given file. Aside from syntax errors, this will also detect a number of semantic errors such as multiple schedulers with the same name.r" hbj\hchfhhhhj}r# (hl]hm]hn]ho]hr]uhtKhuhh\]r$ h~XLoad the configuration in the given file. Aside from syntax errors, this will also detect a number of semantic errors such as multiple schedulers with the same name.r% r& }r' (haj" hbj ubaubh)r( }r) (haXJThe filename is treated as relative to the basedir, if it is not absolute.r* hbj\hchfhhhhj}r+ (hl]hm]hn]ho]hr]uhtKhuhh\]r, h~XJThe filename is treated as relative to the basedir, if it is not absolute.r- r. }r/ (haj* hbj( ubaubeubeubeubeubh^)r0 }r1 (haUhbh_hchfhhhihj}r2 (hl]hm]hn]ho]r3 hZahr]r4 h@auhtKhuhh\]r5 (hw)r6 }r7 (haXBuilder Configurationr8 hbj0 hchfhhh{hj}r9 (hl]hm]hn]ho]hr]uhtKhuhh\]r: h~XBuilder Configurationr; r< }r= (haj8 hbj6 ubaubh)r> }r? (haUhbj0 hcNhhhhj}r@ (ho]hn]hl]hm]hr]Uentries]rA (hX(BuilderConfig (class in buildbot.config)h;UtrB auhtNhuhh\]ubh)rC }rD (haUhbj0 hcNhhhhj}rE (hhXpyho]hn]hl]hm]hr]hXclassrF hjF uhtNhuhh\]rG (j)rH }rI (haXBuilderConfig([keyword args])hbjC hchfhhjhj}rJ (ho]rK h;ajhhn]hl]hm]hr]rL h;aj X BuilderConfigrM j Uj uhtMhuhh\]rN (j)rO }rP (haXclass hbjH hchfhhjhj}rQ (hl]hm]hn]ho]hr]uhtMhuhh\]rR h~Xclass rS rT }rU (haUhbjO ubaubj)rV }rW (haXbuildbot.config.hbjH hchfhhjhj}rX (hl]hm]hn]ho]hr]uhtMhuhh\]rY h~Xbuildbot.config.rZ r[ }r\ (haUhbjV ubaubj )r] }r^ (hajM hbjH hchfhhj#hj}r_ (hl]hm]hn]ho]hr]uhtMhuhh\]r` h~X BuilderConfigra rb }rc (haUhbj] ubaubjF)rd }re (haUhbjH hchfhhjIhj}rf (hl]hm]hn]ho]hr]uhtMhuhh\]rg csphinx.addnodes desc_optional rh )ri }rj (haUhj}rk (hl]hm]hn]ho]hr]uhbjd h\]rl jL)rm }rn (haX keyword argshj}ro (hl]hm]hn]ho]hr]uhbji h\]rp h~X keyword argsrq rr }rs (haUhbjm ubahhjTubahhU desc_optionalrt ubaubeubj))ru }rv (haUhbjC hchfhhj,hj}rw (hl]hm]hn]ho]hr]uhtMhuhh\]rx (h)ry }rz (haXThis class parameterizes configuration of builders; see :ref:`Builder-Configuration` for its arguments. The constructor checks for errors and applies defaults, and sets the properties described here. Most are simply copied from the constructor argument of the same name.hbju hchfhhhhj}r{ (hl]hm]hn]ho]hr]uhtKhuhh\]r| (h~X8This class parameterizes configuration of builders; see r} r~ }r (haX8This class parameterizes configuration of builders; see hbjy ubh)r }r (haX:ref:`Builder-Configuration`r hbjy hchfhhhhj}r (UreftypeXrefhhXbuilder-configurationU refdomainXstdr ho]hn]U refexplicithl]hm]hr]hhuhtKh\]r h)r }r (haj hj}r (hl]hm]r (hj Xstd-refr ehn]ho]hr]uhbj h\]r h~XBuilder-Configurationr r }r (haUhbj ubahhhubaubh~X for its arguments. The constructor checks for errors and applies defaults, and sets the properties described here. Most are simply copied from the constructor argument of the same name.r r }r (haX for its arguments. The constructor checks for errors and applies defaults, and sets the properties described here. Most are simply copied from the constructor argument of the same name.hbjy ubeubh)r }r (haX;Users may subclass this class to add defaults, for example.r hbju hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X;Users may subclass this class to add defaults, for example.r r }r (haj hbj ubaubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX.name (buildbot.config.BuilderConfig attribute)hAUtr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haXnamer hbj hchfhhjhj}r (ho]r hAajhhn]hl]hm]hr]r hAaj XBuilderConfig.namej jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~Xnamer r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haXThe builder's name.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~XThe builder's name.r r }r (haj hbj ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX1factory (buildbot.config.BuilderConfig attribute)h(Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haXfactoryr hbj hchfhhjhj}r (ho]r h(ajhhn]hl]hm]hr]r h(aj XBuilderConfig.factoryj jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~Xfactoryr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haXThe builder's factory.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~XThe builder's factory.r r }r (haj hbj ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX4slavenames (buildbot.config.BuilderConfig attribute)hUtr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haX slavenamesr hbj hchfhhjhj}r (ho]r hajhhn]hl]hm]hr]r haj XBuilderConfig.slavenamesj jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X slavenamesr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haXxThe builder's slave names (a list, regardless of whether the names were specified with ``slavename`` or ``slavenames``).hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r (h~XWThe builder's slave names (a list, regardless of whether the names were specified with r r }r (haXWThe builder's slave names (a list, regardless of whether the names were specified with hbj ubh)r }r (haX ``slavename``hj}r (hl]hm]hn]ho]hr]uhbj h\]r h~X slavenamer r }r (haUhbj ubahhhubh~X or r r }r (haX or hbj ubh)r }r (haX``slavenames``hj}r (hl]hm]hn]ho]hr]uhbj h\]r h~X slavenamesr r }r (haUhbj ubahhhubh~X).r r }r (haX).hbj ubeubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX2builddir (buildbot.config.BuilderConfig attribute)h"Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer! hj! uhtNhuhh\]r" (j)r# }r$ (haXbuilddirr% hbj hchfhhjhj}r& (ho]r' h"ajhhn]hl]hm]hr]r( h"aj XBuilderConfig.builddirj jM j uhtKhuhh\]r) j )r* }r+ (haj% hbj# hchfhhj#hj}r, (hl]hm]hn]ho]hr]uhtKhuhh\]r- h~Xbuilddirr. r/ }r0 (haUhbj* ubaubaubj))r1 }r2 (haUhbj hchfhhj,hj}r3 (hl]hm]hn]ho]hr]uhtKhuhh\]r4 h)r5 }r6 (haXThe builder's builddir.r7 hbj1 hchfhhhhj}r8 (hl]hm]hn]ho]hr]uhtKhuhh\]r9 h~XThe builder's builddir.r: r; }r< (haj7 hbj5 ubaubaubeubh)r= }r> (haUhbju hchfhhhhj}r? (ho]hn]hl]hm]hr]Uentries]r@ (hX7slavebuilddir (buildbot.config.BuilderConfig attribute)hUtrA auhtNhuhh\]ubh)rB }rC (haUhbju hchfhhhhj}rD (hhXpyho]hn]hl]hm]hr]hX attributerE hjE uhtNhuhh\]rF (j)rG }rH (haX slavebuilddirrI hbjB hchfhhjhj}rJ (ho]rK hajhhn]hl]hm]hr]rL haj XBuilderConfig.slavebuilddirj jM j uhtKhuhh\]rM j )rN }rO (hajI hbjG hchfhhj#hj}rP (hl]hm]hn]ho]hr]uhtKhuhh\]rQ h~X slavebuilddirrR rS }rT (haUhbjN ubaubaubj))rU }rV (haUhbjB hchfhhj,hj}rW (hl]hm]hn]ho]hr]uhtKhuhh\]rX h)rY }rZ (haX"The builder's slave-side builddir.r[ hbjU hchfhhhhj}r\ (hl]hm]hn]ho]hr]uhtKhuhh\]r] h~X"The builder's slave-side builddir.r^ r_ }r` (haj[ hbjY ubaubaubeubh)ra }rb (haUhbju hchfhhhhj}rc (ho]hn]hl]hm]hr]Uentries]rd (hX2category (buildbot.config.BuilderConfig attribute)hUtre auhtNhuhh\]ubh)rf }rg (haUhbju hchfhhhhj}rh (hhXpyho]hn]hl]hm]hr]hX attributeri hji uhtNhuhh\]rj (j)rk }rl (haXcategoryrm hbjf hchfhhjhj}rn (ho]ro hajhhn]hl]hm]hr]rp haj XBuilderConfig.categoryj jM j uhtKhuhh\]rq j )rr }rs (hajm hbjk hchfhhj#hj}rt (hl]hm]hn]ho]hr]uhtKhuhh\]ru h~Xcategoryrv rw }rx (haUhbjr ubaubaubj))ry }rz (haUhbjf hchfhhj,hj}r{ (hl]hm]hn]ho]hr]uhtKhuhh\]r| h)r} }r~ (haXThe builder's category.r hbjy hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~XThe builder's category.r r }r (haj hbj} ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX3nextSlave (buildbot.config.BuilderConfig attribute)h Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haX nextSlaver hbj hchfhhjhj}r (ho]r h ajhhn]hl]hm]hr]r h aj XBuilderConfig.nextSlavej jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X nextSlaver r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haX!The builder's nextSlave callable.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X!The builder's nextSlave callable.r r }r (haj hbj ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX3nextBuild (buildbot.config.BuilderConfig attribute)h8Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haX nextBuildr hbj hchfhhjhj}r (ho]r h8ajhhn]hl]hm]hr]r h8aj XBuilderConfig.nextBuildj jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X nextBuildr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haX!The builder's nextBuild callable.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X!The builder's nextBuild callable.r r }r (haj hbj ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX7canStartBuild (buildbot.config.BuilderConfig attribute)h3Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haX canStartBuildr hbj hchfhhjhj}r (ho]r h3ajhhn]hl]hm]hr]r h3aj XBuilderConfig.canStartBuildj jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X canStartBuildr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haX%The builder's canStartBuild callable.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~X%The builder's canStartBuild callable.r r }r (haj hbj ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX/locks (buildbot.config.BuilderConfig attribute)hUtr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haXlocksr hbj hchfhhjhj}r (ho]r hajhhn]hl]hm]hr]r haj XBuilderConfig.locksj jM j uhtKhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~Xlocksr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h)r }r (haXThe builder's locks.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtKhuhh\]r h~XThe builder's locks.r r }r (haj hbj ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX-env (buildbot.config.BuilderConfig attribute)h+Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haXenvr! hbj hchfhhjhj}r" (ho]r# h+ajhhn]hl]hm]hr]r$ h+aj XBuilderConfig.envj jM j uhtKhuhh\]r% j )r& }r' (haj! hbj hchfhhj#hj}r( (hl]hm]hn]ho]hr]uhtKhuhh\]r) h~Xenvr* r+ }r, (haUhbj& ubaubaubj))r- }r. (haUhbj hchfhhj,hj}r/ (hl]hm]hn]ho]hr]uhtKhuhh\]r0 h)r1 }r2 (haX$The builder's environmnet variables.r3 hbj- hchfhhhhj}r4 (hl]hm]hn]ho]hr]uhtKhuhh\]r5 h~X$The builder's environmnet variables.r6 r7 }r8 (haj3 hbj1 ubaubaubeubh)r9 }r: (haUhbju hchfhhhhj}r; (ho]hn]hl]hm]hr]Uentries]r< (hX4properties (buildbot.config.BuilderConfig attribute)h/Utr= auhtNhuhh\]ubh)r> }r? (haUhbju hchfhhhhj}r@ (hhXpyho]hn]hl]hm]hr]hX attributerA hjA uhtNhuhh\]rB (j)rC }rD (haX propertiesrE hbj> hchfhhjhj}rF (ho]rG h/ajhhn]hl]hm]hr]rH h/aj XBuilderConfig.propertiesj jM j uhtMhuhh\]rI j )rJ }rK (hajE hbjC hchfhhj#hj}rL (hl]hm]hn]ho]hr]uhtMhuhh\]rM h~X propertiesrN rO }rP (haUhbjJ ubaubaubj))rQ }rR (haUhbj> hchfhhj,hj}rS (hl]hm]hn]ho]hr]uhtMhuhh\]rT h)rU }rV (haX*The builder's properties, as a dictionary.rW hbjQ hchfhhhhj}rX (hl]hm]hn]ho]hr]uhtKhuhh\]rY h~X*The builder's properties, as a dictionary.rZ r[ }r\ (hajW hbjU ubaubaubeubh)r] }r^ (haUhbju hchfhhhhj}r_ (ho]hn]hl]hm]hr]Uentries]r` (hX7mergeRequests (buildbot.config.BuilderConfig attribute)hUtra auhtNhuhh\]ubh)rb }rc (haUhbju hchfhhhhj}rd (hhXpyho]hn]hl]hm]hr]hX attributere hje uhtNhuhh\]rf (j)rg }rh (haX mergeRequestsri hbjb hchfhhjhj}rj (ho]rk hajhhn]hl]hm]hr]rl haj XBuilderConfig.mergeRequestsj jM j uhtMhuhh\]rm j )rn }ro (haji hbjg hchfhhj#hj}rp (hl]hm]hn]ho]hr]uhtMhuhh\]rq h~X mergeRequestsrr rs }rt (haUhbjn ubaubaubj))ru }rv (haUhbjb hchfhhj,hj}rw (hl]hm]hn]ho]hr]uhtMhuhh\]rx h)ry }rz (haX%The builder's mergeRequests callable.r{ hbju hchfhhhhj}r| (hl]hm]hn]ho]hr]uhtMhuhh\]r} h~X%The builder's mergeRequests callable.r~ r }r (haj{ hbjy ubaubaubeubh)r }r (haUhbju hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX5description (buildbot.config.BuilderConfig attribute)h!Utr auhtNhuhh\]ubh)r }r (haUhbju hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haX descriptionr hbj hchfhhjhj}r (ho]r h!ajhhn]hl]hm]hr]r h!aj XBuilderConfig.descriptionj jM j uhtMhuhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h~X descriptionr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h)r }r (haX7The builder's description, displayed in the web status.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h~X7The builder's description, displayed in the web status.r r }r (haj hbj ubaubaubeubeubeubeubh^)r }r (haUhbh_hchfhhhihj}r (hl]hm]hn]ho]r hQahr]r hauhtM huhh\]r (hw)r }r (haXError Handlingr hbj hchfhhh{hj}r (hl]hm]hn]ho]hr]uhtM huhh\]r h~XError Handlingr r }r (haj hbj ubaubh)r }r (haX7If any errors are encountered while loading the configuration :py:func:`buildbot.config.error` should be called. This can occur both in the configuration-loading code, and in the constructors of any objects that are instantiated in the configuration - change sources, slaves, schedulers, build steps, and so on.hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtM huhh\]r (h~X>If any errors are encountered while loading the configuration r r }r (haX>If any errors are encountered while loading the configuration hbj ubh)r }r (haX :py:func:`buildbot.config.error`r hbj hchfhhhhj}r (UreftypeXfunchhXbuildbot.config.errorU refdomainXpyr ho]hn]U refexplicithl]hm]hr]hhhNhhuhtM h\]r h)r }r (haj hj}r (hl]hm]r (hj Xpy-funcr ehn]ho]hr]uhbj h\]r h~Xbuildbot.config.errorr r }r (haUhbj ubahhhubaubh~X should be called. This can occur both in the configuration-loading code, and in the constructors of any objects that are instantiated in the configuration - change sources, slaves, schedulers, build steps, and so on.r r }r (haX should be called. This can occur both in the configuration-loading code, and in the constructors of any objects that are instantiated in the configuration - change sources, slaves, schedulers, build steps, and so on.hbj ubeubh)r }r (haUhbj hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX#error() (in module buildbot.config)h4Utr auhtNhuhh\]ubh)r }r (haUhbj hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hXfunctionr hj uhtNhuhh\]r (j)r }r (haX error(error)hbj hchfhhjhj}r (ho]r h4ajhhn]hl]hm]hr]r h4aj Xerrorr j Uj uhtMhuhh\]r (j)r }r (haXbuildbot.config.hbj hchfhhjhj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h~Xbuildbot.config.r r }r (haUhbj ubaubj )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h~Xerrorr r }r (haUhbj ubaubjF)r }r (haUhbj hchfhhjIhj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r jL)r }r (haXerrorhj}r (hl]hm]hn]ho]hr]uhbj h\]r h~Xerrorr r }r (haUhbj ubahhjTubaubeubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r (j`)r }r (haUhbj hchfhhjchj}r (hl]hm]hn]ho]hr]uhtNhuhh\]r (jf)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r (jk)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r h~X Parametersr r }r (haUhbj ubahhjsubjt)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r h)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r (j)r }r (haXerrorhj}r (hl]hm]hn]ho]hr]uhbj h\]r h~Xerrorr r }r (haUhbj ubahhjubh~X -- r r }r (haUhbj ubh~Xerror to reportr r }r (haXerror to reporthbj ubehhhubahhjubehhjubjf)r }r (haUhbj hchfhhjhj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r! (jk)r" }r# (haXraiseshj}r$ (hl]hm]hn]ho]hr]uhbj h\]r% h~XRaisesr& r' }r( (haUhbj" ubahhjsubjt)r) }r* (haX/:py:exc:`ConfigErrors` if called at build-time hj}r+ (hl]hm]hn]ho]hr]uhbj h\]r, h)r- }r. (haX.:py:exc:`ConfigErrors` if called at build-timehbj) hchfhhhhj}r/ (hl]hm]hn]ho]hr]uhtMh\]r0 (h)r1 }r2 (haX:py:exc:`ConfigErrors`r3 hbj- hchfhhhhj}r4 (UreftypeXexchhX ConfigErrorsU refdomainXpyr5 ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]r6 h)r7 }r8 (haj3 hj}r9 (hl]hm]r: (hj5 Xpy-excr; ehn]ho]hr]uhbj1 h\]r< h~X ConfigErrorsr= r> }r? (haUhbj7 ubahhhubaubh~X if called at build-timer@ rA }rB (haX if called at build-timehbj- ubeubahhjubeubeubh)rC }rD (haX6This function reports a configuration error. If a config file is being loaded, then the function merely records the error, and allows the rest of the configuration to be loaded. At any other time, it raises :py:exc:`ConfigErrors`. This is done so all config errors can be reported, rather than just the first.hbj hchfhhhhj}rE (hl]hm]hn]ho]hr]uhtMhuhh\]rF (h~XThis function reports a configuration error. If a config file is being loaded, then the function merely records the error, and allows the rest of the configuration to be loaded. At any other time, it raises rG rH }rI (haXThis function reports a configuration error. If a config file is being loaded, then the function merely records the error, and allows the rest of the configuration to be loaded. At any other time, it raises hbjC ubh)rJ }rK (haX:py:exc:`ConfigErrors`rL hbjC hchfhhhhj}rM (UreftypeXexchhX ConfigErrorsU refdomainXpyrN ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rO h)rP }rQ (hajL hj}rR (hl]hm]rS (hjN Xpy-excrT ehn]ho]hr]uhbjJ h\]rU h~X ConfigErrorsrV rW }rX (haUhbjP ubahhhubaubh~XQ. This is done so all config errors can be reported, rather than just the first.rY rZ }r[ (haXQ. This is done so all config errors can be reported, rather than just the first.hbjC ubeubeubeubh)r\ }r] (haUhbj hcNhhhhj}r^ (ho]hn]hl]hm]hr]Uentries]r_ (hX ConfigErrorsr` h Utra auhtNhuhh\]ubh)rb }rc (haUhbj hcNhhhhj}rd (hhXpyre ho]hn]hl]hm]hr]hX exceptionrf hjf uhtNhuhh\]rg (j)rh }ri (haXConfigErrors([errors])hbjb hchfhhjhj}rj (ho]rk h ajhhn]hl]hm]hr]rl h aj j` j Uj uhtM-huhh\]rm (j)rn }ro (haX exception hbjh hchfhhjhj}rp (hl]hm]hn]ho]hr]uhtM-huhh\]rq h~X exception rr rs }rt (haUhbjn ubaubj)ru }rv (haXbuildbot.config.hbjh hchfhhjhj}rw (hl]hm]hn]ho]hr]uhtM-huhh\]rx h~Xbuildbot.config.ry rz }r{ (haUhbju ubaubj )r| }r} (haj` hbjh hchfhhj#hj}r~ (hl]hm]hn]ho]hr]uhtM-huhh\]r h~X ConfigErrorsr r }r (haUhbj| ubaubjF)r }r (haUhbjh hchfhhjIhj}r (hl]hm]hn]ho]hr]uhtM-huhh\]r jh )r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r jL)r }r (haXerrorshj}r (hl]hm]hn]ho]hr]uhbj h\]r h~Xerrorsr r }r (haUhbj ubahhjTubahhjt ubaubeubj))r }r (haUhbjb hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtM-huhh\]r (j`)r }r (haUhbj hcNhhjchj}r (hl]hm]hn]ho]hr]uhtNhuhh\]r jf)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r (jk)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r h~X Parametersr r }r (haUhbj ubahhjsubjt)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r h)r }r (haUhj}r (hl]hm]hn]ho]hr]uhbj h\]r (j)r }r (haXerrorshj}r (hl]hm]hn]ho]hr]uhbj h\]r h~Xerrorsr r }r (haUhbj ubahhjubh~X (r r }r (haUhbj ubh)r }r (haUhj}r (UreftypejU reftargetXlistr U refdomainje ho]hn]U refexplicithl]hm]hr]uhbj h\]r h)r }r (haj hj}r (hl]hm]hn]ho]hr]uhbj h\]r h~Xlistr r }r (haUhbj ubahhhubahhhubh~X)r }r (haUhbj ubh~X -- r r }r (haUhbj ubh~Xerrors to reportr r }r (haXerrors to reportr hbj ubehhhubahhjubehhjubaubh)r }r (haXThis exception represents errors in the configuration. It supports reporting multiple errors to the user simultaneously, e.g., when several consistency checks fail.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h~XThis exception represents errors in the configuration. It supports reporting multiple errors to the user simultaneously, e.g., when several consistency checks fail.r r }r (haj hbj ubaubh)r }r (haUhbj hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX/errors (buildbot.config.ConfigErrors attribute)hUtr auhtNhuhh\]ubh)r }r (haUhbj hchfhhhhj}r (hhXpyho]hn]hl]hm]hr]hX attributer hj uhtNhuhh\]r (j)r }r (haXerrorsr hbj hchfhhjhj}r (ho]r hajhhn]hl]hm]hr]r haj XConfigErrors.errorsj j` j uhtM&huhh\]r j )r }r (haj hbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtM&huhh\]r h~Xerrorsr r }r (haUhbj ubaubaubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtM&huhh\]r h)r }r (haX2A list of detected errors, each given as a string.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtM%huhh\]r h~X2A list of detected errors, each given as a string.r r }r (haj hbj ubaubaubeubh)r }r (haUhbj hchfhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX0addError() (buildbot.config.ConfigErrors method)hUtr auhtNhuhh\]ubh)r }r (haUhbj hchfhhhhj}r (hhXpyr ho]hn]hl]hm]hr]hXmethodr hj uhtNhuhh\]r (j)r }r (haX addError(msg)hbj hchfhhjhj}r (ho]r hajhhn]hl]hm]hr]r haj XConfigErrors.addErrorj j` j uhtM+huhh\]r (j )r }r (haXaddErrorhbj hchfhhj#hj}r (hl]hm]hn]ho]hr]uhtM+huhh\]r h~XaddErrorr r }r (haUhbj ubaubjF)r }r (haUhbj hchfhhjIhj}r (hl]hm]hn]ho]hr]uhtM+huhh\]r jL)r }r (haXmsghj}r (hl]hm]hn]ho]hr]uhbj h\]r h~Xmsgr r }r (haUhbj ubahhjTubaubeubj))r }r (haUhbj hchfhhj,hj}r (hl]hm]hn]ho]hr]uhtM+huhh\]r (j`)r }r (haUhbj hchfhhjchj}r! (hl]hm]hn]ho]hr]uhtNhuhh\]r" jf)r# }r$ (haUhj}r% (hl]hm]hn]ho]hr]uhbj h\]r& (jk)r' }r( (haUhj}r) (hl]hm]hn]ho]hr]uhbj# h\]r* h~X Parametersr+ r, }r- (haUhbj' ubahhjsubjt)r. }r/ (haUhj}r0 (hl]hm]hn]ho]hr]uhbj# h\]r1 h)r2 }r3 (haUhj}r4 (hl]hm]hn]ho]hr]uhbj. h\]r5 (j)r6 }r7 (haXmsghj}r8 (hl]hm]hn]ho]hr]uhbj2 h\]r9 h~Xmsgr: r; }r< (haUhbj6 ubahhjubh~X (r= r> }r? (haUhbj2 ubh)r@ }rA (haUhj}rB (UreftypejU reftargetXstringrC U refdomainj ho]hn]U refexplicithl]hm]hr]uhbj2 h\]rD h)rE }rF (hajC hj}rG (hl]hm]hn]ho]hr]uhbj@ h\]rH h~XstringrI rJ }rK (haUhbjE ubahhhubahhhubh~X)rL }rM (haUhbj2 ubh~X -- rN rO }rP (haUhbj2 ubh~Xthe message to addrQ rR }rS (haXthe message to addrT hbj2 ubehhhubahhjubehhjubaubh)rU }rV (haXGAdd another error message to the (presumably not-yet-raised) exception.rW hbj hchfhhhhj}rX (hl]hm]hn]ho]hr]uhtM+huhh\]rY h~XGAdd another error message to the (presumably not-yet-raised) exception.rZ r[ }r\ (hajW hbjU ubaubeubeubeubeubcdocutils.nodes target r] )r^ }r_ (haX.. _developer-Reconfiguration:hbj hchfhhUtargetr` hj}ra (ho]hn]hl]hm]hr]Urefidrb hPuhtM.huhh\]ubeubh^)rc }rd (haUhbh_hchfUexpect_referenced_by_namere }rf h j^ shhhihj}rg (hl]hm]hn]ho]rh (hXhPehr]ri (h0h euhtM1huhUexpect_referenced_by_idrj }rk hPj^ sh\]rl (hw)rm }rn (haXReconfigurationro hbjc hchfhhh{hj}rp (hl]hm]hn]ho]hr]uhtM1huhh\]rq h~XReconfigurationrr rs }rt (hajo hbjm ubaubh)ru }rv (haX=When the buildmaster receives a signal to begin a reconfig, it re-reads the configuration file, generating a new :py:class:`MasterConfig` instance, and then notifies all of its child services via the reconfig mechanism described below. The master ensures that at most one reconfiguration is taking place at any time.hbjc hchfhhhhj}rw (hl]hm]hn]ho]hr]uhtM3huhh\]rx (h~XqWhen the buildmaster receives a signal to begin a reconfig, it re-reads the configuration file, generating a new ry rz }r{ (haXqWhen the buildmaster receives a signal to begin a reconfig, it re-reads the configuration file, generating a new hbju ubh)r| }r} (haX:py:class:`MasterConfig`r~ hbju hchfhhhhj}r (UreftypeXclasshhX MasterConfigU refdomainXpyr ho]hn]U refexplicithl]hm]hr]hhhNhhuhtM3h\]r h)r }r (haj~ hj}r (hl]hm]r (hj Xpy-classr ehn]ho]hr]uhbj| h\]r h~X MasterConfigr r }r (haUhbj ubahhhubaubh~X instance, and then notifies all of its child services via the reconfig mechanism described below. The master ensures that at most one reconfiguration is taking place at any time.r r }r (haX instance, and then notifies all of its child services via the reconfig mechanism described below. The master ensures that at most one reconfiguration is taking place at any time.hbju ubeubh)r }r (haXSSee :ref:`master-service-hierarchy` for the structure of the Buildbot service tree.hbjc hchfhhhhj}r (hl]hm]hn]ho]hr]uhtM9huhh\]r (h~XSee r r }r (haXSee hbj ubh)r }r (haX:ref:`master-service-hierarchy`r hbj hchfhhhhj}r (UreftypeXrefhhXmaster-service-hierarchyU refdomainXstdr ho]hn]U refexplicithl]hm]hr]hhuhtM9h\]r h)r }r (haj hj}r (hl]hm]r (hj Xstd-refr ehn]ho]hr]uhbj h\]r h~Xmaster-service-hierarchyr r }r (haUhbj ubahhhubaubh~X0 for the structure of the Buildbot service tree.r r }r (haX0 for the structure of the Buildbot service tree.hbj ubeubh)r }r (haXTo simplify initialization, a reconfiguration is performed immediately on master startup. As a result, services only need to implement their configuration handling once, and can use ``startService`` for initialization.hbjc hchfhhhhj}r (hl]hm]hn]ho]hr]uhtM<huhh\]r (h~XTo simplify initialization, a reconfiguration is performed immediately on master startup. As a result, services only need to implement their configuration handling once, and can use r r }r (haXTo simplify initialization, a reconfiguration is performed immediately on master startup. As a result, services only need to implement their configuration handling once, and can use hbj ubh)r }r (haX``startService``hj}r (hl]hm]hn]ho]hr]uhbj h\]r h~X startServicer r }r (haUhbj ubahhhubh~X for initialization.r r }r (haX for initialization.hbj ubeubh)r }r (haXcSee below for instructions on implementing configuration of common types of components in Buildbot.r hbjc hchfhhhhj}r (hl]hm]hn]ho]hr]uhtM@huhh\]r h~XcSee below for instructions on implementing configuration of common types of components in Buildbot.r r }r (haj hbj ubaubcdocutils.nodes note r )r }r (haXBecause Buildbot uses a pure-Python configuration file, it is not possible to support all forms of reconfiguration. In particular, when the configuration includes custom subclasses or modules, reconfiguration can turn up some surprising behaviors due to the dynamic nature of Python. The reconfig support in Buildbot is intended for "intermediate" uses of the software, where there are fewer surprises.hbjc hchfhhUnoter hj}r (hl]hm]hn]ho]hr]uhtNhuhh\]r h)r }r (haXBecause Buildbot uses a pure-Python configuration file, it is not possible to support all forms of reconfiguration. In particular, when the configuration includes custom subclasses or modules, reconfiguration can turn up some surprising behaviors due to the dynamic nature of Python. The reconfig support in Buildbot is intended for "intermediate" uses of the software, where there are fewer surprises.r hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtMEh\]r h~XBecause Buildbot uses a pure-Python configuration file, it is not possible to support all forms of reconfiguration. In particular, when the configuration includes custom subclasses or modules, reconfiguration can turn up some surprising behaviors due to the dynamic nature of Python. The reconfig support in Buildbot is intended for "intermediate" uses of the software, where there are fewer surprises.r r }r (haj hbj ubaubaubh^)r }r (haUhbjc hchfhhhihj}r (hl]hm]hn]ho]r hTahr]r hauhtMMhuhh\]r (hw)r }r (haXReconfigurable Servicesr hbj hchfhhh{hj}r (hl]hm]hn]ho]hr]uhtMMhuhh\]r h~XReconfigurable Servicesr r }r (haj hbj ubaubh)r }r (haXInstances which need to be notified of a change in configuration should be implemented as Twisted services, and mix in the :py:class:`ReconfigurableServiceMixin` class, overriding the :py:meth:`~ReconfigurableServiceMixin.reconfigService` method.hbj hchfhhhhj}r (hl]hm]hn]ho]hr]uhtMOhuhh\]r (h~X{Instances which need to be notified of a change in configuration should be implemented as Twisted services, and mix in the r r }r (haX{Instances which need to be notified of a change in configuration should be implemented as Twisted services, and mix in the hbj ubh)r }r (haX&:py:class:`ReconfigurableServiceMixin`r hbj hchfhhhhj}r (UreftypeXclasshhXReconfigurableServiceMixinU refdomainXpyr ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMOh\]r h)r }r (haj hj}r (hl]hm]r (hj Xpy-classr ehn]ho]hr]uhbj h\]r h~XReconfigurableServiceMixinr r }r (haUhbj ubahhhubaubh~X class, overriding the r r }r (haX class, overriding the hbj ubh)r }r (haX6:py:meth:`~ReconfigurableServiceMixin.reconfigService`r hbj hchfhhhhj}r (UreftypeXmethhhX*ReconfigurableServiceMixin.reconfigServiceU refdomainXpyr ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMOh\]r h)r }r (haj hj}r (hl]hm]r (hj Xpy-methr ehn]ho]hr]uhbj h\]rh~XreconfigServicerr}r(haUhbj ubahhhubaubh~X method.rr}r(haX method.hbj ubeubh)r}r(haUhbj hcNhhhhj}r (ho]hn]hl]hm]hr]Uentries]r (hX5ReconfigurableServiceMixin (class in buildbot.config)hUtr auhtNhuhh\]ubh)r }r (haUhbj hcNhhhhj}r(hhXpyho]hn]hl]hm]hr]hXclassrhjuhtNhuhh\]r(j)r}r(haXReconfigurableServiceMixinrhbj hchfhhjhj}r(ho]rhajhhn]hl]hm]hr]rhaj jj Uj uhtMuhuhh\]r(j)r}r(haXclass hbjhchfhhjhj}r(hl]hm]hn]ho]hr]uhtMuhuhh\]rh~Xclass rr}r(haUhbjubaubj)r}r (haXbuildbot.config.hbjhchfhhjhj}r!(hl]hm]hn]ho]hr]uhtMuhuhh\]r"h~Xbuildbot.config.r#r$}r%(haUhbjubaubj )r&}r'(hajhbjhchfhhj#hj}r((hl]hm]hn]ho]hr]uhtMuhuhh\]r)h~XReconfigurableServiceMixinr*r+}r,(haUhbj&ubaubeubj))r-}r.(haUhbj hchfhhj,hj}r/(hl]hm]hn]ho]hr]uhtMuhuhh\]r0(h)r1}r2(haUhbj-hchfhhhhj}r3(ho]hn]hl]hm]hr]Uentries]r4(hXEreconfigService() (buildbot.config.ReconfigurableServiceMixin method)h Utr5auhtNhuhh\]ubh)r6}r7(haUhbj-hchfhhhhj}r8(hhXpyho]hn]hl]hm]hr]hXmethodr9hj9uhtNhuhh\]r:(j)r;}r<(haXreconfigService(new_config)r=hbj6hchfhhjhj}r>(ho]r?h ajhhn]hl]hm]hr]r@h aj X*ReconfigurableServiceMixin.reconfigServicej jj uhtMnhuhh\]rA(j )rB}rC(haXreconfigServicehbj;hchfhhj#hj}rD(hl]hm]hn]ho]hr]uhtMnhuhh\]rEh~XreconfigServicerFrG}rH(haUhbjBubaubjF)rI}rJ(haUhbj;hchfhhjIhj}rK(hl]hm]hn]ho]hr]uhtMnhuhh\]rLjL)rM}rN(haX new_confighj}rO(hl]hm]hn]ho]hr]uhbjIh\]rPh~X new_configrQrR}rS(haUhbjMubahhjTubaubeubj))rT}rU(haUhbj6hchfhhj,hj}rV(hl]hm]hn]ho]hr]uhtMnhuhh\]rW(j`)rX}rY(haUhbjThchfhhjchj}rZ(hl]hm]hn]ho]hr]uhtNhuhh\]r[(jf)r\}r](haUhj}r^(hl]hm]hn]ho]hr]uhbjXh\]r_(jk)r`}ra(haUhj}rb(hl]hm]hn]ho]hr]uhbj\h\]rch~X Parametersrdre}rf(haUhbj`ubahhjsubjt)rg}rh(haUhj}ri(hl]hm]hn]ho]hr]uhbj\h\]rjh)rk}rl(haUhj}rm(hl]hm]hn]ho]hr]uhbjgh\]rn(j)ro}rp(haX new_confighj}rq(hl]hm]hn]ho]hr]uhbjkh\]rrh~X new_configrsrt}ru(haUhbjoubahhjubh~X (rvrw}rx(haUhbjkubh)ry}rz(haX:py:class:`MasterConfig`r{hbjkhchfhhhhj}r|(UreftypeXclasshhX MasterConfigU refdomainXpyr}ho]hn]U refexplicithl]hm]hr]hhhjhhuhtMYh\]r~h)r}r(haj{hj}r(hl]hm]r(hj}Xpy-classrehn]ho]hr]uhbjyh\]rh~X MasterConfigrr}r(haUhbjubahhhubaubh~X)r}r(haUhbjkubh~X -- rr}r(haUhbjkubh~Xnew master configurationrr}r(haXnew master configurationrhbjkubehhhubahhjubehhjubjf)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjXh\]r(jk)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjh\]rh~XReturnsrr}r(haUhbjubahhjsubjt)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjh\]rh)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjh\]rh~XDeferredrr}r(haXDeferredrhbjubahhhubahhjubehhjubeubh)r}r(haXzThis method notifies the service that it should make any changes necessary to adapt to the new configuration values given.rhbjThchfhhhhj}r(hl]hm]hn]ho]hr]uhtM\huhh\]rh~XzThis method notifies the service that it should make any changes necessary to adapt to the new configuration values given.rr}r(hajhbjubaubh)r}r(haXDThis method will be called automatically after a service is started.rhbjThchfhhhhj}r(hl]hm]hn]ho]hr]uhtM_huhh\]rh~XDThis method will be called automatically after a service is started.rr}r(hajhbjubaubh)r}r(haXIt is generally too late at this point to roll back the reconfiguration, so if possible any errors should be detected in the :py:class:`MasterConfig` implementation. Errors are handled as best as possible and communicated back to the top level invocation, but such errors may leave the master in an inconsistent state. :py:exc:`ConfigErrors` exceptions will be displayed appropriately to the user on startup.hbjThchfhhhhj}r(hl]hm]hn]ho]hr]uhtMahuhh\]r(h~X}It is generally too late at this point to roll back the reconfiguration, so if possible any errors should be detected in the rr}r(haX}It is generally too late at this point to roll back the reconfiguration, so if possible any errors should be detected in the hbjubh)r}r(haX:py:class:`MasterConfig`rhbjhchfhhhhj}r(UreftypeXclasshhX MasterConfigU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtMah\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~X MasterConfigrr}r(haUhbjubahhhubaubh~X implementation. Errors are handled as best as possible and communicated back to the top level invocation, but such errors may leave the master in an inconsistent state. rr}r(haX implementation. Errors are handled as best as possible and communicated back to the top level invocation, but such errors may leave the master in an inconsistent state. hbjubh)r}r(haX:py:exc:`ConfigErrors`rhbjhchfhhhhj}r(UreftypeXexchhX ConfigErrorsU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtMah\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-excrehn]ho]hr]uhbjh\]rh~X ConfigErrorsrr}r(haUhbjubahhhubaubh~XC exceptions will be displayed appropriately to the user on startup.rr}r(haXC exceptions will be displayed appropriately to the user on startup.hbjubeubh)r}r(haX;Subclasses should always call the parent class's implementation. For :py:class:`MultiService` instances, this will call any child services' :py:meth:`reconfigService` methods, as appropriate. This will be done sequentially, such that the Deferred from one service must fire before the next service is reconfigured.hbjThchfhhhhj}r(hl]hm]hn]ho]hr]uhtMihuhh\]r(h~XESubclasses should always call the parent class's implementation. For rr}r(haXESubclasses should always call the parent class's implementation. For hbjubh)r}r(haX:py:class:`MultiService`rhbjhchfhhhhj}r(UreftypeXclasshhX MultiServiceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtMih\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~X MultiServicerr}r(haUhbjubahhhubaubh~X/ instances, this will call any child services' rr}r(haX/ instances, this will call any child services' hbjubh)r}r(haX:py:meth:`reconfigService`rhbjhchfhhhhj}r(UreftypeXmethhhXreconfigServiceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhjhhuhtMih\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-methrehn]ho]hr]uhbjh\]rh~XreconfigServicerr }r (haUhbjubahhhubaubh~X methods, as appropriate. This will be done sequentially, such that the Deferred from one service must fire before the next service is reconfigured.r r }r (haX methods, as appropriate. This will be done sequentially, such that the Deferred from one service must fire before the next service is reconfigured.hbjubeubeubeubh)r}r(haUhbj-hchfhhhhj}r(ho]hn]hl]hm]hr]Uentries]r(hX?priority (buildbot.config.ReconfigurableServiceMixin attribute)h=UtrauhtNhuhh\]ubh)r}r(haUhbj-hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXpriorityrhbjhchfhhjhj}r(ho]rh=ajhhn]hl]hm]hr]rh=aj X#ReconfigurableServiceMixin.priorityj jj uhtMshuhh\]rj )r}r (hajhbjhchfhhj#hj}r!(hl]hm]hn]ho]hr]uhtMshuhh\]r"h~Xpriorityr#r$}r%(haUhbjubaubaubj))r&}r'(haUhbjhchfhhj,hj}r((hl]hm]hn]ho]hr]uhtMshuhh\]r)h)r*}r+(haXChild services are reconfigured in order of decreasing priority. The default priority is 128, so a service that must be reconfigured before others should be given a higher priority.r,hbj&hchfhhhhj}r-(hl]hm]hn]ho]hr]uhtMqhuhh\]r.h~XChild services are reconfigured in order of decreasing priority. The default priority is 128, so a service that must be reconfigured before others should be given a higher priority.r/r0}r1(haj,hbj*ubaubaubeubeubeubeubh^)r2}r3(haUhbjc hchfhhhihj}r4(hl]hm]hn]ho]r5hWahr]r6h.auhtMwhuhh\]r7(hw)r8}r9(haXChange Sourcesr:hbj2hchfhhh{hj}r;(hl]hm]hn]ho]hr]uhtMwhuhh\]r<h~XChange Sourcesr=r>}r?(haj:hbj8ubaubh)r@}rA(haXWhen reconfiguring, there is no method by which Buildbot can determine that a new :py:class:`~buildbot.changes.base.ChangeSource` represents the same source as an existing :py:class:`~buildbot.changes.base.ChangeSource`, but with different configuration parameters. As a result, the change source manager compares the lists of existing and new change sources using equality, stops any existing sources that are not in the new list, and starts any new change sources that do not already exist.hbj2hchfhhhhj}rB(hl]hm]hn]ho]hr]uhtMyhuhh\]rC(h~XRWhen reconfiguring, there is no method by which Buildbot can determine that a new rDrE}rF(haXRWhen reconfiguring, there is no method by which Buildbot can determine that a new hbj@ubh)rG}rH(haX/:py:class:`~buildbot.changes.base.ChangeSource`rIhbj@hchfhhhhj}rJ(UreftypeXclasshhX"buildbot.changes.base.ChangeSourceU refdomainXpyrKho]hn]U refexplicithl]hm]hr]hhhNhhuhtMyh\]rLh)rM}rN(hajIhj}rO(hl]hm]rP(hjKXpy-classrQehn]ho]hr]uhbjGh\]rRh~X ChangeSourcerSrT}rU(haUhbjMubahhhubaubh~X+ represents the same source as an existing rVrW}rX(haX+ represents the same source as an existing hbj@ubh)rY}rZ(haX/:py:class:`~buildbot.changes.base.ChangeSource`r[hbj@hchfhhhhj}r\(UreftypeXclasshhX"buildbot.changes.base.ChangeSourceU refdomainXpyr]ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMyh\]r^h)r_}r`(haj[hj}ra(hl]hm]rb(hj]Xpy-classrcehn]ho]hr]uhbjYh\]rdh~X ChangeSourcererf}rg(haUhbj_ubahhhubaubh~X, but with different configuration parameters. As a result, the change source manager compares the lists of existing and new change sources using equality, stops any existing sources that are not in the new list, and starts any new change sources that do not already exist.rhri}rj(haX, but with different configuration parameters. As a result, the change source manager compares the lists of existing and new change sources using equality, stops any existing sources that are not in the new list, and starts any new change sources that do not already exist.hbj@ubeubh)rk}rl(haX:py:class:`~buildbot.changes.base.ChangeSource` inherits :py:class:`~buildbot.util.ComparableMixin`, so change sources are compared based on the attributes described in their ``compare_attrs``.hbj2hchfhhhhj}rm(hl]hm]hn]ho]hr]uhtMhuhh\]rn(h)ro}rp(haX/:py:class:`~buildbot.changes.base.ChangeSource`rqhbjkhchfhhhhj}rr(UreftypeXclasshhX"buildbot.changes.base.ChangeSourceU refdomainXpyrsho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rth)ru}rv(hajqhj}rw(hl]hm]rx(hjsXpy-classryehn]ho]hr]uhbjoh\]rzh~X ChangeSourcer{r|}r}(haUhbjuubahhhubaubh~X inherits r~r}r(haX inherits hbjkubh)r}r(haX*:py:class:`~buildbot.util.ComparableMixin`rhbjkhchfhhhhj}r(UreftypeXclasshhXbuildbot.util.ComparableMixinU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~XComparableMixinrr}r(haUhbjubahhhubaubh~XL, so change sources are compared based on the attributes described in their rr}r(haXL, so change sources are compared based on the attributes described in their hbjkubh)r}r(haX``compare_attrs``hj}r(hl]hm]hn]ho]hr]uhbjkh\]rh~X compare_attrsrr}r(haUhbjubahhhubh~X.r}r(haX.hbjkubeubh)r}r(haXIf a change source does not make reference to any global configuration parameters, then there is no need to inherit :py:class:`ReconfigurableServiceMixin`, as a simple comparison and ``startService`` and ``stopService`` will be sufficient.hbj2hchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]r(h~XtIf a change source does not make reference to any global configuration parameters, then there is no need to inherit rr}r(haXtIf a change source does not make reference to any global configuration parameters, then there is no need to inherit hbjubh)r}r(haX&:py:class:`ReconfigurableServiceMixin`rhbjhchfhhhhj}r(UreftypeXclasshhXReconfigurableServiceMixinU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~XReconfigurableServiceMixinrr}r(haUhbjubahhhubaubh~X, as a simple comparison and rr}r(haX, as a simple comparison and hbjubh)r}r(haX``startService``hj}r(hl]hm]hn]ho]hr]uhbjh\]rh~X startServicerr}r(haUhbjubahhhubh~X and rr}r(haX and hbjubh)r}r(haX``stopService``hj}r(hl]hm]hn]ho]hr]uhbjh\]rh~X stopServicerr}r(haUhbjubahhhubh~X will be sufficient.rr}r(haX will be sufficient.hbjubeubh)r}r(haXIf the change source does make reference to global values, e.g., as default values for its parameters, then it must inherit :py:class:`ReconfigurableServiceMixin` to support the case where the global values change.hbj2hchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]r(h~X|If the change source does make reference to global values, e.g., as default values for its parameters, then it must inherit rr}r(haX|If the change source does make reference to global values, e.g., as default values for its parameters, then it must inherit hbjubh)r}r(haX&:py:class:`ReconfigurableServiceMixin`rhbjhchfhhhhj}r(UreftypeXclasshhXReconfigurableServiceMixinU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~XReconfigurableServiceMixinrr}r(haUhbjubahhhubaubh~X4 to support the case where the global values change.rr}r(haX4 to support the case where the global values change.hbjubeubeubh^)r}r(haUhbjc hchfhhhihj}r(hl]hm]hn]ho]rhSahr]rhauhtMhuhh\]r(hw)r}r(haX Schedulersrhbjhchfhhh{hj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~X Schedulersrr}r(hajhbjubaubh)r}r(haXSchedulers have names, so Buildbot can determine whether a scheduler has been added, removed, or changed during a reconfig. Old schedulers will be stopped, new schedulers will be started, and both new and existing schedulers will see a call to :py:meth:`~ReconfigurableServiceMixin.reconfigService`, if such a method exists. For backward compatibility, schedulers which do not support reconfiguration will be stopped, and the new scheduler started, when their configuration changes.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]r(h~XSchedulers have names, so Buildbot can determine whether a scheduler has been added, removed, or changed during a reconfig. Old schedulers will be stopped, new schedulers will be started, and both new and existing schedulers will see a call to rr}r(haXSchedulers have names, so Buildbot can determine whether a scheduler has been added, removed, or changed during a reconfig. Old schedulers will be stopped, new schedulers will be started, and both new and existing schedulers will see a call to hbjubh)r}r(haX6:py:meth:`~ReconfigurableServiceMixin.reconfigService`rhbjhchfhhhhj}r(UreftypeXmethhhX*ReconfigurableServiceMixin.reconfigServiceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-methrehn]ho]hr]uhbjh\]rh~XreconfigServicerr}r(haUhbjubahhhubaubh~X, if such a method exists. For backward compatibility, schedulers which do not support reconfiguration will be stopped, and the new scheduler started, when their configuration changes.rr}r(haX, if such a method exists. For backward compatibility, schedulers which do not support reconfiguration will be stopped, and the new scheduler started, when their configuration changes.hbjubeubh)r }r (haXIf, during a reconfiguration, a new and old scheduler's fully qualified class names differ, then the old class will be stopped and the new class started. This supports the case when a user changes, for example, a Nightly scheduler to a Periodic scheduler without changing the name.r hbjhchfhhhhj}r (hl]hm]hn]ho]hr]uhtMhuhh\]r h~XIf, during a reconfiguration, a new and old scheduler's fully qualified class names differ, then the old class will be stopped and the new class started. This supports the case when a user changes, for example, a Nightly scheduler to a Periodic scheduler without changing the name.rr}r(haj hbj ubaubh)r}r(haXBecause Buildbot uses :py:class:`~buildbot.schedulers.base.BaseScheduler` instances directly in the configuration file, a reconfigured scheduler must extract its new configuration information from another instance of itself. :py:class:`~buildbot.schedulers.base.BaseScheduler` implements a helper method, :py:meth:`~buildbot.schedulers.base.BaseScheduler.findNewSchedulerInstance`, which will return the new instance of the scheduler in the given :py:class:`MasterConfig` object.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]r(h~XBecause Buildbot uses rr}r(haXBecause Buildbot uses hbjubh)r}r(haX3:py:class:`~buildbot.schedulers.base.BaseScheduler`rhbjhchfhhhhj}r(UreftypeXclasshhX&buildbot.schedulers.base.BaseSchedulerU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r (hl]hm]r!(hjXpy-classr"ehn]ho]hr]uhbjh\]r#h~X BaseSchedulerr$r%}r&(haUhbjubahhhubaubh~X instances directly in the configuration file, a reconfigured scheduler must extract its new configuration information from another instance of itself. r'r(}r)(haX instances directly in the configuration file, a reconfigured scheduler must extract its new configuration information from another instance of itself. hbjubh)r*}r+(haX3:py:class:`~buildbot.schedulers.base.BaseScheduler`r,hbjhchfhhhhj}r-(UreftypeXclasshhX&buildbot.schedulers.base.BaseSchedulerU refdomainXpyr.ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]r/h)r0}r1(haj,hj}r2(hl]hm]r3(hj.Xpy-classr4ehn]ho]hr]uhbj*h\]r5h~X BaseSchedulerr6r7}r8(haUhbj0ubahhhubaubh~X implements a helper method, r9r:}r;(haX implements a helper method, hbjubh)r<}r=(haXK:py:meth:`~buildbot.schedulers.base.BaseScheduler.findNewSchedulerInstance`r>hbjhchfhhhhj}r?(UreftypeXmethhhX?buildbot.schedulers.base.BaseScheduler.findNewSchedulerInstanceU refdomainXpyr@ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rAh)rB}rC(haj>hj}rD(hl]hm]rE(hj@Xpy-methrFehn]ho]hr]uhbj<h\]rGh~XfindNewSchedulerInstancerHrI}rJ(haUhbjBubahhhubaubh~XC, which will return the new instance of the scheduler in the given rKrL}rM(haXC, which will return the new instance of the scheduler in the given hbjubh)rN}rO(haX:py:class:`MasterConfig`rPhbjhchfhhhhj}rQ(UreftypeXclasshhX MasterConfigU refdomainXpyrRho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rSh)rT}rU(hajPhj}rV(hl]hm]rW(hjRXpy-classrXehn]ho]hr]uhbjNh\]rYh~X MasterConfigrZr[}r\(haUhbjTubahhhubaubh~X object.r]r^}r_(haX object.hbjubeubh^)r`}ra(haUhbjhchfhhhihj}rb(hl]hm]hn]ho]rch[ahr]rdhBauhtMhuhh\]re(hw)rf}rg(haXCustom Subclassesrhhbj`hchfhhh{hj}ri(hl]hm]hn]ho]hr]uhtMhuhh\]rjh~XCustom Subclassesrkrl}rm(hajhhbjfubaubh)rn}ro(haXaCustom subclasses are most often defined directly in the configuration file, or in a Python module that is reloaded with ``reload`` every time the configuration is loaded. Because of the dynamic nature of Python, this creates a new object representing the subclass every time the configuration is loaded -- even if the class definition has not changed.hbj`hchfhhhhj}rp(hl]hm]hn]ho]hr]uhtMhuhh\]rq(h~XyCustom subclasses are most often defined directly in the configuration file, or in a Python module that is reloaded with rrrs}rt(haXyCustom subclasses are most often defined directly in the configuration file, or in a Python module that is reloaded with hbjnubh)ru}rv(haX ``reload``hj}rw(hl]hm]hn]ho]hr]uhbjnh\]rxh~Xreloadryrz}r{(haUhbjuubahhhubh~X every time the configuration is loaded. Because of the dynamic nature of Python, this creates a new object representing the subclass every time the configuration is loaded -- even if the class definition has not changed.r|r}}r~(haX every time the configuration is loaded. Because of the dynamic nature of Python, this creates a new object representing the subclass every time the configuration is loaded -- even if the class definition has not changed.hbjnubeubh)r}r(haXNote that if a scheduler's class changes in a reconfig, but the scheduler's name does not, it will still be treated as a reconfiguration of the existing scheduler. This means that implementation changes in custom scheduler subclasses will not be activated with a reconfig. This behavior avoids stopping and starting such schedulers on every reconfig, but can make development difficult.rhbj`hchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XNote that if a scheduler's class changes in a reconfig, but the scheduler's name does not, it will still be treated as a reconfiguration of the existing scheduler. This means that implementation changes in custom scheduler subclasses will not be activated with a reconfig. This behavior avoids stopping and starting such schedulers on every reconfig, but can make development difficult.rr}r(hajhbjubaubh)r}r(haXOne workaround for this is to change the name of the scheduler before each reconfig - this will cause the old scheduler to be stopped, and the new scheduler (with the new name and class) to be started.rhbj`hchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XOne workaround for this is to change the name of the scheduler before each reconfig - this will cause the old scheduler to be stopped, and the new scheduler (with the new name and class) to be started.rr}r(hajhbjubaubeubeubh^)r}r(haUhbjc hchfhhhihj}r(hl]hm]hn]ho]rhVahr]rhauhtMhuhh\]r(hw)r}r(haXSlavesrhbjhchfhhh{hj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XSlavesrr}r(hajhbjubaubh)r}r(haXUSimilar to schedulers, slaves are specified by name, so new and old configurations are first compared by name, and any slaves to be added or removed are noted. Slaves for which the fully-qualified class name has changed are also added and removed. All slaves have their :py:meth:`~ReconfigurableServiceMixin.reconfigService` method called.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]r(h~XSimilar to schedulers, slaves are specified by name, so new and old configurations are first compared by name, and any slaves to be added or removed are noted. Slaves for which the fully-qualified class name has changed are also added and removed. All slaves have their rr}r(haXSimilar to schedulers, slaves are specified by name, so new and old configurations are first compared by name, and any slaves to be added or removed are noted. Slaves for which the fully-qualified class name has changed are also added and removed. All slaves have their hbjubh)r}r(haX6:py:meth:`~ReconfigurableServiceMixin.reconfigService`rhbjhchfhhhhj}r(UreftypeXmethhhX*ReconfigurableServiceMixin.reconfigServiceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-methrehn]ho]hr]uhbjh\]rh~XreconfigServicerr}r(haUhbjubahhhubaubh~X method called.rr}r(haX method called.hbjubeubh)r}r(haXJThis method takes care of the basic slave attributes, including changing the PB registration if necessary. Any subclasses that add configuration parameters should override :py:meth:`~ReconfigurableServiceMixin.reconfigService` and update those parameters. As with Schedulers, because the :py:class:`~buildbot.buildslave.AbstractBuildSlave` instance is given directly in the configuration, on reconfig instances must extract the configuration from a new instance. The :py:meth:`~buildbot.buildslave.AbstractBuildSlave.findNewSlaveInstance` method can be used to find the new instance.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]r(h~XThis method takes care of the basic slave attributes, including changing the PB registration if necessary. Any subclasses that add configuration parameters should override rr}r(haXThis method takes care of the basic slave attributes, including changing the PB registration if necessary. Any subclasses that add configuration parameters should override hbjubh)r}r(haX6:py:meth:`~ReconfigurableServiceMixin.reconfigService`rhbjhchfhhhhj}r(UreftypeXmethhhX*ReconfigurableServiceMixin.reconfigServiceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-methrehn]ho]hr]uhbjh\]rh~XreconfigServicerr}r(haUhbjubahhhubaubh~X? and update those parameters. As with Schedulers, because the rr}r(haX? and update those parameters. As with Schedulers, because the hbjubh)r}r(haX3:py:class:`~buildbot.buildslave.AbstractBuildSlave`rhbjhchfhhhhj}r(UreftypeXclasshhX&buildbot.buildslave.AbstractBuildSlaveU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-classrehn]ho]hr]uhbjh\]rh~XAbstractBuildSlaverr}r(haUhbjubahhhubaubh~X instance is given directly in the configuration, on reconfig instances must extract the configuration from a new instance. The rr}r(haX instance is given directly in the configuration, on reconfig instances must extract the configuration from a new instance. The hbjubh)r}r(haXG:py:meth:`~buildbot.buildslave.AbstractBuildSlave.findNewSlaveInstance`rhbjhchfhhhhj}r(UreftypeXmethhhX;buildbot.buildslave.AbstractBuildSlave.findNewSlaveInstanceU refdomainXpyrho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rh)r}r(hajhj}r(hl]hm]r(hjXpy-methrehn]ho]hr]uhbjh\]rh~XfindNewSlaveInstancerr}r(haUhbjubahhhubaubh~X- method can be used to find the new instance.rr}r(haX- method can be used to find the new instance.hbjubeubeubh^)r}r(haUhbjc hchfhhhihj}r(hl]hm]hn]ho]rhUahr]rhauhtMhuhh\]r(hw)r}r(haX User Managersrhbjhchfhhh{hj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~X User Managersrr}r(hajhbjubaubh)r}r(haXSince user managers are rarely used, and their purpose is unclear, they are always stopped and re-started on every reconfig. This may change in figure versions.rhbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XSince user managers are rarely used, and their purpose is unclear, they are always stopped and re-started on every reconfig. This may change in figure versions.rr}r(hajhbjubaubeubh^)r }r (haUhbjc hchfhhhihj}r (hl]hm]hn]ho]r hRahr]r hauhtMhuhh\]r(hw)r}r(haXStatus Receiversrhbj hchfhhh{hj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XStatus Receiversrr}r(hajhbjubaubh)r}r(haXMAt every reconfig, all status listeners are stopped and new versions started.rhbj hchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XMAt every reconfig, all status listeners are stopped and new versions started.rr}r(hajhbjubaubeubeubeubahaUU transformerrNU footnote_refsr }r!Urefnamesr"}r#Usymbol_footnotesr$]r%Uautofootnote_refsr&]r'Usymbol_footnote_refsr(]r)U citationsr*]r+huhU current_liner,NUtransform_messagesr-]r.cdocutils.nodes system_message r/)r0}r1(haUhj}r2(hl]UlevelKho]hn]Usourcehfhm]hr]UlineM.UtypeUINFOr3uh\]r4h)r5}r6(haUhj}r7(hl]hm]hn]ho]hr]uhbj0h\]r8h~X?Hyperlink target "developer-reconfiguration" is not referenced.r9r:}r;(haUhbj5ubahhhubahhUsystem_messager<ubaUreporterr=NUid_startr>KU autofootnotesr?]r@U citation_refsrA}rBUindirect_targetsrC]rDUsettingsrE(cdocutils.frontend Values rForG}rH(Ufootnote_backlinksrIKUrecord_dependenciesrJNU rfc_base_urlrKUhttp://tools.ietf.org/html/rLU tracebackrMUpep_referencesrNNUstrip_commentsrONU toc_backlinksrPUentryrQU language_coderRUenrSU datestamprTNU report_levelrUKU _destinationrVNU halt_levelrWKU strip_classesrXNh{NUerror_encoding_error_handlerrYUbackslashreplacerZUdebugr[NUembed_stylesheetr\Uoutput_encoding_error_handlerr]Ustrictr^U sectnum_xformr_KUdump_transformsr`NU docinfo_xformraKUwarning_streamrbNUpep_file_url_templatercUpep-%04drdUexit_status_levelreKUconfigrfNUstrict_visitorrgNUcloak_email_addressesrhUtrim_footnote_reference_spaceriUenvrjNUdump_pseudo_xmlrkNUexpose_internalsrlNUsectsubtitle_xformrmU source_linkrnNUrfc_referencesroNUoutput_encodingrpUutf-8rqU source_urlrrNUinput_encodingrsU utf-8-sigrtU_disable_configruNU id_prefixrvUU tab_widthrwKUerror_encodingrxUUTF-8ryU_sourcerzUQ/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/config.rstr{Ugettext_compactr|U generatorr}NUdump_internalsr~NU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrj^Uauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hjk hjhRj hj h jh hPjc h j=h j;h jGhjhjhjhjhqj] )r}r(haUhbh_hchfhhj` hj}r(hl]ho]rhqahn]Uismodhm]hr]uhtKhuhh\]ubhj hjhSjhj hj hjwhjhjG hjg h j h!j h"j# h#jh$jh%j"h&j{h'jhQj h(j h)j]hWj2h*jCh+j h,jhh-jh[j`h/jC hXjc hZj0 hYh_h2jh3j h4j h5jyh6jhUjh7jh8j h9j)h:jsh;jH hTj hj1h?jhVjhAj hCjhDj*hEjhFjuUsubstitution_namesr}rhhhuhj}r(hl]ho]hn]Usourcehfhm]hr]uU footnotesr]rUrefidsr}rhP]rj^ asub.PK3DA!=:buildbot-v0.8.9/.doctrees/developer/cls-forcesched.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X1buildbot.schedulers.forceshed.BaseParameter.regexqX;buildbot.schedulers.forceshed.BaseParameter.parse_from_argsqX0buildbot.schedulers.forceshed.BaseParameter.nameqX parametersq NX1buildbot.schedulers.forceshed.BaseParameter.labelq X<buildbot.schedulers.forceshed.BaseParameter.updateFromKwargsq X3buildbot.schedulers.forceshed.BaseParameter.defaultq X4buildbot.schedulers.forceshed.BaseParameter.fullNameq X:buildbot.schedulers.forceshed.BaseParameter.parse_from_argqX0buildbot.schedulers.forceshed.BaseParameter.typeqXforceschedulerqX9buildbot.schedulers.forceshed.BaseParameter.getFromKwargsqX4buildbot.schedulers.forceshed.BaseParameter.requiredqX4buildbot.schedulers.forceshed.BaseParameter.multipleqX+buildbot.schedulers.forceshed.BaseParameterqXnested parametersqNuUsubstitution_defsq}qUparse_messagesq]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q }q!(hUU referencedq"KhhUsourceq#cdocutils.nodes reprunicode q$XY/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-forcesched.rstq%q&}q'bUexpect_referenced_by_nameq(}q)hcdocutils.nodes target q*)q+}q,(hX.. _ForceScheduler:hhh#h&Utagnameq-Utargetq.U attributesq/}q0(Uidsq1]Ubackrefsq2]Udupnamesq3]Uclassesq4]Unamesq5]Urefidq6Uforceschedulerq7uUlineq8KUdocumentq9hUchildrenq:]ubsh-Usectionq;h/}q<(h3]q=Xforceschedulerq>ah4]h2]h1]q?(h7Uid1q@eh5]qAhauh8Kh9hUexpect_referenced_by_idqB}qCh7h+sh:]qD(cdocutils.nodes title qE)qF}qG(hXForceSchedulerqHhh h#h&h-UtitleqIh/}qJ(h3]h4]h2]h1]h5]uh8Kh9hh:]qKcdocutils.nodes Text qLXForceSchedulerqMqN}qO(hhHhhFubaubcdocutils.nodes paragraph qP)qQ}qR(hXnThe force scheduler has a symbiotic relationship with the web status, so it deserves some further description.qShh h#h&h-U paragraphqTh/}qU(h3]h4]h2]h1]h5]uh8Kh9hh:]qVhLXnThe force scheduler has a symbiotic relationship with the web status, so it deserves some further description.qWqX}qY(hhShhQubaubh)qZ}q[(hUhh h#h&h-h;h/}q\(h3]h4]h2]h1]q]U parametersq^ah5]q_h auh8K h9hh:]q`(hE)qa}qb(hX ParametersqchhZh#h&h-hIh/}qd(h3]h4]h2]h1]h5]uh8K h9hh:]qehLX Parametersqfqg}qh(hhchhaubaubhP)qi}qj(hXThe force scheduler comes with a fleet of parameter classes. This section contains information to help users or developers who are interested in adding new parameter types or hacking the existing types.qkhhZh#h&h-hTh/}ql(h3]h4]h2]h1]h5]uh8K h9hh:]qmhLXThe force scheduler comes with a fleet of parameter classes. This section contains information to help users or developers who are interested in adding new parameter types or hacking the existing types.qnqo}qp(hhkhhiubaubh*)qq}qr(hUhhZh#h&h-h.h/}qs(h3]h1]qtX$module-buildbot.schedulers.forceshedquah2]Uismodh4]h5]uh8Kh9hh:]ubcsphinx.addnodes index qv)qw}qx(hUhhZh#h&h-Uindexqyh/}qz(h1]h2]h3]h4]h5]Uentries]q{(Usingleq|X&buildbot.schedulers.forceshed (module)X$module-buildbot.schedulers.forceshedUtq}auh8Kh9hh:]ubhv)q~}q(hUhhZh#h&h-hyh/}q(h1]h2]h3]h4]h5]Uentries]q(h|X6BaseParameter (class in buildbot.schedulers.forceshed)hUtqauh8Nh9hh:]ubcsphinx.addnodes desc q)q}q(hUhhZh#h&h-Udescqh/}q(UnoindexqUdomainqXpyh1]h2]h3]h4]h5]UobjtypeqXclassqUdesctypeqhuh8Nh9hh:]q(csphinx.addnodes desc_signature q)q}q(hX+BaseParameter(name, label, regex, **kwargs)hhh#h&h-Udesc_signatureqh/}q(h1]qhaUmoduleqXbuildbot.schedulers.forceshedqh2]h3]h4]h5]qhaUfullnameqX BaseParameterqUclassqUUfirstquh8Kzh9hh:]q(csphinx.addnodes desc_annotation q)q}q(hXclass hhh#h&h-Udesc_annotationqh/}q(h3]h4]h2]h1]h5]uh8Kzh9hh:]qhLXclass qq}q(hUhhubaubcsphinx.addnodes desc_addname q)q}q(hXbuildbot.schedulers.forceshed.hhh#h&h-U desc_addnameqh/}q(h3]h4]h2]h1]h5]uh8Kzh9hh:]qhLXbuildbot.schedulers.forceshed.qq}q(hUhhubaubcsphinx.addnodes desc_name q)q}q(hhhhh#h&h-U desc_nameqh/}q(h3]h4]h2]h1]h5]uh8Kzh9hh:]qhLX BaseParameterqq}q(hUhhubaubcsphinx.addnodes desc_parameterlist q)q}q(hUhhh#h&h-Udesc_parameterlistqh/}q(h3]h4]h2]h1]h5]uh8Kzh9hh:]q(csphinx.addnodes desc_parameter q)q}q(hXnameh/}q(h3]h4]h2]h1]h5]uhhh:]qhLXnameq…q}q(hUhhubah-Udesc_parameterqubh)q}q(hXlabelh/}q(h3]h4]h2]h1]h5]uhhh:]qhLXlabelqʅq}q(hUhhubah-hubh)q}q(hXregexh/}q(h3]h4]h2]h1]h5]uhhh:]qhLXregexqхq}q(hUhhubah-hubh)q}q(hX**kwargsh/}q(h3]h4]h2]h1]h5]uhhh:]qhLX**kwargsq؅q}q(hUhhubah-hubeubeubcsphinx.addnodes desc_content q)q}q(hUhhh#h&h-U desc_contentqh/}q(h3]h4]h2]h1]h5]uh8Kzh9hh:]q(hP)q}q(hX+This is the base implementation for most parameters, it will check validity, ensure the arg is present if the :py:attr:`~IParameter.required` attribute is set, and implement the default value. It will finally call :py:meth:`~IParameter.updateFromKwargs` to process the string(s) from the HTTP POST.hhh#h&h-hTh/}q(h3]h4]h2]h1]h5]uh8Kh9hh:]q(hLXnThis is the base implementation for most parameters, it will check validity, ensure the arg is present if the q允q}q(hXnThis is the base implementation for most parameters, it will check validity, ensure the arg is present if the hhubcsphinx.addnodes pending_xref q)q}q(hX:py:attr:`~IParameter.required`qhhh#h&h-U pending_xrefqh/}q(UreftypeXattrUrefwarnqU reftargetqXIParameter.requiredU refdomainXpyqh1]h2]U refexplicith3]h4]h5]UrefdocqXdeveloper/cls-forceschedqUpy:classqhU py:moduleqhuh8Kh:]qcdocutils.nodes literal q)q}q(hhh/}q(h3]h4]q(UxrefqhXpy-attrqeh2]h1]h5]uhhh:]qhLXrequiredqq}r(hUhhubah-UliteralrubaubhLXJ attribute is set, and implement the default value. It will finally call rr}r(hXJ attribute is set, and implement the default value. It will finally call hhubh)r}r(hX':py:meth:`~IParameter.updateFromKwargs`rhhh#h&h-hh/}r(UreftypeXmethhhXIParameter.updateFromKwargsU refdomainXpyr h1]h2]U refexplicith3]h4]h5]hhhhhhuh8Kh:]r h)r }r (hjh/}r (h3]h4]r(hj Xpy-methreh2]h1]h5]uhjh:]rhLXupdateFromKwargsrr}r(hUhj ubah-jubaubhLX- to process the string(s) from the HTTP POST.rr}r(hX- to process the string(s) from the HTTP POST.hhubeubhP)r}r(hXThe :py:class:`BaseParameter` constructor converts all keyword arguments into instance attributes, so it is generally not necessary for subclasses to implement a constructor.hhh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kh9hh:]r(hLXThe rr}r(hXThe hjubh)r}r(hX:py:class:`BaseParameter`r hjh#h&h-hh/}r!(UreftypeXclasshhX BaseParameterU refdomainXpyr"h1]h2]U refexplicith3]h4]h5]hhhhhhuh8Kh:]r#h)r$}r%(hj h/}r&(h3]h4]r'(hj"Xpy-classr(eh2]h1]h5]uhjh:]r)hLX BaseParameterr*r+}r,(hUhj$ubah-jubaubhLX constructor converts all keyword arguments into instance attributes, so it is generally not necessary for subclasses to implement a constructor.r-r.}r/(hX constructor converts all keyword arguments into instance attributes, so it is generally not necessary for subclasses to implement a constructor.hjubeubhP)r0}r1(hX]For custom parameters that set properties, one simple customization point is `getFromKwargs`:hhh#h&h-hTh/}r2(h3]h4]h2]h1]h5]uh8Kh9hh:]r3(hLXMFor custom parameters that set properties, one simple customization point is r4r5}r6(hXMFor custom parameters that set properties, one simple customization point is hj0ubcdocutils.nodes title_reference r7)r8}r9(hX`getFromKwargs`h/}r:(h3]h4]h2]h1]h5]uhj0h:]r;hLX getFromKwargsr<r=}r>(hUhj8ubah-Utitle_referencer?ubhLX:r@}rA(hX:hj0ubeubcdocutils.nodes block_quote rB)rC}rD(hUhhh#Nh-U block_quoterEh/}rF(h3]h4]h2]h1]h5]uh8Nh9hh:]rG(hv)rH}rI(hUh/}rJ(h1]h2]h3]h4]h5]Uentries]rK(h|XDgetFromKwargs() (buildbot.schedulers.forceshed.BaseParameter method)hUtrLauhjCh:]h-hyubh)rM}rN(hUhjCh-hh/}rO(hhXpyh1]h2]h3]h4]h5]hXmethodrPhjPuh9hh:]rQ(h)rR}rS(hXgetFromKwargs(kwargs)hjMh#h&h-hh/}rT(h1]rUhahhh2]h3]h4]h5]rVhahXBaseParameter.getFromKwargshhhuh8K(h9hh:]rW(h)rX}rY(hX getFromKwargshjRh#h&h-hh/}rZ(h3]h4]h2]h1]h5]uh8K(h9hh:]r[hLX getFromKwargsr\r]}r^(hUhjXubaubh)r_}r`(hUhjRh#h&h-hh/}ra(h3]h4]h2]h1]h5]uh8K(h9hh:]rbh)rc}rd(hXkwargsh/}re(h3]h4]h2]h1]h5]uhj_h:]rfhLXkwargsrgrh}ri(hUhjcubah-hubaubeubh)rj}rk(hUhjMh#h&h-hh/}rl(h3]h4]h2]h1]h5]uh8K(h9hh:]rm(cdocutils.nodes field_list rn)ro}rp(hUhjjh#h&h-U field_listrqh/}rr(h3]h4]h2]h1]h5]uh8Nh9hh:]rscdocutils.nodes field rt)ru}rv(hUh/}rw(h3]h4]h2]h1]h5]uhjoh:]rx(cdocutils.nodes field_name ry)rz}r{(hUh/}r|(h3]h4]h2]h1]h5]uhjuh:]r}hLX Parametersr~r}r(hUhjzubah-U field_namerubcdocutils.nodes field_body r)r}r(hUh/}r(h3]h4]h2]h1]h5]uhjuh:]rhP)r}r(hUh/}r(h3]h4]h2]h1]h5]uhjh:]r(cdocutils.nodes strong r)r}r(hXkwargsh/}r(h3]h4]h2]h1]h5]uhjh:]rhLXkwargsrr}r(hUhjubah-UstrongrubhLX -- rr}r(hUhjubhLX!a dictionary of the posted valuesrr}r(hX!a dictionary of the posted valuesrhjubeh-hTubah-U field_bodyrubeh-UfieldrubaubhP)r}r(hXYGiven the passed-in POST parameters, return the value of the property that should be set.rhjjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K&h9hh:]rhLXYGiven the passed-in POST parameters, return the value of the property that should be set.rr}r(hjhjubaubeubeubeubhP)r}r(hXFor more control over parameter parsing, including modifying sourcestamps or changeids, override the ``updateFromKwargs`` function, which is the function that :py:class:`ForceScheduler` invokes for processing:hhh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K)h9hh:]r(hLXeFor more control over parameter parsing, including modifying sourcestamps or changeids, override the rr}r(hXeFor more control over parameter parsing, including modifying sourcestamps or changeids, override the hjubh)r}r(hX``updateFromKwargs``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLXupdateFromKwargsrr}r(hUhjubah-jubhLX& function, which is the function that rr}r(hX& function, which is the function that hjubh)r}r(hX:py:class:`ForceScheduler`rhjh#h&h-hh/}r(UreftypeXclasshhXForceSchedulerU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hhhhhhuh8K)h:]rh)r}r(hjh/}r(h3]h4]r(hjXpy-classreh2]h1]h5]uhjh:]rhLXForceSchedulerrr}r(hUhjubah-jubaubhLX invokes for processing:rr}r(hX invokes for processing:hjubeubjB)r}r(hUhhh#Nh-jEh/}r(h3]h4]h2]h1]h5]uh8Nh9hh:]r(hv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|XGupdateFromKwargs() (buildbot.schedulers.forceshed.BaseParameter method)h Utrauhjh:]h-hyubh)r}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hXmethodrhjuh9hh:]r(h)r}r(hXCupdateFromKwargs(master, properties, changes, sourcestamps, kwargs)hjh#h&h-hh/}r(h1]rh ahhh2]h3]h4]h5]rh ahXBaseParameter.updateFromKwargshhhuh8K=h9hh:]r(h)r}r(hXupdateFromKwargshjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8K=h9hh:]rhLXupdateFromKwargsrr}r(hUhjubaubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8K=h9hh:]r(h)r}r(hXmasterh/}r(h3]h4]h2]h1]h5]uhjh:]rhLXmasterrr}r(hUhjubah-hubh)r}r(hX propertiesh/}r(h3]h4]h2]h1]h5]uhjh:]rhLX propertiesrr}r(hUhjubah-hubh)r}r(hXchangesh/}r(h3]h4]h2]h1]h5]uhjh:]rhLXchangesrr}r(hUhjubah-hubh)r}r(hX sourcestampsh/}r(h3]h4]h2]h1]h5]uhjh:]rhLX sourcestampsrr}r(hUhjubah-hubh)r}r(hXkwargsh/}r(h3]h4]h2]h1]h5]uhjh:]rhLXkwargsrr}r (hUhjubah-hubeubeubh)r }r (hUhjh#h&h-hh/}r (h3]h4]h2]h1]h5]uh8K=h9hh:]r (jn)r}r(hUhj h#h&h-jqh/}r(h3]h4]h2]h1]h5]uh8Nh9hh:]rjt)r}r(hUh/}r(h3]h4]h2]h1]h5]uhjh:]r(jy)r}r(hUh/}r(h3]h4]h2]h1]h5]uhjh:]rhLX Parametersrr}r(hUhjubah-jubj)r}r(hUh/}r(h3]h4]h2]h1]h5]uhjh:]r cdocutils.nodes bullet_list r!)r"}r#(hUh/}r$(h3]h4]h2]h1]h5]uhjh:]r%(cdocutils.nodes list_item r&)r'}r((hUh/}r)(h3]h4]h2]h1]h5]uhj"h:]r*hP)r+}r,(hUh/}r-(h3]h4]h2]h1]h5]uhj'h:]r.(j)r/}r0(hXmasterh/}r1(h3]h4]h2]h1]h5]uhj+h:]r2hLXmasterr3r4}r5(hUhj/ubah-jubhLX -- r6r7}r8(hUhj+ubhLXthe r9r:}r;(hXthe hj+ubh)r<}r=(hX(:py:class:`~buildbot.master.BuildMaster`r>hj+h#h&h-hh/}r?(UreftypeXclasshhXbuildbot.master.BuildMasterU refdomainXpyr@h1]h2]U refexplicith3]h4]h5]hhhhhhuh8K/h:]rAh)rB}rC(hj>h/}rD(h3]h4]rE(hj@Xpy-classrFeh2]h1]h5]uhj<h:]rGhLX BuildMasterrHrI}rJ(hUhjBubah-jubaubhLX instancerKrL}rM(hX instancehj+ubeh-hTubah-U list_itemrNubj&)rO}rP(hUh/}rQ(h3]h4]h2]h1]h5]uhj"h:]rRhP)rS}rT(hUh/}rU(h3]h4]h2]h1]h5]uhjOh:]rV(j)rW}rX(hX propertiesh/}rY(h3]h4]h2]h1]h5]uhjSh:]rZhLX propertiesr[r\}r](hUhjWubah-jubhLX -- r^r_}r`(hUhjSubhLXa dictionary of propertiesrarb}rc(hXa dictionary of propertiesrdhjSubeh-hTubah-jNubj&)re}rf(hUh/}rg(h3]h4]h2]h1]h5]uhj"h:]rhhP)ri}rj(hUh/}rk(h3]h4]h2]h1]h5]uhjeh:]rl(j)rm}rn(hXchangesh/}ro(h3]h4]h2]h1]h5]uhjih:]rphLXchangesrqrr}rs(hUhjmubah-jubhLX -- rtru}rv(hUhjiubhLXTa list of changeids that will be used to build the SourceStamp for the forced buildsrwrx}ry(hXTa list of changeids that will be used to build the SourceStamp for the forced buildsrzhjiubeh-hTubah-jNubj&)r{}r|(hUh/}r}(h3]h4]h2]h1]h5]uhj"h:]r~hP)r}r(hUh/}r(h3]h4]h2]h1]h5]uhj{h:]r(j)r}r(hX sourcestampsh/}r(h3]h4]h2]h1]h5]uhjh:]rhLX sourcestampsrr}r(hUhjubah-jubhLX -- rr}r(hUhjubhLXxthe SourceStamp dictionary that will be passed to the build; some parameters modify sourcestamps rather than properties.rr}r(hXxthe SourceStamp dictionary that will be passed to the build; some parameters modify sourcestamps rather than properties.rhjubeh-hTubah-jNubj&)r}r(hUh/}r(h3]h4]h2]h1]h5]uhj"h:]rhP)r}r(hUh/}r(h3]h4]h2]h1]h5]uhjh:]r(j)r}r(hXkwargsh/}r(h3]h4]h2]h1]h5]uhjh:]rhLXkwargsrr}r(hUhjubah-jubhLX -- rr}r(hUhjubhLX!a dictionary of the posted valuesrr}r(hX!a dictionary of the posted valuesrhjubeh-hTubah-jNubeh-U bullet_listrubah-jubeh-jubaubhP)r}r(hXThis method updates ``properties``, ``changes``, and/or ``sourcestamps`` according to the request. The default implementation is good for many simple uses, but can be overridden for more complex purposes.hj h#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K7h9hh:]r(hLXThis method updates rr}r(hXThis method updates hjubh)r}r(hX``properties``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLX propertiesrr}r(hUhjubah-jubhLX, rr}r(hX, hjubh)r}r(hX ``changes``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLXchangesrr}r(hUhjubah-jubhLX , and/or rr}r(hX , and/or hjubh)r}r(hX``sourcestamps``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLX sourcestampsrr}r(hUhjubah-jubhLX according to the request. The default implementation is good for many simple uses, but can be overridden for more complex purposes.rr}r(hX according to the request. The default implementation is good for many simple uses, but can be overridden for more complex purposes.hjubeubhP)r}r(hXWhen overriding this function, take all parameters by name (not by position), and include an ``**unused`` catch-all to guard against future changes.hj h#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K;h9hh:]r(hLX]When overriding this function, take all parameters by name (not by position), and include an rr}r(hX]When overriding this function, take all parameters by name (not by position), and include an hjubh)r}r(hX ``**unused``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLX**unusedrr}r(hUhjubah-jubhLX+ catch-all to guard against future changes.rr}r(hX+ catch-all to guard against future changes.hjubeubeubeubhP)r}r(hXThe remaining attributes and methods should be overridden by subclasses, although :py:class:`BaseParameter` provides appropriate defaults.hjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K>h:]r(hLXRThe remaining attributes and methods should be overridden by subclasses, although rr}r(hXRThe remaining attributes and methods should be overridden by subclasses, although hjubh)r}r(hX:py:class:`BaseParameter`rhjh#h&h-hh/}r(UreftypeXclasshhX BaseParameterU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hhhhhhuh8K>h:]rh)r}r(hjh/}r(h3]h4]r(hjXpy-classreh2]h1]h5]uhjh:]rhLX BaseParameterrr}r(hUhjubah-jubaubhLX provides appropriate defaults.rr}r(hX provides appropriate defaults.hjubeubhv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|X<name (buildbot.schedulers.forceshed.BaseParameter attribute)hUtrauhjh:]h-hyubh)r}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hX attributerhjuh9hh:]r(h)r}r(hXnamerhjh#h&h-hh/}r(h1]rhahhh2]h3]h4]h5]rhahXBaseParameter.namehhhuh8KFh9hh:]rh)r}r (hjhjh#h&h-hh/}r (h3]h4]h2]h1]h5]uh8KFh9hh:]r hLXnamer r }r(hUhjubaubaubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8KFh9hh:]rhP)r}r(hXThe name of the parameter. This corresponds to the name of the property that your parameter will set. This name is also used internally as identifier for http POST argumentsrhjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8KCh9hh:]rhLXThe name of the parameter. This corresponds to the name of the property that your parameter will set. This name is also used internally as identifier for http POST argumentsrr}r(hjhjubaubaubeubhv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|X=label (buildbot.schedulers.forceshed.BaseParameter attribute)h Utrauhjh:]h-hyubh)r }r!(hUhjh-hh/}r"(hhXpyh1]h2]h3]h4]h5]hX attributer#hj#uh9hh:]r$(h)r%}r&(hXlabelr'hj h#h&h-hh/}r((h1]r)h ahhh2]h3]h4]h5]r*h ahXBaseParameter.labelhhhuh8KKh9hh:]r+h)r,}r-(hj'hj%h#h&h-hh/}r.(h3]h4]h2]h1]h5]uh8KKh9hh:]r/hLXlabelr0r1}r2(hUhj,ubaubaubh)r3}r4(hUhj h#h&h-hh/}r5(h3]h4]h2]h1]h5]uh8KKh9hh:]r6hP)r7}r8(hXWThe label of the parameter, as displayed to the user. This value can contain raw HTML.r9hj3h#h&h-hTh/}r:(h3]h4]h2]h1]h5]uh8KIh9hh:]r;hLXWThe label of the parameter, as displayed to the user. This value can contain raw HTML.r<r=}r>(hj9hj7ubaubaubeubhv)r?}r@(hUh/}rA(h1]h2]h3]h4]h5]Uentries]rB(h|X?fullName() (buildbot.schedulers.forceshed.BaseParameter method)h UtrCauhjh:]h-hyubh)rD}rE(hUhjh-hh/}rF(hhXpyh1]h2]h3]h4]h5]hXmethodrGhjGuh9hh:]rH(h)rI}rJ(hXfullNamerKhjDh#h&h-hh/}rL(h1]rMh ahhh2]h3]h4]h5]rNh ahXBaseParameter.fullNamehhhuh8KRh9hh:]rO(h)rP}rQ(hjKhjIh#h&h-hh/}rR(h3]h4]h2]h1]h5]uh8KRh9hh:]rShLXfullNamerTrU}rV(hUhjPubaubh)rW}rX(hUhjIh#h&h-hh/}rY(h3]h4]h2]h1]h5]uh8KRh9hh:]ubeubh)rZ}r[(hUhjDh#h&h-hh/}r\(h3]h4]h2]h1]h5]uh8KRh9hh:]r]hP)r^}r_(hXA fully-qualified name that uniquely identifies the parameter in the scheduler. This name is used internally as the identifier for HTTP POST arguments. It is a mix of `name` and the parent's `name` (in the case of nested parameters). This field is not modifiable.hjZh#h&h-hTh/}r`(h3]h4]h2]h1]h5]uh8KNh9hh:]ra(hLXA fully-qualified name that uniquely identifies the parameter in the scheduler. This name is used internally as the identifier for HTTP POST arguments. It is a mix of rbrc}rd(hXA fully-qualified name that uniquely identifies the parameter in the scheduler. This name is used internally as the identifier for HTTP POST arguments. It is a mix of hj^ubj7)re}rf(hX`name`h/}rg(h3]h4]h2]h1]h5]uhj^h:]rhhLXnamerirj}rk(hUhjeubah-j?ubhLX and the parent's rlrm}rn(hX and the parent's hj^ubj7)ro}rp(hX`name`h/}rq(h3]h4]h2]h1]h5]uhj^h:]rrhLXnamersrt}ru(hUhjoubah-j?ubhLXB (in the case of nested parameters). This field is not modifiable.rvrw}rx(hXB (in the case of nested parameters). This field is not modifiable.hj^ubeubaubeubhv)ry}rz(hUh/}r{(h1]h2]h3]h4]h5]Uentries]r|(h|X<type (buildbot.schedulers.forceshed.BaseParameter attribute)hUtr}auhjh:]h-hyubh)r~}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hX attributerhjuh9hh:]r(h)r}r(hXtyperhj~h#h&h-hh/}r(h1]rhahhh2]h3]h4]h5]rhahXBaseParameter.typehhhuh8KYh9hh:]rh)r}r(hjhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8KYh9hh:]rhLXtyperr}r(hUhjubaubaubh)r}r(hUhj~h#h&h-hh/}r(h3]h4]h2]h1]h5]uh8KYh9hh:]rhP)r}r(hXA list of types that the parameter conforms to. These are used by the jinja template to create appropriate html form widget. The available values are visible in :bb:src:`master/buildbot/status/web/template/forms.html` in the ``force_build_one_scheduler`` macro.hjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8KUh9hh:]r(hLXA list of types that the parameter conforms to. These are used by the jinja template to create appropriate html form widget. The available values are visible in rr}r(hXA list of types that the parameter conforms to. These are used by the jinja template to create appropriate html form widget. The available values are visible in hjubcdocutils.nodes reference r)r}r(hUh/}r(UreftitlerX.master/buildbot/status/web/template/forms.htmlrUrefurirX_https://github.com/buildbot/buildbot/blob/master/master/buildbot/status/web/template/forms.htmlh1]h2]h3]h4]h5]uhjh:]rh)r}r(hjh/}r(h3]h4]h2]h1]h5]uhjh:]rhLX.master/buildbot/status/web/template/forms.htmlrr}r(hUhjubah-jubah-U referencerubhLX in the rr}r(hX in the hjubh)r}r(hX``force_build_one_scheduler``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLXforce_build_one_schedulerrr}r(hUhjubah-jubhLX macro.rr}r(hX macro.hjubeubaubeubhv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|X?default (buildbot.schedulers.forceshed.BaseParameter attribute)h Utrauhjh:]h-hyubh)r}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hX attributerhjuh9hh:]r(h)r}r(hXdefaultrhjh#h&h-hh/}r(h1]rh ahhh2]h3]h4]h5]rh ahXBaseParameter.defaulthhhuh8K^h9hh:]rh)r}r(hjhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8K^h9hh:]rhLXdefaultrr}r(hUhjubaubaubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8K^h9hh:]rhP)r}r(hXqThe default value to use if there is no user input. This is also used to fill in the form presented to the user.rhjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K\h9hh:]rhLXqThe default value to use if there is no user input. This is also used to fill in the form presented to the user.rr}r(hjhjubaubaubeubhv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|X@required (buildbot.schedulers.forceshed.BaseParameter attribute)hUtrauhjh:]h-hyubh)r}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hX attributerhjuh9hh:]r(h)r}r(hXrequiredrhjh#h&h-hh/}r(h1]rhahhh2]h3]h4]h5]rhahXBaseParameter.requiredhhhuh8Kch9hh:]rh)r}r(hjhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Kch9hh:]rhLXrequiredrr}r(hUhjubaubaubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Kch9hh:]rhP)r}r(hXJIf true, an error will be shown to user if there is no input in this fieldrhjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kah9hh:]rhLXJIf true, an error will be shown to user if there is no input in this fieldrr}r(hjhjubaubaubeubhv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|X@multiple (buildbot.schedulers.forceshed.BaseParameter attribute)hUtrauhjh:]h-hyubh)r}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hX attributer hj uh9hh:]r (h)r }r (hXmultipler hjh#h&h-hh/}r(h1]rhahhh2]h3]h4]h5]rhahXBaseParameter.multiplehhhuh8Khh9hh:]rh)r}r(hj hj h#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Khh9hh:]rhLXmultiplerr}r(hUhjubaubaubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Khh9hh:]rhP)r}r(hXOIf true, this parameter represents a list of values (e.g. list of tests to run)rhjh#h&h-hTh/}r (h3]h4]h2]h1]h5]uh8Kfh9hh:]r!hLXOIf true, this parameter represents a list of values (e.g. list of tests to run)r"r#}r$(hjhjubaubaubeubhv)r%}r&(hUh/}r'(h1]h2]h3]h4]h5]Uentries]r((h|X=regex (buildbot.schedulers.forceshed.BaseParameter attribute)hUtr)auhjh:]h-hyubh)r*}r+(hUhjh-hh/}r,(hhXpyh1]h2]h3]h4]h5]hX attributer-hj-uh9hh:]r.(h)r/}r0(hXregexr1hj*h#h&h-hh/}r2(h1]r3hahhh2]h3]h4]h5]r4hahXBaseParameter.regexhhhuh8Knh9hh:]r5h)r6}r7(hj1hj/h#h&h-hh/}r8(h3]h4]h2]h1]h5]uh8Knh9hh:]r9hLXregexr:r;}r<(hUhj6ubaubaubh)r=}r>(hUhj*h#h&h-hh/}r?(h3]h4]h2]h1]h5]uh8Knh9hh:]r@hP)rA}rB(hXA string that will be compiled as a regex and used to validate the string value of this parameter. If None, then no validation will take place.rChj=h#h&h-hTh/}rD(h3]h4]h2]h1]h5]uh8Kkh9hh:]rEhLXA string that will be compiled as a regex and used to validate the string value of this parameter. If None, then no validation will take place.rFrG}rH(hjChjAubaubaubeubhv)rI}rJ(hUh/}rK(h1]h2]h3]h4]h5]Uentries]rL(h|XFparse_from_args() (buildbot.schedulers.forceshed.BaseParameter method)hUtrMauhjh:]h-hyubh)rN}rO(hUhjh-hh/}rP(hhXpyh1]h2]h3]h4]h5]hXmethodrQhjQuh9hh:]rR(h)rS}rT(hXparse_from_args(l)hjNh#h&h-hh/}rU(h1]rVhahhh2]h3]h4]h5]rWhahXBaseParameter.parse_from_argshhhuh8Kth9hh:]rX(h)rY}rZ(hXparse_from_argshjSh#h&h-hh/}r[(h3]h4]h2]h1]h5]uh8Kth9hh:]r\hLXparse_from_argsr]r^}r_(hUhjYubaubh)r`}ra(hUhjSh#h&h-hh/}rb(h3]h4]h2]h1]h5]uh8Kth9hh:]rch)rd}re(hXlh/}rf(h3]h4]h2]h1]h5]uhj`h:]rghLXlrh}ri(hUhjdubah-hubaubeubh)rj}rk(hUhjNh#h&h-hh/}rl(h3]h4]h2]h1]h5]uh8Kth9hh:]rmhP)rn}ro(hXreturn the list of object corresponding to the list or string passed default function will just call :py:func:`parse_from_arg` with the first argumenthjjh#h&h-hTh/}rp(h3]h4]h2]h1]h5]uh8Kqh9hh:]rq(hLXereturn the list of object corresponding to the list or string passed default function will just call rrrs}rt(hXereturn the list of object corresponding to the list or string passed default function will just call hjnubh)ru}rv(hX:py:func:`parse_from_arg`rwhjnh#h&h-hh/}rx(UreftypeXfunchhXparse_from_argU refdomainXpyryh1]h2]U refexplicith3]h4]h5]hhhhhhuh8Kqh:]rzh)r{}r|(hjwh/}r}(h3]h4]r~(hjyXpy-funcreh2]h1]h5]uhjuh:]rhLXparse_from_argrr}r(hUhj{ubah-jubaubhLX with the first argumentrr}r(hX with the first argumenthjnubeubaubeubhv)r}r(hUh/}r(h1]h2]h3]h4]h5]Uentries]r(h|XEparse_from_arg() (buildbot.schedulers.forceshed.BaseParameter method)hUtrauhjh:]h-hyubh)r}r(hUhjh-hh/}r(hhXpyh1]h2]h3]h4]h5]hXmethodrhjuh9hh:]r(h)r}r(hXparse_from_arg(s)rhjh#h&h-hh/}r(h1]rhahhh2]h3]h4]h5]rhahXBaseParameter.parse_from_arghhhuh8Kxh9hh:]r(h)r}r(hXparse_from_arghjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Kxh9hh:]rhLXparse_from_argrr}r(hUhjubaubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Kxh9hh:]rh)r}r(hXsh/}r(h3]h4]h2]h1]h5]uhjh:]rhLXsr}r(hUhjubah-hubaubeubh)r}r(hUhjh#h&h-hh/}r(h3]h4]h2]h1]h5]uh8Kxh9hh:]rhP)r}r(hXmreturn the object corresponding to the string passed default function will just return the unmodified stringrhjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kwh9hh:]rhLXmreturn the object corresponding to the string passed default function will just return the unmodified stringrr}r(hjhjubaubaubeubeubeubeubeubh)r}r(hUhh h#h&h-h;h/}r(h3]h4]h2]h1]rUnested-parametersrah5]rhauh8K|h9hh:]r(hE)r}r(hXNested Parametersrhjh#h&h-hIh/}r(h3]h4]h2]h1]h5]uh8K|h9hh:]rhLXNested Parametersrr}r(hjhjubaubhP)r}r(hX[The :py:class:`NestedParameter` class is a container for parameters. The motivating purpose for this feature is the multiple-codebase configuration, which needs to provide the user with a form to control the branch (et al) for each codebase independently. Each branch parameter is a string field with name 'branch' and these must be disambiguated.hjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8K~h9hh:]r(hLXThe rr}r(hXThe hjubh)r}r(hX:py:class:`NestedParameter`rhjh#h&h-hh/}r(UreftypeXclasshhXNestedParameterU refdomainXpyrh1]h2]U refexplicith3]h4]h5]hhhNhhuh8K~h:]rh)r}r(hjh/}r(h3]h4]r(hjXpy-classreh2]h1]h5]uhjh:]rhLXNestedParameterrr}r(hUhjubah-jubaubhLX< class is a container for parameters. The motivating purpose for this feature is the multiple-codebase configuration, which needs to provide the user with a form to control the branch (et al) for each codebase independently. Each branch parameter is a string field with name 'branch' and these must be disambiguated.rr}r(hX< class is a container for parameters. The motivating purpose for this feature is the multiple-codebase configuration, which needs to provide the user with a form to control the branch (et al) for each codebase independently. Each branch parameter is a string field with name 'branch' and these must be disambiguated.hjubeubhP)r}r(hXEach of the child parameters mixes in the parent's name to create the fully qualified ``fullName``. This allows, for example, each of the 'branch' fields to have a unique name in the POST request. The `NestedParameter` handles adding this extra bit to the name to each of the children. When the `kwarg` dictionary is posted back, this class also converts the flat POST dictionary into a richer structure that represents the nested structure.hjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kh9hh:]r(hLXVEach of the child parameters mixes in the parent's name to create the fully qualified rr}r(hXVEach of the child parameters mixes in the parent's name to create the fully qualified hjubh)r}r(hX ``fullName``h/}r(h3]h4]h2]h1]h5]uhjh:]rhLXfullNamerr}r(hUhjubah-jubhLXg. This allows, for example, each of the 'branch' fields to have a unique name in the POST request. The rr}r(hXg. This allows, for example, each of the 'branch' fields to have a unique name in the POST request. The hjubj7)r}r(hX`NestedParameter`h/}r(h3]h4]h2]h1]h5]uhjh:]rhLXNestedParameterrr}r(hUhjubah-j?ubhLXM handles adding this extra bit to the name to each of the children. When the rr}r(hXM handles adding this extra bit to the name to each of the children. When the hjubj7)r}r(hX`kwarg`h/}r(h3]h4]h2]h1]h5]uhjh:]rhLXkwargrr}r(hUhjubah-j?ubhLX dictionary is posted back, this class also converts the flat POST dictionary into a richer structure that represents the nested structure.rr}r(hX dictionary is posted back, this class also converts the flat POST dictionary into a richer structure that represents the nested structure.hjubeubhP)r}r(hXAs illustration, if the nested parameter has the name 'foo', and has children 'bar1' and 'bar2', then the POST will have entries like "foo-bar1" and "foo-bar2". The nested parameter will translate this into a dictionary in the 'kwargs' structure, resulting in something like::hjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kh9hh:]rhLXAs illustration, if the nested parameter has the name 'foo', and has children 'bar1' and 'bar2', then the POST will have entries like "foo-bar1" and "foo-bar2". The nested parameter will translate this into a dictionary in the 'kwargs' structure, resulting in something like:rr}r(hXAs illustration, if the nested parameter has the name 'foo', and has children 'bar1' and 'bar2', then the POST will have entries like "foo-bar1" and "foo-bar2". The nested parameter will translate this into a dictionary in the 'kwargs' structure, resulting in something like:hjubaubcdocutils.nodes literal_block r )r }r (hXVkwargs = { # ... 'foo': { 'bar1': '...', 'bar2': '...' } }hjh#h&h-U literal_blockr h/}r (U xml:spacerUpreserverh1]h2]h3]h4]h5]uh8Kh9hh:]rhLXVkwargs = { # ... 'foo': { 'bar1': '...', 'bar2': '...' } }rr}r(hUhj ubaubhP)r}r(hXJArbitrary nesting is allowed and results in a deeper dictionary structure.rhjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kh9hh:]rhLXJArbitrary nesting is allowed and results in a deeper dictionary structure.rr}r(hjhjubaubhP)r}r(hXNesting can also be used for presentation purposes. If the name of the :py:class:`NestedParameter` is empty, the nest is "anonymous" and does not mangle the child names. However, in the HTML layout, the nest will be presented as a logical group.hjh#h&h-hTh/}r(h3]h4]h2]h1]h5]uh8Kh9hh:]r(hLXGNesting can also be used for presentation purposes. If the name of the r r!}r"(hXGNesting can also be used for presentation purposes. If the name of the hjubh)r#}r$(hX:py:class:`NestedParameter`r%hjh#h&h-hh/}r&(UreftypeXclasshhXNestedParameterU refdomainXpyr'h1]h2]U refexplicith3]h4]h5]hhhNhhuh8Kh:]r(h)r)}r*(hj%h/}r+(h3]h4]r,(hj'Xpy-classr-eh2]h1]h5]uhj#h:]r.hLXNestedParameterr/r0}r1(hUhj)ubah-jubaubhLX is empty, the nest is "anonymous" and does not mangle the child names. However, in the HTML layout, the nest will be presented as a logical group.r2r3}r4(hX is empty, the nest is "anonymous" and does not mangle the child names. However, in the HTML layout, the nest will be presented as a logical group.hjubeubeubeubh#h&h-Usystem_messager5h/}r6(h3]UlevelKh1]h2]r7h@aUsourceh&h4]h5]UlineKUtypeUINFOr8uh8Kh9hh:]r9hP)r:}r;(hUh/}r<(h3]h4]h2]h1]h5]uhhh:]r=hLX1Duplicate implicit target name: "forcescheduler".r>r?}r@(hUhj:ubah-hTubaubaUcurrent_sourcerANU decorationrBNUautofootnote_startrCKUnameidsrD}rE(hhhhhhh h^h h h h h h h h hhhhhh7hhhhhhhhhjuh:]rF(cdocutils.nodes comment rG)rH}rI(hX -*- rst -*-hhh#h&h-UcommentrJh/}rK(jjh1]h2]h3]h4]h5]uh8Kh9hh:]rLhLX -*- rst -*-rMrN}rO(hUhjHubaubh+h ehUU transformerrPNU footnote_refsrQ}rRUrefnamesrS}rTUsymbol_footnotesrU]rVUautofootnote_refsrW]rXUsymbol_footnote_refsrY]rZU citationsr[]r\h9hU current_liner]NUtransform_messagesr^]r_(h)r`}ra(hUh/}rb(h3]UlevelKh1]h2]Usourceh&h4]h5]UlineKUtypej8uh:]rchP)rd}re(hUh/}rf(h3]h4]h2]h1]h5]uhj`h:]rghLX4Hyperlink target "forcescheduler" is not referenced.rhri}rj(hUhjdubah-hTubah-j5ubh)rk}rl(hUh/}rm(h3]UlevelKh1]h2]Usourceh&h4]h5]UlineKUtypej8uh:]rnhP)ro}rp(hUh/}rq(h3]h4]h2]h1]h5]uhjkh:]rrhLXJHyperlink target "module-buildbot.schedulers.forceshed" is not referenced.rsrt}ru(hUhjoubah-hTubah-j5ubeUreporterrvNUid_startrwKU autofootnotesrx]ryU citation_refsrz}r{Uindirect_targetsr|]r}Usettingsr~(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhINUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUY/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-forcesched.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hj/huhqhjh^hZh j%h jjjhjh@h h jh jIhjShjh7h hjRhjhj hhuUsubstitution_namesr}rh-h9h/}r(h3]h1]h2]Usourceh&h4]h5]uU footnotesr]rUrefidsr}rh7]rh+asub.PK4Dϗ1buildbot-v0.8.9/.doctrees/developer/index.doctreecdocutils.nodes document q)q}q(U nametypesq}qXbuildbot developmentqsUsubstitution_defsq}qUparse_messagesq ]q cdocutils.nodes system_message q )q }q (U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceqcdocutils.nodes reprunicode qXP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/index.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q)q}q(hX.. _Buildbot Development:hhhhUtagnameqUtargetqU attributesq }q!(Uidsq"]Ubackrefsq#]Udupnamesq$]Uclassesq%]Unamesq&]Urefidq'Ubuildbot-developmentq(uUlineq)KUdocumentq*hUchildrenq+]ubshUsectionq,h }q-(h$]q.Xbuildbot developmentq/ah%]h#]h"]q0(h(Uid1q1eh&]q2hauh)Kh*hUexpect_referenced_by_idq3}q4h(hsh+]q5(cdocutils.nodes title q6)q7}q8(hXBuildbot Developmentq9hhhhhUtitleq:h }q;(h$]h%]h#]h"]h&]uh)Kh*hh+]qq?}q@(hh9hh7ubaubcdocutils.nodes paragraph qA)qB}qC(hXThis chapter is the official repository for the collected wisdom of the Buildbot hackers. It is intended both for developers writing patches that will be included in Buildbot itself, and for advanced users who wish to customize Buildbot.qDhhhhhU paragraphqEh }qF(h$]h%]h#]h"]h&]uh)Kh*hh+]qGh=XThis chapter is the official repository for the collected wisdom of the Buildbot hackers. It is intended both for developers writing patches that will be included in Buildbot itself, and for advanced users who wish to customize Buildbot.qHqI}qJ(hhDhhBubaubcdocutils.nodes compound qK)qL}qM(hUhhhhhUcompoundqNh }qO(h$]h%]qPUtoctree-wrapperqQah#]h"]h&]uh)Nh*hh+]qRcsphinx.addnodes toctree qS)qT}qU(hUhhLhhhUtoctreeqVh }qW(UnumberedqXKU includehiddenqYhXdeveloper/indexqZU titlesonlyq[Uglobq\h"]h#]h$]h%]h&]Uentriesq]]q^(NXdeveloper/master-overviewq_q`NXdeveloper/definitionsqaqbNXdeveloper/styleqcqdNXdeveloper/testsqeqfNXdeveloper/configqgqhNXdeveloper/utilsqiqjNXdeveloper/databaseqkqlNXdeveloper/resultsqmqnNXdeveloper/formatsqoqpNXdeveloper/webstatusqqqrNXdeveloper/master-slaveqsqtNXdeveloper/encodingsquqvNXdeveloper/metricsqwqxNXdeveloper/classesqyqzeUhiddenq{U includefilesq|]q}(h_hahchehghihkhmhohqhshuhwhyeUmaxdepthq~Kuh)K h+]ubaubeubhhhUsystem_messageqh }q(h$]UlevelKh"]h#]qh1aUsourcehh%]h&]UlineKUtypeUINFOquh)Kh*hh+]qhA)q}q(hUh }q(h$]h%]h#]h"]h&]uhh h+]qh=X7Duplicate implicit target name: "buildbot development".qq}q(hUhhubahhEubaubaUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}qhh(sh+]q(hhehUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh*hU current_lineqNUtransform_messagesq]qh )q}q(hUh }q(h$]UlevelKh"]h#]Usourcehh%]h&]UlineKUtypehuh+]qhA)q}q(hUh }q(h$]h%]h#]h"]h&]uhhh+]qh=X:Hyperlink target "buildbot-development" is not referenced.qq}q(hUhhubahhEubahhubaUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesqNh:NUerror_encoding_error_handlerqUbackslashreplaceqUdebugqNUembed_stylesheetqˉUoutput_encoding_error_handlerqUstrictqU sectnum_xformqKUdump_transformsqNU docinfo_xformqKUwarning_streamqNUpep_file_url_templateqUpep-%04dqUexit_status_levelqKUconfigqNUstrict_visitorqNUcloak_email_addressesq׈Utrim_footnote_reference_spaceq؉UenvqNUdump_pseudo_xmlqNUexpose_internalsqNUsectsubtitle_xformq܉U source_linkqNUrfc_referencesqNUoutput_encodingqUutf-8qU source_urlqNUinput_encodingqU utf-8-sigqU_disable_configqNU id_prefixqUU tab_widthqKUerror_encodingqUUTF-8qU_sourceqUP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/index.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU pep_base_urlqUhttp://www.python.org/dev/peps/qUsyntax_highlightqUlongqUinput_encoding_error_handlerqhUauto_id_prefixqUidqUdoctitle_xformqUstrip_elements_with_classesqNU _config_filesq]Ufile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}q(h1hh(huUsubstitution_namesq}rhh*h }r(h$]h"]h#]Usourcehh%]h&]uU footnotesr]rUrefidsr}rh(]rhasub.PK4D>goo4buildbot-v0.8.9/.doctrees/developer/database.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X buildbot.db.model.Model.metadataqX;buildbot.db.users.UsersConnectorComponent.getUserByUsernameqX buildsetsqNX-buildbot.db.changes.ChangesConnectorComponentq Xmodifying the database schemaq NXsubqueries in mysqlq NX buildrequestsq NX+buildbot.db.builds.BuildsConnectorComponentq XtestsqNX>buildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetsqXmodifying-the-database-schemaqXObuildbot.db.sourcestampsets.SourceStampSetsConnectorComponent.addSourceStampSetqXindex length in mysqlqNX-buildbot.db.buildrequests.AlreadyClaimedErrorqX1buildbot.db.users.UsersConnectorComponent.getUserqX>buildbot.db.changes.ChangesConnectorComponent.getRecentChangesqX=buildbot.db.sourcestampsets.SourceStampSetsConnectorComponentqXapiqNX?buildbot.db.builds.BuildsConnectorComponent.getBuildsForRequestqX9buildbot.db.buildrequests.BuildRequestsConnectorComponentqX;buildbot.db.changes.ChangesConnectorComponent.getChangeUidsqXCbuildbot.db.schedulers.SchedulersConnectorComponent.classifyChangesqXdirect database accessqNX)buildbot.db.buildrequests.NotClaimedErrorqX buildbot.db.pool.DBThreadPool.doqX8buildbot.db.builds.BuildsConnectorComponent.finishBuildsqX=buildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetq XLbuildbot.db.buildrequests.BuildRequestsConnectorComponent.claimBuildRequestsq!Xstateq"NX)referential integrity in sqlite and mysqlq#NXObuildbot.db.buildrequests.BuildRequestsConnectorComponent.completeBuildRequestsq$X"buildbot.db.model.Model.is_currentq%Xsourcestampsetq&NX5buildbot.db.buildslaves.BuildslavesConnectorComponentq'X?buildbot.db.changes.ChangesConnectorComponent.getLatestChangeidq(X)buildbot.db.state.StateConnectorComponentq)Xsqlalchemy-migrateq*X7buildbot.db.sourcestamps.SourceStampsConnectorComponentq+X4buildbot.db.builds.BuildsConnectorComponent.getBuildq,Xdeveloper-databaseq-XIbuildbot.db.buildslaves.BuildslavesConnectorComponent.getBuildslaveByNameq.Xtransactions in mysqlq/NXchangesq0NXsqlalchemy coreq1X4buildbot.db.builds.BuildsConnectorComponent.addBuildq2X!buildbot.db.connector.DBConnectorq3XJbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestsq4XPbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimExpiredRequestsq5X=buildbot.db.buildsets.BuildsetsConnectorComponent.addBuildsetq6X4buildbot.db.users.UsersConnectorComponent.removeUserq7XDbuildbot.db.buildslaves.BuildslavesConnectorComponent.getBuildslavesq8Xdatabase schemaq9NXBbuildbot.db.buildsets.BuildsetsConnectorComponent.completeBuildsetq:XGbuildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetPropertiesq;Xthe db connector and componentsqX,buildbot.db.pool.DBThreadPool.do_with_engineq?Xbuildsq@NXbuildbot.db.base.cachedqAX sourcestampsqBNXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStampqCX(buildbot.db.base.DBConnectorComponent.dbqDXdatabase overviewqENXFbuildbot.db.buildslaves.BuildslavesConnectorComponent.updateBuildslaveqFX3buildbot.db.schedulers.SchedulersConnectorComponentqGXLbuildbot.db.schedulers.SchedulersConnectorComponent.getChangeClassificationsqHX1buildbot.db.buildsets.BuildsetsConnectorComponentqIX2buildbot.db.state.StateConnectorComponent.getStateqJX5buildbot.db.state.StateConnectorComponent.getObjectIdqKX buildslavesqLNXGbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStampsqMX4buildbot.db.users.UsersConnectorComponent.updateUserqNXIbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestqOX%buildbot.db.base.DBConnectorComponentqPX)buildbot.db.users.UsersConnectorComponentqQXdatabase compatibility notesqRNX9buildbot.db.users.UsersConnectorComponent.identifierToUidqSXusersqTNXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimBuildRequestsqUXD"specified key was too long; max key length is 1000 bytes" with utf8qVXbuildbot.db.pool.DBThreadPoolqWX schedulersqXNX"writing database connector methodsqYNXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.reclaimBuildRequestsqZX7buildbot.db.changes.ChangesConnectorComponent.getChangeq[Xbuildbot.db.model.Model.upgradeq\Xdatabaseq]NXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.addSourceStampq^X8buildbot.db.users.UsersConnectorComponent.findUserByAttrq_X2buildbot.db.state.StateConnectorComponent.setStateq`XcachingqaNXbuildbot.db.model.ModelqbX7buildbot.db.changes.ChangesConnectorComponent.addChangeqcuUsubstitution_defsqd}qeUparse_messagesqf]qg(cdocutils.nodes system_message qh)qi}qj(U rawsourceqkUUparentqlcdocutils.nodes section qm)qn}qo(hkUhlhm)qp}qq(hkUhlhm)qr}qs(hkUhlhUsourceqtcdocutils.nodes reprunicode quXS/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/database.rstqvqw}qxbUexpect_referenced_by_nameqy}qzh-cdocutils.nodes target q{)q|}q}(hkX.. _developer-database:hlhhthwUtagnameq~UtargetqU attributesq}q(Uidsq]Ubackrefsq]Udupnamesq]Uclassesq]Unamesq]UrefidqUdeveloper-databasequUlineqKUdocumentqhUchildrenq]ubsh~Usectionqh}q(h]h]h]h]q(Udatabaseqheh]q(h]h-euhKhhUexpect_referenced_by_idq}qhh|sh]q(cdocutils.nodes title q)q}q(hkXDatabaseqhlhrhthwh~Utitleqh}q(h]h]h]h]h]uhKhhh]qcdocutils.nodes Text qXDatabaseqq}q(hkhhlhubaubcdocutils.nodes paragraph q)q}q(hkX As of version 0.8.0, Buildbot has used a database as part of its storage backend. This section describes the database connector classes, which allow other parts of Buildbot to access the database. It also describes how to modify the database schema and the connector classes themselves.qhlhrhthwh~U paragraphqh}q(h]h]h]h]h]uhKhhh]qhX As of version 0.8.0, Buildbot has used a database as part of its storage backend. This section describes the database connector classes, which allow other parts of Buildbot to access the database. It also describes how to modify the database schema and the connector classes themselves.qq}q(hkhhlhubaubcdocutils.nodes note q)q}q(hkXBuildbot is only half-migrated to a database backend. Build and builder status information is still stored on disk in pickle files. This is difficult to fix, although work is underway.hlhrhthwh~Unoteqh}q(h]h]h]h]h]uhNhhh]qh)q}q(hkXBuildbot is only half-migrated to a database backend. Build and builder status information is still stored on disk in pickle files. This is difficult to fix, although work is underway.qhlhhthwh~hh}q(h]h]h]h]h]uhK h]qhXBuildbot is only half-migrated to a database backend. Build and builder status information is still stored on disk in pickle files. This is difficult to fix, although work is underway.qq}q(hkhhlhubaubaubhm)q}q(hkUhlhrhthwh~hh}q(h]h]h]h]qUdatabase-overviewqah]qhEauhKhhh]q(h)q}q(hkXDatabase Overviewqhlhhthwh~hh}q(h]h]h]h]h]uhKhhh]qhXDatabase OverviewqÅq}q(hkhhlhubaubh)q}q(hkXAll access to the Buildbot database is mediated by database connector classes. These classes provide a functional, asynchronous interface to other parts of Buildbot, and encapsulate the database-specific details in a single location in the codebase.qhlhhthwh~hh}q(h]h]h]h]h]uhKhhh]qhXAll access to the Buildbot database is mediated by database connector classes. These classes provide a functional, asynchronous interface to other parts of Buildbot, and encapsulate the database-specific details in a single location in the codebase.q˅q}q(hkhhlhubaubh)q}q(hkX%The connector API, defined below, is a stable API in Buildbot, and can be called from any other component. Given a master ``master``, the root of the database connectors is available at ``master.db``, so, for example, the state connector's ``getState`` method is ``master.db.state.getState``.hlhhthwh~hh}q(h]h]h]h]h]uhKhhh]q(hX{The connector API, defined below, is a stable API in Buildbot, and can be called from any other component. Given a master q҅q}q(hkX{The connector API, defined below, is a stable API in Buildbot, and can be called from any other component. Given a master hlhubcdocutils.nodes literal q)q}q(hkX ``master``h}q(h]h]h]h]h]uhlhh]qhXmasterqڅq}q(hkUhlhubah~UliteralqubhX6, the root of the database connectors is available at qޅq}q(hkX6, the root of the database connectors is available at hlhubh)q}q(hkX ``master.db``h}q(h]h]h]h]h]uhlhh]qhX master.dbq允q}q(hkUhlhubah~hubhX), so, for example, the state connector's q腁q}q(hkX), so, for example, the state connector's hlhubh)q}q(hkX ``getState``h}q(h]h]h]h]h]uhlhh]qhXgetStateqq}q(hkUhlhubah~hubhX method is qq}q(hkX method is hlhubh)q}q(hkX``master.db.state.getState``h}q(h]h]h]h]h]uhlhh]qhXmaster.db.state.getStateqq}q(hkUhlhubah~hubhX.q}q(hkX.hlhubeubh)q}q(hkX6The connectors all use `SQLAlchemy Core `_ to achieve (almost) database-independent operation. Note that the SQLAlchemy ORM is not used in Buildbot. Database queries are carried out in threads, and report their results back to the main thread via Twisted Deferreds.hlhhthwh~hh}r(h]h]h]h]h]uhKhhh]r(hXThe connectors all use rr}r(hkXThe connectors all use hlhubcdocutils.nodes reference r)r}r(hkX>`SQLAlchemy Core `_h}r(UnameXSQLAlchemy CoreUrefurir X)http://www.sqlalchemy.org/docs/index.htmlr h]h]h]h]h]uhlhh]r hXSQLAlchemy Corer r }r(hkUhljubah~U referencerubh{)r}r(hkX, U referencedrKhlhh~hh}r(Urefurij h]rUsqlalchemy-corerah]h]h]h]rh1auh]ubhX to achieve (almost) database-independent operation. Note that the SQLAlchemy ORM is not used in Buildbot. Database queries are carried out in threads, and report their results back to the main thread via Twisted Deferreds.rr}r(hkX to achieve (almost) database-independent operation. Note that the SQLAlchemy ORM is not used in Buildbot. Database queries are carried out in threads, and report their results back to the main thread via Twisted Deferreds.hlhubeubeubhm)r}r(hkUhlhrhthwh~hh}r(h]h]h]h]rUschemarah]rh=auhK%hhh]r (h)r!}r"(hkXSchemar#hljhthwh~hh}r$(h]h]h]h]h]uhK%hhh]r%hXSchemar&r'}r((hkj#hlj!ubaubh)r)}r*(hkXThe database schema is maintained with `SQLAlchemy-Migrate `_. This package handles the details of upgrading users between different schema versions.hljhthwh~hh}r+(h]h]h]h]h]uhK'hhh]r,(hX'The database schema is maintained with r-r.}r/(hkX'The database schema is maintained with hlj)ubj)r0}r1(hkXD`SQLAlchemy-Migrate `_h}r2(UnameXSQLAlchemy-Migratej X,http://code.google.com/p/sqlalchemy-migrate/r3h]h]h]h]h]uhlj)h]r4hXSQLAlchemy-Migrater5r6}r7(hkUhlj0ubah~jubh{)r8}r9(hkX/ jKhlj)h~hh}r:(Urefurij3h]r;Usqlalchemy-migrater<ah]h]h]h]r=h*auh]ubhXY. This package handles the details of upgrading users between different schema versions.r>r?}r@(hkXY. This package handles the details of upgrading users between different schema versions.hlj)ubeubh)rA}rB(hkXThe schema itself is considered an implementation detail, and may change significantly from version to version. Users should rely on the API (below), rather than performing queries against the database itself.rChljhthwh~hh}rD(h]h]h]h]h]uhK+hhh]rEhXThe schema itself is considered an implementation detail, and may change significantly from version to version. Users should rely on the API (below), rather than performing queries against the database itself.rFrG}rH(hkjChljAubaubeubhm)rI}rJ(hkUhlhrhthwh~hh}rK(h]h]h]h]rLUapirMah]rNhauhK0hhh]rO(h)rP}rQ(hkXAPIrRhljIhthwh~hh}rS(h]h]h]h]h]uhK0hhh]rThXAPIrUrV}rW(hkjRhljPubaubhm)rX}rY(hkUhljIhthwh~hh}rZ(h]h]h]h]r[(X module-buildbot.db.buildrequestsr\U buildrequestsr]eh]r^h auhK3hhh]r_(h)r`}ra(hkX buildrequestsrbhljXhthwh~hh}rc(h]h]h]h]h]uhK3hhh]rdhX buildrequestsrerf}rg(hkjbhlj`ubaubcsphinx.addnodes index rh)ri}rj(hkUhljXhthwh~Uindexrkh}rl(h]h]h]h]h]Uentries]rm(UsinglernX"buildbot.db.buildrequests (module)X module-buildbot.db.buildrequestsUtroauhK6hhh]ubjh)rp}rq(hkUhljXhthwh~jkh}rr(h]h]h]h]h]Uentriesrs]rt(UpairruX%BuildRequests; DB Connector ComponentUindex-0rvUtrwaUinlinerxuhK7hhh]ubh{)ry}rz(hkUhljXhthwh~hh}r{(h]h]h]h]r|jvah]uhK8hhh]ubjh)r}}r~(hkUhljXhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXAlreadyClaimedErrorrhUtrauhNhhh]ubcsphinx.addnodes desc r)r}r(hkUhljXhthwh~Udescrh}r(UnoindexrUdomainrXpyh]h]h]h]h]UobjtyperX exceptionrUdesctyperjuhNhhh]r(csphinx.addnodes desc_signature r)r}r(hkjhljhthwh~Udesc_signaturerh}r(h]rhaUmodulerXbuildbot.db.buildrequestsrh]h]h]h]rhaUfullnamerjUclassrUUfirstruhK(hkUhlj5ubah~hubaubhX*, then attempt to claim the requests with r?r@}rA(hkX*, then attempt to claim the requests with hlj ubj')rB}rC(hkX:py:meth:`claimBuildRequests`rDhlj hthwh~j+h}rE(UreftypeXmethj-j.XclaimBuildRequestsU refdomainXpyrFh]h]U refexplicith]h]h]j0j1j2jj3juhKCh]rGh)rH}rI(hkjDh}rJ(h]h]rK(j9jFXpy-methrLeh]h]h]uhljBh]rMhXclaimBuildRequestsrNrO}rP(hkUhljHubah~hubaubhXO. The claim can fail if another master has claimed the request in the interim.rQrR}rS(hkXO. The claim can fail if another master has claimed the request in the interim.hlj ubeubh)rT}rU(hkXFAn instance of this class is available at ``master.db.buildrequests``.hljhthwh~hh}rV(h]h]h]h]h]uhKIhhh]rW(hX*An instance of this class is available at rXrY}rZ(hkX*An instance of this class is available at hljTubh)r[}r\(hkX``master.db.buildrequests``h}r](h]h]h]h]h]uhljTh]r^hXmaster.db.buildrequestsr_r`}ra(hkUhlj[ubah~hubhX.rb}rc(hkX.hljTubeubjh)rd}re(hkUhljhthwh~jkh}rf(h]h]h]h]h]js]rg((jnXbrdictUindex-1rhUtri(jnXbridjhUtrjejxuhKKhhh]ubh{)rk}rl(hkUhljhthwh~hh}rm(h]h]h]h]h]hjhuhKLhhh]ubh)rn}ro(hkXBuild requests are indexed by an ID referred to as a *brid*. The contents of a request are represented as build request dictionaries (brdicts) with keyshljhthwhy}h~hh}rp(h]h]h]h]rqjhah]uhKMhhh}rrjhjksh]rs(hX5Build requests are indexed by an ID referred to as a rtru}rv(hkX5Build requests are indexed by an ID referred to as a hljnubcdocutils.nodes emphasis rw)rx}ry(hkX*brid*h}rz(h]h]h]h]h]uhljnh]r{hXbridr|r}}r~(hkUhljxubah~UemphasisrubhX^. The contents of a request are represented as build request dictionaries (brdicts) with keysrr}r(hkX^. The contents of a request are represented as build request dictionaries (brdicts) with keyshljnubeubcdocutils.nodes bullet_list r)r}r(hkUhljhthwh~U bullet_listrh}r(UbulletrX*h]h]h]h]h]uhKQhhh]r(cdocutils.nodes list_item r)r}r(hkX``brid``rhljhthwh~U list_itemrh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKQh]rh)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXbridrr}r(hkUhljubah~hubaubaubj)r}r(hkX``buildsetid``rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKRh]rh)r}r(hkjh}r(h]h]h]h]h]uhljh]rhX buildsetidrr}r(hkUhljubah~hubaubaubj)r}r(hkX``buildername``rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKSh]rh)r}r(hkjh}r(h]h]h]h]h]uhljh]rhX buildernamerr}r(hkUhljubah~hubaubaubj)r}r(hkX ``priority``rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKTh]rh)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXpriorityrr}r(hkUhljubah~hubaubaubj)r}r(hkX5``claimed`` (boolean, true if the request is claimed)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKUh]r(h)r}r(hkX ``claimed``h}r(h]h]h]h]h]uhljh]rhXclaimedrr}r(hkUhljubah~hubhX* (boolean, true if the request is claimed)rr}r(hkX* (boolean, true if the request is claimed)hljubeubaubj)r}r(hkXD``claimed_at`` (datetime object, time this request was last claimed)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKVh]r(h)r}r(hkX``claimed_at``h}r(h]h]h]h]h]uhljh]rhX claimed_atrr}r(hkUhljubah~hubhX6 (datetime object, time this request was last claimed)rr}r(hkX6 (datetime object, time this request was last claimed)hljubeubaubj)r}r(hkXA``mine`` (boolean, true if the request is claimed by this master)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhKWh]r(h)r}r(hkX``mine``h}r(h]h]h]h]h]uhljh]rhXminerr}r(hkUhljubah~hubhX9 (boolean, true if the request is claimed by this master)rr}r(hkX9 (boolean, true if the request is claimed by this master)hljubeubaubj)r}r(hkX7``complete`` (boolean, true if the request is complete)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]r h)r }r (hkjhljhthwh~hh}r (h]h]h]h]h]uhKXh]r (h)r}r(hkX ``complete``h}r(h]h]h]h]h]uhlj h]rhXcompleterr}r(hkUhljubah~hubhX+ (boolean, true if the request is complete)rr}r(hkX+ (boolean, true if the request is complete)hlj ubeubaubj)r}r(hkXC``complete_at`` (datetime object, time this request was completed) hljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkXB``complete_at`` (datetime object, time this request was completed)hljhthwh~hh}r(h]h]h]h]h]uhKYh]r(h)r }r!(hkX``complete_at``h}r"(h]h]h]h]h]uhljh]r#hX complete_atr$r%}r&(hkUhlj ubah~hubhX3 (datetime object, time this request was completed)r'r(}r)(hkX3 (datetime object, time this request was completed)hljubeubaubeubjh)r*}r+(hkUhljhthwh~jkh}r,(h]h]h]h]h]Uentries]r-(jnXTgetBuildRequest() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)hOUtr.auhNhhh]ubj)r/}r0(hkUhljhthwh~jh}r1(jjXpyh]h]h]h]h]jXmethodr2jj2uhNhhh]r3(j)r4}r5(hkXgetBuildRequest(brid)hlj/hthwh~jh}r6(h]r7hOajjh]h]h]h]r8hOajX/BuildRequestsConnectorComponent.getBuildRequestjjjuhKchhh]r9(j)r:}r;(hkXgetBuildRequesthlj4hthwh~jh}r<(h]h]h]h]h]uhKchhh]r=hXgetBuildRequestr>r?}r@(hkUhlj:ubaubcsphinx.addnodes desc_parameterlist rA)rB}rC(hkUhlj4hthwh~Udesc_parameterlistrDh}rE(h]h]h]h]h]uhKchhh]rFcsphinx.addnodes desc_parameter rG)rH}rI(hkXbridh}rJ(h]h]h]h]h]uhljBh]rKhXbridrLrM}rN(hkUhljHubah~Udesc_parameterrOubaubeubj)rP}rQ(hkUhlj/hthwh~jh}rR(h]h]h]h]h]uhKchhh]rS(cdocutils.nodes field_list rT)rU}rV(hkUhljPhthwh~U field_listrWh}rX(h]h]h]h]h]uhNhhh]rY(cdocutils.nodes field rZ)r[}r\(hkUh}r](h]h]h]h]h]uhljUh]r^(cdocutils.nodes field_name r_)r`}ra(hkUh}rb(h]h]h]h]h]uhlj[h]rchX Parametersrdre}rf(hkUhlj`ubah~U field_namergubcdocutils.nodes field_body rh)ri}rj(hkUh}rk(h]h]h]h]h]uhlj[h]rlh)rm}rn(hkUh}ro(h]h]h]h]h]uhljih]rp(cdocutils.nodes strong rq)rr}rs(hkXbridh}rt(h]h]h]h]h]uhljmh]ruhXbridrvrw}rx(hkUhljrubah~UstrongryubhX -- rzr{}r|(hkUhljmubhXbuild request id to look upr}r~}r(hkXbuild request id to look uphljmubeh~hubah~U field_bodyrubeh~UfieldrubjZ)r}r(hkUh}r(h]h]h]h]h]uhljUh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(hX brdict or rr}r(hkX brdict or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX, via Deferredrr}r(hkX, via Deferredhljubeh~hubah~jubeh~jubeubh)r}r(hkXGet a single BuildRequest, in the format described above. This method returns ``None`` if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed.hljPhthwh~hh}r(h]h]h]h]h]uhK`hhh]r(hXOGet a single BuildRequest, in the format described above. This method returns rr}r(hkXOGet a single BuildRequest, in the format described above. This method returns hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhXy if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed.rr}r(hkXy if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed.hljubeubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXUgetBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h4UtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXigetBuildRequests(buildername=None, complete=None, claimed=None, bsid=None, branch=None, repository=None))hljhthwh~jh}r(h]rh4ajjh]h]h]h]rh4ajX0BuildRequestsConnectorComponent.getBuildRequestsjjjuhKhhh]r(j)r}r(hkXgetBuildRequestshljhthwh~jh}r(h]h]h]h]h]uhKhhh]rhXgetBuildRequestsrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhKhhh]r(jG)r}r(hkXbuildername=Noneh}r(h]h]h]h]h]uhljh]rhXbuildername=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX complete=Noneh}r(h]h]h]h]h]uhljh]rhX complete=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX claimed=Noneh}r(h]h]h]h]h]uhljh]rhX claimed=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX bsid=Noneh}r(h]h]h]h]h]uhljh]rhX bsid=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX branch=Noneh}r(h]h]h]h]h]uhljh]rhX branch=Nonerr}r(hkUhljubah~jOubjG)r}r(hkXrepository=None)h}r(h]h]h]h]h]uhljh]rhXrepository=None)rr}r(hkUhljubah~jOubeubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhKhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersr r }r (hkUhljubah~jgubjh)r }r (hkUh}r(h]h]h]h]h]uhljh]rj)r}r(hkUh}r(h]h]h]h]h]uhlj h]r(j)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX buildernameh}r(h]h]h]h]h]uhljh]rhX buildernamer r!}r"(hkUhljubah~jyubhX (r#r$}r%(hkUhljubj')r&}r'(hkUh}r((UreftypeUobjr)U reftargetXstringr*U refdomainjh]h]U refexplicith]h]h]uhljh]r+jw)r,}r-(hkj*h}r.(h]h]h]h]h]uhlj&h]r/hXstringr0r1}r2(hkUhlj,ubah~jubah~j+ubhX)r3}r4(hkUhljubhX -- r5r6}r7(hkUhljubhX/limit results to buildrequests for this builderr8r9}r:(hkX/limit results to buildrequests for this builderhljubeh~hubah~jubj)r;}r<(hkUh}r=(h]h]h]h]h]uhljh]r>h)r?}r@(hkUh}rA(h]h]h]h]h]uhlj;h]rB(jq)rC}rD(hkXcompleteh}rE(h]h]h]h]h]uhlj?h]rFhXcompleterGrH}rI(hkUhljCubah~jyubhX -- rJrK}rL(hkUhlj?ubhX[if true, limit to completed buildrequests; if false, limit to incomplete buildrequests; if rMrN}rO(hkX[if true, limit to completed buildrequests; if false, limit to incomplete buildrequests; if hlj?ubh)rP}rQ(hkX``None``h}rR(h]h]h]h]h]uhlj?h]rShXNonerTrU}rV(hkUhljPubah~hubhX#, do not limit based on completion.rWrX}rY(hkX#, do not limit based on completion.hlj?ubeh~hubah~jubj)rZ}r[(hkUh}r\(h]h]h]h]h]uhljh]r]h)r^}r_(hkUh}r`(h]h]h]h]h]uhljZh]ra(jq)rb}rc(hkXclaimedh}rd(h]h]h]h]h]uhlj^h]rehXclaimedrfrg}rh(hkUhljbubah~jyubhX -- rirj}rk(hkUhlj^ubhX see belowrlrm}rn(hkX see belowhlj^ubeh~hubah~jubj)ro}rp(hkUh}rq(h]h]h]h]h]uhljh]rrh)rs}rt(hkUh}ru(h]h]h]h]h]uhljoh]rv(jq)rw}rx(hkXbsidh}ry(h]h]h]h]h]uhljsh]rzhXbsidr{r|}r}(hkUhljwubah~jyubhX -- r~r}r(hkUhljsubhX see belowrr}r(hkX see belowhljsubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX repositoryh}r(h]h]h]h]h]uhljh]rhX repositoryrr}r(hkUhljubah~jyubhX -- rr}r(hkUhljubhXHthe repository associated with the sourcestamps originating the requestsrr}r(hkXHthe repository associated with the sourcestamps originating the requestshljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXbranchh}r(h]h]h]h]h]uhljh]rhXbranchrr}r(hkUhljubah~jyubhX -- rr}r(hkUhljubhXDthe branch associated with the sourcestamps originating the requestsrr}r(hkXDthe branch associated with the sourcestamps originating the requestshljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXlist of brdicts, via Deferredrr}r(hkXlist of brdicts, via Deferredhljubah~hubah~jubeh~jubeubh)r}r(hkX@Get a list of build requests matching the given characteristics.rhljhthwh~hh}r(h]h]h]h]h]uhKqhhh]rhX@Get a list of build requests matching the given characteristics.rr}r(hkjhljubaubh)r}r(hkXDPass all parameters as keyword parameters to allow future expansion.rhljhthwh~hh}r(h]h]h]h]h]uhKshhh]rhXDPass all parameters as keyword parameters to allow future expansion.rr}r(hkjhljubaubh)r}r(hkXThe ``claimed`` parameter can be ``None`` (the default) to ignore the claimed status of requests; ``True`` to return only claimed builds, ``False`` to return only unclaimed builds, or ``"mine"`` to return only builds claimed by this master instance. A request is considered unclaimed if its ``claimed_at`` column is either NULL or 0, and it is not complete. If ``bsid`` is specified, then only build requests for that buildset will be returned.hljhthwh~hh}r(h]h]h]h]h]uhKuhhh]r(hXThe rr}r(hkXThe hljubh)r}r(hkX ``claimed``h}r(h]h]h]h]h]uhljh]rhXclaimedrr}r(hkUhljubah~hubhX parameter can be rr}r(hkX parameter can be hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX9 (the default) to ignore the claimed status of requests; rr}r(hkX9 (the default) to ignore the claimed status of requests; hljubh)r}r(hkX``True``h}r(h]h]h]h]h]uhljh]rhXTruerr}r(hkUhljubah~hubhX to return only claimed builds, rr}r(hkX to return only claimed builds, hljubh)r}r(hkX ``False``h}r(h]h]h]h]h]uhljh]rhXFalserr}r(hkUhljubah~hubhX% to return only unclaimed builds, or rr}r(hkX% to return only unclaimed builds, or hljubh)r}r(hkX ``"mine"``h}r(h]h]h]h]h]uhljh]rhX"mine"rr}r (hkUhljubah~hubhXb to return only builds claimed by this master instance. A request is considered unclaimed if its r r }r (hkXb to return only builds claimed by this master instance. A request is considered unclaimed if its hljubh)r }r(hkX``claimed_at``h}r(h]h]h]h]h]uhljh]rhX claimed_atrr}r(hkUhlj ubah~hubhX9 column is either NULL or 0, and it is not complete. If rr}r(hkX9 column is either NULL or 0, and it is not complete. If hljubh)r}r(hkX``bsid``h}r(h]h]h]h]h]uhljh]rhXbsidrr}r(hkUhljubah~hubhXK is specified, then only build requests for that buildset will be returned.rr}r (hkXK is specified, then only build requests for that buildset will be returned.hljubeubh)r!}r"(hkXmA build is considered completed if its ``complete`` column is 1; the ``complete_at`` column is not consulted.hljhthwh~hh}r#(h]h]h]h]h]uhK}hhh]r$(hX'A build is considered completed if its r%r&}r'(hkX'A build is considered completed if its hlj!ubh)r(}r)(hkX ``complete``h}r*(h]h]h]h]h]uhlj!h]r+hXcompleter,r-}r.(hkUhlj(ubah~hubhX column is 1; the r/r0}r1(hkX column is 1; the hlj!ubh)r2}r3(hkX``complete_at``h}r4(h]h]h]h]h]uhlj!h]r5hX complete_atr6r7}r8(hkUhlj2ubah~hubhX column is not consulted.r9r:}r;(hkX column is not consulted.hlj!ubeubeubeubjh)r<}r=(hkUhljhtNh~jkh}r>(h]h]h]h]h]Uentries]r?(jnXWclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h!Utr@auhNhhh]ubj)rA}rB(hkUhljhtNh~jh}rC(jjXpyrDh]h]h]h]h]jXmethodrEjjEuhNhhh]rF(j)rG}rH(hkX*claimBuildRequests(brids[, claimed_at=XX])hljAhthwh~jh}rI(h]rJh!ajjh]h]h]h]rKh!ajX2BuildRequestsConnectorComponent.claimBuildRequestsjjjuhKhhh]rL(j)rM}rN(hkXclaimBuildRequestshljGhthwh~jh}rO(h]h]h]h]h]uhKhhh]rPhXclaimBuildRequestsrQrR}rS(hkUhljMubaubjA)rT}rU(hkUhljGhthwh~jDh}rV(h]h]h]h]h]uhKhhh]rW(jG)rX}rY(hkXbridsh}rZ(h]h]h]h]h]uhljTh]r[hXbridsr\r]}r^(hkUhljXubah~jOubcsphinx.addnodes desc_optional r_)r`}ra(hkUh}rb(h]h]h]h]h]uhljTh]rcjG)rd}re(hkX claimed_at=XXh}rf(h]h]h]h]h]uhlj`h]rghX claimed_at=XXrhri}rj(hkUhljdubah~jOubah~U desc_optionalrkubeubeubj)rl}rm(hkUhljAhthwh~jh}rn(h]h]h]h]h]uhKhhh]ro(jT)rp}rq(hkUhljlhtNh~jWh}rr(h]h]h]h]h]uhNhhh]rs(jZ)rt}ru(hkUh}rv(h]h]h]h]h]uhljph]rw(j_)rx}ry(hkUh}rz(h]h]h]h]h]uhljth]r{hX Parametersr|r}}r~(hkUhljxubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljth]rj)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXbridsh}r(h]h]h]h]h]uhljh]rhXbridsrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXlistrU refdomainjDh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXlistrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXids of buildrequests to claimrr}r(hkXids of buildrequests to claimhljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX claimed_ath}r(h]h]h]h]h]uhljh]rhX claimed_atrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXdatetimerU refdomainjDh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXdatetimerr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX$time at which the builds are claimedrr}r(hkX$time at which the builds are claimedhljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljph]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXDeferredrr}r(hkXDeferredhljubah~hubah~jubeh~jubjZ)r}r(hkUhljphthwh~jh}r(h]h]h]h]h]uhKhhh]r(j_)r}r(hkXraisesh}r(h]h]h]h]h]uhljh]rhXRaisesrr}r(hkUhljubah~jgubjh)r}r(hkX:py:exc:`AlreadyClaimedError` h}r(h]h]h]h]h]uhljh]rh)r}r(hkX:py:exc:`AlreadyClaimedError`rhljhthwh~hh}r(h]h]h]h]h]uhKh]rj')r}r(hkjhljhthwh~j+h}r(UreftypeXexcj-j.XAlreadyClaimedErrorU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2jj3juhKh]rh)r}r(hkjh}r(h]h]r(j9jXpy-excreh]h]h]uhljh]rhXAlreadyClaimedErrorrr }r (hkUhljubah~hubaubaubah~jubeubeubh)r }r (hkX/Try to "claim" the indicated build requests for this buildmaster instance. The resulting deferred will fire normally on success, or fail with :py:exc:`AlreadyClaimedError` if *any* of the build requests are already claimed by another master instance. In this case, none of the claims will take effect.hljlhthwh~hh}r (h]h]h]h]h]uhKhhh]r(hXTry to "claim" the indicated build requests for this buildmaster instance. The resulting deferred will fire normally on success, or fail with rr}r(hkXTry to "claim" the indicated build requests for this buildmaster instance. The resulting deferred will fire normally on success, or fail with hlj ubj')r}r(hkX:py:exc:`AlreadyClaimedError`rhlj hthwh~j+h}r(UreftypeXexcj-j.XAlreadyClaimedErrorU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2jj3juhKh]rh)r}r(hkjh}r(h]h]r(j9jXpy-excreh]h]h]uhljh]rhXAlreadyClaimedErrorrr}r (hkUhljubah~hubaubhX if r!r"}r#(hkX if hlj ubjw)r$}r%(hkX*any*h}r&(h]h]h]h]h]uhlj h]r'hXanyr(r)}r*(hkUhlj$ubah~jubhXz of the build requests are already claimed by another master instance. In this case, none of the claims will take effect.r+r,}r-(hkXz of the build requests are already claimed by another master instance. In this case, none of the claims will take effect.hlj ubeubh)r.}r/(hkXCIf ``claimed_at`` is not given, then the current time will be used.hljlhthwh~hh}r0(h]h]h]h]h]uhKhhh]r1(hXIf r2r3}r4(hkXIf hlj.ubh)r5}r6(hkX``claimed_at``h}r7(h]h]h]h]h]uhlj.h]r8hX claimed_atr9r:}r;(hkUhlj5ubah~hubhX2 is not given, then the current time will be used.r<r=}r>(hkX2 is not given, then the current time will be used.hlj.ubeubh)r?}r@(hkXAs of 0.8.5, this method can no longer be used to re-claim build requests. All given ID's must be unclaimed. Use :py:meth:`reclaimBuildRequests` to reclaim.hljlhthwh~hh}rA(h]h]h]h]h]uhKhhh]rB(hXsAs of 0.8.5, this method can no longer be used to re-claim build requests. All given ID's must be unclaimed. Use rCrD}rE(hkXsAs of 0.8.5, this method can no longer be used to re-claim build requests. All given ID's must be unclaimed. Use hlj?ubj')rF}rG(hkX:py:meth:`reclaimBuildRequests`rHhlj?hthwh~j+h}rI(UreftypeXmethj-j.XreclaimBuildRequestsU refdomainXpyrJh]h]U refexplicith]h]h]j0j1j2jj3juhKh]rKh)rL}rM(hkjHh}rN(h]h]rO(j9jJXpy-methrPeh]h]h]uhljFh]rQhXreclaimBuildRequestsrRrS}rT(hkUhljLubah~hubaubhX to reclaim.rUrV}rW(hkX to reclaim.hlj?ubeubjh)rX}rY(hkUhljlhthwh~jkh}rZ(h]h]h]h]h]js]r[(jnXMySQL; limitationsUindex-2r\Utr]ajxuhKhhh]ubh{)r^}r_(hkUhljlhthwh~hh}r`(h]h]h]h]raj\ah]uhKhhh]ubjh)rb}rc(hkUhljlhthwh~jkh}rd(h]h]h]h]h]js]re(jnXSQLite; limitationsUindex-3rfUtrgajxuhKhhh]ubh{)rh}ri(hkUhljlhthwh~hh}rj(h]h]h]h]h]hjfuhKhhh]ubh)rk}rl(hkXHOn database backends that do not enforce referential integrity (e.g., SQLite), this method will not prevent claims for nonexistent build requests. On database backends that do not support transactions (MySQL), this method will not properly roll back any partial claims made before an :py:exc:`AlreadyClaimedError` is generated.hljlhthwhy}h~hh}rm(h]h]h]h]rnjfah]uhNhhh}rojfjhsh]rph)rq}rr(hkXHOn database backends that do not enforce referential integrity (e.g., SQLite), this method will not prevent claims for nonexistent build requests. On database backends that do not support transactions (MySQL), this method will not properly roll back any partial claims made before an :py:exc:`AlreadyClaimedError` is generated.hljkhthwh~hh}rs(h]h]h]h]h]uhKh]rt(hXOn database backends that do not enforce referential integrity (e.g., SQLite), this method will not prevent claims for nonexistent build requests. On database backends that do not support transactions (MySQL), this method will not properly roll back any partial claims made before an rurv}rw(hkXOn database backends that do not enforce referential integrity (e.g., SQLite), this method will not prevent claims for nonexistent build requests. On database backends that do not support transactions (MySQL), this method will not properly roll back any partial claims made before an hljqubj')rx}ry(hkX:py:exc:`AlreadyClaimedError`rzhljqhthwh~j+h}r{(UreftypeXexcj-j.XAlreadyClaimedErrorU refdomainXpyr|h]h]U refexplicith]h]h]j0j1j2jj3juhKh]r}h)r~}r(hkjzh}r(h]h]r(j9j|Xpy-excreh]h]h]uhljxh]rhXAlreadyClaimedErrorrr}r(hkUhlj~ubah~hubaubhX is generated.rr}r(hkX is generated.hljqubeubaubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXYreclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)hZUtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXreclaimBuildRequests(brids)hljhthwh~jh}r(h]rhZajjh]h]h]h]rhZajX4BuildRequestsConnectorComponent.reclaimBuildRequestsjjjuhKhhh]r(j)r}r(hkXreclaimBuildRequestshljhthwh~jh}r(h]h]h]h]h]uhKhhh]rhXreclaimBuildRequestsrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhKhhh]rjG)r}r(hkXbridsh}r(h]h]h]h]h]uhljh]rhXbridsrr}r(hkUhljubah~jOubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhKhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXbridsh}r(h]h]h]h]h]uhljh]rhXbridsrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXlistrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXlistrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXids of buildrequests to reclaimrr}r(hkXids of buildrequests to reclaimhljubeh~hubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXDeferredrr}r(hkXDeferredhljubah~hubah~jubeh~jubjZ)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhKhhh]r(j_)r}r(hkXraisesh}r(h]h]h]h]h]uhljh]rhXRaisesrr}r(hkUhljubah~jgubjh)r}r(hkX:py:exc:`AlreadyClaimedError` h}r (h]h]h]h]h]uhljh]r h)r }r (hkX:py:exc:`AlreadyClaimedError`r hljhthwh~hh}r(h]h]h]h]h]uhKh]rj')r}r(hkj hlj hthwh~j+h}r(UreftypeXexcj-j.XAlreadyClaimedErrorU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2jj3juhKh]rh)r}r(hkj h}r(h]h]r(j9jXpy-excreh]h]h]uhljh]rhXAlreadyClaimedErrorrr}r(hkUhljubah~hubaubaubah~jubeubeubh)r}r(hkXjRe-claim the given build requests, updating the timestamp, but checking that the requests are owned by this master. The resulting deferred will fire normally on success, or fail with :py:exc:`AlreadyClaimedError` if *any* of the build requests are already claimed by another master instance, or don't exist. In this case, none of the reclaims will take effect.hljhthwh~hh}r (h]h]h]h]h]uhKhhh]r!(hXRe-claim the given build requests, updating the timestamp, but checking that the requests are owned by this master. The resulting deferred will fire normally on success, or fail with r"r#}r$(hkXRe-claim the given build requests, updating the timestamp, but checking that the requests are owned by this master. The resulting deferred will fire normally on success, or fail with hljubj')r%}r&(hkX:py:exc:`AlreadyClaimedError`r'hljhthwh~j+h}r((UreftypeXexcj-j.XAlreadyClaimedErrorU refdomainXpyr)h]h]U refexplicith]h]h]j0j1j2jj3juhKh]r*h)r+}r,(hkj'h}r-(h]h]r.(j9j)Xpy-excr/eh]h]h]uhlj%h]r0hXAlreadyClaimedErrorr1r2}r3(hkUhlj+ubah~hubaubhX if r4r5}r6(hkX if hljubjw)r7}r8(hkX*any*h}r9(h]h]h]h]h]uhljh]r:hXanyr;r<}r=(hkUhlj7ubah~jubhX of the build requests are already claimed by another master instance, or don't exist. In this case, none of the reclaims will take effect.r>r?}r@(hkX of the build requests are already claimed by another master instance, or don't exist. In this case, none of the reclaims will take effect.hljubeubeubeubjh)rA}rB(hkUhljhthwh~jkh}rC(h]h]h]h]h]Uentries]rD(jnXYunclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)hUUtrEauhNhhh]ubj)rF}rG(hkUhljhthwh~jh}rH(jjXpyrIh]h]h]h]h]jXmethodrJjjJuhNhhh]rK(j)rL}rM(hkXunclaimBuildRequests(brids)hljFhthwh~jh}rN(h]rOhUajjh]h]h]h]rPhUajX4BuildRequestsConnectorComponent.unclaimBuildRequestsjjjuhKhhh]rQ(j)rR}rS(hkXunclaimBuildRequestshljLhthwh~jh}rT(h]h]h]h]h]uhKhhh]rUhXunclaimBuildRequestsrVrW}rX(hkUhljRubaubjA)rY}rZ(hkUhljLhthwh~jDh}r[(h]h]h]h]h]uhKhhh]r\jG)r]}r^(hkXbridsh}r_(h]h]h]h]h]uhljYh]r`hXbridsrarb}rc(hkUhlj]ubah~jOubaubeubj)rd}re(hkUhljFhthwh~jh}rf(h]h]h]h]h]uhKhhh]rg(jT)rh}ri(hkUhljdhthwh~jWh}rj(h]h]h]h]h]uhNhhh]rk(jZ)rl}rm(hkUh}rn(h]h]h]h]h]uhljhh]ro(j_)rp}rq(hkUh}rr(h]h]h]h]h]uhljlh]rshX Parametersrtru}rv(hkUhljpubah~jgubjh)rw}rx(hkUh}ry(h]h]h]h]h]uhljlh]rzh)r{}r|(hkUh}r}(h]h]h]h]h]uhljwh]r~(jq)r}r(hkXbridsh}r(h]h]h]h]h]uhlj{h]rhXbridsrr}r(hkUhljubah~jyubhX (rr}r(hkUhlj{ubj')r}r(hkUh}r(Ureftypej)U reftargetXlistrU refdomainjIh]h]U refexplicith]h]h]uhlj{h]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXlistrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhlj{ubhX -- rr}r(hkUhlj{ubhXids of buildrequests to unclaimrr}r(hkXids of buildrequests to unclaimhlj{ubeh~hubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljhh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXDeferredrr}r(hkXDeferredhljubah~hubah~jubeh~jubeubh)r}r(hkXRelease this master's claim on all of the given build requests. This will not unclaim requests that are claimed by another master, but will not fail in this case. The method does not check whether a request is completed.rhljdhthwh~hh}r(h]h]h]h]h]uhKhhh]rhXRelease this master's claim on all of the given build requests. This will not unclaim requests that are claimed by another master, but will not fail in this case. The method does not check whether a request is completed.rr}r(hkjhljubaubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXZcompleteBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h$UtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkX7completeBuildRequests(brids, results[, complete_at=XX])hljhthwh~jh}r(h]rh$ajjh]h]h]h]rh$ajX5BuildRequestsConnectorComponent.completeBuildRequestsjjjuhKhhh]r(j)r}r(hkXcompleteBuildRequestshljhthwh~jh}r(h]h]h]h]h]uhKhhh]rhXcompleteBuildRequestsrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhKhhh]r(jG)r}r(hkXbridsh}r(h]h]h]h]h]uhljh]rhXbridsrr}r(hkUhljubah~jOubjG)r}r(hkXresultsh}r(h]h]h]h]h]uhljh]rhXresultsrr}r(hkUhljubah~jOubj_)r}r(hkUh}r(h]h]h]h]h]uhljh]rjG)r}r(hkXcomplete_at=XXh}r(h]h]h]h]h]uhljh]rhXcomplete_at=XXrr}r(hkUhljubah~jOubah~jkubeubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhKhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rj)r}r(hkUh}r (h]h]h]h]h]uhljh]r (j)r }r (hkUh}r (h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhlj h]r(jq)r}r(hkXbridsh}r(h]h]h]h]h]uhljh]rhXbridsrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXintegerr U refdomainjh]h]U refexplicith]h]h]uhljh]r!jw)r"}r#(hkj h}r$(h]h]h]h]h]uhljh]r%hXintegerr&r'}r((hkUhlj"ubah~jubah~j+ubhX)r)}r*(hkUhljubhX -- r+r,}r-(hkUhljubhXbuild request IDs to completer.r/}r0(hkXbuild request IDs to completehljubeh~hubah~jubj)r1}r2(hkUh}r3(h]h]h]h]h]uhljh]r4h)r5}r6(hkUh}r7(h]h]h]h]h]uhlj1h]r8(jq)r9}r:(hkXresultsh}r;(h]h]h]h]h]uhlj5h]r<hXresultsr=r>}r?(hkUhlj9ubah~jyubhX (r@rA}rB(hkUhlj5ubj')rC}rD(hkUh}rE(Ureftypej)U reftargetXintegerrFU refdomainjh]h]U refexplicith]h]h]uhlj5h]rGjw)rH}rI(hkjFh}rJ(h]h]h]h]h]uhljCh]rKhXintegerrLrM}rN(hkUhljHubah~jubah~j+ubhX)rO}rP(hkUhlj5ubhX -- rQrR}rS(hkUhlj5ubhXinteger result coderTrU}rV(hkXinteger result codehlj5ubeh~hubah~jubj)rW}rX(hkUh}rY(h]h]h]h]h]uhljh]rZh)r[}r\(hkUh}r](h]h]h]h]h]uhljWh]r^(jq)r_}r`(hkX complete_ath}ra(h]h]h]h]h]uhlj[h]rbhX complete_atrcrd}re(hkUhlj_ubah~jyubhX (rfrg}rh(hkUhlj[ubj')ri}rj(hkUh}rk(Ureftypej)U reftargetXdatetimerlU refdomainjh]h]U refexplicith]h]h]uhlj[h]rmjw)rn}ro(hkjlh}rp(h]h]h]h]h]uhljih]rqhXdatetimerrrs}rt(hkUhljnubah~jubah~j+ubhX)ru}rv(hkUhlj[ubhX -- rwrx}ry(hkUhlj[ubhX(time at which the buildset was completedrzr{}r|(hkX(time at which the buildset was completedhlj[ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}}r~(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhlj}h]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhlj}h]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXDeferredrr}r(hkXDeferredhljubah~hubah~jubeh~jubjZ)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhKhhh]r(j_)r}r(hkXraisesh}r(h]h]h]h]h]uhljh]rhXRaisesrr}r(hkUhljubah~jgubjh)r}r(hkX:py:exc:`NotClaimedError` h}r(h]h]h]h]h]uhljh]rh)r}r(hkX:py:exc:`NotClaimedError`rhljhthwh~hh}r(h]h]h]h]h]uhKh]rj')r}r(hkjhljhthwh~j+h}r(UreftypeXexcj-j.XNotClaimedErrorU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2jj3juhKh]rh)r}r(hkjh}r(h]h]r(j9jXpy-excreh]h]h]uhljh]rhXNotClaimedErrorrr}r(hkUhljubah~hubaubaubah~jubeubeubh)r}r(hkXComplete a set of build requests, all of which are owned by this master instance. This will fail with :py:exc:`NotClaimedError` if the build request is already completed or does not exist. If ``complete_at`` is not given, the current time will be used.hljhthwh~hh}r(h]h]h]h]h]uhKhhh]r(hXgComplete a set of build requests, all of which are owned by this master instance. This will fail with rr}r(hkXgComplete a set of build requests, all of which are owned by this master instance. This will fail with hljubj')r}r(hkX:py:exc:`NotClaimedError`rhljhthwh~j+h}r(UreftypeXexcj-j.XNotClaimedErrorU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2jj3juhKh]rh)r}r(hkjh}r(h]h]r(j9jXpy-excreh]h]h]uhljh]rhXNotClaimedErrorrr}r(hkUhljubah~hubaubhXB if the build request is already completed or does not exist. If rr}r(hkXB if the build request is already completed or does not exist. If hljubh)r}r(hkX``complete_at``h}r(h]h]h]h]h]uhljh]rhX complete_atrr}r(hkUhljubah~hubhX- is not given, the current time will be used.rr}r(hkX- is not given, the current time will be used.hljubeubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnX[unclaimExpiredRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h5UtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXunclaimExpiredRequests(old)hljhthwh~jh}r(h]rh5ajjh]h]h]h]rh5ajX6BuildRequestsConnectorComponent.unclaimExpiredRequestsjjjuhKhhh]r(j)r}r(hkXunclaimExpiredRequestshljhthwh~jh}r(h]h]h]h]h]uhKhhh]rhXunclaimExpiredRequestsrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhKhhh]rjG)r}r(hkXoldh}r(h]h]h]h]h]uhljh]rhXoldrr}r(hkUhljubah~jOubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhKhhh]r(jT)r}r (hkUhljhthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r (hkUh}r (h]h]h]h]h]uhljh]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hX Parametersr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkXoldh}r (h]h]h]h]h]uhlj h]r hXoldr r }r (hkUhlj ubah~jyubhX (r r }r (hkUhlj ubj')r }r! (hkUh}r" (Ureftypej)U reftargetXintr# U refdomainjh]h]U refexplicith]h]h]uhlj h]r$ jw)r% }r& (hkj# h}r' (h]h]h]h]h]uhlj h]r( hXintr) r* }r+ (hkUhlj% ubah~jubah~j+ubhX)r, }r- (hkUhlj ubhX -- r. r/ }r0 (hkUhlj ubhX7number of seconds after which a claim is considered oldr1 r2 }r3 (hkX7number of seconds after which a claim is considered oldhlj ubeh~hubah~jubeh~jubjZ)r4 }r5 (hkUh}r6 (h]h]h]h]h]uhljh]r7 (j_)r8 }r9 (hkUh}r: (h]h]h]h]h]uhlj4 h]r; hXReturnsr< r= }r> (hkUhlj8 ubah~jgubjh)r? }r@ (hkUh}rA (h]h]h]h]h]uhlj4 h]rB h)rC }rD (hkUh}rE (h]h]h]h]h]uhlj? h]rF hXDeferredrG rH }rI (hkXDeferredhljC ubah~hubah~jubeh~jubeubh)rJ }rK (hkXkFind any incomplete claimed builds which are older than ``old`` seconds, and clear their claim information.hljhthwh~hh}rL (h]h]h]h]h]uhKhhh]rM (hX8Find any incomplete claimed builds which are older than rN rO }rP (hkX8Find any incomplete claimed builds which are older than hljJ ubh)rQ }rR (hkX``old``h}rS (h]h]h]h]h]uhljJ h]rT hXoldrU rV }rW (hkUhljQ ubah~hubhX, seconds, and clear their claim information.rX rY }rZ (hkX, seconds, and clear their claim information.hljJ ubeubh)r[ }r\ (hkXThis is intended to catch builds that were claimed by a master which has since disappeared. As a side effect, it will log a message if any requests are unclaimed.r] hljhthwh~hh}r^ (h]h]h]h]h]uhKhhh]r_ hXThis is intended to catch builds that were claimed by a master which has since disappeared. As a side effect, it will log a message if any requests are unclaimed.r` ra }rb (hkj] hlj[ ubaubeubeubeubeubeubhm)rc }rd (hkUhljIhthwh~hh}re (h]h]h]h]rf (Xmodule-buildbot.db.buildsrg Ubuildsrh eh]ri h@auhKhhh]rj (h)rk }rl (hkXbuildsrm hljc hthwh~hh}rn (h]h]h]h]h]uhKhhh]ro hXbuildsrp rq }rr (hkjm hljk ubaubjh)rs }rt (hkUhljc hthwh~jkh}ru (h]h]h]h]h]Uentries]rv (jnXbuildbot.db.builds (module)Xmodule-buildbot.db.buildsUtrw auhKhhh]ubjh)rx }ry (hkUhljc hthwh~jkh}rz (h]h]h]h]h]js]r{ (juXBuilds; DB Connector ComponentUindex-4r| Utr} ajxuhKhhh]ubh{)r~ }r (hkUhljc hthwh~hh}r (h]h]h]h]r j| ah]uhKhhh]ubjh)r }r (hkUhljc htNh~jkh}r (h]h]h]h]h]Uentries]r (jnX6BuildsConnectorComponent (class in buildbot.db.builds)h Utr auhNhhh]ubj)r }r (hkUhljc htNh~jh}r (jjXpyh]h]h]h]h]jXclassr jj uhNhhh]r (j)r }r (hkXBuildsConnectorComponentr hlj hthwh~jh}r (h]r h ajXbuildbot.db.buildsr h]h]h]h]r h ajj jUjuhMhhh]r (j)r }r (hkXclass hlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXclass r r }r (hkUhlj ubaubj)r }r (hkXbuildbot.db.builds.hlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXbuildbot.db.builds.r r }r (hkUhlj ubaubj)r }r (hkj hlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXBuildsConnectorComponentr r }r (hkUhlj ubaubeubj)r }r (hkUhlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r (h)r }r (hkX<This class handles a little bit of information about builds.r hlj hthwh~hh}r (h]h]h]h]h]uhKhhh]r hX<This class handles a little bit of information about builds.r r }r (hkj hlj ubaubh)r }r (hkXThe interface for this class will change - the builds table duplicates some information available in pickles, without including all such information. Do not depend on this API.hlj hthwh~hh}r (h]h]h]h]h]uhNhhh]r h)r }r (hkXThe interface for this class will change - the builds table duplicates some information available in pickles, without including all such information. Do not depend on this API.r hlj hthwh~hh}r (h]h]h]h]h]uhKh]r hXThe interface for this class will change - the builds table duplicates some information available in pickles, without including all such information. Do not depend on this API.r r }r (hkj hlj ubaubaubh)r }r (hkX?An instance of this class is available at ``master.db.builds``.hlj hthwh~hh}r (h]h]h]h]h]uhKhhh]r (hX*An instance of this class is available at r r }r (hkX*An instance of this class is available at hlj ubh)r }r (hkX``master.db.builds``h}r (h]h]h]h]h]uhlj h]r hXmaster.db.buildsr r }r (hkUhlj ubah~hubhX.r }r (hkX.hlj ubeubjh)r }r (hkUhlj hthwh~jkh}r (h]h]h]h]h]js]r ((jnXbdictUindex-5r Utr (jnXbidj Utr ejxuhKhhh]ubh{)r }r (hkUhlj hthwh~hh}r (h]h]h]h]h]hj uhKhhh]ubh)r }r (hkXfBuilds are indexed by *bid* and their contents represented as *bdicts* (build dictionaries), with keyshlj hthwhy}h~hh}r (h]h]h]h]r j ah]uhKhhh}r j j sh]r (hXBuilds are indexed by r r }r (hkXBuilds are indexed by hlj ubjw)r }r (hkX*bid*h}r (h]h]h]h]h]uhlj h]r hXbidr r }r (hkUhlj ubah~jubhX# and their contents represented as r r }r (hkX# and their contents represented as hlj ubjw)r }r (hkX*bdicts*h}r (h]h]h]h]h]uhlj h]r hXbdictsr r }r (hkUhlj ubah~jubhX (build dictionaries), with keysr r }r (hkX (build dictionaries), with keyshlj ubeubj)r }r (hkUhlj hthwh~jh}r (jX*h]h]h]h]h]uhKhhh]r (j)r }r (hkX'``bid`` (the build ID, globally unique)r hlj hthwh~jh}r (h]h]h]h]h]uhNhhh]r h)r }r (hkj hlj hthwh~hh}r (h]h]h]h]h]uhKh]r (h)r }r (hkX``bid``h}r (h]h]h]h]h]uhlj h]r hXbidr r }r (hkUhlj ubah~hubhX (the build ID, globally unique)r r }r (hkX (the build ID, globally unique)hlj ubeubaubj)r }r (hkXI``number`` (the build number, unique only within this master and builder)r hlj hthwh~jh}r (h]h]h]h]h]uhNhhh]r h)r }r (hkj hlj hthwh~hh}r (h]h]h]h]h]uhKh]r (h)r }r (hkX ``number``h}r (h]h]h]h]h]uhlj h]r hXnumberr r }r (hkUhlj ubah~hubhX? (the build number, unique only within this master and builder)r r }r! (hkX? (the build number, unique only within this master and builder)hlj ubeubaubj)r" }r# (hkX=``brid`` (the ID of the build request that caused this build)r$ hlj hthwh~jh}r% (h]h]h]h]h]uhNhhh]r& h)r' }r( (hkj$ hlj" hthwh~hh}r) (h]h]h]h]h]uhKh]r* (h)r+ }r, (hkX``brid``h}r- (h]h]h]h]h]uhlj' h]r. hXbridr/ r0 }r1 (hkUhlj+ ubah~hubhX5 (the ID of the build request that caused this build)r2 r3 }r4 (hkX5 (the ID of the build request that caused this build)hlj' ubeubaubj)r5 }r6 (hkX``start_time``r7 hlj hthwh~jh}r8 (h]h]h]h]h]uhNhhh]r9 h)r: }r; (hkj7 hlj5 hthwh~hh}r< (h]h]h]h]h]uhKh]r= h)r> }r? (hkj7 h}r@ (h]h]h]h]h]uhlj: h]rA hX start_timerB rC }rD (hkUhlj> ubah~hubaubaubj)rE }rF (hkX-``finish_time`` (datetime objects, or None). hlj hthwh~jh}rG (h]h]h]h]h]uhNhhh]rH h)rI }rJ (hkX,``finish_time`` (datetime objects, or None).hljE hthwh~hh}rK (h]h]h]h]h]uhKh]rL (h)rM }rN (hkX``finish_time``h}rO (h]h]h]h]h]uhljI h]rP hX finish_timerQ rR }rS (hkUhljM ubah~hubhX (datetime objects, or None).rT rU }rV (hkX (datetime objects, or None).hljI ubeubaubeubjh)rW }rX (hkUhlj hthwh~jkh}rY (h]h]h]h]h]Uentries]rZ (jnX?getBuild() (buildbot.db.builds.BuildsConnectorComponent method)h,Utr[ auhNhhh]ubj)r\ }r] (hkUhlj hthwh~jh}r^ (jjXpyr_ h]h]h]h]h]jXmethodr` jj` uhNhhh]ra (j)rb }rc (hkX getBuild(bid)hlj\ hthwh~jh}rd (h]re h,ajj h]h]h]h]rf h,ajX!BuildsConnectorComponent.getBuildjj juhKhhh]rg (j)rh }ri (hkXgetBuildhljb hthwh~jh}rj (h]h]h]h]h]uhKhhh]rk hXgetBuildrl rm }rn (hkUhljh ubaubjA)ro }rp (hkUhljb hthwh~jDh}rq (h]h]h]h]h]uhKhhh]rr jG)rs }rt (hkXbidh}ru (h]h]h]h]h]uhljo h]rv hXbidrw rx }ry (hkUhljs ubah~jOubaubeubj)rz }r{ (hkUhlj\ hthwh~jh}r| (h]h]h]h]h]uhKhhh]r} (jT)r~ }r (hkUhljz hthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r (hkUh}r (h]h]h]h]h]uhlj~ h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hX Parametersr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkXbidh}r (h]h]h]h]h]uhlj h]r hXbidr r }r (hkUhlj ubah~jyubhX (r r }r (hkUhlj ubj')r }r (hkUh}r (Ureftypej)U reftargetXintegerr U refdomainj_ h]h]U refexplicith]h]h]uhlj h]r jw)r }r (hkj h}r (h]h]h]h]h]uhlj h]r hXintegerr r }r (hkUhlj ubah~jubah~j+ubhX)r }r (hkUhlj ubhX -- r r }r (hkUhlj ubhXbuild idr r }r (hkXbuild idhlj ubeh~hubah~jubeh~jubjZ)r }r (hkUh}r (h]h]h]h]h]uhlj~ h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hXReturnsr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (hXBuild dictionary as above or r r }r (hkXBuild dictionary as above or hlj ubh)r }r (hkX``None``h}r (h]h]h]h]h]uhlj h]r hXNoner r }r (hkUhlj ubah~hubhX, via Deferredr r }r (hkX, via Deferredhlj ubeh~hubah~jubeh~jubeubh)r }r (hkX_Get a single build, in the format described above. Returns ``None`` if there is no such build.hljz hthwh~hh}r (h]h]h]h]h]uhKhhh]r (hX<Get a single build, in the format described above. Returns r r }r (hkX<Get a single build, in the format described above. Returns hlj ubh)r }r (hkX``None``h}r (h]h]h]h]h]uhlj h]r hXNoner r }r (hkUhlj ubah~hubhX if there is no such build.r r }r (hkX if there is no such build.hlj ubeubeubeubjh)r }r (hkUhlj hthwh~jkh}r (h]h]h]h]h]Uentries]r (jnXJgetBuildsForRequest() (buildbot.db.builds.BuildsConnectorComponent method)hUtr auhNhhh]ubj)r }r (hkUhlj hthwh~jh}r (jjXpyh]h]h]h]h]jXmethodr jj uhNhhh]r (j)r }r (hkXgetBuildsForRequest(brid)hlj hthwh~jh}r (h]r hajj h]h]h]h]r hajX,BuildsConnectorComponent.getBuildsForRequestjj juhMhhh]r (j)r }r (hkXgetBuildsForRequesthlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXgetBuildsForRequestr r }r (hkUhlj ubaubjA)r }r (hkUhlj hthwh~jDh}r (h]h]h]h]h]uhMhhh]r jG)r }r (hkXbridh}r (h]h]h]h]h]uhlj h]r hXbridr r }r (hkUhlj ubah~jOubaubeubj)r }r (hkUhlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r (jT)r }r (hkUhlj hthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hX Parametersr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r! }r" (hkXbridsh}r# (h]h]h]h]h]uhlj h]r$ hXbridsr% r& }r' (hkUhlj! ubah~jyubhX -- r( r) }r* (hkUhlj ubhXlist of build request idsr+ r, }r- (hkXlist of build request idshlj ubeh~hubah~jubeh~jubjZ)r. }r/ (hkUh}r0 (h]h]h]h]h]uhlj h]r1 (j_)r2 }r3 (hkUh}r4 (h]h]h]h]h]uhlj. h]r5 hXReturnsr6 r7 }r8 (hkUhlj2 ubah~jgubjh)r9 }r: (hkUh}r; (h]h]h]h]h]uhlj. h]r< h)r= }r> (hkUh}r? (h]h]h]h]h]uhlj9 h]r@ hX1List of build dictionaries as above, via DeferredrA rB }rC (hkX1List of build dictionaries as above, via Deferredhlj= ubah~hubah~jubeh~jubeubh)rD }rE (hkXGet a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for :py:meth:`getBuild`.hlj hthwh~hh}rF (h]h]h]h]h]uhKhhh]rG (hXzGet a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for rH rI }rJ (hkXzGet a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for hljD ubj')rK }rL (hkX:py:meth:`getBuild`rM hljD hthwh~j+h}rN (UreftypeXmethj-j.XgetBuildU refdomainXpyrO h]h]U refexplicith]h]h]j0j1j2j j3j uhKh]rP h)rQ }rR (hkjM h}rS (h]h]rT (j9jO Xpy-methrU eh]h]h]uhljK h]rV hXgetBuildrW rX }rY (hkUhljQ ubah~hubaubhX.rZ }r[ (hkX.hljD ubeubeubeubjh)r\ }r] (hkUhlj hthwh~jkh}r^ (h]h]h]h]h]Uentries]r_ (jnX?addBuild() (buildbot.db.builds.BuildsConnectorComponent method)h2Utr` auhNhhh]ubj)ra }rb (hkUhlj hthwh~jh}rc (jjXpyh]h]h]h]h]jXmethodrd jjd uhNhhh]re (j)rf }rg (hkXaddBuild(brid, number)hlja hthwh~jh}rh (h]ri h2ajj h]h]h]h]rj h2ajX!BuildsConnectorComponent.addBuildjj juhM hhh]rk (j)rl }rm (hkXaddBuildhljf hthwh~jh}rn (h]h]h]h]h]uhM hhh]ro hXaddBuildrp rq }rr (hkUhljl ubaubjA)rs }rt (hkUhljf hthwh~jDh}ru (h]h]h]h]h]uhM hhh]rv (jG)rw }rx (hkXbridh}ry (h]h]h]h]h]uhljs h]rz hXbridr{ r| }r} (hkUhljw ubah~jOubjG)r~ }r (hkXnumberh}r (h]h]h]h]h]uhljs h]r hXnumberr r }r (hkUhlj~ ubah~jOubeubeubj)r }r (hkUhlja hthwh~jh}r (h]h]h]h]h]uhM hhh]r (jT)r }r (hkUhlj hthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hX Parametersr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r j)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkXbridh}r (h]h]h]h]h]uhlj h]r hXbridr r }r (hkUhlj ubah~jyubhX -- r r }r (hkUhlj ubhXbuild request idr r }r (hkXbuild request idhlj ubeh~hubah~jubj)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkXnumberh}r (h]h]h]h]h]uhlj h]r hXnumberr r }r (hkUhlj ubah~jyubhX -- r r }r (hkUhlj ubhX build numberr r }r (hkX build numberhlj ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hXReturnsr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hXbuild ID via Deferredr r }r (hkXbuild ID via Deferredhlj ubah~hubah~jubeh~jubeubh)r }r (hkXJAdd a new build to the db, recorded as having started at the current time.r hlj hthwh~hh}r (h]h]h]h]h]uhMhhh]r hXJAdd a new build to the db, recorded as having started at the current time.r r }r (hkj hlj ubaubeubeubjh)r }r (hkUhlj hthwh~jkh}r (h]h]h]h]h]Uentries]r (jnXCfinishBuilds() (buildbot.db.builds.BuildsConnectorComponent method)hUtr auhNhhh]ubj)r }r (hkUhlj hthwh~jh}r (jjXpyr h]h]h]h]h]jXmethodr jj uhNhhh]r (j)r }r (hkXfinishBuilds(bids)hlj hthwh~jh}r (h]r hajj h]h]h]h]r hajX%BuildsConnectorComponent.finishBuildsjj juhMhhh]r (j)r }r (hkX finishBuildshlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hX finishBuildsr r }r (hkUhlj ubaubjA)r }r (hkUhlj hthwh~jDh}r (h]h]h]h]h]uhMhhh]r jG)r }r (hkXbidsh}r (h]h]h]h]h]uhlj h]r hXbidsr r }r (hkUhlj ubah~jOubaubeubj)r }r (hkUhlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r (jT)r }r (hkUhlj hthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hX Parametersr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r! h)r" }r# (hkUh}r$ (h]h]h]h]h]uhlj h]r% (jq)r& }r' (hkXbidsh}r( (h]h]h]h]h]uhlj" h]r) hXbidsr* r+ }r, (hkUhlj& ubah~jyubhX (r- r. }r/ (hkUhlj" ubj')r0 }r1 (hkUh}r2 (Ureftypej)U reftargetXlistr3 U refdomainj h]h]U refexplicith]h]h]uhlj" h]r4 jw)r5 }r6 (hkj3 h}r7 (h]h]h]h]h]uhlj0 h]r8 hXlistr9 r: }r; (hkUhlj5 ubah~jubah~j+ubhX)r< }r= (hkUhlj" ubhX -- r> r? }r@ (hkUhlj" ubhX build idsrA rB }rC (hkX build idshlj" ubeh~hubah~jubeh~jubjZ)rD }rE (hkUh}rF (h]h]h]h]h]uhlj h]rG (j_)rH }rI (hkUh}rJ (h]h]h]h]h]uhljD h]rK hXReturnsrL rM }rN (hkUhljH ubah~jgubjh)rO }rP (hkUh}rQ (h]h]h]h]h]uhljD h]rR h)rS }rT (hkUh}rU (h]h]h]h]h]uhljO h]rV hXDeferredrW rX }rY (hkXDeferredhljS ubah~hubah~jubeh~jubeubh)rZ }r[ (hkXMark the given builds as finished, with ``finish_time`` set to the current time. This is done unconditionally, even if the builds are already finished.hlj hthwh~hh}r\ (h]h]h]h]h]uhMhhh]r] (hX(Mark the given builds as finished, with r^ r_ }r` (hkX(Mark the given builds as finished, with hljZ ubh)ra }rb (hkX``finish_time``h}rc (h]h]h]h]h]uhljZ h]rd hX finish_timere rf }rg (hkUhlja ubah~hubhXa set to the current time. This is done unconditionally, even if the builds are already finished.rh ri }rj (hkXa set to the current time. This is done unconditionally, even if the builds are already finished.hljZ ubeubeubeubeubeubeubhm)rk }rl (hkUhljIhthwh~hh}rm (h]h]h]h]rn (Xmodule-buildbot.db.buildsetsro U buildsetsrp eh]rq hauhMhhh]rr (h)rs }rt (hkX buildsetsru hljk hthwh~hh}rv (h]h]h]h]h]uhMhhh]rw hX buildsetsrx ry }rz (hkju hljs ubaubjh)r{ }r| (hkUhljk hthwh~jkh}r} (h]h]h]h]h]Uentries]r~ (jnXbuildbot.db.buildsets (module)Xmodule-buildbot.db.buildsetsUtr auhMhhh]ubjh)r }r (hkUhljk hthwh~jkh}r (h]h]h]h]h]js]r (juX!Buildsets; DB Connector ComponentUindex-6r Utr ajxuhMhhh]ubh{)r }r (hkUhljk hthwh~hh}r (h]h]h]h]r j ah]uhMhhh]ubjh)r }r (hkUhljk htNh~jkh}r (h]h]h]h]h]Uentries]r (jnX<BuildsetsConnectorComponent (class in buildbot.db.buildsets)hIUtr auhNhhh]ubj)r }r (hkUhljk htNh~jh}r (jjXpyh]h]h]h]h]jXclassr jj uhNhhh]r (j)r }r (hkXBuildsetsConnectorComponentr hlj hthwh~jh}r (h]r hIajXbuildbot.db.buildsetsr h]h]h]h]r hIajj jUjuhMhhh]r (j)r }r (hkXclass hlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXclass r r }r (hkUhlj ubaubj)r }r (hkXbuildbot.db.buildsets.hlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXbuildbot.db.buildsets.r r }r (hkUhlj ubaubj)r }r (hkj hlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r hXBuildsetsConnectorComponentr r }r (hkUhlj ubaubeubj)r }r (hkUhlj hthwh~jh}r (h]h]h]h]h]uhMhhh]r (h)r }r (hkXThis class handles getting buildsets into and out of the database. Buildsets combine multiple build requests that were triggered together.r hlj hthwh~hh}r (h]h]h]h]h]uhMhhh]r hXThis class handles getting buildsets into and out of the database. Buildsets combine multiple build requests that were triggered together.r r }r (hkj hlj ubaubh)r }r (hkXBAn instance of this class is available at ``master.db.buildsets``.hlj hthwh~hh}r (h]h]h]h]h]uhM!hhh]r (hX*An instance of this class is available at r r }r (hkX*An instance of this class is available at hlj ubh)r }r (hkX``master.db.buildsets``h}r (h]h]h]h]h]uhlj h]r hXmaster.db.buildsetsr r }r (hkUhlj ubah~hubhX.r }r (hkX.hlj ubeubjh)r }r (hkUhlj hthwh~jkh}r (h]h]h]h]h]js]r ((jnXbsdictUindex-7r Utr (jnXbsidj Utr ejxuhM#hhh]ubh{)r }r (hkUhlj hthwh~hh}r (h]h]h]h]h]hj uhM$hhh]ubh)r }r (hkXnBuildsets are indexed by *bsid* and their contents represented as *bsdicts* (buildset dictionaries), with keyshlj hthwhy}h~hh}r (h]h]h]h]r j ah]uhM%hhh}r j j sh]r (hXBuildsets are indexed by r r }r (hkXBuildsets are indexed by hlj ubjw)r }r (hkX*bsid*h}r (h]h]h]h]h]uhlj h]r hXbsidr r }r (hkUhlj ubah~jubhX# and their contents represented as r r }r (hkX# and their contents represented as hlj ubjw)r }r (hkX *bsdicts*h}r (h]h]h]h]h]uhlj h]r hXbsdictsr r }r (hkUhlj ubah~jubhX# (buildset dictionaries), with keysr r }r (hkX# (buildset dictionaries), with keyshlj ubeubj)r }r (hkUhlj hthwh~jh}r (jX*h]h]h]h]h]uhM(hhh]r (j)r }r (hkX``bsid``r hlj hthwh~jh}r (h]h]h]h]h]uhNhhh]r h)r }r (hkj hlj hthwh~hh}r (h]h]h]h]h]uhM(h]r h)r }r (hkj h}r (h]h]h]h]h]uhlj h]r hXbsidr r }r (hkUhlj ubah~hubaubaubj)r }r (hkXF``external_idstring`` (arbitrary string for mapping builds externally)r hlj hthwh~jh}r (h]h]h]h]h]uhNhhh]r h)r }r (hkj hlj hthwh~hh}r (h]h]h]h]h]uhM)h]r (h)r }r (hkX``external_idstring``h}r (h]h]h]h]h]uhlj h]r hXexternal_idstringr r }r (hkUhlj ubah~hubhX1 (arbitrary string for mapping builds externally)r r }r (hkX1 (arbitrary string for mapping builds externally)hlj ubeubaubj)r }r (hkX7``reason`` (string; reason these builds were triggered)r hlj hthwh~jh}r (h]h]h]h]h]uhNhhh]r h)r }r! (hkj hlj hthwh~hh}r" (h]h]h]h]h]uhM*h]r# (h)r$ }r% (hkX ``reason``h}r& (h]h]h]h]h]uhlj h]r' hXreasonr( r) }r* (hkUhlj$ ubah~hubhX- (string; reason these builds were triggered)r+ r, }r- (hkX- (string; reason these builds were triggered)hlj ubeubaubj)r. }r/ (hkX9``sourcestampsetid`` (source stamp set for this buildset)r0 hlj hthwh~jh}r1 (h]h]h]h]h]uhNhhh]r2 h)r3 }r4 (hkj0 hlj. hthwh~hh}r5 (h]h]h]h]h]uhM+h]r6 (h)r7 }r8 (hkX``sourcestampsetid``h}r9 (h]h]h]h]h]uhlj3 h]r: hXsourcestampsetidr; r< }r= (hkUhlj7 ubah~hubhX% (source stamp set for this buildset)r> r? }r@ (hkX% (source stamp set for this buildset)hlj3 ubeubaubj)rA }rB (hkXB``submitted_at`` (datetime object; time this buildset was created)rC hlj hthwh~jh}rD (h]h]h]h]h]uhNhhh]rE h)rF }rG (hkjC hljA hthwh~hh}rH (h]h]h]h]h]uhM,h]rI (h)rJ }rK (hkX``submitted_at``h}rL (h]h]h]h]h]uhljF h]rM hX submitted_atrN rO }rP (hkUhljJ ubah~hubhX2 (datetime object; time this buildset was created)rQ rR }rS (hkX2 (datetime object; time this buildset was created)hljF ubeubaubj)rT }rU (hkXP``complete`` (boolean; true if all of the builds for this buildset are complete)rV hlj hthwh~jh}rW (h]h]h]h]h]uhNhhh]rX h)rY }rZ (hkjV hljT hthwh~hh}r[ (h]h]h]h]h]uhM-h]r\ (h)r] }r^ (hkX ``complete``h}r_ (h]h]h]h]h]uhljY h]r` hXcompletera rb }rc (hkUhlj] ubah~hubhXD (boolean; true if all of the builds for this buildset are complete)rd re }rf (hkXD (boolean; true if all of the builds for this buildset are complete)hljY ubeubaubj)rg }rh (hkXC``complete_at`` (datetime object; time this buildset was completed)ri hlj hthwh~jh}rj (h]h]h]h]h]uhNhhh]rk h)rl }rm (hkji hljg hthwh~hh}rn (h]h]h]h]h]uhM.h]ro (h)rp }rq (hkX``complete_at``h}rr (h]h]h]h]h]uhljl h]rs hX complete_atrt ru }rv (hkUhljp ubah~hubhX4 (datetime object; time this buildset was completed)rw rx }ry (hkX4 (datetime object; time this buildset was completed)hljl ubeubaubj)rz }r{ (hkXO``results`` (aggregate result of this buildset; see :ref:`Build-Result-Codes`) hlj hthwh~jh}r| (h]h]h]h]h]uhNhhh]r} h)r~ }r (hkXN``results`` (aggregate result of this buildset; see :ref:`Build-Result-Codes`)hljz hthwh~hh}r (h]h]h]h]h]uhM/h]r (h)r }r (hkX ``results``h}r (h]h]h]h]h]uhlj~ h]r hXresultsr r }r (hkUhlj ubah~hubhX) (aggregate result of this buildset; see r r }r (hkX) (aggregate result of this buildset; see hlj~ ubj')r }r (hkX:ref:`Build-Result-Codes`r hlj~ hthwh~j+h}r (UreftypeXrefj-j.Xbuild-result-codesU refdomainXstdr h]h]U refexplicith]h]h]j0j1uhM/h]r jw)r }r (hkj h}r (h]h]r (j9j Xstd-refr eh]h]h]uhlj h]r hXBuild-Result-Codesr r }r (hkUhlj ubah~jubaubhX)r }r (hkX)hlj~ ubeubaubeubjh)r }r (hkUhlj hthwh~jkh}r (h]h]h]h]h]Uentries]r (jnXHaddBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h6Utr auhNhhh]ubj)r }r (hkUhlj hthwh~jh}r (jjXpyr h]h]h]h]h]jXmethodr jj uhNhhh]r (j)r }r (hkXWaddBuildset(sourcestampsetid, reason, properties, builderNames, external_idstring=None)hlj hthwh~jh}r (h]r h6ajj h]h]h]h]r h6ajX'BuildsetsConnectorComponent.addBuildsetjj juhMFhhh]r (j)r }r (hkX addBuildsethlj hthwh~jh}r (h]h]h]h]h]uhMFhhh]r hX addBuildsetr r }r (hkUhlj ubaubjA)r }r (hkUhlj hthwh~jDh}r (h]h]h]h]h]uhMFhhh]r (jG)r }r (hkXsourcestampsetidh}r (h]h]h]h]h]uhlj h]r hXsourcestampsetidr r }r (hkUhlj ubah~jOubjG)r }r (hkXreasonh}r (h]h]h]h]h]uhlj h]r hXreasonr r }r (hkUhlj ubah~jOubjG)r }r (hkX propertiesh}r (h]h]h]h]h]uhlj h]r hX propertiesr r }r (hkUhlj ubah~jOubjG)r }r (hkX builderNamesh}r (h]h]h]h]h]uhlj h]r hX builderNamesr r }r (hkUhlj ubah~jOubjG)r }r (hkXexternal_idstring=Noneh}r (h]h]h]h]h]uhlj h]r hXexternal_idstring=Noner r }r (hkUhlj ubah~jOubeubeubj)r }r (hkUhlj hthwh~jh}r (h]h]h]h]h]uhMFhhh]r (jT)r }r (hkUhlj hthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j_)r }r (hkUh}r (h]h]h]h]h]uhlj h]r hX Parametersr r }r (hkUhlj ubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhlj h]r j)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (j)r }r (hkUh}r (h]h]h]h]h]uhlj h]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r(hkXsourcestampsetidh}r(h]h]h]h]h]uhlj h]rhXsourcestampsetidrr}r(hkUhlj ubah~jyubhX (rr}r(hkUhlj ubj')r }r (hkUh}r (Ureftypej)U reftargetXintegerr U refdomainj h]h]U refexplicith]h]h]uhlj h]r jw)r}r(hkj h}r(h]h]h]h]h]uhlj h]rhXintegerrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhlj ubhX -- rr}r(hkUhlj ubhX*id of the SourceStampSet for this buildsetrr}r(hkX*id of the SourceStampSet for this buildsethlj ubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhlj h]r h)r!}r"(hkUh}r#(h]h]h]h]h]uhljh]r$(jq)r%}r&(hkXreasonh}r'(h]h]h]h]h]uhlj!h]r(hXreasonr)r*}r+(hkUhlj%ubah~jyubhX (r,r-}r.(hkUhlj!ubj')r/}r0(hkUh}r1(Ureftypej)U reftargetXshort unicode stringr2U refdomainj h]h]U refexplicith]h]h]uhlj!h]r3jw)r4}r5(hkj2h}r6(h]h]h]h]h]uhlj/h]r7hXshort unicode stringr8r9}r:(hkUhlj4ubah~jubah~j+ubhX)r;}r<(hkUhlj!ubhX -- r=r>}r?(hkUhlj!ubhXreason for this buildsetr@rA}rB(hkXreason for this buildsethlj!ubeh~hubah~jubj)rC}rD(hkUh}rE(h]h]h]h]h]uhlj h]rFh)rG}rH(hkUh}rI(h]h]h]h]h]uhljCh]rJ(jq)rK}rL(hkX propertiesh}rM(h]h]h]h]h]uhljGh]rNhX propertiesrOrP}rQ(hkUhljKubah~jyubhX (rRrS}rT(hkUhljGubj')rU}rV(hkUh}rW(Ureftypej)U reftargetX6dictionary, where values are tuples of (value, source)rXU refdomainj h]h]U refexplicith]h]h]uhljGh]rYjw)rZ}r[(hkjXh}r\(h]h]h]h]h]uhljUh]r]hX6dictionary, where values are tuples of (value, source)r^r_}r`(hkUhljZubah~jubah~j+ubhX)ra}rb(hkUhljGubhX -- rcrd}re(hkUhljGubhXproperties for this buildsetrfrg}rh(hkXproperties for this buildsethljGubeh~hubah~jubj)ri}rj(hkUh}rk(h]h]h]h]h]uhlj h]rlh)rm}rn(hkUh}ro(h]h]h]h]h]uhljih]rp(jq)rq}rr(hkX builderNamesh}rs(h]h]h]h]h]uhljmh]rthX builderNamesrurv}rw(hkUhljqubah~jyubhX (rxry}rz(hkUhljmubj')r{}r|(hkUh}r}(Ureftypej)U reftargetXlist of stringsr~U refdomainj h]h]U refexplicith]h]h]uhljmh]rjw)r}r(hkj~h}r(h]h]h]h]h]uhlj{h]rhXlist of stringsrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljmubhX -- rr}r(hkUhljmubhX#builders specified by this buildsetrr}r(hkX#builders specified by this buildsethljmubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhlj h]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXexternal_idstringh}r(h]h]h]h]h]uhljh]rhXexternal_idstringrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainj h]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX8external key to identify this buildset; defaults to Nonerr}r(hkX8external key to identify this buildset; defaults to Nonehljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhlj h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX0buildset ID and buildrequest IDs, via a Deferredrr}r(hkX0buildset ID and buildrequest IDs, via a Deferredhljubah~hubah~jubeh~jubeubh)r}r(hkXAdd a new Buildset to the database, along with BuildRequests for each named builder, returning the resulting bsid via a Deferred. Arguments should be specified by keyword.rhlj hthwh~hh}r(h]h]h]h]h]uhM?hhh]rhXAdd a new Buildset to the database, along with BuildRequests for each named builder, returning the resulting bsid via a Deferred. Arguments should be specified by keyword.rr}r(hkjhljubaubh)r}r(hkXThe return value is a tuple ``(bsid, brids)`` where ``bsid`` is the inserted buildset ID and ``brids`` is a dictionary mapping buildernames to build request IDs.hlj hthwh~hh}r(h]h]h]h]h]uhMChhh]r(hXThe return value is a tuple rr}r(hkXThe return value is a tuple hljubh)r}r(hkX``(bsid, brids)``h}r(h]h]h]h]h]uhljh]rhX (bsid, brids)rr}r(hkUhljubah~hubhX where rr}r(hkX where hljubh)r}r(hkX``bsid``h}r(h]h]h]h]h]uhljh]rhXbsidrr}r(hkUhljubah~hubhX! is the inserted buildset ID and rr}r(hkX! is the inserted buildset ID and hljubh)r}r(hkX ``brids``h}r(h]h]h]h]h]uhljh]rhXbridsrr}r(hkUhljubah~hubhX; is a dictionary mapping buildernames to build request IDs.rr}r(hkX; is a dictionary mapping buildernames to build request IDs.hljubeubeubeubjh)r}r(hkUhlj hthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXMcompleteBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h:UtrauhNhhh]ubj)r}r(hkUhlj hthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkX1completeBuildset(bsid, results[, complete_at=XX])hljhthwh~jh}r(h]rh:ajj h]h]h]h]rh:ajX,BuildsetsConnectorComponent.completeBuildsetjj juhMUhhh]r(j)r }r (hkXcompleteBuildsethljhthwh~jh}r (h]h]h]h]h]uhMUhhh]r hXcompleteBuildsetr r}r(hkUhlj ubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhMUhhh]r(jG)r}r(hkXbsidh}r(h]h]h]h]h]uhljh]rhXbsidrr}r(hkUhljubah~jOubjG)r}r(hkXresultsh}r(h]h]h]h]h]uhljh]rhXresultsrr }r!(hkUhljubah~jOubj_)r"}r#(hkUh}r$(h]h]h]h]h]uhljh]r%jG)r&}r'(hkXcomplete_at=XXh}r((h]h]h]h]h]uhlj"h]r)hXcomplete_at=XXr*r+}r,(hkUhlj&ubah~jOubah~jkubeubeubj)r-}r.(hkUhljhthwh~jh}r/(h]h]h]h]h]uhMUhhh]r0(jT)r1}r2(hkUhlj-hthwh~jWh}r3(h]h]h]h]h]uhNhhh]r4(jZ)r5}r6(hkUh}r7(h]h]h]h]h]uhlj1h]r8(j_)r9}r:(hkUh}r;(h]h]h]h]h]uhlj5h]r<hX Parametersr=r>}r?(hkUhlj9ubah~jgubjh)r@}rA(hkUh}rB(h]h]h]h]h]uhlj5h]rCj)rD}rE(hkUh}rF(h]h]h]h]h]uhlj@h]rG(j)rH}rI(hkUh}rJ(h]h]h]h]h]uhljDh]rKh)rL}rM(hkUh}rN(h]h]h]h]h]uhljHh]rO(jq)rP}rQ(hkXbsidh}rR(h]h]h]h]h]uhljLh]rShXbsidrTrU}rV(hkUhljPubah~jyubhX (rWrX}rY(hkUhljLubj')rZ}r[(hkUh}r\(Ureftypej)U reftargetXintegerr]U refdomainjh]h]U refexplicith]h]h]uhljLh]r^jw)r_}r`(hkj]h}ra(h]h]h]h]h]uhljZh]rbhXintegerrcrd}re(hkUhlj_ubah~jubah~j+ubhX)rf}rg(hkUhljLubhX -- rhri}rj(hkUhljLubhXbuildset ID to completerkrl}rm(hkXbuildset ID to completehljLubeh~hubah~jubj)rn}ro(hkUh}rp(h]h]h]h]h]uhljDh]rqh)rr}rs(hkUh}rt(h]h]h]h]h]uhljnh]ru(jq)rv}rw(hkXresultsh}rx(h]h]h]h]h]uhljrh]ryhXresultsrzr{}r|(hkUhljvubah~jyubhX (r}r~}r(hkUhljrubj')r}r(hkUh}r(Ureftypej)U reftargetXintegerrU refdomainjh]h]U refexplicith]h]h]uhljrh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXintegerrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljrubhX -- rr}r(hkUhljrubhXinteger result coderr}r(hkXinteger result codehljrubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljDh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX complete_ath}r(h]h]h]h]h]uhljh]rhX complete_atrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXdatetimerU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXdatetimerr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXtime the buildset was completedrr}r(hkXtime the buildset was completedhljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhlj1h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXDeferredrr}r(hkXDeferredhljubah~hubah~jubeh~jubjZ)r}r(hkUhlj1hthwh~jh}r(h]h]h]h]h]uhMOhhh]r(j_)r}r(hkXraisesh}r(h]h]h]h]h]uhljh]rhXRaisesrr}r(hkUhljubah~jgubjh)r}r(hkXI:py:exc:`KeyError` if the buildset does not exist or is already complete h}r(h]h]h]h]h]uhljh]rh)r}r(hkXH:py:exc:`KeyError` if the buildset does not exist or is already completehljhthwh~hh}r(h]h]h]h]h]uhMOh]r(j')r}r(hkX:py:exc:`KeyError`rhljhthwh~j+h}r(UreftypeXexcj-j.XKeyErrorU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2j j3j uhMOh]rh)r}r(hkjh}r(h]h]r(j9jXpy-excreh]h]h]uhljh]rhXKeyErrorrr}r(hkUhljubah~hubaubhX6 if the buildset does not exist or is already completerr}r(hkX6 if the buildset does not exist or is already completehljubeubah~jubeubeubh)r}r(hkXComplete a buildset, marking it with the given ``results`` and setting its ``completed_at`` to the current time, if the ``complete_at`` argument is omitted.hlj-hthwh~hh}r(h]h]h]h]h]uhMRhhh]r(hX/Complete a buildset, marking it with the given rr}r(hkX/Complete a buildset, marking it with the given hljubh)r}r(hkX ``results``h}r(h]h]h]h]h]uhljh]rhXresultsrr}r(hkUhljubah~hubhX and setting its rr}r(hkX and setting its hljubh)r}r(hkX``completed_at``h}r(h]h]h]h]h]uhljh]r hX completed_atr r }r (hkUhljubah~hubhX to the current time, if the r r}r(hkX to the current time, if the hljubh)r}r(hkX``complete_at``h}r(h]h]h]h]h]uhljh]rhX complete_atrr}r(hkUhljubah~hubhX argument is omitted.rr}r(hkX argument is omitted.hljubeubeubeubjh)r}r(hkUhlj hthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXHgetBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h UtrauhNhhh]ubj)r}r (hkUhlj hthwh~jh}r!(jjXpyh]h]h]h]h]jXmethodr"jj"uhNhhh]r#(j)r$}r%(hkXgetBuildset(bsid)hljhthwh~jh}r&(h]r'h ajj h]h]h]h]r(h ajX'BuildsetsConnectorComponent.getBuildsetjj juhM`hhh]r)(j)r*}r+(hkX getBuildsethlj$hthwh~jh}r,(h]h]h]h]h]uhM`hhh]r-hX getBuildsetr.r/}r0(hkUhlj*ubaubjA)r1}r2(hkUhlj$hthwh~jDh}r3(h]h]h]h]h]uhM`hhh]r4jG)r5}r6(hkXbsidh}r7(h]h]h]h]h]uhlj1h]r8hXbsidr9r:}r;(hkUhlj5ubah~jOubaubeubj)r<}r=(hkUhljhthwh~jh}r>(h]h]h]h]h]uhM`hhh]r?(jT)r@}rA(hkUhlj<hthwh~jWh}rB(h]h]h]h]h]uhNhhh]rC(jZ)rD}rE(hkUh}rF(h]h]h]h]h]uhlj@h]rG(j_)rH}rI(hkUh}rJ(h]h]h]h]h]uhljDh]rKhX ParametersrLrM}rN(hkUhljHubah~jgubjh)rO}rP(hkUh}rQ(h]h]h]h]h]uhljDh]rRh)rS}rT(hkUh}rU(h]h]h]h]h]uhljOh]rV(jq)rW}rX(hkXbsidh}rY(h]h]h]h]h]uhljSh]rZhXbsidr[r\}r](hkUhljWubah~jyubhX -- r^r_}r`(hkUhljSubhX buildset IDrarb}rc(hkX buildset IDhljSubeh~hubah~jubeh~jubjZ)rd}re(hkUh}rf(h]h]h]h]h]uhlj@h]rg(j_)rh}ri(hkUh}rj(h]h]h]h]h]uhljdh]rkhXReturnsrlrm}rn(hkUhljhubah~jgubjh)ro}rp(hkUh}rq(h]h]h]h]h]uhljdh]rrh)rs}rt(hkUh}ru(h]h]h]h]h]uhljoh]rv(hX bsdict, or rwrx}ry(hkX bsdict, or hljsubh)rz}r{(hkX``None``h}r|(h]h]h]h]h]uhljsh]r}hXNoner~r}r(hkUhljzubah~hubhX, via Deferredrr}r(hkX, via Deferredhljsubeh~hubah~jubeh~jubeubh)r}r(hkXUGet a bsdict representing the given buildset, or ``None`` if no such buildset exists.hlj<hthwh~hh}r(h]h]h]h]h]uhM[hhh]r(hX1Get a bsdict representing the given buildset, or rr}r(hkX1Get a bsdict representing the given buildset, or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX if no such buildset exists.rr}r(hkX if no such buildset exists.hljubeubh)r}r(hkXPNote that buildsets are not cached, as the values in the database are not fixed.rhlj<hthwh~hh}r(h]h]h]h]h]uhM^hhh]rhXPNote that buildsets are not cached, as the values in the database are not fixed.rr}r(hkjhljubaubeubeubjh)r}r(hkUhlj hthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXIgetBuildsets() (buildbot.db.buildsets.BuildsetsConnectorComponent method)hUtrauhNhhh]ubj)r}r(hkUhlj hthwh~jh}r(jjXpyh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXgetBuildsets(complete=None)hljhthwh~jh}r(h]rhajj h]h]h]h]rhajX(BuildsetsConnectorComponent.getBuildsetsjj juhMihhh]r(j)r}r(hkX getBuildsetshljhthwh~jh}r(h]h]h]h]h]uhMihhh]rhX getBuildsetsrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhMihhh]rjG)r}r(hkX complete=Noneh}r(h]h]h]h]h]uhljh]rhX complete=Nonerr}r(hkUhljubah~jOubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhMihhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXcompleteh}r(h]h]h]h]h]uhljh]rhXcompleterr}r(hkUhljubah~jyubhX -- rr}r(hkUhljubhXXif true, return only complete buildsets; if false, return only incomplete buildsets; if rr}r(hkXXif true, return only complete buildsets; if false, return only incomplete buildsets; if hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX! or omitted, return all buildsetsrr}r(hkX! or omitted, return all buildsetshljubeh~hubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXlist of bsdicts, via Deferredrr}r(hkXlist of bsdicts, via Deferredhljubah~hubah~jubeh~jubeubh)r}r(hkX2Get a list of bsdicts matching the given criteria.r hljhthwh~hh}r (h]h]h]h]h]uhMhhhh]r hX2Get a list of bsdicts matching the given criteria.r r }r(hkj hljubaubeubeubjh)r}r(hkUhlj htNh~jkh}r(h]h]h]h]h]Uentries]uhNhhh]ubj)r}r(hkUhlj htNh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkX7getRecentBuildsets(count, branch=None, repository=None,rhljhthwh~jh}r(h]h]h]h]h]juhMzhhh]rj)r}r(hkjhljhthwh~jh}r(h]h]h]h]h]uhMzhhh]r hX7getRecentBuildsets(count, branch=None, repository=None,r!r"}r#(hkUhljubaubaubj)r$}r%(hkXcomplete=None):r&hljhthwh~jh}r'(h]h]h]h]h]juhMzhhh]r(j)r)}r*(hkj&hlj$hthwh~jh}r+(h]h]h]h]h]uhMzhhh]r,hXcomplete=None):r-r.}r/(hkUhlj)ubaubaubj)r0}r1(hkUhljhthwh~jh}r2(h]h]h]h]h]uhMzhhh]r3jT)r4}r5(hkUhlj0htNh~jWh}r6(h]h]h]h]h]uhNhhh]r7(jZ)r8}r9(hkUh}r:(h]h]h]h]h]uhlj4h]r;(j_)r<}r=(hkUh}r>(h]h]h]h]h]uhlj8h]r?hX Parametersr@rA}rB(hkUhlj<ubah~jgubjh)rC}rD(hkUh}rE(h]h]h]h]h]uhlj8h]rFj)rG}rH(hkUh}rI(h]h]h]h]h]uhljCh]rJ(j)rK}rL(hkUh}rM(h]h]h]h]h]uhljGh]rNh)rO}rP(hkUh}rQ(h]h]h]h]h]uhljKh]rR(jq)rS}rT(hkXcounth}rU(h]h]h]h]h]uhljOh]rVhXcountrWrX}rY(hkUhljSubah~jyubhX -- rZr[}r\(hkUhljOubhX(maximum number of buildsets to retrieve.r]r^}r_(hkX(maximum number of buildsets to retrieve.hljOubeh~hubah~jubj)r`}ra(hkUh}rb(h]h]h]h]h]uhljGh]rch)rd}re(hkUh}rf(h]h]h]h]h]uhlj`h]rg(jq)rh}ri(hkXbranchh}rj(h]h]h]h]h]uhljdh]rkhXbranchrlrm}rn(hkUhljhubah~jyubhX (rorp}rq(hkUhljdubj')rr}rs(hkUh}rt(Ureftypej)U reftargetXstringruU refdomainjh]h]U refexplicith]h]h]uhljdh]rvjw)rw}rx(hkjuh}ry(h]h]h]h]h]uhljrh]rzhXstringr{r|}r}(hkUhljwubah~jubah~j+ubhX)r~}r(hkUhljdubhX -- rr}r(hkUhljdubhXZoptional branch name. If specified, only buildsets affecting such branch will be returned.rr}r(hkXZoptional branch name. If specified, only buildsets affecting such branch will be returned.hljdubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljGh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX repositoryh}r(h]h]h]h]h]uhljh]rhX repositoryrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXstringrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXstringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXboptional repository name. If specified, only buildsets affecting such repository will be returned.rr}r(hkXboptional repository name. If specified, only buildsets affecting such repository will be returned.hljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljGh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXcompleteh}r(h]h]h]h]h]uhljh]rhXcompleterr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXBooleanrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXBooleanrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXXif true, return only complete buildsets; if false, return only incomplete buildsets; if rr}r(hkXXif true, return only complete buildsets; if false, return only incomplete buildsets; if hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX! or omitted, return all buildsetsrr}r(hkX! or omitted, return all buildsetshljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhlj4h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXlist of bsdicts, via Deferredrr}r(hkXlist of bsdicts, via Deferredhljubah~hubah~jubeh~jubeubaubeubjh)r}r(hkUhlj hthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXRgetBuildsetProperties() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h;UtrauhNhhh]ubj)r}r(hkUhlj hthwh~jh}r(jjXpyh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkX!getBuildsetProperties(buildsetid)hljhthwh~jh}r(h]rh;ajj h]h]h]h]rh;ajX1BuildsetsConnectorComponent.getBuildsetPropertiesjj juhMhhh]r(j)r}r(hkXgetBuildsetPropertieshljhthwh~jh}r(h]h]h]h]h]uhMhhh]rhXgetBuildsetPropertiesrr}r(hkUhljubaubjA)r }r (hkUhljhthwh~jDh}r (h]h]h]h]h]uhMhhh]r jG)r }r(hkX buildsetidh}r(h]h]h]h]h]uhlj h]rhX buildsetidrr}r(hkUhlj ubah~jOubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhMhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r }r!(hkUh}r"(h]h]h]h]h]uhljh]r#hX Parametersr$r%}r&(hkUhlj ubah~jgubjh)r'}r((hkUh}r)(h]h]h]h]h]uhljh]r*h)r+}r,(hkUh}r-(h]h]h]h]h]uhlj'h]r.(jq)r/}r0(hkX buildsetidh}r1(h]h]h]h]h]uhlj+h]r2hX buildsetidr3r4}r5(hkUhlj/ubah~jyubhX -- r6r7}r8(hkUhlj+ubhX buildset IDr9r:}r;(hkX buildset IDhlj+ubeh~hubah~jubeh~jubjZ)r<}r=(hkUh}r>(h]h]h]h]h]uhljh]r?(j_)r@}rA(hkUh}rB(h]h]h]h]h]uhlj<h]rChXReturnsrDrE}rF(hkUhlj@ubah~jgubjh)rG}rH(hkUh}rI(h]h]h]h]h]uhlj<h]rJh)rK}rL(hkUh}rM(h]h]h]h]h]uhljGh]rN(hX$dictionary mapping property name to rOrP}rQ(hkX$dictionary mapping property name to hljKubh)rR}rS(hkX``value, source``h}rT(h]h]h]h]h]uhljKh]rUhX value, sourcerVrW}rX(hkUhljRubah~hubhX, via DeferredrYrZ}r[(hkX, via DeferredhljKubeh~hubah~jubeh~jubeubh)r\}r](hkXcReturn the properties for a buildset, in the same format they were given to :py:meth:`addBuildset`.hljhthwh~hh}r^(h]h]h]h]h]uhMhhh]r_(hXLReturn the properties for a buildset, in the same format they were given to r`ra}rb(hkXLReturn the properties for a buildset, in the same format they were given to hlj\ubj')rc}rd(hkX:py:meth:`addBuildset`rehlj\hthwh~j+h}rf(UreftypeXmethj-j.X addBuildsetU refdomainXpyrgh]h]U refexplicith]h]h]j0j1j2j j3j uhMh]rhh)ri}rj(hkjeh}rk(h]h]rl(j9jgXpy-methrmeh]h]h]uhljch]rnhX addBuildsetrorp}rq(hkUhljiubah~hubaubhX.rr}rs(hkX.hlj\ubeubh)rt}ru(hkXNote that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns ``{}`` in either case.hljhthwh~hh}rv(h]h]h]h]h]uhMhhh]rw(hXrNote that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns rxry}rz(hkXrNote that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns hljtubh)r{}r|(hkX``{}``h}r}(h]h]h]h]h]uhljth]r~hX{}rr}r(hkUhlj{ubah~hubhX in either case.rr}r(hkX in either case.hljtubeubeubeubeubeubeubhm)r}r(hkUhljIhthwh~hh}r(h]h]h]h]r(Xmodule-buildbot.db.buildslavesrU buildslavesreh]rhLauhMhhh]r(h)r}r(hkX buildslavesrhljhthwh~hh}r(h]h]h]h]h]uhMhhh]rhX buildslavesrr}r(hkjhljubaubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnX buildbot.db.buildslaves (module)Xmodule-buildbot.db.buildslavesUtrauhMhhh]ubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]js]r(juX#BuildSlaves; DB Connector ComponentUindex-8rUtrajxuhMhhh]ubh{)r}r(hkUhljhthwh~hh}r(h]h]h]h]rjah]uhMhhh]ubjh)r}r(hkUhljhtNh~jkh}r(h]h]h]h]h]Uentries]r(jnX@BuildslavesConnectorComponent (class in buildbot.db.buildslaves)h'UtrauhNhhh]ubj)r}r(hkUhljhtNh~jh}r(jjXpyh]h]h]h]h]jXclassrjjuhNhhh]r(j)r}r(hkXBuildslavesConnectorComponentrhljhthwh~jh}r(h]rh'ajXbuildbot.db.buildslavesrh]h]h]h]rh'ajjjUjuhMhhh]r(j)r}r(hkXclass hljhthwh~jh}r(h]h]h]h]h]uhMhhh]rhXclass rr}r(hkUhljubaubj)r}r(hkXbuildbot.db.buildslaves.hljhthwh~jh}r(h]h]h]h]h]uhMhhh]rhXbuildbot.db.buildslaves.rr}r(hkUhljubaubj)r}r(hkjhljhthwh~jh}r(h]h]h]h]h]uhMhhh]rhXBuildslavesConnectorComponentrr}r(hkUhljubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhMhhh]r(h)r}r(hkXlThis class handles Buildbot's notion of buildslaves. The buildslave information is returned as a dictionary:rhljhthwh~hh}r(h]h]h]h]h]uhMhhh]rhXlThis class handles Buildbot's notion of buildslaves. The buildslave information is returned as a dictionary:rr}r(hkjhljubaubj)r}r(hkUhljhthwh~jh}r(jX*h]h]h]h]h]uhMhhh]r(j)r}r(hkX ``slaveid``rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]rh)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXslaveidrr}r(hkUhljubah~hubaubaubj)r}r(hkX%``name`` (the name of the buildslave)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX``name``h}r(h]h]h]h]h]uhljh]rhXnamerr}r(hkUhljubah~hubhX (the name of the buildslave)rr}r(hkX (the name of the buildslave)hljubeubaubj)r}r(hkX5``slaveinfo`` (buildslave information as dictionary) hljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkX4``slaveinfo`` (buildslave information as dictionary)hljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``slaveinfo``h}r(h]h]h]h]h]uhljh]r hX slaveinfor r }r (hkUhljubah~hubhX' (buildslave information as dictionary)r r}r(hkX' (buildslave information as dictionary)hljubeubaubeubh)r}r(hkX2The 'slaveinfo' dictionary has the following keys:rhljhthwh~hh}r(h]h]h]h]h]uhMhhh]rhX2The 'slaveinfo' dictionary has the following keys:rr}r(hkjhljubaubj)r}r(hkUhljhthwh~jh}r(jX*h]h]h]h]h]uhMhhh]r(j)r}r(hkX!``admin`` (the admin information)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]r h)r!}r"(hkjhljhthwh~hh}r#(h]h]h]h]h]uhMh]r$(h)r%}r&(hkX ``admin``h}r'(h]h]h]h]h]uhlj!h]r(hXadminr)r*}r+(hkUhlj%ubah~hubhX (the admin information)r,r-}r.(hkX (the admin information)hlj!ubeubaubj)r/}r0(hkX``host`` (the name of the host)r1hljhthwh~jh}r2(h]h]h]h]h]uhNhhh]r3h)r4}r5(hkj1hlj/hthwh~hh}r6(h]h]h]h]h]uhMh]r7(h)r8}r9(hkX``host``h}r:(h]h]h]h]h]uhlj4h]r;hXhostr<r=}r>(hkUhlj8ubah~hubhX (the name of the host)r?r@}rA(hkX (the name of the host)hlj4ubeubaubj)rB}rC(hkX``access_uri`` (the access URI)rDhljhthwh~jh}rE(h]h]h]h]h]uhNhhh]rFh)rG}rH(hkjDhljBhthwh~hh}rI(h]h]h]h]h]uhMh]rJ(h)rK}rL(hkX``access_uri``h}rM(h]h]h]h]h]uhljGh]rNhX access_urirOrP}rQ(hkUhljKubah~hubhX (the access URI)rRrS}rT(hkX (the access URI)hljGubeubaubj)rU}rV(hkX,``version`` (the version on the buildslave) hljhthwh~jh}rW(h]h]h]h]h]uhNhhh]rXh)rY}rZ(hkX+``version`` (the version on the buildslave)hljUhthwh~hh}r[(h]h]h]h]h]uhMh]r\(h)r]}r^(hkX ``version``h}r_(h]h]h]h]h]uhljYh]r`hXversionrarb}rc(hkUhlj]ubah~hubhX (the version on the buildslave)rdre}rf(hkX (the version on the buildslave)hljYubeubaubeubjh)rg}rh(hkUhljhthwh~jkh}ri(h]h]h]h]h]Uentries]rj(jnXOgetBuildslaves() (buildbot.db.buildslaves.BuildslavesConnectorComponent method)h8UtrkauhNhhh]ubj)rl}rm(hkUhljhthwh~jh}rn(jjXpyh]h]h]h]h]jXmethodrojjouhNhhh]rp(j)rq}rr(hkXgetBuildslaves()hljlhthwh~jh}rs(h]rth8ajjh]h]h]h]ruh8ajX,BuildslavesConnectorComponent.getBuildslavesjjjuhMhhh]rv(j)rw}rx(hkXgetBuildslaveshljqhthwh~jh}ry(h]h]h]h]h]uhMhhh]rzhXgetBuildslavesr{r|}r}(hkUhljwubaubjA)r~}r(hkUhljqhthwh~jDh}r(h]h]h]h]h]uhMhhh]ubeubj)r}r(hkUhljlhthwh~jh}r(h]h]h]h]h]uhMhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]rjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX(list of partial information via Deferredrr}r(hkX(list of partial information via Deferredhljubah~hubah~jubeh~jubaubh)r}r(hkXBGet the entire list of buildslaves. Only id and name are returned.rhljhthwh~hh}r(h]h]h]h]h]uhMhhh]rhXBGet the entire list of buildslaves. Only id and name are returned.rr}r(hkjhljubaubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXTgetBuildslaveByName() (buildbot.db.buildslaves.BuildslavesConnectorComponent method)h.UtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXgetBuildslaveByName(name)hljhthwh~jh}r(h]rh.ajjh]h]h]h]rh.ajX1BuildslavesConnectorComponent.getBuildslaveByNamejjjuhMhhh]r(j)r}r(hkXgetBuildslaveByNamehljhthwh~jh}r(h]h]h]h]h]uhMhhh]rhXgetBuildslaveByNamerr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhMhhh]rjG)r}r(hkXnameh}r(h]h]h]h]h]uhljh]rhXnamerr}r(hkUhljubah~jOubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhMhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXnameh}r(h]h]h]h]h]uhljh]rhXnamerr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXstringrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXstringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX&the name of the buildslave to retrieverr}r(hkX&the name of the buildslave to retrievehljubeh~hubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r (h]h]h]h]h]uhljh]r hXReturnsr r }r (hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX%info dictionary or None, via deferredrr}r(hkX%info dictionary or None, via deferredhljubah~hubah~jubeh~jubeubh)r}r(hkXpLooks up the buildslave with the name, returning the information or ``None`` if no matching buildslave is found.hljhthwh~hh}r(h]h]h]h]h]uhMhhh]r(hXDLooks up the buildslave with the name, returning the information or rr}r(hkXDLooks up the buildslave with the name, returning the information or hljubh)r }r!(hkX``None``h}r"(h]h]h]h]h]uhljh]r#hXNoner$r%}r&(hkUhlj ubah~hubhX$ if no matching buildslave is found.r'r(}r)(hkX$ if no matching buildslave is found.hljubeubeubeubjh)r*}r+(hkUhljhthwh~jkh}r,(h]h]h]h]h]Uentries]r-(jnXQupdateBuildslave() (buildbot.db.buildslaves.BuildslavesConnectorComponent method)hFUtr.auhNhhh]ubj)r/}r0(hkUhljhthwh~jh}r1(jjXpyr2h]h]h]h]h]jXmethodr3jj3uhNhhh]r4(j)r5}r6(hkX!updateBuildslave(name, slaveinfo)hlj/hthwh~jh}r7(h]r8hFajjh]h]h]h]r9hFajX.BuildslavesConnectorComponent.updateBuildslavejjjuhMhhh]r:(j)r;}r<(hkXupdateBuildslavehlj5hthwh~jh}r=(h]h]h]h]h]uhMhhh]r>hXupdateBuildslaver?r@}rA(hkUhlj;ubaubjA)rB}rC(hkUhlj5hthwh~jDh}rD(h]h]h]h]h]uhMhhh]rE(jG)rF}rG(hkXnameh}rH(h]h]h]h]h]uhljBh]rIhXnamerJrK}rL(hkUhljFubah~jOubjG)rM}rN(hkX slaveinfoh}rO(h]h]h]h]h]uhljBh]rPhX slaveinforQrR}rS(hkUhljMubah~jOubeubeubj)rT}rU(hkUhlj/hthwh~jh}rV(h]h]h]h]h]uhMhhh]rW(jT)rX}rY(hkUhljThthwh~jWh}rZ(h]h]h]h]h]uhNhhh]r[(jZ)r\}r](hkUh}r^(h]h]h]h]h]uhljXh]r_(j_)r`}ra(hkUh}rb(h]h]h]h]h]uhlj\h]rchX Parametersrdre}rf(hkUhlj`ubah~jgubjh)rg}rh(hkUh}ri(h]h]h]h]h]uhlj\h]rjj)rk}rl(hkUh}rm(h]h]h]h]h]uhljgh]rn(j)ro}rp(hkUh}rq(h]h]h]h]h]uhljkh]rrh)rs}rt(hkUh}ru(h]h]h]h]h]uhljoh]rv(jq)rw}rx(hkXnameh}ry(h]h]h]h]h]uhljsh]rzhXnamer{r|}r}(hkUhljwubah~jyubhX (r~r}r(hkUhljsubj')r}r(hkUh}r(Ureftypej)U reftargetXstringrU refdomainj2h]h]U refexplicith]h]h]uhljsh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXstringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljsubhX -- rr}r(hkUhljsubhX$the name of the buildslave to updaterr}r(hkX$the name of the buildslave to updatehljsubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljkh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX slaveinfoh}r(h]h]h]h]h]uhljh]rhX slaveinforr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXdictrU refdomainj2h]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXdictrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXthe full buildslave dictionaryrr}r(hkXthe full buildslave dictionaryhljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljXh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXDeferredrr}r(hkXDeferredhljubah~hubah~jubeh~jubeubh)r}r(hkX.Update information about the given buildslave.rhljThthwh~hh}r(h]h]h]h]h]uhMhhh]rhX.Update information about the given buildslave.rr}r(hkjhljubaubeubeubeubeubeubhm)r}r(hkUhljIhthwh~hh}r(h]h]h]h]r(Xmodule-buildbot.db.changesrUchangesreh]rh0auhMhhh]r(h)r}r(hkXchangesrhljhthwh~hh}r(h]h]h]h]h]uhMhhh]rhXchangesrr}r(hkjhljubaubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXbuildbot.db.changes (module)Xmodule-buildbot.db.changesUtrauhMhhh]ubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]js]r(juXChanges; DB Connector ComponentUindex-9rUtrajxuhMhhh]ubh{)r}r(hkUhljhthwh~hh}r(h]h]h]h]rjah]uhMhhh]ubjh)r}r(hkUhljhtNh~jkh}r(h]h]h]h]h]Uentries]r(jnX8ChangesConnectorComponent (class in buildbot.db.changes)h UtrauhNhhh]ubj)r}r(hkUhljhtNh~jh}r(jjXpyh]h]h]h]h]jXclassrjjuhNhhh]r(j)r}r(hkXChangesConnectorComponentrhljhthwh~jh}r(h]rh ajXbuildbot.db.changesrh]h]h]h]rh ajjjUjuhM0hhh]r (j)r }r (hkXclass hljhthwh~jh}r (h]h]h]h]h]uhM0hhh]r hXclass rr}r(hkUhlj ubaubj)r}r(hkXbuildbot.db.changes.hljhthwh~jh}r(h]h]h]h]h]uhM0hhh]rhXbuildbot.db.changes.rr}r(hkUhljubaubj)r}r(hkjhljhthwh~jh}r(h]h]h]h]h]uhM0hhh]rhXChangesConnectorComponentrr}r(hkUhljubaubeubj)r}r (hkUhljhthwh~jh}r!(h]h]h]h]h]uhM0hhh]r"(h)r#}r$(hkXoThis class handles changes in the buildbot database, including pulling information from the changes sub-tables.r%hljhthwh~hh}r&(h]h]h]h]h]uhMhhh]r'hXoThis class handles changes in the buildbot database, including pulling information from the changes sub-tables.r(r)}r*(hkj%hlj#ubaubh)r+}r,(hkX@An instance of this class is available at ``master.db.changes``.hljhthwh~hh}r-(h]h]h]h]h]uhMhhh]r.(hX*An instance of this class is available at r/r0}r1(hkX*An instance of this class is available at hlj+ubh)r2}r3(hkX``master.db.changes``h}r4(h]h]h]h]h]uhlj+h]r5hXmaster.db.changesr6r7}r8(hkUhlj2ubah~hubhX.r9}r:(hkX.hlj+ubeubjh)r;}r<(hkUhljhthwh~jkh}r=(h]h]h]h]h]js]r>((jnXchdictUindex-10r?Utr@(jnXchangeidj?UtrAejxuhMhhh]ubh{)rB}rC(hkUhljhthwh~hh}rD(h]h]h]h]h]hj?uhMhhh]ubh)rE}rF(hkXcChanges are indexed by *changeid*, and are represented by a *chdict*, which has the following keys:hljhthwhy}h~hh}rG(h]h]h]h]rHj?ah]uhMhhh}rIj?jBsh]rJ(hXChanges are indexed by rKrL}rM(hkXChanges are indexed by hljEubjw)rN}rO(hkX *changeid*h}rP(h]h]h]h]h]uhljEh]rQhXchangeidrRrS}rT(hkUhljNubah~jubhX, and are represented by a rUrV}rW(hkX, and are represented by a hljEubjw)rX}rY(hkX*chdict*h}rZ(h]h]h]h]h]uhljEh]r[hXchdictr\r]}r^(hkUhljXubah~jubhX, which has the following keys:r_r`}ra(hkX, which has the following keys:hljEubeubj)rb}rc(hkUhljhthwh~jh}rd(jX*h]h]h]h]h]uhMhhh]re(j)rf}rg(hkX$``changeid`` (the ID of this change)rhhljbhthwh~jh}ri(h]h]h]h]h]uhNhhh]rjh)rk}rl(hkjhhljfhthwh~hh}rm(h]h]h]h]h]uhMh]rn(h)ro}rp(hkX ``changeid``h}rq(h]h]h]h]h]uhljkh]rrhXchangeidrsrt}ru(hkUhljoubah~hubhX (the ID of this change)rvrw}rx(hkX (the ID of this change)hljkubeubaubj)ry}rz(hkX.``author`` (unicode; the author of the change)r{hljbhthwh~jh}r|(h]h]h]h]h]uhNhhh]r}h)r~}r(hkj{hljyhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``author``h}r(h]h]h]h]h]uhlj~h]rhXauthorrr}r(hkUhljubah~hubhX$ (unicode; the author of the change)rr}r(hkX$ (unicode; the author of the change)hlj~ubeubaubj)r}r(hkX:``files`` (list of unicode; source-code filenames changed)rhljbhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``files``h}r(h]h]h]h]h]uhljh]rhXfilesrr}r(hkUhljubah~hubhX1 (list of unicode; source-code filenames changed)rr}r(hkX1 (list of unicode; source-code filenames changed)hljubeubaubj)r}r(hkX%``comments`` (unicode; user comments)rhljbhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``comments``h}r(h]h]h]h]h]uhljh]rhXcommentsrr}r(hkUhljubah~hubhX (unicode; user comments)rr}r(hkX (unicode; user comments)hljubeubaubj)r}r(hkX``is_dir`` (deprecated)rhljbhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``is_dir``h}r(h]h]h]h]h]uhljh]rhXis_dirrr}r(hkUhljubah~hubhX (deprecated)rr}r(hkX (deprecated)hljubeubaubj)r}r(hkXN``links`` (list of unicode; links for this change, e.g., to web views, review)hljbhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkXN``links`` (list of unicode; links for this change, e.g., to web views, review)hljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``links``h}r(h]h]h]h]h]uhljh]rhXlinksrr}r(hkUhljubah~hubhXE (list of unicode; links for this change, e.g., to web views, review)rr}r(hkXE (list of unicode; links for this change, e.g., to web views, review)hljubeubaubj)r}r(hkXO``revision`` (unicode string; revision for this change, or ``None`` if unknown)hljbhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkXO``revision`` (unicode string; revision for this change, or ``None`` if unknown)hljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``revision``h}r(h]h]h]h]h]uhljh]rhXrevisionrr}r(hkUhljubah~hubhX/ (unicode string; revision for this change, or rr}r(hkX/ (unicode string; revision for this change, or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX if unknown)rr}r(hkX if unknown)hljubeubaubj)r}r(hkX:``when_timestamp`` (datetime instance; time of the change)rhljbhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX``when_timestamp``h}r(h]h]h]h]h]uhljh]rhXwhen_timestamprr}r(hkUhljubah~hubhX( (datetime instance; time of the change)rr}r(hkX( (datetime instance; time of the change)hljubeubaubj)r}r(hkX``branch`` (unicode string; branch on which the change took place, or ``None`` for the "default branch", whatever that might mean)hljbhthwh~jh}r(h]h]h]h]h]uhNhhh]r h)r }r (hkX``branch`` (unicode string; branch on which the change took place, or ``None`` for the "default branch", whatever that might mean)hljhthwh~hh}r (h]h]h]h]h]uhMh]r (h)r}r(hkX ``branch``h}r(h]h]h]h]h]uhlj h]rhXbranchrr}r(hkUhljubah~hubhX< (unicode string; branch on which the change took place, or rr}r(hkX< (unicode string; branch on which the change took place, or hlj ubh)r}r(hkX``None``h}r(h]h]h]h]h]uhlj h]rhXNonerr}r(hkUhljubah~hubhX4 for the "default branch", whatever that might mean)rr }r!(hkX4 for the "default branch", whatever that might mean)hlj ubeubaubj)r"}r#(hkXP``category`` (unicode string; user-defined category of this change, or ``None``)hljbhthwh~jh}r$(h]h]h]h]h]uhNhhh]r%h)r&}r'(hkXP``category`` (unicode string; user-defined category of this change, or ``None``)hlj"hthwh~hh}r((h]h]h]h]h]uhMh]r)(h)r*}r+(hkX ``category``h}r,(h]h]h]h]h]uhlj&h]r-hXcategoryr.r/}r0(hkUhlj*ubah~hubhX; (unicode string; user-defined category of this change, or r1r2}r3(hkX; (unicode string; user-defined category of this change, or hlj&ubh)r4}r5(hkX``None``h}r6(h]h]h]h]h]uhlj&h]r7hXNoner8r9}r:(hkUhlj4ubah~hubhX)r;}r<(hkX)hlj&ubeubaubj)r=}r>(hkX?``revlink`` (unicode string; link to a web view of this change)r?hljbhthwh~jh}r@(h]h]h]h]h]uhNhhh]rAh)rB}rC(hkj?hlj=hthwh~hh}rD(h]h]h]h]h]uhMh]rE(h)rF}rG(hkX ``revlink``h}rH(h]h]h]h]h]uhljBh]rIhXrevlinkrJrK}rL(hkUhljFubah~hubhX4 (unicode string; link to a web view of this change)rMrN}rO(hkX4 (unicode string; link to a web view of this change)hljBubeubaubj)rP}rQ(hkXw``properties`` (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))hljbhthwh~jh}rR(h]h]h]h]h]uhNhhh]rSh)rT}rU(hkXw``properties`` (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))hljPhthwh~hh}rV(h]h]h]h]h]uhMh]rW(h)rX}rY(hkX``properties``h}rZ(h]h]h]h]h]uhljTh]r[hX propertiesr\r]}r^(hkUhljXubah~hubhXi (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))r_r`}ra(hkXi (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))hljTubeubaubj)rb}rc(hkXF``repository`` (unicode string; repository where this change occurred)rdhljbhthwh~jh}re(h]h]h]h]h]uhNhhh]rfh)rg}rh(hkjdhljbhthwh~hh}ri(h]h]h]h]h]uhMh]rj(h)rk}rl(hkX``repository``h}rm(h]h]h]h]h]uhljgh]rnhX repositoryrorp}rq(hkUhljkubah~hubhX8 (unicode string; repository where this change occurred)rrrs}rt(hkX8 (unicode string; repository where this change occurred)hljgubeubaubj)ru}rv(hkXT``project`` (unicode string; user-defined project to which this change corresponds) hljbhthwh~jh}rw(h]h]h]h]h]uhNhhh]rxh)ry}rz(hkXS``project`` (unicode string; user-defined project to which this change corresponds)hljuhthwh~hh}r{(h]h]h]h]h]uhMh]r|(h)r}}r~(hkX ``project``h}r(h]h]h]h]h]uhljyh]rhXprojectrr}r(hkUhlj}ubah~hubhXH (unicode string; user-defined project to which this change corresponds)rr}r(hkXH (unicode string; user-defined project to which this change corresponds)hljyubeubaubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXBaddChange() (buildbot.db.changes.ChangesConnectorComponent method)hcUtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXaddChange(author=None, files=None, comments=None, is_dir=0, links=None, revision=None, when_timestamp=None, branch=None, category=None, revlink='', properties={}, repository='', project='', uid=None)hljhthwh~jh}r(h]rhcajjh]h]h]h]rhcajX#ChangesConnectorComponent.addChangejjjuhM hhh]r(j)r}r(hkX addChangehljhthwh~jh}r(h]h]h]h]h]uhM hhh]rhX addChangerr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhM hhh]r(jG)r}r(hkX author=Noneh}r(h]h]h]h]h]uhljh]rhX author=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX files=Noneh}r(h]h]h]h]h]uhljh]rhX files=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX comments=Noneh}r(h]h]h]h]h]uhljh]rhX comments=Nonerr}r(hkUhljubah~jOubjG)r}r(hkXis_dir=0h}r(h]h]h]h]h]uhljh]rhXis_dir=0rr}r(hkUhljubah~jOubjG)r}r(hkX links=Noneh}r(h]h]h]h]h]uhljh]rhX links=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX revision=Noneh}r(h]h]h]h]h]uhljh]rhX revision=Nonerr}r(hkUhljubah~jOubjG)r}r(hkXwhen_timestamp=Noneh}r(h]h]h]h]h]uhljh]rhXwhen_timestamp=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX branch=Noneh}r(h]h]h]h]h]uhljh]rhX branch=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX category=Noneh}r(h]h]h]h]h]uhljh]rhX category=Nonerr}r(hkUhljubah~jOubjG)r}r(hkX revlink=''h}r(h]h]h]h]h]uhljh]rhX revlink=''rr}r(hkUhljubah~jOubjG)r}r(hkX properties={}h}r(h]h]h]h]h]uhljh]rhX properties={}rr}r(hkUhljubah~jOubjG)r}r(hkX repository=''h}r(h]h]h]h]h]uhljh]rhX repository=''rr}r(hkUhljubah~jOubjG)r}r(hkX project=''h}r(h]h]h]h]h]uhljh]rhX project=''rr}r(hkUhljubah~jOubjG)r}r(hkXuid=Noneh}r(h]h]h]h]h]uhljh]rhXuid=Nonerr}r(hkUhljubah~jOubeubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhM hhh]r(jT)r }r (hkUhljhthwh~jWh}r (h]h]h]h]h]uhNhhh]r (jZ)r }r(hkUh}r(h]h]h]h]h]uhlj h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhlj h]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhlj h]rj)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j)r }r!(hkUh}r"(h]h]h]h]h]uhljh]r#h)r$}r%(hkUh}r&(h]h]h]h]h]uhlj h]r'(jq)r(}r)(hkXauthorh}r*(h]h]h]h]h]uhlj$h]r+hXauthorr,r-}r.(hkUhlj(ubah~jyubhX (r/r0}r1(hkUhlj$ubj')r2}r3(hkUh}r4(Ureftypej)U reftargetXunicode stringr5U refdomainjh]h]U refexplicith]h]h]uhlj$h]r6jw)r7}r8(hkj5h}r9(h]h]h]h]h]uhlj2h]r:hXunicode stringr;r<}r=(hkUhlj7ubah~jubah~j+ubhX)r>}r?(hkUhlj$ubhX -- r@rA}rB(hkUhlj$ubhXthe author of this changerCrD}rE(hkXthe author of this changehlj$ubeh~hubah~jubj)rF}rG(hkUh}rH(h]h]h]h]h]uhljh]rIh)rJ}rK(hkUh}rL(h]h]h]h]h]uhljFh]rM(jq)rN}rO(hkXfilesh}rP(h]h]h]h]h]uhljJh]rQhXfilesrRrS}rT(hkUhljNubah~jyubhX -- rUrV}rW(hkUhljJubhX%a list of filenames that were changedrXrY}rZ(hkX%a list of filenames that were changedhljJubeh~hubah~jubj)r[}r\(hkUh}r](h]h]h]h]h]uhljh]r^h)r_}r`(hkUh}ra(h]h]h]h]h]uhlj[h]rb(jq)rc}rd(hkXcommentsh}re(h]h]h]h]h]uhlj_h]rfhXcommentsrgrh}ri(hkUhljcubah~jyubhX -- rjrk}rl(hkUhlj_ubhXuser comments on the changermrn}ro(hkXuser comments on the changehlj_ubeh~hubah~jubj)rp}rq(hkUh}rr(h]h]h]h]h]uhljh]rsh)rt}ru(hkUh}rv(h]h]h]h]h]uhljph]rw(jq)rx}ry(hkXis_dirh}rz(h]h]h]h]h]uhljth]r{hXis_dirr|r}}r~(hkUhljxubah~jyubhX -- rr}r(hkUhljtubhX deprecatedrr}r(hkX deprecatedhljtubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXlinksh}r(h]h]h]h]h]uhljh]rhXlinksrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXlist of unicode stringsrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXlist of unicode stringsrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhXLa list of links related to this change, e.g., to web viewers or review pagesrr}r(hkXLa list of links related to this change, e.g., to web viewers or review pageshljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXrevisionh}r(h]h]h]h]h]uhljh]rhXrevisionrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX'the revision identifier for this changerr}r(hkX'the revision identifier for this changehljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXwhen_timestamph}r(h]h]h]h]h]uhljh]rhXwhen_timestamprr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXdatetime instance or NonerU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXdatetime instance or Nonerr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX6when this change occurred, or the current time if Nonerr}r(hkX6when this change occurred, or the current time if Nonehljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXbranchh}r(h]h]h]h]h]uhljh]rhXbranchrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r }r (hkUh}r (Ureftypej)U reftargetXunicode stringr U refdomainjh]h]U refexplicith]h]h]uhljh]r jw)r}r(hkj h}r(h]h]h]h]h]uhlj h]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX*the branch on which this change took placerr}r(hkX*the branch on which this change took placehljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]r h)r!}r"(hkUh}r#(h]h]h]h]h]uhljh]r$(jq)r%}r&(hkXcategoryh}r'(h]h]h]h]h]uhlj!h]r(hXcategoryr)r*}r+(hkUhlj%ubah~jyubhX (r,r-}r.(hkUhlj!ubj')r/}r0(hkUh}r1(Ureftypej)U reftargetXunicode stringr2U refdomainjh]h]U refexplicith]h]h]uhlj!h]r3jw)r4}r5(hkj2h}r6(h]h]h]h]h]uhlj/h]r7hXunicode stringr8r9}r:(hkUhlj4ubah~jubah~j+ubhX)r;}r<(hkUhlj!ubhX -- r=r>}r?(hkUhlj!ubhX:category for this change (arbitrary use by Buildbot users)r@rA}rB(hkX:category for this change (arbitrary use by Buildbot users)hlj!ubeh~hubah~jubj)rC}rD(hkUh}rE(h]h]h]h]h]uhljh]rFh)rG}rH(hkUh}rI(h]h]h]h]h]uhljCh]rJ(jq)rK}rL(hkXrevlinkh}rM(h]h]h]h]h]uhljGh]rNhXrevlinkrOrP}rQ(hkUhljKubah~jyubhX (rRrS}rT(hkUhljGubj')rU}rV(hkUh}rW(Ureftypej)U reftargetXunicode stringrXU refdomainjh]h]U refexplicith]h]h]uhljGh]rYjw)rZ}r[(hkjXh}r\(h]h]h]h]h]uhljUh]r]hXunicode stringr^r_}r`(hkUhljZubah~jubah~j+ubhX)ra}rb(hkUhljGubhX -- rcrd}re(hkUhljGubhX#link to a web view of this revisionrfrg}rh(hkX#link to a web view of this revisionhljGubeh~hubah~jubj)ri}rj(hkUh}rk(h]h]h]h]h]uhljh]rlh)rm}rn(hkUh}ro(h]h]h]h]h]uhljih]rp(jq)rq}rr(hkX propertiesh}rs(h]h]h]h]h]uhljmh]rthX propertiesrurv}rw(hkUhljqubah~jyubhX (rxry}rz(hkUhljmubj')r{}r|(hkUh}r}(Ureftypej)U reftargetX dictionaryr~U refdomainjh]h]U refexplicith]h]h]uhljmh]rjw)r}r(hkj~h}r(h]h]h]h]h]uhlj{h]rhX dictionaryrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljmubhX -- rr}r(hkUhljmubhXqproperties to set on this change, where values are tuples of (value, source). At the moment, the source must be rr}r(hkXqproperties to set on this change, where values are tuples of (value, source). At the moment, the source must be hljmubh)r}r(hkX ``'Change'``h}r(h]h]h]h]h]uhljmh]rhX'Change'rr}r(hkUhljubah~hubhX1, although this may be relaxed in later versions.rr}r(hkX1, although this may be relaxed in later versions.hljmubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX repositoryh}r(h]h]h]h]h]uhljh]rhX repositoryrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX.the repository in which this change took placerr}r(hkX.the repository in which this change took placehljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXprojecth}r(h]h]h]h]h]uhljh]rhXprojectrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX$the project this change is a part ofrr}r(hkX$the project this change is a part ofhljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXuidh}r(h]h]h]h]h]uhljh]rhXuidrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXintegerrU refdomainjh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXintegerrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX#uid generated for the change authorrr }r (hkX#uid generated for the change authorhljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r }r (hkUh}r (h]h]h]h]h]uhlj h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhlj h]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhlj h]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXnew change's ID via Deferredrr}r (hkXnew change's ID via Deferredhljubah~hubah~jubeh~jubeubh)r!}r"(hkXAdd a Change with the given attributes to the database, returning the changeid via a Deferred. All arguments should be given as keyword arguments.r#hljhthwh~hh}r$(h]h]h]h]h]uhMhhh]r%hXAdd a Change with the given attributes to the database, returning the changeid via a Deferred. All arguments should be given as keyword arguments.r&r'}r((hkj#hlj!ubaubh)r)}r*(hkXVThe ``project`` and ``repository`` arguments must be strings; ``None`` is not allowed.hljhthwh~hh}r+(h]h]h]h]h]uhMhhh]r,(hXThe r-r.}r/(hkXThe hlj)ubh)r0}r1(hkX ``project``h}r2(h]h]h]h]h]uhlj)h]r3hXprojectr4r5}r6(hkUhlj0ubah~hubhX and r7r8}r9(hkX and hlj)ubh)r:}r;(hkX``repository``h}r<(h]h]h]h]h]uhlj)h]r=hX repositoryr>r?}r@(hkUhlj:ubah~hubhX arguments must be strings; rArB}rC(hkX arguments must be strings; hlj)ubh)rD}rE(hkX``None``h}rF(h]h]h]h]h]uhlj)h]rGhXNonerHrI}rJ(hkUhljDubah~hubhX is not allowed.rKrL}rM(hkX is not allowed.hlj)ubeubeubeubjh)rN}rO(hkUhljhthwh~jkh}rP(h]h]h]h]h]Uentries]rQ(jnXBgetChange() (buildbot.db.changes.ChangesConnectorComponent method)h[UtrRauhNhhh]ubj)rS}rT(hkUhljhthwh~jh}rU(jjXpyrVh]h]h]h]h]jXmethodrWjjWuhNhhh]rX(j)rY}rZ(hkX#getChange(changeid, no_cache=False)hljShthwh~jh}r[(h]r\h[ajjh]h]h]h]r]h[ajX#ChangesConnectorComponent.getChangejjjuhMhhh]r^(j)r_}r`(hkX getChangehljYhthwh~jh}ra(h]h]h]h]h]uhMhhh]rbhX getChangercrd}re(hkUhlj_ubaubjA)rf}rg(hkUhljYhthwh~jDh}rh(h]h]h]h]h]uhMhhh]ri(jG)rj}rk(hkXchangeidh}rl(h]h]h]h]h]uhljfh]rmhXchangeidrnro}rp(hkUhljjubah~jOubjG)rq}rr(hkXno_cache=Falseh}rs(h]h]h]h]h]uhljfh]rthXno_cache=Falserurv}rw(hkUhljqubah~jOubeubeubj)rx}ry(hkUhljShthwh~jh}rz(h]h]h]h]h]uhMhhh]r{(jT)r|}r}(hkUhljxhthwh~jWh}r~(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhlj|h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rj)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXchangeidh}r(h]h]h]h]h]uhljh]rhXchangeidrr}r(hkUhljubah~jyubhX -- rr}r(hkUhljubhX&the id of the change instance to fetchrr}r(hkX&the id of the change instance to fetchhljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXno_cacheh}r(h]h]h]h]h]uhljh]rhXno_cacherr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXbooleanrU refdomainjVh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXbooleanrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX+bypass cache and always fetch from databaserr}r(hkX+bypass cache and always fetch from databasehljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhlj|h]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXchdict via Deferredrr}r(hkXchdict via Deferredhljubah~hubah~jubeh~jubeubh)r}r(hkXUGet a change dictionary for the given changeid, or ``None`` if no such change exists.hljxhthwh~hh}r(h]h]h]h]h]uhMhhh]r(hX3Get a change dictionary for the given changeid, or rr}r(hkX3Get a change dictionary for the given changeid, or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX if no such change exists.rr}r(hkX if no such change exists.hljubeubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXFgetChangeUids() (buildbot.db.changes.ChangesConnectorComponent method)hUtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXgetChangeUids(changeid)hljhthwh~jh}r(h]rhajjh]h]h]h]rhajX'ChangesConnectorComponent.getChangeUidsjjjuhMhhh]r(j)r}r(hkX getChangeUidshljhthwh~jh}r(h]h]h]h]h]uhMhhh]rhX getChangeUidsr r }r (hkUhljubaubjA)r }r (hkUhljhthwh~jDh}r(h]h]h]h]h]uhMhhh]rjG)r}r(hkXchangeidh}r(h]h]h]h]h]uhlj h]rhXchangeidrr}r(hkUhljubah~jOubaubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhMhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r (hkUh}r!(h]h]h]h]h]uhljh]r"(j_)r#}r$(hkUh}r%(h]h]h]h]h]uhljh]r&hX Parametersr'r(}r)(hkUhlj#ubah~jgubjh)r*}r+(hkUh}r,(h]h]h]h]h]uhljh]r-h)r.}r/(hkUh}r0(h]h]h]h]h]uhlj*h]r1(jq)r2}r3(hkXchangeidh}r4(h]h]h]h]h]uhlj.h]r5hXchangeidr6r7}r8(hkUhlj2ubah~jyubhX -- r9r:}r;(hkUhlj.ubhX&the id of the change instance to fetchr<r=}r>(hkX&the id of the change instance to fetchhlj.ubeh~hubah~jubeh~jubjZ)r?}r@(hkUh}rA(h]h]h]h]h]uhljh]rB(j_)rC}rD(hkUh}rE(h]h]h]h]h]uhlj?h]rFhXReturnsrGrH}rI(hkUhljCubah~jgubjh)rJ}rK(hkUh}rL(h]h]h]h]h]uhlj?h]rMh)rN}rO(hkUh}rP(h]h]h]h]h]uhljJh]rQhXlist of uids via DeferredrRrS}rT(hkXlist of uids via DeferredhljNubah~hubah~jubeh~jubeubh)rU}rV(hkX3Get the userids associated with the given changeid.rWhljhthwh~hh}rX(h]h]h]h]h]uhMhhh]rYhX3Get the userids associated with the given changeid.rZr[}r\(hkjWhljUubaubeubeubjh)r]}r^(hkUhljhtNh~jkh}r_(h]h]h]h]h]Uentries]r`(jnXIgetRecentChanges() (buildbot.db.changes.ChangesConnectorComponent method)hUtraauhNhhh]ubj)rb}rc(hkUhljhtNh~jh}rd(jjXpyh]h]h]h]h]jXmethodrejjeuhNhhh]rf(j)rg}rh(hkXgetRecentChanges(count)hljbhthwh~jh}ri(h]rjhajjh]h]h]h]rkhajX*ChangesConnectorComponent.getRecentChangesjjjuhM)hhh]rl(j)rm}rn(hkXgetRecentChangeshljghthwh~jh}ro(h]h]h]h]h]uhM)hhh]rphXgetRecentChangesrqrr}rs(hkUhljmubaubjA)rt}ru(hkUhljghthwh~jDh}rv(h]h]h]h]h]uhM)hhh]rwjG)rx}ry(hkXcounth}rz(h]h]h]h]h]uhljth]r{hXcountr|r}}r~(hkUhljxubah~jOubaubeubj)r}r(hkUhljbhthwh~jh}r(h]h]h]h]h]uhM)hhh]r(jT)r}r(hkUhljhtNh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXcounth}r(h]h]h]h]h]uhljh]rhXcountrr}r(hkUhljubah~jyubhX -- rr}r(hkUhljubhX%maximum number of instances to returnrr}r(hkX%maximum number of instances to returnhljubeh~hubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX6list of dictionaries via Deferred, ordered by changeidrr}r(hkX6list of dictionaries via Deferred, ordered by changeidhljubah~hubah~jubeh~jubeubh)r}r(hkXvGet a list of the ``count`` most recent changes, represented as dictionaries; returns fewer if that many do not exist.hljhthwh~hh}r(h]h]h]h]h]uhM hhh]r(hXGet a list of the rr}r(hkXGet a list of the hljubh)r}r(hkX ``count``h}r(h]h]h]h]h]uhljh]rhXcountrr}r(hkUhljubah~hubhX[ most recent changes, represented as dictionaries; returns fewer if that many do not exist.rr}r(hkX[ most recent changes, represented as dictionaries; returns fewer if that many do not exist.hljubeubh)r}r(hkXFor this function, "recent" is determined by the order of the changeids, not by ``when_timestamp``. This is most apparent in DVCS's, where the timestamp of a change may be significantly earlier than the time at which it is merged into a repository monitored by Buildbot.hljhthwh~hh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkXFor this function, "recent" is determined by the order of the changeids, not by ``when_timestamp``. This is most apparent in DVCS's, where the timestamp of a change may be significantly earlier than the time at which it is merged into a repository monitored by Buildbot.hljhthwh~hh}r(h]h]h]h]h]uhM$h]r(hXPFor this function, "recent" is determined by the order of the changeids, not by rr}r(hkXPFor this function, "recent" is determined by the order of the changeids, not by hljubh)r}r(hkX``when_timestamp``h}r(h]h]h]h]h]uhljh]rhXwhen_timestamprr}r(hkUhljubah~hubhX. This is most apparent in DVCS's, where the timestamp of a change may be significantly earlier than the time at which it is merged into a repository monitored by Buildbot.rr}r(hkX. This is most apparent in DVCS's, where the timestamp of a change may be significantly earlier than the time at which it is merged into a repository monitored by Buildbot.hljubeubaubeubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXJgetLatestChangeid() (buildbot.db.changes.ChangesConnectorComponent method)h(UtrauhNhhh]ubj)r}r(hkUhljhthwh~jh}r(jjXpyh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkXgetLatestChangeid()hljhthwh~jh}r(h]rh(ajjh]h]h]h]rh(ajX+ChangesConnectorComponent.getLatestChangeidjjjuhM/hhh]r(j)r}r(hkXgetLatestChangeidhljhthwh~jh}r(h]h]h]h]h]uhM/hhh]rhXgetLatestChangeidrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhM/hhh]ubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhM/hhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]rjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r }r (hkUh}r (h]h]h]h]h]uhljh]r hXReturnsr r}r(hkUhlj ubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXchangeid via Deferredrr}r(hkXchangeid via Deferredhljubah~hubah~jubeh~jubaubh)r}r(hkXTGet the most-recently-assigned changeid, or ``None`` if there are no changes at all.hljhthwh~hh}r(h]h]h]h]h]uhM.hhh]r(hX,Get the most-recently-assigned changeid, or rr }r!(hkX,Get the most-recently-assigned changeid, or hljubh)r"}r#(hkX``None``h}r$(h]h]h]h]h]uhljh]r%hXNoner&r'}r((hkUhlj"ubah~hubhX if there are no changes at all.r)r*}r+(hkX if there are no changes at all.hljubeubeubeubeubeubeubhm)r,}r-(hkUhljIhthwh~hh}r.(h]h]h]h]r/(Xmodule-buildbot.db.schedulersr0U schedulersr1eh]r2hXauhM2hhh]r3(h)r4}r5(hkX schedulersr6hlj,hthwh~hh}r7(h]h]h]h]h]uhM2hhh]r8hX schedulersr9r:}r;(hkj6hlj4ubaubjh)r<}r=(hkUhlj,hthwh~jkh}r>(h]h]h]h]h]Uentries]r?(jnXbuildbot.db.schedulers (module)Xmodule-buildbot.db.schedulersUtr@auhM5hhh]ubjh)rA}rB(hkUhlj,hthwh~jkh}rC(h]h]h]h]h]js]rD(juX"Schedulers; DB Connector ComponentUindex-11rEUtrFajxuhM6hhh]ubh{)rG}rH(hkUhlj,hthwh~hh}rI(h]h]h]h]rJjEah]uhM7hhh]ubjh)rK}rL(hkUhlj,htNh~jkh}rM(h]h]h]h]h]Uentries]rN(jnX>SchedulersConnectorComponent (class in buildbot.db.schedulers)hGUtrOauhNhhh]ubj)rP}rQ(hkUhlj,htNh~jh}rR(jjXpyh]h]h]h]h]jXclassrSjjSuhNhhh]rT(j)rU}rV(hkXSchedulersConnectorComponentrWhljPhthwh~jh}rX(h]rYhGajXbuildbot.db.schedulersrZh]h]h]h]r[hGajjWjUjuhMlhhh]r\(j)r]}r^(hkXclass hljUhthwh~jh}r_(h]h]h]h]h]uhMlhhh]r`hXclass rarb}rc(hkUhlj]ubaubj)rd}re(hkXbuildbot.db.schedulers.hljUhthwh~jh}rf(h]h]h]h]h]uhMlhhh]rghXbuildbot.db.schedulers.rhri}rj(hkUhljdubaubj)rk}rl(hkjWhljUhthwh~jh}rm(h]h]h]h]h]uhMlhhh]rnhXSchedulersConnectorComponentrorp}rq(hkUhljkubaubeubj)rr}rs(hkUhljPhthwh~jh}rt(h]h]h]h]h]uhMlhhh]ru(h)rv}rw(hkXyThis class manages the state of the Buildbot schedulers. This state includes classifications of as-yet un-built changes.rxhljrhthwh~hh}ry(h]h]h]h]h]uhM:hhh]rzhXyThis class manages the state of the Buildbot schedulers. This state includes classifications of as-yet un-built changes.r{r|}r}(hkjxhljvubaubh)r~}r(hkX@An instance of this class is available at ``master.db.changes``.hljrhthwh~hh}r(h]h]h]h]h]uhM=hhh]r(hX*An instance of this class is available at rr}r(hkX*An instance of this class is available at hlj~ubh)r}r(hkX``master.db.changes``h}r(h]h]h]h]h]uhlj~h]rhXmaster.db.changesrr}r(hkUhljubah~hubhX.r}r(hkX.hlj~ubeubjh)r}r(hkUhljrhthwh~jkh}r(h]h]h]h]h]js]r(jnXobjectidUindex-12rUtrajxuhM?hhh]ubh{)r}r(hkUhljrhthwh~hh}r(h]h]h]h]h]hjuhM@hhh]ubh)r}r(hkXXSchedulers are identified by a their objectid - see :py:class:`StateConnectorComponent`.hljrhthwhy}h~hh}r(h]h]h]h]rjah]uhMAhhh}rjjsh]r(hX4Schedulers are identified by a their objectid - see rr}r(hkX4Schedulers are identified by a their objectid - see hljubj')r}r(hkX#:py:class:`StateConnectorComponent`rhljhthwh~j+h}r(UreftypeXclassj-j.XStateConnectorComponentU refdomainXpyrh]h]U refexplicith]h]h]j0j1j2jWj3jZuhMAh]rh)r}r(hkjh}r(h]h]r(j9jXpy-classreh]h]h]uhljh]rhXStateConnectorComponentrr}r(hkUhljubah~hubaubhX.r}r(hkX.hljubeubjh)r}r(hkUhljrhthwh~jkh}r(h]h]h]h]h]Uentries]r(jnXNclassifyChanges() (buildbot.db.schedulers.SchedulersConnectorComponent method)hUtrauhNhhh]ubj)r}r(hkUhljrhthwh~jh}r(jjXpyrh]h]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hkX*classifyChanges(objectid, classifications)hljhthwh~jh}r(h]rhajjZh]h]h]h]rhajX,SchedulersConnectorComponent.classifyChangesjjWjuhMRhhh]r(j)r}r(hkXclassifyChangeshljhthwh~jh}r(h]h]h]h]h]uhMRhhh]rhXclassifyChangesrr}r(hkUhljubaubjA)r}r(hkUhljhthwh~jDh}r(h]h]h]h]h]uhMRhhh]r(jG)r}r(hkXobjectidh}r(h]h]h]h]h]uhljh]rhXobjectidrr}r(hkUhljubah~jOubjG)r}r(hkXclassificationsh}r(h]h]h]h]h]uhljh]rhXclassificationsrr}r(hkUhljubah~jOubeubeubj)r}r(hkUhljhthwh~jh}r(h]h]h]h]h]uhMRhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rj)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXobjectidh}r(h]h]h]h]h]uhljh]rhXobjectidrr}r(hkUhljubah~jyubhX -- rr}r(hkUhljubhX!scheduler classifying the changesrr }r (hkX!scheduler classifying the changeshljubeh~hubah~jubj)r }r (hkUh}r (h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhlj h]r(jq)r}r(hkXclassificationsh}r(h]h]h]h]h]uhljh]rhXclassificationsrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetX dictionaryr U refdomainjh]h]U refexplicith]h]h]uhljh]r!jw)r"}r#(hkj h}r$(h]h]h]h]h]uhljh]r%hX dictionaryr&r'}r((hkUhlj"ubah~jubah~j+ubhX)r)}r*(hkUhljubhX -- r+r,}r-(hkUhljubhXtmapping of changeid to boolean, where the boolean is true if the change is important, and false if it is unimportantr.r/}r0(hkXtmapping of changeid to boolean, where the boolean is true if the change is important, and false if it is unimportanthljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r1}r2(hkUh}r3(h]h]h]h]h]uhljh]r4(j_)r5}r6(hkUh}r7(h]h]h]h]h]uhlj1h]r8hXReturnsr9r:}r;(hkUhlj5ubah~jgubjh)r<}r=(hkUh}r>(h]h]h]h]h]uhlj1h]r?h)r@}rA(hkUh}rB(h]h]h]h]h]uhlj<h]rChXDeferredrDrE}rF(hkXDeferredhlj@ubah~hubah~jubeh~jubeubh)rG}rH(hkXoRecord the given classifications. This method allows a scheduler to record which changes were important and which were not immediately, even if the build based on those changes will not occur for some time (e.g., a tree stable timer). Schedulers should be careful to flush classifications once they are no longer needed, using :py:meth:`flushChangeClassifications`.hljhthwh~hh}rI(h]h]h]h]h]uhMLhhh]rJ(hXIRecord the given classifications. This method allows a scheduler to record which changes were important and which were not immediately, even if the build based on those changes will not occur for some time (e.g., a tree stable timer). Schedulers should be careful to flush classifications once they are no longer needed, using rKrL}rM(hkXIRecord the given classifications. This method allows a scheduler to record which changes were important and which were not immediately, even if the build based on those changes will not occur for some time (e.g., a tree stable timer). Schedulers should be careful to flush classifications once they are no longer needed, using hljGubj')rN}rO(hkX%:py:meth:`flushChangeClassifications`rPhljGhthwh~j+h}rQ(UreftypeXmethj-j.XflushChangeClassificationsU refdomainXpyrRh]h]U refexplicith]h]h]j0j1j2jWj3jZuhMLh]rSh)rT}rU(hkjPh}rV(h]h]rW(j9jRXpy-methrXeh]h]h]uhljNh]rYhXflushChangeClassificationsrZr[}r\(hkUhljTubah~hubaubhX.r]}r^(hkX.hljGubeubeubeubcdocutils.nodes comment r_)r`}ra(hkX_py:method: flushChangeClassifications(objectid, less_than=None) :param objectid: scheduler owning the flushed changes :param less_than: (optional) lowest changeid that should *not* be flushed :returns: Deferred Flush all scheduler_changes for the given scheduler, limiting to those with changeid less than ``less_than`` if the parameter is supplied.hljrhthwh~Ucommentrbh}rc(U xml:spacerdUpreservereh]h]h]h]h]uhM[hhh]rfhX_py:method: flushChangeClassifications(objectid, less_than=None) :param objectid: scheduler owning the flushed changes :param less_than: (optional) lowest changeid that should *not* be flushed :returns: Deferred Flush all scheduler_changes for the given scheduler, limiting to those with changeid less than ``less_than`` if the parameter is supplied.rgrh}ri(hkUhlj`ubaubjh)rj}rk(hkUhljrhthwh~jkh}rl(h]h]h]h]h]Uentries]rm(jnXWgetChangeClassifications() (buildbot.db.schedulers.SchedulersConnectorComponent method)hHUtrnauhNhhh]ubj)ro}rp(hkUhljrhthwh~jh}rq(jjXpyrrh]h]h]h]h]jXmethodrsjjsuhNhhh]rt(j)ru}rv(hkX,getChangeClassifications(objectid[, branch])hljohthwh~jh}rw(h]rxhHajjZh]h]h]h]ryhHajX5SchedulersConnectorComponent.getChangeClassificationsjjWjuhMkhhh]rz(j)r{}r|(hkXgetChangeClassificationshljuhthwh~jh}r}(h]h]h]h]h]uhMkhhh]r~hXgetChangeClassificationsrr}r(hkUhlj{ubaubjA)r}r(hkUhljuhthwh~jDh}r(h]h]h]h]h]uhMkhhh]r(jG)r}r(hkXobjectidh}r(h]h]h]h]h]uhljh]rhXobjectidrr}r(hkUhljubah~jOubj_)r}r(hkUh}r(h]h]h]h]h]uhljh]rjG)r}r(hkXbranchh}r(h]h]h]h]h]uhljh]rhXbranchrr}r(hkUhljubah~jOubah~jkubeubeubj)r}r(hkUhljohthwh~jh}r(h]h]h]h]h]uhMkhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rj)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXobjectidh}r(h]h]h]h]h]uhljh]rhXobjectidrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXintegerrU refdomainjrh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXintegerrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX scheduler to look up changes forrr}r(hkX scheduler to look up changes forhljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXbranchh}r(h]h]h]h]h]uhljh]rhXbranchrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetX#string or None (for default branch)rU refdomainjrh]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhX#string or None (for default branch)rr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubhX,(optional) limit to changes with this branchrr}r(hkX,(optional) limit to changes with this branchhljubeh~hubah~jubeh~jubah~jubeh~jubjZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhXReturnsrr}r (hkUhljubah~jgubjh)r }r (hkUh}r (h]h]h]h]h]uhljh]r h)r}r(hkUh}r(h]h]h]h]h]uhlj h]rhXdictionary via Deferredrr}r(hkXdictionary via Deferredhljubah~hubah~jubeh~jubeubh)r}r(hkXReturn the classifications made by this scheduler, in the form of a dictionary mapping changeid to a boolean, just as supplied to :py:meth:`classifyChanges`.hljhthwh~hh}r(h]h]h]h]h]uhMdhhh]r(hXReturn the classifications made by this scheduler, in the form of a dictionary mapping changeid to a boolean, just as supplied to rr}r(hkXReturn the classifications made by this scheduler, in the form of a dictionary mapping changeid to a boolean, just as supplied to hljubj')r}r(hkX:py:meth:`classifyChanges`rhljhthwh~j+h}r(UreftypeXmethj-j.XclassifyChangesU refdomainXpyr h]h]U refexplicith]h]h]j0j1j2jWj3jZuhMdh]r!h)r"}r#(hkjh}r$(h]h]r%(j9j Xpy-methr&eh]h]h]uhljh]r'hXclassifyChangesr(r)}r*(hkUhlj"ubah~hubaubhX.r+}r,(hkX.hljubeubh)r-}r.(hkXIf ``branch`` is specified, then only changes on that branch will be given. Note that specifying ``branch=None`` requests changes for the default branch, and is not the same as omitting the ``branch`` argument altogether.hljhthwh~hh}r/(h]h]h]h]h]uhMhhhh]r0(hXIf r1r2}r3(hkXIf hlj-ubh)r4}r5(hkX ``branch``h}r6(h]h]h]h]h]uhlj-h]r7hXbranchr8r9}r:(hkUhlj4ubah~hubhXU is specified, then only changes on that branch will be given. Note that specifying r;r<}r=(hkXU is specified, then only changes on that branch will be given. Note that specifying hlj-ubh)r>}r?(hkX``branch=None``h}r@(h]h]h]h]h]uhlj-h]rAhX branch=NonerBrC}rD(hkUhlj>ubah~hubhXN requests changes for the default branch, and is not the same as omitting the rErF}rG(hkXN requests changes for the default branch, and is not the same as omitting the hlj-ubh)rH}rI(hkX ``branch``h}rJ(h]h]h]h]h]uhlj-h]rKhXbranchrLrM}rN(hkUhljHubah~hubhX argument altogether.rOrP}rQ(hkX argument altogether.hlj-ubeubeubeubeubeubeubhm)rR}rS(hkUhljIhthwh~hh}rT(h]h]h]h]rU(Xmodule-buildbot.db.sourcestampsrVU sourcestampsrWeh]rXhBauhMnhhh]rY(h)rZ}r[(hkX sourcestampsr\hljRhthwh~hh}r](h]h]h]h]h]uhMnhhh]r^hX sourcestampsr_r`}ra(hkj\hljZubaubjh)rb}rc(hkUhljRhthwh~jkh}rd(h]h]h]h]h]Uentries]re(jnX!buildbot.db.sourcestamps (module)Xmodule-buildbot.db.sourcestampsUtrfauhMqhhh]ubjh)rg}rh(hkUhljRhthwh~jkh}ri(h]h]h]h]h]js]rj(juX$SourceStamps; DB Connector ComponentUindex-13rkUtrlajxuhMrhhh]ubh{)rm}rn(hkUhljRhthwh~hh}ro(h]h]h]h]rpjkah]uhMshhh]ubjh)rq}rr(hkUhljRhtNh~jkh}rs(h]h]h]h]h]Uentries]rt(jnXBSourceStampsConnectorComponent (class in buildbot.db.sourcestamps)h+UtruauhNhhh]ubj)rv}rw(hkUhljRhtNh~jh}rx(jjXpyh]h]h]h]h]jXclassryjjyuhNhhh]rz(j)r{}r|(hkXSourceStampsConnectorComponentr}hljvhthwh~jh}r~(h]rh+ajXbuildbot.db.sourcestampsrh]h]h]h]rh+ajj}jUjuhMhhh]r(j)r}r(hkXclass hlj{hthwh~jh}r(h]h]h]h]h]uhMhhh]rhXclass rr}r(hkUhljubaubj)r}r(hkXbuildbot.db.sourcestamps.hlj{hthwh~jh}r(h]h]h]h]h]uhMhhh]rhXbuildbot.db.sourcestamps.rr}r(hkUhljubaubj)r}r(hkj}hlj{hthwh~jh}r(h]h]h]h]h]uhMhhh]rhXSourceStampsConnectorComponentrr}r(hkUhljubaubeubj)r}r(hkUhljvhthwh~jh}r(h]h]h]h]h]uhMhhh]r(h)r}r(hkXThis class manages source stamps, as stored in the database. Source stamps are linked to changes. Source stamps with the same sourcestampsetid belong to the same sourcestampset. Buildsets link to one or more source stamps via a sourcestampset id.rhljhthwh~hh}r(h]h]h]h]h]uhMvhhh]rhXThis class manages source stamps, as stored in the database. Source stamps are linked to changes. Source stamps with the same sourcestampsetid belong to the same sourcestampset. Buildsets link to one or more source stamps via a sourcestampset id.rr}r(hkjhljubaubh)r}r(hkXEAn instance of this class is available at ``master.db.sourcestamps``.hljhthwh~hh}r(h]h]h]h]h]uhM{hhh]r(hX*An instance of this class is available at rr}r(hkX*An instance of this class is available at hljubh)r}r(hkX``master.db.sourcestamps``h}r(h]h]h]h]h]uhljh]rhXmaster.db.sourcestampsrr}r(hkUhljubah~hubhX.r}r(hkX.hljubeubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]js]r((jnXssidUindex-14rUtr(jnXssdictjUtrejxuhM}hhh]ubh{)r}r(hkUhljhthwh~hh}r(h]h]h]h]h]hjuhM~hhh]ubh)r}r(hkX]Source stamps are identified by a *ssid*, and represented internally as a *ssdict*, with keyshljhthwhy}h~hh}r(h]h]h]h]rjah]uhMhhh}rjjsh]r(hX"Source stamps are identified by a rr}r(hkX"Source stamps are identified by a hljubjw)r}r(hkX*ssid*h}r(h]h]h]h]h]uhljh]rhXssidrr}r(hkUhljubah~jubhX", and represented internally as a rr}r(hkX", and represented internally as a hljubjw)r}r(hkX*ssdict*h}r(h]h]h]h]h]uhljh]rhXssdictrr}r(hkUhljubah~jubhX , with keysrr}r(hkX , with keyshljubeubj)r}r(hkUhljhthwh~jh}r(jX*h]h]h]h]h]uhMhhh]r(j)r}r(hkX``ssid``rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]rh)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXssidrr}r(hkUhljubah~hubaubaubj)r}r(hkX;``sourcestampsetid`` (set to which the sourcestamp belongs)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX``sourcestampsetid``h}r(h]h]h]h]h]uhljh]rhXsourcestampsetidrr}r(hkUhljubah~hubhX' (set to which the sourcestamp belongs)rr}r(hkX' (set to which the sourcestamp belongs)hljubeubaubj)r}r(hkX3``branch`` (branch, or ``None`` for default branch)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r (h]h]h]h]h]uhMh]r (h)r }r (hkX ``branch``h}r (h]h]h]h]h]uhljh]rhXbranchrr}r(hkUhlj ubah~hubhX (branch, or rr}r(hkX (branch, or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX for default branch)rr}r(hkX for default branch)hljubeubaubj)r}r (hkXs``revision`` (revision, or ``None`` to indicate the latest revision, in which case this is a relative source stamp)hljhthwh~jh}r!(h]h]h]h]h]uhNhhh]r"h)r#}r$(hkXs``revision`` (revision, or ``None`` to indicate the latest revision, in which case this is a relative source stamp)hljhthwh~hh}r%(h]h]h]h]h]uhMh]r&(h)r'}r((hkX ``revision``h}r)(h]h]h]h]h]uhlj#h]r*hXrevisionr+r,}r-(hkUhlj'ubah~hubhX (revision, or r.r/}r0(hkX (revision, or hlj#ubh)r1}r2(hkX``None``h}r3(h]h]h]h]h]uhlj#h]r4hXNoner5r6}r7(hkUhlj1ubah~hubhXP to indicate the latest revision, in which case this is a relative source stamp)r8r9}r:(hkXP to indicate the latest revision, in which case this is a relative source stamp)hlj#ubeubaubj)r;}r<(hkX/``patch_body`` (body of the patch, or ``None``)r=hljhthwh~jh}r>(h]h]h]h]h]uhNhhh]r?h)r@}rA(hkj=hlj;hthwh~hh}rB(h]h]h]h]h]uhMh]rC(h)rD}rE(hkX``patch_body``h}rF(h]h]h]h]h]uhlj@h]rGhX patch_bodyrHrI}rJ(hkUhljDubah~hubhX (body of the patch, or rKrL}rM(hkX (body of the patch, or hlj@ubh)rN}rO(hkX``None``h}rP(h]h]h]h]h]uhlj@h]rQhXNonerRrS}rT(hkUhljNubah~hubhX)rU}rV(hkX)hlj@ubeubaubj)rW}rX(hkXE``patch_level`` (directory stripping level of the patch, or ``None``)rYhljhthwh~jh}rZ(h]h]h]h]h]uhNhhh]r[h)r\}r](hkjYhljWhthwh~hh}r^(h]h]h]h]h]uhMh]r_(h)r`}ra(hkX``patch_level``h}rb(h]h]h]h]h]uhlj\h]rchX patch_levelrdre}rf(hkUhlj`ubah~hubhX- (directory stripping level of the patch, or rgrh}ri(hkX- (directory stripping level of the patch, or hlj\ubh)rj}rk(hkX``None``h}rl(h]h]h]h]h]uhlj\h]rmhXNonernro}rp(hkUhljjubah~hubhX)rq}rr(hkX)hlj\ubeubaubj)rs}rt(hkXH``patch_subdir`` (subdirectory in which to apply the patch, or ``None``)ruhljhthwh~jh}rv(h]h]h]h]h]uhNhhh]rwh)rx}ry(hkjuhljshthwh~hh}rz(h]h]h]h]h]uhMh]r{(h)r|}r}(hkX``patch_subdir``h}r~(h]h]h]h]h]uhljxh]rhX patch_subdirrr}r(hkUhlj|ubah~hubhX/ (subdirectory in which to apply the patch, or rr}r(hkX/ (subdirectory in which to apply the patch, or hljxubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljxh]rhXNonerr}r(hkUhljubah~hubhX)r}r(hkX)hljxubeubaubj)r}r(hkX3``patch_author`` (author of the patch, or ``None``)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX``patch_author``h}r(h]h]h]h]h]uhljh]rhX patch_authorrr}r(hkUhljubah~hubhX (author of the patch, or rr}r(hkX (author of the patch, or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX)r}r(hkX)hljubeubaubj)r}r(hkX6``patch_comment`` (comment for the patch, or ``None``)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX``patch_comment``h}r(h]h]h]h]h]uhljh]rhX patch_commentrr}r(hkUhljubah~hubhX (comment for the patch, or rr}r(hkX (comment for the patch, or hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX)r}r(hkX)hljubeubaubj)r}r(hkXA``repository`` (repository containing the source; never ``None``)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX``repository``h}r(h]h]h]h]h]uhljh]rhX repositoryrr}r(hkUhljubah~hubhX* (repository containing the source; never rr}r(hkX* (repository containing the source; never hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX)r}r(hkX)hljubeubaubj)r}r(hkX8``project`` (project this source is for; never ``None``)rhljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkjhljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``project``h}r(h]h]h]h]h]uhljh]rhXprojectrr}r(hkUhljubah~hubhX$ (project this source is for; never rr}r(hkX$ (project this source is for; never hljubh)r}r(hkX``None``h}r(h]h]h]h]h]uhljh]rhXNonerr}r(hkUhljubah~hubhX)r}r(hkX)hljubeubaubj)r}r(hkXH``changeids`` (list of changes, by id, that generated this sourcestamp) hljhthwh~jh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkXG``changeids`` (list of changes, by id, that generated this sourcestamp)hljhthwh~hh}r(h]h]h]h]h]uhMh]r(h)r}r(hkX ``changeids``h}r (h]h]h]h]h]uhljh]r hX changeidsr r }r (hkUhljubah~hubhX: (list of changes, by id, that generated this sourcestamp)rr}r(hkX: (list of changes, by id, that generated this sourcestamp)hljubeubaubeubh)r}r(hkXPresently, no attempt is made to ensure uniqueness of source stamps, so multiple ssids may correspond to the same source stamp. This may be fixed in a future version.hljhthwh~hh}r(h]h]h]h]h]uhNhhh]rh)r}r(hkXPresently, no attempt is made to ensure uniqueness of source stamps, so multiple ssids may correspond to the same source stamp. This may be fixed in a future version.rhljhthwh~hh}r(h]h]h]h]h]uhMh]rhXPresently, no attempt is made to ensure uniqueness of source stamps, so multiple ssids may correspond to the same source stamp. This may be fixed in a future version.rr}r(hkjhljubaubaubjh)r}r(hkUhljhthwh~jkh}r(h]h]h]h]h]Uentries]r (jnXQaddSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)h^Utr!auhNhhh]ubj)r"}r#(hkUhljhthwh~jh}r$(jjXpyr%h]h]h]h]h]jXmethodr&jj&uhNhhh]r'(j)r(}r)(hkXaddSourceStamp(branch, revision, repository, project, patch_body=None, patch_level=0, patch_author="", patch_comment="", patch_subdir=None, changeids=[])hlj"hthwh~jh}r*(h]r+h^ajjh]h]h]h]r,h^ajX-SourceStampsConnectorComponent.addSourceStampjj}juhMhhh]r-(j)r.}r/(hkXaddSourceStamphlj(hthwh~jh}r0(h]h]h]h]h]uhMhhh]r1hXaddSourceStampr2r3}r4(hkUhlj.ubaubjA)r5}r6(hkUhlj(hthwh~jDh}r7(h]h]h]h]h]uhMhhh]r8(jG)r9}r:(hkXbranchh}r;(h]h]h]h]h]uhlj5h]r<hXbranchr=r>}r?(hkUhlj9ubah~jOubjG)r@}rA(hkXrevisionh}rB(h]h]h]h]h]uhlj5h]rChXrevisionrDrE}rF(hkUhlj@ubah~jOubjG)rG}rH(hkX repositoryh}rI(h]h]h]h]h]uhlj5h]rJhX repositoryrKrL}rM(hkUhljGubah~jOubjG)rN}rO(hkXprojecth}rP(h]h]h]h]h]uhlj5h]rQhXprojectrRrS}rT(hkUhljNubah~jOubjG)rU}rV(hkXpatch_body=Noneh}rW(h]h]h]h]h]uhlj5h]rXhXpatch_body=NonerYrZ}r[(hkUhljUubah~jOubjG)r\}r](hkX patch_level=0h}r^(h]h]h]h]h]uhlj5h]r_hX patch_level=0r`ra}rb(hkUhlj\ubah~jOubjG)rc}rd(hkXpatch_author=""h}re(h]h]h]h]h]uhlj5h]rfhXpatch_author=""rgrh}ri(hkUhljcubah~jOubjG)rj}rk(hkXpatch_comment=""h}rl(h]h]h]h]h]uhlj5h]rmhXpatch_comment=""rnro}rp(hkUhljjubah~jOubjG)rq}rr(hkXpatch_subdir=Noneh}rs(h]h]h]h]h]uhlj5h]rthXpatch_subdir=Nonerurv}rw(hkUhljqubah~jOubjG)rx}ry(hkX changeids=h}rz(h]h]h]h]h]uhlj5h]r{hX changeids=r|r}}r~(hkUhljxubah~jOubj_)r}r(hkUh}r(h]h]h]h]h]uhlj5h]h~jkubeubeubj)r}r(hkUhlj"hthwh~jh}r(h]h]h]h]h]uhMhhh]r(jT)r}r(hkUhljhthwh~jWh}r(h]h]h]h]h]uhNhhh]r(jZ)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j_)r}r(hkUh}r(h]h]h]h]h]uhljh]rhX Parametersrr}r(hkUhljubah~jgubjh)r}r(hkUh}r(h]h]h]h]h]uhljh]rj)r}r(hkUh}r(h]h]h]h]h]uhljh]r(j)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXbranchh}r(h]h]h]h]h]uhljh]rhXbranchrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainj%h]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkXrevisionh}r(h]h]h]h]h]uhljh]rhXrevisionrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainj%h]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r(hkUhljubah~jubah~j+ubhX)r}r(hkUhljubhX -- rr}r(hkUhljubeh~hubah~jubj)r}r(hkUh}r(h]h]h]h]h]uhljh]rh)r}r(hkUh}r(h]h]h]h]h]uhljh]r(jq)r}r(hkX repositoryh}r(h]h]h]h]h]uhljh]rhX repositoryrr}r(hkUhljubah~jyubhX (rr}r(hkUhljubj')r}r(hkUh}r(Ureftypej)U reftargetXunicode stringrU refdomainj%h]h]U refexplicith]h]h]uhljh]rjw)r}r(hkjh}r(h]h]h]h]h]uhljh]rhXunicode stringrr}r (hkUhljubah~jubah~j+ubhX)r }r (hkUhljubhX -- r r }r (hkUhljubeh~hubah~jubj)r }r (hkUh}r (h]h]h]h]h]uhljh]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkXprojecth}r (h]h]h]h]h]uhlj h]r hXprojectr r }r (hkUhlj ubah~jyubhX (r r }r (hkUhlj ubj')r }r (hkUh}r (Ureftypej)U reftargetXstringr U refdomainj%h]h]U refexplicith]h]h]uhlj h]r jw)r }r (hkj h}r (h]h]h]h]h]uhlj h]r hXstringr! r" }r# (hkUhlj ubah~jubah~j+ubhX)r$ }r% (hkUhlj ubhX -- r& r' }r( (hkUhlj ubeh~hubah~jubj)r) }r* (hkUh}r+ (h]h]h]h]h]uhljh]r, h)r- }r. (hkUh}r/ (h]h]h]h]h]uhlj) h]r0 (jq)r1 }r2 (hkX patch_bodyh}r3 (h]h]h]h]h]uhlj- h]r4 hX patch_bodyr5 r6 }r7 (hkUhlj1 ubah~jyubhX (r8 r9 }r: (hkUhlj- ubj')r; }r< (hkUh}r= (Ureftypej)U reftargetXstringr> U refdomainj%h]h]U refexplicith]h]h]uhlj- h]r? jw)r@ }rA (hkj> h}rB (h]h]h]h]h]uhlj; h]rC hXstringrD rE }rF (hkUhlj@ ubah~jubah~j+ubhX)rG }rH (hkUhlj- ubhX -- rI rJ }rK (hkUhlj- ubhX (optional)rL rM }rN (hkX (optional)hlj- ubeh~hubah~jubj)rO }rP (hkUh}rQ (h]h]h]h]h]uhljh]rR h)rS }rT (hkUh}rU (h]h]h]h]h]uhljO h]rV (jq)rW }rX (hkX patch_levelh}rY (h]h]h]h]h]uhljS h]rZ hX patch_levelr[ r\ }r] (hkUhljW ubah~jyubhX (r^ r_ }r` (hkUhljS ubj')ra }rb (hkUh}rc (Ureftypej)U reftargetXintrd U refdomainj%h]h]U refexplicith]h]h]uhljS h]re jw)rf }rg (hkjd h}rh (h]h]h]h]h]uhlja h]ri hXintrj rk }rl (hkUhljf ubah~jubah~j+ubhX)rm }rn (hkUhljS ubhX -- ro rp }rq (hkUhljS ubhX (optional)rr rs }rt (hkX (optional)hljS ubeh~hubah~jubj)ru }rv (hkUh}rw (h]h]h]h]h]uhljh]rx h)ry }rz (hkUh}r{ (h]h]h]h]h]uhlju h]r| (jq)r} }r~ (hkX patch_authorh}r (h]h]h]h]h]uhljy h]r hX patch_authorr r }r (hkUhlj} ubah~jyubhX (r r }r (hkUhljy ubj')r }r (hkUh}r (Ureftypej)U reftargetXunicode stringr U refdomainj%h]h]U refexplicith]h]h]uhljy h]r jw)r }r (hkj h}r (h]h]h]h]h]uhlj h]r hXunicode stringr r }r (hkUhlj ubah~jubah~j+ubhX)r }r (hkUhljy ubhX -- r r }r (hkUhljy ubhX (optional)r r }r (hkX (optional)hljy ubeh~hubah~jubj)r }r (hkUh}r (h]h]h]h]h]uhljh]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkX patch_commenth}r (h]h]h]h]h]uhlj h]r hX patch_commentr r }r (hkUhlj ubah~jyubhX (r r }r (hkUhlj ubj')r }r (hkUh}r (Ureftypej)U reftargetXunicode stringr U refdomainj%h]h]U refexplicith]h]h]uhlj h]r jw)r }r (hkj h}r (h]h]h]h]h]uhlj h]r hXunicode stringr r }r (hkUhlj ubah~jubah~j+ubhX)r }r (hkUhlj ubhX -- r r }r (hkUhlj ubhX (optional)r r }r (hkX (optional)hlj ubeh~hubah~jubj)r }r (hkUh}r (h]h]h]h]h]uhljh]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkX patch_subdirh}r (h]h]h]h]h]uhlj h]r hX patch_subdirr r }r (hkUhlj ubah~jyubhX (r r }r (hkUhlj ubj')r }r (hkUh}r (Ureftypej)U reftargetXunicode stringr U refdomainj%h]h]U refexplicith]h]h]uhlj h]r jw)r }r (hkj h}r (h]h]h]h]h]uhlj h]r hXunicode stringr r }r (hkUhlj ubah~jubah~j+ubhX)r }r (hkUhlj ubhX -- r r }r (hkUhlj ubhX (optional)r r }r (hkX (optional)hlj ubeh~hubah~jubj)r }r (hkUh}r (h]h]h]h]h]uhljh]r h)r }r (hkUh}r (h]h]h]h]h]uhlj h]r (jq)r }r (hkX changeidsh}r (h]h]h]h]h]uhlj h]r hX changeidsr r }r (hkUhlj ubah~jyubhX (r r }r (hkUhlj ubj')r }r (hkUh}r (Ureftypej)U reftargetX list of intsr U refdomainj%h]h]U refexplicith]h]h]uhlj h]r jw)r }r (hkj h}r!(h]h]h]h]h]uhlj h]r!hX list of intsr!r!}r!(hkUhlj ubah~jubah~j+ubhX)r!}r!(hkUhlj ubhX -- r!r!}r !(hkUhlj ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r !}r !(hkUh}r !(h]h]h]h]h]uhljh]r !(j_)r!}r!(hkUh}r!(h]h]h]h]h]uhlj !h]r!hXReturnsr!r!}r!(hkUhlj!ubah~jgubjh)r!}r!(hkUh}r!(h]h]h]h]h]uhlj !h]r!h)r!}r!(hkUh}r!(h]h]h]h]h]uhlj!h]r!hXssid, via Deferredr!r!}r!(hkXssid, via Deferredhlj!ubah~hubah~jubeh~jubeubh)r !}r!!(hkXCreate a new SourceStamp instance with the given attributes, and return its ssid. The arguments all have the same meaning as in an ssdict. Pass them as keyword arguments to allow for future expansion.r"!hljhthwh~hh}r#!(h]h]h]h]h]uhMhhh]r$!hXCreate a new SourceStamp instance with the given attributes, and return its ssid. The arguments all have the same meaning as in an ssdict. Pass them as keyword arguments to allow for future expansion.r%!r&!}r'!(hkj"!hlj !ubaubeubeubjh)r(!}r)!(hkUhljhthwh~jkh}r*!(h]h]h]h]h]Uentries]r+!(jnXQgetSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)hCUtr,!auhNhhh]ubj)r-!}r.!(hkUhljhthwh~jh}r/!(jjXpyr0!h]h]h]h]h]jXmethodr1!jj1!uhNhhh]r2!(j)r3!}r4!(hkXgetSourceStamp(ssid)hlj-!hthwh~jh}r5!(h]r6!hCajjh]h]h]h]r7!hCajX-SourceStampsConnectorComponent.getSourceStampjj}juhMhhh]r8!(j)r9!}r:!(hkXgetSourceStamphlj3!hthwh~jh}r;!(h]h]h]h]h]uhMhhh]r!}r?!(hkUhlj9!ubaubjA)r@!}rA!(hkUhlj3!hthwh~jDh}rB!(h]h]h]h]h]uhMhhh]rC!jG)rD!}rE!(hkXssidh}rF!(h]h]h]h]h]uhlj@!h]rG!hXssidrH!rI!}rJ!(hkUhljD!ubah~jOubaubeubj)rK!}rL!(hkUhlj-!hthwh~jh}rM!(h]h]h]h]h]uhMhhh]rN!(jT)rO!}rP!(hkUhljK!hthwh~jWh}rQ!(h]h]h]h]h]uhNhhh]rR!(jZ)rS!}rT!(hkUh}rU!(h]h]h]h]h]uhljO!h]rV!(j_)rW!}rX!(hkUh}rY!(h]h]h]h]h]uhljS!h]rZ!hX Parametersr[!r\!}r]!(hkUhljW!ubah~jgubjh)r^!}r_!(hkUh}r`!(h]h]h]h]h]uhljS!h]ra!j)rb!}rc!(hkUh}rd!(h]h]h]h]h]uhlj^!h]re!(j)rf!}rg!(hkUh}rh!(h]h]h]h]h]uhljb!h]ri!h)rj!}rk!(hkUh}rl!(h]h]h]h]h]uhljf!h]rm!(jq)rn!}ro!(hkXssidh}rp!(h]h]h]h]h]uhljj!h]rq!hXssidrr!rs!}rt!(hkUhljn!ubah~jyubhX -- ru!rv!}rw!(hkUhljj!ubhXsourcestamp to getrx!ry!}rz!(hkXsourcestamp to gethljj!ubeh~hubah~jubj)r{!}r|!(hkUh}r}!(h]h]h]h]h]uhljb!h]r~!h)r!}r!(hkUh}r!(h]h]h]h]h]uhlj{!h]r!(jq)r!}r!(hkXno_cacheh}r!(h]h]h]h]h]uhlj!h]r!hXno_cacher!r!}r!(hkUhlj!ubah~jyubhX (r!r!}r!(hkUhlj!ubj')r!}r!(hkUh}r!(Ureftypej)U reftargetXbooleanr!U refdomainj0!h]h]U refexplicith]h]h]uhlj!h]r!jw)r!}r!(hkj!h}r!(h]h]h]h]h]uhlj!h]r!hXbooleanr!r!}r!(hkUhlj!ubah~jubah~j+ubhX)r!}r!(hkUhlj!ubhX -- r!r!}r!(hkUhlj!ubhX+bypass cache and always fetch from databaser!r!}r!(hkX+bypass cache and always fetch from databasehlj!ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r!}r!(hkUh}r!(h]h]h]h]h]uhljO!h]r!(j_)r!}r!(hkUh}r!(h]h]h]h]h]uhlj!h]r!hXReturnsr!r!}r!(hkUhlj!ubah~jgubjh)r!}r!(hkUh}r!(h]h]h]h]h]uhlj!h]r!h)r!}r!(hkUh}r!(h]h]h]h]h]uhlj!h]r!(hX ssdict, or r!r!}r!(hkX ssdict, or hlj!ubh)r!}r!(hkX``None``h}r!(h]h]h]h]h]uhlj!h]r!hXNoner!r!}r!(hkUhlj!ubah~hubhX, via Deferredr!r!}r!(hkX, via Deferredhlj!ubeh~hubah~jubeh~jubeubh)r!}r!(hkX^Get an ssdict representing the given source stamp, or ``None`` if no such source stamp exists.hljK!hthwh~hh}r!(h]h]h]h]h]uhMhhh]r!(hX6Get an ssdict representing the given source stamp, or r!r!}r!(hkX6Get an ssdict representing the given source stamp, or hlj!ubh)r!}r!(hkX``None``h}r!(h]h]h]h]h]uhlj!h]r!hXNoner!r!}r!(hkUhlj!ubah~hubhX if no such source stamp exists.r!r!}r!(hkX if no such source stamp exists.hlj!ubeubeubeubjh)r!}r!(hkUhljhthwh~jkh}r!(h]h]h]h]h]Uentries]r!(jnXRgetSourceStamps() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)hMUtr!auhNhhh]ubj)r!}r!(hkUhljhthwh~jh}r!(jjXpyr!h]h]h]h]h]jXmethodr!jj!uhNhhh]r!(j)r!}r!(hkX!getSourceStamps(sourcestampsetid)hlj!hthwh~jh}r!(h]r!hMajjh]h]h]h]r!hMajX.SourceStampsConnectorComponent.getSourceStampsjj}juhMhhh]r!(j)r!}r!(hkXgetSourceStampshlj!hthwh~jh}r!(h]h]h]h]h]uhMhhh]r!hXgetSourceStampsr!r!}r!(hkUhlj!ubaubjA)r!}r!(hkUhlj!hthwh~jDh}r!(h]h]h]h]h]uhMhhh]r!jG)r!}r!(hkXsourcestampsetidh}r!(h]h]h]h]h]uhlj!h]r!hXsourcestampsetidr!r!}r!(hkUhlj!ubah~jOubaubeubj)r!}r!(hkUhlj!hthwh~jh}r!(h]h]h]h]h]uhMhhh]r!(jT)r!}r!(hkUhlj!hthwh~jWh}r!(h]h]h]h]h]uhNhhh]r!(jZ)r!}r!(hkUh}r!(h]h]h]h]h]uhlj!h]r"(j_)r"}r"(hkUh}r"(h]h]h]h]h]uhlj!h]r"hX Parametersr"r"}r"(hkUhlj"ubah~jgubjh)r"}r "(hkUh}r "(h]h]h]h]h]uhlj!h]r "h)r "}r "(hkUh}r"(h]h]h]h]h]uhlj"h]r"(jq)r"}r"(hkXsourcestampsetidh}r"(h]h]h]h]h]uhlj "h]r"hXsourcestampsetidr"r"}r"(hkUhlj"ubah~jyubhX (r"r"}r"(hkUhlj "ubj')r"}r"(hkUh}r"(Ureftypej)U reftargetXintegerr"U refdomainj!h]h]U refexplicith]h]h]uhlj "h]r"jw)r"}r "(hkj"h}r!"(h]h]h]h]h]uhlj"h]r""hXintegerr#"r$"}r%"(hkUhlj"ubah~jubah~j+ubhX)r&"}r'"(hkUhlj "ubhX -- r("r)"}r*"(hkUhlj "ubhXGidentification of the set, all returned sourcestamps belong to this setr+"r,"}r-"(hkXGidentification of the set, all returned sourcestamps belong to this sethlj "ubeh~hubah~jubeh~jubjZ)r."}r/"(hkUh}r0"(h]h]h]h]h]uhlj!h]r1"(j_)r2"}r3"(hkUh}r4"(h]h]h]h]h]uhlj."h]r5"hXReturnsr6"r7"}r8"(hkUhlj2"ubah~jgubjh)r9"}r:"(hkUh}r;"(h]h]h]h]h]uhlj."h]r<"h)r="}r>"(hkUh}r?"(h]h]h]h]h]uhlj9"h]r@"hXsslist of ssdictrA"rB"}rC"(hkXsslist of ssdicthlj="ubah~hubah~jubeh~jubeubh)rD"}rE"(hkXGet a set of sourcestamps identified by a set id. The set is returned as a sslist that contains one or more sourcestamps (represented as ssdicts). The list is empty if the set does not exist or no sourcestamps belong to the set.rF"hlj!hthwh~hh}rG"(h]h]h]h]h]uhMhhh]rH"hXGet a set of sourcestamps identified by a set id. The set is returned as a sslist that contains one or more sourcestamps (represented as ssdicts). The list is empty if the set does not exist or no sourcestamps belong to the set.rI"rJ"}rK"(hkjF"hljD"ubaubeubeubeubeubeubhm)rL"}rM"(hkUhljIhthwh~hh}rN"(h]h]h]h]rO"(X"module-buildbot.db.sourcestampsetsrP"UsourcestampsetrQ"eh]rR"h&auhMhhh]rS"(h)rT"}rU"(hkXsourcestampsetrV"hljL"hthwh~hh}rW"(h]h]h]h]h]uhMhhh]rX"hXsourcestampsetrY"rZ"}r["(hkjV"hljT"ubaubjh)r\"}r]"(hkUhljL"hthwh~jkh}r^"(h]h]h]h]h]Uentries]r_"(jnX$buildbot.db.sourcestampsets (module)X"module-buildbot.db.sourcestampsetsUtr`"auhMhhh]ubjh)ra"}rb"(hkUhljL"hthwh~jkh}rc"(h]h]h]h]h]js]rd"(juX'SourceStampSets; DB Connector ComponentUindex-15re"Utrf"ajxuhMhhh]ubh{)rg"}rh"(hkUhljL"hthwh~hh}ri"(h]h]h]h]rj"je"ah]uhMhhh]ubjh)rk"}rl"(hkUhljL"htNh~jkh}rm"(h]h]h]h]h]Uentries]rn"(jnXHSourceStampSetsConnectorComponent (class in buildbot.db.sourcestampsets)hUtro"auhNhhh]ubj)rp"}rq"(hkUhljL"htNh~jh}rr"(jjXpyh]h]h]h]h]jXclassrs"jjs"uhNhhh]rt"(j)ru"}rv"(hkX!SourceStampSetsConnectorComponentrw"hljp"hthwh~jh}rx"(h]ry"hajXbuildbot.db.sourcestampsetsrz"h]h]h]h]r{"hajjw"jUjuhMhhh]r|"(j)r}"}r~"(hkXclass hlju"hthwh~jh}r"(h]h]h]h]h]uhMhhh]r"hXclass r"r"}r"(hkUhlj}"ubaubj)r"}r"(hkXbuildbot.db.sourcestampsets.hlju"hthwh~jh}r"(h]h]h]h]h]uhMhhh]r"hXbuildbot.db.sourcestampsets.r"r"}r"(hkUhlj"ubaubj)r"}r"(hkjw"hlju"hthwh~jh}r"(h]h]h]h]h]uhMhhh]r"hX!SourceStampSetsConnectorComponentr"r"}r"(hkUhlj"ubaubeubj)r"}r"(hkUhljp"hthwh~jh}r"(h]h]h]h]h]uhMhhh]r"(h)r"}r"(hkXThis class is responsible for adding new sourcestampsets to the database. Build sets link to sourcestamp sets, via their (set) id's.r"hlj"hthwh~hh}r"(h]h]h]h]h]uhMhhh]r"hXThis class is responsible for adding new sourcestampsets to the database. Build sets link to sourcestamp sets, via their (set) id's.r"r"}r"(hkj"hlj"ubaubh)r"}r"(hkXHAn instance of this class is available at ``master.db.sourcestampsets``.hlj"hthwh~hh}r"(h]h]h]h]h]uhMhhh]r"(hX*An instance of this class is available at r"r"}r"(hkX*An instance of this class is available at hlj"ubh)r"}r"(hkX``master.db.sourcestampsets``h}r"(h]h]h]h]h]uhlj"h]r"hXmaster.db.sourcestampsetsr"r"}r"(hkUhlj"ubah~hubhX.r"}r"(hkX.hlj"ubeubh)r"}r"(hkX6Sourcestamp sets are identified by a sourcestampsetid.r"hlj"hthwh~hh}r"(h]h]h]h]h]uhMhhh]r"hX6Sourcestamp sets are identified by a sourcestampsetid.r"r"}r"(hkj"hlj"ubaubjh)r"}r"(hkUhlj"hthwh~jkh}r"(h]h]h]h]h]Uentries]r"(jnXZaddSourceStampSet() (buildbot.db.sourcestampsets.SourceStampSetsConnectorComponent method)hUtr"auhNhhh]ubj)r"}r"(hkUhlj"hthwh~jh}r"(jjXpyh]h]h]h]h]jXmethodr"jj"uhNhhh]r"(j)r"}r"(hkXaddSourceStampSet()hlj"hthwh~jh}r"(h]r"hajjz"h]h]h]h]r"hajX3SourceStampSetsConnectorComponent.addSourceStampSetjjw"juhMhhh]r"(j)r"}r"(hkXaddSourceStampSethlj"hthwh~jh}r"(h]h]h]h]h]uhMhhh]r"hXaddSourceStampSetr"r"}r"(hkUhlj"ubaubjA)r"}r"(hkUhlj"hthwh~jDh}r"(h]h]h]h]h]uhMhhh]ubeubj)r"}r"(hkUhlj"hthwh~jh}r"(h]h]h]h]h]uhMhhh]r"(jT)r"}r"(hkUhlj"hthwh~jWh}r"(h]h]h]h]h]uhNhhh]r"jZ)r"}r"(hkUh}r"(h]h]h]h]h]uhlj"h]r"(j_)r"}r"(hkUh}r"(h]h]h]h]h]uhlj"h]r"hXReturnsr"r"}r"(hkUhlj"ubah~jgubjh)r"}r"(hkUh}r"(h]h]h]h]h]uhlj"h]r"h)r"}r"(hkUh}r"(h]h]h]h]h]uhlj"h]r"hX-new sourcestampsetid as integer, via Deferredr"r"}r"(hkX-new sourcestampsetid as integer, via Deferredhlj"ubah~hubah~jubeh~jubaubh)r"}r"(hkXAdd a new (empty) sourcestampset to the database. The unique identification of the set is returned as integer. The new id can be used to add new sourcestamps to the database and as reference in a buildset.r"hlj"hthwh~hh}r"(h]h]h]h]h]uhMhhh]r"hXAdd a new (empty) sourcestampset to the database. The unique identification of the set is returned as integer. The new id can be used to add new sourcestamps to the database and as reference in a buildset.r"r"}r"(hkj"hlj"ubaubeubeubeubeubeubhm)r"}r"(hkUhljIhthwh~hh}r"(h]h]h]h]r"(Xmodule-buildbot.db.stater"Ustater"eh]r"h"auhMhhh]r"(h)r"}r"(hkXstater#hlj"hthwh~hh}r#(h]h]h]h]h]uhMhhh]r#hXstater#r#}r#(hkj#hlj"ubaubjh)r#}r#(hkUhlj"hthwh~jkh}r#(h]h]h]h]h]Uentries]r #(jnXbuildbot.db.state (module)Xmodule-buildbot.db.stateUtr #auhMhhh]ubjh)r #}r #(hkUhlj"hthwh~jkh}r #(h]h]h]h]h]js]r#(juXState; DB Connector ComponentUindex-16r#Utr#ajxuhMhhh]ubh{)r#}r#(hkUhlj"hthwh~hh}r#(h]h]h]h]r#j#ah]uhMhhh]ubjh)r#}r#(hkUhlj"htNh~jkh}r#(h]h]h]h]h]Uentries]r#(jnX4StateConnectorComponent (class in buildbot.db.state)h)Utr#auhNhhh]ubj)r#}r#(hkUhlj"htNh~jh}r#(jjXpyh]h]h]h]h]jXclassr#jj#uhNhhh]r#(j)r#}r #(hkXStateConnectorComponentr!#hlj#hthwh~jh}r"#(h]r##h)ajXbuildbot.db.stater$#h]h]h]h]r%#h)ajj!#jUjuhMhhh]r&#(j)r'#}r(#(hkXclass hlj#hthwh~jh}r)#(h]h]h]h]h]uhMhhh]r*#hXclass r+#r,#}r-#(hkUhlj'#ubaubj)r.#}r/#(hkXbuildbot.db.state.hlj#hthwh~jh}r0#(h]h]h]h]h]uhMhhh]r1#hXbuildbot.db.state.r2#r3#}r4#(hkUhlj.#ubaubj)r5#}r6#(hkj!#hlj#hthwh~jh}r7#(h]h]h]h]h]uhMhhh]r8#hXStateConnectorComponentr9#r:#}r;#(hkUhlj5#ubaubeubj)r<#}r=#(hkUhlj#hthwh~jh}r>#(h]h]h]h]h]uhMhhh]r?#(h)r@#}rA#(hkXThis class handles maintaining arbitrary key/value state for Buildbot objects. Each object can store arbitrary key/value pairs, where the values are any JSON-encodable value. Each pair can be set and retrieved atomically.rB#hlj<#hthwh~hh}rC#(h]h]h]h]h]uhMhhh]rD#hXThis class handles maintaining arbitrary key/value state for Buildbot objects. Each object can store arbitrary key/value pairs, where the values are any JSON-encodable value. Each pair can be set and retrieved atomically.rE#rF#}rG#(hkjB#hlj@#ubaubh)rH#}rI#(hkX2Objects are identified by their (user-visible) name and their class. This allows, for example, a ``nightly_smoketest`` object of class ``NightlyScheduler`` to maintain its state even if it moves between masters, but avoids cross-contaminating state between different classes of objects with the same name.hlj<#hthwh~hh}rJ#(h]h]h]h]h]uhMhhh]rK#(hXbObjects are identified by their (user-visible) name and their class. This allows, for example, a rL#rM#}rN#(hkXbObjects are identified by their (user-visible) name and their class. This allows, for example, a hljH#ubh)rO#}rP#(hkX``nightly_smoketest``h}rQ#(h]h]h]h]h]uhljH#h]rR#hXnightly_smoketestrS#rT#}rU#(hkUhljO#ubah~hubhX object of class rV#rW#}rX#(hkX object of class hljH#ubh)rY#}rZ#(hkX``NightlyScheduler``h}r[#(h]h]h]h]h]uhljH#h]r\#hXNightlySchedulerr]#r^#}r_#(hkUhljY#ubah~hubhX to maintain its state even if it moves between masters, but avoids cross-contaminating state between different classes of objects with the same name.r`#ra#}rb#(hkX to maintain its state even if it moves between masters, but avoids cross-contaminating state between different classes of objects with the same name.hljH#ubeubh)rc#}rd#(hkXNote that "class" is not interpreted literally, and can be any string that will uniquely identify the class for the object; if classes are renamed, they can continue to use the old names.re#hlj<#hthwh~hh}rf#(h]h]h]h]h]uhMhhh]rg#hXNote that "class" is not interpreted literally, and can be any string that will uniquely identify the class for the object; if classes are renamed, they can continue to use the old names.rh#ri#}rj#(hkje#hljc#ubaubh)rk#}rl#(hkX>An instance of this class is available at ``master.db.state``.hlj<#hthwh~hh}rm#(h]h]h]h]h]uhMhhh]rn#(hX*An instance of this class is available at ro#rp#}rq#(hkX*An instance of this class is available at hljk#ubh)rr#}rs#(hkX``master.db.state``h}rt#(h]h]h]h]h]uhljk#h]ru#hXmaster.db.staterv#rw#}rx#(hkUhljr#ubah~hubhX.ry#}rz#(hkX.hljk#ubeubjh)r{#}r|#(hkUhlj<#hthwh~jkh}r}#(h]h]h]h]h]js]r~#((jnXobjectidUindex-17r#Utr#(jnXobjdictj#Utr#ejxuhMhhh]ubh{)r#}r#(hkUhlj<#hthwh~hh}r#(h]h]h]h]h]hj#uhMhhh]ubh)r#}r#(hkX%Objects are identified by *objectid*.hlj<#hthwhy}h~hh}r#(h]h]h]h]r#j#ah]uhMhhh}r#j#j#sh]r#(hXObjects are identified by r#r#}r#(hkXObjects are identified by hlj#ubjw)r#}r#(hkX *objectid*h}r#(h]h]h]h]h]uhlj#h]r#hXobjectidr#r#}r#(hkUhlj#ubah~jubhX.r#}r#(hkX.hlj#ubeubjh)r#}r#(hkUhlj<#hthwh~jkh}r#(h]h]h]h]h]Uentries]r#(jnX@getObjectId() (buildbot.db.state.StateConnectorComponent method)hKUtr#auhNhhh]ubj)r#}r#(hkUhlj<#hthwh~jh}r#(jjXpyh]h]h]h]h]jXmethodr#jj#uhNhhh]r#(j)r#}r#(hkXgetObjectId(name, class_name)hlj#hthwh~jh}r#(h]r#hKajj$#h]h]h]h]r#hKajX#StateConnectorComponent.getObjectIdjj!#juhMhhh]r#(j)r#}r#(hkX getObjectIdhlj#hthwh~jh}r#(h]h]h]h]h]uhMhhh]r#hX getObjectIdr#r#}r#(hkUhlj#ubaubjA)r#}r#(hkUhlj#hthwh~jDh}r#(h]h]h]h]h]uhMhhh]r#(jG)r#}r#(hkXnameh}r#(h]h]h]h]h]uhlj#h]r#hXnamer#r#}r#(hkUhlj#ubah~jOubjG)r#}r#(hkX class_nameh}r#(h]h]h]h]h]uhlj#h]r#hX class_namer#r#}r#(hkUhlj#ubah~jOubeubeubj)r#}r#(hkUhlj#hthwh~jh}r#(h]h]h]h]h]uhMhhh]r#(jT)r#}r#(hkUhlj#hthwh~jWh}r#(h]h]h]h]h]uhNhhh]r#(jZ)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#(j_)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#hX Parametersr#r#}r#(hkUhlj#ubah~jgubjh)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#j)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#(j)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#h)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#(jq)r#}r#(hkXnameh}r#(h]h]h]h]h]uhlj#h]r#hXnamer#r#}r#(hkUhlj#ubah~jyubhX -- r#r#}r#(hkUhlj#ubhXname of the objectr#r#}r#(hkXname of the objecthlj#ubeh~hubah~jubj)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#h)r#}r#(hkUh}r#(h]h]h]h]h]uhlj#h]r#(jq)r#}r#(hkX class_nameh}r#(h]h]h]h]h]uhlj#h]r#hX class_namer#r#}r#(hkUhlj#ubah~jyubhX -- r#r$}r$(hkUhlj#ubhXobject class namer$r$}r$(hkXobject class namehlj#ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r$}r$(hkUh}r$(h]h]h]h]h]uhlj#h]r$(j_)r $}r $(hkUh}r $(h]h]h]h]h]uhlj$h]r $hXReturnsr $r$}r$(hkUhlj $ubah~jgubjh)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$h)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$hXthe objectid, via a Deferred.r$r$}r$(hkXthe objectid, via a Deferred.hlj$ubah~hubah~jubeh~jubeubh)r$}r$(hkXGet the object ID for this combination of a name and a class. This will add a row to the 'objects' table if none exists already.r$hlj#hthwh~hh}r$(h]h]h]h]h]uhMhhh]r$hXGet the object ID for this combination of a name and a class. This will add a row to the 'objects' table if none exists already.r $r!$}r"$(hkj$hlj$ubaubeubeubjh)r#$}r$$(hkUhlj<#hthwh~jkh}r%$(h]h]h]h]h]Uentries]r&$(jnX=getState() (buildbot.db.state.StateConnectorComponent method)hJUtr'$auhNhhh]ubj)r($}r)$(hkUhlj<#hthwh~jh}r*$(jjXpyr+$h]h]h]h]h]jXmethodr,$jj,$uhNhhh]r-$(j)r.$}r/$(hkX#getState(objectid, name[, default])hlj($hthwh~jh}r0$(h]r1$hJajj$#h]h]h]h]r2$hJajX StateConnectorComponent.getStatejj!#juhMhhh]r3$(j)r4$}r5$(hkXgetStatehlj.$hthwh~jh}r6$(h]h]h]h]h]uhMhhh]r7$hXgetStater8$r9$}r:$(hkUhlj4$ubaubjA)r;$}r<$(hkUhlj.$hthwh~jDh}r=$(h]h]h]h]h]uhMhhh]r>$(jG)r?$}r@$(hkXobjectidh}rA$(h]h]h]h]h]uhlj;$h]rB$hXobjectidrC$rD$}rE$(hkUhlj?$ubah~jOubjG)rF$}rG$(hkXnameh}rH$(h]h]h]h]h]uhlj;$h]rI$hXnamerJ$rK$}rL$(hkUhljF$ubah~jOubj_)rM$}rN$(hkUh}rO$(h]h]h]h]h]uhlj;$h]rP$jG)rQ$}rR$(hkXdefaulth}rS$(h]h]h]h]h]uhljM$h]rT$hXdefaultrU$rV$}rW$(hkUhljQ$ubah~jOubah~jkubeubeubj)rX$}rY$(hkUhlj($hthwh~jh}rZ$(h]h]h]h]h]uhMhhh]r[$(jT)r\$}r]$(hkUhljX$hthwh~jWh}r^$(h]h]h]h]h]uhNhhh]r_$(jZ)r`$}ra$(hkUh}rb$(h]h]h]h]h]uhlj\$h]rc$(j_)rd$}re$(hkUh}rf$(h]h]h]h]h]uhlj`$h]rg$hX Parametersrh$ri$}rj$(hkUhljd$ubah~jgubjh)rk$}rl$(hkUh}rm$(h]h]h]h]h]uhlj`$h]rn$j)ro$}rp$(hkUh}rq$(h]h]h]h]h]uhljk$h]rr$(j)rs$}rt$(hkUh}ru$(h]h]h]h]h]uhljo$h]rv$h)rw$}rx$(hkUh}ry$(h]h]h]h]h]uhljs$h]rz$(jq)r{$}r|$(hkXobjectidh}r}$(h]h]h]h]h]uhljw$h]r~$hXobjectidr$r$}r$(hkUhlj{$ubah~jyubhX -- r$r$}r$(hkUhljw$ubhX-objectid on which the state should be checkedr$r$}r$(hkX-objectid on which the state should be checkedhljw$ubeh~hubah~jubj)r$}r$(hkUh}r$(h]h]h]h]h]uhljo$h]r$h)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$(jq)r$}r$(hkXnameh}r$(h]h]h]h]h]uhlj$h]r$hXnamer$r$}r$(hkUhlj$ubah~jyubhX -- r$r$}r$(hkUhlj$ubhXname of the value to retriever$r$}r$(hkXname of the value to retrievehlj$ubeh~hubah~jubj)r$}r$(hkUh}r$(h]h]h]h]h]uhljo$h]r$h)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$(jq)r$}r$(hkXdefaulth}r$(h]h]h]h]h]uhlj$h]r$hXdefaultr$r$}r$(hkUhlj$ubah~jyubhX -- r$r$}r$(hkUhlj$ubhX4(optional) value to return if C{name} is not presentr$r$}r$(hkX4(optional) value to return if C{name} is not presenthlj$ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r$}r$(hkUh}r$(h]h]h]h]h]uhlj\$h]r$(j_)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$hXReturnsr$r$}r$(hkUhlj$ubah~jgubjh)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$h)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$hXstate value via a Deferredr$r$}r$(hkXstate value via a Deferredhlj$ubah~hubah~jubeh~jubjZ)r$}r$(hkUh}r$(h]h]h]h]h]uhlj\$h]r$(j_)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$(hXRaisesr$r$}r$(hkUhlj$ubhX r$}r$(hkUhlj$ubj')r$}r$(hkUh}r$(UreftypeUexcr$U reftargetXKeyErrorr$U refdomainj+$h]h]U refexplicith]h]h]uhlj$h]r$hXKeyErrorr$r$}r$(hkj$hlj$ubah~j+ubeh~jgubjh)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$h)r$}r$(hkUh}r$(h]h]h]h]h]uhlj$h]r$(hXif r$r$}r$(hkXif hlj$ubh)r$}r$(hkX``name``h}r$(h]h]h]h]h]uhlj$h]r$hXnamer$r$}r$(hkUhlj$ubah~hubhX' is not present and no default is givenr$r$}r$(hkX' is not present and no default is givenhlj$ubeh~hubah~jubeh~jubjZ)r$}r$(hkUhlj\$hthwh~jh}r$(h]h]h]h]h]uhM hhh]r$(j_)r$}r$(hkXraisesh}r$(h]h]h]h]h]uhlj$h]r$hXRaisesr$r$}r$(hkUhlj$ubah~jgubjh)r$}r$(hkX TypeError if JSON parsing fails h}r%(h]h]h]h]h]uhlj$h]r%h)r%}r%(hkXTypeError if JSON parsing failsr%hlj$hthwh~hh}r%(h]h]h]h]h]uhM h]r%hXTypeError if JSON parsing failsr%r%}r %(hkj%hlj%ubaubah~jubeubeubh)r %}r %(hkXIGet the state value for key ``name`` for the object with id ``objectid``.hljX$hthwh~hh}r %(h]h]h]h]h]uhM hhh]r %(hXGet the state value for key r%r%}r%(hkXGet the state value for key hlj %ubh)r%}r%(hkX``name``h}r%(h]h]h]h]h]uhlj %h]r%hXnamer%r%}r%(hkUhlj%ubah~hubhX for the object with id r%r%}r%(hkX for the object with id hlj %ubh)r%}r%(hkX ``objectid``h}r%(h]h]h]h]h]uhlj %h]r%hXobjectidr%r %}r!%(hkUhlj%ubah~hubhX.r"%}r#%(hkX.hlj %ubeubeubeubjh)r$%}r%%(hkUhlj<#hthwh~jkh}r&%(h]h]h]h]h]Uentries]r'%(jnX=setState() (buildbot.db.state.StateConnectorComponent method)h`Utr(%auhNhhh]ubj)r)%}r*%(hkUhlj<#hthwh~jh}r+%(jjXpyr,%h]h]h]h]h]jXmethodr-%jj-%uhNhhh]r.%(j)r/%}r0%(hkXsetState(objectid, name, value)hlj)%hthwh~jh}r1%(h]r2%h`ajj$#h]h]h]h]r3%h`ajX StateConnectorComponent.setStatejj!#juhMhhh]r4%(j)r5%}r6%(hkXsetStatehlj/%hthwh~jh}r7%(h]h]h]h]h]uhMhhh]r8%hXsetStater9%r:%}r;%(hkUhlj5%ubaubjA)r<%}r=%(hkUhlj/%hthwh~jDh}r>%(h]h]h]h]h]uhMhhh]r?%(jG)r@%}rA%(hkXobjectidh}rB%(h]h]h]h]h]uhlj<%h]rC%hXobjectidrD%rE%}rF%(hkUhlj@%ubah~jOubjG)rG%}rH%(hkXnameh}rI%(h]h]h]h]h]uhlj<%h]rJ%hXnamerK%rL%}rM%(hkUhljG%ubah~jOubjG)rN%}rO%(hkXvalueh}rP%(h]h]h]h]h]uhlj<%h]rQ%hXvaluerR%rS%}rT%(hkUhljN%ubah~jOubeubeubj)rU%}rV%(hkUhlj)%hthwh~jh}rW%(h]h]h]h]h]uhMhhh]rX%(jT)rY%}rZ%(hkUhljU%hthwh~jWh}r[%(h]h]h]h]h]uhNhhh]r\%(jZ)r]%}r^%(hkUh}r_%(h]h]h]h]h]uhljY%h]r`%(j_)ra%}rb%(hkUh}rc%(h]h]h]h]h]uhlj]%h]rd%hX Parametersre%rf%}rg%(hkUhlja%ubah~jgubjh)rh%}ri%(hkUh}rj%(h]h]h]h]h]uhlj]%h]rk%j)rl%}rm%(hkUh}rn%(h]h]h]h]h]uhljh%h]ro%(j)rp%}rq%(hkUh}rr%(h]h]h]h]h]uhljl%h]rs%h)rt%}ru%(hkUh}rv%(h]h]h]h]h]uhljp%h]rw%(jq)rx%}ry%(hkXobjectidh}rz%(h]h]h]h]h]uhljt%h]r{%hXobjectidr|%r}%}r~%(hkUhljx%ubah~jyubhX -- r%r%}r%(hkUhljt%ubhX2the objectid for which the state should be changedr%r%}r%(hkX2the objectid for which the state should be changedhljt%ubeh~hubah~jubj)r%}r%(hkUh}r%(h]h]h]h]h]uhljl%h]r%h)r%}r%(hkUh}r%(h]h]h]h]h]uhlj%h]r%(jq)r%}r%(hkXnameh}r%(h]h]h]h]h]uhlj%h]r%hXnamer%r%}r%(hkUhlj%ubah~jyubhX -- r%r%}r%(hkUhlj%ubhXthe name of the value to changer%r%}r%(hkXthe name of the value to changehlj%ubeh~hubah~jubj)r%}r%(hkUh}r%(h]h]h]h]h]uhljl%h]r%h)r%}r%(hkUh}r%(h]h]h]h]h]uhlj%h]r%(jq)r%}r%(hkXvalueh}r%(h]h]h]h]h]uhlj%h]r%hXvaluer%r%}r%(hkUhlj%ubah~jyubhX (r%r%}r%(hkUhlj%ubj')r%}r%(hkUh}r%(Ureftypej)U reftargetXJSON-able valuer%U refdomainj,%h]h]U refexplicith]h]h]uhlj%h]r%jw)r%}r%(hkj%h}r%(h]h]h]h]h]uhlj%h]r%hXJSON-able valuer%r%}r%(hkUhlj%ubah~jubah~j+ubhX)r%}r%(hkUhlj%ubhX -- r%r%}r%(hkUhlj%ubhXthe value to setr%r%}r%(hkXthe value to sethlj%ubeh~hubah~jubj)r%}r%(hkUh}r%(h]h]h]h]h]uhljl%h]r%h)r%}r%(hkUh}r%(h]h]h]h]h]uhlj%h]r%(jq)r%}r%(hkXreturnsh}r%(h]h]h]h]h]uhlj%h]r%hXreturnsr%r%}r%(hkUhlj%ubah~jyubhX -- r%r%}r%(hkUhlj%ubhXDeferredr%r%}r%(hkXDeferredhlj%ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r%}r%(hkUhljY%hthwh~jh}r%(h]h]h]h]h]uhMhhh]r%(j_)r%}r%(hkXraisesh}r%(h]h]h]h]h]uhlj%h]r%hXRaisesr%r%}r%(hkUhlj%ubah~jgubjh)r%}r%(hkX!TypeError if JSONification fails h}r%(h]h]h]h]h]uhlj%h]r%h)r%}r%(hkX TypeError if JSONification failsr%hlj%hthwh~hh}r%(h]h]h]h]h]uhMh]r%hX TypeError if JSONification failsr%r%}r%(hkj%hlj%ubaubah~jubeubeubh)r%}r%(hkXeSet the state value for ``name`` for the object with id ``objectid``, overwriting any existing value.hljU%hthwh~hh}r%(h]h]h]h]h]uhMhhh]r%(hXSet the state value for r%r%}r%(hkXSet the state value for hlj%ubh)r%}r%(hkX``name``h}r%(h]h]h]h]h]uhlj%h]r%hXnamer%r%}r%(hkUhlj%ubah~hubhX for the object with id r%r%}r%(hkX for the object with id hlj%ubh)r%}r%(hkX ``objectid``h}r%(h]h]h]h]h]uhlj%h]r&hXobjectidr&r&}r&(hkUhlj%ubah~hubhX!, overwriting any existing value.r&r&}r&(hkX!, overwriting any existing value.hlj%ubeubeubeubeubeubeubhm)r&}r&(hkUhljIhthwh~hh}r &(h]h]h]h]r &(Xmodule-buildbot.db.usersr &Uusersr &eh]r &hTauhMhhh]r&(h)r&}r&(hkXusersr&hlj&hthwh~hh}r&(h]h]h]h]h]uhMhhh]r&hXusersr&r&}r&(hkj&hlj&ubaubjh)r&}r&(hkUhlj&hthwh~jkh}r&(h]h]h]h]h]Uentries]r&(jnXbuildbot.db.users (module)Xmodule-buildbot.db.usersUtr&auhMhhh]ubjh)r&}r&(hkUhlj&hthwh~jkh}r&(h]h]h]h]h]js]r&(juXUsers; DB Connector ComponentUindex-18r &Utr!&ajxuhM hhh]ubh{)r"&}r#&(hkUhlj&hthwh~hh}r$&(h]h]h]h]r%&j &ah]uhM!hhh]ubjh)r&&}r'&(hkUhlj&htNh~jkh}r(&(h]h]h]h]h]Uentries]r)&(jnX4UsersConnectorComponent (class in buildbot.db.users)hQUtr*&auhNhhh]ubj)r+&}r,&(hkUhlj&htNh~jh}r-&(jjXpyh]h]h]h]h]jXclassr.&jj.&uhNhhh]r/&(j)r0&}r1&(hkXUsersConnectorComponentr2&hlj+&hthwh~jh}r3&(h]r4&hQajXbuildbot.db.usersr5&h]h]h]h]r6&hQajj2&jUjuhMhhh]r7&(j)r8&}r9&(hkXclass hlj0&hthwh~jh}r:&(h]h]h]h]h]uhMhhh]r;&hXclass r<&r=&}r>&(hkUhlj8&ubaubj)r?&}r@&(hkXbuildbot.db.users.hlj0&hthwh~jh}rA&(h]h]h]h]h]uhMhhh]rB&hXbuildbot.db.users.rC&rD&}rE&(hkUhlj?&ubaubj)rF&}rG&(hkj2&hlj0&hthwh~jh}rH&(h]h]h]h]h]uhMhhh]rI&hXUsersConnectorComponentrJ&rK&}rL&(hkUhljF&ubaubeubj)rM&}rN&(hkUhlj+&hthwh~jh}rO&(h]h]h]h]h]uhMhhh]rP&(h)rQ&}rR&(hkXThis class handles Buildbot's notion of users. Buildbot tracks the usual information about users -- username and password, plus a display name.rS&hljM&hthwh~hh}rT&(h]h]h]h]h]uhM$hhh]rU&hXThis class handles Buildbot's notion of users. Buildbot tracks the usual information about users -- username and password, plus a display name.rV&rW&}rX&(hkjS&hljQ&ubaubh)rY&}rZ&(hkXThe more complicated task is to recognize each user across multiple interfaces with Buildbot. For example, a user may be identified as 'djmitche' in Subversion, 'dustin@v.igoro.us' in Git, and 'dustin' on IRC. To support this functionality, each user as a set of attributes, keyed by type. The :py:meth:`findUserByAttr` method uses these attributes to match users, adding a new user if no matching user is found.hljM&hthwh~hh}r[&(h]h]h]h]h]uhM'hhh]r\&(hXThe more complicated task is to recognize each user across multiple interfaces with Buildbot. For example, a user may be identified as 'djmitche' in Subversion, r]&r^&}r_&(hkXThe more complicated task is to recognize each user across multiple interfaces with Buildbot. For example, a user may be identified as 'djmitche' in Subversion, hljY&ubj)r`&}ra&(hkX'dustin@v.igoro.ush}rb&(UrefuriXmailto:'dustin@v.igoro.ush]h]h]h]h]uhljY&h]rc&hX'dustin@v.igoro.usrd&re&}rf&(hkUhlj`&ubah~jubhXt' in Git, and 'dustin' on IRC. To support this functionality, each user as a set of attributes, keyed by type. The rg&rh&}ri&(hkXt' in Git, and 'dustin' on IRC. To support this functionality, each user as a set of attributes, keyed by type. The hljY&ubj')rj&}rk&(hkX:py:meth:`findUserByAttr`rl&hljY&hthwh~j+h}rm&(UreftypeXmethj-j.XfindUserByAttrU refdomainXpyrn&h]h]U refexplicith]h]h]j0j1j2j2&j3j5&uhM'h]ro&h)rp&}rq&(hkjl&h}rr&(h]h]rs&(j9jn&Xpy-methrt&eh]h]h]uhljj&h]ru&hXfindUserByAttrrv&rw&}rx&(hkUhljp&ubah~hubaubhX] method uses these attributes to match users, adding a new user if no matching user is found.ry&rz&}r{&(hkX] method uses these attributes to match users, adding a new user if no matching user is found.hljY&ubeubh)r|&}r}&(hkXiUsers are identified canonically by *uid*, and are represented by *usdicts* (user dictionaries) with keyshljM&hthwh~hh}r~&(h]h]h]h]h]uhM.hhh]r&(hX$Users are identified canonically by r&r&}r&(hkX$Users are identified canonically by hlj|&ubjw)r&}r&(hkX*uid*h}r&(h]h]h]h]h]uhlj|&h]r&hXuidr&r&}r&(hkUhlj&ubah~jubhX, and are represented by r&r&}r&(hkX, and are represented by hlj|&ubjw)r&}r&(hkX *usdicts*h}r&(h]h]h]h]h]uhlj|&h]r&hXusdictsr&r&}r&(hkUhlj&ubah~jubhX (user dictionaries) with keysr&r&}r&(hkX (user dictionaries) with keyshlj|&ubeubj)r&}r&(hkUhljM&hthwh~jh}r&(jX*h]h]h]h]h]uhM1hhh]r&(j)r&}r&(hkX``uid``r&hlj&hthwh~jh}r&(h]h]h]h]h]uhNhhh]r&h)r&}r&(hkj&hlj&hthwh~hh}r&(h]h]h]h]h]uhM1h]r&h)r&}r&(hkj&h}r&(h]h]h]h]h]uhlj&h]r&hXuidr&r&}r&(hkUhlj&ubah~hubaubaubj)r&}r&(hkX*``identifier`` (display name for the user)r&hlj&hthwh~jh}r&(h]h]h]h]h]uhNhhh]r&h)r&}r&(hkj&hlj&hthwh~hh}r&(h]h]h]h]h]uhM2h]r&(h)r&}r&(hkX``identifier``h}r&(h]h]h]h]h]uhlj&h]r&hX identifierr&r&}r&(hkUhlj&ubah~hubhX (display name for the user)r&r&}r&(hkX (display name for the user)hlj&ubeubaubj)r&}r&(hkX)``bb_username`` (buildbot login username)r&hlj&hthwh~jh}r&(h]h]h]h]h]uhNhhh]r&h)r&}r&(hkj&hlj&hthwh~hh}r&(h]h]h]h]h]uhM3h]r&(h)r&}r&(hkX``bb_username``h}r&(h]h]h]h]h]uhlj&h]r&hX bb_usernamer&r&}r&(hkUhlj&ubah~hubhX (buildbot login username)r&r&}r&(hkX (buildbot login username)hlj&ubeubaubj)r&}r&(hkX(``bb_password`` (hashed login password) hlj&hthwh~jh}r&(h]h]h]h]h]uhNhhh]r&h)r&}r&(hkX'``bb_password`` (hashed login password)hlj&hthwh~hh}r&(h]h]h]h]h]uhM4h]r&(h)r&}r&(hkX``bb_password``h}r&(h]h]h]h]h]uhlj&h]r&hX bb_passwordr&r&}r&(hkUhlj&ubah~hubhX (hashed login password)r&r&}r&(hkX (hashed login password)hlj&ubeubaubeubh)r&}r&(hkXtAll attributes are also included in the dictionary, keyed by type. Types colliding with the keys above are ignored.r&hljM&hthwh~hh}r&(h]h]h]h]h]uhM6hhh]r&hXtAll attributes are also included in the dictionary, keyed by type. Types colliding with the keys above are ignored.r&r&}r&(hkj&hlj&ubaubjh)r&}r&(hkUhljM&hthwh~jkh}r&(h]h]h]h]h]Uentries]r&(jnXCfindUserByAttr() (buildbot.db.users.UsersConnectorComponent method)h_Utr&auhNhhh]ubj)r&}r&(hkUhljM&hthwh~jh}r&(jjXpyh]h]h]h]h]jXmethodr&jj&uhNhhh]r&(j)r&}r&(hkX0findUserByAttr(identifier, attr_type, attr_data)hlj&hthwh~jh}r&(h]r&h_ajj5&h]h]h]h]r&h_ajX&UsersConnectorComponent.findUserByAttrjj2&juhMLhhh]r&(j)r&}r&(hkXfindUserByAttrhlj&hthwh~jh}r&(h]h]h]h]h]uhMLhhh]r&hXfindUserByAttrr&r'}r'(hkUhlj&ubaubjA)r'}r'(hkUhlj&hthwh~jDh}r'(h]h]h]h]h]uhMLhhh]r'(jG)r'}r'(hkX identifierh}r'(h]h]h]h]h]uhlj'h]r 'hX identifierr 'r '}r '(hkUhlj'ubah~jOubjG)r '}r'(hkX attr_typeh}r'(h]h]h]h]h]uhlj'h]r'hX attr_typer'r'}r'(hkUhlj 'ubah~jOubjG)r'}r'(hkX attr_datah}r'(h]h]h]h]h]uhlj'h]r'hX attr_datar'r'}r'(hkUhlj'ubah~jOubeubeubj)r'}r'(hkUhlj&hthwh~jh}r'(h]h]h]h]h]uhMLhhh]r'(jT)r'}r '(hkUhlj'hthwh~jWh}r!'(h]h]h]h]h]uhNhhh]r"'(jZ)r#'}r$'(hkUh}r%'(h]h]h]h]h]uhlj'h]r&'(j_)r''}r('(hkUh}r)'(h]h]h]h]h]uhlj#'h]r*'hX Parametersr+'r,'}r-'(hkUhlj''ubah~jgubjh)r.'}r/'(hkUh}r0'(h]h]h]h]h]uhlj#'h]r1'j)r2'}r3'(hkUh}r4'(h]h]h]h]h]uhlj.'h]r5'(j)r6'}r7'(hkUh}r8'(h]h]h]h]h]uhlj2'h]r9'h)r:'}r;'(hkUh}r<'(h]h]h]h]h]uhlj6'h]r='(jq)r>'}r?'(hkX identifierh}r@'(h]h]h]h]h]uhlj:'h]rA'hX identifierrB'rC'}rD'(hkUhlj>'ubah~jyubhX -- rE'rF'}rG'(hkUhlj:'ubhX identifier to use for a new userrH'rI'}rJ'(hkX identifier to use for a new userhlj:'ubeh~hubah~jubj)rK'}rL'(hkUh}rM'(h]h]h]h]h]uhlj2'h]rN'h)rO'}rP'(hkUh}rQ'(h]h]h]h]h]uhljK'h]rR'(jq)rS'}rT'(hkX attr_typeh}rU'(h]h]h]h]h]uhljO'h]rV'hX attr_typerW'rX'}rY'(hkUhljS'ubah~jyubhX -- rZ'r['}r\'(hkUhljO'ubhX'attribute type to search for and/or addr]'r^'}r_'(hkX'attribute type to search for and/or addhljO'ubeh~hubah~jubj)r`'}ra'(hkUh}rb'(h]h]h]h]h]uhlj2'h]rc'h)rd'}re'(hkUh}rf'(h]h]h]h]h]uhlj`'h]rg'(jq)rh'}ri'(hkX attr_datah}rj'(h]h]h]h]h]uhljd'h]rk'hX attr_datarl'rm'}rn'(hkUhljh'ubah~jyubhX -- ro'rp'}rq'(hkUhljd'ubhXattribute data to addrr'rs'}rt'(hkXattribute data to addhljd'ubeh~hubah~jubeh~jubah~jubeh~jubjZ)ru'}rv'(hkUh}rw'(h]h]h]h]h]uhlj'h]rx'(j_)ry'}rz'(hkUh}r{'(h]h]h]h]h]uhlju'h]r|'hXReturnsr}'r~'}r'(hkUhljy'ubah~jgubjh)r'}r'(hkUh}r'(h]h]h]h]h]uhlju'h]r'h)r'}r'(hkUh}r'(h]h]h]h]h]uhlj'h]r'hXuserid via Deferredr'r'}r'(hkXuserid via Deferredhlj'ubah~hubah~jubeh~jubeubh)r'}r'(hkXEGet an existing user, or add a new one, based on the given attribute.r'hlj'hthwh~hh}r'(h]h]h]h]h]uhM@hhh]r'hXEGet an existing user, or add a new one, based on the given attribute.r'r'}r'(hkj'hlj'ubaubh)r'}r'(hkXoThis method is intended for use by other components of Buildbot to search for a user with the given attributes.r'hlj'hthwh~hh}r'(h]h]h]h]h]uhMBhhh]r'hXoThis method is intended for use by other components of Buildbot to search for a user with the given attributes.r'r'}r'(hkj'hlj'ubaubh)r'}r'(hkXNote that ``identifier`` is *not* used in the search for an existing user. It is only used when creating a new user. The identifier should be based deterministically on the attributes supplied, in some fashion that will seem natural to users.hlj'hthwh~hh}r'(h]h]h]h]h]uhMEhhh]r'(hX Note that r'r'}r'(hkX Note that hlj'ubh)r'}r'(hkX``identifier``h}r'(h]h]h]h]h]uhlj'h]r'hX identifierr'r'}r'(hkUhlj'ubah~hubhX is r'r'}r'(hkX is hlj'ubjw)r'}r'(hkX*not*h}r'(h]h]h]h]h]uhlj'h]r'hXnotr'r'}r'(hkUhlj'ubah~jubhX used in the search for an existing user. It is only used when creating a new user. The identifier should be based deterministically on the attributes supplied, in some fashion that will seem natural to users.r'r'}r'(hkX used in the search for an existing user. It is only used when creating a new user. The identifier should be based deterministically on the attributes supplied, in some fashion that will seem natural to users.hlj'ubeubh)r'}r'(hkXLFor future compatibility, always use keyword parameters to call this method.r'hlj'hthwh~hh}r'(h]h]h]h]h]uhMJhhh]r'hXLFor future compatibility, always use keyword parameters to call this method.r'r'}r'(hkj'hlj'ubaubeubeubjh)r'}r'(hkUhljM&hthwh~jkh}r'(h]h]h]h]h]Uentries]r'(jnX<getUser() (buildbot.db.users.UsersConnectorComponent method)hUtr'auhNhhh]ubj)r'}r'(hkUhljM&hthwh~jh}r'(jjXpyr'h]h]h]h]h]jXmethodr'jj'uhNhhh]r'(j)r'}r'(hkX getUser(uid)hlj'hthwh~jh}r'(h]r'hajj5&h]h]h]h]r'hajXUsersConnectorComponent.getUserjj2&juhMWhhh]r'(j)r'}r'(hkXgetUserhlj'hthwh~jh}r'(h]h]h]h]h]uhMWhhh]r'hXgetUserr'r'}r'(hkUhlj'ubaubjA)r'}r'(hkUhlj'hthwh~jDh}r'(h]h]h]h]h]uhMWhhh]r'jG)r'}r'(hkXuidh}r'(h]h]h]h]h]uhlj'h]r'hXuidr'r'}r'(hkUhlj'ubah~jOubaubeubj)r'}r'(hkUhlj'hthwh~jh}r'(h]h]h]h]h]uhMWhhh]r'(jT)r'}r'(hkUhlj'hthwh~jWh}r'(h]h]h]h]h]uhNhhh]r'(jZ)r'}r'(hkUh}r'(h]h]h]h]h]uhlj'h]r'(j_)r'}r'(hkUh}r'(h]h]h]h]h]uhlj'h]r'hX Parametersr'r'}r'(hkUhlj'ubah~jgubjh)r'}r'(hkUh}r'(h]h]h]h]h]uhlj'h]r'j)r'}r'(hkUh}r'(h]h]h]h]h]uhlj'h]r'(j)r'}r'(hkUh}r'(h]h]h]h]h]uhlj'h]r'h)r(}r((hkUh}r((h]h]h]h]h]uhlj'h]r((jq)r(}r((hkXuidh}r((h]h]h]h]h]uhlj(h]r(hXuidr(r (}r ((hkUhlj(ubah~jyubhX -- r (r (}r ((hkUhlj(ubhXuser id to look upr(r(}r((hkXuser id to look uphlj(ubeh~hubah~jubj)r(}r((hkUh}r((h]h]h]h]h]uhlj'h]r(h)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r((jq)r(}r((hkXno_cacheh}r((h]h]h]h]h]uhlj(h]r(hXno_cacher(r(}r((hkUhlj(ubah~jyubhX (r (r!(}r"((hkUhlj(ubj')r#(}r$((hkUh}r%((Ureftypej)U reftargetXbooleanr&(U refdomainj'h]h]U refexplicith]h]h]uhlj(h]r'(jw)r((}r)((hkj&(h}r*((h]h]h]h]h]uhlj#(h]r+(hXbooleanr,(r-(}r.((hkUhlj((ubah~jubah~j+ubhX)r/(}r0((hkUhlj(ubhX -- r1(r2(}r3((hkUhlj(ubhX+bypass cache and always fetch from databaser4(r5(}r6((hkX+bypass cache and always fetch from databasehlj(ubeh~hubah~jubeh~jubah~jubeh~jubjZ)r7(}r8((hkUh}r9((h]h]h]h]h]uhlj'h]r:((j_)r;(}r<((hkUh}r=((h]h]h]h]h]uhlj7(h]r>(hXReturnsr?(r@(}rA((hkUhlj;(ubah~jgubjh)rB(}rC((hkUh}rD((h]h]h]h]h]uhlj7(h]rE(h)rF(}rG((hkUh}rH((h]h]h]h]h]uhljB(h]rI(hXusdict via DeferredrJ(rK(}rL((hkXusdict via DeferredhljF(ubah~hubah~jubeh~jubeubh)rM(}rN((hkXJGet a usdict for the given user, or ``None`` if no matching user is found.hlj'hthwh~hh}rO((h]h]h]h]h]uhMUhhh]rP((hX$Get a usdict for the given user, or rQ(rR(}rS((hkX$Get a usdict for the given user, or hljM(ubh)rT(}rU((hkX``None``h}rV((h]h]h]h]h]uhljM(h]rW(hXNonerX(rY(}rZ((hkUhljT(ubah~hubhX if no matching user is found.r[(r\(}r]((hkX if no matching user is found.hljM(ubeubeubeubjh)r^(}r_((hkUhljM&hthwh~jkh}r`((h]h]h]h]h]Uentries]ra((jnXFgetUserByUsername() (buildbot.db.users.UsersConnectorComponent method)hUtrb(auhNhhh]ubj)rc(}rd((hkUhljM&hthwh~jh}re((jjXpyrf(h]h]h]h]h]jXmethodrg(jjg(uhNhhh]rh((j)ri(}rj((hkXgetUserByUsername(username)hljc(hthwh~jh}rk((h]rl(hajj5&h]h]h]h]rm(hajX)UsersConnectorComponent.getUserByUsernamejj2&juhM`hhh]rn((j)ro(}rp((hkXgetUserByUsernamehlji(hthwh~jh}rq((h]h]h]h]h]uhM`hhh]rr(hXgetUserByUsernamers(rt(}ru((hkUhljo(ubaubjA)rv(}rw((hkUhlji(hthwh~jDh}rx((h]h]h]h]h]uhM`hhh]ry(jG)rz(}r{((hkXusernameh}r|((h]h]h]h]h]uhljv(h]r}(hXusernamer~(r(}r((hkUhljz(ubah~jOubaubeubj)r(}r((hkUhljc(hthwh~jh}r((h]h]h]h]h]uhM`hhh]r((jT)r(}r((hkUhlj(hthwh~jWh}r((h]h]h]h]h]uhNhhh]r((jZ)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r((j_)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r(hX Parametersr(r(}r((hkUhlj(ubah~jgubjh)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r(h)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r((jq)r(}r((hkXusernameh}r((h]h]h]h]h]uhlj(h]r(hXusernamer(r(}r((hkUhlj(ubah~jyubhX (r(r(}r((hkUhlj(ubj')r(}r((hkUh}r((Ureftypej)U reftargetXstringr(U refdomainjf(h]h]U refexplicith]h]h]uhlj(h]r(jw)r(}r((hkj(h}r((h]h]h]h]h]uhlj(h]r(hXstringr(r(}r((hkUhlj(ubah~jubah~j+ubhX)r(}r((hkUhlj(ubhX -- r(r(}r((hkUhlj(ubhX$username portion of user credentialsr(r(}r((hkX$username portion of user credentialshlj(ubeh~hubah~jubeh~jubjZ)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r((j_)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r(hXReturnsr(r(}r((hkUhlj(ubah~jgubjh)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r(h)r(}r((hkUh}r((h]h]h]h]h]uhlj(h]r(hXusdict or None via deferredr(r(}r((hkXusdict or None via deferredhlj(ubah~hubah~jubeh~jubeubh)r(}r((hkXfLooks up the user with the bb_username, returning the usdict or ``None`` if no matching user is found.hlj(hthwh~hh}r((h]h]h]h]h]uhM^hhh]r((hX@Looks up the user with the bb_username, returning the usdict or r(r(}r((hkX@Looks up the user with the bb_username, returning the usdict or hlj(ubh)r(}r((hkX``None``h}r((h]h]h]h]h]uhlj(h]r(hXNoner(r(}r((hkUhlj(ubah~hubhX if no matching user is found.r(r(}r((hkX if no matching user is found.hlj(ubeubeubeubjh)r(}r((hkUhljM&hthwh~jkh}r((h]h]h]h]h]Uentries]r((jnX=getUsers() (buildbot.db.users.UsersConnectorComponent method)h>Utr(auhNhhh]ubj)r(}r((hkUhljM&hthwh~jh}r((jjXpyh]h]h]h]h]jXmethodr(jj(uhNhhh]r((j)r(}r((hkX getUsers()hlj(hthwh~jh}r((h]r(h>ajj5&h]h]h]h]r(h>ajX UsersConnectorComponent.getUsersjj2&juhMghhh]r((j)r(}r((hkXgetUsershlj(hthwh~jh}r((h]h]h]h]h]uhMghhh]r(hXgetUsersr(r(}r((hkUhlj(ubaubjA)r(}r((hkUhlj(hthwh~jDh}r((h]h]h]h]h]uhMghhh]ubeubj)r(}r((hkUhlj(hthwh~jh}r((h]h]h]h]h]uhMghhh]r((jT)r(}r)(hkUhlj(hthwh~jWh}r)(h]h]h]h]h]uhNhhh]r)jZ)r)}r)(hkUh}r)(h]h]h]h]h]uhlj(h]r)(j_)r)}r)(hkUh}r )(h]h]h]h]h]uhlj)h]r )hXReturnsr )r )}r )(hkUhlj)ubah~jgubjh)r)}r)(hkUh}r)(h]h]h]h]h]uhlj)h]r)h)r)}r)(hkUh}r)(h]h]h]h]h]uhlj)h]r)hX$list of partial usdicts via Deferredr)r)}r)(hkX$list of partial usdicts via Deferredhlj)ubah~hubah~jubeh~jubaubh)r)}r)(hkXgGet the entire list of users. User attributes are not included, so the results are not full userdicts.r)hlj(hthwh~hh}r)(h]h]h]h]h]uhMehhh]r)hXgGet the entire list of users. User attributes are not included, so the results are not full userdicts.r)r)}r )(hkj)hlj)ubaubeubeubjh)r!)}r")(hkUhljM&hthwh~jkh}r#)(h]h]h]h]h]Uentries]r$)(jnX?updateUser() (buildbot.db.users.UsersConnectorComponent method)hNUtr%)auhNhhh]ubj)r&)}r')(hkUhljM&hthwh~jh}r()(jjXpyr))h]h]h]h]h]jXmethodr*)jj*)uhNhhh]r+)(j)r,)}r-)(hkXiupdateUser(uid=None, identifier=None, bb_username=None, bb_password=None, attr_type=None, attr_data=None)hlj&)hthwh~jh}r.)(h]r/)hNajj5&h]h]h]h]r0)hNajX"UsersConnectorComponent.updateUserjj2&juhM~hhh]r1)(j)r2)}r3)(hkX updateUserhlj,)hthwh~jh}r4)(h]h]h]h]h]uhM~hhh]r5)hX updateUserr6)r7)}r8)(hkUhlj2)ubaubjA)r9)}r:)(hkUhlj,)hthwh~jDh}r;)(h]h]h]h]h]uhM~hhh]r<)(jG)r=)}r>)(hkXuid=Noneh}r?)(h]h]h]h]h]uhlj9)h]r@)hXuid=NonerA)rB)}rC)(hkUhlj=)ubah~jOubjG)rD)}rE)(hkXidentifier=Noneh}rF)(h]h]h]h]h]uhlj9)h]rG)hXidentifier=NonerH)rI)}rJ)(hkUhljD)ubah~jOubjG)rK)}rL)(hkXbb_username=Noneh}rM)(h]h]h]h]h]uhlj9)h]rN)hXbb_username=NonerO)rP)}rQ)(hkUhljK)ubah~jOubjG)rR)}rS)(hkXbb_password=Noneh}rT)(h]h]h]h]h]uhlj9)h]rU)hXbb_password=NonerV)rW)}rX)(hkUhljR)ubah~jOubjG)rY)}rZ)(hkXattr_type=Noneh}r[)(h]h]h]h]h]uhlj9)h]r\)hXattr_type=Noner])r^)}r_)(hkUhljY)ubah~jOubjG)r`)}ra)(hkXattr_data=Noneh}rb)(h]h]h]h]h]uhlj9)h]rc)hXattr_data=Nonerd)re)}rf)(hkUhlj`)ubah~jOubeubeubj)rg)}rh)(hkUhlj&)hthwh~jh}ri)(h]h]h]h]h]uhM~hhh]rj)(jT)rk)}rl)(hkUhljg)hthwh~jWh}rm)(h]h]h]h]h]uhNhhh]rn)(jZ)ro)}rp)(hkUh}rq)(h]h]h]h]h]uhljk)h]rr)(j_)rs)}rt)(hkUh}ru)(h]h]h]h]h]uhljo)h]rv)hX Parametersrw)rx)}ry)(hkUhljs)ubah~jgubjh)rz)}r{)(hkUh}r|)(h]h]h]h]h]uhljo)h]r})j)r~)}r)(hkUh}r)(h]h]h]h]h]uhljz)h]r)(j)r)}r)(hkUh}r)(h]h]h]h]h]uhlj~)h]r)h)r)}r)(hkUh}r)(h]h]h]h]h]uhlj)h]r)(jq)r)}r)(hkXuidh}r)(h]h]h]h]h]uhlj)h]r)hXuidr)r)}r)(hkUhlj)ubah~jyubhX (r)r)}r)(hkUhlj)ubj')r)}r)(hkUh}r)(Ureftypej)U reftargetXintr)U refdomainj))h]h]U refexplicith]h]h]uhlj)h]r)jw)r)}r)(hkj)h}r)(h]h]h]h]h]uhlj)h]r)hXintr)r)}r)(hkUhlj)ubah~jubah~j+ubhX)r)}r)(hkUhlj)ubhX -- r)r)}r)(hkUhlj)ubhXthe user to changer)r)}r)(hkXthe user to changehlj)ubeh~hubah~jubj)r)}r)(hkUh}r)(h]h]h]h]h]uhlj~)h]r)h)r)}r)(hkUh}r)(h]h]h]h]h]uhlj)h]r)(jq)r)}r)(hkX identifierh}r)(h]h]h]h]h]uhlj)h]r)hX identifierr)r)}r)(hkUhlj)ubah~jyubhX (r)r)}r)(hkUhlj)ubj')r)}r)(hkUh}r)(Ureftypej)U reftargetXstringr)U refdomainj))h]h]U refexplicith]h]h]uhlj)h]r)jw)r)}r)(hkj)h}r)(h]h]h]h]h]uhlj)h]r)hXstringr)r)}r)(hkUhlj)ubah~jubah~j+ubhX)r)}r)(hkUhlj)ubhX -- r)r)}r)(hkUhlj)ubhX'(optional) new identifier for this userr)r)}r)(hkX'(optional) new identifier for this userhlj)ubeh~hubah~jubj)r)}r)(hkUh}r)(h]h]h]h]h]uhlj~)h]r)h)r)}r)(hkUh}r)(h]h]h]h]h]uhlj)h]r)(jq)r)}r)(hkX bb_usernameh}r)(h]h]h]h]h]uhlj)h]r)hX bb_usernamer)r)}r)(hkUhlj)ubah~jyubhX (r)r)}r)(hkUhlj)ubj')r)}r)(hkUh}r)(Ureftypej)U reftargetXstringr)U refdomainj))h]h]U refexplicith]h]h]uhlj)h]r)jw)r)}r)(hkj)h}r)(h]h]h]h]h]uhlj)h]r)hXstringr)r)}r)(hkUhlj)ubah~jubah~j+ubhX)r)}r)(hkUhlj)ubhX -- r)r)}r)(hkUhlj)ubhX (optional) new buildbot usernamer)r)}r)(hkX (optional) new buildbot usernamehlj)ubeh~hubah~jubj)r)}r)(hkUh}r)(h]h]h]h]h]uhlj~)h]r)h)r)}r)(hkUh}r)(h]h]h]h]h]uhlj)h]r)(jq)r)}r)(hkX bb_passwordh}r)(h]h]h]h]h]uhlj)h]r)hX bb_passwordr*r*}r*(hkUhlj)ubah~jyubhX (r*r*}r*(hkUhlj)ubj')r*}r*(hkUh}r*(Ureftypej)U reftargetXstringr *U refdomainj))h]h]U refexplicith]h]h]uhlj)h]r *jw)r *}r *(hkj *h}r *(h]h]h]h]h]uhlj*h]r*hXstringr*r*}r*(hkUhlj *ubah~jubah~j+ubhX)r*}r*(hkUhlj)ubhX -- r*r*}r*(hkUhlj)ubhX'(optional) new hashed buildbot passwordr*r*}r*(hkX'(optional) new hashed buildbot passwordhlj)ubeh~hubah~jubj)r*}r*(hkUh}r*(h]h]h]h]h]uhlj~)h]r*h)r*}r*(hkUh}r *(h]h]h]h]h]uhlj*h]r!*(jq)r"*}r#*(hkX attr_typeh}r$*(h]h]h]h]h]uhlj*h]r%*hX attr_typer&*r'*}r(*(hkUhlj"*ubah~jyubhX (r)*r**}r+*(hkUhlj*ubj')r,*}r-*(hkUh}r.*(Ureftypej)U reftargetXstringr/*U refdomainj))h]h]U refexplicith]h]h]uhlj*h]r0*jw)r1*}r2*(hkj/*h}r3*(h]h]h]h]h]uhlj,*h]r4*hXstringr5*r6*}r7*(hkUhlj1*ubah~jubah~j+ubhX)r8*}r9*(hkUhlj*ubhX -- r:*r;*}r<*(hkUhlj*ubhX#(optional) attribute type to updater=*r>*}r?*(hkX#(optional) attribute type to updatehlj*ubeh~hubah~jubj)r@*}rA*(hkUh}rB*(h]h]h]h]h]uhlj~)h]rC*h)rD*}rE*(hkUh}rF*(h]h]h]h]h]uhlj@*h]rG*(jq)rH*}rI*(hkX attr_datah}rJ*(h]h]h]h]h]uhljD*h]rK*hX attr_datarL*rM*}rN*(hkUhljH*ubah~jyubhX (rO*rP*}rQ*(hkUhljD*ubj')rR*}rS*(hkUh}rT*(Ureftypej)U reftargetXstringrU*U refdomainj))h]h]U refexplicith]h]h]uhljD*h]rV*jw)rW*}rX*(hkjU*h}rY*(h]h]h]h]h]uhljR*h]rZ*hXstringr[*r\*}r]*(hkUhljW*ubah~jubah~j+ubhX)r^*}r_*(hkUhljD*ubhX -- r`*ra*}rb*(hkUhljD*ubhX(optional) value for rc*rd*}re*(hkX(optional) value for hljD*ubh)rf*}rg*(hkX ``attr_type``h}rh*(h]h]h]h]h]uhljD*h]ri*hX attr_typerj*rk*}rl*(hkUhljf*ubah~hubeh~hubah~jubeh~jubah~jubeh~jubjZ)rm*}rn*(hkUh}ro*(h]h]h]h]h]uhljk)h]rp*(j_)rq*}rr*(hkUh}rs*(h]h]h]h]h]uhljm*h]rt*hXReturnsru*rv*}rw*(hkUhljq*ubah~jgubjh)rx*}ry*(hkUh}rz*(h]h]h]h]h]uhljm*h]r{*h)r|*}r}*(hkUh}r~*(h]h]h]h]h]uhljx*h]r*hXDeferredr*r*}r*(hkXDeferredhlj|*ubah~hubah~jubeh~jubeubh)r*}r*(hkXUpdate information about the given user. Only the specified attributes are updated. If no user with the given uid exists, the method will return silently.r*hljg)hthwh~hh}r*(h]h]h]h]h]uhMxhhh]r*hXUpdate information about the given user. Only the specified attributes are updated. If no user with the given uid exists, the method will return silently.r*r*}r*(hkj*hlj*ubaubh)r*}r*(hkXtNote that ``bb_password`` must be given if ``bb_username`` appears; similarly, ``attr_type`` requires ``attr_data``.hljg)hthwh~hh}r*(h]h]h]h]h]uhM|hhh]r*(hX Note that r*r*}r*(hkX Note that hlj*ubh)r*}r*(hkX``bb_password``h}r*(h]h]h]h]h]uhlj*h]r*hX bb_passwordr*r*}r*(hkUhlj*ubah~hubhX must be given if r*r*}r*(hkX must be given if hlj*ubh)r*}r*(hkX``bb_username``h}r*(h]h]h]h]h]uhlj*h]r*hX bb_usernamer*r*}r*(hkUhlj*ubah~hubhX appears; similarly, r*r*}r*(hkX appears; similarly, hlj*ubh)r*}r*(hkX ``attr_type``h}r*(h]h]h]h]h]uhlj*h]r*hX attr_typer*r*}r*(hkUhlj*ubah~hubhX requires r*r*}r*(hkX requires hlj*ubh)r*}r*(hkX ``attr_data``h}r*(h]h]h]h]h]uhlj*h]r*hX attr_datar*r*}r*(hkUhlj*ubah~hubhX.r*}r*(hkX.hlj*ubeubeubeubjh)r*}r*(hkUhljM&hthwh~jkh}r*(h]h]h]h]h]Uentries]r*(jnX?removeUser() (buildbot.db.users.UsersConnectorComponent method)h7Utr*auhNhhh]ubj)r*}r*(hkUhljM&hthwh~jh}r*(jjXpyr*h]h]h]h]h]jXmethodr*jj*uhNhhh]r*(j)r*}r*(hkXremoveUser(uid)hlj*hthwh~jh}r*(h]r*h7ajj5&h]h]h]h]r*h7ajX"UsersConnectorComponent.removeUserjj2&juhMhhh]r*(j)r*}r*(hkX removeUserhlj*hthwh~jh}r*(h]h]h]h]h]uhMhhh]r*hX removeUserr*r*}r*(hkUhlj*ubaubjA)r*}r*(hkUhlj*hthwh~jDh}r*(h]h]h]h]h]uhMhhh]r*jG)r*}r*(hkXuidh}r*(h]h]h]h]h]uhlj*h]r*hXuidr*r*}r*(hkUhlj*ubah~jOubaubeubj)r*}r*(hkUhlj*hthwh~jh}r*(h]h]h]h]h]uhMhhh]r*(jT)r*}r*(hkUhlj*hthwh~jWh}r*(h]h]h]h]h]uhNhhh]r*(jZ)r*}r*(hkUh}r*(h]h]h]h]h]uhlj*h]r*(j_)r*}r*(hkUh}r*(h]h]h]h]h]uhlj*h]r*hX Parametersr*r*}r*(hkUhlj*ubah~jgubjh)r*}r*(hkUh}r*(h]h]h]h]h]uhlj*h]r*h)r*}r*(hkUh}r*(h]h]h]h]h]uhlj*h]r*(jq)r*}r*(hkXuidh}r*(h]h]h]h]h]uhlj*h]r*hXuidr*r*}r*(hkUhlj*ubah~jyubhX (r*r*}r+(hkUhlj*ubj')r+}r+(hkUh}r+(Ureftypej)U reftargetXintr+U refdomainj*h]h]U refexplicith]h]h]uhlj*h]r+jw)r+}r+(hkj+h}r+(h]h]h]h]h]uhlj+h]r +hXintr +r +}r +(hkUhlj+ubah~jubah~j+ubhX)r +}r+(hkUhlj*ubhX -- r+r+}r+(hkUhlj*ubhXthe user to remover+r+}r+(hkXthe user to removehlj*ubeh~hubah~jubeh~jubjZ)r+}r+(hkUh}r+(h]h]h]h]h]uhlj*h]r+(j_)r+}r+(hkUh}r+(h]h]h]h]h]uhlj+h]r+hXReturnsr+r+}r+(hkUhlj+ubah~jgubjh)r +}r!+(hkUh}r"+(h]h]h]h]h]uhlj+h]r#+h)r$+}r%+(hkUh}r&+(h]h]h]h]h]uhlj +h]r'+hXDeferredr(+r)+}r*+(hkXDeferredhlj$+ubah~hubah~jubeh~jubeubh)r++}r,+(hkXtRemove the user with the given uid from the database. This will remove the user from any associated tables as well.r-+hlj*hthwh~hh}r.+(h]h]h]h]h]uhMhhh]r/+hXtRemove the user with the given uid from the database. This will remove the user from any associated tables as well.r0+r1+}r2+(hkj-+hlj++ubaubeubeubjh)r3+}r4+(hkUhljM&hthwh~jkh}r5+(h]h]h]h]h]Uentries]r6+(jnXDidentifierToUid() (buildbot.db.users.UsersConnectorComponent method)hSUtr7+auhNhhh]ubj)r8+}r9+(hkUhljM&hthwh~jh}r:+(jjXpyr;+h]h]h]h]h]jXmethodr<+jj<+uhNhhh]r=+(j)r>+}r?+(hkXidentifierToUid(identifier)hlj8+hthwh~jh}r@+(h]rA+hSajj5&h]h]h]h]rB+hSajX'UsersConnectorComponent.identifierToUidjj2&juhMhhh]rC+(j)rD+}rE+(hkXidentifierToUidhlj>+hthwh~jh}rF+(h]h]h]h]h]uhMhhh]rG+hXidentifierToUidrH+rI+}rJ+(hkUhljD+ubaubjA)rK+}rL+(hkUhlj>+hthwh~jDh}rM+(h]h]h]h]h]uhMhhh]rN+jG)rO+}rP+(hkX identifierh}rQ+(h]h]h]h]h]uhljK+h]rR+hX identifierrS+rT+}rU+(hkUhljO+ubah~jOubaubeubj)rV+}rW+(hkUhlj8+hthwh~jh}rX+(h]h]h]h]h]uhMhhh]rY+(jT)rZ+}r[+(hkUhljV+hthwh~jWh}r\+(h]h]h]h]h]uhNhhh]r]+(jZ)r^+}r_+(hkUh}r`+(h]h]h]h]h]uhljZ+h]ra+(j_)rb+}rc+(hkUh}rd+(h]h]h]h]h]uhlj^+h]re+hX Parametersrf+rg+}rh+(hkUhljb+ubah~jgubjh)ri+}rj+(hkUh}rk+(h]h]h]h]h]uhlj^+h]rl+h)rm+}rn+(hkUh}ro+(h]h]h]h]h]uhlji+h]rp+(jq)rq+}rr+(hkX identifierh}rs+(h]h]h]h]h]uhljm+h]rt+hX identifierru+rv+}rw+(hkUhljq+ubah~jyubhX (rx+ry+}rz+(hkUhljm+ubj')r{+}r|+(hkUh}r}+(Ureftypej)U reftargetXstringr~+U refdomainj;+h]h]U refexplicith]h]h]uhljm+h]r+jw)r+}r+(hkj~+h}r+(h]h]h]h]h]uhlj{+h]r+hXstringr+r+}r+(hkUhlj+ubah~jubah~j+ubhX)r+}r+(hkUhljm+ubhX -- r+r+}r+(hkUhljm+ubhXidentifier to search forr+r+}r+(hkXidentifier to search forhljm+ubeh~hubah~jubeh~jubjZ)r+}r+(hkUh}r+(h]h]h]h]h]uhljZ+h]r+(j_)r+}r+(hkUh}r+(h]h]h]h]h]uhlj+h]r+hXReturnsr+r+}r+(hkUhlj+ubah~jgubjh)r+}r+(hkUh}r+(h]h]h]h]h]uhlj+h]r+h)r+}r+(hkUh}r+(h]h]h]h]h]uhlj+h]r+(hXuid or r+r+}r+(hkXuid or hlj+ubh)r+}r+(hkX``None``h}r+(h]h]h]h]h]uhlj+h]r+hXNoner+r+}r+(hkUhlj+ubah~hubhX, via Deferredr+r+}r+(hkX, via Deferredhlj+ubeh~hubah~jubeh~jubeubh)r+}r+(hkX4Fetch a uid for the given identifier, if one exists.r+hljV+hthwh~hh}r+(h]h]h]h]h]uhMhhh]r+hX4Fetch a uid for the given identifier, if one exists.r+r+}r+(hkj+hlj+ubaubeubeubeubeubeubeubhphm)r+}r+(hkUhlhrhthwhy}r+hh{)r+}r+(hkX".. _Modifying-the-Database-Schema:hlhm)r+}r+(hkUhlhphthwh~hh}r+(h]h]h]h]r+Utestsr+ah]r+hauhMbhhh]r+(h)r+}r+(hkXTestsr+hlj+hthwh~hh}r+(h]h]h]h]h]uhMbhhh]r+hXTestsr+r+}r+(hkj+hlj+ubaubh)r+}r+(hkXKIt goes without saying that any new connector methods must be fully tested!r+hlj+hthwh~hh}r+(h]h]h]h]h]uhMdhhh]r+hXKIt goes without saying that any new connector methods must be fully tested!r+r+}r+(hkj+hlj+ubaubh)r+}r+(hkXYou will also want to add an in-memory implementation of the methods to the fake classes in ``master/buildbot/test/fake/fakedb.py``. Non-DB Buildbot code is tested using these fake implementations in order to isolate that code from the database code.hlj+hthwh~hh}r+(h]h]h]h]h]uhMfhhh]r+(hX\You will also want to add an in-memory implementation of the methods to the fake classes in r+r+}r+(hkX\You will also want to add an in-memory implementation of the methods to the fake classes in hlj+ubh)r+}r+(hkX'``master/buildbot/test/fake/fakedb.py``h}r+(h]h]h]h]h]uhlj+h]r+hX#master/buildbot/test/fake/fakedb.pyr+r+}r+(hkUhlj+ubah~hubhXx. Non-DB Buildbot code is tested using these fake implementations in order to isolate that code from the database code.r+r+}r+(hkXx. Non-DB Buildbot code is tested using these fake implementations in order to isolate that code from the database code.hlj+ubeubj+eubhthwh~hh}r+(h]h]h]h]h]hUmodifying-the-database-schemar+uhMkhhh]ubsh~hh}r+(h]h]h]h]r+(j+Uid2r+eh]r+(h heuhMnhhh}r+j+j+sh]r+(h)r+}r+(hkXModifying the Database Schemar+hlj+hthwh~hh}r+(h]h]h]h]h]uhMnhhh]r+hXModifying the Database Schemar+r+}r+(hkj+hlj+ubaubh)r+}r+(hkXChanges to the schema are accomplished through migration scripts, supported by `SQLAlchemy-Migrate `_. In fact, even new databases are created with the migration scripts -- a new database is a migrated version of an empty database.hlj+hthwh~hh}r+(h]h]h]h]h]uhMphhh]r+(hXOChanges to the schema are accomplished through migration scripts, supported by r+r+}r+(hkXOChanges to the schema are accomplished through migration scripts, supported by hlj+ubj)r+}r+(hkXD`SQLAlchemy-Migrate `_h}r+(UnameXSQLAlchemy-Migratej X,http://code.google.com/p/sqlalchemy-migrate/r+h]h]h]h]h]uhlj+h]r+hXSQLAlchemy-Migrater,r,}r,(hkUhlj+ubah~jubh{)r,}r,(hkX/ jKhlj+h~hh}r,(Urefurij+h]r,Uid3r,ah]h]r,Xsqlalchemy-migrater ,ah]h]uh]ubhX. In fact, even new databases are created with the migration scripts -- a new database is a migrated version of an empty database.r ,r ,}r ,(hkX. In fact, even new databases are created with the migration scripts -- a new database is a migrated version of an empty database.hlj+ubeubh)r ,}r,(hkXThe schema is tracked by a version number, stored in the ``migrate_version`` table. This number is incremented for each change to the schema, and used to determine whether the database must be upgraded. The master will refuse to run with an out-of-date database.hlj+hthwh~hh}r,(h]h]h]h]h]uhMuhhh]r,(hX9The schema is tracked by a version number, stored in the r,r,}r,(hkX9The schema is tracked by a version number, stored in the hlj ,ubh)r,}r,(hkX``migrate_version``h}r,(h]h]h]h]h]uhlj ,h]r,hXmigrate_versionr,r,}r,(hkUhlj,ubah~hubhX table. This number is incremented for each change to the schema, and used to determine whether the database must be upgraded. The master will refuse to run with an out-of-date database.r,r,}r,(hkX table. This number is incremented for each change to the schema, and used to determine whether the database must be upgraded. The master will refuse to run with an out-of-date database.hlj ,ubeubh)r,}r,(hkXTo make a change to the schema, first consider how to handle any existing data. When adding new columns, this may not be necessary, but table refactorings can be complex and require caution so as not to lose information.r ,hlj+hthwh~hh}r!,(h]h]h]h]h]uhMzhhh]r",hXTo make a change to the schema, first consider how to handle any existing data. When adding new columns, this may not be necessary, but table refactorings can be complex and require caution so as not to lose information.r#,r$,}r%,(hkj ,hlj,ubaubh)r&,}r',(hkXCreate a new script in :bb:src:`master/buildbot/db/migrate/versions`, following the numbering scheme already present. The script should have an ``update`` method, which takes an engine as a parameter, and upgrades the database, both changing the schema and performing any required data migrations. The engine passed to this parameter is "enhanced" by SQLAlchemy-Migrate, with methods to handle adding, altering, and dropping columns. See the SQLAlchemy-Migrate documentation for details.hlj+hthwh~hh}r(,(h]h]h]h]h]uhM~hhh]r),(hXCreate a new script in r*,r+,}r,,(hkXCreate a new script in hlj&,ubj)r-,}r.,(hkUh}r/,(Ureftitler0,X#master/buildbot/db/migrate/versionsr1,j XThttps://github.com/buildbot/buildbot/blob/master/master/buildbot/db/migrate/versionsh]h]h]h]h]uhlj&,h]r2,h)r3,}r4,(hkj1,h}r5,(h]h]h]h]h]uhlj-,h]r6,hX#master/buildbot/db/migrate/versionsr7,r8,}r9,(hkUhlj3,ubah~hubah~jubhXM, following the numbering scheme already present. The script should have an r:,r;,}r<,(hkXM, following the numbering scheme already present. The script should have an hlj&,ubh)r=,}r>,(hkX ``update``h}r?,(h]h]h]h]h]uhlj&,h]r@,hXupdaterA,rB,}rC,(hkUhlj=,ubah~hubhXO method, which takes an engine as a parameter, and upgrades the database, both changing the schema and performing any required data migrations. The engine passed to this parameter is "enhanced" by SQLAlchemy-Migrate, with methods to handle adding, altering, and dropping columns. See the SQLAlchemy-Migrate documentation for details.rD,rE,}rF,(hkXO method, which takes an engine as a parameter, and upgrades the database, both changing the schema and performing any required data migrations. The engine passed to this parameter is "enhanced" by SQLAlchemy-Migrate, with methods to handle adding, altering, and dropping columns. See the SQLAlchemy-Migrate documentation for details.hlj&,ubeubh)rG,}rH,(hkXNext, modify :bb:src:`master/buildbot/db/model.py` to represent the updated schema. Buildbot's automated tests perform a rudimentary comparison of an upgraded database with the model, but it is important to check the details - key length, nullability, and so on can sometimes be missed by the checks. If the schema and the upgrade scripts get out of sync, bizarre behavior can result.hlj+hthwh~hh}rI,(h]h]h]h]h]uhMhhh]rJ,(hX Next, modify rK,rL,}rM,(hkX Next, modify hljG,ubj)rN,}rO,(hkUh}rP,(j0,Xmaster/buildbot/db/model.pyrQ,j XLhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/db/model.pyh]h]h]h]h]uhljG,h]rR,h)rS,}rT,(hkjQ,h}rU,(h]h]h]h]h]uhljN,h]rV,hXmaster/buildbot/db/model.pyrW,rX,}rY,(hkUhljS,ubah~hubah~jubhXP to represent the updated schema. Buildbot's automated tests perform a rudimentary comparison of an upgraded database with the model, but it is important to check the details - key length, nullability, and so on can sometimes be missed by the checks. If the schema and the upgrade scripts get out of sync, bizarre behavior can result.rZ,r[,}r\,(hkXP to represent the updated schema. Buildbot's automated tests perform a rudimentary comparison of an upgraded database with the model, but it is important to check the details - key length, nullability, and so on can sometimes be missed by the checks. If the schema and the upgrade scripts get out of sync, bizarre behavior can result.hljG,ubeubh)r],}r^,(hkX|Also, adjust the fake database table definitions in :bb:src:`master/buildbot/test/fake/fakedb.py` according to your changes.hlj+hthwh~hh}r_,(h]h]h]h]h]uhMhhh]r`,(hX4Also, adjust the fake database table definitions in ra,rb,}rc,(hkX4Also, adjust the fake database table definitions in hlj],ubj)rd,}re,(hkUh}rf,(j0,X#master/buildbot/test/fake/fakedb.pyrg,j XThttps://github.com/buildbot/buildbot/blob/master/master/buildbot/test/fake/fakedb.pyh]h]h]h]h]uhlj],h]rh,h)ri,}rj,(hkjg,h}rk,(h]h]h]h]h]uhljd,h]rl,hX#master/buildbot/test/fake/fakedb.pyrm,rn,}ro,(hkUhlji,ubah~hubah~jubhX according to your changes.rp,rq,}rr,(hkX according to your changes.hlj],ubeubh)rs,}rt,(hkXYour upgrade script should have unit tests. The classes in :bb:src:`master/buildbot/test/util/migration.py` make this straightforward. Unit test scripts should be named e.g., :file:`test_db_migrate_versions_015_remove_bad_master_objectid.py`.hlj+hthwh~hh}ru,(h]h]h]h]h]uhMhhh]rv,(hX<Your upgrade script should have unit tests. The classes in rw,rx,}ry,(hkX<Your upgrade script should have unit tests. The classes in hljs,ubj)rz,}r{,(hkUh}r|,(j0,X&master/buildbot/test/util/migration.pyr},j XWhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/test/util/migration.pyh]h]h]h]h]uhljs,h]r~,h)r,}r,(hkj},h}r,(h]h]h]h]h]uhljz,h]r,hX&master/buildbot/test/util/migration.pyr,r,}r,(hkUhlj,ubah~hubah~jubhXD make this straightforward. Unit test scripts should be named e.g., r,r,}r,(hkXD make this straightforward. Unit test scripts should be named e.g., hljs,ubh)r,}r,(hkUh}r,(h]h]h]h]r,Xfiler,aUrolej,h]uhljs,h]r,hX:test_db_migrate_versions_015_remove_bad_master_objectid.pyr,r,}r,(hkX:test_db_migrate_versions_015_remove_bad_master_objectid.pyhlj,ubah~hubhX.r,}r,(hkX.hljs,ubeubh)r,}r,(hkX0The :file:`master/buildbot/test/integration/test_upgrade.py` also tests upgrades, and will confirm that the resulting database matches the model. If you encounter implicit indexes on MySQL, that do not appear on SQLite or Postgres, add them to ``implied_indexes`` in :file:`master/buidlbot/db/model.py`.hlj+hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,(hXThe r,r,}r,(hkXThe hlj,ubh)r,}r,(hkUh}r,(h]h]h]h]r,Xfiler,aUrolej,h]uhlj,h]r,hX0master/buildbot/test/integration/test_upgrade.pyr,r,}r,(hkX0master/buildbot/test/integration/test_upgrade.pyhlj,ubah~hubhX also tests upgrades, and will confirm that the resulting database matches the model. If you encounter implicit indexes on MySQL, that do not appear on SQLite or Postgres, add them to r,r,}r,(hkX also tests upgrades, and will confirm that the resulting database matches the model. If you encounter implicit indexes on MySQL, that do not appear on SQLite or Postgres, add them to hlj,ubh)r,}r,(hkX``implied_indexes``h}r,(h]h]h]h]h]uhlj,h]r,hXimplied_indexesr,r,}r,(hkUhlj,ubah~hubhX in r,r,}r,(hkX in hlj,ubh)r,}r,(hkUh}r,(h]h]h]h]r,Xfiler,aUrolej,h]uhlj,h]r,hXmaster/buidlbot/db/model.pyr,r,}r,(hkXmaster/buidlbot/db/model.pyhlj,ubah~hubhX.r,}r,(hkX.hlj,ubeubeubhm)r,}r,(hkUhlhrhthwh~hh}r,(h]h]h]h]r,Udatabase-compatibility-notesr,ah]r,hRauhMhhh]r,(h)r,}r,(hkXDatabase Compatibility Notesr,hlj,hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,hXDatabase Compatibility Notesr,r,}r,(hkj,hlj,ubaubh)r,}r,(hkX;Or: "If you thought any database worked right, think again"r,hlj,hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,hX;Or: "If you thought any database worked right, think again"r,r,}r,(hkj,hlj,ubaubh)r,}r,(hkXBecause Buildbot works over a wide range of databases, it is generally limited to database features present in all supported backends. This section highlights a few things to watch out for.r,hlj,hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,hXBecause Buildbot works over a wide range of databases, it is generally limited to database features present in all supported backends. This section highlights a few things to watch out for.r,r,}r,(hkj,hlj,ubaubh)r,}r,(hkXIn general, Buildbot should be functional on all supported database backends. If use of a backend adds minor usage restrictions, or cannot implement some kinds of error checking, that is acceptable if the restrictions are well-documented in the manual.r,hlj,hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,hXIn general, Buildbot should be functional on all supported database backends. If use of a backend adds minor usage restrictions, or cannot implement some kinds of error checking, that is acceptable if the restrictions are well-documented in the manual.r,r,}r,(hkj,hlj,ubaubh)r,}r,(hkX~The metabuildbot tests Buildbot against all supported databases, so most compatibility errors will be caught before a release.r,hlj,hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,hX~The metabuildbot tests Buildbot against all supported databases, so most compatibility errors will be caught before a release.r,r,}r,(hkj,hlj,ubaubhm)r,}r,(hkUhlj,hthwh~hh}r,(h]h]h]h]r,Uindex-length-in-mysqlr,ah]r,hauhMhhh]r,(h)r,}r,(hkXIndex Length in MySQLr,hlj,hthwh~hh}r,(h]h]h]h]h]uhMhhh]r,hXIndex Length in MySQLr,r,}r,(hkj,hlj,ubaubjh)r,}r,(hkUhlj,hthwh~jkh}r,(h]h]h]h]h]js]r,(jnXMySQL; limitationsUindex-19r,Utr,ajxuhMhhh]ubh{)r-}r-(hkUhlj,hthwh~hh}r-(h]h]h]h]h]hj,uhMhhh]ubh)r-}r-(hkXMySQL only supports about 330-character indexes. The actual index length is 1000 bytes, but MySQL uses 3-byte encoding for UTF8 strings. This is a longstanding bug in MySQL - see `"Specified key was too long; max key length is 1000 bytes" with utf8 `_. While this makes sense for indexes used for record lookup, it limits the ability to use unique indexes to prevent duplicate rows.hlj,hthwhy}h~hh}r-(h]h]h]h]r-j,ah]uhMhhh}r-j,j-sh]r-(hXMySQL only supports about 330-character indexes. The actual index length is 1000 bytes, but MySQL uses 3-byte encoding for UTF8 strings. This is a longstanding bug in MySQL - see r -r -}r -(hkXMySQL only supports about 330-character indexes. The actual index length is 1000 bytes, but MySQL uses 3-byte encoding for UTF8 strings. This is a longstanding bug in MySQL - see hlj-ubj)r -}r -(hkXo`"Specified key was too long; max key length is 1000 bytes" with utf8 `_h}r-(UnameXD"Specified key was too long; max key length is 1000 bytes" with utf8j X%http://bugs.mysql.com/bug.php?id=4541r-h]h]h]h]h]uhlj-h]r-hXD"Specified key was too long; max key length is 1000 bytes" with utf8r-r-}r-(hkUhlj -ubah~jubh{)r-}r-(hkX( jKhlj-h~hh}r-(Urefurij-h]r-UAspecified-key-was-too-long-max-key-length-is-1000-bytes-with-utf8r-ah]h]h]h]r-hVauh]ubhX. While this makes sense for indexes used for record lookup, it limits the ability to use unique indexes to prevent duplicate rows.r-r-}r-(hkX. While this makes sense for indexes used for record lookup, it limits the ability to use unique indexes to prevent duplicate rows.hlj-ubeubh)r-}r-(hkXInnoDB has even more severe restrictions on key lengths, which is why the MySQL implementation requires a MyISAM storage engine.r-hlj,hthwh~hh}r -(h]h]h]h]h]uhMhhh]r!-hXInnoDB has even more severe restrictions on key lengths, which is why the MySQL implementation requires a MyISAM storage engine.r"-r#-}r$-(hkj-hlj-ubaubeubhm)r%-}r&-(hkUhlj,hthwh~hh}r'-(h]h]h]h]r(-Utransactions-in-mysqlr)-ah]r*-h/auhMhhh]r+-(h)r,-}r--(hkXTransactions in MySQLr.-hlj%-hthwh~hh}r/-(h]h]h]h]h]uhMhhh]r0-hXTransactions in MySQLr1-r2-}r3-(hkj.-hlj,-ubaubjh)r4-}r5-(hkUhlj%-hthwh~jkh}r6-(h]h]h]h]h]js]r7-(jnXMySQL; limitationsUindex-20r8-Utr9-ajxuhMhhh]ubh{)r:-}r;-(hkUhlj%-hthwh~hh}r<-(h]h]h]h]h]hj8-uhMhhh]ubh)r=-}r>-(hkXUnfortunately, use of the MyISAM storage engine precludes real transactions in MySQL. ``transaction.commit()`` and ``transaction.rollback()`` are essentially no-ops: modifications to data in the database are visible to other users immediately, and are not reverted in a rollback.hlj%-hthwhy}h~hh}r?-(h]h]h]h]r@-j8-ah]uhMhhh}rA-j8-j:-sh]rB-(hXWUnfortunately, use of the MyISAM storage engine precludes real transactions in MySQL. rC-rD-}rE-(hkXWUnfortunately, use of the MyISAM storage engine precludes real transactions in MySQL. hlj=-ubh)rF-}rG-(hkX``transaction.commit()``h}rH-(h]h]h]h]h]uhlj=-h]rI-hXtransaction.commit()rJ-rK-}rL-(hkUhljF-ubah~hubhX and rM-rN-}rO-(hkX and hlj=-ubh)rP-}rQ-(hkX``transaction.rollback()``h}rR-(h]h]h]h]h]uhlj=-h]rS-hXtransaction.rollback()rT-rU-}rV-(hkUhljP-ubah~hubhX are essentially no-ops: modifications to data in the database are visible to other users immediately, and are not reverted in a rollback.rW-rX-}rY-(hkX are essentially no-ops: modifications to data in the database are visible to other users immediately, and are not reverted in a rollback.hlj=-ubeubeubhm)rZ-}r[-(hkUhlj,hthwh~hh}r\-(h]h]h]h]r]-U)referential-integrity-in-sqlite-and-mysqlr^-ah]r_-h#auhMhhh]r`-(h)ra-}rb-(hkX)Referential Integrity in SQLite and MySQLrc-hljZ-hthwh~hh}rd-(h]h]h]h]h]uhMhhh]re-hX)Referential Integrity in SQLite and MySQLrf-rg-}rh-(hkjc-hlja-ubaubjh)ri-}rj-(hkUhljZ-hthwh~jkh}rk-(h]h]h]h]h]js]rl-(jnXSQLite; limitationsUindex-21rm-Utrn-ajxuhMhhh]ubh{)ro-}rp-(hkUhljZ-hthwh~hh}rq-(h]h]h]h]rr-jm-ah]uhMhhh]ubjh)rs-}rt-(hkUhljZ-hthwh~jkh}ru-(h]h]h]h]h]js]rv-(jnXMySQL; limitationsUindex-22rw-Utrx-ajxuhMhhh]ubh{)ry-}rz-(hkUhljZ-hthwh~hh}r{-(h]h]h]h]h]hjw-uhMhhh]ubh)r|-}r}-(hkXNeither MySQL nor SQLite enforce referential integrity based on foreign keys. Postgres does enforce, however. If possible, test your changes on Postgres before committing, to check that tables are added and removed in the proper order.r~-hljZ-hthwhy}h~hh}r-(h]h]h]h]r-jw-ah]uhMhhh}r-jw-jy-sh]r-hXNeither MySQL nor SQLite enforce referential integrity based on foreign keys. Postgres does enforce, however. If possible, test your changes on Postgres before committing, to check that tables are added and removed in the proper order.r-r-}r-(hkj~-hlj|-ubaubeubhm)r-}r-(hkUhlj,hthwh~hh}r-(h]h]h]h]r-Usubqueries-in-mysqlr-ah]r-h auhMhhh]r-(h)r-}r-(hkXSubqueries in MySQLr-hlj-hthwh~hh}r-(h]h]h]h]h]uhMhhh]r-hXSubqueries in MySQLr-r-}r-(hkj-hlj-ubaubjh)r-}r-(hkUhlj-hthwh~jkh}r-(h]h]h]h]h]js]r-(jnXMySQL; limitationsUindex-23r-Utr-ajxuhMhhh]ubh{)r-}r-(hkUhlj-hthwh~hh}r-(h]h]h]h]h]hj-uhMhhh]ubh)r-}r-(hkXMySQL's query planner is easily confused by subqueries. For example, a DELETE query specifying id's that are IN a subquery will not work. The workaround is to run the subquery directly, and then execute a DELETE query for each returned id.r-hlj-hthwhy}h~hh}r-(h]h]h]h]r-j-ah]uhMhhh}r-j-j-sh]r-hXMySQL's query planner is easily confused by subqueries. For example, a DELETE query specifying id's that are IN a subquery will not work. The workaround is to run the subquery directly, and then execute a DELETE query for each returned id.r-r-}r-(hkj-hlj-ubaubh)r-}r-(hkXIf this weakness has a significant performance impact, it would be acceptable to conditionalize use of the subquery on the database dialect.r-hlj-hthwh~hh}r-(h]h]h]h]h]uhMhhh]r-hXIf this weakness has a significant performance impact, it would be acceptable to conditionalize use of the subquery on the database dialect.r-r-}r-(hkj-hlj-ubaubeubeubeubhthwh~hh}r-(h]h]h]h]r-U"writing-database-connector-methodsr-ah]r-hYauhMhhh]r-(h)r-}r-(hkX"Writing Database Connector Methodsr-hlhphthwh~hh}r-(h]h]h]h]h]uhMhhh]r-hX"Writing Database Connector Methodsr-r-}r-(hkj-hlj-ubaubh)r-}r-(hkX<The information above is intended for developers working on the rest of Buildbot, and treating the database layer as an abstraction. The remainder of this section describes the internals of the database implementation, and is intended for developers modifying the schema or adding new methods to the database layer.r-hlhphthwh~hh}r-(h]h]h]h]h]uhMhhh]r-hX<The information above is intended for developers working on the rest of Buildbot, and treating the database layer as an abstraction. The remainder of this section describes the internals of the database implementation, and is intended for developers modifying the schema or adding new methods to the database layer.r-r-}r-(hkj-hlj-ubaubcdocutils.nodes warning r-)r-}r-(hkXIt's difficult to change the database schema significantly after it has been released, and very disruptive to users to change the database API. Consider very carefully the future-proofing of any changes here!hlhphthwh~Uwarningr-h}r-(h]h]h]h]h]uhNhhh]r-h)r-}r-(hkXIt's difficult to change the database schema significantly after it has been released, and very disruptive to users to change the database API. Consider very carefully the future-proofing of any changes here!r-hlj-hthwh~hh}r-(h]h]h]h]h]uhMh]r-hXIt's difficult to change the database schema significantly after it has been released, and very disruptive to users to change the database API. Consider very carefully the future-proofing of any changes here!r-r-}r-(hkj-hlj-ubaubaubhm)r-}r-(hkUhlhphthwh~hh}r-(h]h]h]h]r-(Xmodule-buildbot.db.connectorr-Uthe-db-connector-and-componentsr-eh]r-h.}r?.(hkUhlj-hthwh~hh}r@.(h]h]rA.Xmodule-buildbot.db.baserB.ah]Uismodh]h]uhMhhh]ubjh)rC.}rD.(hkUhlj-hthwh~jkh}rE.(h]h]h]h]h]Uentries]rF.(jnXbuildbot.db.base (module)Xmodule-buildbot.db.baseUtrG.auhMhhh]ubjh)rH.}rI.(hkUhlj-htNh~jkh}rJ.(h]h]h]h]h]Uentries]rK.(jnX0DBConnectorComponent (class in buildbot.db.base)hPUtrL.auhNhhh]ubj)rM.}rN.(hkUhlj-htNh~jh}rO.(jjXpyh]h]h]h]h]jXclassrP.jjP.uhNhhh]rQ.(j)rR.}rS.(hkXDBConnectorComponentrT.hljM.hthwh~jh}rU.(h]rV.hPajXbuildbot.db.baserW.h]h]h]h]rX.hPajjT.jUjuhMhhh]rY.(j)rZ.}r[.(hkXclass hljR.hthwh~jh}r\.(h]h]h]h]h]uhMhhh]r].hXclass r^.r_.}r`.(hkUhljZ.ubaubj)ra.}rb.(hkXbuildbot.db.base.hljR.hthwh~jh}rc.(h]h]h]h]h]uhMhhh]rd.hXbuildbot.db.base.re.rf.}rg.(hkUhlja.ubaubj)rh.}ri.(hkjT.hljR.hthwh~jh}rj.(h]h]h]h]h]uhMhhh]rk.hXDBConnectorComponentrl.rm.}rn.(hkUhljh.ubaubeubj)ro.}rp.(hkUhljM.hthwh~jh}rq.(h]h]h]h]h]uhMhhh]rr.(h)rs.}rt.(hkX0This is the base class for connector components.ru.hljo.hthwh~hh}rv.(h]h]h]h]h]uhMhhh]rw.hX0This is the base class for connector components.rx.ry.}rz.(hkju.hljs.ubaubh)r{.}r|.(hkXOThere should be no need to override the constructor defined by this base class.r}.hljo.hthwh~hh}r~.(h]h]h]h]h]uhMhhh]r.hXOThere should be no need to override the constructor defined by this base class.r.r.}r.(hkj}.hlj{.ubaubjh)r.}r.(hkUhljo.hthwh~jkh}r.(h]h]h]h]h]Uentries]r.(jnX4db (buildbot.db.base.DBConnectorComponent attribute)hDUtr.auhNhhh]ubj)r.}r.(hkUhljo.hthwh~jh}r.(jjXpyh]h]h]h]h]jX attributer.jj.uhNhhh]r.(j)r.}r.(hkXdbr.hlj.hthwh~jh}r.(h]r.hDajjW.h]h]h]h]r.hDajXDBConnectorComponent.dbjjT.juhMhhh]r.j)r.}r.(hkj.hlj.hthwh~jh}r.(h]h]h]h]h]uhMhhh]r.hXdbr.r.}r.(hkUhlj.ubaubaubj)r.}r.(hkUhlj.hthwh~jh}r.(h]h]h]h]h]uhMhhh]r.h)r.}r.(hkXA reference to the :class:`~buildbot.db.connector.DBConnector`, so that connector components can use e.g., ``self.db.pool`` or ``self.db.model``. In the unusual case that a connector component needs access to the master, the easiest path is ``self.db.master``.hlj.hthwh~hh}r.(h]h]h]h]h]uhMhhh]r.(hXA reference to the r.r.}r.(hkXA reference to the hlj.ubj')r.}r.(hkX+:class:`~buildbot.db.connector.DBConnector`r.hlj.hthwh~j+h}r.(UreftypeXclassj-j.X!buildbot.db.connector.DBConnectorU refdomainXpyr.h]h]U refexplicith]h]h]j0j1j2jT.j3jW.uhMh]r.h)r.}r.(hkj.h}r.(h]h]r.(j9j.Xpy-classr.eh]h]h]uhlj.h]r.hX DBConnectorr.r.}r.(hkUhlj.ubah~hubaubhX-, so that connector components can use e.g., r.r.}r.(hkX-, so that connector components can use e.g., hlj.ubh)r.}r.(hkX``self.db.pool``h}r.(h]h]h]h]h]uhlj.h]r.hX self.db.poolr.r.}r.(hkUhlj.ubah~hubhX or r.r.}r.(hkX or hlj.ubh)r.}r.(hkX``self.db.model``h}r.(h]h]h]h]h]uhlj.h]r.hX self.db.modelr.r.}r.(hkUhlj.ubah~hubhXb. In the unusual case that a connector component needs access to the master, the easiest path is r.r.}r.(hkXb. In the unusual case that a connector component needs access to the master, the easiest path is hlj.ubh)r.}r.(hkX``self.db.master``h}r.(h]h]h]h]h]uhlj.h]r.hXself.db.masterr.r.}r.(hkUhlj.ubah~hubhX.r.}r.(hkX.hlj.ubeubaubeubeubeubeubhnhm)r.}r.(hkUhlhphthwh~hh}r.(h]h]h]h]r.(Xmodule-buildbot.db.modelr.Udatabase-schemar.eh]r.h9auhMhhh]r.(h)r.}r.(hkXDatabase Schemar.hlj.hthwh~hh}r.(h]h]h]h]h]uhMhhh]r.hXDatabase Schemar.r.}r.(hkj.hlj.ubaubjh)r.}r.(hkUhlj.hthwh~jkh}r.(h]h]h]h]h]Uentries]r.(jnXbuildbot.db.model (module)Xmodule-buildbot.db.modelUtr.auhM hhh]ubh)r.}r.(hkXDatabase connector methods access the database through SQLAlchemy, which requires access to Python objects representing the database tables. That is handled through the model.r.hlj.hthwh~hh}r.(h]h]h]h]h]uhM hhh]r.hXDatabase connector methods access the database through SQLAlchemy, which requires access to Python objects representing the database tables. That is handled through the model.r.r.}r.(hkj.hlj.ubaubjh)r.}r.(hkUhlj.htNh~jkh}r.(h]h]h]h]h]Uentries]r.(jnX"Model (class in buildbot.db.model)hbUtr.auhNhhh]ubj)r.}r.(hkUhlj.htNh~jh}r.(jjXpyh]h]h]h]h]jXclassr.jj.uhNhhh]r.(j)r.}r.(hkXModelr.hlj.hthwh~jh}r.(h]r/hbajXbuildbot.db.modelr/h]h]h]h]r/hbajj.jUjuhM6hhh]r/(j)r/}r/(hkXclass hlj.hthwh~jh}r/(h]h]h]h]h]uhM6hhh]r/hXclass r/r /}r /(hkUhlj/ubaubj)r /}r /(hkXbuildbot.db.model.hlj.hthwh~jh}r /(h]h]h]h]h]uhM6hhh]r/hXbuildbot.db.model.r/r/}r/(hkUhlj /ubaubj)r/}r/(hkj.hlj.hthwh~jh}r/(h]h]h]h]h]uhM6hhh]r/hXModelr/r/}r/(hkUhlj/ubaubeubj)r/}r/(hkUhlj.hthwh~jh}r/(h]h]h]h]h]uhM6hhh]r/(h)r/}r/(hkXThis class contains the canonical description of the buildbot schema, It is presented in the form of SQLAlchemy :class:`Table ` instances, as class variables. At runtime, the model is available at ``master.db.model``, so for example the ``buildrequests`` table can be referred to as ``master.db.model.buildrequests``, and columns are available in its ``c`` attribute.hlj/hthwh~hh}r/(h]h]h]h]h]uhMhhh]r /(hXpThis class contains the canonical description of the buildbot schema, It is presented in the form of SQLAlchemy r!/r"/}r#/(hkXpThis class contains the canonical description of the buildbot schema, It is presented in the form of SQLAlchemy hlj/ubj')r$/}r%/(hkX3:class:`Table `r&/hlj/hthwh~j+h}r'/(UreftypeXclassj-j.X"sqlalchemy:sqlalchemy.schema.TableU refdomainXpyr(/h]h]U refexplicith]h]h]j0j1j2j.j3j/uhMh]r)/h)r*/}r+/(hkj&/h}r,/(h]h]r-/(j9j(/Xpy-classr./eh]h]h]uhlj$/h]r//hXTabler0/r1/}r2/(hkUhlj*/ubah~hubaubhXG instances, as class variables. At runtime, the model is available at r3/r4/}r5/(hkXG instances, as class variables. At runtime, the model is available at hlj/ubh)r6/}r7/(hkX``master.db.model``h}r8/(h]h]h]h]h]uhlj/h]r9/hXmaster.db.modelr:/r;/}r/}r?/(hkX, so for example the hlj/ubh)r@/}rA/(hkX``buildrequests``h}rB/(h]h]h]h]h]uhlj/h]rC/hX buildrequestsrD/rE/}rF/(hkUhlj@/ubah~hubhX table can be referred to as rG/rH/}rI/(hkX table can be referred to as hlj/ubh)rJ/}rK/(hkX!``master.db.model.buildrequests``h}rL/(h]h]h]h]h]uhlj/h]rM/hXmaster.db.model.buildrequestsrN/rO/}rP/(hkUhljJ/ubah~hubhX#, and columns are available in its rQ/rR/}rS/(hkX#, and columns are available in its hlj/ubh)rT/}rU/(hkX``c``h}rV/(h]h]h]h]h]uhlj/h]rW/hXcrX/}rY/(hkUhljT/ubah~hubhX attribute.rZ/r[/}r\/(hkX attribute.hlj/ubeubh)r]/}r^/(hkXThe source file, :bb:src:`master/buildbot/db/model.py`, contains comments describing each table; that information is not replicated in this documentation.hlj/hthwh~hh}r_/(h]h]h]h]h]uhMhhh]r`/(hXThe source file, ra/rb/}rc/(hkXThe source file, hlj]/ubj)rd/}re/(hkUh}rf/(j0,Xmaster/buildbot/db/model.pyrg/j XLhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/db/model.pyh]h]h]h]h]uhlj]/h]rh/h)ri/}rj/(hkjg/h}rk/(h]h]h]h]h]uhljd/h]rl/hXmaster/buildbot/db/model.pyrm/rn/}ro/(hkUhlji/ubah~hubah~jubhXd, contains comments describing each table; that information is not replicated in this documentation.rp/rq/}rr/(hkXd, contains comments describing each table; that information is not replicated in this documentation.hlj]/ubeubh)rs/}rt/(hkXNote that the model is not used for new installations or upgrades of the Buildbot database. See :ref:`Modifying-the-Database-Schema` for more information.hlj/hthwh~hh}ru/(h]h]h]h]h]uhMhhh]rv/(hXaNote that the model is not used for new installations or upgrades of the Buildbot database. See rw/rx/}ry/(hkXaNote that the model is not used for new installations or upgrades of the Buildbot database. See hljs/ubj')rz/}r{/(hkX$:ref:`Modifying-the-Database-Schema`r|/hljs/hthwh~j+h}r}/(UreftypeXrefj-j.Xmodifying-the-database-schemaU refdomainXstdr~/h]h]U refexplicith]h]h]j0j1uhMh]r/jw)r/}r/(hkj|/h}r/(h]h]r/(j9j~/Xstd-refr/eh]h]h]uhljz/h]r/hXModifying-the-Database-Schemar/r/}r/(hkUhlj/ubah~jubaubhX for more information.r/r/}r/(hkX for more information.hljs/ubeubjh)r/}r/(hkUhlj/hthwh~jkh}r/(h]h]h]h]h]Uentries]r/(jnX,metadata (buildbot.db.model.Model attribute)hUtr/auhNhhh]ubj)r/}r/(hkUhlj/hthwh~jh}r/(jjXpyh]h]h]h]h]jX attributer/jj/uhNhhh]r/(j)r/}r/(hkXmetadatar/hlj/hthwh~jh}r/(h]r/hajj/h]h]h]h]r/hajXModel.metadatajj.juhM(hhh]r/j)r/}r/(hkj/hlj/hthwh~jh}r/(h]h]h]h]h]uhM(hhh]r/hXmetadatar/r/}r/(hkUhlj/ubaubaubj)r/}r/(hkUhlj/hthwh~jh}r/(h]h]h]h]h]uhM(hhh]r/h)r/}r/(hkXThe model object also has a ``metadata`` attribute containing a :class:`MetaData ` instance. Connector methods should not need to access this object. The metadata is not bound to an engine.hlj/hthwh~hh}r/(h]h]h]h]h]uhM$hhh]r/(hXThe model object also has a r/r/}r/(hkXThe model object also has a hlj/ubh)r/}r/(hkX ``metadata``h}r/(h]h]h]h]h]uhlj/h]r/hXmetadatar/r/}r/(hkUhlj/ubah~hubhX attribute containing a r/r/}r/(hkX attribute containing a hlj/ubj')r/}r/(hkX9:class:`MetaData `r/hlj/hthwh~j+h}r/(UreftypeXclassj-j.X%sqlalchemy:sqlalchemy.schema.MetaDataU refdomainXpyr/h]h]U refexplicith]h]h]j0j1j2j.j3j/uhM$h]r/h)r/}r/(hkj/h}r/(h]h]r/(j9j/Xpy-classr/eh]h]h]uhlj/h]r/hXMetaDatar/r/}r/(hkUhlj/ubah~hubaubhXl instance. Connector methods should not need to access this object. The metadata is not bound to an engine.r/r/}r/(hkXl instance. Connector methods should not need to access this object. The metadata is not bound to an engine.hlj/ubeubaubeubh)r/}r/(hkXHThe :py:class:`Model` class also defines some migration-related methods:r/hlj/hthwh~hh}r/(h]h]h]h]h]uhM)hhh]r/(hXThe r/r/}r/(hkXThe hlj/ubj')r/}r/(hkX:py:class:`Model`r/hlj/hthwh~j+h}r/(UreftypeXclassj-j.XModelU refdomainXpyr/h]h]U refexplicith]h]h]j0j1j2j.j3j/uhM)h]r/h)r/}r/(hkj/h}r/(h]h]r/(j9j/Xpy-classr/eh]h]h]uhlj/h]r/hXModelr/r/}r/(hkUhlj/ubah~hubaubhX3 class also defines some migration-related methods:r/r/}r/(hkX3 class also defines some migration-related methods:hlj/ubeubjh)r/}r/(hkUhlj/hthwh~jkh}r/(h]h]h]h]h]Uentries]r/(jnX-is_current() (buildbot.db.model.Model method)h%Utr/auhNhhh]ubj)r/}r/(hkUhlj/hthwh~jh}r/(jjXpyh]h]h]h]h]jXmethodr/jj/uhNhhh]r/(j)r/}r/(hkX is_current()hlj/hthwh~jh}r/(h]r/h%ajj/h]h]h]h]r/h%ajXModel.is_currentjj.juhM0hhh]r/(j)r/}r/(hkX is_currenthlj/hthwh~jh}r/(h]h]h]h]h]uhM0hhh]r/hX is_currentr/r/}r/(hkUhlj/ubaubjA)r/}r/(hkUhlj/hthwh~jDh}r/(h]h]h]h]h]uhM0hhh]ubeubj)r/}r0(hkUhlj/hthwh~jh}r0(h]h]h]h]h]uhM0hhh]r0(jT)r0}r0(hkUhlj/hthwh~jWh}r0(h]h]h]h]h]uhNhhh]r0jZ)r0}r0(hkUh}r 0(h]h]h]h]h]uhlj0h]r 0(j_)r 0}r 0(hkUh}r 0(h]h]h]h]h]uhlj0h]r0hXReturnsr0r0}r0(hkUhlj 0ubah~jgubjh)r0}r0(hkUh}r0(h]h]h]h]h]uhlj0h]r0h)r0}r0(hkUh}r0(h]h]h]h]h]uhlj0h]r0hXboolean via Deferredr0r0}r0(hkXboolean via Deferredhlj0ubah~hubah~jubeh~jubaubh)r0}r0(hkX:Returns true if the current database's version is current.r0hlj/hthwh~hh}r 0(h]h]h]h]h]uhM/hhh]r!0hX:Returns true if the current database's version is current.r"0r#0}r$0(hkj0hlj0ubaubeubeubjh)r%0}r&0(hkUhlj/hthwh~jkh}r'0(h]h]h]h]h]Uentries]r(0(jnX*upgrade() (buildbot.db.model.Model method)h\Utr)0auhNhhh]ubj)r*0}r+0(hkUhlj/hthwh~jh}r,0(jjXpyh]h]h]h]h]jXmethodr-0jj-0uhNhhh]r.0(j)r/0}r00(hkX upgrade()r10hlj*0hthwh~jh}r20(h]r30h\ajj/h]h]h]h]r40h\ajX Model.upgradejj.juhM5hhh]r50(j)r60}r70(hkXupgradehlj/0hthwh~jh}r80(h]h]h]h]h]uhM5hhh]r90hXupgrader:0r;0}r<0(hkUhlj60ubaubjA)r=0}r>0(hkUhlj/0hthwh~jDh}r?0(h]h]h]h]h]uhM5hhh]ubeubj)r@0}rA0(hkUhlj*0hthwh~jh}rB0(h]h]h]h]h]uhM5hhh]rC0(jT)rD0}rE0(hkUhlj@0hthwh~jWh}rF0(h]h]h]h]h]uhNhhh]rG0jZ)rH0}rI0(hkUh}rJ0(h]h]h]h]h]uhljD0h]rK0(j_)rL0}rM0(hkUh}rN0(h]h]h]h]h]uhljH0h]rO0hXReturnsrP0rQ0}rR0(hkUhljL0ubah~jgubjh)rS0}rT0(hkUh}rU0(h]h]h]h]h]uhljH0h]rV0h)rW0}rX0(hkUh}rY0(h]h]h]h]h]uhljS0h]rZ0hXDeferredr[0r\0}r]0(hkXDeferredr^0hljW0ubah~hubah~jubeh~jubaubh)r_0}r`0(hkX8Upgrades the database to the most recent schema version.ra0hlj@0hthwh~hh}rb0(h]h]h]h]h]uhM5hhh]rc0hX8Upgrades the database to the most recent schema version.rd0re0}rf0(hkja0hlj_0ubaubeubeubeubeubeubhm)rg0}rh0(hkUhlhphthwh~hh}ri0(h]h]h]h]rj0Ucachingrk0ah]rl0haauhM8hhh]rm0(h)rn0}ro0(hkXCachingrp0hljg0hthwh~hh}rq0(h]h]h]h]h]uhM8hhh]rr0hXCachingrs0rt0}ru0(hkjp0hljn0ubaubh)rv0}rw0(hkXConnector component methods that get an object based on an ID are good candidates for caching. The :func:`~buildbot.db.base.cached` decorator makes this automatic:hljg0hthwh~hh}rx0(h]h]h]h]h]uhM<hhh]ry0(hXdConnector component methods that get an object based on an ID are good candidates for caching. The rz0r{0}r|0(hkXdConnector component methods that get an object based on an ID are good candidates for caching. The hljv0ubj')r}0}r~0(hkX :func:`~buildbot.db.base.cached`r0hljv0hthwh~j+h}r0(UreftypeXfuncj-j.Xbuildbot.db.base.cachedU refdomainXpyr0h]h]U refexplicith]h]h]j0j1j2Nj3Xbuildbot.db.baser0uhM<h]r0h)r0}r0(hkj0h}r0(h]h]r0(j9j0Xpy-funcr0eh]h]h]uhlj}0h]r0hXcachedr0r0}r0(hkUhlj0ubah~hubaubhX decorator makes this automatic:r0r0}r0(hkX decorator makes this automatic:hljv0ubeubjh)r0}r0(hkUhljg0hthwh~jkh}r0(h]h]h]h]h]Uentries]r0(jnX%cached() (in module buildbot.db.base)hAUtr0auhNhhh]ubj)r0}r0(hkUhljg0hthwh~jh}r0(jjXpyh]h]h]h]h]jXfunctionr0jj0uhNhhh]r0(j)r0}r0(hkXcached(cachename)r0hlj0hthwh~jh}r0(h]r0hAajj0h]h]h]h]r0hAajXcachedr0jUjuhMNhhh]r0(j)r0}r0(hkXbuildbot.db.base.hlj0hthwh~jh}r0(h]h]h]h]h]uhMNhhh]r0hXbuildbot.db.base.r0r0}r0(hkUhlj0ubaubj)r0}r0(hkj0hlj0hthwh~jh}r0(h]h]h]h]h]uhMNhhh]r0hXcachedr0r0}r0(hkUhlj0ubaubjA)r0}r0(hkUhlj0hthwh~jDh}r0(h]h]h]h]h]uhMNhhh]r0jG)r0}r0(hkX cachenameh}r0(h]h]h]h]h]uhlj0h]r0hX cachenamer0r0}r0(hkUhlj0ubah~jOubaubeubj)r0}r0(hkUhlj0hthwh~jh}r0(h]h]h]h]h]uhMNhhh]r0(jT)r0}r0(hkUhlj0hthwh~jWh}r0(h]h]h]h]h]uhNhhh]r0jZ)r0}r0(hkUh}r0(h]h]h]h]h]uhlj0h]r0(j_)r0}r0(hkUh}r0(h]h]h]h]h]uhlj0h]r0hX Parametersr0r0}r0(hkUhlj0ubah~jgubjh)r0}r0(hkUh}r0(h]h]h]h]h]uhlj0h]r0h)r0}r0(hkUh}r0(h]h]h]h]h]uhlj0h]r0(jq)r0}r0(hkX cache_nameh}r0(h]h]h]h]h]uhlj0h]r0hX cache_namer0r0}r0(hkUhlj0ubah~jyubhX -- r0r0}r0(hkUhlj0ubhXname of the cache to user0r0}r0(hkXname of the cache to user0hlj0ubeh~hubah~jubeh~jubaubh)r0}r0(hkXA decorator for "getter" functions that fetch an object from the database based on a single key. The wrapped method will only be called if the named cache does not contain the key.r0hlj0hthwh~hh}r0(h]h]h]h]h]uhMDhhh]r0hXA decorator for "getter" functions that fetch an object from the database based on a single key. The wrapped method will only be called if the named cache does not contain the key.r0r0}r0(hkj0hlj0ubaubh)r0}r0(hkXThe wrapped function must take one argument (the key); the wrapper will take a key plus an optional ``no_cache`` argument which, if true, will cause it to invoke the underlying method even if the key is in the cache.hlj0hthwh~hh}r0(h]h]h]h]h]uhMHhhh]r0(hXdThe wrapped function must take one argument (the key); the wrapper will take a key plus an optional r0r0}r0(hkXdThe wrapped function must take one argument (the key); the wrapper will take a key plus an optional hlj0ubh)r0}r0(hkX ``no_cache``h}r0(h]h]h]h]h]uhlj0h]r0hXno_cacher0r0}r0(hkUhlj0ubah~hubhXh argument which, if true, will cause it to invoke the underlying method even if the key is in the cache.r0r0}r0(hkXh argument which, if true, will cause it to invoke the underlying method even if the key is in the cache.hlj0ubeubh)r0}r0(hkXfThe resulting method will have a ``cache`` attribute which can be used to access the underlying cache.hlj0hthwh~hh}r0(h]h]h]h]h]uhMLhhh]r1(hX!The resulting method will have a r1r1}r1(hkX!The resulting method will have a hlj0ubh)r1}r1(hkX ``cache``h}r1(h]h]h]h]h]uhlj0h]r1hXcacher1r 1}r 1(hkUhlj1ubah~hubhX< attribute which can be used to access the underlying cache.r 1r 1}r 1(hkX< attribute which can be used to access the underlying cache.hlj0ubeubeubeubh)r1}r1(hkXIn most cases, getter methods return a well-defined dictionary. Unfortunately, Python does not handle weak references to bare dictionaries, so components must instantiate a subclass of ``dict``. The whole assembly looks something like this::hljg0hthwh~hh}r1(h]h]h]h]h]uhMOhhh]r1(hXIn most cases, getter methods return a well-defined dictionary. Unfortunately, Python does not handle weak references to bare dictionaries, so components must instantiate a subclass of r1r1}r1(hkXIn most cases, getter methods return a well-defined dictionary. Unfortunately, Python does not handle weak references to bare dictionaries, so components must instantiate a subclass of hlj1ubh)r1}r1(hkX``dict``h}r1(h]h]h]h]h]uhlj1h]r1hXdictr1r1}r1(hkUhlj1ubah~hubhX0. The whole assembly looks something like this:r1r1}r1(hkX0. The whole assembly looks something like this:hlj1ubeubcdocutils.nodes literal_block r1)r 1}r!1(hkX2class ThDict(dict): pass class ThingConnectorComponent(base.DBConnectorComponent): @base.cached('thdicts') def getThing(self, thid): def thd(conn): ... thdict = ThDict(thid=thid, attr=row.attr, ...) return thdict return self.db.pool.do(thd)hljg0hthwh~U literal_blockr"1h}r#1(jdjeh]h]h]h]h]uhMThhh]r$1hX2class ThDict(dict): pass class ThingConnectorComponent(base.DBConnectorComponent): @base.cached('thdicts') def getThing(self, thid): def thd(conn): ... thdict = ThDict(thid=thid, attr=row.attr, ...) return thdict return self.db.pool.do(thd)r%1r&1}r'1(hkUhlj 1ubaubeubj+eubhthwh~hh}r(1(h]h]h]h]r)1(Xmodule-buildbot.db.poolr*1Udirect-database-accessr+1eh]r,1hauhMhhh]r-1(h)r.1}r/1(hkXDirect Database Accessr01hlhnhthwh~hh}r11(h]h]h]h]h]uhMhhh]r21hXDirect Database Accessr31r41}r51(hkj01hlj.1ubaubjh)r61}r71(hkUhlhnhthwh~jkh}r81(h]h]h]h]h]Uentries]r91(jnXbuildbot.db.pool (module)Xmodule-buildbot.db.poolUtr:1auhMhhh]ubh)r;1}r<1(hkXThe connectors all use `SQLAlchemy Core `_ as a wrapper around database client drivers. Unfortunately, SQLAlchemy is a synchronous library, so some extra work is required to use it in an asynchronous context like Buildbot. This is accomplished by deferring all database operations to threads, and returning a Deferred. The :class:`~buildbot.db.pool.Pool` class takes care of the details.hlhnhthwh~hh}r=1(h]h]h]h]h]uhMhhh]r>1(hXThe connectors all use r?1r@1}rA1(hkXThe connectors all use hlj;1ubj)rB1}rC1(hkX>`SQLAlchemy Core `_h}rD1(UnameXSQLAlchemy Corej X)http://www.sqlalchemy.org/docs/index.htmlrE1h]h]h]h]h]uhlj;1h]rF1hXSQLAlchemy CorerG1rH1}rI1(hkUhljB1ubah~jubh{)rJ1}rK1(hkX, jKhlj;1h~hh}rL1(UrefurijE1h]rM1Uid1rN1ah]h]rO1Xsqlalchemy corerP1ah]h]uh]ubhX as a wrapper around database client drivers. Unfortunately, SQLAlchemy is a synchronous library, so some extra work is required to use it in an asynchronous context like Buildbot. This is accomplished by deferring all database operations to threads, and returning a Deferred. The rQ1rR1}rS1(hkX as a wrapper around database client drivers. Unfortunately, SQLAlchemy is a synchronous library, so some extra work is required to use it in an asynchronous context like Buildbot. This is accomplished by deferring all database operations to threads, and returning a Deferred. The hlj;1ubj')rT1}rU1(hkX:class:`~buildbot.db.pool.Pool`rV1hlj;1hthwh~j+h}rW1(UreftypeXclassj-j.Xbuildbot.db.pool.PoolU refdomainXpyrX1h]h]U refexplicith]h]h]j0j1j2Nj3Xbuildbot.db.poolrY1uhMh]rZ1h)r[1}r\1(hkjV1h}r]1(h]h]r^1(j9jX1Xpy-classr_1eh]h]h]uhljT1h]r`1hXPoolra1rb1}rc1(hkUhlj[1ubah~hubaubhX! class takes care of the details.rd1re1}rf1(hkX! class takes care of the details.hlj;1ubeubh)rg1}rh1(hkX*A connector method should look like this::ri1hlhnhthwh~hh}rj1(h]h]h]h]h]uhMhhh]rk1hX)A connector method should look like this:rl1rm1}rn1(hkX)A connector method should look like this:hljg1ubaubj1)ro1}rp1(hkXdef myMethod(self, arg1, arg2): def thd(conn): q = ... # construct a query for row in conn.execute(q): ... # do something with the results return ... # return an interesting value return self.db.pool.do(thd)hlhnhthwh~j"1h}rq1(jdjeh]h]h]h]h]uhMhhh]rr1hXdef myMethod(self, arg1, arg2): def thd(conn): q = ... # construct a query for row in conn.execute(q): ... # do something with the results return ... # return an interesting value return self.db.pool.do(thd)rs1rt1}ru1(hkUhljo1ubaubh)rv1}rw1(hkXPicking that apart, the body of the method defines a function named ``thd`` taking one argument, a :class:`Connection ` object. It then calls ``self.db.pool.do``, passing the ``thd`` function. This function is called in a thread, and can make blocking calls to SQLAlchemy as desired. The ``do`` method will return a Deferred that will fire with the return value of ``thd``, or with a failure representing any exceptions raised by ``thd``.hlhnhthwh~hh}rx1(h]h]h]h]h]uhMhhh]ry1(hXDPicking that apart, the body of the method defines a function named rz1r{1}r|1(hkXDPicking that apart, the body of the method defines a function named hljv1ubh)r}1}r~1(hkX``thd``h}r1(h]h]h]h]h]uhljv1h]r1hXthdr1r1}r1(hkUhlj}1ubah~hubhX taking one argument, a r1r1}r1(hkX taking one argument, a hljv1ubj')r1}r1(hkXB:class:`Connection `r1hljv1hthwh~j+h}r1(UreftypeXclassj-j.X,sqlalchemy:sqlalchemy.engine.base.ConnectionU refdomainXpyr1h]h]U refexplicith]h]h]j0j1j2Nj3jY1uhMh]r1h)r1}r1(hkj1h}r1(h]h]r1(j9j1Xpy-classr1eh]h]h]uhlj1h]r1hX Connectionr1r1}r1(hkUhlj1ubah~hubaubhX object. It then calls r1r1}r1(hkX object. It then calls hljv1ubh)r1}r1(hkX``self.db.pool.do``h}r1(h]h]h]h]h]uhljv1h]r1hXself.db.pool.dor1r1}r1(hkUhlj1ubah~hubhX, passing the r1r1}r1(hkX, passing the hljv1ubh)r1}r1(hkX``thd``h}r1(h]h]h]h]h]uhljv1h]r1hXthdr1r1}r1(hkUhlj1ubah~hubhXl function. This function is called in a thread, and can make blocking calls to SQLAlchemy as desired. The r1r1}r1(hkXl function. This function is called in a thread, and can make blocking calls to SQLAlchemy as desired. The hljv1ubh)r1}r1(hkX``do``h}r1(h]h]h]h]h]uhljv1h]r1hXdor1r1}r1(hkUhlj1ubah~hubhXG method will return a Deferred that will fire with the return value of r1r1}r1(hkXG method will return a Deferred that will fire with the return value of hljv1ubh)r1}r1(hkX``thd``h}r1(h]h]h]h]h]uhljv1h]r1hXthdr1r1}r1(hkUhlj1ubah~hubhX:, or with a failure representing any exceptions raised by r1r1}r1(hkX:, or with a failure representing any exceptions raised by hljv1ubh)r1}r1(hkX``thd``h}r1(h]h]h]h]h]uhljv1h]r1hXthdr1r1}r1(hkUhlj1ubah~hubhX.r1}r1(hkX.hljv1ubeubh)r1}r1(hkXThe return value of ``thd`` must not be an SQLAlchemy object - in particular, any :class:`ResultProxy ` objects must be parsed into lists or other data structures before they are returned.hlhnhthwh~hh}r1(h]h]h]h]h]uhMhhh]r1(hXThe return value of r1r1}r1(hkXThe return value of hlj1ubh)r1}r1(hkX``thd``h}r1(h]h]h]h]h]uhlj1h]r1hXthdr1r1}r1(hkUhlj1ubah~hubhX7 must not be an SQLAlchemy object - in particular, any r1r1}r1(hkX7 must not be an SQLAlchemy object - in particular, any hlj1ubj')r1}r1(hkXD:class:`ResultProxy `r1hlj1hthwh~j+h}r1(UreftypeXclassj-j.X-sqlalchemy:sqlalchemy.engine.base.ResultProxyU refdomainXpyr1h]h]U refexplicith]h]h]j0j1j2Nj3jY1uhMh]r1h)r1}r1(hkj1h}r1(h]h]r1(j9j1Xpy-classr1eh]h]h]uhlj1h]r1hX ResultProxyr1r1}r1(hkUhlj1ubah~hubaubhXU objects must be parsed into lists or other data structures before they are returned.r1r1}r1(hkXU objects must be parsed into lists or other data structures before they are returned.hlj1ubeubj-)r1}r1(hkXAs the name ``thd`` indicates, the function runs in a thread. It should not interact with any other part of Buildbot, nor with any of the Twisted components that expect to be accessed from the main thread -- the reactor, Deferreds, etc.hlhnhthwh~j-h}r1(h]h]h]h]h]uhNhhh]r1h)r1}r1(hkXAs the name ``thd`` indicates, the function runs in a thread. It should not interact with any other part of Buildbot, nor with any of the Twisted components that expect to be accessed from the main thread -- the reactor, Deferreds, etc.hlj1hthwh~hh}r1(h]h]h]h]h]uhMh]r1(hX As the name r1r1}r1(hkX As the name hlj1ubh)r1}r1(hkX``thd``h}r1(h]h]h]h]h]uhlj1h]r1hXthdr1r1}r1(hkUhlj1ubah~hubhX indicates, the function runs in a thread. It should not interact with any other part of Buildbot, nor with any of the Twisted components that expect to be accessed from the main thread -- the reactor, Deferreds, etc.r1r2}r2(hkX indicates, the function runs in a thread. It should not interact with any other part of Buildbot, nor with any of the Twisted components that expect to be accessed from the main thread -- the reactor, Deferreds, etc.hlj1ubeubaubh)r2}r2(hkXQueries can be constructed using any of the SQLAlchemy core methods, using tables from :class:`~buildbot.db.model.Model`, and executed with the connection object, ``conn``.hlhnhthwh~hh}r2(h]h]h]h]h]uhMhhh]r2(hXWQueries can be constructed using any of the SQLAlchemy core methods, using tables from r2r2}r2(hkXWQueries can be constructed using any of the SQLAlchemy core methods, using tables from hlj2ubj')r 2}r 2(hkX!:class:`~buildbot.db.model.Model`r 2hlj2hthwh~j+h}r 2(UreftypeXclassj-j.Xbuildbot.db.model.ModelU refdomainXpyr 2h]h]U refexplicith]h]h]j0j1j2Nj3jY1uhMh]r2h)r2}r2(hkj 2h}r2(h]h]r2(j9j 2Xpy-classr2eh]h]h]uhlj 2h]r2hXModelr2r2}r2(hkUhlj2ubah~hubaubhX+, and executed with the connection object, r2r2}r2(hkX+, and executed with the connection object, hlj2ubh)r2}r2(hkX``conn``h}r2(h]h]h]h]h]uhlj2h]r2hXconnr2r 2}r!2(hkUhlj2ubah~hubhX.r"2}r#2(hkX.hlj2ubeubjh)r$2}r%2(hkUhlhnhtNh~jkh}r&2(h]h]h]h]h]Uentries]r'2(jnX(DBThreadPool (class in buildbot.db.pool)hWUtr(2auhNhhh]ubj)r)2}r*2(hkUhlhnhtNh~jh}r+2(jjXpyh]h]h]h]h]jXclassr,2jj,2uhNhhh]r-2(j)r.2}r/2(hkX DBThreadPoolr02hlj)2hthwh~jh}r12(h]r22hWajjY1h]h]h]h]r32hWajj02jUjuhMhhh]r42(j)r52}r62(hkXclass hlj.2hthwh~jh}r72(h]h]h]h]h]uhMhhh]r82hXclass r92r:2}r;2(hkUhlj52ubaubj)r<2}r=2(hkXbuildbot.db.pool.hlj.2hthwh~jh}r>2(h]h]h]h]h]uhMhhh]r?2hXbuildbot.db.pool.r@2rA2}rB2(hkUhlj<2ubaubj)rC2}rD2(hkj02hlj.2hthwh~jh}rE2(h]h]h]h]h]uhMhhh]rF2hX DBThreadPoolrG2rH2}rI2(hkUhljC2ubaubeubj)rJ2}rK2(hkUhlj)2hthwh~jh}rL2(h]h]h]h]h]uhMhhh]rM2(jh)rN2}rO2(hkUhljJ2hthwh~jkh}rP2(h]h]h]h]h]Uentries]rQ2(jnX+do() (buildbot.db.pool.DBThreadPool method)hUtrR2auhNhhh]ubj)rS2}rT2(hkUhljJ2hthwh~jh}rU2(jjXpyh]h]h]h]h]jXmethodrV2jjV2uhNhhh]rW2(j)rX2}rY2(hkXdo(callable, ...)hljS2hthwh~jh}rZ2(h]r[2hajjY1h]h]h]h]r\2hajXDBThreadPool.dojj02juhMhhh]r]2(j)r^2}r_2(hkXdohljX2hthwh~jh}r`2(h]h]h]h]h]uhMhhh]ra2hXdorb2rc2}rd2(hkUhlj^2ubaubjA)re2}rf2(hkUhljX2hthwh~jDh}rg2(h]h]h]h]h]uhMhhh]rh2(jG)ri2}rj2(hkXcallableh}rk2(h]h]h]h]h]uhlje2h]rl2hXcallablerm2rn2}ro2(hkUhlji2ubah~jOubjG)rp2}rq2(hkX...h}rr2(h]h]h]h]h]uhlje2h]rs2hX...rt2ru2}rv2(hkUhljp2ubah~jOubeubeubj)rw2}rx2(hkUhljS2hthwh~jh}ry2(h]h]h]h]h]uhMhhh]rz2(jT)r{2}r|2(hkUhljw2hthwh~jWh}r}2(h]h]h]h]h]uhNhhh]r~2jZ)r2}r2(hkUh}r2(h]h]h]h]h]uhlj{2h]r2(j_)r2}r2(hkUh}r2(h]h]h]h]h]uhlj2h]r2hXReturnsr2r2}r2(hkUhlj2ubah~jgubjh)r2}r2(hkUh}r2(h]h]h]h]h]uhlj2h]r2h)r2}r2(hkUh}r2(h]h]h]h]h]uhlj2h]r2hXDeferredr2r2}r2(hkXDeferredhlj2ubah~hubah~jubeh~jubaubh)r2}r2(hkXCall ``callable`` in a thread, with a :class:`Connection ` object as first argument. Returns a deferred that will fire with the results of the callable, or with a failure representing any exception raised during its execution.hljw2hthwh~hh}r2(h]h]h]h]h]uhMhhh]r2(hXCall r2r2}r2(hkXCall hlj2ubh)r2}r2(hkX ``callable``h}r2(h]h]h]h]h]uhlj2h]r2hXcallabler2r2}r2(hkUhlj2ubah~hubhX in a thread, with a r2r2}r2(hkX in a thread, with a hlj2ubj')r2}r2(hkXB:class:`Connection `r2hlj2hthwh~j+h}r2(UreftypeXclassj-j.X,sqlalchemy:sqlalchemy.engine.base.ConnectionU refdomainXpyr2h]h]U refexplicith]h]h]j0j1j2j02j3jY1uhMh]r2h)r2}r2(hkj2h}r2(h]h]r2(j9j2Xpy-classr2eh]h]h]uhlj2h]r2hX Connectionr2r2}r2(hkUhlj2ubah~hubaubhX object as first argument. Returns a deferred that will fire with the results of the callable, or with a failure representing any exception raised during its execution.r2r2}r2(hkX object as first argument. Returns a deferred that will fire with the results of the callable, or with a failure representing any exception raised during its execution.hlj2ubeubh)r2}r2(hkXJAny additional positional or keyword arguments are passed to ``callable``.hljw2hthwh~hh}r2(h]h]h]h]h]uhMhhh]r2(hX=Any additional positional or keyword arguments are passed to r2r2}r2(hkX=Any additional positional or keyword arguments are passed to hlj2ubh)r2}r2(hkX ``callable``h}r2(h]h]h]h]h]uhlj2h]r2hXcallabler2r2}r2(hkUhlj2ubah~hubhX.r2}r2(hkX.hlj2ubeubeubeubjh)r2}r2(hkUhljJ2hthwh~jkh}r2(h]h]h]h]h]Uentries]r2(jnX7do_with_engine() (buildbot.db.pool.DBThreadPool method)h?Utr2auhNhhh]ubj)r2}r2(hkUhljJ2hthwh~jh}r2(jjXpyh]h]h]h]h]jXmethodr2jj2uhNhhh]r2(j)r2}r2(hkXdo_with_engine(callable, ...)hlj2hthwh~jh}r2(h]r2h?ajjY1h]h]h]h]r2h?ajXDBThreadPool.do_with_enginejj02juhMhhh]r2(j)r2}r2(hkXdo_with_enginehlj2hthwh~jh}r2(h]h]h]h]h]uhMhhh]r2hXdo_with_enginer2r2}r2(hkUhlj2ubaubjA)r2}r2(hkUhlj2hthwh~jDh}r2(h]h]h]h]h]uhMhhh]r2(jG)r2}r2(hkXcallableh}r2(h]h]h]h]h]uhlj2h]r2hXcallabler2r2}r2(hkUhlj2ubah~jOubjG)r2}r2(hkX...h}r2(h]h]h]h]h]uhlj2h]r2hX...r2r2}r2(hkUhlj2ubah~jOubeubeubj)r2}r2(hkUhlj2hthwh~jh}r2(h]h]h]h]h]uhMhhh]r2(jT)r2}r2(hkUhlj2hthwh~jWh}r2(h]h]h]h]h]uhNhhh]r2jZ)r2}r2(hkUh}r2(h]h]h]h]h]uhlj2h]r2(j_)r2}r2(hkUh}r2(h]h]h]h]h]uhlj2h]r3hXReturnsr3r3}r3(hkUhlj2ubah~jgubjh)r3}r3(hkUh}r3(h]h]h]h]h]uhlj2h]r3h)r3}r 3(hkUh}r 3(h]h]h]h]h]uhlj3h]r 3hXDeferredr 3r 3}r3(hkXDeferredhlj3ubah~hubah~jubeh~jubaubh)r3}r3(hkXSimilar to :meth:`do`, call ``callable`` in a thread, but with an :class:`Engine ` object as first argument.hlj2hthwh~hh}r3(h]h]h]h]h]uhMhhh]r3(hX Similar to r3r3}r3(hkX Similar to hlj3ubj')r3}r3(hkX :meth:`do`r3hlj3hthwh~j+h}r3(UreftypeXmethj-j.XdoU refdomainXpyr3h]h]U refexplicith]h]h]j0j1j2j02j3jY1uhMh]r3h)r3}r3(hkj3h}r3(h]h]r3(j9j3Xpy-methr 3eh]h]h]uhlj3h]r!3hXdor"3r#3}r$3(hkUhlj3ubah~hubaubhX, call r%3r&3}r'3(hkX, call hlj3ubh)r(3}r)3(hkX ``callable``h}r*3(h]h]h]h]h]uhlj3h]r+3hXcallabler,3r-3}r.3(hkUhlj(3ubah~hubhX in a thread, but with an r/3r03}r13(hkX in a thread, but with an hlj3ubj')r23}r33(hkX::class:`Engine `r43hlj3hthwh~j+h}r53(UreftypeXclassj-j.X(sqlalchemy:sqlalchemy.engine.base.EngineU refdomainXpyr63h]h]U refexplicith]h]h]j0j1j2j02j3jY1uhMh]r73h)r83}r93(hkj43h}r:3(h]h]r;3(j9j63Xpy-classr<3eh]h]h]uhlj23h]r=3hXEnginer>3r?3}r@3(hkUhlj83ubah~hubaubhX object as first argument.rA3rB3}rC3(hkX object as first argument.hlj3ubeubh)rD3}rE3(hkX]This method is only used for schema manipulation, and should not be used in a running master.rF3hlj2hthwh~hh}rG3(h]h]h]h]h]uhMhhh]rH3hX]This method is only used for schema manipulation, and should not be used in a running master.rI3rJ3}rK3(hkjF3hljD3ubaubeubeubeubeubeubhthwh~Usystem_messagerL3h}rM3(h]UlevelKh]h]rN3jN1aUsourcehwh]h]UlineKUtypeUINFOrO3uhMhhh]rP3h)rQ3}rR3(hkUh}rS3(h]h]h]h]h]uhlhih]rT3hX2Duplicate explicit target name: "sqlalchemy core".rU3rV3}rW3(hkUhljQ3ubah~hubaubhh)rX3}rY3(hkUhlj+hthwh~jL3h}rZ3(h]UlevelKh]h]r[3j,aUsourcehwh]h]UlineKUtypejO3uhMshhh]r\3h)r]3}r^3(hkUh}r_3(h]h]h]h]h]uhljX3h]r`3hX5Duplicate explicit target name: "sqlalchemy-migrate".ra3rb3}rc3(hkUhlj]3ubah~hubaubeUcurrent_sourcerd3NU decorationre3NUautofootnote_startrf3KUnameidsrg3}rh3(hhhhhjp h h h j+h j-h j]h h hj+hhhj+hhhj,hhhhhhhhhjMhhhhhhhhhj+1hhhhhhh h h!h!h"j"h#j^-h$h$h%h%h&jQ"h'h'h(h(h)h)h*j<h+h+h,h,h-hh.h.h/j)-h0jh1jh2h2h3h3h4h4h5h5h6h6h7h7h8h8h9j.h:h:h;h;hh>h?h?h@jh hAhAhBjWhChChDhDhEhhFhFhGhGhHhHhIhIhJhJhKhKhLjhMhMhNhNhOhOhPhPhQhQhRj,hShShTj &hUhUhVj-hWhWhXj1hYj-hZhZh[h[h\h\h]hh^h^h_h_h`h`hajk0hbhbhchcuh]ri3(h|hrehkUU transformerrj3NU footnote_refsrk3}rl3Urefnamesrm3}rn3Usymbol_footnotesro3]rp3Uautofootnote_refsrq3]rr3Usymbol_footnote_refsrs3]rt3U citationsru3]rv3hhU current_linerw3NUtransform_messagesrx3]ry3(hh)rz3}r{3(hkUh}r|3(h]UlevelKh]h]Usourcehwh]h]UlineKUtypejO3uh]r}3h)r~3}r3(hkUh}r3(h]h]h]h]h]uhljz3h]r3hX8Hyperlink target "developer-database" is not referenced.r3r3}r3(hkUhlj~3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineK8UtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-0" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineKLUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-1" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineKUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-2" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineKUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-3" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineKUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-4" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineKUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-5" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-6" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineM$UtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-7" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-8" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX-Hyperlink target "index-9" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r3(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r3h)r3}r3(hkUh}r3(h]h]h]h]h]uhlj3h]r3hX.Hyperlink target "index-10" is not referenced.r3r3}r3(hkUhlj3ubah~hubah~jL3ubhh)r3}r3(hkUh}r4(h]UlevelKh]h]Usourcehwh]h]UlineM7UtypejO3uh]r4h)r4}r4(hkUh}r4(h]h]h]h]h]uhlj3h]r4hX.Hyperlink target "index-11" is not referenced.r4r4}r4(hkUhlj4ubah~hubah~jL3ubhh)r 4}r 4(hkUh}r 4(h]UlevelKh]h]Usourcehwh]h]UlineM@UtypejO3uh]r 4h)r 4}r4(hkUh}r4(h]h]h]h]h]uhlj 4h]r4hX.Hyperlink target "index-12" is not referenced.r4r4}r4(hkUhlj 4ubah~hubah~jL3ubhh)r4}r4(hkUh}r4(h]UlevelKh]h]Usourcehwh]h]UlineMsUtypejO3uh]r4h)r4}r4(hkUh}r4(h]h]h]h]h]uhlj4h]r4hX.Hyperlink target "index-13" is not referenced.r4r4}r4(hkUhlj4ubah~hubah~jL3ubhh)r4}r 4(hkUh}r!4(h]UlevelKh]h]Usourcehwh]h]UlineM~UtypejO3uh]r"4h)r#4}r$4(hkUh}r%4(h]h]h]h]h]uhlj4h]r&4hX.Hyperlink target "index-14" is not referenced.r'4r(4}r)4(hkUhlj#4ubah~hubah~jL3ubhh)r*4}r+4(hkUh}r,4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r-4h)r.4}r/4(hkUh}r04(h]h]h]h]h]uhlj*4h]r14hX.Hyperlink target "index-15" is not referenced.r24r34}r44(hkUhlj.4ubah~hubah~jL3ubhh)r54}r64(hkUh}r74(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r84h)r94}r:4(hkUh}r;4(h]h]h]h]h]uhlj54h]r<4hX.Hyperlink target "index-16" is not referenced.r=4r>4}r?4(hkUhlj94ubah~hubah~jL3ubhh)r@4}rA4(hkUh}rB4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]rC4h)rD4}rE4(hkUh}rF4(h]h]h]h]h]uhlj@4h]rG4hX.Hyperlink target "index-17" is not referenced.rH4rI4}rJ4(hkUhljD4ubah~hubah~jL3ubhh)rK4}rL4(hkUh}rM4(h]UlevelKh]h]Usourcehwh]h]UlineM!UtypejO3uh]rN4h)rO4}rP4(hkUh}rQ4(h]h]h]h]h]uhljK4h]rR4hX.Hyperlink target "index-18" is not referenced.rS4rT4}rU4(hkUhljO4ubah~hubah~jL3ubhh)rV4}rW4(hkUh}rX4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]rY4h)rZ4}r[4(hkUh}r\4(h]h]h]h]h]uhljV4h]r]4hX=Hyperlink target "module-buildbot.db.base" is not referenced.r^4r_4}r`4(hkUhljZ4ubah~hubah~jL3ubhh)ra4}rb4(hkUh}rc4(h]UlevelKh]h]Usourcehwh]h]UlineMkUtypejO3uh]rd4h)re4}rf4(hkUh}rg4(h]h]h]h]h]uhlja4h]rh4hXCHyperlink target "modifying-the-database-schema" is not referenced.ri4rj4}rk4(hkUhlje4ubah~hubah~jL3ubhh)rl4}rm4(hkUh}rn4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]ro4h)rp4}rq4(hkUh}rr4(h]h]h]h]h]uhljl4h]rs4hX.Hyperlink target "index-19" is not referenced.rt4ru4}rv4(hkUhljp4ubah~hubah~jL3ubhh)rw4}rx4(hkUh}ry4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]rz4h)r{4}r|4(hkUh}r}4(h]h]h]h]h]uhljw4h]r~4hX.Hyperlink target "index-20" is not referenced.r4r4}r4(hkUhlj{4ubah~hubah~jL3ubhh)r4}r4(hkUh}r4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r4h)r4}r4(hkUh}r4(h]h]h]h]h]uhlj4h]r4hX.Hyperlink target "index-21" is not referenced.r4r4}r4(hkUhlj4ubah~hubah~jL3ubhh)r4}r4(hkUh}r4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r4h)r4}r4(hkUh}r4(h]h]h]h]h]uhlj4h]r4hX.Hyperlink target "index-22" is not referenced.r4r4}r4(hkUhlj4ubah~hubah~jL3ubhh)r4}r4(hkUh}r4(h]UlevelKh]h]Usourcehwh]h]UlineMUtypejO3uh]r4h)r4}r4(hkUh}r4(h]h]h]h]h]uhlj4h]r4hX.Hyperlink target "index-23" is not referenced.r4r4}r4(hkUhlj4ubah~hubah~jL3ubeUreporterr4NUid_startr4KU autofootnotesr4]r4U citation_refsr4}r4Uindirect_targetsr4]r4Usettingsr4(cdocutils.frontend Values r4or4}r4(Ufootnote_backlinksr4KUrecord_dependenciesr4NU rfc_base_urlr4Uhttp://tools.ietf.org/html/r4U tracebackr4Upep_referencesr4NUstrip_commentsr4NU toc_backlinksr4Uentryr4U language_coder4Uenr4U datestampr4NU report_levelr4KU _destinationr4NU halt_levelr4KU strip_classesr4NhNUerror_encoding_error_handlerr4Ubackslashreplacer4Udebugr4NUembed_stylesheetr4Uoutput_encoding_error_handlerr4Ustrictr4U sectnum_xformr4KUdump_transformsr4NU docinfo_xformr4KUwarning_streamr4NUpep_file_url_templater4Upep-%04dr4Uexit_status_levelr4KUconfigr4NUstrict_visitorr4NUcloak_email_addressesr4Utrim_footnote_reference_spacer4Uenvr4NUdump_pseudo_xmlr4NUexpose_internalsr4NUsectsubtitle_xformr4U source_linkr4NUrfc_referencesr4NUoutput_encodingr4Uutf-8r4U source_urlr4NUinput_encodingr4U utf-8-sigr4U_disable_configr4NU id_prefixr4UU tab_widthr4KUerror_encodingr4UUTF-8r4U_sourcer4US/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/database.rstr4Ugettext_compactr4U generatorr4NUdump_internalsr4NU smart_quotesr4U pep_base_urlr4Uhttp://www.python.org/dev/peps/r4Usyntax_highlightr4Ulongr4Uinput_encoding_error_handlerr4j4Uauto_id_prefixr4Uidr4Udoctitle_xformr4Ustrip_elements_with_classesr4NU _config_filesr4]Ufile_insertion_enabledr4U raw_enabledr4KU dump_settingsr4NubUsymbol_footnote_startr4KUidsr4}r4(h jhji(j+j+jp jk j.h{)r4}r4(hkUhlj.hthwh~hh}r4(h]h]r4j.ah]Uismodh]h]uhM hhh]ubhj/j,j,jN1jJ1j &h{)r4}r4(hkUhlj&hthwh~hh}r4(h]h]r4j &ah]Uismodh]h]uhMhhh]ubj"j"j]jXhhh j j-hpj+j+j"h{)r4}r4(hkUhlj"hthwh~hh}r5(h]h]r5j"ah]Uismodh]h]uhMhhh]ubj\h{)r5}r5(hkUhljXhthwh~hh}r5(h]h]r5j\ah]Uismodh]h]uhK6hhh]ubj+j+j.j.hj"hjj-j-hj'jm-jo-j8-j=-hjghju"j-j-h5jjw-j|-hj jVh{)r5}r5(hkUhljRhthwh~hh}r5(h]h]r 5jVah]Uismodh]h]uhMqhhh]ubhjhjhjhjjB.j>.jo h{)r 5}r 5(hkUhljk hthwh~hh}r 5(h]h]r 5jo ah]Uismodh]h]uhMhhh]ubhj h j$h!jGj &j"&j,j-j#j#j#j#jjje"jg"jjjkjmj?jEjEjGj| j~ j j j j j j jvjyjhjnj\j^jfjkjjjjh$jh%j/jQ"jL"h'jh(jh)j#j-h{)r5}r5(hkUhlj-hthwh~hh}r5(h]h]r5j-ah]Uismodh]h]uhMhhh]ubj<j8h+j{h,jb j)-j%-hhrh.jjjh2jf h3j-h4jhIj jMjIjh{)r5}r5(hkUhljhthwh~hh}r5(h]h]r5jah]Uismodh]h]uhMhhh]ubh6j jP"h{)r5}r5(hkUhljL"hthwh~hh}r5(h]h]r5jP"ah]Uismodh]h]uhMhhh]ubh7j*h8jqj,j,h:jh;jjjjjh>j(j-j-j-j-h?j2jh jc hAj0jWjRhCj3!hDj.hFj5hjX2hGjUhHjujh{)r5}r5(hkUhljhthwh~hh}r5(h]h]r5jah]Uismodh]h]uhMhhh]ubhJj.$hKj#jjhMj!j^-jZ-hjhNj,)hOj4j*1h{)r5}r5(hkUhlhnhthwh~hh}r 5(h]h]r!5j*1ah]Uismodh]h]uhMhhh]ubhPjR.hQj0&hSj>+j &j&hUjLj+1hnhWj.2j0h{)r"5}r#5(hkUhlj,hthwh~hh}r$5(h]h]r%5j0ah]Uismodh]h]uhM5hhh]ubj1j,hZjh[jYh\j/0jg h{)r&5}r'5(hkUhljc hthwh~hh}r(5(h]h]r)5jg ah]Uismodh]h]uhKhhh]ubhhrh^j(h_j&h`j/%j,j,jk0jg0hbj.hcjuUsubstitution_namesr*5}r+5h~hh}r,5(h]h]h]Usourcehwh]h]uU footnotesr-5]r.5Urefidsr/5}r05(j,]r15j-aj-]r25j-aj#]r35j#aj]r45jaj8-]r55j:-aj]r65jaj?]r75jBaj+]r85j+aj ]r95j ah]r:5h|aj ]r;5j ajh]r<5jkajf]r=5jhajw-]r>5jy-auub.PK4Dȣg1buildbot-v0.8.9/.doctrees/developer/style.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xnested callbacksqNXinlinecallbacksqNXprefer to return deferredsqNXsequences of operationsq NXtwisted idiomsq NXlockingq NX deferredlistq Xhelpful twisted classesq NXpep8qXjoining sequencesqNX symbol namesqNXbuildbot coding styleqNuUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUnested-callbacksqhUinlinecallbacksqhUprefer-to-return-deferredsqh Usequences-of-operationsqh Utwisted-idiomsqh Ulockingq h U deferredlistq!h Uhelpful-twisted-classesq"hUpep8q#hUjoining-sequencesq$hU symbol-namesq%hUbuildbot-coding-styleq&uUchildrenq']q(cdocutils.nodes section q))q*}q+(U rawsourceq,UUparentq-hUsourceq.cdocutils.nodes reprunicode q/XP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/style.rstq0q1}q2bUtagnameq3Usectionq4U attributesq5}q6(Udupnamesq7]Uclassesq8]Ubackrefsq9]Uidsq:]q;h&aUnamesq<]q=hauUlineq>KUdocumentq?hh']q@(cdocutils.nodes title qA)qB}qC(h,XBuildbot Coding StyleqDh-h*h.h1h3UtitleqEh5}qF(h7]h8]h9]h:]h<]uh>Kh?hh']qGcdocutils.nodes Text qHXBuildbot Coding StyleqIqJ}qK(h,hDh-hBubaubh))qL}qM(h,Uh-h*h.h1h3h4h5}qN(h7]h8]h9]h:]qOh%ah<]qPhauh>Kh?hh']qQ(hA)qR}qS(h,X Symbol NamesqTh-hLh.h1h3hEh5}qU(h7]h8]h9]h:]h<]uh>Kh?hh']qVhHX Symbol NamesqWqX}qY(h,hTh-hRubaubcdocutils.nodes paragraph qZ)q[}q\(h,XBuildbot follows `PEP8 `_ regarding the formatting of symbol names. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, this is not very consistently applied throughout the codebase.h-hLh.h1h3U paragraphq]h5}q^(h7]h8]h9]h:]h<]uh>Kh?hh']q_(hHXBuildbot follows q`qa}qb(h,XBuildbot follows h-h[ubcdocutils.nodes reference qc)qd}qe(h,X2`PEP8 `_h5}qf(UnameXPEP8UrefuriqgX(http://www.python.org/dev/peps/pep-0008/qhh:]h9]h7]h8]h<]uh-h[h']qihHXPEP8qjqk}ql(h,Uh-hdubah3U referenceqmubcdocutils.nodes target qn)qo}qp(h,X+ U referencedqqKh-h[h3Utargetqrh5}qs(Urefurihhh:]qth#ah9]h7]h8]h<]quhauh']ubhHX regarding the formatting of symbol names. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, this is not very consistently applied throughout the codebase.qvqw}qx(h,X regarding the formatting of symbol names. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, this is not very consistently applied throughout the codebase.h-h[ubeubhZ)qy}qz(h,XThe single exception to PEP8 is in naming of functions and methods. That is, you should spell methods and functions with the first character in lower-case, and the first letter of subsequent words capitalized, e.g., ``compareToOther`` or ``getChangesGreaterThan``.h-hLh.h1h3h]h5}q{(h7]h8]h9]h:]h<]uh>K h?hh']q|(hHXThe single exception to PEP8 is in naming of functions and methods. That is, you should spell methods and functions with the first character in lower-case, and the first letter of subsequent words capitalized, e.g., q}q~}q(h,XThe single exception to PEP8 is in naming of functions and methods. That is, you should spell methods and functions with the first character in lower-case, and the first letter of subsequent words capitalized, e.g., h-hyubcdocutils.nodes literal q)q}q(h,X``compareToOther``h5}q(h7]h8]h9]h:]h<]uh-hyh']qhHXcompareToOtherqq}q(h,Uh-hubah3UliteralqubhHX or qq}q(h,X or h-hyubh)q}q(h,X``getChangesGreaterThan``h5}q(h7]h8]h9]h:]h<]uh-hyh']qhHXgetChangesGreaterThanqq}q(h,Uh-hubah3hubhHX.q}q(h,X.h-hyubeubhZ)q}q(h,X[Symbols used as parameters to functions used in configuration files should use underscores.qh-hLh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>K h?hh']qhHX[Symbols used as parameters to functions used in configuration files should use underscores.qq}q(h,hh-hubaubhZ)q}q(h,XIn summary, then:qh-hLh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXIn summary, then:qq}q(h,hh-hubaubcdocutils.nodes table q)q}q(h,Uh-hLh.h1h3Utableqh5}q(h7]h8]h9]h:]h<]uh>Nh?hh']qcdocutils.nodes tgroup q)q}q(h,Uh5}q(h:]h9]h7]h8]h<]UcolsKuh-hh']q(cdocutils.nodes colspec q)q}q(h,Uh5}q(h:]h9]h7]h8]h<]UcolwidthKuh-hh']h3Ucolspecqubh)q}q(h,Uh5}q(h:]h9]h7]h8]h<]UcolwidthK uh-hh']h3hubcdocutils.nodes thead q)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']qcdocutils.nodes row q)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']q(cdocutils.nodes entry q)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']qhZ)q}q(h,X Symbol Typeqh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh']qhHX Symbol Typeq̅q}q(h,hh-hubaubah3Uentryqubh)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']qhZ)q}q(h,XFormatqh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh']qhHXFormatqمq}q(h,hh-hubaubah3hubeh3Urowqubah3Utheadqubcdocutils.nodes tbody q)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']q(h)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']q(h)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']qhZ)q}q(h,XMethodsqh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh']qhHXMethodsqq}q(h,hh-hubaubah3hubh)q}q(h,Uh5}q(h7]h8]h9]h:]h<]uh-hh']qhZ)q}q(h,X interCapsqh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh']qhHX interCapsqq}q(h,hh-hubaubah3hubeh3hubh)q}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-hh']r(h)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-hh']rhZ)r}r(h,X Functionsr h-jh.h1h3h]h5}r (h7]h8]h9]h:]h<]uh>Kh']r hHX Functionsr r }r(h,j h-jubaubah3hubh)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-hh']rhZ)r}r(h,X interCapsrh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh']rhHX interCapsrr}r(h,jh-jubaubah3hubeh3hubh)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-hh']r(h)r}r (h,Uh5}r!(h7]h8]h9]h:]h<]uh-jh']r"hZ)r#}r$(h,XFunction Argumentsr%h-jh.h1h3h]h5}r&(h7]h8]h9]h:]h<]uh>Kh']r'hHXFunction Argumentsr(r)}r*(h,j%h-j#ubaubah3hubh)r+}r,(h,Uh5}r-(h7]h8]h9]h:]h<]uh-jh']r.hZ)r/}r0(h,X under_scoresr1h-j+h.h1h3h]h5}r2(h7]h8]h9]h:]h<]uh>Kh']r3hHX under_scoresr4r5}r6(h,j1h-j/ubaubah3hubeh3hubh)r7}r8(h,Uh5}r9(h7]h8]h9]h:]h<]uh-hh']r:(h)r;}r<(h,Uh5}r=(h7]h8]h9]h:]h<]uh-j7h']r>hZ)r?}r@(h,XClassesrAh-j;h.h1h3h]h5}rB(h7]h8]h9]h:]h<]uh>Kh']rChHXClassesrDrE}rF(h,jAh-j?ubaubah3hubh)rG}rH(h,Uh5}rI(h7]h8]h9]h:]h<]uh-j7h']rJhZ)rK}rL(h,X InitialCapsrMh-jGh.h1h3h]h5}rN(h7]h8]h9]h:]h<]uh>Kh']rOhHX InitialCapsrPrQ}rR(h,jMh-jKubaubah3hubeh3hubh)rS}rT(h,Uh5}rU(h7]h8]h9]h:]h<]uh-hh']rV(h)rW}rX(h,Uh5}rY(h7]h8]h9]h:]h<]uh-jSh']rZhZ)r[}r\(h,X Variablesr]h-jWh.h1h3h]h5}r^(h7]h8]h9]h:]h<]uh>Kh']r_hHX Variablesr`ra}rb(h,j]h-j[ubaubah3hubh)rc}rd(h,Uh5}re(h7]h8]h9]h:]h<]uh-jSh']rfhZ)rg}rh(h,X under_scoresrih-jch.h1h3h]h5}rj(h7]h8]h9]h:]h<]uh>Kh']rkhHX under_scoresrlrm}rn(h,jih-jgubaubah3hubeh3hubh)ro}rp(h,Uh5}rq(h7]h8]h9]h:]h<]uh-hh']rr(h)rs}rt(h,Uh5}ru(h7]h8]h9]h:]h<]uh-joh']rvhZ)rw}rx(h,X Constantsryh-jsh.h1h3h]h5}rz(h7]h8]h9]h:]h<]uh>Kh']r{hHX Constantsr|r}}r~(h,jyh-jwubaubah3hubh)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-joh']rhZ)r}r(h,XALL_CAPSrh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh']rhHXALL_CAPSrr}r(h,jh-jubaubah3hubeh3hubeh3Utbodyrubeh3Utgrouprubaubeubh))r}r(h,Uh-h*h.h1h3h4h5}r(h7]h8]h9]h:]rhah<]rh auh>Kh?hh']r(hA)r}r(h,XTwisted Idiomsrh-jh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXTwisted Idiomsrr}r(h,jh-jubaubhZ)r}r(h,XwProgramming with Twisted Python can be daunting. But sticking to a few well-defined patterns can help avoid surprises.rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXwProgramming with Twisted Python can be daunting. But sticking to a few well-defined patterns can help avoid surprises.rr}r(h,jh-jubaubh))r}r(h,Uh-jh.h1h3h4h5}r(h7]h8]h9]h:]rhah<]rhauh>K#h?hh']r(hA)r}r(h,XPrefer to Return Deferredsrh-jh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>K#h?hh']rhHXPrefer to Return Deferredsrr}r(h,jh-jubaubhZ)r}r(h,XIf you're writing a method that doesn't currently block, but could conceivably block sometime in the future, return a Deferred and document that it does so. Just about anything might block - even getters and setters!rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>K%h?hh']rhHXIf you're writing a method that doesn't currently block, but could conceivably block sometime in the future, return a Deferred and document that it does so. Just about anything might block - even getters and setters!rr}r(h,jh-jubaubeubh))r}r(h,Uh-jh.h1h3h4h5}r(h7]h8]h9]h:]rh"ah<]rh auh>K*h?hh']r(hA)r}r(h,XHelpful Twisted Classesrh-jh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>K*h?hh']rhHXHelpful Twisted Classesrr}r(h,jh-jubaubhZ)r}r(h,XTwisted has some useful, but little-known classes. Brief descriptions follow, but you should consult the API documentation or source code for the full details.rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>K,h?hh']rhHXTwisted has some useful, but little-known classes. Brief descriptions follow, but you should consult the API documentation or source code for the full details.rr}r(h,jh-jubaubcdocutils.nodes definition_list r)r}r(h,Uh-jh.h1h3Udefinition_listrh5}r(h7]h8]h9]h:]h<]uh>Nh?hh']r(cdocutils.nodes definition_list_item r)r}r(h,X:class:`twisted.internet.task.LoopingCall` Calls an asynchronous function repeatedly at set intervals. Note that this will stop looping if the function fails. In general, you will want to wrap the function to capture and log errors. h-jh.h1h3Udefinition_list_itemrh5}r(h7]h8]h9]h:]h<]uh>K3h']r(cdocutils.nodes term r)r}r(h,X*:class:`twisted.internet.task.LoopingCall`rh-jh.h1h3Utermrh5}r(h7]h8]h9]h:]h<]uh>K3h']rcsphinx.addnodes pending_xref r)r}r(h,jh-jh.h1h3U pending_xrefrh5}r(UreftypeXclassUrefwarnrU reftargetrX!twisted.internet.task.LoopingCallU refdomainXpyrh:]h9]U refexplicith7]h8]h<]UrefdocrXdeveloper/stylerUpy:classrNU py:modulerNuh>K3h']rh)r}r(h,jh5}r(h7]h8]r(UxrefrjXpy-classreh9]h:]h<]uh-jh']rhHX!twisted.internet.task.LoopingCallrr}r(h,Uh-jubah3hubaubaubcdocutils.nodes definition r)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jh']rhZ)r}r(h,XCalls an asynchronous function repeatedly at set intervals. Note that this will stop looping if the function fails. In general, you will want to wrap the function to capture and log errors.rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>K1h']rhHXCalls an asynchronous function repeatedly at set intervals. Note that this will stop looping if the function fails. In general, you will want to wrap the function to capture and log errors.rr}r(h,jh-jubaubah3U definitionrubeubj)r}r(h,X:class:`twisted.application.internet.TimerService` Similar to ``t.i.t.LoopingCall``, but implemented as a service that will automatically start and stop the function calls when the service starts and stops. See the warning about failing functions for ``t.i.t.LoopingCall``. h-jh.h1h3jh5}r (h7]h8]h9]h:]h<]uh>K7h?hh']r (j)r }r (h,X2:class:`twisted.application.internet.TimerService`r h-jh.h1h3jh5}r(h7]h8]h9]h:]h<]uh>K7h']rj)r}r(h,j h-j h.h1h3jh5}r(UreftypeXclassjjX)twisted.application.internet.TimerServiceU refdomainXpyrh:]h9]U refexplicith7]h8]h<]jjjNjNuh>K7h']rh)r}r(h,j h5}r(h7]h8]r(jjXpy-classreh9]h:]h<]uh-jh']rhHX)twisted.application.internet.TimerServicerr}r(h,Uh-jubah3hubaubaubj)r}r(h,Uh5}r (h7]h8]h9]h:]h<]uh-jh']r!hZ)r"}r#(h,XSimilar to ``t.i.t.LoopingCall``, but implemented as a service that will automatically start and stop the function calls when the service starts and stops. See the warning about failing functions for ``t.i.t.LoopingCall``.h-jh.h1h3h]h5}r$(h7]h8]h9]h:]h<]uh>K6h']r%(hHX Similar to r&r'}r((h,X Similar to h-j"ubh)r)}r*(h,X``t.i.t.LoopingCall``h5}r+(h7]h8]h9]h:]h<]uh-j"h']r,hHXt.i.t.LoopingCallr-r.}r/(h,Uh-j)ubah3hubhHX, but implemented as a service that will automatically start and stop the function calls when the service starts and stops. See the warning about failing functions for r0r1}r2(h,X, but implemented as a service that will automatically start and stop the function calls when the service starts and stops. See the warning about failing functions for h-j"ubh)r3}r4(h,X``t.i.t.LoopingCall``h5}r5(h7]h8]h9]h:]h<]uh-j"h']r6hHXt.i.t.LoopingCallr7r8}r9(h,Uh-j3ubah3hubhHX.r:}r;(h,X.h-j"ubeubah3jubeubeubeubh))r<}r=(h,Uh-jh.h1h3h4h5}r>(h7]h8]h9]h:]r?hah<]r@h auh>K:h?hh']rA(hA)rB}rC(h,XSequences of OperationsrDh-j<h.h1h3hEh5}rE(h7]h8]h9]h:]h<]uh>K:h?hh']rFhHXSequences of OperationsrGrH}rI(h,jDh-jBubaubhZ)rJ}rK(h,XkEspecially in Buildbot, we're often faced with executing a sequence of operations, many of which may block.rLh-j<h.h1h3h]h5}rM(h7]h8]h9]h:]h<]uh>KK?h?hh']rVhHXIn all cases where this occurs, there is a danger of pre-emption, so exercise the same caution you would if writing a threaded application.rWrX}rY(h,jTh-jRubaubhZ)rZ}r[(h,XrFor simple cases, you can use nested callback functions. For more complex cases, deferredGenerator is appropriate.r\h-j<h.h1h3h]h5}r](h7]h8]h9]h:]h<]uh>KBh?hh']r^hHXrFor simple cases, you can use nested callback functions. For more complex cases, deferredGenerator is appropriate.r_r`}ra(h,j\h-jZubaubh))rb}rc(h,Uh-j<h.h1h3h4h5}rd(h7]h8]h9]h:]rehah<]rfhauh>KEh?hh']rg(hA)rh}ri(h,XNested Callbacksrjh-jbh.h1h3hEh5}rk(h7]h8]h9]h:]h<]uh>KEh?hh']rlhHXNested Callbacksrmrn}ro(h,jjh-jhubaubhZ)rp}rq(h,XgFirst, an admonition: do not create extra class methods that represent the continuations of the first::rrh-jbh.h1h3h]h5}rs(h7]h8]h9]h:]h<]uh>KGh?hh']rthHXfFirst, an admonition: do not create extra class methods that represent the continuations of the first:rurv}rw(h,XfFirst, an admonition: do not create extra class methods that represent the continuations of the first:h-jpubaubcdocutils.nodes literal_block rx)ry}rz(h,X}def myMethod(self): d = ... d.addCallback(self._myMethod_2) # BAD! def _myMethod_2(self, res): # BAD! ...h-jbh.h1h3U literal_blockr{h5}r|(U xml:spacer}Upreserver~h:]h9]h7]h8]h<]uh>KIh?hh']rhHX}def myMethod(self): d = ... d.addCallback(self._myMethod_2) # BAD! def _myMethod_2(self, res): # BAD! ...rr}r(h,Uh-jyubaubhZ)r}r(h,XInvariably, this extra method gets separated from its parent as the code evolves, and the result is completely unreadable. Instead, include all of the code for a particular function or method within the same indented block, using nested functions::h-jbh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>KOh?hh']rhHXInvariably, this extra method gets separated from its parent as the code evolves, and the result is completely unreadable. Instead, include all of the code for a particular function or method within the same indented block, using nested functions:rr}r(h,XInvariably, this extra method gets separated from its parent as the code evolves, and the result is completely unreadable. Instead, include all of the code for a particular function or method within the same indented block, using nested functions:h-jubaubjx)r}r(h,Xwdef getRevInfo(revname): results = {} d = defer.succeed(None) def rev_parse(_): # note use of '_' to quietly indicate an ignored parameter return utils.getProcessOutput(git, [ 'rev-parse', revname ]) d.addCallback(rev_parse) def parse_rev_parse(res): results['rev'] = res.strip() return utils.getProcessOutput(git, [ 'log', '-1', '--format=%s%n%b', results['rev'] ]) d.addCallback(parse_rev_parse) def parse_log(res): results['comments'] = res.strip() d.addCallback(parse_log) def set_results(_): return results d.addCallback(set_results) return dh-jbh.h1h3j{h5}r(j}j~h:]h9]h7]h8]h<]uh>KTh?hh']rhHXwdef getRevInfo(revname): results = {} d = defer.succeed(None) def rev_parse(_): # note use of '_' to quietly indicate an ignored parameter return utils.getProcessOutput(git, [ 'rev-parse', revname ]) d.addCallback(rev_parse) def parse_rev_parse(res): results['rev'] = res.strip() return utils.getProcessOutput(git, [ 'log', '-1', '--format=%s%n%b', results['rev'] ]) d.addCallback(parse_rev_parse) def parse_log(res): results['comments'] = res.strip() d.addCallback(parse_log) def set_results(_): return results d.addCallback(set_results) return drr}r(h,Uh-jubaubhZ)r}r(h,Xit is usually best to make the first operation occur within a callback, as the deferred machinery will then handle any exceptions as a failure in the outer Deferred. As a shortcut, ``d.addCallback`` works as a decorator::h-jbh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kfh?hh']r(hHXit is usually best to make the first operation occur within a callback, as the deferred machinery will then handle any exceptions as a failure in the outer Deferred. As a shortcut, rr}r(h,Xit is usually best to make the first operation occur within a callback, as the deferred machinery will then handle any exceptions as a failure in the outer Deferred. As a shortcut, h-jubh)r}r(h,X``d.addCallback``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHX d.addCallbackrr}r(h,Uh-jubah3hubhHX works as a decorator:rr}r(h,X works as a decorator:h-jubeubjx)r}r(h,Xd = defer.succeed(None) @d.addCallback def rev_parse(_): # note use of '_' to quietly indicate an ignored parameter return utils.getProcessOutput(git, [ 'rev-parse', revname ])h-jbh.h1h3j{h5}r(j}j~h:]h9]h7]h8]h<]uh>Kjh?hh']rhHXd = defer.succeed(None) @d.addCallback def rev_parse(_): # note use of '_' to quietly indicate an ignored parameter return utils.getProcessOutput(git, [ 'rev-parse', revname ])rr}r(h,Uh-jubaubhZ)r}r(h,X4Be careful with local variables. For example, if ``parse_rev_parse``, above, merely assigned ``rev = res.strip()``, then that variable would be local to ``parse_rev_parse`` and not available in ``set_results``. Mutable variables (dicts and lists) at the outer function level are appropriate for this purpose.h-jbh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Koh?hh']r(hHX1Be careful with local variables. For example, if rr}r(h,X1Be careful with local variables. For example, if h-jubh)r}r(h,X``parse_rev_parse``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXparse_rev_parserr}r(h,Uh-jubah3hubhHX, above, merely assigned rr}r(h,X, above, merely assigned h-jubh)r}r(h,X``rev = res.strip()``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXrev = res.strip()rr}r(h,Uh-jubah3hubhHX', then that variable would be local to rr}r(h,X', then that variable would be local to h-jubh)r}r(h,X``parse_rev_parse``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXparse_rev_parserr}r(h,Uh-jubah3hubhHX and not available in rr}r(h,X and not available in h-jubh)r}r(h,X``set_results``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHX set_resultsrr}r(h,Uh-jubah3hubhHXc. Mutable variables (dicts and lists) at the outer function level are appropriate for this purpose.rr}r(h,Xc. Mutable variables (dicts and lists) at the outer function level are appropriate for this purpose.h-jubeubcdocutils.nodes note r)r}r(h,Xdo not try to build a loop in this style by chaining multiple Deferreds! Unbounded chaining can result in stack overflows, at least on older versions of Twisted. Use ``deferredGenerator`` instead.h-jbh.h1h3Unoterh5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rhZ)r}r(h,Xdo not try to build a loop in this style by chaining multiple Deferreds! Unbounded chaining can result in stack overflows, at least on older versions of Twisted. Use ``deferredGenerator`` instead.h-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kth']r(hHXdo not try to build a loop in this style by chaining multiple Deferreds! Unbounded chaining can result in stack overflows, at least on older versions of Twisted. Use rr}r(h,Xdo not try to build a loop in this style by chaining multiple Deferreds! Unbounded chaining can result in stack overflows, at least on older versions of Twisted. Use h-jubh)r}r(h,X``deferredGenerator``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXdeferredGeneratorrr}r(h,Uh-jubah3hubhHX instead.rr}r(h,X instead.h-jubeubaubeubh))r}r(h,Uh-j<h.h1h3h4h5}r(h7]h8]h9]h:]rhah<]rhauh>Kyh?hh']r(hA)r}r(h,XinlineCallbacksrh-jh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>Kyh?hh']rhHXinlineCallbacksrr}r(h,jh-jubaubhZ)r}r(h,X:class:`twisted.internet.defer.inlineCallbacks` is a great help to writing code that makes a lot of asynchronous calls, particularly if those calls are made in loop or conditionals. Refer to the Twisted documentation for the details, but the style within Buildbot is as follows::h-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>K{h?hh']r(j)r}r(h,X/:class:`twisted.internet.defer.inlineCallbacks`rh-jh.h1h3jh5}r(UreftypeXclassjjX&twisted.internet.defer.inlineCallbacksU refdomainXpyrh:]h9]U refexplicith7]h8]h<]jjjNjNuh>K{h']rh)r}r(h,jh5}r (h7]h8]r (jjXpy-classr eh9]h:]h<]uh-jh']r hHX&twisted.internet.defer.inlineCallbacksr r}r(h,Uh-jubah3hubaubhHX is a great help to writing code that makes a lot of asynchronous calls, particularly if those calls are made in loop or conditionals. Refer to the Twisted documentation for the details, but the style within Buildbot is as follows:rr}r(h,X is a great help to writing code that makes a lot of asynchronous calls, particularly if those calls are made in loop or conditionals. Refer to the Twisted documentation for the details, but the style within Buildbot is as follows:h-jubeubjx)r}r(h,X from twisted.internet import defer @defer.inlineCallbacks def mymethod(self, x, y): xval = yield getSomething(x) for z in (yield getZValues()): y += z if xval > 10: defer.returnValue(xval + y) return self.someOtherMethod()h-jh.h1h3j{h5}r(j}j~h:]h9]h7]h8]h<]uh>Kh?hh']rhHX from twisted.internet import defer @defer.inlineCallbacks def mymethod(self, x, y): xval = yield getSomething(x) for z in (yield getZValues()): y += z if xval > 10: defer.returnValue(xval + y) return self.someOtherMethod()rr}r(h,Uh-jubaubhZ)r}r(h,XThe key points to notice here:rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXThe key points to notice here:rr }r!(h,jh-jubaubcdocutils.nodes bullet_list r")r#}r$(h,Uh-jh.h1h3U bullet_listr%h5}r&(Ubulletr'X*h:]h9]h7]h8]h<]uh>Kh?hh']r((cdocutils.nodes list_item r))r*}r+(h,X=Always import ``defer`` as a module, not the names within it.r,h-j#h.h1h3U list_itemr-h5}r.(h7]h8]h9]h:]h<]uh>Nh?hh']r/hZ)r0}r1(h,j,h-j*h.h1h3h]h5}r2(h7]h8]h9]h:]h<]uh>Kh']r3(hHXAlways import r4r5}r6(h,XAlways import h-j0ubh)r7}r8(h,X ``defer``h5}r9(h7]h8]h9]h:]h<]uh-j0h']r:hHXdeferr;r<}r=(h,Uh-j7ubah3hubhHX& as a module, not the names within it.r>r?}r@(h,X& as a module, not the names within it.h-j0ubeubaubj))rA}rB(h,X.Use the decorator form of ``inlineCallbacks``.rCh-j#h.h1h3j-h5}rD(h7]h8]h9]h:]h<]uh>Nh?hh']rEhZ)rF}rG(h,jCh-jAh.h1h3h]h5}rH(h7]h8]h9]h:]h<]uh>Kh']rI(hHXUse the decorator form of rJrK}rL(h,XUse the decorator form of h-jFubh)rM}rN(h,X``inlineCallbacks``h5}rO(h7]h8]h9]h:]h<]uh-jFh']rPhHXinlineCallbacksrQrR}rS(h,Uh-jMubah3hubhHX.rT}rU(h,X.h-jFubeubaubj))rV}rW(h,XIn most cases, the result of a ``yield`` expression should be assigned to a variable. It can be used in a larger expression, but remember that Python requires that you enclose the expression in its own set of parentheses.h-j#h.h1h3j-h5}rX(h7]h8]h9]h:]h<]uh>Nh?hh']rYhZ)rZ}r[(h,XIn most cases, the result of a ``yield`` expression should be assigned to a variable. It can be used in a larger expression, but remember that Python requires that you enclose the expression in its own set of parentheses.h-jVh.h1h3h]h5}r\(h7]h8]h9]h:]h<]uh>Kh']r](hHXIn most cases, the result of a r^r_}r`(h,XIn most cases, the result of a h-jZubh)ra}rb(h,X ``yield``h5}rc(h7]h8]h9]h:]h<]uh-jZh']rdhHXyieldrerf}rg(h,Uh-jaubah3hubhHX expression should be assigned to a variable. It can be used in a larger expression, but remember that Python requires that you enclose the expression in its own set of parentheses.rhri}rj(h,X expression should be assigned to a variable. It can be used in a larger expression, but remember that Python requires that you enclose the expression in its own set of parentheses.h-jZubeubaubj))rk}rl(h,XSPython does not permit returning a value from a generator, so statements like ``return xval + y`` are invalid. Instead, yield the result of ``defer.returnValue``. Although this function does cause an immediate function exit, for clarity follow it with a bare ``return``, as in the example, unless it is the last statement in a function. h-j#h.h1h3j-h5}rm(h7]h8]h9]h:]h<]uh>Nh?hh']rnhZ)ro}rp(h,XRPython does not permit returning a value from a generator, so statements like ``return xval + y`` are invalid. Instead, yield the result of ``defer.returnValue``. Although this function does cause an immediate function exit, for clarity follow it with a bare ``return``, as in the example, unless it is the last statement in a function.h-jkh.h1h3h]h5}rq(h7]h8]h9]h:]h<]uh>Kh']rr(hHXNPython does not permit returning a value from a generator, so statements like rsrt}ru(h,XNPython does not permit returning a value from a generator, so statements like h-joubh)rv}rw(h,X``return xval + y``h5}rx(h7]h8]h9]h:]h<]uh-joh']ryhHXreturn xval + yrzr{}r|(h,Uh-jvubah3hubhHX, are invalid. Instead, yield the result of r}r~}r(h,X, are invalid. Instead, yield the result of h-joubh)r}r(h,X``defer.returnValue``h5}r(h7]h8]h9]h:]h<]uh-joh']rhHXdefer.returnValuerr}r(h,Uh-jubah3hubhHXc. Although this function does cause an immediate function exit, for clarity follow it with a bare rr}r(h,Xc. Although this function does cause an immediate function exit, for clarity follow it with a bare h-joubh)r}r(h,X ``return``h5}r(h7]h8]h9]h:]h<]uh-joh']rhHXreturnrr}r(h,Uh-jubah3hubhHXC, as in the example, unless it is the last statement in a function.rr}r(h,XC, as in the example, unless it is the last statement in a function.h-joubeubaubeubhZ)r}r(h,XThe great advantage of ``inlineCallbacks`` is that it allows you to use all of the usual Pythonic control structures in their natural form. In particular, it is easy to represent a loop, or even nested loops, in this style without losing any readability.h-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXThe great advantage of rr}r(h,XThe great advantage of h-jubh)r}r(h,X``inlineCallbacks``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXinlineCallbacksrr}r(h,Uh-jubah3hubhHX is that it allows you to use all of the usual Pythonic control structures in their natural form. In particular, it is easy to represent a loop, or even nested loops, in this style without losing any readability.rr}r(h,X is that it allows you to use all of the usual Pythonic control structures in their natural form. In particular, it is easy to represent a loop, or even nested loops, in this style without losing any readability.h-jubeubhZ)r}r(h,XONote that code using ``deferredGenerator`` is no longer acceptable in Buildbot.rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXNote that code using rr}r(h,XNote that code using h-jubh)r}r(h,X``deferredGenerator``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXdeferredGeneratorrr}r(h,Uh-jubah3hubhHX% is no longer acceptable in Buildbot.rr}r(h,X% is no longer acceptable in Buildbot.h-jubeubeubh))r}r(h,Uh-j<h.h1h3h4h5}r(h7]h8]h9]h:]rh ah<]rh auh>Kh?hh']r(hA)r}r(h,XLockingrh-jh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXLockingrr}r(h,jh-jubaubhZ)r}r(h,XRemember that asynchronous programming does not free you from the need to worry about concurrency issues. Particularly if you are executing a sequence of operations, each time you wait for a Deferred, arbitrary other actions can take place.rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXRemember that asynchronous programming does not free you from the need to worry about concurrency issues. Particularly if you are executing a sequence of operations, each time you wait for a Deferred, arbitrary other actions can take place.rr}r(h,jh-jubaubhZ)r}r(h,XIn general, you should try to perform actions atomically, but for the rare situations that require synchronization, the following might be useful:rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh?hh']rhHXIn general, you should try to perform actions atomically, but for the rare situations that require synchronization, the following might be useful:rr}r(h,jh-jubaubj")r}r(h,Uh-jh.h1h3j%h5}r(j'X*h:]h9]h7]h8]h<]uh>Kh?hh']r(j))r}r(h,X/:py:class:`twisted.internet.defer.DeferredLock`rh-jh.h1h3j-h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rhZ)r}r(h,jh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh']rj)r}r(h,jh-jh.h1h3jh5}r(UreftypeXclassjjX#twisted.internet.defer.DeferredLockU refdomainXpyrh:]h9]U refexplicith7]h8]h<]jjjNjNuh>Kh']rh)r}r(h,jh5}r(h7]h8]r(jjXpy-classreh9]h:]h<]uh-jh']rhHX#twisted.internet.defer.DeferredLockrr}r(h,Uh-jubah3hubaubaubaubj))r}r(h,X,:py:func:`buildbot.util.misc.deferredLocked`rh-jh.h1h3j-h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rhZ)r}r(h,jh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh']rj)r}r(h,jh-jh.h1h3jh5}r(UreftypeXfuncjjX!buildbot.util.misc.deferredLockedU refdomainXpyrh:]h9]U refexplicith7]h8]h<]jjjNjNuh>Kh']rh)r}r(h,jh5}r(h7]h8]r(jjXpy-funcreh9]h:]h<]uh-jh']rhHX!buildbot.util.misc.deferredLockedrr}r(h,Uh-jubah3hubaubaubaubj))r}r(h,X3:py:func:`buildbot.util.misc.SerializedInvocation` h-jh.h1h3j-h5}r (h7]h8]h9]h:]h<]uh>Nh?hh']r hZ)r }r (h,X2:py:func:`buildbot.util.misc.SerializedInvocation`r h-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh']rj)r}r(h,j h-j h.h1h3jh5}r(UreftypeXfuncjjX'buildbot.util.misc.SerializedInvocationU refdomainXpyrh:]h9]U refexplicith7]h8]h<]jjjNjNuh>Kh']rh)r}r(h,j h5}r(h7]h8]r(jjXpy-funcreh9]h:]h<]uh-jh']rhHX'buildbot.util.misc.SerializedInvocationrr}r(h,Uh-jubah3hubaubaubaubeubeubeubh))r}r(h,Uh-jh.h1h3h4h5}r (h7]h8]h9]h:]r!h$ah<]r"hauh>Kh?hh']r#(hA)r$}r%(h,XJoining Sequencesr&h-jh.h1h3hEh5}r'(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHXJoining Sequencesr)r*}r+(h,j&h-j$ubaubhZ)r,}r-(h,XIt's often the case that you'll want to perform multiple operations in parallel, and re-join the results at the end. For this purpose, you'll want to use a `DeferredList `_ ::h-jh.h1h3h]h5}r.(h7]h8]h9]h:]h<]uh>Kh?hh']r/(hHXIt's often the case that you'll want to perform multiple operations in parallel, and re-join the results at the end. For this purpose, you'll want to use a r0r1}r2(h,XIt's often the case that you'll want to perform multiple operations in parallel, and re-join the results at the end. For this purpose, you'll want to use a h-j,ubhc)r3}r4(h,Xi`DeferredList `_h5}r5(UnameX DeferredListhgXWhttp://twistedmatrix.com/documents/current/api/twisted.internet.defer.DeferredList.htmlr6h:]h9]h7]h8]h<]uh-j,h']r7hHX DeferredListr8r9}r:(h,Uh-j3ubah3hmubhn)r;}r<(h,XZ hqKh-j,h3hrh5}r=(Urefurij6h:]r>h!ah9]h7]h8]h<]r?h auh']ubeubjx)r@}rA(h,Xdef getRevInfo(revname): results = {} finished = dict(rev_parse=False, log=False) rev_parse_d = utils.getProcessOutput(git, [ 'rev-parse', revname ]) def parse_rev_parse(res): return res.strip() rev_parse_d.addCallback(parse_rev_parse) log_d = utils.getProcessOutput(git, [ 'log', '-1', '--format=%s%n%b', results['rev'] ]) def parse_log(res): return res.strip() log_d.addCallback(parse_log) d = defer.DeferredList([rev_parse_d, log_d], consumeErrors=1, fireOnFirstErrback=1) def handle_results(results): return dict(rev=results[0][1], log=results[1][1]) d.addCallback(handle_results) return dh-jh.h1h3j{h5}rB(j}j~h:]h9]h7]h8]h<]uh>Kh?hh']rChHXdef getRevInfo(revname): results = {} finished = dict(rev_parse=False, log=False) rev_parse_d = utils.getProcessOutput(git, [ 'rev-parse', revname ]) def parse_rev_parse(res): return res.strip() rev_parse_d.addCallback(parse_rev_parse) log_d = utils.getProcessOutput(git, [ 'log', '-1', '--format=%s%n%b', results['rev'] ]) def parse_log(res): return res.strip() log_d.addCallback(parse_log) d = defer.DeferredList([rev_parse_d, log_d], consumeErrors=1, fireOnFirstErrback=1) def handle_results(results): return dict(rev=results[0][1], log=results[1][1]) d.addCallback(handle_results) return drDrE}rF(h,Uh-j@ubaubhZ)rG}rH(h,XHere the deferred list will wait for both ``rev_parse_d`` and ``log_d`` to fire, or for one of them to fail. You may attach callbacks and errbacks to a ``DeferredList`` just as for a deferred.h-jh.h1h3h]h5}rI(h7]h8]h9]h:]h<]uh>Kh?hh']rJ(hHX*Here the deferred list will wait for both rKrL}rM(h,X*Here the deferred list will wait for both h-jGubh)rN}rO(h,X``rev_parse_d``h5}rP(h7]h8]h9]h:]h<]uh-jGh']rQhHX rev_parse_drRrS}rT(h,Uh-jNubah3hubhHX and rUrV}rW(h,X and h-jGubh)rX}rY(h,X ``log_d``h5}rZ(h7]h8]h9]h:]h<]uh-jGh']r[hHXlog_dr\r]}r^(h,Uh-jXubah3hubhHXQ to fire, or for one of them to fail. You may attach callbacks and errbacks to a r_r`}ra(h,XQ to fire, or for one of them to fail. You may attach callbacks and errbacks to a h-jGubh)rb}rc(h,X``DeferredList``h5}rd(h7]h8]h9]h:]h<]uh-jGh']rehHX DeferredListrfrg}rh(h,Uh-jbubah3hubhHX just as for a deferred.rirj}rk(h,X just as for a deferred.h-jGubeubeubeubeubah,UU transformerrlNU footnote_refsrm}rnUrefnamesro}rpUsymbol_footnotesrq]rrUautofootnote_refsrs]rtUsymbol_footnote_refsru]rvU citationsrw]rxh?hU current_lineryNUtransform_messagesrz]r{Ureporterr|NUid_startr}KU autofootnotesr~]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrhU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhENUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUP/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/style.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]rUfile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hjh"jh$jhjbhjh&h*h jh!j;h#hohjhj<h%hLuUsubstitution_namesr}rh3h?h5}r(h7]h:]h9]Usourceh1h8]h<]uU footnotesr]rUrefidsr}rub.PK3Dp6CCLbuildbot-v0.8.9/.doctrees/developer/cls-buildsetsummarynotifiermixin.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xbuildbot.status.buildset.masterqX,buildbot.status.buildset.sendBuildSetSummaryqX)buildbot.status.buildset.summarySubscribeqXbuildsetsummarynotifiermixinq NX+buildbot.status.buildset.summaryUnsubscribeq uUsubstitution_defsq }q Uparse_messagesq ]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhh)q}q(hUhKhhUsourceqcdocutils.nodes reprunicode qXk/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-buildsetsummarynotifiermixin.rstqq}qbUtagnameqUsectionq U attributesq!}q"(Udupnamesq#]q$Xbuildsetsummarynotifiermixinq%aUclassesq&]Ubackrefsq']Uidsq(]q)Ubuildsetsummarynotifiermixinq*aUnamesq+]uUlineq,KUdocumentq-hUchildrenq.]q/(cdocutils.nodes title q0)q1}q2(hXBuildSetSummaryNotifierMixinq3hhhhhUtitleq4h!}q5(h#]h&]h']h(]h+]uh,Kh-hh.]q6cdocutils.nodes Text q7XBuildSetSummaryNotifierMixinq8q9}q:(hh3hh1ubaubcdocutils.nodes paragraph q;)q<}q=(hX Some status notifiers will want to report the status of all builds all at once for a particular buildset, instead of reporting each build individually as it finishes. In order to do this, the status notifier must wait for all builds to finish, collect their results, and then report a kind of summary on all of the collected results. The act of waiting for and collecting the results of all of the builders is implemented via :class:`BuildSetSummaryNotifierMixin`, to be subclassed by a status notification implementation.hhhhhU paragraphq>h!}q?(h#]h&]h']h(]h+]uh,Kh-hh.]q@(h7XSome status notifiers will want to report the status of all builds all at once for a particular buildset, instead of reporting each build individually as it finishes. In order to do this, the status notifier must wait for all builds to finish, collect their results, and then report a kind of summary on all of the collected results. The act of waiting for and collecting the results of all of the builders is implemented via qAqB}qC(hXSome status notifiers will want to report the status of all builds all at once for a particular buildset, instead of reporting each build individually as it finishes. In order to do this, the status notifier must wait for all builds to finish, collect their results, and then report a kind of summary on all of the collected results. The act of waiting for and collecting the results of all of the builders is implemented via hhh!}q(h#]h&]h']h(]h+]uh,Kh-hh.]qh7XThis class provides some helper methods for implementing a status notification that provides notifications for all build results for a buildset at once.qq}q(hhhhubaubh;)q}q(hX*This class provides the following methods:qhhhhhh>h!}q(h#]h&]h']h(]h+]uh,Kh-hh.]qh7X*This class provides the following methods:qq}q(hhhhubaubho)q}q(hUhhhhhhrh!}q(h(]h']h#]h&]h+]Uentries]q(UsingleqX7summarySubscribe() (in module buildbot.status.buildset)hUtqauh,Nh-hh.]ubht)q}q(hUhhhhhhwh!}q(hyhzXpyh(]h']h#]h&]h+]h{Xmethodqh}huh,Nh-hh.]q(h)q}q(hXsummarySubscribe()hhhhhhh!}q(h(]qhaUmoduleqhQh']h#]h&]h+]qhaUfullnameqXsummarySubscribeqUclassqUhuh,Kh-hh.]q(csphinx.addnodes desc_addname q)q}q(hXbuildbot.status.buildset.hhhhhU desc_addnameqh!}q(h#]h&]h']h(]h+]uh,Kh-hh.]qh7Xbuildbot.status.buildset.qq}q(hUhhubaubh)q}q(hhhhhhhhh!}q(h#]h&]h']h(]h+]uh,Kh-hh.]qh7XsummarySubscribeqȅq}q(hUhhubaubcsphinx.addnodes desc_parameterlist q)q}q(hUhhhhhUdesc_parameterlistqh!}q(h#]h&]h']h(]h+]uh,Kh-hh.]ubeubh)q}q(hUhhhhhhh!}q(h#]h&]h']h(]h+]uh,Kh-hh.]qh;)q}q(hXCall this to start receiving :meth:`sendBuildSetSummary` callbacks. Typically this will be called from the subclass's :meth:`startService` method.hhhhhh>h!}q(h#]h&]h']h(]h+]uh,Kh-hh.]q(h7XCall this to start receiving q؅q}q(hXCall this to start receiving hhubhD)q}q(hX:meth:`sendBuildSetSummary`qhhhhhhHh!}q(UreftypeXmethhJhKXsendBuildSetSummaryU refdomainXpyqh(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,Kh.]qhS)q}q(hhh!}q(h#]h&]q(hXhXpy-methqeh']h(]h+]uhhh.]qh7XsendBuildSetSummaryq煁q}q(hUhhubahh^ubaubh7X> callbacks. Typically this will be called from the subclass's qꅁq}q(hX> callbacks. Typically this will be called from the subclass's hhubhD)q}q(hX:meth:`startService`qhhhhhhHh!}q(UreftypeXmethhJhKX startServiceU refdomainXpyqh(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,Kh.]qhS)q}q(hhh!}q(h#]h&]q(hXhXpy-methqeh']h(]h+]uhhh.]qh7X startServiceqq}q(hUhhubahh^ubaubh7X method.qq}q(hX method.hhubeubaubeubho)q}r(hUhhhhhhrh!}r(h(]h']h#]h&]h+]Uentries]r(hX9summaryUnsubscribe() (in module buildbot.status.buildset)h Utrauh,Nh-hh.]ubht)r}r(hUhhhhhhwh!}r(hyhzXpyh(]h']h#]h&]h+]h{Xmethodrh}juh,Nh-hh.]r(h)r }r (hXsummaryUnsubscribe()hjhhhhh!}r (h(]r h ahhQh']h#]h&]h+]r h ahXsummaryUnsubscriberhUhuh,K%h-hh.]r(h)r}r(hXbuildbot.status.buildset.hj hhhhh!}r(h#]h&]h']h(]h+]uh,K%h-hh.]rh7Xbuildbot.status.buildset.rr}r(hUhjubaubh)r}r(hjhj hhhhh!}r(h#]h&]h']h(]h+]uh,K%h-hh.]rh7XsummaryUnsubscriberr}r(hUhjubaubh)r}r(hUhj hhhhh!}r (h#]h&]h']h(]h+]uh,K%h-hh.]ubeubh)r!}r"(hUhjhhhhh!}r#(h#]h&]h']h(]h+]uh,K%h-hh.]r$h;)r%}r&(hXCall this to stop receiving :meth:`sendBuildSetSummary` callbacks. Typically this will be called from the subclass's :meth:`stopService` method.hj!hhhh>h!}r'(h#]h&]h']h(]h+]uh,K"h-hh.]r((h7XCall this to stop receiving r)r*}r+(hXCall this to stop receiving hj%ubhD)r,}r-(hX:meth:`sendBuildSetSummary`r.hj%hhhhHh!}r/(UreftypeXmethhJhKXsendBuildSetSummaryU refdomainXpyr0h(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,K"h.]r1hS)r2}r3(hj.h!}r4(h#]h&]r5(hXj0Xpy-methr6eh']h(]h+]uhj,h.]r7h7XsendBuildSetSummaryr8r9}r:(hUhj2ubahh^ubaubh7X> callbacks. Typically this will be called from the subclass's r;r<}r=(hX> callbacks. Typically this will be called from the subclass's hj%ubhD)r>}r?(hX:meth:`stopService`r@hj%hhhhHh!}rA(UreftypeXmethhJhKX stopServiceU refdomainXpyrBh(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,K"h.]rChS)rD}rE(hj@h!}rF(h#]h&]rG(hXjBXpy-methrHeh']h(]h+]uhj>h.]rIh7X stopServicerJrK}rL(hUhjDubahh^ubaubh7X method.rMrN}rO(hX method.hj%ubeubaubeubh;)rP}rQ(hXBThe following methods are hooks to be implemented by the subclass.rRhhhhhh>h!}rS(h#]h&]h']h(]h+]uh,K&h-hh.]rTh7XBThe following methods are hooks to be implemented by the subclass.rUrV}rW(hjRhjPubaubho)rX}rY(hUhhhhhhrh!}rZ(h(]h']h#]h&]h+]Uentries]r[(hX:sendBuildSetSummary() (in module buildbot.status.buildset)hUtr\auh,Nh-hh.]ubht)r]}r^(hUhhhhhhwh!}r_(hyhzXpyh(]h']h#]h&]h+]h{Xmethodr`h}j`uh,Nh-hh.]ra(h)rb}rc(hX%sendBuildSetSummary(buildset, builds)hj]hhhhh!}rd(h(]rehahhQh']h#]h&]h+]rfhahXsendBuildSetSummaryrghUhuh,K0h-hh.]rh(h)ri}rj(hXbuildbot.status.buildset.hjbhhhhh!}rk(h#]h&]h']h(]h+]uh,K0h-hh.]rlh7Xbuildbot.status.buildset.rmrn}ro(hUhjiubaubh)rp}rq(hjghjbhhhhh!}rr(h#]h&]h']h(]h+]uh,K0h-hh.]rsh7XsendBuildSetSummaryrtru}rv(hUhjpubaubh)rw}rx(hUhjbhhhhh!}ry(h#]h&]h']h(]h+]uh,K0h-hh.]rz(csphinx.addnodes desc_parameter r{)r|}r}(hXbuildseth!}r~(h#]h&]h']h(]h+]uhjwh.]rh7Xbuildsetrr}r(hUhj|ubahUdesc_parameterrubj{)r}r(hXbuildsh!}r(h#]h&]h']h(]h+]uhjwh.]rh7Xbuildsrr}r(hUhjubahjubeubeubh)r}r(hUhj]hhhhh!}r(h#]h&]h']h(]h+]uh,K0h-hh.]r(cdocutils.nodes field_list r)r}r(hUhjhhhU field_listrh!}r(h#]h&]h']h(]h+]uh,Nh-hh.]rcdocutils.nodes field r)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]r(cdocutils.nodes field_name r)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]rh7X Parametersrr}r(hUhjubahU field_namerubcdocutils.nodes field_body r)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]rcdocutils.nodes bullet_list r)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]r(cdocutils.nodes list_item r)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]rh;)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]r(cdocutils.nodes strong r)r}r(hXbuildseth!}r(h#]h&]h']h(]h+]uhjh.]rh7Xbuildsetrr}r(hUhjubahUstrongrubh7X -- rr}r(hUhjubh7XA rr}r(hXA hjubhD)r}r(hX:class:`BuildSet`rhjhhhhHh!}r(UreftypeXclasshJhKXBuildSetU refdomainXpyrh(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,K*h.]rhS)r}r(hjh!}r(h#]h&]r(hXjXpy-classreh']h(]h+]uhjh.]rh7XBuildSetrr}r(hUhjubahh^ubaubh7X objectrr}r(hX objecthjubehh>ubahU list_itemrubj)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]rh;)r}r(hUh!}r(h#]h&]h']h(]h+]uhjh.]r(j)r}r(hXbuildsh!}r(h#]h&]h']h(]h+]uhjh.]rh7Xbuildsrr}r(hUhjubahjubh7X -- rr}r(hUhjubh7X A list of rr}r(hX A list of hjubhD)r}r(hX:class:`Build`rhjhhhhHh!}r(UreftypeXclasshJhKXBuildU refdomainXpyrh(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,K+h.]rhS)r}r(hjh!}r(h#]h&]r(hXjXpy-classreh']h(]h+]uhjh.]rh7XBuildrr}r(hUhjubahh^ubaubh7X objectsrr}r(hX objectshjubehh>ubahjubehU bullet_listrubahU field_bodyrubehUfieldrubaubh;)r}r(hXThis method must be implemented by the subclass. This method is called when all of the builds for a buildset have finished, and it should initiate sending a summary status for the buildset.rhjhhhh>h!}r(h#]h&]h']h(]h+]uh,K-h-hh.]rh7XThis method must be implemented by the subclass. This method is called when all of the builds for a buildset have finished, and it should initiate sending a summary status for the buildset.rr}r (hjhjubaubeubeubh;)r }r (hX:The following attributes must be provided by the subclass.r hhhhhh>h!}r (h#]h&]h']h(]h+]uh,K1h-hh.]rh7X:The following attributes must be provided by the subclass.rr}r(hj hj ubaubho)r}r(hUhhhhhhrh!}r(h(]h']h#]h&]h+]Uentries]r(hX+master (in module buildbot.status.buildset)hUtrauh,Nh-hh.]ubht)r}r(hUhhhhhhwh!}r(hyhzXpyh(]h']h#]h&]h+]h{X attributerh}juh,Nh-hh.]r(h)r}r(hXmasterrhjhhhhh!}r(h(]r hahhQh']h#]h&]h+]r!hahjhUhuh,K5h-hh.]r"(h)r#}r$(hXbuildbot.status.buildset.hjhhhhh!}r%(h#]h&]h']h(]h+]uh,K5h-hh.]r&h7Xbuildbot.status.buildset.r'r(}r)(hUhj#ubaubh)r*}r+(hjhjhhhhh!}r,(h#]h&]h']h(]h+]uh,K5h-hh.]r-h7Xmasterr.r/}r0(hUhj*ubaubeubh)r1}r2(hUhjhhhhh!}r3(h#]h&]h']h(]h+]uh,K5h-hh.]r4h;)r5}r6(hX6This must point to the :py:class:`BuildMaster` object.r7hj1hhhh>h!}r8(h#]h&]h']h(]h+]uh,K5h-hh.]r9(h7XThis must point to the r:r;}r<(hXThis must point to the hj5ubhD)r=}r>(hX:py:class:`BuildMaster`r?hj5hhhhHh!}r@(UreftypeXclasshJhKX BuildMasterU refdomainXpyrAh(]h']U refexplicith#]h&]h+]hMhNhONhPhQuh,K5h.]rBhS)rC}rD(hj?h!}rE(h#]h&]rF(hXjAXpy-classrGeh']h(]h+]uhj=h.]rHh7X BuildMasterrIrJ}rK(hUhjCubahh^ubaubh7X object.rLrM}rN(hX object.hj5ubeubaubeubeubeubeubhhhUsystem_messagerOh!}rP(h#]UlevelKh(]h']rQheaUsourcehh&]h+]UlineKUtypeUINFOrRuh,Kh-hh.]rSh;)rT}rU(hUh!}rV(h#]h&]h']h(]h+]uhhh.]rWh7X?Duplicate implicit target name: "buildsetsummarynotifiermixin".rXrY}rZ(hUhjTubahh>ubaubaUcurrent_sourcer[NU decorationr\NUautofootnote_startr]KUnameidsr^}r_(hhhhhhh Nh h uh.]r`hahUU transformerraNU footnote_refsrb}rcUrefnamesrd}reUsymbol_footnotesrf]rgUautofootnote_refsrh]riUsymbol_footnote_refsrj]rkU citationsrl]rmh-hU current_linernNUtransform_messagesro]rpUreporterrqNUid_startrrKU autofootnotesrs]rtU citation_refsru}rvUindirect_targetsrw]rxUsettingsry(cdocutils.frontend Values rzor{}r|(Ufootnote_backlinksr}KUrecord_dependenciesr~NU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh4NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerUk/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-buildsetsummarynotifiermixin.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhhjbhehhjh*hh j uUsubstitution_namesr}rhh-h!}r(h#]h(]h']Usourcehh&]h+]uU footnotesr]rUrefidsr}rub.PK3D\l,8G8G:buildbot-v0.8.9/.doctrees/developer/cls-buildsteps.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X1buildbot.process.buildstep.BuildStep.setStatisticqX;buildbot.process.buildstep.LoggingBuildStep.evaluateCommandqX.buildbot.process.buildstep.BuildStep.startStepqX4buildbot.process.buildstep.LoggingBuildStep.getText2q XGbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.globq X6buildbot.process.buildstep.BuildStep.setDefaultWorkdirq X+buildbot.process.buildstep.BuildStep.addLogq X buildstepsq NX-buildbot.process.buildstep.BuildStep.setBuildqX/buildbot.process.buildstep.BuildStep.buildslaveqX3buildbot.process.buildstep.BuildStep.addLogObserverqX0buildbot.process.buildstep.BuildStep.descriptionqX*buildbot.process.buildstep.BuildStepFailedqX+buildbot.process.buildstep.BuildStep.addURLqX+buildbot.process.buildstep.LoggingBuildStepqX2buildbot.process.buildstep.BuildStep.warnOnFailureqX8buildbot.process.buildstep.LoggingBuildStep.startCommandqX-buildbot.process.buildstep.BuildStep.describeqX3buildbot.process.buildstep.BuildStep.warnOnWarningsqX exceptionsqNX0buildbot.process.buildstep.BuildStep.useProgressqX<buildbot.process.buildstep.BuildStep.slaveVersionIsOlderThanqX2buildbot.process.buildstep.BuildStep.updateSummaryqX.buildbot.process.buildstep.BuildStep.alwaysRunqX1buildbot.process.buildstep.BuildStep.getStatisticqX2buildbot.process.buildstep.BuildStep.getStatisticsqX$buildbot.process.buildstep.BuildStepq X buildstepq!NX0buildbot.process.buildstep.BuildStep.setProgressq"XBbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixinq#X2buildbot.process.buildstep.BuildStep.setBuildSlaveq$Xloggingbuildstepq%NX@buildbot.process.buildstep.buildbot.process.buildstep.ShellMixinq&X)buildbot.process.buildstep.BuildStep.nameq'XKbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.runMkdirq(X1buildbot.process.buildstep.BuildStep.slaveVersionq)X-buildbot.process.buildstep.BuildStep.doStepIfq*X*buildbot.process.buildstep.BuildStep.startq+X4buildbot.process.buildstep.BuildStep.descriptionDoneq,X shellmixinq-NX3buildbot.process.buildstep.BuildStep.addCompleteLogq.X-buildbot.process.buildstep.BuildStep.finishedq/X*buildbot.process.buildstep.BuildStep.buildq0X3buildbot.process.buildstep.LoggingBuildStep.getTextq1X+buildbot.process.buildstep.BuildStep.failedq2X.buildbot.process.buildstep.BuildStep.interruptq3X4buildbot.process.buildstep.LoggingBuildStep.logfilesq4X2buildbot.process.buildstep.BuildStep.setupProgressq5X/buildbot.process.buildstep.BuildStep.addHTMLLogq6X5buildbot.process.buildstep.BuildStep.getResultSummaryq7X3buildbot.process.buildstep.BuildStep.flunkOnFailureq8XKbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.runRmdirq9X;buildbot.process.buildstep.LoggingBuildStep.commandCompleteq:X6buildbot.process.buildstep.BuildStep.getCurrentSummaryq;X9buildbot.process.buildstep.LoggingBuildStep.createSummaryqX+buildbot.process.buildstep.BuildStep.getLogq?X4buildbot.process.buildstep.BuildStep.progressMetricsq@X1buildbot.process.buildstep.BuildStep.hasStatisticqAX-buildbot.process.buildstep.BuildStep.progressqBX4buildbot.process.buildstep.BuildStep.flunkOnWarningsqCX,buildbot.process.buildstep.BuildStep.stoppedqDXMbuildbot.process.buildstep.buildbot.process.buildstep.CommandMixin.pathExistsqEX2buildbot.process.buildstep.BuildStep.haltOnFailureqFX commandmixinqGNX/buildbot.process.buildstep.BuildStep.runCommandqHX/buildbot.process.buildstep.BuildStep.hideStepIfqIX*buildbot.process.buildstep.BuildStep.locksqJX(buildbot.process.buildstep.BuildStep.runqKuUsubstitution_defsqL}qMUparse_messagesqN]qOUcurrent_sourceqPNU decorationqQNUautofootnote_startqRKUnameidsqS}qT(hhhhhhh h h h h h h h h U buildstepsqUhhhhhhhhhhhhhhhhhhhhhhhU exceptionsqVhhhhhhhhhhhhh h h!U buildstepqWh"h"h#h#h$h$h%UloggingbuildstepqXh&h&h'h'h(h(h)h)h*h*h+h+h,h,h-U shellmixinqYh.h.h/h/h0h0h1h1h2h2h3h3h4h4h5h5h6h6h7h7h8h8h9h9h:h:h;h;hh>h?h?h@h@hAhAhBhBhChChDhDhEhEhFhFhGU commandmixinqZhHhHhIhIhJhJhKhKuUchildrenq[]q\cdocutils.nodes section q])q^}q_(U rawsourceq`UUparentqahUsourceqbcdocutils.nodes reprunicode qcXY/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-buildsteps.rstqdqe}qfbUtagnameqgUsectionqhU attributesqi}qj(Udupnamesqk]Uclassesql]Ubackrefsqm]Uidsqn]qo(X!module-buildbot.process.buildstepqphUeUnamesqq]qrh auUlineqsKUdocumentqthh[]qu(cdocutils.nodes title qv)qw}qx(h`X BuildStepsqyhah^hbhehgUtitleqzhi}q{(hk]hl]hm]hn]hq]uhsKhthh[]q|cdocutils.nodes Text q}X BuildStepsq~q}q(h`hyhahwubaubcsphinx.addnodes index q)q}q(h`Uhah^hbhehgUindexqhi}q(hn]hm]hk]hl]hq]Uentries]q(UsingleqX#buildbot.process.buildstep (module)X!module-buildbot.process.buildstepUtqauhsKhthh[]ubcdocutils.nodes paragraph q)q}q(h`XThere are a few parent classes that are used as base classes for real buildsteps. This section describes the base classes. The "leaf" classes are described in :doc:`../manual/cfg-buildsteps`.hah^hbhehgU paragraphqhi}q(hk]hl]hm]hn]hq]uhsKhthh[]q(h}XThere are a few parent classes that are used as base classes for real buildsteps. This section describes the base classes. The "leaf" classes are described in qq}q(h`XThere are a few parent classes that are used as base classes for real buildsteps. This section describes the base classes. The "leaf" classes are described in hahubcsphinx.addnodes pending_xref q)q}q(h`X:doc:`../manual/cfg-buildsteps`qhahhbhehgU pending_xrefqhi}q(UreftypeXdocqUrefwarnqU reftargetqX../manual/cfg-buildstepsU refdomainUhn]hm]U refexplicithk]hl]hq]UrefdocqXdeveloper/cls-buildstepsquhsKh[]qcdocutils.nodes literal q)q}q(h`hhi}q(hk]hl]q(Uxrefqhehm]hn]hq]uhahh[]qh}X../manual/cfg-buildstepsqq}q(h`UhahubahgUliteralqubaubh}X.q}q(h`X.hahubeubh])q}q(h`Uhah^hbhehghhhi}q(hk]hl]hm]hn]qhWahq]qh!auhsK hthh[]q(hv)q}q(h`X BuildStepqhahhbhehghzhi}q(hk]hl]hm]hn]hq]uhsK hthh[]qh}X BuildStepqq}q(h`hhahubaubh)q}q(h`UhahhbNhghhi}q(hn]hm]hk]hl]hq]Uentries]q(hX/BuildStep (class in buildbot.process.buildstep)h UtqauhsNhthh[]ubcsphinx.addnodes desc q)q}q(h`UhahhbNhgUdescqhi}q(UnoindexqÉUdomainqXpyhn]hm]hk]hl]hq]UobjtypeqXclassqUdesctypeqhuhsNhthh[]q(csphinx.addnodes desc_signature q)q}q(h`XBuildStep(name, description, descriptionDone, descriptionSuffix, locks, haltOnFailure, flunkOnWarnings, flunkOnFailure, warnOnWarnings, warnOnFailure, alwaysRun, progressMetrics, useProgress, doStepIf, hideStepIf)hahhbhehgUdesc_signatureqhi}q(hn]qh aUmoduleqXbuildbot.process.buildstepqhm]hk]hl]hq]qh aUfullnameqX BuildStepqUclassqUUfirstqՉuhsMhthh[]q(csphinx.addnodes desc_annotation q)q}q(h`Xclass hahhbhehgUdesc_annotationqhi}q(hk]hl]hm]hn]hq]uhsMhthh[]qh}Xclass q݅q}q(h`Uhahubaubcsphinx.addnodes desc_addname q)q}q(h`Xbuildbot.process.buildstep.hahhbhehgU desc_addnameqhi}q(hk]hl]hm]hn]hq]uhsMhthh[]qh}Xbuildbot.process.buildstep.q慁q}q(h`Uhahubaubcsphinx.addnodes desc_name q)q}q(h`hhahhbhehgU desc_nameqhi}q(hk]hl]hm]hn]hq]uhsMhthh[]qh}X BuildStepqq}q(h`Uhahubaubcsphinx.addnodes desc_parameterlist q)q}q(h`UhahhbhehgUdesc_parameterlistqhi}q(hk]hl]hm]hn]hq]uhsMhthh[]q(csphinx.addnodes desc_parameter q)q}q(h`Xnamehi}q(hk]hl]hm]hn]hq]uhahh[]qh}Xnameqq}q(h`UhahubahgUdesc_parameterrubh)r}r(h`X descriptionhi}r(hk]hl]hm]hn]hq]uhahh[]rh}X descriptionrr}r(h`Uhajubahgjubh)r}r (h`XdescriptionDonehi}r (hk]hl]hm]hn]hq]uhahh[]r h}XdescriptionDoner r }r(h`Uhajubahgjubh)r}r(h`XdescriptionSuffixhi}r(hk]hl]hm]hn]hq]uhahh[]rh}XdescriptionSuffixrr}r(h`Uhajubahgjubh)r}r(h`Xlockshi}r(hk]hl]hm]hn]hq]uhahh[]rh}Xlocksrr}r(h`Uhajubahgjubh)r}r(h`X haltOnFailurehi}r(hk]hl]hm]hn]hq]uhahh[]r h}X haltOnFailurer!r"}r#(h`Uhajubahgjubh)r$}r%(h`XflunkOnWarningshi}r&(hk]hl]hm]hn]hq]uhahh[]r'h}XflunkOnWarningsr(r)}r*(h`Uhaj$ubahgjubh)r+}r,(h`XflunkOnFailurehi}r-(hk]hl]hm]hn]hq]uhahh[]r.h}XflunkOnFailurer/r0}r1(h`Uhaj+ubahgjubh)r2}r3(h`XwarnOnWarningshi}r4(hk]hl]hm]hn]hq]uhahh[]r5h}XwarnOnWarningsr6r7}r8(h`Uhaj2ubahgjubh)r9}r:(h`X warnOnFailurehi}r;(hk]hl]hm]hn]hq]uhahh[]r<h}X warnOnFailurer=r>}r?(h`Uhaj9ubahgjubh)r@}rA(h`X alwaysRunhi}rB(hk]hl]hm]hn]hq]uhahh[]rCh}X alwaysRunrDrE}rF(h`Uhaj@ubahgjubh)rG}rH(h`XprogressMetricshi}rI(hk]hl]hm]hn]hq]uhahh[]rJh}XprogressMetricsrKrL}rM(h`UhajGubahgjubh)rN}rO(h`X useProgresshi}rP(hk]hl]hm]hn]hq]uhahh[]rQh}X useProgressrRrS}rT(h`UhajNubahgjubh)rU}rV(h`XdoStepIfhi}rW(hk]hl]hm]hn]hq]uhahh[]rXh}XdoStepIfrYrZ}r[(h`UhajUubahgjubh)r\}r](h`X hideStepIfhi}r^(hk]hl]hm]hn]hq]uhahh[]r_h}X hideStepIfr`ra}rb(h`Uhaj\ubahgjubeubeubcsphinx.addnodes desc_content rc)rd}re(h`UhahhbhehgU desc_contentrfhi}rg(hk]hl]hm]hn]hq]uhsMhthh[]rh(h)ri}rj(h`XAll constructor arguments must be given as keyword arguments. Each constructor parameter is copied to the corresponding attribute.rkhajdhbhehghhi}rl(hk]hl]hm]hn]hq]uhsKhthh[]rmh}XAll constructor arguments must be given as keyword arguments. Each constructor parameter is copied to the corresponding attribute.rnro}rp(h`jkhajiubaubh)rq}rr(h`Uhajdhbhehghhi}rs(hn]hm]hk]hl]hq]Uentries]rt(hX5name (buildbot.process.buildstep.BuildStep attribute)h'UtruauhsNhthh[]ubh)rv}rw(h`Uhajdhbhehghhi}rx(hÉhXpyhn]hm]hk]hl]hq]hX attributeryhjyuhsNhthh[]rz(h)r{}r|(h`Xnamer}hajvhbhehghhi}r~(hn]rh'ahhhm]hk]hl]hq]rh'ahXBuildStep.namehhhՉuhsKhthh[]rh)r}r(h`j}haj{hbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}Xnamerr}r(h`Uhajubaubaubjc)r}r(h`Uhajvhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh)r}r(h`XThe name of the step.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}XThe name of the step.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX<description (buildbot.process.buildstep.BuildStep attribute)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`X descriptionrhajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXBuildStep.descriptionhhhՉuhsKhthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}X descriptionrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh)r}r(h`XThe description of the step.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}XThe description of the step.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX@descriptionDone (buildbot.process.buildstep.BuildStep attribute)h,UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`XdescriptionDonerhajhbhehghhi}r(hn]rh,ahhhm]hk]hl]hq]rh,ahXBuildStep.descriptionDonehhhՉuhsKhthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}XdescriptionDonerr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh)r}r(h`X2The description of the step after it has finished.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}X2The description of the step after it has finished.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXBdescriptionSuffix (buildbot.process.buildstep.BuildStep attribute)h=UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`XdescriptionSuffixrhajhbhehghhi}r(hn]rh=ahhhm]hk]hl]hq]rh=ahXBuildStep.descriptionSuffixhhhՉuhsK hthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK hthh[]rh}XdescriptionSuffixrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsK hthh[]rh)r}r(h`X3Any extra information to append to the description.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}X3Any extra information to append to the description.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX6locks (buildbot.process.buildstep.BuildStep attribute)hJUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributer hj uhsNhthh[]r (h)r }r (h`Xlocksr hajhbhehghhi}r(hn]rhJahhhm]hk]hl]hq]rhJahXBuildStep.lockshhhՉuhsK$hthh[]rh)r}r(h`j haj hbhehghhi}r(hk]hl]hm]hn]hq]uhsK$hthh[]rh}Xlocksrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsK$hthh[]rh)r}r(h`X3List of locks for this step; see :ref:`Interlocks`.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK#hthh[]r (h}X!List of locks for this step; see r!r"}r#(h`X!List of locks for this step; see hajubh)r$}r%(h`X:ref:`Interlocks`r&hajhbhehghhi}r'(UreftypeXrefhhX interlocksU refdomainXstdr(hn]hm]U refexplicithk]hl]hq]hhuhsK#h[]r)cdocutils.nodes emphasis r*)r+}r,(h`j&hi}r-(hk]hl]r.(hj(Xstd-refr/ehm]hn]hq]uhaj$h[]r0h}X Interlocksr1r2}r3(h`Uhaj+ubahgUemphasisr4ubaubh}X.r5}r6(h`X.hajubeubaubeubh)r7}r8(h`Uhajdhbhehghhi}r9(hn]hm]hk]hl]hq]Uentries]r:(hX@progressMetrics (buildbot.process.buildstep.BuildStep attribute)h@Utr;auhsNhthh[]ubh)r<}r=(h`Uhajdhbhehghhi}r>(hÉhXpyhn]hm]hk]hl]hq]hX attributer?hj?uhsNhthh[]r@(h)rA}rB(h`XprogressMetricsrChaj<hbhehghhi}rD(hn]rEh@ahhhm]hk]hl]hq]rFh@ahXBuildStep.progressMetricshhhՉuhsK)hthh[]rGh)rH}rI(h`jChajAhbhehghhi}rJ(hk]hl]hm]hn]hq]uhsK)hthh[]rKh}XprogressMetricsrLrM}rN(h`UhajHubaubaubjc)rO}rP(h`Uhaj<hbhehgjfhi}rQ(hk]hl]hm]hn]hq]uhsK)hthh[]rRh)rS}rT(h`XList of names of metrics that should be used to track the progress of this build, and build ETA's for users. This is generally set in therUhajOhbhehghhi}rV(hk]hl]hm]hn]hq]uhsK'hthh[]rWh}XList of names of metrics that should be used to track the progress of this build, and build ETA's for users. This is generally set in therXrY}rZ(h`jUhajSubaubaubeubh)r[}r\(h`Uhajdhbhehghhi}r](hn]hm]hk]hl]hq]Uentries]r^(hX<useProgress (buildbot.process.buildstep.BuildStep attribute)hUtr_auhsNhthh[]ubh)r`}ra(h`Uhajdhbhehghhi}rb(hÉhXpyhn]hm]hk]hl]hq]hX attributerchjcuhsNhthh[]rd(h)re}rf(h`X useProgressrghaj`hbhehghhi}rh(hn]rihahhhm]hk]hl]hq]rjhahXBuildStep.useProgresshhhՉuhsK.hthh[]rkh)rl}rm(h`jghajehbhehghhi}rn(hk]hl]hm]hn]hq]uhsK.hthh[]roh}X useProgressrprq}rr(h`Uhajlubaubaubjc)rs}rt(h`Uhaj`hbhehgjfhi}ru(hk]hl]hm]hn]hq]uhsK.hthh[]rvh)rw}rx(h`XIf true (the default), then ETAs will be calculated for this step using progress metrics. If the step is known to have unpredictable timing (e.g., an incremental build), then this should be set to false.ryhajshbhehghhi}rz(hk]hl]hm]hn]hq]uhsK,hthh[]r{h}XIf true (the default), then ETAs will be calculated for this step using progress metrics. If the step is known to have unpredictable timing (e.g., an incremental build), then this should be set to false.r|r}}r~(h`jyhajwubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX9doStepIf (buildbot.process.buildstep.BuildStep attribute)h*UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`XdoStepIfrhajhbhehghhi}r(hn]rh*ahhhm]hk]hl]hq]rh*ahXBuildStep.doStepIfhhhՉuhsK3hthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK3hthh[]rh}XdoStepIfrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsK3hthh[]rh)r}r(h`XyA callable or bool to determine whether this step should be executed. See :ref:`Buildstep-Common-Parameters` for details.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK1hthh[]r(h}XJA callable or bool to determine whether this step should be executed. See rr}r(h`XJA callable or bool to determine whether this step should be executed. See hajubh)r}r(h`X":ref:`Buildstep-Common-Parameters`rhajhbhehghhi}r(UreftypeXrefhhXbuildstep-common-parametersU refdomainXstdrhn]hm]U refexplicithk]hl]hq]hhuhsK1h[]rj*)r}r(h`jhi}r(hk]hl]r(hjXstd-refrehm]hn]hq]uhajh[]rh}XBuildstep-Common-Parametersrr}r(h`Uhajubahgj4ubaubh}X for details.rr}r(h`X for details.hajubeubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX;hideStepIf (buildbot.process.buildstep.BuildStep attribute)hIUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`X hideStepIfrhajhbhehghhi}r(hn]rhIahhhm]hk]hl]hq]rhIahXBuildStep.hideStepIfhhhՉuhsK8hthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK8hthh[]rh}X hideStepIfrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsK8hthh[]rh)r}r(h`XA callable or bool to determine whether this step should be shown in the waterfall and build details pages. See :ref:`Buildstep-Common-Parameters` for details.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK6hthh[]r(h}XpA callable or bool to determine whether this step should be shown in the waterfall and build details pages. See rr}r(h`XpA callable or bool to determine whether this step should be shown in the waterfall and build details pages. See hajubh)r}r(h`X":ref:`Buildstep-Common-Parameters`rhajhbhehghhi}r(UreftypeXrefhhXbuildstep-common-parametersU refdomainXstdrhn]hm]U refexplicithk]hl]hq]hhuhsK6h[]rj*)r}r(h`jhi}r(hk]hl]r(hjXstd-refrehm]hn]hq]uhajh[]rh}XBuildstep-Common-Parametersrr}r(h`Uhajubahgj4ubaubh}X for details.rr}r(h`X for details.hajubeubaubeubh)r}r(h`XEThe following attributes affect the behavior of the containing build:rhajdhbhehghhi}r(hk]hl]hm]hn]hq]uhsK9hthh[]rh}XEThe following attributes affect the behavior of the containing build:rr}r(h`jhajubaubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX>haltOnFailure (buildbot.process.buildstep.BuildStep attribute)hFUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`X haltOnFailurerhajhbhehghhi}r(hn]rhFahhhm]hk]hl]hq]rhFahXBuildStep.haltOnFailurehhhՉuhsK>hthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK>hthh[]rh}X haltOnFailurerr}r(h`Uhajubaubaubjc)r }r (h`Uhajhbhehgjfhi}r (hk]hl]hm]hn]hq]uhsK>hthh[]r h)r }r(h`X{If true, the build will halt on a failure of this step, and not execute subsequent tests (except those with ``alwaysRun``).haj hbhehghhi}r(hk]hl]hm]hn]hq]uhsK=hthh[]r(h}XlIf true, the build will halt on a failure of this step, and not execute subsequent tests (except those with rr}r(h`XlIf true, the build will halt on a failure of this step, and not execute subsequent tests (except those with haj ubh)r}r(h`X ``alwaysRun``hi}r(hk]hl]hm]hn]hq]uhaj h[]rh}X alwaysRunrr}r(h`Uhajubahghubh}X).rr}r(h`X).haj ubeubaubeubh)r}r(h`Uhajdhbhehghhi}r (hn]hm]hk]hl]hq]Uentries]r!(hX@flunkOnWarnings (buildbot.process.buildstep.BuildStep attribute)hCUtr"auhsNhthh[]ubh)r#}r$(h`Uhajdhbhehghhi}r%(hÉhXpyhn]hm]hk]hl]hq]hX attributer&hj&uhsNhthh[]r'(h)r(}r)(h`XflunkOnWarningsr*haj#hbhehghhi}r+(hn]r,hCahhhm]hk]hl]hq]r-hCahXBuildStep.flunkOnWarningshhhՉuhsKBhthh[]r.h)r/}r0(h`j*haj(hbhehghhi}r1(hk]hl]hm]hn]hq]uhsKBhthh[]r2h}XflunkOnWarningsr3r4}r5(h`Uhaj/ubaubaubjc)r6}r7(h`Uhaj#hbhehgjfhi}r8(hk]hl]hm]hn]hq]uhsKBhthh[]r9h)r:}r;(h`XOIf true, the build will be marked as a failure if this step ends with warnings.r<haj6hbhehghhi}r=(hk]hl]hm]hn]hq]uhsKAhthh[]r>h}XOIf true, the build will be marked as a failure if this step ends with warnings.r?r@}rA(h`j<haj:ubaubaubeubh)rB}rC(h`Uhajdhbhehghhi}rD(hn]hm]hk]hl]hq]Uentries]rE(hX?flunkOnFailure (buildbot.process.buildstep.BuildStep attribute)h8UtrFauhsNhthh[]ubh)rG}rH(h`Uhajdhbhehghhi}rI(hÉhXpyhn]hm]hk]hl]hq]hX attributerJhjJuhsNhthh[]rK(h)rL}rM(h`XflunkOnFailurerNhajGhbhehghhi}rO(hn]rPh8ahhhm]hk]hl]hq]rQh8ahXBuildStep.flunkOnFailurehhhՉuhsKFhthh[]rRh)rS}rT(h`jNhajLhbhehghhi}rU(hk]hl]hm]hn]hq]uhsKFhthh[]rVh}XflunkOnFailurerWrX}rY(h`UhajSubaubaubjc)rZ}r[(h`UhajGhbhehgjfhi}r\(hk]hl]hm]hn]hq]uhsKFhthh[]r]h)r^}r_(h`XBIf true, the build will be marked as a failure if this step fails.r`hajZhbhehghhi}ra(hk]hl]hm]hn]hq]uhsKEhthh[]rbh}XBIf true, the build will be marked as a failure if this step fails.rcrd}re(h`j`haj^ubaubaubeubh)rf}rg(h`Uhajdhbhehghhi}rh(hn]hm]hk]hl]hq]Uentries]ri(hX?warnOnWarnings (buildbot.process.buildstep.BuildStep attribute)hUtrjauhsNhthh[]ubh)rk}rl(h`Uhajdhbhehghhi}rm(hÉhXpyhn]hm]hk]hl]hq]hX attributernhjnuhsNhthh[]ro(h)rp}rq(h`XwarnOnWarningsrrhajkhbhehghhi}rs(hn]rthahhhm]hk]hl]hq]ruhahXBuildStep.warnOnWarningshhhՉuhsKJhthh[]rvh)rw}rx(h`jrhajphbhehghhi}ry(hk]hl]hm]hn]hq]uhsKJhthh[]rzh}XwarnOnWarningsr{r|}r}(h`Uhajwubaubaubjc)r~}r(h`Uhajkhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKJhthh[]rh)r}r(h`XYIf true, the build will be marked as warnings, or worse, if this step ends with warnings.rhaj~hbhehghhi}r(hk]hl]hm]hn]hq]uhsKIhthh[]rh}XYIf true, the build will be marked as warnings, or worse, if this step ends with warnings.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX>warnOnFailure (buildbot.process.buildstep.BuildStep attribute)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`X warnOnFailurerhajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXBuildStep.warnOnFailurehhhՉuhsKNhthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKNhthh[]rh}X warnOnFailurerr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKNhthh[]rh)r}r(h`XLIf true, the build will be marked as warnings, or worse, if this step fails.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKMhthh[]rh}XLIf true, the build will be marked as warnings, or worse, if this step fails.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX:alwaysRun (buildbot.process.buildstep.BuildStep attribute)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`X alwaysRunrhajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXBuildStep.alwaysRunhhhՉuhsKRhthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKRhthh[]rh}X alwaysRunrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKRhthh[]rh)r}r(h`XZIf true, the step will run even if a previous step halts the build with ``haltOnFailure``.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKQhthh[]r(h}XHIf true, the step will run even if a previous step halts the build with rr}r(h`XHIf true, the step will run even if a previous step halts the build with hajubh)r}r(h`X``haltOnFailure``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}X haltOnFailurerr}r(h`Uhajubahghubh}X.r}r(h`X.hajubeubaubeubh)r}r(h`XA few important pieces of information are not available when a step is constructed, and are added later. These are set by the following methods; the order in which these methods are called is not defined.rhajdhbhehghhi}r(hk]hl]hm]hn]hq]uhsKShthh[]rh}XA few important pieces of information are not available when a step is constructed, and are added later. These are set by the following methods; the order in which these methods are called is not defined.rr}r(h`jhajubaubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX8setBuild() (buildbot.process.buildstep.BuildStep method)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XsetBuild(build)hajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXBuildStep.setBuildhhhՉuhsK]hthh[]r(h)r}r(h`XsetBuildhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK]hthh[]rh}XsetBuildrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK]hthh[]rh)r}r(h`Xbuildhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xbuildrr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsK]hthh[]r(cdocutils.nodes field_list r)r }r (h`UhajhbhehgU field_listr hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r cdocutils.nodes field r)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]r(cdocutils.nodes field_name r)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`UhajubahgU field_namerubcdocutils.nodes field_body r)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r h)r!}r"(h`Uhi}r#(hk]hl]hm]hn]hq]uhajh[]r$(cdocutils.nodes strong r%)r&}r'(h`Xbuildhi}r((hk]hl]hm]hn]hq]uhaj!h[]r)h}Xbuildr*r+}r,(h`Uhaj&ubahgUstrongr-ubh}X -- r.r/}r0(h`Uhaj!ubh}Xthe r1r2}r3(h`Xthe haj!ubh)r4}r5(h`X&:class:`~buildbot.process.build.Build`r6haj!hbhehghhi}r7(UreftypeXclasshhXbuildbot.process.build.BuildU refdomainXpyr8hn]hm]U refexplicithk]hl]hq]hhUpy:classr9hU py:moduler:huhsKXh[]r;h)r<}r=(h`j6hi}r>(hk]hl]r?(hj8Xpy-classr@ehm]hn]hq]uhaj4h[]rAh}XBuildrBrC}rD(h`Uhaj<ubahghubaubh}X instance controlling this step.rErF}rG(h`X instance controlling this step.haj!ubehghubahgU field_bodyrHubehgUfieldrIubaubh)rJ}rK(h`XThis method is called during setup to set the build instance controlling this slave. Subclasses can override this to get access to the build object as soon as it is available. The default implementation sets the :attr:`build` attribute.hajhbhehghhi}rL(hk]hl]hm]hn]hq]uhsKZhthh[]rM(h}XThis method is called during setup to set the build instance controlling this slave. Subclasses can override this to get access to the build object as soon as it is available. The default implementation sets the rNrO}rP(h`XThis method is called during setup to set the build instance controlling this slave. Subclasses can override this to get access to the build object as soon as it is available. The default implementation sets the hajJubh)rQ}rR(h`X :attr:`build`rShajJhbhehghhi}rT(UreftypeXattrhhXbuildU refdomainXpyrUhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKZh[]rVh)rW}rX(h`jShi}rY(hk]hl]rZ(hjUXpy-attrr[ehm]hn]hq]uhajQh[]r\h}Xbuildr]r^}r_(h`UhajWubahghubaubh}X attribute.r`ra}rb(h`X attribute.hajJubeubeubeubh)rc}rd(h`Uhajdhbhehghhi}re(hn]hm]hk]hl]hq]Uentries]rf(hX6build (buildbot.process.buildstep.BuildStep attribute)h0UtrgauhsNhthh[]ubh)rh}ri(h`Uhajdhbhehghhi}rj(hÉhXpyhn]hm]hk]hl]hq]hX attributerkhjkuhsNhthh[]rl(h)rm}rn(h`Xbuildrohajhhbhehghhi}rp(hn]rqh0ahhhm]hk]hl]hq]rrh0ahXBuildStep.buildhhhՉuhsKahthh[]rsh)rt}ru(h`johajmhbhehghhi}rv(hk]hl]hm]hn]hq]uhsKahthh[]rwh}Xbuildrxry}rz(h`Uhajtubaubaubjc)r{}r|(h`Uhajhhbhehgjfhi}r}(hk]hl]hm]hn]hq]uhsKahthh[]r~h)r}r(h`X'The build object controlling this step.rhaj{hbhehghhi}r(hk]hl]hm]hn]hq]uhsK`hthh[]rh}X'The build object controlling this step.rr}r(h`jhajubaubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX=setBuildSlave() (buildbot.process.buildstep.BuildStep method)h$UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XsetBuildSlave(build)hajhbhehghhi}r(hn]rh$ahhhm]hk]hl]hq]rh$ahXBuildStep.setBuildSlavehhhՉuhsKhhthh[]r(h)r}r(h`X setBuildSlavehajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhhthh[]rh}X setBuildSlaverr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhhthh[]rh)r}r(h`Xbuildhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xbuildrr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]rj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xbuildhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xbuildrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xthe rr}r(h`Xthe hajubh)r}r(h`X(:class:`~buildbot.buildslave.BuildSlave`rhajhbhehghhi}r(UreftypeXclasshhXbuildbot.buildslave.BuildSlaveU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKdh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X BuildSlaverr}r(h`Uhajubahghubaubh}X& instance on which this step will run.rr}r(h`X& instance on which this step will run.hajubehghubahgjHubehgjIubaubh)r}r(h`XSimilarly, this method is called with the build slave that will run this step. The default implementation sets the :attr:`buildslave` attribute.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKfhthh[]r(h}XsSimilarly, this method is called with the build slave that will run this step. The default implementation sets the rr}r(h`XsSimilarly, this method is called with the build slave that will run this step. The default implementation sets the hajubh)r}r(h`X:attr:`buildslave`rhajhbhehghhi}r(UreftypeXattrhhX buildslaveU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKfh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-attrrehm]hn]hq]uhajh[]rh}X buildslaverr}r(h`Uhajubahghubaubh}X attribute.rr}r(h`X attribute.hajubeubeubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX;buildslave (buildbot.process.buildstep.BuildStep attribute)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`X buildslaverhajhbhehghhi}r (hn]r hahhhm]hk]hl]hq]r hahXBuildStep.buildslavehhhՉuhsKlhthh[]r h)r }r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKlhthh[]rh}X buildslaverr}r(h`Uhaj ubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKlhthh[]rh)r}r(h`X(The build slave that will run this step.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKkhthh[]rh}X(The build slave that will run this step.rr}r(h`jhajubaubaubeubh)r }r!(h`Uhajdhbhehghhi}r"(hn]hm]hk]hl]hq]Uentries]r#(hXAsetDefaultWorkdir() (buildbot.process.buildstep.BuildStep method)h Utr$auhsNhthh[]ubh)r%}r&(h`Uhajdhbhehghhi}r'(hÉhXpyhn]hm]hk]hl]hq]hXmethodr(hj(uhsNhthh[]r)(h)r*}r+(h`XsetDefaultWorkdir(workdir)haj%hbhehghhi}r,(hn]r-h ahhhm]hk]hl]hq]r.h ahXBuildStep.setDefaultWorkdirhhhՉuhsKshthh[]r/(h)r0}r1(h`XsetDefaultWorkdirhaj*hbhehghhi}r2(hk]hl]hm]hn]hq]uhsKshthh[]r3h}XsetDefaultWorkdirr4r5}r6(h`Uhaj0ubaubh)r7}r8(h`Uhaj*hbhehghhi}r9(hk]hl]hm]hn]hq]uhsKshthh[]r:h)r;}r<(h`Xworkdirhi}r=(hk]hl]hm]hn]hq]uhaj7h[]r>h}Xworkdirr?r@}rA(h`Uhaj;ubahgjubaubeubjc)rB}rC(h`Uhaj%hbhehgjfhi}rD(hk]hl]hm]hn]hq]uhsKshthh[]rE(j)rF}rG(h`UhajBhbhehgj hi}rH(hk]hl]hm]hn]hq]uhsNhthh[]rIj)rJ}rK(h`Uhi}rL(hk]hl]hm]hn]hq]uhajFh[]rM(j)rN}rO(h`Uhi}rP(hk]hl]hm]hn]hq]uhajJh[]rQh}X ParametersrRrS}rT(h`UhajNubahgjubj)rU}rV(h`Uhi}rW(hk]hl]hm]hn]hq]uhajJh[]rXh)rY}rZ(h`Uhi}r[(hk]hl]hm]hn]hq]uhajUh[]r\(j%)r]}r^(h`Xworkdirhi}r_(hk]hl]hm]hn]hq]uhajYh[]r`h}Xworkdirrarb}rc(h`Uhaj]ubahgj-ubh}X -- rdre}rf(h`UhajYubh}X#the default workdir, from the buildrgrh}ri(h`X#the default workdir, from the buildhajYubehghubahgjHubehgjIubaubh)rj}rk(h`XThis method is called at build startup with the default workdir for the build. Steps which allow a workdir to be specified, but want to override it with the build's default workdir, can use this method to apply the default.rlhajBhbhehghhi}rm(hk]hl]hm]hn]hq]uhsKqhthh[]rnh}XThis method is called at build startup with the default workdir for the build. Steps which allow a workdir to be specified, but want to override it with the build's default workdir, can use this method to apply the default.rorp}rq(h`jlhajjubaubeubeubh)rr}rs(h`Uhajdhbhehghhi}rt(hn]hm]hk]hl]hq]Uentries]ru(hX=setupProgress() (buildbot.process.buildstep.BuildStep method)h5UtrvauhsNhthh[]ubh)rw}rx(h`Uhajdhbhehghhi}ry(hÉhXpyhn]hm]hk]hl]hq]hXmethodrzhjzuhsNhthh[]r{(h)r|}r}(h`XsetupProgress()hajwhbhehghhi}r~(hn]rh5ahhhm]hk]hl]hq]rh5ahXBuildStep.setupProgresshhhՉuhsKyhthh[]r(h)r}r(h`X setupProgresshaj|hbhehghhi}r(hk]hl]hm]hn]hq]uhsKyhthh[]rh}X setupProgressrr}r(h`Uhajubaubh)r}r(h`Uhaj|hbhehghhi}r(hk]hl]hm]hn]hq]uhsKyhthh[]ubeubjc)r}r(h`Uhajwhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKyhthh[]rh)r}r(h`XThis method is called during build setup to give the step a chance to set up progress tracking. It is only called if the build has :attr:`useProgress` set. There is rarely any reason to override this method.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKvhthh[]r(h}XThis method is called during build setup to give the step a chance to set up progress tracking. It is only called if the build has rr}r(h`XThis method is called during build setup to give the step a chance to set up progress tracking. It is only called if the build has hajubh)r}r(h`X:attr:`useProgress`rhajhbhehghhi}r(UreftypeXattrhhX useProgressU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKvh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-attrrehm]hn]hq]uhajh[]rh}X useProgressrr}r(h`Uhajubahghubaubh}X9 set. There is rarely any reason to override this method.rr}r(h`X9 set. There is rarely any reason to override this method.hajubeubaubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX9progress (buildbot.process.buildstep.BuildStep attribute)hBUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX attributerhjuhsNhthh[]r(h)r}r(h`Xprogressrhajhbhehghhi}r(hn]rhBahhhm]hk]hl]hq]rhBahXBuildStep.progresshhhՉuhsK}hthh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK}hthh[]rh}Xprogressrr}r(h`Uhajubaubaubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsK}hthh[]rh)r}r(h`XzIf the step is tracking progress, this is a :class:`~buildbot.status.progress.StepProgress` instance performing that task.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsK|hthh[]r(h}X,If the step is tracking progress, this is a rr}r(h`X,If the step is tracking progress, this is a hajubh)r}r(h`X/:class:`~buildbot.status.progress.StepProgress`rhajhbhehghhi}r(UreftypeXclasshhX%buildbot.status.progress.StepProgressU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsK|h[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X StepProgressrr}r(h`Uhajubahghubaubh}X instance performing that task.rr}r(h`X instance performing that task.hajubeubaubeubh)r}r(h`XQExecution of the step itself is governed by the following methods and attributes.rhajdhbhehghhi}r(hk]hl]hm]hn]hq]uhsK~hthh[]rh}XQExecution of the step itself is governed by the following methods and attributes.rr}r(h`jhajubaubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX9startStep() (buildbot.process.buildstep.BuildStep method)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XstartStep(remote)hajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXBuildStep.startStephhhՉuhsKhthh[]r(h)r}r(h`X startStephajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}X startSteprr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh)r}r(h`Xremotehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xremoterr}r(h`Uhajubahgjubaubeubjc)r}r (h`Uhajhbhehgjfhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (j)r }r (h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r (h`Uhi}r!(hk]hl]hm]hn]hq]uhajh[]r"(j%)r#}r$(h`Xremotehi}r%(hk]hl]hm]hn]hq]uhajh[]r&h}Xremoter'r(}r)(h`Uhaj#ubahgj-ubh}X -- r*r+}r,(h`Uhajubh}X%a remote reference to the slave-side r-r.}r/(h`X%a remote reference to the slave-side hajubh)r0}r1(h`X%:class:`~buildslave.bot.SlaveBuilder`r2hajhbhehghhi}r3(UreftypeXclasshhXbuildslave.bot.SlaveBuilderU refdomainXpyr4hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r5h)r6}r7(h`j2hi}r8(hk]hl]r9(hj4Xpy-classr:ehm]hn]hq]uhaj0h[]r;h}X SlaveBuilderr<r=}r>(h`Uhaj6ubahghubaubh}X instancer?r@}rA(h`X instancehajubehghubahgjHubehgjIubj)rB}rC(h`Uhi}rD(hk]hl]hm]hn]hq]uhaj h[]rE(j)rF}rG(h`Uhi}rH(hk]hl]hm]hn]hq]uhajBh[]rIh}XReturnsrJrK}rL(h`UhajFubahgjubj)rM}rN(h`Uhi}rO(hk]hl]hm]hn]hq]uhajBh[]rPh)rQ}rR(h`Uhi}rS(hk]hl]hm]hn]hq]uhajMh[]rTh}XDeferredrUrV}rW(h`XDeferredhajQubahghubahgjHubehgjIubeubh)rX}rY(h`XBegin the step. This is the build's interface to step execution. Subclasses should override :meth:`run` to implement custom behaviors.hajhbhehghhi}rZ(hk]hl]hm]hn]hq]uhsKhthh[]r[(h}X\Begin the step. This is the build's interface to step execution. Subclasses should override r\r]}r^(h`X\Begin the step. This is the build's interface to step execution. Subclasses should override hajXubh)r_}r`(h`X :meth:`run`rahajXhbhehghhi}rb(UreftypeXmethhhXrunU refdomainXpyrchn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rdh)re}rf(h`jahi}rg(hk]hl]rh(hjcXpy-methriehm]hn]hq]uhaj_h[]rjh}Xrunrkrl}rm(h`Uhajeubahghubaubh}X to implement custom behaviors.rnro}rp(h`X to implement custom behaviors.hajXubeubeubeubh)rq}rr(h`Uhajdhbhehghhi}rs(hn]hm]hk]hl]hq]Uentries]rt(hX3run() (buildbot.process.buildstep.BuildStep method)hKUtruauhsNhthh[]ubh)rv}rw(h`Uhajdhbhehghhi}rx(hÉhXpyhn]hm]hk]hl]hq]hXmethodryhjyuhsNhthh[]rz(h)r{}r|(h`Xrun()hajvhbhehghhi}r}(hn]r~hKahhhm]hk]hl]hq]rhKahX BuildStep.runhhhՉuhsKhthh[]r(h)r}r(h`Xrunhaj{hbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}Xrunrr}r(h`Uhajubaubh)r}r(h`Uhaj{hbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]ubeubjc)r}r(h`Uhajvhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]rj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xresult via Deferredrr}r(h`Xresult via DeferredhajubahghubahgjHubehgjIubaubh)r}r(h`XExecute the step. When this method returns (or when the Deferred it returns fires), the step is complete. The method's return value must be an integer, giving the result of the step -- a constant from :mod:`buildbot.status.results`. If the method raises an exception or its Deferred fires with failure, then the step will be completed with an EXCEPTION result. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the ``run`` method.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(h}XExecute the step. When this method returns (or when the Deferred it returns fires), the step is complete. The method's return value must be an integer, giving the result of the step -- a constant from rr}r(h`XExecute the step. When this method returns (or when the Deferred it returns fires), the step is complete. The method's return value must be an integer, giving the result of the step -- a constant from hajubh)r}r(h`X:mod:`buildbot.status.results`rhajhbhehghhi}r(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-modrehm]hn]hq]uhajh[]rh}Xbuildbot.status.resultsrr}r(h`Uhajubahghubaubh}X. If the method raises an exception or its Deferred fires with failure, then the step will be completed with an EXCEPTION result. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the rr}r(h`X. If the method raises an exception or its Deferred fires with failure, then the step will be completed with an EXCEPTION result. Any other output from the step (logfiles, status strings, URLs, etc.) is the responsibility of the hajubh)r}r(h`X``run``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xrunrr}r(h`Uhajubahghubh}X method.rr}r(h`X method.hajubeubh)r}r(h`XpSubclasses should override this method. Do *not* call :py:meth:`finished` or :py:meth:`failed` from this method.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(h}X+Subclasses should override this method. Do rr}r(h`X+Subclasses should override this method. Do hajubj*)r}r(h`X*not*hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnotrr}r(h`Uhajubahgj4ubh}X call rr}r(h`X call hajubh)r}r(h`X:py:meth:`finished`rhajhbhehghhi}r(UreftypeXmethhhXfinishedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xfinishedrr}r(h`Uhajubahghubaubh}X or rr}r(h`X or hajubh)r}r(h`X:py:meth:`failed`rhajhbhehghhi}r(UreftypeXmethhhXfailedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xfailedrr}r(h`Uhajubahghubaubh}X from this method.rr}r(h`X from this method.hajubeubeubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX5start() (buildbot.process.buildstep.BuildStep method)h+UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodr hj uhsNhthh[]r (h)r }r (h`Xstart()hajhbhehghhi}r (hn]rh+ahhhm]hk]hl]hq]rh+ahXBuildStep.starthhhՉuhsKhthh[]r(h)r}r(h`Xstarthaj hbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}Xstartrr}r(h`Uhajubaubh)r}r(h`Uhaj hbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]ubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(j)r}r (h`Uhajhbhehgj hi}r!(hk]hl]hm]hn]hq]uhsNhthh[]r"j)r#}r$(h`Uhi}r%(hk]hl]hm]hn]hq]uhajh[]r&(j)r'}r((h`Uhi}r)(hk]hl]hm]hn]hq]uhaj#h[]r*h}XReturnsr+r,}r-(h`Uhaj'ubahgjubj)r.}r/(h`Uhi}r0(hk]hl]hm]hn]hq]uhaj#h[]r1h)r2}r3(h`Uhi}r4(hk]hl]hm]hn]hq]uhaj.h[]r5(h)r6}r7(h`X``None``hi}r8(hk]hl]hm]hn]hq]uhaj2h[]r9h}XNoner:r;}r<(h`Uhaj6ubahghubh}X or r=r>}r?(h`X or haj2ubh)r@}rA(h`X(:data:`~buildbot.status.results.SKIPPED`rBhaj2hbhehghhi}rC(UreftypeXdatahhXbuildbot.status.results.SKIPPEDU refdomainXpyrDhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rEh)rF}rG(h`jBhi}rH(hk]hl]rI(hjDXpy-datarJehm]hn]hq]uhaj@h[]rKh}XSKIPPEDrLrM}rN(h`UhajFubahghubaubh}X, optionally via a Deferred.rOrP}rQ(h`X, optionally via a Deferred.haj2ubehghubahgjHubehgjIubaubh)rR}rS(h`XBegin the step. BuildSteps written before Buildbot-0.9.0 often override this method instead of :py:meth:`run`, but this approach is deprecated.hajhbhehghhi}rT(hk]hl]hm]hn]hq]uhsKhthh[]rU(h}X_Begin the step. BuildSteps written before Buildbot-0.9.0 often override this method instead of rVrW}rX(h`X_Begin the step. BuildSteps written before Buildbot-0.9.0 often override this method instead of hajRubh)rY}rZ(h`X:py:meth:`run`r[hajRhbhehghhi}r\(UreftypeXmethhhXrunU refdomainXpyr]hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r^h)r_}r`(h`j[hi}ra(hk]hl]rb(hj]Xpy-methrcehm]hn]hq]uhajYh[]rdh}Xrunrerf}rg(h`Uhaj_ubahghubaubh}X", but this approach is deprecated.rhri}rj(h`X", but this approach is deprecated.hajRubeubh)rk}rl(h`XWhen the step is done, it should call :py:meth:`finished`, with a result -- a constant from :mod:`buildbot.status.results`. The result will be handed off to the :py:class:`~buildbot.process.build.Build`.hajhbhehghhi}rm(hk]hl]hm]hn]hq]uhsKhthh[]rn(h}X&When the step is done, it should call rorp}rq(h`X&When the step is done, it should call hajkubh)rr}rs(h`X:py:meth:`finished`rthajkhbhehghhi}ru(UreftypeXmethhhXfinishedU refdomainXpyrvhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rwh)rx}ry(h`jthi}rz(hk]hl]r{(hjvXpy-methr|ehm]hn]hq]uhajrh[]r}h}Xfinishedr~r}r(h`Uhajxubahghubaubh}X#, with a result -- a constant from rr}r(h`X#, with a result -- a constant from hajkubh)r}r(h`X:mod:`buildbot.status.results`rhajkhbhehghhi}r(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-modrehm]hn]hq]uhajh[]rh}Xbuildbot.status.resultsrr}r(h`Uhajubahghubaubh}X'. The result will be handed off to the rr}r(h`X'. The result will be handed off to the hajkubh)r}r(h`X):py:class:`~buildbot.process.build.Build`rhajkhbhehghhi}r(UreftypeXclasshhXbuildbot.process.build.BuildU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}XBuildrr}r(h`Uhajubahghubaubh}X.r}r(h`X.hajkubeubh)r}r(h`XYIf the step encounters an exception, it should call :meth:`failed` with a Failure object.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(h}X4If the step encounters an exception, it should call rr}r(h`X4If the step encounters an exception, it should call hajubh)r}r(h`X:meth:`failed`rhajhbhehghhi}r(UreftypeXmethhhXfailedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xfailedrr}r(h`Uhajubahghubaubh}X with a Failure object.rr}r(h`X with a Failure object.hajubeubh)r}r(h`XIf the step decides it does not need to be run, :meth:`start` can return the constant :data:`~buildbot.status.results.SKIPPED`. In this case, it is not necessary to call :meth:`finished` directly.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(h}X0If the step decides it does not need to be run, rr}r(h`X0If the step decides it does not need to be run, hajubh)r}r(h`X :meth:`start`rhajhbhehghhi}r(UreftypeXmethhhXstartU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xstartrr}r(h`Uhajubahghubaubh}X can return the constant rr}r(h`X can return the constant hajubh)r}r(h`X(:data:`~buildbot.status.results.SKIPPED`rhajhbhehghhi}r(UreftypeXdatahhXbuildbot.status.results.SKIPPEDU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-datarehm]hn]hq]uhajh[]rh}XSKIPPEDrr}r(h`Uhajubahghubaubh}X,. In this case, it is not necessary to call rr}r(h`X,. In this case, it is not necessary to call hajubh)r}r(h`X:meth:`finished`rhajhbhehghhi}r(UreftypeXmethhhXfinishedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xfinishedrr}r(h`Uhajubahghubaubh}X directly.rr}r(h`X directly.hajubeubeubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX8finished() (buildbot.process.buildstep.BuildStep method)h/UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`Xfinished(results)hajhbhehghhi}r (hn]r h/ahhhm]hk]hl]hq]r h/ahXBuildStep.finishedhhhՉuhsKhthh[]r (h)r }r(h`Xfinishedhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}Xfinishedrr}r(h`Uhaj ubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh)r}r(h`Xresultshi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xresultsrr}r(h`Uhajubahgjubaubeubjc)r}r (h`Uhajhbhehgjfhi}r!(hk]hl]hm]hn]hq]uhsKhthh[]r"(j)r#}r$(h`Uhajhbhehgj hi}r%(hk]hl]hm]hn]hq]uhsNhthh[]r&j)r'}r((h`Uhi}r)(hk]hl]hm]hn]hq]uhaj#h[]r*(j)r+}r,(h`Uhi}r-(hk]hl]hm]hn]hq]uhaj'h[]r.h}X Parametersr/r0}r1(h`Uhaj+ubahgjubj)r2}r3(h`Uhi}r4(hk]hl]hm]hn]hq]uhaj'h[]r5h)r6}r7(h`Uhi}r8(hk]hl]hm]hn]hq]uhaj2h[]r9(j%)r:}r;(h`Xresultshi}r<(hk]hl]hm]hn]hq]uhaj6h[]r=h}Xresultsr>r?}r@(h`Uhaj:ubahgj-ubh}X -- rArB}rC(h`Uhaj6ubh}Xa constant from rDrE}rF(h`Xa constant from haj6ubh)rG}rH(h`X:mod:`~buildbot.status.results`rIhaj6hbhehghhi}rJ(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyrKhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rLh)rM}rN(h`jIhi}rO(hk]hl]rP(hjKXpy-modrQehm]hn]hq]uhajGh[]rRh}XresultsrSrT}rU(h`UhajMubahghubaubehghubahgjHubehgjIubaubh)rV}rW(h`X(A call to this method indicates that the step is finished and the build should analyze the results and perhaps proceed to the next step. The step should not perform any additional processing after calling this method. This method must only be called from the (deprecated) :py:meth:`start` method.hajhbhehghhi}rX(hk]hl]hm]hn]hq]uhsKhthh[]rY(h}XA call to this method indicates that the step is finished and the build should analyze the results and perhaps proceed to the next step. The step should not perform any additional processing after calling this method. This method must only be called from the (deprecated) rZr[}r\(h`XA call to this method indicates that the step is finished and the build should analyze the results and perhaps proceed to the next step. The step should not perform any additional processing after calling this method. This method must only be called from the (deprecated) hajVubh)r]}r^(h`X:py:meth:`start`r_hajVhbhehghhi}r`(UreftypeXmethhhXstartU refdomainXpyrahn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rbh)rc}rd(h`j_hi}re(hk]hl]rf(hjaXpy-methrgehm]hn]hq]uhaj]h[]rhh}Xstartrirj}rk(h`Uhajcubahghubaubh}X method.rlrm}rn(h`X method.hajVubeubeubeubh)ro}rp(h`Uhajdhbhehghhi}rq(hn]hm]hk]hl]hq]Uentries]rr(hX6failed() (buildbot.process.buildstep.BuildStep method)h2UtrsauhsNhthh[]ubh)rt}ru(h`Uhajdhbhehghhi}rv(hÉhXpyhn]hm]hk]hl]hq]hXmethodrwhjwuhsNhthh[]rx(h)ry}rz(h`Xfailed(failure)hajthbhehghhi}r{(hn]r|h2ahhhm]hk]hl]hq]r}h2ahXBuildStep.failedhhhՉuhsKhthh[]r~(h)r}r(h`Xfailedhajyhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh}Xfailedrr}r(h`Uhajubaubh)r}r(h`Uhajyhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]rh)r}r(h`Xfailurehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xfailurerr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajthbhehgjfhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]rj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xfailurehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xfailurerr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xa rr}r(h`Xa hajubh)r}r(h`X(:class:`~twisted.python.failure.Failure`rhajhbhehghhi}r(UreftypeXclasshhXtwisted.python.failure.FailureU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}XFailurerr}r(h`Uhajubahghubaubh}X instancerr}r(h`X instancehajubehghubahgjHubehgjIubaubh)r}r(h`XSimilar to :meth:`finished`, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(h}X Similar to rr}r(h`X Similar to hajubh)r}r(h`X:meth:`finished`rhajhbhehghhi}r(UreftypeXmethhhXfinishedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xfinishedrr}r(h`Uhajubahghubaubh}Xs, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.rr}r(h`Xs, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.hajubeubh)r}r(h`X4This method handles :exc:`BuildStepFailed` specially, by calling ``finished(FAILURE)``. This provides subclasses with a shortcut to stop execution of a step by raising this failure in a context where :meth:`failed` will catch it. This method must only be called from the (deprecated) :py:meth:`start` method.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsKhthh[]r(h}XThis method handles rr}r(h`XThis method handles hajubh)r}r(h`X:exc:`BuildStepFailed`rhajhbhehghhi}r(UreftypeXexchhXBuildStepFailedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-excrehm]hn]hq]uhajh[]rh}XBuildStepFailedrr}r(h`Uhajubahghubaubh}X specially, by calling rr}r(h`X specially, by calling hajubh)r}r(h`X``finished(FAILURE)``hi}r(hk]hl]hm]hn]hq]uhajh[]r h}Xfinished(FAILURE)r r }r (h`Uhajubahghubh}Xr. This provides subclasses with a shortcut to stop execution of a step by raising this failure in a context where r r }r (h`Xr. This provides subclasses with a shortcut to stop execution of a step by raising this failure in a context where hajubh)r }r (h`X:meth:`failed`r hajhbhehghhi}r (UreftypeXmethhhXfailedU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r (hk]hl]r (hj Xpy-methr ehm]hn]hq]uhaj h[]r h}Xfailedr r }r (h`Uhaj ubahghubaubh}XF will catch it. This method must only be called from the (deprecated) r r }r (h`XF will catch it. This method must only be called from the (deprecated) hajubh)r }r (h`X:py:meth:`start`r hajhbhehghhi}r (UreftypeXmethhhXstartU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r! (hk]hl]r" (hj Xpy-methr# ehm]hn]hq]uhaj h[]r$ h}Xstartr% r& }r' (h`Uhaj ubahghubaubh}X method.r( r) }r* (h`X method.hajubeubeubeubh)r+ }r, (h`Uhajdhbhehghhi}r- (hn]hm]hk]hl]hq]Uentries]r. (hX9interrupt() (buildbot.process.buildstep.BuildStep method)h3Utr/ auhsNhthh[]ubh)r0 }r1 (h`Uhajdhbhehghhi}r2 (hÉhXpyhn]hm]hk]hl]hq]hXmethodr3 hj3 uhsNhthh[]r4 (h)r5 }r6 (h`Xinterrupt(reason)haj0 hbhehghhi}r7 (hn]r8 h3ahhhm]hk]hl]hq]r9 h3ahXBuildStep.interrupthhhՉuhsKhthh[]r: (h)r; }r< (h`X interrupthaj5 hbhehghhi}r= (hk]hl]hm]hn]hq]uhsKhthh[]r> h}X interruptr? r@ }rA (h`Uhaj; ubaubh)rB }rC (h`Uhaj5 hbhehghhi}rD (hk]hl]hm]hn]hq]uhsKhthh[]rE h)rF }rG (h`Xreasonhi}rH (hk]hl]hm]hn]hq]uhajB h[]rI h}XreasonrJ rK }rL (h`UhajF ubahgjubaubeubjc)rM }rN (h`Uhaj0 hbhehgjfhi}rO (hk]hl]hm]hn]hq]uhsKhthh[]rP (j)rQ }rR (h`UhajM hbhehgj hi}rS (hk]hl]hm]hn]hq]uhsNhthh[]rT j)rU }rV (h`Uhi}rW (hk]hl]hm]hn]hq]uhajQ h[]rX (j)rY }rZ (h`Uhi}r[ (hk]hl]hm]hn]hq]uhajU h[]r\ h}X Parametersr] r^ }r_ (h`UhajY ubahgjubj)r` }ra (h`Uhi}rb (hk]hl]hm]hn]hq]uhajU h[]rc h)rd }re (h`Uhi}rf (hk]hl]hm]hn]hq]uhaj` h[]rg (j%)rh }ri (h`Xreasonhi}rj (hk]hl]hm]hn]hq]uhajd h[]rk h}Xreasonrl rm }rn (h`Uhajh ubahgj-ubh}X (ro rp }rq (h`Uhajd ubh}X string or rr rs }rt (h`X string or hajd ubh)ru }rv (h`X(:class:`~twisted.python.failure.Failure`rw hajd hbhehghhi}rx (UreftypeXclasshhXtwisted.python.failure.FailureU refdomainXpyry hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rz h)r{ }r| (h`jw hi}r} (hk]hl]r~ (hjy Xpy-classr ehm]hn]hq]uhaju h[]r h}XFailurer r }r (h`Uhaj{ ubahghubaubh}X)r }r (h`Uhajd ubh}X -- r r }r (h`Uhajd ubh}Xwhy the build was interruptedr r }r (h`Xwhy the build was interruptedhajd ubehghubahgjHubehgjIubaubh)r }r (h`XThis method is used from various control interfaces to stop a running step. The step should be brought to a halt as quickly as possible, by cancelling a remote command, killing a local process, etc. The step must still finish with either :meth:`finished` or :meth:`failed`.hajM hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (h}XThis method is used from various control interfaces to stop a running step. The step should be brought to a halt as quickly as possible, by cancelling a remote command, killing a local process, etc. The step must still finish with either r r }r (h`XThis method is used from various control interfaces to stop a running step. The step should be brought to a halt as quickly as possible, by cancelling a remote command, killing a local process, etc. The step must still finish with either haj ubh)r }r (h`X:meth:`finished`r haj hbhehghhi}r (UreftypeXmethhhXfinishedU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r (hk]hl]r (hj Xpy-methr ehm]hn]hq]uhaj h[]r h}Xfinishedr r }r (h`Uhaj ubahghubaubh}X or r r }r (h`X or haj ubh)r }r (h`X:meth:`failed`r haj hbhehghhi}r (UreftypeXmethhhXfailedU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r (hk]hl]r (hj Xpy-methr ehm]hn]hq]uhaj h[]r h}Xfailedr r }r (h`Uhaj ubahghubaubh}X.r }r (h`X.haj ubeubh)r }r (h`XThe ``reason`` parameter can be a string or, when a slave is lost during step processing, a :exc:`~twisted.internet.error.ConnectionLost` failure.hajM hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (h}XThe r r }r (h`XThe haj ubh)r }r (h`X ``reason``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xreasonr r }r (h`Uhaj ubahghubh}XN parameter can be a string or, when a slave is lost during step processing, a r r }r (h`XN parameter can be a string or, when a slave is lost during step processing, a haj ubh)r }r (h`X-:exc:`~twisted.internet.error.ConnectionLost`r haj hbhehghhi}r (UreftypeXexchhX%twisted.internet.error.ConnectionLostU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r (hk]hl]r (hj Xpy-excr ehm]hn]hq]uhaj h[]r h}XConnectionLostr r }r (h`Uhaj ubahghubaubh}X failure.r r }r (h`X failure.haj ubeubh)r }r (h`XmThe parent method handles any pending lock operations, and should be called by implementations in subclasses.r hajM hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}XmThe parent method handles any pending lock operations, and should be called by implementations in subclasses.r r }r (h`j haj ubaubeubeubh)r }r (h`Uhajdhbhehghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX8stopped (buildbot.process.buildstep.BuildStep attribute)hDUtr auhsNhthh[]ubh)r }r (h`Uhajdhbhehghhi}r (hÉhXpyhn]hm]hk]hl]hq]hX attributer hj uhsNhthh[]r (h)r }r (h`Xstoppedr haj hbhehghhi}r (hn]r hDahhhm]hk]hl]hq]r hDahXBuildStep.stoppedhhhՉuhsKhthh[]r h)r }r (h`j haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}Xstoppedr r }r (h`Uhaj ubaubaubjc)r }r (h`Uhaj hbhehgjfhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h)r }r (h`X_If false, then the step is running. If true, the step is not running, or has been interrupted.r haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}X_If false, then the step is running. If true, the step is not running, or has been interrupted.r r }r (h`j haj ubaubaubeubh)r }r (h`XA step can indicate its up-to-the-moment status using a short summary string. These methods allow step subclasses to produce such summaries.r hajdhbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}XA step can indicate its up-to-the-moment status using a short summary string. These methods allow step subclasses to produce such summaries.r r }r (h`j haj ubaubh)r }r (h`Uhajdhbhehghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX=updateSummary() (buildbot.process.buildstep.BuildStep method)hUtr auhsNhthh[]ubh)r }r (h`Uhajdhbhehghhi}r (hÉhXpyhn]hm]hk]hl]hq]hXmethodr hj uhsNhthh[]r (h)r }r (h`XupdateSummary()haj hbhehghhi}r (hn]r hahhhm]hk]hl]hq]r hahXBuildStep.updateSummaryhhhՉuhsKhthh[]r (h)r }r (h`X updateSummaryhaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}X updateSummaryr! r" }r# (h`Uhaj ubaubh)r$ }r% (h`Uhaj hbhehghhi}r& (hk]hl]hm]hn]hq]uhsKhthh[]ubeubjc)r' }r( (h`Uhaj hbhehgjfhi}r) (hk]hl]hm]hn]hq]uhsKhthh[]r* h)r+ }r, (h`X Update the summary, calling :py:meth:`getCurrentSummary` or :py:meth:`getResultSummary` as appropriate. New-style build steps should call this method any time the summary may have changed. This method is debounced, so even calling it for every log line is acceptable.haj' hbhehghhi}r- (hk]hl]hm]hn]hq]uhsKhthh[]r. (h}XUpdate the summary, calling r/ r0 }r1 (h`XUpdate the summary, calling haj+ ubh)r2 }r3 (h`X:py:meth:`getCurrentSummary`r4 haj+ hbhehghhi}r5 (UreftypeXmethhhXgetCurrentSummaryU refdomainXpyr6 hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r7 h)r8 }r9 (h`j4 hi}r: (hk]hl]r; (hj6 Xpy-methr< ehm]hn]hq]uhaj2 h[]r= h}XgetCurrentSummaryr> r? }r@ (h`Uhaj8 ubahghubaubh}X or rA rB }rC (h`X or haj+ ubh)rD }rE (h`X:py:meth:`getResultSummary`rF haj+ hbhehghhi}rG (UreftypeXmethhhXgetResultSummaryU refdomainXpyrH hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]rI h)rJ }rK (h`jF hi}rL (hk]hl]rM (hjH Xpy-methrN ehm]hn]hq]uhajD h[]rO h}XgetResultSummaryrP rQ }rR (h`UhajJ ubahghubaubh}X as appropriate. New-style build steps should call this method any time the summary may have changed. This method is debounced, so even calling it for every log line is acceptable.rS rT }rU (h`X as appropriate. New-style build steps should call this method any time the summary may have changed. This method is debounced, so even calling it for every log line is acceptable.haj+ ubeubaubeubh)rV }rW (h`Uhajdhbhehghhi}rX (hn]hm]hk]hl]hq]Uentries]rY (hXAgetCurrentSummary() (buildbot.process.buildstep.BuildStep method)h;UtrZ auhsNhthh[]ubh)r[ }r\ (h`Uhajdhbhehghhi}r] (hÉhXpyhn]hm]hk]hl]hq]hXmethodr^ hj^ uhsNhthh[]r_ (h)r` }ra (h`XgetCurrentSummary()haj[ hbhehghhi}rb (hn]rc h;ahhhm]hk]hl]hq]rd h;ahXBuildStep.getCurrentSummaryhhhՉuhsKhthh[]re (h)rf }rg (h`XgetCurrentSummaryhaj` hbhehghhi}rh (hk]hl]hm]hn]hq]uhsKhthh[]ri h}XgetCurrentSummaryrj rk }rl (h`Uhajf ubaubh)rm }rn (h`Uhaj` hbhehghhi}ro (hk]hl]hm]hn]hq]uhsKhthh[]ubeubjc)rp }rq (h`Uhaj[ hbhehgjfhi}rr (hk]hl]hm]hn]hq]uhsKhthh[]rs (j)rt }ru (h`Uhajp hbhehgj hi}rv (hk]hl]hm]hn]hq]uhsNhthh[]rw j)rx }ry (h`Uhi}rz (hk]hl]hm]hn]hq]uhajt h[]r{ (j)r| }r} (h`Uhi}r~ (hk]hl]hm]hn]hq]uhajx h[]r h}XReturnsr r }r (h`Uhaj| ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhajx h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X#dictionary, optionally via Deferredr r }r (h`X#dictionary, optionally via Deferredhaj ubahghubahgjHubehgjIubaubh)r }r (h`XReturns a dictionary containing status information for a running step. The dictionary can a ``step`` key with a unicode value giving a summary for display with the step. This method is only called while the step is running.hajp hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (h}X\Returns a dictionary containing status information for a running step. The dictionary can a r r }r (h`X\Returns a dictionary containing status information for a running step. The dictionary can a haj ubh)r }r (h`X``step``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstepr r }r (h`Uhaj ubahghubh}X{ key with a unicode value giving a summary for display with the step. This method is only called while the step is running.r r }r (h`X{ key with a unicode value giving a summary for display with the step. This method is only called while the step is running.haj ubeubh)r }r (h`XxNew-style build steps should override this method to provide a more interesting summary than the default ``u"running"``.hajp hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (h}XiNew-style build steps should override this method to provide a more interesting summary than the default r r }r (h`XiNew-style build steps should override this method to provide a more interesting summary than the default haj ubh)r }r (h`X``u"running"``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X u"running"r r }r (h`Uhaj ubahghubh}X.r }r (h`X.haj ubeubeubeubh)r }r (h`Uhajdhbhehghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX@getResultSummary() (buildbot.process.buildstep.BuildStep method)h7Utr auhsNhthh[]ubh)r }r (h`Uhajdhbhehghhi}r (hÉhXpyhn]hm]hk]hl]hq]hXmethodr hj uhsNhthh[]r (h)r }r (h`XgetResultSummary()haj hbhehghhi}r (hn]r h7ahhhm]hk]hl]hq]r h7ahXBuildStep.getResultSummaryhhhՉuhsKhthh[]r (h)r }r (h`XgetResultSummaryhaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}XgetResultSummaryr r }r (h`Uhaj ubaubh)r }r (h`Uhaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]ubeubjc)r }r (h`Uhaj hbhehgjfhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (j)r }r (h`Uhaj hbhehgj hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}XReturnsr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X#dictionary, optionally via Deferredr r }r (h`X#dictionary, optionally via Deferredhaj ubahghubahgjHubehgjIubaubh)r }r (h`XReturns a dictionary containing status information for a completed step. The dictionary can have keys ``step`` and ``build``, each with unicode values. The ``step`` key gives a summary for display with the step, while the ``build`` key gives a summary for display with the entire build. The latter should be used sparingly, and include only information that the user would find relevant for the entire build, such as a number of test failures. Either or both keys can be omitted.haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r (h}XfReturns a dictionary containing status information for a completed step. The dictionary can have keys r r }r (h`XfReturns a dictionary containing status information for a completed step. The dictionary can have keys haj ubh)r }r (h`X``step``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstepr r }r (h`Uhaj ubahghubh}X and r r }r (h`X and haj ubh)r }r (h`X ``build``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xbuildr r }r (h`Uhaj ubahghubh}X , each with unicode values. The r r }r (h`X , each with unicode values. The haj ubh)r }r (h`X``step``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstepr r }r (h`Uhaj ubahghubh}X: key gives a summary for display with the step, while the r r }r (h`X: key gives a summary for display with the step, while the haj ubh)r }r (h`X ``build``hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xbuildr r }r (h`Uhaj ubahghubh}X key gives a summary for display with the entire build. The latter should be used sparingly, and include only information that the user would find relevant for the entire build, such as a number of test failures. Either or both keys can be omitted.r r }r (h`X key gives a summary for display with the entire build. The latter should be used sparingly, and include only information that the user would find relevant for the entire build, such as a number of test failures. Either or both keys can be omitted.haj ubeubh)r }r (h`X6This method is only called while the step is finished.r haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}X6This method is only called while the step is finished.r r }r (h`j haj ubaubh)r }r (h`XNew-style build steps should override this method to provide a more interesting summary than the default ``u"running"``, or to provide any build summary information.haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r! (h}XiNew-style build steps should override this method to provide a more interesting summary than the default r" r# }r$ (h`XiNew-style build steps should override this method to provide a more interesting summary than the default haj ubh)r% }r& (h`X``u"running"``hi}r' (hk]hl]hm]hn]hq]uhaj h[]r( h}X u"running"r) r* }r+ (h`Uhaj% ubahghubh}X., or to provide any build summary information.r, r- }r. (h`X., or to provide any build summary information.haj ubeubeubeubh)r/ }r0 (h`UhajdhbNhghhi}r1 (hn]hm]hk]hl]hq]Uentries]r2 (hX8describe() (buildbot.process.buildstep.BuildStep method)hUtr3 auhsNhthh[]ubh)r4 }r5 (h`UhajdhbNhghhi}r6 (hÉhXpyhn]hm]hk]hl]hq]hXmethodr7 hj7 uhsNhthh[]r8 (h)r9 }r: (h`Xdescribe(done=False)haj4 hbhehghhi}r; (hn]r< hahhhm]hk]hl]hq]r= hahXBuildStep.describehhhՉuhsKhthh[]r> (h)r? }r@ (h`Xdescribehaj9 hbhehghhi}rA (hk]hl]hm]hn]hq]uhsKhthh[]rB h}XdescriberC rD }rE (h`Uhaj? ubaubh)rF }rG (h`Uhaj9 hbhehghhi}rH (hk]hl]hm]hn]hq]uhsKhthh[]rI h)rJ }rK (h`X done=Falsehi}rL (hk]hl]hm]hn]hq]uhajF h[]rM h}X done=FalserN rO }rP (h`UhajJ ubahgjubaubeubjc)rQ }rR (h`Uhaj4 hbhehgjfhi}rS (hk]hl]hm]hn]hq]uhsKhthh[]rT (j)rU }rV (h`UhajQ hbNhgj hi}rW (hk]hl]hm]hn]hq]uhsNhthh[]rX (j)rY }rZ (h`Uhi}r[ (hk]hl]hm]hn]hq]uhajU h[]r\ (j)r] }r^ (h`Uhi}r_ (hk]hl]hm]hn]hq]uhajY h[]r` h}X Parametersra rb }rc (h`Uhaj] ubahgjubj)rd }re (h`Uhi}rf (hk]hl]hm]hn]hq]uhajY h[]rg h)rh }ri (h`Uhi}rj (hk]hl]hm]hn]hq]uhajd h[]rk (j%)rl }rm (h`Xdonehi}rn (hk]hl]hm]hn]hq]uhajh h[]ro h}Xdonerp rq }rr (h`Uhajl ubahgj-ubh}X -- rs rt }ru (h`Uhajh ubh}XIf true, the step is finished.rv rw }rx (h`XIf true, the step is finished.hajh ubehghubahgjHubehgjIubj)ry }rz (h`Uhi}r{ (hk]hl]hm]hn]hq]uhajU h[]r| (j)r} }r~ (h`Uhi}r (hk]hl]hm]hn]hq]uhajy h[]r h}XReturnsr r }r (h`Uhaj} ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhajy h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xlist of stringsr r }r (h`Xlist of stringshaj ubahghubahgjHubehgjIubeubh)r }r (h`XDescribe the step succinctly. The return value should be a sequence of short strings suitable for display in a horizontally constrained space.r hajQ hbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}XDescribe the step succinctly. The return value should be a sequence of short strings suitable for display in a horizontally constrained space.r r }r (h`j haj ubaubcdocutils.nodes note r )r }r (h`XBe careful not to assume that the step has been started in this method. In relatively rare circumstances, steps are described before they have started. Ideally, unit tests should be used to ensure that this method is resilient.hajQ hbhehgUnoter hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r h)r }r (h`XBe careful not to assume that the step has been started in this method. In relatively rare circumstances, steps are described before they have started. Ideally, unit tests should be used to ensure that this method is resilient.r haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKh[]r h}XBe careful not to assume that the step has been started in this method. In relatively rare circumstances, steps are described before they have started. Ideally, unit tests should be used to ensure that this method is resilient.r r }r (h`j haj ubaubaubj )r }r (h`X~This method is not called for new-style steps. Instead, override :py:meth:`getCurrentSummary` and :py:meth:`getResultSummary`.hajQ hbhehgj hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r h)r }r (h`X~This method is not called for new-style steps. Instead, override :py:meth:`getCurrentSummary` and :py:meth:`getResultSummary`.haj hbhehghhi}r (hk]hl]hm]hn]hq]uhsKh[]r (h}XAThis method is not called for new-style steps. Instead, override r r }r (h`XAThis method is not called for new-style steps. Instead, override haj ubh)r }r (h`X:py:meth:`getCurrentSummary`r haj hbhehghhi}r (UreftypeXmethhhXgetCurrentSummaryU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r (hk]hl]r (hj Xpy-methr ehm]hn]hq]uhaj h[]r h}XgetCurrentSummaryr r }r (h`Uhaj ubahghubaubh}X and r r }r (h`X and haj ubh)r }r (h`X:py:meth:`getResultSummary`r haj hbhehghhi}r (UreftypeXmethhhXgetResultSummaryU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsKh[]r h)r }r (h`j hi}r (hk]hl]r (hj Xpy-methr ehm]hn]hq]uhaj h[]r h}XgetResultSummaryr r }r (h`Uhaj ubahghubaubh}X.r }r (h`X.haj ubeubaubeubeubh)r }r (h`XBuild steps have statistics, a simple key/value store of data which can later be aggregated over all steps in a build. Note that statistics are not preserved after a build is complete.r hajdhbhehghhi}r (hk]hl]hm]hn]hq]uhsKhthh[]r h}XBuild steps have statistics, a simple key/value store of data which can later be aggregated over all steps in a build. Note that statistics are not preserved after a build is complete.r r }r (h`j haj ubaubh)r }r (h`UhajdhbNhghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX<hasStatistic() (buildbot.process.buildstep.BuildStep method)hAUtr auhsNhthh[]ubh)r }r (h`UhajdhbNhghhi}r (hÉhXpyr hn]hm]hk]hl]hq]hXmethodr hj uhsNhthh[]r (h)r }r (h`XhasStatistic(stat)haj hbhehghhi}r (hn]r hAahhhm]hk]hl]hq]r hAahXBuildStep.hasStatistichhhՉuhsMhthh[]r (h)r }r (h`X hasStatistichaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r h}X hasStatisticr r }r (h`Uhaj ubaubh)r }r (h`Uhaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r h)r }r (h`Xstathi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstatr r }r (h`Uhaj ubahgjubaubeubjc)r }r (h`Uhaj hbhehgjfhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r j)r }r (h`Uhaj hbNhgj hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X Parametersr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j%)r }r (h`Xstathi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstatr r }r (h`Uhaj ubahgj-ubh}X (r r! }r" (h`Uhaj ubh)r# }r$ (h`Uhi}r% (UreftypeUobjr& U reftargetXstringr' U refdomainj hn]hm]U refexplicithk]hl]hq]uhaj h[]r( j*)r) }r* (h`j' hi}r+ (hk]hl]hm]hn]hq]uhaj# h[]r, h}Xstringr- r. }r/ (h`Uhaj) ubahgj4ubahghubh}X)r0 }r1 (h`Uhaj ubh}X -- r2 r3 }r4 (h`Uhaj ubh}Xname of the statisticr5 r6 }r7 (h`Xname of the statistichaj ubehghubahgjHubehgjIubj)r8 }r9 (h`Uhi}r: (hk]hl]hm]hn]hq]uhaj h[]r; (j)r< }r= (h`Uhi}r> (hk]hl]hm]hn]hq]uhaj8 h[]r? h}XReturnsr@ rA }rB (h`Uhaj< ubahgjubj)rC }rD (h`Uhi}rE (hk]hl]hm]hn]hq]uhaj8 h[]rF h)rG }rH (h`Uhi}rI (hk]hl]hm]hn]hq]uhajC h[]rJ h}X)True if the statistic exists on this steprK rL }rM (h`X)True if the statistic exists on this stephajG ubahghubahgjHubehgjIubeubaubeubh)rN }rO (h`UhajdhbNhghhi}rP (hn]hm]hk]hl]hq]Uentries]rQ (hX<getStatistic() (buildbot.process.buildstep.BuildStep method)hUtrR auhsNhthh[]ubh)rS }rT (h`UhajdhbNhghhi}rU (hÉhXpyrV hn]hm]hk]hl]hq]hXmethodrW hjW uhsNhthh[]rX (h)rY }rZ (h`X getStatistic(stat, default=None)hajS hbhehghhi}r[ (hn]r\ hahhhm]hk]hl]hq]r] hahXBuildStep.getStatistichhhՉuhsM hthh[]r^ (h)r_ }r` (h`X getStatistichajY hbhehghhi}ra (hk]hl]hm]hn]hq]uhsM hthh[]rb h}X getStatisticrc rd }re (h`Uhaj_ ubaubh)rf }rg (h`UhajY hbhehghhi}rh (hk]hl]hm]hn]hq]uhsM hthh[]ri (h)rj }rk (h`Xstathi}rl (hk]hl]hm]hn]hq]uhajf h[]rm h}Xstatrn ro }rp (h`Uhajj ubahgjubh)rq }rr (h`X default=Nonehi}rs (hk]hl]hm]hn]hq]uhajf h[]rt h}X default=Noneru rv }rw (h`Uhajq ubahgjubeubeubjc)rx }ry (h`UhajS hbhehgjfhi}rz (hk]hl]hm]hn]hq]uhsM hthh[]r{ j)r| }r} (h`Uhajx hbNhgj hi}r~ (hk]hl]hm]hn]hq]uhsNhthh[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj| h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X Parametersr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r cdocutils.nodes bullet_list r )r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (cdocutils.nodes list_item r )r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j%)r }r (h`Xstathi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstatr r }r (h`Uhaj ubahgj-ubh}X (r r }r (h`Uhaj ubh)r }r (h`Uhi}r (Ureftypej& U reftargetXstringr U refdomainjV hn]hm]U refexplicithk]hl]hq]uhaj h[]r j*)r }r (h`j hi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xstringr r }r (h`Uhaj ubahgj4ubahghubh}X)r }r (h`Uhaj ubh}X -- r r }r (h`Uhaj ubh}Xname of the statisticr r }r (h`Xname of the statistichaj ubehghubahgU list_itemr ubj )r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j%)r }r (h`Xdefaulthi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xdefaultr r }r (h`Uhaj ubahgj-ubh}X -- r r }r (h`Uhaj ubh}X-default value if the statistic does not existr r }r (h`X-default value if the statistic does not existhaj ubehghubahgj ubehgU bullet_listr ubahgjHubehgjIubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj| h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}XReturnsr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X,value of the statistic, or the default valuer r }r (h`X,value of the statistic, or the default valuehaj ubahghubahgjHubehgjIubeubaubeubh)r }r (h`UhajdhbNhghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX=getStatistics() (buildbot.process.buildstep.BuildStep method)hUtr auhsNhthh[]ubh)r }r (h`UhajdhbNhghhi}r (hÉhXpyhn]hm]hk]hl]hq]hXmethodr hj uhsNhthh[]r (h)r }r (h`XgetStatistics()haj hbhehghhi}r (hn]r hahhhm]hk]hl]hq]r hahXBuildStep.getStatisticshhhՉuhsMhthh[]r (h)r }r (h`X getStatisticshaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r h}X getStatisticsr r }r (h`Uhaj ubaubh)r }r (h`Uhaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsMhthh[]ubeubjc)r }r (h`Uhaj hbhehgjfhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r j)r }r (h`Uhaj hbNhgj hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}XReturnsr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X,a dictionary of all statistics for this stepr r }r (h`X,a dictionary of all statistics for this stephaj ubahghubahgjHubehgjIubaubaubeubh)r }r! (h`UhajdhbNhghhi}r" (hn]hm]hk]hl]hq]Uentries]r# (hX<setStatistic() (buildbot.process.buildstep.BuildStep method)hUtr$ auhsNhthh[]ubh)r% }r& (h`UhajdhbNhghhi}r' (hÉhXpyr( hn]hm]hk]hl]hq]hXmethodr) hj) uhsNhthh[]r* (h)r+ }r, (h`XsetStatistic(stat, value)haj% hbhehghhi}r- (hn]r. hahhhm]hk]hl]hq]r/ hahXBuildStep.setStatistichhhՉuhsMhthh[]r0 (h)r1 }r2 (h`X setStatistichaj+ hbhehghhi}r3 (hk]hl]hm]hn]hq]uhsMhthh[]r4 h}X setStatisticr5 r6 }r7 (h`Uhaj1 ubaubh)r8 }r9 (h`Uhaj+ hbhehghhi}r: (hk]hl]hm]hn]hq]uhsMhthh[]r; (h)r< }r= (h`Xstathi}r> (hk]hl]hm]hn]hq]uhaj8 h[]r? h}Xstatr@ rA }rB (h`Uhaj< ubahgjubh)rC }rD (h`Xvaluehi}rE (hk]hl]hm]hn]hq]uhaj8 h[]rF h}XvaluerG rH }rI (h`UhajC ubahgjubeubeubjc)rJ }rK (h`Uhaj% hbhehgjfhi}rL (hk]hl]hm]hn]hq]uhsMhthh[]rM j)rN }rO (h`UhajJ hbNhgj hi}rP (hk]hl]hm]hn]hq]uhsNhthh[]rQ (j)rR }rS (h`Uhi}rT (hk]hl]hm]hn]hq]uhajN h[]rU (j)rV }rW (h`Uhi}rX (hk]hl]hm]hn]hq]uhajR h[]rY h}X ParametersrZ r[ }r\ (h`UhajV ubahgjubj)r] }r^ (h`Uhi}r_ (hk]hl]hm]hn]hq]uhajR h[]r` j )ra }rb (h`Uhi}rc (hk]hl]hm]hn]hq]uhaj] h[]rd (j )re }rf (h`Uhi}rg (hk]hl]hm]hn]hq]uhaja h[]rh h)ri }rj (h`Uhi}rk (hk]hl]hm]hn]hq]uhaje h[]rl (j%)rm }rn (h`Xstathi}ro (hk]hl]hm]hn]hq]uhaji h[]rp h}Xstatrq rr }rs (h`Uhajm ubahgj-ubh}X (rt ru }rv (h`Uhaji ubh)rw }rx (h`Uhi}ry (Ureftypej& U reftargetXstringrz U refdomainj( hn]hm]U refexplicithk]hl]hq]uhaji h[]r{ j*)r| }r} (h`jz hi}r~ (hk]hl]hm]hn]hq]uhajw h[]r h}Xstringr r }r (h`Uhaj| ubahgj4ubahghubh}X)r }r (h`Uhaji ubh}X -- r r }r (h`Uhaji ubh}Xname of the statisticr r }r (h`Xname of the statistichaji ubehghubahgj ubj )r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaja h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j%)r }r (h`Xvaluehi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xvaluer r }r (h`Uhaj ubahgj-ubh}X -- r r }r (h`Uhaj ubh}X value to assign to the statisticr r }r (h`X value to assign to the statistichaj ubehghubahgj ubehgj ubahgjHubehgjIubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhajN h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}XReturnsr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xvalue of the statisticr r }r (h`Xvalue of the statistichaj ubahghubahgjHubehgjIubeubaubeubh)r }r (h`XrBuild steps support progress metrics - values that increase roughly linearly during the execution of the step, and can thus be used to calculate an expected completion time for a running step. A metric may be a count of lines logged, tests executed, or files compiled. The build mechanics will take care of translating this progress information into an ETA for the user.r hajdhbhehghhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r h}XrBuild steps support progress metrics - values that increase roughly linearly during the execution of the step, and can thus be used to calculate an expected completion time for a running step. A metric may be a count of lines logged, tests executed, or files compiled. The build mechanics will take care of translating this progress information into an ETA for the user.r r }r (h`j haj ubaubh)r }r (h`Uhajdhbhehghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX;setProgress() (buildbot.process.buildstep.BuildStep method)h"Utr auhsNhthh[]ubh)r }r (h`Uhajdhbhehghhi}r (hÉhXpyr hn]hm]hk]hl]hq]hXmethodr hj uhsNhthh[]r (h)r }r (h`XsetProgress(metric, value)haj hbhehghhi}r (hn]r h"ahhhm]hk]hl]hq]r h"ahXBuildStep.setProgresshhhՉuhsM$hthh[]r (h)r }r (h`X setProgresshaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsM$hthh[]r h}X setProgressr r }r (h`Uhaj ubaubh)r }r (h`Uhaj hbhehghhi}r (hk]hl]hm]hn]hq]uhsM$hthh[]r (h)r }r (h`Xmetrichi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xmetricr r }r (h`Uhaj ubahgjubh)r }r (h`Xvaluehi}r (hk]hl]hm]hn]hq]uhaj h[]r h}Xvaluer r }r (h`Uhaj ubahgjubeubeubjc)r }r (h`Uhaj hbhehgjfhi}r (hk]hl]hm]hn]hq]uhsM$hthh[]r (j)r }r (h`Uhaj hbhehgj hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r (j)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r h}X Parametersr r }r (h`Uhaj ubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhaj h[]r j )r }r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]r(j )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]rh)r}r(h`Uhi}r (hk]hl]hm]hn]hq]uhajh[]r (j%)r }r (h`Xmetrichi}r (hk]hl]hm]hn]hq]uhajh[]rh}Xmetricrr}r(h`Uhaj ubahgj-ubh}X (rr}r(h`Uhajubh)r}r(h`Uhi}r(Ureftypej& U reftargetXstringrU refdomainj hn]hm]U refexplicithk]hl]hq]uhajh[]rj*)r}r(h`jhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xstringrr}r (h`Uhajubahgj4ubahghubh}X)r!}r"(h`Uhajubh}X -- r#r$}r%(h`Uhajubh}Xthe metric to updater&r'}r((h`Xthe metric to updatehajubehghubahgj ubj )r)}r*(h`Uhi}r+(hk]hl]hm]hn]hq]uhaj h[]r,h)r-}r.(h`Uhi}r/(hk]hl]hm]hn]hq]uhaj)h[]r0(j%)r1}r2(h`Xvaluehi}r3(hk]hl]hm]hn]hq]uhaj-h[]r4h}Xvaluer5r6}r7(h`Uhaj1ubahgj-ubh}X (r8r9}r:(h`Uhaj-ubh)r;}r<(h`Uhi}r=(Ureftypej& U reftargetXintegerr>U refdomainj hn]hm]U refexplicithk]hl]hq]uhaj-h[]r?j*)r@}rA(h`j>hi}rB(hk]hl]hm]hn]hq]uhaj;h[]rCh}XintegerrDrE}rF(h`Uhaj@ubahgj4ubahghubh}X)rG}rH(h`Uhaj-ubh}X -- rIrJ}rK(h`Uhaj-ubh}Xthe new value for the metricrLrM}rN(h`Xthe new value for the metrichaj-ubehghubahgj ubehgj ubahgjHubehgjIubaubh)rO}rP(h`XtUpdate a progress metric. This should be called by subclasses that can provide useful progress-tracking information.rQhaj hbhehghhi}rR(hk]hl]hm]hn]hq]uhsM hthh[]rSh}XtUpdate a progress metric. This should be called by subclasses that can provide useful progress-tracking information.rTrU}rV(h`jQhajOubaubh)rW}rX(h`XFThe specified metric name must be included in :attr:`progressMetrics`.haj hbhehghhi}rY(hk]hl]hm]hn]hq]uhsM#hthh[]rZ(h}X.The specified metric name must be included in r[r\}r](h`X.The specified metric name must be included in hajWubh)r^}r_(h`X:attr:`progressMetrics`r`hajWhbhehghhi}ra(UreftypeXattrhhXprogressMetricsU refdomainXpyrbhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsM#h[]rch)rd}re(h`j`hi}rf(hk]hl]rg(hjbXpy-attrrhehm]hn]hq]uhaj^h[]rih}XprogressMetricsrjrk}rl(h`Uhajdubahghubaubh}X.rm}rn(h`X.hajWubeubeubeubh)ro}rp(h`X~The following methods are provided as utilities to subclasses. These methods should only be invoked after the step is started.rqhajdhbhehghhi}rr(hk]hl]hm]hn]hq]uhsM%hthh[]rsh}X~The following methods are provided as utilities to subclasses. These methods should only be invoked after the step is started.rtru}rv(h`jqhajoubaubh)rw}rx(h`Uhajdhbhehghhi}ry(hn]hm]hk]hl]hq]Uentries]rz(hX<slaveVersion() (buildbot.process.buildstep.BuildStep method)h)Utr{auhsNhthh[]ubh)r|}r}(h`Uhajdhbhehghhi}r~(hÉhXpyrhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`X&slaveVersion(command, oldversion=None)haj|hbhehghhi}r(hn]rh)ahhhm]hk]hl]hq]rh)ahXBuildStep.slaveVersionhhhՉuhsM7hthh[]r(h)r}r(h`X slaveVersionhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM7hthh[]rh}X slaveVersionrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM7hthh[]r(h)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgjubh)r}r(h`Xoldversion=Nonehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xoldversion=Nonerr}r(h`Uhajubahgjubeubeubjc)r}r(h`Uhaj|hbhehgjfhi}r(hk]hl]hm]hn]hq]uhsM7hthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgj-ubh}X (rr}r(h`Uhajubh)r}r(h`Uhi}r(Ureftypej& U reftargetXstringrU refdomainjhn]hm]U refexplicithk]hl]hq]uhajh[]rj*)r}r(h`jhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xstringrr}r(h`Uhajubahgj4ubahghubh}X)r}r(h`Uhajubh}X -- rr}r(h`Uhajubh}Xcommand to examinerr}r(h`Xcommand to examinehajubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`X oldversionhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X oldversionrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}X4return value if the slave does not specify a versionrr}r(h`X4return value if the slave does not specify a versionhajubehghubahgj ubehgj ubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r h}Xstringr r }r (h`XstringhajubahghubahgjHubehgjIubeubh)r }r(h`X9Fetch the version of the named command, as specified on the slave. In practice, all commands on a slave have the same version, but passing ``command`` is still useful to ensure that the command is implemented on the slave. If the command is not implemented on the slave, :meth:`slaveVersion` will return ``None``.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM/hthh[]r(h}XFetch the version of the named command, as specified on the slave. In practice, all commands on a slave have the same version, but passing rr}r(h`XFetch the version of the named command, as specified on the slave. In practice, all commands on a slave have the same version, but passing haj ubh)r}r(h`X ``command``hi}r(hk]hl]hm]hn]hq]uhaj h[]rh}Xcommandrr}r(h`Uhajubahghubh}Xy is still useful to ensure that the command is implemented on the slave. If the command is not implemented on the slave, rr}r(h`Xy is still useful to ensure that the command is implemented on the slave. If the command is not implemented on the slave, haj ubh)r}r(h`X:meth:`slaveVersion`r haj hbhehghhi}r!(UreftypeXmethhhX slaveVersionU refdomainXpyr"hn]hm]U refexplicithk]hl]hq]hhj9hj:huhsM/h[]r#h)r$}r%(h`j hi}r&(hk]hl]r'(hj"Xpy-methr(ehm]hn]hq]uhajh[]r)h}X slaveVersionr*r+}r,(h`Uhaj$ubahghubaubh}X will return r-r.}r/(h`X will return haj ubh)r0}r1(h`X``None``hi}r2(hk]hl]hm]hn]hq]uhaj h[]r3h}XNoner4r5}r6(h`Uhaj0ubahghubh}X.r7}r8(h`X.haj ubeubh)r9}r:(h`XtVersions take the form ``x.y`` where ``x`` and ``y`` are integers, and are compared as expected for version numbers.hajhbhehghhi}r;(hk]hl]hm]hn]hq]uhsM3hthh[]r<(h}XVersions take the form r=r>}r?(h`XVersions take the form haj9ubh)r@}rA(h`X``x.y``hi}rB(hk]hl]hm]hn]hq]uhaj9h[]rCh}Xx.yrDrE}rF(h`Uhaj@ubahghubh}X where rGrH}rI(h`X where haj9ubh)rJ}rK(h`X``x``hi}rL(hk]hl]hm]hn]hq]uhaj9h[]rMh}XxrN}rO(h`UhajJubahghubh}X and rPrQ}rR(h`X and haj9ubh)rS}rT(h`X``y``hi}rU(hk]hl]hm]hn]hq]uhaj9h[]rVh}XyrW}rX(h`UhajSubahghubh}X@ are integers, and are compared as expected for version numbers.rYrZ}r[(h`X@ are integers, and are compared as expected for version numbers.haj9ubeubh)r\}r](h`XBuildbot versions older than 0.5.0 did not support version queries; in this case, :meth:`slaveVersion` will return ``oldVersion``. Since such ancient versions of Buildbot are no longer in use, this functionality is largely vestigial.hajhbhehghhi}r^(hk]hl]hm]hn]hq]uhsM5hthh[]r_(h}XRBuildbot versions older than 0.5.0 did not support version queries; in this case, r`ra}rb(h`XRBuildbot versions older than 0.5.0 did not support version queries; in this case, haj\ubh)rc}rd(h`X:meth:`slaveVersion`rehaj\hbhehghhi}rf(UreftypeXmethhhX slaveVersionU refdomainXpyrghn]hm]U refexplicithk]hl]hq]hhj9hj:huhsM5h[]rhh)ri}rj(h`jehi}rk(hk]hl]rl(hjgXpy-methrmehm]hn]hq]uhajch[]rnh}X slaveVersionrorp}rq(h`Uhajiubahghubaubh}X will return rrrs}rt(h`X will return haj\ubh)ru}rv(h`X``oldVersion``hi}rw(hk]hl]hm]hn]hq]uhaj\h[]rxh}X oldVersionryrz}r{(h`Uhajuubahghubh}Xh. Since such ancient versions of Buildbot are no longer in use, this functionality is largely vestigial.r|r}}r~(h`Xh. Since such ancient versions of Buildbot are no longer in use, this functionality is largely vestigial.haj\ubeubeubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXGslaveVersionIsOlderThan() (buildbot.process.buildstep.BuildStep method)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyrhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`X,slaveVersionIsOlderThan(command, minversion)hajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahX!BuildStep.slaveVersionIsOlderThanhhhՉuhsM@hthh[]r(h)r}r(h`XslaveVersionIsOlderThanhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM@hthh[]rh}XslaveVersionIsOlderThanrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM@hthh[]r(h)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgjubh)r}r(h`X minversionhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X minversionrr}r(h`Uhajubahgjubeubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsM@hthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgj-ubh}X (rr}r(h`Uhajubh)r}r(h`Uhi}r(Ureftypej& U reftargetXstringrU refdomainjhn]hm]U refexplicithk]hl]hq]uhajh[]rj*)r}r(h`jhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xstringrr}r(h`Uhajubahgj4ubahghubh}X)r}r(h`Uhajubh}X -- rr}r(h`Uhajubh}Xcommand to examinerr}r(h`Xcommand to examinehajubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`X minversionhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X minversionrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xminimum versionrr}r(h`Xminimum versionhajubehghubahgj ubehgj ubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r (h`Uhajubahgjubj)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhajh[]r h)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]rh}Xbooleanrr}r(h`XbooleanhajubahghubahgjHubehgjIubeubh)r}r(h`XoThis method returns true if ``command`` is not implemented on the slave, or if it is older than ``minversion``.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM?hthh[]r(h}XThis method returns true if rr}r(h`XThis method returns true if hajubh)r}r(h`X ``command``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandr r!}r"(h`Uhajubahghubh}X9 is not implemented on the slave, or if it is older than r#r$}r%(h`X9 is not implemented on the slave, or if it is older than hajubh)r&}r'(h`X``minversion``hi}r((hk]hl]hm]hn]hq]uhajh[]r)h}X minversionr*r+}r,(h`Uhaj&ubahghubh}X.r-}r.(h`X.hajubeubeubeubh)r/}r0(h`Uhajdhbhehghhi}r1(hn]hm]hk]hl]hq]Uentries]r2(hX<getSlaveName() (buildbot.process.buildstep.BuildStep method)h>Utr3auhsNhthh[]ubh)r4}r5(h`Uhajdhbhehghhi}r6(hÉhXpyhn]hm]hk]hl]hq]hXmethodr7hj7uhsNhthh[]r8(h)r9}r:(h`XgetSlaveName()haj4hbhehghhi}r;(hn]r<h>ahhhm]hk]hl]hq]r=h>ahXBuildStep.getSlaveNamehhhՉuhsMFhthh[]r>(h)r?}r@(h`X getSlaveNamehaj9hbhehghhi}rA(hk]hl]hm]hn]hq]uhsMFhthh[]rBh}X getSlaveNamerCrD}rE(h`Uhaj?ubaubh)rF}rG(h`Uhaj9hbhehghhi}rH(hk]hl]hm]hn]hq]uhsMFhthh[]ubeubjc)rI}rJ(h`Uhaj4hbhehgjfhi}rK(hk]hl]hm]hn]hq]uhsMFhthh[]rL(j)rM}rN(h`UhajIhbhehgj hi}rO(hk]hl]hm]hn]hq]uhsNhthh[]rPj)rQ}rR(h`Uhi}rS(hk]hl]hm]hn]hq]uhajMh[]rT(j)rU}rV(h`Uhi}rW(hk]hl]hm]hn]hq]uhajQh[]rXh}XReturnsrYrZ}r[(h`UhajUubahgjubj)r\}r](h`Uhi}r^(hk]hl]hm]hn]hq]uhajQh[]r_h)r`}ra(h`Uhi}rb(hk]hl]hm]hn]hq]uhaj\h[]rch}Xstringrdre}rf(h`Xstringhaj`ubahghubahgjHubehgjIubaubh)rg}rh(h`X5Get the name of the buildslave assigned to this step.rihajIhbhehghhi}rj(hk]hl]hm]hn]hq]uhsMEhthh[]rkh}X5Get the name of the buildslave assigned to this step.rlrm}rn(h`jihajgubaubeubeubh)ro}rp(h`XMost steps exist to run commands. While the details of exactly how those commands are constructed are left to subclasses, the execution of those commands comes down to this method:rqhajdhbhehghhi}rr(hk]hl]hm]hn]hq]uhsMGhthh[]rsh}XMost steps exist to run commands. While the details of exactly how those commands are constructed are left to subclasses, the execution of those commands comes down to this method:rtru}rv(h`jqhajoubaubh)rw}rx(h`Uhajdhbhehghhi}ry(hn]hm]hk]hl]hq]Uentries]rz(hX:runCommand() (buildbot.process.buildstep.BuildStep method)hHUtr{auhsNhthh[]ubh)r|}r}(h`Uhajdhbhehghhi}r~(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XrunCommand(command)haj|hbhehghhi}r(hn]rhHahhhm]hk]hl]hq]rhHahXBuildStep.runCommandhhhՉuhsMPhthh[]r(h)r}r(h`X runCommandhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMPhthh[]rh}X runCommandrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMPhthh[]rh)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhaj|hbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMPhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh)r}r(h`X9:py:class:`~buildbot.process.remotecommand.RemoteCommand`rhajhbhehghhi}r(UreftypeXclasshhX,buildbot.process.remotecommand.RemoteCommandU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsMLh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X RemoteCommandrr}r(h`Uhajubahghubaubh}X instancerr}r(h`X instancehajubehghubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XDeferredrr}r(h`XDeferredhajubahghubahgjHubehgjIubeubh)r}r(h`XThis method connects the given command to the step's buildslave and runs it, returning the Deferred from :meth:`~buildbot.process.buildstep.RemoteCommand.run`.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMOhthh[]r(h}XiThis method connects the given command to the step's buildslave and runs it, returning the Deferred from rr}r(h`XiThis method connects the given command to the step's buildslave and runs it, returning the Deferred from hajubh)r}r(h`X5:meth:`~buildbot.process.buildstep.RemoteCommand.run`rhajhbhehghhi}r(UreftypeXmethhhX,buildbot.process.buildstep.RemoteCommand.runU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsMOh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xrunrr}r(h`Uhajubahghubaubh}X.r}r(h`X.hajubeubeubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX6addURL() (buildbot.process.buildstep.BuildStep method)hUtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r (h`XaddURL(name, url)hajhbhehghhi}r (hn]r hahhhm]hk]hl]hq]r hahXBuildStep.addURLhhhՉuhsMXhthh[]r (h)r}r(h`XaddURLhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMXhthh[]rh}XaddURLrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMXhthh[]r(h)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnamerr}r(h`Uhajubahgjubh)r }r!(h`Xurlhi}r"(hk]hl]hm]hn]hq]uhajh[]r#h}Xurlr$r%}r&(h`Uhaj ubahgjubeubeubjc)r'}r((h`Uhajhbhehgjfhi}r)(hk]hl]hm]hn]hq]uhsMXhthh[]r*(j)r+}r,(h`Uhaj'hbhehgj hi}r-(hk]hl]hm]hn]hq]uhsNhthh[]r.j)r/}r0(h`Uhi}r1(hk]hl]hm]hn]hq]uhaj+h[]r2(j)r3}r4(h`Uhi}r5(hk]hl]hm]hn]hq]uhaj/h[]r6h}X Parametersr7r8}r9(h`Uhaj3ubahgjubj)r:}r;(h`Uhi}r<(hk]hl]hm]hn]hq]uhaj/h[]r=j )r>}r?(h`Uhi}r@(hk]hl]hm]hn]hq]uhaj:h[]rA(j )rB}rC(h`Uhi}rD(hk]hl]hm]hn]hq]uhaj>h[]rEh)rF}rG(h`Uhi}rH(hk]hl]hm]hn]hq]uhajBh[]rI(j%)rJ}rK(h`Xnamehi}rL(hk]hl]hm]hn]hq]uhajFh[]rMh}XnamerNrO}rP(h`UhajJubahgj-ubh}X -- rQrR}rS(h`UhajFubh}XURL namerTrU}rV(h`XURL namehajFubehghubahgj ubj )rW}rX(h`Uhi}rY(hk]hl]hm]hn]hq]uhaj>h[]rZh)r[}r\(h`Uhi}r](hk]hl]hm]hn]hq]uhajWh[]r^(j%)r_}r`(h`Xurlhi}ra(hk]hl]hm]hn]hq]uhaj[h[]rbh}Xurlrcrd}re(h`Uhaj_ubahgj-ubh}X -- rfrg}rh(h`Uhaj[ubh}Xthe URLrirj}rk(h`Xthe URLhaj[ubehghubahgj ubehgj ubahgjHubehgjIubaubh)rl}rm(h`XAdd a link to the given ``url``, with the given ``name`` to displays of this step. This allows a step to provide links to data that is not available in the log files.haj'hbhehghhi}rn(hk]hl]hm]hn]hq]uhsMVhthh[]ro(h}XAdd a link to the given rprq}rr(h`XAdd a link to the given hajlubh)rs}rt(h`X``url``hi}ru(hk]hl]hm]hn]hq]uhajlh[]rvh}Xurlrwrx}ry(h`Uhajsubahghubh}X, with the given rzr{}r|(h`X, with the given hajlubh)r}}r~(h`X``name``hi}r(hk]hl]hm]hn]hq]uhajlh[]rh}Xnamerr}r(h`Uhaj}ubahghubh}Xn to displays of this step. This allows a step to provide links to data that is not available in the log files.rr}r(h`Xn to displays of this step. This allows a step to provide links to data that is not available in the log files.hajlubeubeubeubh)r}r(h`XThe :class:`BuildStep` class provides minimal support for log handling, that is extended by the :class:`LoggingBuildStep` class. The following methods provide some useful behaviors. These methods can be called while the step is running, but not before.hajdhbhehghhi}r(hk]hl]hm]hn]hq]uhsMYhthh[]r(h}XThe rr}r(h`XThe hajubh)r}r(h`X:class:`BuildStep`rhajhbhehghhi}r(UreftypeXclasshhX BuildStepU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsMYh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X BuildSteprr}r(h`Uhajubahghubaubh}XJ class provides minimal support for log handling, that is extended by the rr}r(h`XJ class provides minimal support for log handling, that is extended by the hajubh)r}r(h`X:class:`LoggingBuildStep`rhajhbhehghhi}r(UreftypeXclasshhXLoggingBuildStepU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsMYh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}XLoggingBuildSteprr}r(h`Uhajubahghubaubh}X class. The following methods provide some useful behaviors. These methods can be called while the step is running, but not before.rr}r(h`X class. The following methods provide some useful behaviors. These methods can be called while the step is running, but not before.hajubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX6addLog() (buildbot.process.buildstep.BuildStep method)h UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`X addLog(name)hajhbhehghhi}r(hn]rh ahhhm]hk]hl]hq]rh ahXBuildStep.addLoghhhՉuhsMchthh[]r(h)r}r(h`XaddLoghajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMchthh[]rh}XaddLogrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMchthh[]rh)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnamerr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMchthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnamerr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xlog namerr}r(h`Xlog namehajubehghubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r (hk]hl]hm]hn]hq]uhajh[]r h)r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhajh[]r(h)r}r(h`X):class:`~buildbot.status.logfile.LogFile`rhaj hbhehghhi}r(UreftypeXclasshhXbuildbot.status.logfile.LogFileU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsM`h[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}XLogFilerr}r(h`Uhajubahghubaubh}X instance via Deferredrr}r (h`X instance via Deferredhaj ubehghubahgjHubehgjIubeubh)r!}r"(h`XTAdd a new logfile with the given name to the step, and return the log file instance.r#hajhbhehghhi}r$(hk]hl]hm]hn]hq]uhsMbhthh[]r%h}XTAdd a new logfile with the given name to the step, and return the log file instance.r&r'}r((h`j#haj!ubaubeubeubh)r)}r*(h`Uhajdhbhehghhi}r+(hn]hm]hk]hl]hq]Uentries]r,(hX6getLog() (buildbot.process.buildstep.BuildStep method)h?Utr-auhsNhthh[]ubh)r.}r/(h`Uhajdhbhehghhi}r0(hÉhXpyhn]hm]hk]hl]hq]hXmethodr1hj1uhsNhthh[]r2(h)r3}r4(h`X getLog(name)haj.hbhehghhi}r5(hn]r6h?ahhhm]hk]hl]hq]r7h?ahXBuildStep.getLoghhhՉuhsMkhthh[]r8(h)r9}r:(h`XgetLoghaj3hbhehghhi}r;(hk]hl]hm]hn]hq]uhsMkhthh[]r<h}XgetLogr=r>}r?(h`Uhaj9ubaubh)r@}rA(h`Uhaj3hbhehghhi}rB(hk]hl]hm]hn]hq]uhsMkhthh[]rCh)rD}rE(h`Xnamehi}rF(hk]hl]hm]hn]hq]uhaj@h[]rGh}XnamerHrI}rJ(h`UhajDubahgjubaubeubjc)rK}rL(h`Uhaj.hbhehgjfhi}rM(hk]hl]hm]hn]hq]uhsMkhthh[]rN(j)rO}rP(h`UhajKhbhehgj hi}rQ(hk]hl]hm]hn]hq]uhsNhthh[]rR(j)rS}rT(h`Uhi}rU(hk]hl]hm]hn]hq]uhajOh[]rV(j)rW}rX(h`Uhi}rY(hk]hl]hm]hn]hq]uhajSh[]rZh}X Parametersr[r\}r](h`UhajWubahgjubj)r^}r_(h`Uhi}r`(hk]hl]hm]hn]hq]uhajSh[]rah)rb}rc(h`Uhi}rd(hk]hl]hm]hn]hq]uhaj^h[]re(j%)rf}rg(h`Xnamehi}rh(hk]hl]hm]hn]hq]uhajbh[]rih}Xnamerjrk}rl(h`Uhajfubahgj-ubh}X -- rmrn}ro(h`Uhajbubh}Xlog namerprq}rr(h`Xlog namehajbubehghubahgjHubehgjIubj)rs}rt(h`Uhi}ru(hk]hl]hm]hn]hq]uhajOh[]rv(j)rw}rx(h`Uhi}ry(hk]hl]hm]hn]hq]uhajsh[]rzh}XReturnsr{r|}r}(h`Uhajwubahgjubj)r~}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajsh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj~h[]r(h)r}r(h`X):class:`~buildbot.status.logfile.LogFile`rhajhbhehghhi}r(UreftypeXclasshhXbuildbot.status.logfile.LogFileU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsMgh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}XLogFilerr}r(h`Uhajubahghubaubh}X instancerr}r(h`X instancehajubehghubahgjHubehgjIubj)r}r(h`UhajOhbhehgjIhi}r(hk]hl]hm]hn]hq]uhsMhhthh[]r(j)r}r(h`Xraiseshi}r(hk]hl]hm]hn]hq]uhajh[]rh}XRaisesrr}r(h`Uhajubahgjubj)r}r(h`X(:exc:`KeyError` if the log is not found hi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`X':exc:`KeyError` if the log is not foundhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhh[]r(h)r}r(h`X:exc:`KeyError`rhajhbhehghhi}r(UreftypeXexchhXKeyErrorU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsMhh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-excrehm]hn]hq]uhajh[]rh}XKeyErrorrr}r(h`Uhajubahghubaubh}X if the log is not foundrr}r(h`X if the log is not foundhajubeubahgjHubeubeubh)r}r(h`X Get an existing logfile by name.rhajKhbhehghhi}r(hk]hl]hm]hn]hq]uhsMjhthh[]rh}X Get an existing logfile by name.rr}r(h`jhajubaubeubeubh)r}r(h`Uhajdhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX>addCompleteLog() (buildbot.process.buildstep.BuildStep method)h.UtrauhsNhthh[]ubh)r}r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XaddCompleteLog(name, text)hajhbhehghhi}r(hn]rh.ahhhm]hk]hl]hq]rh.ahXBuildStep.addCompleteLoghhhՉuhsMuhthh[]r(h)r}r(h`XaddCompleteLoghajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMuhthh[]rh}XaddCompleteLogrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMuhthh[]r(h)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnamerr}r(h`Uhajubahgjubh)r}r(h`Xtexthi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xtextrr}r(h`Uhajubahgjubeubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMuhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j )r }r (h`Uhi}r (hk]hl]hm]hn]hq]uhajh[]r h)r }r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]r(j%)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhaj h[]rh}Xnamerr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhaj ubh}Xlog namerr}r(h`Xlog namehaj ubehghubahgj ubj )r}r(h`Uhi}r (hk]hl]hm]hn]hq]uhajh[]r!h)r"}r#(h`Uhi}r$(hk]hl]hm]hn]hq]uhajh[]r%(j%)r&}r'(h`Xtexthi}r((hk]hl]hm]hn]hq]uhaj"h[]r)h}Xtextr*r+}r,(h`Uhaj&ubahgj-ubh}X -- r-r.}r/(h`Uhaj"ubh}Xcontent of the logfiler0r1}r2(h`Xcontent of the logfilehaj"ubehghubahgj ubehgj ubahgjHubehgjIubj)r3}r4(h`Uhi}r5(hk]hl]hm]hn]hq]uhajh[]r6(j)r7}r8(h`Uhi}r9(hk]hl]hm]hn]hq]uhaj3h[]r:h}XReturnsr;r<}r=(h`Uhaj7ubahgjubj)r>}r?(h`Uhi}r@(hk]hl]hm]hn]hq]uhaj3h[]rAh)rB}rC(h`Uhi}rD(hk]hl]hm]hn]hq]uhaj>h[]rEh}XDeferredrFrG}rH(h`XDeferredhajBubahghubahgjHubehgjIubeubh)rI}rJ(h`XThis method adds a new log and sets ``text`` as its content. This is often useful to add a short logfile describing activities performed on the master. The logfile is immediately closed, and no further data can be added.hajhbhehghhi}rK(hk]hl]hm]hn]hq]uhsMrhthh[]rL(h}X$This method adds a new log and sets rMrN}rO(h`X$This method adds a new log and sets hajIubh)rP}rQ(h`X``text``hi}rR(hk]hl]hm]hn]hq]uhajIh[]rSh}XtextrTrU}rV(h`UhajPubahghubh}X as its content. This is often useful to add a short logfile describing activities performed on the master. The logfile is immediately closed, and no further data can be added.rWrX}rY(h`X as its content. This is often useful to add a short logfile describing activities performed on the master. The logfile is immediately closed, and no further data can be added.hajIubeubeubeubh)rZ}r[(h`Uhajdhbhehghhi}r\(hn]hm]hk]hl]hq]Uentries]r](hX:addHTMLLog() (buildbot.process.buildstep.BuildStep method)h6Utr^auhsNhthh[]ubh)r_}r`(h`Uhajdhbhehghhi}ra(hÉhXpyhn]hm]hk]hl]hq]hXmethodrbhjbuhsNhthh[]rc(h)rd}re(h`XaddHTMLLog(name, html)haj_hbhehghhi}rf(hn]rgh6ahhhm]hk]hl]hq]rhh6ahXBuildStep.addHTMLLoghhhՉuhsM}hthh[]ri(h)rj}rk(h`X addHTMLLoghajdhbhehghhi}rl(hk]hl]hm]hn]hq]uhsM}hthh[]rmh}X addHTMLLogrnro}rp(h`Uhajjubaubh)rq}rr(h`Uhajdhbhehghhi}rs(hk]hl]hm]hn]hq]uhsM}hthh[]rt(h)ru}rv(h`Xnamehi}rw(hk]hl]hm]hn]hq]uhajqh[]rxh}Xnameryrz}r{(h`Uhajuubahgjubh)r|}r}(h`Xhtmlhi}r~(hk]hl]hm]hn]hq]uhajqh[]rh}Xhtmlrr}r(h`Uhaj|ubahgjubeubeubjc)r}r(h`Uhaj_hbhehgjfhi}r(hk]hl]hm]hn]hq]uhsM}hthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnamerr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xlog namerr}r(h`Xlog namehajubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xhtmlhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xhtmlrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xcontent of the logfilerr}r(h`Xcontent of the logfilehajubehghubahgj ubehgj ubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XDeferredrr}r(h`XDeferredhajubahghubahgjHubehgjIubeubh)r}r(h`XSimilar to :meth:`addCompleteLog`, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by :meth:`addCompleteLog`.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM|hthh[]r(h}X Similar to rr}r(h`X Similar to hajubh)r}r(h`X:meth:`addCompleteLog`rhajhbhehghhi}r(UreftypeXmethhhXaddCompleteLogU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsM|h[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}XaddCompleteLogrr}r(h`Uhajubahghubaubh}Xt, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by rr}r(h`Xt, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by hajubh)r}r(h`X:meth:`addCompleteLog`rhajhbhehghhi}r(UreftypeXmethhhXaddCompleteLogU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9hj:huhsM|h[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}XaddCompleteLogrr}r(h`Uhajubahghubaubh}X.r}r(h`X.hajubeubeubeubh)r}r (h`Uhajdhbhehghhi}r (hn]hm]hk]hl]hq]Uentries]r (hX>addLogObserver() (buildbot.process.buildstep.BuildStep method)hUtr auhsNhthh[]ubh)r }r(h`Uhajdhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`X!addLogObserver(logname, observer)haj hbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXBuildStep.addLogObserverhhhՉuhsMhthh[]r(h)r}r(h`XaddLogObserverhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XaddLogObserverrr}r(h`Uhajubaubh)r}r (h`Uhajhbhehghhi}r!(hk]hl]hm]hn]hq]uhsMhthh[]r"(h)r#}r$(h`Xlognamehi}r%(hk]hl]hm]hn]hq]uhajh[]r&h}Xlognamer'r(}r)(h`Uhaj#ubahgjubh)r*}r+(h`Xobserverhi}r,(hk]hl]hm]hn]hq]uhajh[]r-h}Xobserverr.r/}r0(h`Uhaj*ubahgjubeubeubjc)r1}r2(h`Uhaj hbhehgjfhi}r3(hk]hl]hm]hn]hq]uhsMhthh[]r4(j)r5}r6(h`Uhaj1hbhehgj hi}r7(hk]hl]hm]hn]hq]uhsNhthh[]r8j)r9}r:(h`Uhi}r;(hk]hl]hm]hn]hq]uhaj5h[]r<(j)r=}r>(h`Uhi}r?(hk]hl]hm]hn]hq]uhaj9h[]r@h}X ParametersrArB}rC(h`Uhaj=ubahgjubj)rD}rE(h`Uhi}rF(hk]hl]hm]hn]hq]uhaj9h[]rGj )rH}rI(h`Uhi}rJ(hk]hl]hm]hn]hq]uhajDh[]rK(j )rL}rM(h`Uhi}rN(hk]hl]hm]hn]hq]uhajHh[]rOh)rP}rQ(h`Uhi}rR(hk]hl]hm]hn]hq]uhajLh[]rS(j%)rT}rU(h`Xlognamehi}rV(hk]hl]hm]hn]hq]uhajPh[]rWh}XlognamerXrY}rZ(h`UhajTubahgj-ubh}X -- r[r\}r](h`UhajPubh}Xlog namer^r_}r`(h`Xlog namerahajPubehghubahgj ubj )rb}rc(h`Uhi}rd(hk]hl]hm]hn]hq]uhajHh[]reh)rf}rg(h`Uhi}rh(hk]hl]hm]hn]hq]uhajbh[]ri(j%)rj}rk(h`Xobserverhi}rl(hk]hl]hm]hn]hq]uhajfh[]rmh}Xobserverrnro}rp(h`Uhajjubahgj-ubh}X -- rqrr}rs(h`Uhajfubh}Xlog observer instancertru}rv(h`Xlog observer instancerwhajfubehghubahgj ubehgj ubahgjHubehgjIubaubh)rx}ry(h`XAdd a log observer for the named log. The named log need not have been added already: the observer will be connected when the log is added.rzhaj1hbhehghhi}r{(hk]hl]hm]hn]hq]uhsMhthh[]r|h}XAdd a log observer for the named log. The named log need not have been added already: the observer will be connected when the log is added.r}r~}r(h`jzhajxubaubh)r}r(h`XESee :ref:`Adding-LogObservers` for more information on log observers.haj1hbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XSee rr}r(h`XSee hajubh)r}r(h`X:ref:`Adding-LogObservers`rhajhbhehghhi}r(UreftypeXrefhhXadding-logobserversU refdomainXstdrhn]hm]U refexplicithk]hl]hq]hhuhsMh[]rj*)r}r(h`jhi}r(hk]hl]r(hjXstd-refrehm]hn]hq]uhajh[]rh}XAdding-LogObserversrr}r(h`Uhajubahgj4ubaubh}X' for more information on log observers.rr}r(h`X' for more information on log observers.hajubeubeubeubeubeubeubh])r}r(h`Uhah^hbhehghhhi}r(hk]hl]hm]hn]rhXahq]rh%auhsMhthh[]r(hv)r}r(h`XLoggingBuildSteprhajhbhehghzhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XLoggingBuildSteprr}r(h`jhajubaubh)r}r(h`UhajhbNhghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX6LoggingBuildStep (class in buildbot.process.buildstep)hUtrauhsNhthh[]ubh)r}r(h`UhajhbNhghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXclassrhjuhsNhthh[]r(h)r}r(h`XLoggingBuildStep(logfiles, lazylogfiles, log_eval_func, name, locks, haltOnFailure, flunkOnWarnings, flunkOnFailure, warnOnWarnings, warnOnFailure, alwaysRun, progressMetrics, useProgress, doStepIf, hideStepIf)hajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXLoggingBuildSteprhUhՉuhsMhthh[]r(h)r}r(h`Xclass hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}Xclass rr}r(h`Uhajubaubh)r}r(h`Xbuildbot.process.buildstep.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}Xbuildbot.process.buildstep.rr}r(h`Uhajubaubh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XLoggingBuildSteprr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h)r}r(h`Xlogfileshi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xlogfilesrr}r(h`Uhajubahgjubh)r}r(h`X lazylogfileshi}r(hk]hl]hm]hn]hq]uhajh[]rh}X lazylogfilesrr}r(h`Uhajubahgjubh)r}r(h`X log_eval_funchi}r(hk]hl]hm]hn]hq]uhajh[]rh}X log_eval_funcrr}r(h`Uhajubahgjubh)r}r(h`Xnamehi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xnamerr}r(h`Uhajubahgjubh)r}r(h`Xlockshi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xlocksrr}r(h`Uhajubahgjubh)r}r(h`X haltOnFailurehi}r(hk]hl]hm]hn]hq]uhajh[]rh}X haltOnFailurerr}r(h`Uhajubahgjubh)r}r(h`XflunkOnWarningshi}r(hk]hl]hm]hn]hq]uhajh[]rh}XflunkOnWarningsrr}r(h`Uhajubahgjubh)r}r(h`XflunkOnFailurehi}r(hk]hl]hm]hn]hq]uhajh[]rh}XflunkOnFailurerr}r(h`Uhajubahgjubh)r }r (h`XwarnOnWarningshi}r (hk]hl]hm]hn]hq]uhajh[]r h}XwarnOnWarningsr r}r(h`Uhaj ubahgjubh)r}r(h`X warnOnFailurehi}r(hk]hl]hm]hn]hq]uhajh[]rh}X warnOnFailurerr}r(h`Uhajubahgjubh)r}r(h`X alwaysRunhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X alwaysRunrr}r(h`Uhajubahgjubh)r}r(h`XprogressMetricshi}r (hk]hl]hm]hn]hq]uhajh[]r!h}XprogressMetricsr"r#}r$(h`Uhajubahgjubh)r%}r&(h`X useProgresshi}r'(hk]hl]hm]hn]hq]uhajh[]r(h}X useProgressr)r*}r+(h`Uhaj%ubahgjubh)r,}r-(h`XdoStepIfhi}r.(hk]hl]hm]hn]hq]uhajh[]r/h}XdoStepIfr0r1}r2(h`Uhaj,ubahgjubh)r3}r4(h`X hideStepIfhi}r5(hk]hl]hm]hn]hq]uhajh[]r6h}X hideStepIfr7r8}r9(h`Uhaj3ubahgjubeubeubjc)r:}r;(h`Uhajhbhehgjfhi}r<(hk]hl]hm]hn]hq]uhsMhthh[]r=(j)r>}r?(h`Uhaj:hbNhgj hi}r@(hk]hl]hm]hn]hq]uhsNhthh[]rAj)rB}rC(h`Uhi}rD(hk]hl]hm]hn]hq]uhaj>h[]rE(j)rF}rG(h`Uhi}rH(hk]hl]hm]hn]hq]uhajBh[]rIh}X ParametersrJrK}rL(h`UhajFubahgjubj)rM}rN(h`Uhi}rO(hk]hl]hm]hn]hq]uhajBh[]rPj )rQ}rR(h`Uhi}rS(hk]hl]hm]hn]hq]uhajMh[]rT(j )rU}rV(h`Uhi}rW(hk]hl]hm]hn]hq]uhajQh[]rXh)rY}rZ(h`Uhi}r[(hk]hl]hm]hn]hq]uhajUh[]r\(j%)r]}r^(h`Xlogfileshi}r_(hk]hl]hm]hn]hq]uhajYh[]r`h}Xlogfilesrarb}rc(h`Uhaj]ubahgj-ubh}X -- rdre}rf(h`UhajYubh}Xsee rgrh}ri(h`Xsee hajYubh)rj}rk(h`X:bb:step:`ShellCommand`rlhajYhbhehghhi}rm(UreftypeXstephhX ShellCommandU refdomainXbbrnhn]hm]U refexplicithk]hl]hq]hhuhsMh[]roh)rp}rq(h`jlhi}rr(hk]hl]rs(hjnXbb-steprtehm]hn]hq]uhajjh[]ruh}X ShellCommandrvrw}rx(h`Uhajpubahghubaubehghubahgj ubj )ry}rz(h`Uhi}r{(hk]hl]hm]hn]hq]uhajQh[]r|h)r}}r~(h`Uhi}r(hk]hl]hm]hn]hq]uhajyh[]r(j%)r}r(h`X lazylogfileshi}r(hk]hl]hm]hn]hq]uhaj}h[]rh}X lazylogfilesrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhaj}ubh}Xsee rr}r(h`Xsee haj}ubh)r}r(h`X:bb:step:`ShellCommand`rhaj}hbhehghhi}r(UreftypeXstephhX ShellCommandU refdomainXbbrhn]hm]U refexplicithk]hl]hq]hhuhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXbb-steprehm]hn]hq]uhajh[]rh}X ShellCommandrr}r(h`Uhajubahghubaubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajQh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`X log_eval_funchi}r(hk]hl]hm]hn]hq]uhajh[]rh}X log_eval_funcrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xsee rr}r(h`Xsee hajubh)r}r(h`X:bb:step:`ShellCommand`rhajhbhehghhi}r(UreftypeXstephhX ShellCommandU refdomainXbbrhn]hm]U refexplicithk]hl]hq]hhuhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXbb-steprehm]hn]hq]uhajh[]rh}X ShellCommandrr}r(h`Uhajubahghubaubehghubahgj ubehgj ubahgjHubehgjIubaubh)r}r(h`XIThe remaining arguments are passed to the :class:`BuildStep` constructor.haj:hbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}X*The remaining arguments are passed to the rr}r(h`X*The remaining arguments are passed to the hajubh)r}r(h`X:class:`BuildStep`rhajhbhehghhi}r(UreftypeXclasshhX BuildStepU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X BuildSteprr}r(h`Uhajubahghubaubh}X constructor.rr}r(h`X constructor.hajubeubcdocutils.nodes warning r)r}r(h`XSubclasses of this class are always old-style steps. As such, this class will be removed after Buildbot-0.9.0. Instead, subclass :class:`~buildbot.process.buildstep.BuildStep` and mix in :class:`~buildbot.process.buildstep.ShellMixin` to get similar behavior.haj:hbhehgUwarningrhi}r(hk]hl]hm]hn]hq]uhsNhthh[]rh)r}r(h`XSubclasses of this class are always old-style steps. As such, this class will be removed after Buildbot-0.9.0. Instead, subclass :class:`~buildbot.process.buildstep.BuildStep` and mix in :class:`~buildbot.process.buildstep.ShellMixin` to get similar behavior.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMh[]r(h}XSubclasses of this class are always old-style steps. As such, this class will be removed after Buildbot-0.9.0. Instead, subclass rr}r(h`XSubclasses of this class are always old-style steps. As such, this class will be removed after Buildbot-0.9.0. Instead, subclass hajubh)r}r(h`X.:class:`~buildbot.process.buildstep.BuildStep`rhajhbhehghhi}r(UreftypeXclasshhX$buildbot.process.buildstep.BuildStepU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X BuildSteprr}r(h`Uhajubahghubaubh}X and mix in rr}r(h`X and mix in hajubh)r}r(h`X/:class:`~buildbot.process.buildstep.ShellMixin`rhajhbhehghhi}r(UreftypeXclasshhX%buildbot.process.buildstep.ShellMixinU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X ShellMixinrr}r(h`Uhajubahghubaubh}X to get similar behavior.rr }r (h`X to get similar behavior.hajubeubaubh)r }r (h`XThis subclass of :class:`BuildStep` is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:haj:hbhehghhi}r (hk]hl]hm]hn]hq]uhsMhthh[]r(h}XThis subclass of rr}r(h`XThis subclass of haj ubh)r}r(h`X:class:`BuildStep`rhaj hbhehghhi}r(UreftypeXclasshhX BuildStepU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X BuildSteprr}r (h`Uhajubahghubaubh}X_ is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:r!r"}r#(h`X_ is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:haj ubeubj )r$}r%(h`Uhaj:hbhehgj hi}r&(Ubulletr'X*hn]hm]hk]hl]hq]uhsMhthh[]r((j )r)}r*(h`X6tracks progress using the length of the stdout logfiler+haj$hbhehgj hi}r,(hk]hl]hm]hn]hq]uhsNhthh[]r-h)r.}r/(h`j+haj)hbhehghhi}r0(hk]hl]hm]hn]hq]uhsMh[]r1h}X6tracks progress using the length of the stdout logfiler2r3}r4(h`j+haj.ubaubaubj )r5}r6(h`XBprovides hooks for summarizing and evaluating the command's resultr7haj$hbhehgj hi}r8(hk]hl]hm]hn]hq]uhsNhthh[]r9h)r:}r;(h`j7haj5hbhehghhi}r<(hk]hl]hm]hn]hq]uhsMh[]r=h}XBprovides hooks for summarizing and evaluating the command's resultr>r?}r@(h`j7haj:ubaubaubj )rA}rB(h`Xsupports lazy logfilesrChaj$hbhehgj hi}rD(hk]hl]hm]hn]hq]uhsNhthh[]rEh)rF}rG(h`jChajAhbhehghhi}rH(hk]hl]hm]hn]hq]uhsMh[]rIh}Xsupports lazy logfilesrJrK}rL(h`jChajFubaubaubj )rM}rN(h`XNhandles the mechanics of starting, interrupting, and finishing remote commandsrOhaj$hbhehgj hi}rP(hk]hl]hm]hn]hq]uhsNhthh[]rQh)rR}rS(h`jOhajMhbhehghhi}rT(hk]hl]hm]hn]hq]uhsMh[]rUh}XNhandles the mechanics of starting, interrupting, and finishing remote commandsrVrW}rX(h`jOhajRubaubaubj )rY}rZ(h`XYdetects lost slaves and finishes with a status of :data:`~buildbot.status.results.RETRY` haj$hbhehgj hi}r[(hk]hl]hm]hn]hq]uhsNhthh[]r\h)r]}r^(h`XXdetects lost slaves and finishes with a status of :data:`~buildbot.status.results.RETRY`hajYhbhehghhi}r_(hk]hl]hm]hn]hq]uhsMh[]r`(h}X2detects lost slaves and finishes with a status of rarb}rc(h`X2detects lost slaves and finishes with a status of haj]ubh)rd}re(h`X&:data:`~buildbot.status.results.RETRY`rfhaj]hbhehghhi}rg(UreftypeXdatahhXbuildbot.status.results.RETRYU refdomainXpyrhhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rih)rj}rk(h`jfhi}rl(hk]hl]rm(hjhXpy-datarnehm]hn]hq]uhajdh[]roh}XRETRYrprq}rr(h`Uhajjubahghubaubeubaubeubh)rs}rt(h`Uhaj:hbhehghhi}ru(hn]hm]hk]hl]hq]Uentries]rv(hX@logfiles (buildbot.process.buildstep.LoggingBuildStep attribute)h4UtrwauhsNhthh[]ubh)rx}ry(h`Uhaj:hbhehghhi}rz(hÉhXpyhn]hm]hk]hl]hq]hX attributer{hj{uhsNhthh[]r|(h)r}}r~(h`Xlogfilesrhajxhbhehghhi}r(hn]rh4ahhhm]hk]hl]hq]rh4ahXLoggingBuildStep.logfileshjhՉuhsMhthh[]rh)r}r(h`jhaj}hbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}Xlogfilesrr}r(h`Uhajubaubaubjc)r}r(h`Uhajxhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h)r}r(h`XThe logfiles to track, as described for :bb:step:`ShellCommand`. The contents of the class-level ``logfiles`` attribute are combined with those passed to the constructor, so subclasses may add log files with a class attribute::hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}X(The logfiles to track, as described for rr}r(h`X(The logfiles to track, as described for hajubh)r}r(h`X:bb:step:`ShellCommand`rhajhbhehghhi}r(UreftypeXstephhX ShellCommandU refdomainXbbrhn]hm]U refexplicithk]hl]hq]hhuhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXbb-steprehm]hn]hq]uhajh[]rh}X ShellCommandrr}r(h`Uhajubahghubaubh}X". The contents of the class-level rr}r(h`X". The contents of the class-level hajubh)r}r(h`X ``logfiles``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xlogfilesrr}r(h`Uhajubahghubh}Xu attribute are combined with those passed to the constructor, so subclasses may add log files with a class attribute:rr}r(h`Xu attribute are combined with those passed to the constructor, so subclasses may add log files with a class attribute:hajubeubcdocutils.nodes literal_block r)r}r(h`XFclass MyStep(LoggingBuildStep): logfiles = dict(debug='debug.log')hajhbhehgU literal_blockrhi}r(U xml:spacerUpreserverhn]hm]hk]hl]hq]uhsMhthh[]rh}XFclass MyStep(LoggingBuildStep): logfiles = dict(debug='debug.log')rr}r(h`Uhajubaubh)r}r(h`XnNote that lazy logfiles cannot be specified using this method; they must be provided as constructor arguments.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XnNote that lazy logfiles cannot be specified using this method; they must be provided as constructor arguments.rr}r(h`jhajubaubeubeubh)r}r(h`Uhaj:hbNhghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXCstartCommand() (buildbot.process.buildstep.LoggingBuildStep method)hUtrauhsNhthh[]ubh)r}r(h`Uhaj:hbNhghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XstartCommand(command)hajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahXLoggingBuildStep.startCommandhjhՉuhsMhthh[]r(h)r}r(h`X startCommandhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}X startCommandrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(j)r}r(h`UhajhbNhgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]rj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgj-ubh}X -- r r }r (h`Uhajubh}Xthe r r }r(h`Xthe hajubh)r}r(h`X2:class:`~buildbot.process.buildstep.RemoteCommand`rhajhbhehghhi}r(UreftypeXclasshhX(buildbot.process.buildstep.RemoteCommandU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X RemoteCommandrr}r(h`Uhajubahghubaubh}X instance to startrr}r (h`X instance to starthajubehghubahgjHubehgjIubaubj )r!}r"(h`X This method permits an optional ``errorMessages`` parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated. Handle all of the mechanics of running the given command. This sets up all required logfiles, keeps status text up to date, and calls the utility hooks described below. When the command is finished, the step is finished as well, making this class is unsuitable for steps that run more than one command in sequence. Subclasses should override :meth:`~buildbot.process.buildstep.BuildStep.start` and, after setting up an appropriate command, call this method. :: def start(self): cmd = RemoteShellCommand(...) self.startCommand(cmd, warnings)hajhbhehgj hi}r#(hk]hl]hm]hn]hq]uhsNhthh[]r$(cdocutils.nodes block_quote r%)r&}r'(h`Uhi}r((hk]hl]hm]hn]hq]uhaj!h[]r)h)r*}r+(h`XThis method permits an optional ``errorMessages`` parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated.haj&hbhehghhi}r,(hk]hl]hm]hn]hq]uhsMh[]r-(h}X This method permits an optional r.r/}r0(h`X This method permits an optional haj*ubh)r1}r2(h`X``errorMessages``hi}r3(hk]hl]hm]hn]hq]uhaj*h[]r4h}X errorMessagesr5r6}r7(h`Uhaj1ubahghubh}X~ parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated.r8r9}r:(h`X~ parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated.haj*ubeubahgU block_quoter;ubh)r<}r=(h`X:Handle all of the mechanics of running the given command. This sets up all required logfiles, keeps status text up to date, and calls the utility hooks described below. When the command is finished, the step is finished as well, making this class is unsuitable for steps that run more than one command in sequence.r>haj!hbhehghhi}r?(hk]hl]hm]hn]hq]uhsMh[]r@h}X:Handle all of the mechanics of running the given command. This sets up all required logfiles, keeps status text up to date, and calls the utility hooks described below. When the command is finished, the step is finished as well, making this class is unsuitable for steps that run more than one command in sequence.rArB}rC(h`j>haj<ubaubh)rD}rE(h`XSubclasses should override :meth:`~buildbot.process.buildstep.BuildStep.start` and, after setting up an appropriate command, call this method. ::haj!hbhehghhi}rF(hk]hl]hm]hn]hq]uhsMh[]rG(h}XSubclasses should override rHrI}rJ(h`XSubclasses should override hajDubh)rK}rL(h`X3:meth:`~buildbot.process.buildstep.BuildStep.start`rMhajDhbhehghhi}rN(UreftypeXmethhhX*buildbot.process.buildstep.BuildStep.startU refdomainXpyrOhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rPh)rQ}rR(h`jMhi}rS(hk]hl]rT(hjOXpy-methrUehm]hn]hq]uhajKh[]rVh}XstartrWrX}rY(h`UhajQubahghubaubh}X@ and, after setting up an appropriate command, call this method.rZr[}r\(h`X@ and, after setting up an appropriate command, call this method.hajDubeubj)r]}r^(h`XWdef start(self): cmd = RemoteShellCommand(...) self.startCommand(cmd, warnings)haj!hgjhi}r_(jjhn]hm]hk]hl]hq]uhsMh[]r`h}XWdef start(self): cmd = RemoteShellCommand(...) self.startCommand(cmd, warnings)rarb}rc(h`Uhaj]ubaubeubeubeubh)rd}re(h`XTo refine the status output, override one or more of the following methods. The :class:`LoggingBuildStep` implementations are stubs, so there is no need to call the parent method.haj:hbhehghhi}rf(hk]hl]hm]hn]hq]uhsMhthh[]rg(h}XPTo refine the status output, override one or more of the following methods. The rhri}rj(h`XPTo refine the status output, override one or more of the following methods. The hajdubh)rk}rl(h`X:class:`LoggingBuildStep`rmhajdhbhehghhi}rn(UreftypeXclasshhXLoggingBuildStepU refdomainXpyrohn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rph)rq}rr(h`jmhi}rs(hk]hl]rt(hjoXpy-classruehm]hn]hq]uhajkh[]rvh}XLoggingBuildSteprwrx}ry(h`Uhajqubahghubaubh}XJ implementations are stubs, so there is no need to call the parent method.rzr{}r|(h`XJ implementations are stubs, so there is no need to call the parent method.hajdubeubh)r}}r~(h`Uhaj:hbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXFcommandComplete() (buildbot.process.buildstep.LoggingBuildStep method)h:UtrauhsNhthh[]ubh)r}r(h`Uhaj:hbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XcommandComplete(command)hajhbhehghhi}r(hn]rh:ahhhm]hk]hl]hq]rh:ahX LoggingBuildStep.commandCompletehjhՉuhsMhthh[]r(h)r}r(h`XcommandCompletehajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XcommandCompleterr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]rj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}X!the just-completed remote commandrr}r(h`X!the just-completed remote commandhajubehghubahgjHubehgjIubaubh)r}r(h`XThis is a general-purpose hook method for subclasses. It will be called after the remote command has finished, but before any of the other hook functions are called.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XThis is a general-purpose hook method for subclasses. It will be called after the remote command has finished, but before any of the other hook functions are called.rr}r(h`jhajubaubeubeubh)r}r(h`Uhaj:hbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXDcreateSummary() (buildbot.process.buildstep.LoggingBuildStep method)h}r?(h`X.haj(ubeubeubeubh)r@}rA(h`Uhaj:hbhehghhi}rB(hn]hm]hk]hl]hq]Uentries]rC(hXFevaluateCommand() (buildbot.process.buildstep.LoggingBuildStep method)hUtrDauhsNhthh[]ubh)rE}rF(h`Uhaj:hbhehghhi}rG(hÉhXpyhn]hm]hk]hl]hq]hXmethodrHhjHuhsNhthh[]rI(h)rJ}rK(h`XevaluateCommand(command)hajEhbhehghhi}rL(hn]rMhahhhm]hk]hl]hq]rNhahX LoggingBuildStep.evaluateCommandhjhՉuhsMhthh[]rO(h)rP}rQ(h`XevaluateCommandhajJhbhehghhi}rR(hk]hl]hm]hn]hq]uhsMhthh[]rSh}XevaluateCommandrTrU}rV(h`UhajPubaubh)rW}rX(h`UhajJhbhehghhi}rY(hk]hl]hm]hn]hq]uhsMhthh[]rZh)r[}r\(h`Xcommandhi}r](hk]hl]hm]hn]hq]uhajWh[]r^h}Xcommandr_r`}ra(h`Uhaj[ubahgjubaubeubjc)rb}rc(h`UhajEhbhehgjfhi}rd(hk]hl]hm]hn]hq]uhsMhthh[]re(j)rf}rg(h`Uhajbhbhehgj hi}rh(hk]hl]hm]hn]hq]uhsNhthh[]ri(j)rj}rk(h`Uhi}rl(hk]hl]hm]hn]hq]uhajfh[]rm(j)rn}ro(h`Uhi}rp(hk]hl]hm]hn]hq]uhajjh[]rqh}X Parametersrrrs}rt(h`Uhajnubahgjubj)ru}rv(h`Uhi}rw(hk]hl]hm]hn]hq]uhajjh[]rxh)ry}rz(h`Uhi}r{(hk]hl]hm]hn]hq]uhajuh[]r|(j%)r}}r~(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajyh[]rh}Xcommandrr}r(h`Uhaj}ubahgj-ubh}X -- rr}r(h`Uhajyubh}X!the just-completed remote commandrr}r(h`X!the just-completed remote commandhajyubehghubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajfh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(h}Xstep result from rr}r(h`Xstep result from hajubh)r}r(h`X:mod:`buildbot.status.results`rhajhbhehghhi}r(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-modrehm]hn]hq]uhajh[]rh}Xbuildbot.status.resultsrr}r(h`UhajubahghubaubehghubahgjHubehgjIubeubh)r}r(h`X%This hook should decide what result the step should have. The default implementation invokes ``log_eval_func`` if it exists, and looks at :attr:`~buildbot.process.buildstep.RemoteCommand.rc` to distinguish :data:`~buildbot.status.results.SUCCESS` from :data:`~buildbot.status.results.FAILURE`.hajbhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}X]This hook should decide what result the step should have. The default implementation invokes rr}r(h`X]This hook should decide what result the step should have. The default implementation invokes hajubh)r}r(h`X``log_eval_func``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}X log_eval_funcrr}r(h`Uhajubahghubh}X if it exists, and looks at rr}r(h`X if it exists, and looks at hajubh)r}r(h`X4:attr:`~buildbot.process.buildstep.RemoteCommand.rc`rhajhbhehghhi}r(UreftypeXattrhhX+buildbot.process.buildstep.RemoteCommand.rcU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-attrrehm]hn]hq]uhajh[]rh}Xrcrr}r(h`Uhajubahghubaubh}X to distinguish rr}r(h`X to distinguish hajubh)r}r(h`X(:data:`~buildbot.status.results.SUCCESS`rhajhbhehghhi}r(UreftypeXdatahhXbuildbot.status.results.SUCCESSU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-datarehm]hn]hq]uhajh[]rh}XSUCCESSrr}r(h`Uhajubahghubaubh}X from rr}r(h`X from hajubh)r}r(h`X(:data:`~buildbot.status.results.FAILURE`rhajhbhehghhi}r(UreftypeXdatahhXbuildbot.status.results.FAILUREU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-datarehm]hn]hq]uhajh[]rh}XFAILURErr}r(h`Uhajubahghubaubh}X.r}r(h`X.hajubeubeubeubh)r}r(h`X(The remaining methods provide an embarrassment of ways to set the summary of the step that appears in the various status interfaces. The easiest way to affect this output is to override :meth:`~BuildStep.describe`. If that is not flexible enough, override :meth:`getText` and/or :meth:`getText2`.haj:hbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XThe remaining methods provide an embarrassment of ways to set the summary of the step that appears in the various status interfaces. The easiest way to affect this output is to override rr}r(h`XThe remaining methods provide an embarrassment of ways to set the summary of the step that appears in the various status interfaces. The easiest way to affect this output is to override hajubh)r}r(h`X:meth:`~BuildStep.describe`rhajhbhehghhi}r(UreftypeXmethhhXBuildStep.describeU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xdescriberr }r (h`Uhajubahghubaubh}X+. If that is not flexible enough, override r r }r (h`X+. If that is not flexible enough, override hajubh)r}r(h`X:meth:`getText`rhajhbhehghhi}r(UreftypeXmethhhXgetTextU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}XgetTextrr}r(h`Uhajubahghubaubh}X and/or rr}r(h`X and/or hajubh)r }r!(h`X:meth:`getText2`r"hajhbhehghhi}r#(UreftypeXmethhhXgetText2U refdomainXpyr$hn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]r%h)r&}r'(h`j"hi}r((hk]hl]r)(hj$Xpy-methr*ehm]hn]hq]uhaj h[]r+h}XgetText2r,r-}r.(h`Uhaj&ubahghubaubh}X.r/}r0(h`X.hajubeubh)r1}r2(h`Uhaj:hbhehghhi}r3(hn]hm]hk]hl]hq]Uentries]r4(hX>getText() (buildbot.process.buildstep.LoggingBuildStep method)h1Utr5auhsNhthh[]ubh)r6}r7(h`Uhaj:hbhehghhi}r8(hÉhXpyhn]hm]hk]hl]hq]hXmethodr9hj9uhsNhthh[]r:(h)r;}r<(h`XgetText(command, results)haj6hbhehghhi}r=(hn]r>h1ahhhm]hk]hl]hq]r?h1ahXLoggingBuildStep.getTexthjhՉuhsMhthh[]r@(h)rA}rB(h`XgetTexthaj;hbhehghhi}rC(hk]hl]hm]hn]hq]uhsMhthh[]rDh}XgetTextrErF}rG(h`UhajAubaubh)rH}rI(h`Uhaj;hbhehghhi}rJ(hk]hl]hm]hn]hq]uhsMhthh[]rK(h)rL}rM(h`Xcommandhi}rN(hk]hl]hm]hn]hq]uhajHh[]rOh}XcommandrPrQ}rR(h`UhajLubahgjubh)rS}rT(h`Xresultshi}rU(hk]hl]hm]hn]hq]uhajHh[]rVh}XresultsrWrX}rY(h`UhajSubahgjubeubeubjc)rZ}r[(h`Uhaj6hbhehgjfhi}r\(hk]hl]hm]hn]hq]uhsMhthh[]r](j)r^}r_(h`UhajZhbhehgj hi}r`(hk]hl]hm]hn]hq]uhsNhthh[]ra(j)rb}rc(h`Uhi}rd(hk]hl]hm]hn]hq]uhaj^h[]re(j)rf}rg(h`Uhi}rh(hk]hl]hm]hn]hq]uhajbh[]rih}X Parametersrjrk}rl(h`Uhajfubahgjubj)rm}rn(h`Uhi}ro(hk]hl]hm]hn]hq]uhajbh[]rpj )rq}rr(h`Uhi}rs(hk]hl]hm]hn]hq]uhajmh[]rt(j )ru}rv(h`Uhi}rw(hk]hl]hm]hn]hq]uhajqh[]rxh)ry}rz(h`Uhi}r{(hk]hl]hm]hn]hq]uhajuh[]r|(j%)r}}r~(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajyh[]rh}Xcommandrr}r(h`Uhaj}ubahgj-ubh}X -- rr}r(h`Uhajyubh}X!the just-completed remote commandrr}r(h`X!the just-completed remote commandhajyubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajqh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`Xresultshi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xresultsrr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xstep result from rr}r(h`Xstep result from hajubh)r}r(h`X:meth:`evaluateCommand`rhajhbhehghhi}r(UreftypeXmethhhXevaluateCommandU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}XevaluateCommandrr}r(h`Uhajubahghubaubehghubahgj ubehgj ubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj^h[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xa list of short stringsrr}r(h`Xa list of short stringshajubahghubahgjHubehgjIubeubh)r}r(h`XThis method is the primary means of describing the step. The default implementation calls :meth:`~BuildStep.describe`, which is usually the easiest method to override, and then appends a string describing the step status if it was not successful.hajZhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XZThis method is the primary means of describing the step. The default implementation calls rr}r(h`XZThis method is the primary means of describing the step. The default implementation calls hajubh)r}r(h`X:meth:`~BuildStep.describe`rhajhbhehghhi}r(UreftypeXmethhhXBuildStep.describeU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}Xdescriberr}r(h`Uhajubahghubaubh}X, which is usually the easiest method to override, and then appends a string describing the step status if it was not successful.rr}r(h`X, which is usually the easiest method to override, and then appends a string describing the step status if it was not successful.hajubeubeubeubh)r}r(h`Uhaj:hbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hX?getText2() (buildbot.process.buildstep.LoggingBuildStep method)h UtrauhsNhthh[]ubh)r}r(h`Uhaj:hbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`XgetText2(command, results)hajhbhehghhi}r(hn]rh ahhhm]hk]hl]hq]rh ahXLoggingBuildStep.getText2hjhՉuhsMhthh[]r(h)r}r(h`XgetText2hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XgetText2rr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h)r}r(h`Xcommandhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xcommandrr}r(h`Uhajubahgjubh)r}r(h`Xresultshi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xresultsrr}r(h`Uhajubahgjubeubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r (j)r }r (h`Uhajhbhehgj hi}r (hk]hl]hm]hn]hq]uhsNhthh[]r (j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhaj h[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r (j )r!}r"(h`Uhi}r#(hk]hl]hm]hn]hq]uhajh[]r$h)r%}r&(h`Uhi}r'(hk]hl]hm]hn]hq]uhaj!h[]r((j%)r)}r*(h`Xcommandhi}r+(hk]hl]hm]hn]hq]uhaj%h[]r,h}Xcommandr-r.}r/(h`Uhaj)ubahgj-ubh}X -- r0r1}r2(h`Uhaj%ubh}X!the just-completed remote commandr3r4}r5(h`X!the just-completed remote commandhaj%ubehghubahgj ubj )r6}r7(h`Uhi}r8(hk]hl]hm]hn]hq]uhajh[]r9h)r:}r;(h`Uhi}r<(hk]hl]hm]hn]hq]uhaj6h[]r=(j%)r>}r?(h`Xresultshi}r@(hk]hl]hm]hn]hq]uhaj:h[]rAh}XresultsrBrC}rD(h`Uhaj>ubahgj-ubh}X -- rErF}rG(h`Uhaj:ubh}Xstep result from rHrI}rJ(h`Xstep result from haj:ubh)rK}rL(h`X:meth:`evaluateCommand`rMhaj:hbhehghhi}rN(UreftypeXmethhhXevaluateCommandU refdomainXpyrOhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]rPh)rQ}rR(h`jMhi}rS(hk]hl]rT(hjOXpy-methrUehm]hn]hq]uhajKh[]rVh}XevaluateCommandrWrX}rY(h`UhajQubahghubaubehghubahgj ubehgj ubahgjHubehgjIubj)rZ}r[(h`Uhi}r\(hk]hl]hm]hn]hq]uhaj h[]r](j)r^}r_(h`Uhi}r`(hk]hl]hm]hn]hq]uhajZh[]rah}XReturnsrbrc}rd(h`Uhaj^ubahgjubj)re}rf(h`Uhi}rg(hk]hl]hm]hn]hq]uhajZh[]rhh)ri}rj(h`Uhi}rk(hk]hl]hm]hn]hq]uhajeh[]rlh}Xa list of short stringsrmrn}ro(h`Xa list of short stringshajiubahghubahgjHubehgjIubeubh)rp}rq(h`XLike :meth:`getText`, this method summarizes the step's result, but it is only called when that result affects the build, either by making it halt, flunk, or end with warnings.hajhbhehghhi}rr(hk]hl]hm]hn]hq]uhsMhthh[]rs(h}XLike rtru}rv(h`XLike hajpubh)rw}rx(h`X:meth:`getText`ryhajphbhehghhi}rz(UreftypeXmethhhXgetTextU refdomainXpyr{hn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]r|h)r}}r~(h`jyhi}r(hk]hl]r(hj{Xpy-methrehm]hn]hq]uhajwh[]rh}XgetTextrr}r(h`Uhaj}ubahghubaubh}X, this method summarizes the step's result, but it is only called when that result affects the build, either by making it halt, flunk, or end with warnings.rr}r(h`X, this method summarizes the step's result, but it is only called when that result affects the build, either by making it halt, flunk, or end with warnings.hajpubeubeubeubeubeubeubh])r}r(h`Uhah^hbhehghhhi}r(hk]hl]hm]hn]rhZahq]rhGauhsMhthh[]r(hv)r}r(h`X CommandMixinrhajhbhehghzhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}X CommandMixinrr}r(h`jhajubaubh)r}r(h`X$The :py:meth:`~buildbot.process.buildstep.BuildStep.runCommand` method can run a :py:class:`~buildbot.process.remotecommand.RemoteCommand` instance, but it's no help in building that object or interpreting the results afterward. This mixin class adds some useful methods for running commands.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XThe rr}r(h`XThe hajubh)r}r(h`X;:py:meth:`~buildbot.process.buildstep.BuildStep.runCommand`rhajhbhehghhi}r(UreftypeXmethhhX/buildbot.process.buildstep.BuildStep.runCommandU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9Nj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}X runCommandrr}r(h`Uhajubahghubaubh}X method can run a rr}r(h`X method can run a hajubh)r}r(h`X9:py:class:`~buildbot.process.remotecommand.RemoteCommand`rhajhbhehghhi}r(UreftypeXclasshhX,buildbot.process.remotecommand.RemoteCommandU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9Nj:huhsMh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-classrehm]hn]hq]uhajh[]rh}X RemoteCommandrr}r(h`Uhajubahghubaubh}X instance, but it's no help in building that object or interpreting the results afterward. This mixin class adds some useful methods for running commands.rr}r(h`X instance, but it's no help in building that object or interpreting the results afterward. This mixin class adds some useful methods for running commands.hajubeubh)r}r(h`X/This class can only be used in new-style steps.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}X/This class can only be used in new-style steps.rr}r(h`jhajubaubh)r}r(h`UhajhbNhghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXMbuildbot.process.buildstep.CommandMixin (class in buildbot.process.buildstep)h#UtrauhsNhthh[]ubh)r}r(h`UhajhbNhghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXclassrhjuhsNhthh[]r(h)r}r(h`X'buildbot.process.buildstep.CommandMixinhajhbhehghhi}r(hn]rh#ahhhm]hk]hl]hq]rh#ahX'buildbot.process.buildstep.CommandMixinrhXbuildbot.process.buildstephՉuhsM#hthh[]r(h)r}r(h`Xclass hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM#hthh[]rh}Xclass rr}r(h`Uhajubaubh)r}r(h`Xbuildbot.process.buildstep.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM#hthh[]rh}Xbuildbot.process.buildstep.rr}r(h`Uhajubaubh)r}r(h`X CommandMixinhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM#hthh[]rh}X CommandMixinrr}r(h`Uhajubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsM#hthh[]r(h)r}r(h`X!Some remote commands are simple enough that they can boil down to a method call. Most of these take an ``abandonOnFailure`` argument which, if true, will abandon the entire buildstep on command failure. This is accomplished by raising :py:exc:`~buildbot.process.buildstep.BuildStepFailed`.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XgSome remote commands are simple enough that they can boil down to a method call. Most of these take an rr}r(h`XgSome remote commands are simple enough that they can boil down to a method call. Most of these take an hajubh)r}r(h`X``abandonOnFailure``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}XabandonOnFailurerr}r(h`Uhajubahghubh}Xp argument which, if true, will abandon the entire buildstep on command failure. This is accomplished by raising rr}r(h`Xp argument which, if true, will abandon the entire buildstep on command failure. This is accomplished by raising hajubh)r}r(h`X5:py:exc:`~buildbot.process.buildstep.BuildStepFailed`rhajhbhehghhi}r(UreftypeXexchhX*buildbot.process.buildstep.BuildStepFailedU refdomainXpyr hn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMh[]r h)r }r (h`jhi}r (hk]hl]r(hj Xpy-excrehm]hn]hq]uhajh[]rh}XBuildStepFailedrr}r(h`Uhaj ubahghubaubh}X.r}r(h`X.hajubeubh)r}r(h`XrThese methods all write to the ``stdio`` log (generally just for errors). They do not close the log when finished.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XThese methods all write to the rr}r(h`XThese methods all write to the hajubh)r}r(h`X ``stdio``hi}r(hk]hl]hm]hn]hq]uhajh[]r h}Xstdior!r"}r#(h`Uhajubahghubh}XJ log (generally just for errors). They do not close the log when finished.r$r%}r&(h`XJ log (generally just for errors). They do not close the log when finished.hajubeubh)r'}r((h`Uhajhbhehghhi}r)(hn]hm]hk]hl]hq]Uentries]r*(hXVrunRmdir() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)h9Utr+auhsNhthh[]ubh)r,}r-(h`Uhajhbhehghhi}r.(hÉhXpyhn]hm]hk]hl]hq]hXmethodr/hj/uhsNhthh[]r0(h)r1}r2(h`X$runRmdir(dir, abandonOnFailure=True)haj,hbhehghhi}r3(hn]r4h9ahhhm]hk]hl]hq]r5h9ahX0buildbot.process.buildstep.CommandMixin.runRmdirhjhՉuhsMhthh[]r6(h)r7}r8(h`XrunRmdirhaj1hbhehghhi}r9(hk]hl]hm]hn]hq]uhsMhthh[]r:h}XrunRmdirr;r<}r=(h`Uhaj7ubaubh)r>}r?(h`Uhaj1hbhehghhi}r@(hk]hl]hm]hn]hq]uhsMhthh[]rA(h)rB}rC(h`Xdirhi}rD(hk]hl]hm]hn]hq]uhaj>h[]rEh}XdirrFrG}rH(h`UhajBubahgjubh)rI}rJ(h`XabandonOnFailure=Truehi}rK(hk]hl]hm]hn]hq]uhaj>h[]rLh}XabandonOnFailure=TruerMrN}rO(h`UhajIubahgjubeubeubjc)rP}rQ(h`Uhaj,hbhehgjfhi}rR(hk]hl]hm]hn]hq]uhsMhthh[]rS(j)rT}rU(h`UhajPhbhehgj hi}rV(hk]hl]hm]hn]hq]uhsNhthh[]rW(j)rX}rY(h`Uhi}rZ(hk]hl]hm]hn]hq]uhajTh[]r[(j)r\}r](h`Uhi}r^(hk]hl]hm]hn]hq]uhajXh[]r_h}X Parametersr`ra}rb(h`Uhaj\ubahgjubj)rc}rd(h`Uhi}re(hk]hl]hm]hn]hq]uhajXh[]rfj )rg}rh(h`Uhi}ri(hk]hl]hm]hn]hq]uhajch[]rj(j )rk}rl(h`Uhi}rm(hk]hl]hm]hn]hq]uhajgh[]rnh)ro}rp(h`Uhi}rq(hk]hl]hm]hn]hq]uhajkh[]rr(j%)rs}rt(h`Xdirhi}ru(hk]hl]hm]hn]hq]uhajoh[]rvh}Xdirrwrx}ry(h`Uhajsubahgj-ubh}X -- rzr{}r|(h`Uhajoubh}Xdirectory to remover}r~}r(h`Xdirectory to removehajoubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajgh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`XabndonOnFailurehi}r(hk]hl]hm]hn]hq]uhajh[]rh}XabndonOnFailurerr}r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}X if true, abandon step on failurerr}r(h`X if true, abandon step on failurehajubehghubahgj ubehgj ubahgjHubehgjIubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajTh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XReturnsrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}XBoolean via Deferredrr}r(h`XBoolean via DeferredhajubahghubahgjHubehgjIubeubh)r}r(h`XRRemove the given directory, using the ``rmdir`` command. Returns False on failure.hajPhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}X&Remove the given directory, using the rr}r(h`X&Remove the given directory, using the hajubh)r}r(h`X ``rmdir``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xrmdirrr}r(h`Uhajubahghubh}X# command. Returns False on failure.rr}r(h`X# command. Returns False on failure.hajubeubeubeubh)r}r(h`Uhajhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXVrunMkdir() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)h(UtrauhsNhthh[]ubh)r}r(h`Uhajhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`X$runMkdir(dir, abandonOnFailure=True)hajhbhehghhi}r(hn]rh(ahhhm]hk]hl]hq]rh(ahX0buildbot.process.buildstep.CommandMixin.runMkdirhjhՉuhsMhthh[]r(h)r}r(h`XrunMkdirhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}XrunMkdirrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h)r}r(h`Xdirhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xdirrr}r(h`Uhajubahgjubh)r}r(h`XabandonOnFailure=Truehi}r(hk]hl]hm]hn]hq]uhajh[]rh}XabandonOnFailure=Truerr}r(h`Uhajubahgjubeubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(j)r}r(h`Uhajhbhehgj hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh}X Parametersrr}r(h`Uhajubahgjubj)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r (h`Xdirhi}r (hk]hl]hm]hn]hq]uhajh[]r h}Xdirr r }r(h`Uhajubahgj-ubh}X -- rr}r(h`Uhajubh}Xdirectory to createrr}r(h`Xdirectory to createrhajubehghubahgj ubj )r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j%)r}r(h`XabndonOnFailurehi}r (hk]hl]hm]hn]hq]uhajh[]r!h}XabndonOnFailurer"r#}r$(h`Uhajubahgj-ubh}X -- r%r&}r'(h`Uhajubh}X if true, abandon step on failurer(r)}r*(h`X if true, abandon step on failurer+hajubehghubahgj ubehgj ubahgjHubehgjIubj)r,}r-(h`Uhi}r.(hk]hl]hm]hn]hq]uhajh[]r/(j)r0}r1(h`Uhi}r2(hk]hl]hm]hn]hq]uhaj,h[]r3h}XReturnsr4r5}r6(h`Uhaj0ubahgjubj)r7}r8(h`Uhi}r9(hk]hl]hm]hn]hq]uhaj,h[]r:h)r;}r<(h`Uhi}r=(hk]hl]hm]hn]hq]uhaj7h[]r>h}XBoolean via Deferredr?r@}rA(h`XBoolean via DeferredrBhaj;ubahghubahgjHubehgjIubeubh)rC}rD(h`XmCreate the given directory and any parent directories, using the ``mkdir`` command. Returns False on failure.hajhbhehghhi}rE(hk]hl]hm]hn]hq]uhsMhthh[]rF(h}XACreate the given directory and any parent directories, using the rGrH}rI(h`XACreate the given directory and any parent directories, using the hajCubh)rJ}rK(h`X ``mkdir``hi}rL(hk]hl]hm]hn]hq]uhajCh[]rMh}XmkdirrNrO}rP(h`UhajJubahghubh}X# command. Returns False on failure.rQrR}rS(h`X# command. Returns False on failure.hajCubeubeubeubh)rT}rU(h`Uhajhbhehghhi}rV(hn]hm]hk]hl]hq]Uentries]rW(hXXpathExists() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)hEUtrXauhsNhthh[]ubh)rY}rZ(h`Uhajhbhehghhi}r[(hÉhXpyhn]hm]hk]hl]hq]hXmethodr\hj\uhsNhthh[]r](h)r^}r_(h`XpathExists(path)hajYhbhehghhi}r`(hn]rahEahhhm]hk]hl]hq]rbhEahX2buildbot.process.buildstep.CommandMixin.pathExistshjhՉuhsMhthh[]rc(h)rd}re(h`X pathExistshaj^hbhehghhi}rf(hk]hl]hm]hn]hq]uhsMhthh[]rgh}X pathExistsrhri}rj(h`Uhajdubaubh)rk}rl(h`Uhaj^hbhehghhi}rm(hk]hl]hm]hn]hq]uhsMhthh[]rnh)ro}rp(h`Xpathhi}rq(hk]hl]hm]hn]hq]uhajkh[]rrh}Xpathrsrt}ru(h`Uhajoubahgjubaubeubjc)rv}rw(h`UhajYhbhehgjfhi}rx(hk]hl]hm]hn]hq]uhsMhthh[]ry(h)rz}r{(h`X7:param path path to test :returns: Boolean via Deferredr|hajvhbhehghhi}r}(hk]hl]hm]hn]hq]uhsMhthh[]r~h}X7:param path path to test :returns: Boolean via Deferredrr}r(h`j|hajzubaubh)r}r(h`X~Determine if the given path exists on the slave (in any form - file, directory, or otherwise). This uses the ``stat`` command.hajvhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XmDetermine if the given path exists on the slave (in any form - file, directory, or otherwise). This uses the rr}r(h`XmDetermine if the given path exists on the slave (in any form - file, directory, or otherwise). This uses the hajubh)r}r(h`X``stat``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xstatrr}r(h`Uhajubahghubh}X command.rr}r(h`X command.hajubeubeubeubh)r}r(h`Uhajhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXRglob() (buildbot.process.buildstep.buildbot.process.buildstep.CommandMixin method)h UtrauhsNhthh[]ubh)r}r(h`Uhajhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hXmethodrhjuhsNhthh[]r(h)r}r(h`X glob(path)hajhbhehghhi}r(hn]rh ahhhm]hk]hl]hq]rh ahX,buildbot.process.buildstep.CommandMixin.globhjhՉuhsM!hthh[]r(h)r}r(h`Xglobhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM!hthh[]rh}Xglobrr}r(h`Uhajubaubh)r}r(h`Uhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM!hthh[]rh)r}r(h`Xpathhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xpathrr}r(h`Uhajubahgjubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsM!hthh[]r(h)r}r(h`X4:param path path to test :returns: list of filenamesrhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]rh}X4:param path path to test :returns: list of filenamesrr}r(h`jhajubaubh)r}r(h`XGet the list of files matching the given path pattern on the slave. This uses Python's ``glob`` module. If the ``glob`` method fails, it aborts the step.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMhthh[]r(h}XWGet the list of files matching the given path pattern on the slave. This uses Python's rr}r(h`XWGet the list of files matching the given path pattern on the slave. This uses Python's hajubh)r}r(h`X``glob``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xglobrr}r(h`Uhajubahghubh}X module. If the rr}r(h`X module. If the hajubh)r}r(h`X``glob``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xglobrr}r(h`Uhajubahghubh}X" method fails, it aborts the step.rr}r(h`X" method fails, it aborts the step.hajubeubeubeubeubeubeubh])r}r(h`Uhah^hbhehghhhi}r(hk]hl]hm]hn]rhYahq]rh-auhsM%hthh[]r(hv)r}r(h`X ShellMixinrhajhbhehghzhi}r(hk]hl]hm]hn]hq]uhsM%hthh[]rh}X ShellMixinrr}r(h`jhajubaubh)r}r(h`XMost Buildbot steps run shell commands on the slave, and Buildbot has an impressive array of configuration parameters to control that execution. The ``ShellMixin`` mixin provides the tools to make running shell commands easy and flexible.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM'hthh[]r(h}XMost Buildbot steps run shell commands on the slave, and Buildbot has an impressive array of configuration parameters to control that execution. The rr}r(h`XMost Buildbot steps run shell commands on the slave, and Buildbot has an impressive array of configuration parameters to control that execution. The hajubh)r}r(h`X``ShellMixin``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}X ShellMixinrr}r(h`Uhajubahghubh}XK mixin provides the tools to make running shell commands easy and flexible.rr}r(h`XK mixin provides the tools to make running shell commands easy and flexible.hajubeubh)r}r(h`X/This class can only be used in new-style steps.rhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsM*hthh[]rh}X/This class can only be used in new-style steps.rr}r(h`jhajubaubh)r}r(h`Uhajhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXKbuildbot.process.buildstep.ShellMixin (class in buildbot.process.buildstep)h&UtrauhsNhthh[]ubh)r}r (h`Uhajhbhehghhi}r (hÉhXpyhn]hm]hk]hl]hq]hXclassr hj uhsNhthh[]r (h)r }r(h`X%buildbot.process.buildstep.ShellMixinrhajhbhehghhi}r(hn]rh&ahhhm]hk]hl]hq]rh&ahX%buildbot.process.buildstep.ShellMixinrhXbuildbot.process.buildstephՉuhsM]hthh[]r(h)r}r(h`Xclass haj hbhehghhi}r(hk]hl]hm]hn]hq]uhsM]hthh[]rh}Xclass rr}r(h`Uhajubaubh)r}r(h`Xbuildbot.process.buildstep.haj hbhehghhi}r(hk]hl]hm]hn]hq]uhsM]hthh[]rh}Xbuildbot.process.buildstep.r r!}r"(h`Uhajubaubh)r#}r$(h`X ShellMixinhaj hbhehghhi}r%(hk]hl]hm]hn]hq]uhsM]hthh[]r&h}X ShellMixinr'r(}r)(h`Uhaj#ubaubeubjc)r*}r+(h`Uhajhbhehgjfhi}r,(hk]hl]hm]hn]hq]uhsM]hthh[]r-(h)r.}r/(h`XThis mixin manages the following step configuration parameters, the contents of which are documented in the manual. Naturally, all of these are renderable.r0haj*hbhehghhi}r1(hk]hl]hm]hn]hq]uhsM.hthh[]r2h}XThis mixin manages the following step configuration parameters, the contents of which are documented in the manual. Naturally, all of these are renderable.r3r4}r5(h`j0haj.ubaubh)r6}r7(h`X..py:attribute:: command ..py:attribute:: workdir ..py:attribute:: env ..py:attribute:: want_stdout ..py:attribute:: want_stderr ..py:attribute:: usePTY ..py:attribute:: logfiles ..py:attribute:: lazylogfiles ..py:attribute:: timeout ..py:attribute:: maxTime ..py:attribute:: logEnviron ..py:attribute:: interruptSignal ..py:attribute:: sigtermTime ..py:attribute:: initialStdin ..py:attribute:: decodeRCr8haj*hbhehghhi}r9(hk]hl]hm]hn]hq]uhsM1hthh[]r:h}X..py:attribute:: command ..py:attribute:: workdir ..py:attribute:: env ..py:attribute:: want_stdout ..py:attribute:: want_stderr ..py:attribute:: usePTY ..py:attribute:: logfiles ..py:attribute:: lazylogfiles ..py:attribute:: timeout ..py:attribute:: maxTime ..py:attribute:: logEnviron ..py:attribute:: interruptSignal ..py:attribute:: sigtermTime ..py:attribute:: initialStdin ..py:attribute:: decodeRCr;r<}r=(h`j8haj6ubaubh)r>}r?(h`X?..py:method:: setupShellMixin(constructorArgs, prohibitArgs=[])r@haj*hbhehghhi}rA(hk]hl]hm]hn]hq]uhsMAhthh[]rBh}X?..py:method:: setupShellMixin(constructorArgs, prohibitArgs=[])rCrD}rE(h`j@haj>ubaubj%)rF}rG(h`Uhaj*hbhehgj;hi}rH(hk]hl]hm]hn]hq]uhsNhthh[]rI(h)rJ}rK(h`X:param dict constructorArgs constructor keyword arguments :param list prohibitArgs list of recognized arguments to reject :returns: keyword arguments destined for :py:class:`BuildStep`hajFhbhehghhi}rL(hk]hl]hm]hn]hq]uhsMCh[]rM(h}X:param dict constructorArgs constructor keyword arguments :param list prohibitArgs list of recognized arguments to reject :returns: keyword arguments destined for rNrO}rP(h`X:param dict constructorArgs constructor keyword arguments :param list prohibitArgs list of recognized arguments to reject :returns: keyword arguments destined for hajJubh)rQ}rR(h`X:py:class:`BuildStep`rShajJhbhehghhi}rT(UreftypeXclasshhX BuildStepU refdomainXpyrUhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMCh[]rVh)rW}rX(h`jShi}rY(hk]hl]rZ(hjUXpy-classr[ehm]hn]hq]uhajQh[]r\h}X BuildStepr]r^}r_(h`UhajWubahghubaubeubh)r`}ra(h`X+This method is intended to be called from the shell constructor, passed any keyword arguments not otherwise used by the step. Any attributes set on the instance already (e.g., class-level attributes) are used as defaults. Attributes named in ``prohibitArgs`` are rejected with a configuration error.hajFhbhehghhi}rb(hk]hl]hm]hn]hq]uhsMGh[]rc(h}XThis method is intended to be called from the shell constructor, passed any keyword arguments not otherwise used by the step. Any attributes set on the instance already (e.g., class-level attributes) are used as defaults. Attributes named in rdre}rf(h`XThis method is intended to be called from the shell constructor, passed any keyword arguments not otherwise used by the step. Any attributes set on the instance already (e.g., class-level attributes) are used as defaults. Attributes named in haj`ubh)rg}rh(h`X``prohibitArgs``hi}ri(hk]hl]hm]hn]hq]uhaj`h[]rjh}X prohibitArgsrkrl}rm(h`Uhajgubahghubh}X) are rejected with a configuration error.rnro}rp(h`X) are rejected with a configuration error.haj`ubeubh)rq}rr(h`XKThe return value should be passed to the :py:class:`BuildStep` constructor.hajFhbhehghhi}rs(hk]hl]hm]hn]hq]uhsMKh[]rt(h}X)The return value should be passed to the rurv}rw(h`X)The return value should be passed to the hajqubh)rx}ry(h`X:py:class:`BuildStep`rzhajqhbhehghhi}r{(UreftypeXclasshhX BuildStepU refdomainXpyr|hn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMKh[]r}h)r~}r(h`jzhi}r(hk]hl]r(hj|Xpy-classrehm]hn]hq]uhajxh[]rh}X BuildSteprr}r(h`Uhaj~ubahghubaubh}X constructor.rr}r(h`X constructor.hajqubeubeubh)r}r(h`X\..py:method:: makeRemoteShellCommand(collectStdout=False, collectStderr=False, \**overrides)rhaj*hbhehghhi}r(hk]hl]hm]hn]hq]uhsMMhthh[]rh}X[..py:method:: makeRemoteShellCommand(collectStdout=False, collectStderr=False, **overrides)rr}r(h`X\..py:method:: makeRemoteShellCommand(collectStdout=False, collectStderr=False, \**overrides)hajubaubj%)r}r(h`Uhaj*hbhehgj;hi}r(hk]hl]hm]hn]hq]uhsNhthh[]r(j)r}r(h`Uhi}r(hk]hl]hm]hn]hq]uhajh[]r(j)r}r(h`UhajhbhehgjIhi}r(hk]hl]hm]hn]hq]uhsMOh[]r(j)r}r(h`Xparam collectStdoutrhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xparam collectStdoutrr}r(h`jhajubahgjubj)r}r(h`XNif true, the command's stdout wil be available in ``cmd.stdout`` on completionrhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMOh[]r(h}X2if true, the command's stdout wil be available in rr}r(h`X2if true, the command's stdout wil be available in hajubh)r}r(h`X``cmd.stdout``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}X cmd.stdoutrr}r(h`Uhajubahghubh}X on completionrr}r(h`X on completionhajubeubahgjHubeubj)r}r(h`UhajhbhehgjIhi}r(hk]hl]hm]hn]hq]uhsMPh[]r(j)r}r(h`Xparam collectStderrrhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xparam collectStderrrr}r(h`jhajubahgjubj)r}r(h`XNif true, the command's stderr wil be available in ``cmd.stderr`` on completionrhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMPh[]r(h}X2if true, the command's stderr wil be available in rr}r(h`X2if true, the command's stderr wil be available in hajubh)r}r(h`X``cmd.stderr``hi}r(hk]hl]hm]hn]hq]uhajh[]rh}X cmd.stderrrr}r(h`Uhajubahghubh}X on completionrr}r(h`X on completionhajubeubahgjHubeubj)r}r(h`UhajhbhehgjIhi}r(hk]hl]hm]hn]hq]uhsMQh[]r(j)r}r(h`Xparam overridesrhi}r(hk]hl]hm]hn]hq]uhajh[]rh}Xparam overridesrr}r(h`jhajubahgjubj)r}r(h`XMoverrides arguments that might have been passed to :py:meth:`setupShellMixin`rhi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMQh[]r(h}X3overrides arguments that might have been passed to rr}r(h`X3overrides arguments that might have been passed to hajubh)r}r(h`X:py:meth:`setupShellMixin`rhajhbhehghhi}r(UreftypeXmethhhXsetupShellMixinU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMQh[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}XsetupShellMixinrr}r(h`UhajubahghubaubeubahgjHubeubj)r}r(h`UhajhbhehgjIhi}r(hk]hl]hm]hn]hq]uhsMRh[]r(j)r }r (h`Xreturnsr hi}r (hk]hl]hm]hn]hq]uhajh[]r h}Xreturnsrr}r(h`j haj ubahgjubj)r}r(h`XU:py:class:`~buildbot.process.remotecommand.RemoteShellCommand` instance via Deferred hi}r(hk]hl]hm]hn]hq]uhajh[]rh)r}r(h`XT:py:class:`~buildbot.process.remotecommand.RemoteShellCommand` instance via Deferredhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMRh[]r(h)r}r(h`X>:py:class:`~buildbot.process.remotecommand.RemoteShellCommand`rhajhbhehghhi}r(UreftypeXclasshhX1buildbot.process.remotecommand.RemoteShellCommandU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMRh[]rh)r}r (h`jhi}r!(hk]hl]r"(hjXpy-classr#ehm]hn]hq]uhajh[]r$h}XRemoteShellCommandr%r&}r'(h`Uhajubahghubaubh}X instance via Deferredr(r)}r*(h`X instance via DeferredhajubeubahgjHubeubehgj ubh)r+}r,(h`X5This method constructs a :py:class:`~buildbot.process.remotecommand.RemoteShellCommand` instance based on the instance attributes and any supplied overrides. It must be called while the step is running, as it examines the slave capabilities before creating the command. It takes care of just about everything:hajhbhehghhi}r-(hk]hl]hm]hn]hq]uhsMTh[]r.(h}XThis method constructs a r/r0}r1(h`XThis method constructs a haj+ubh)r2}r3(h`X>:py:class:`~buildbot.process.remotecommand.RemoteShellCommand`r4haj+hbhehghhi}r5(UreftypeXclasshhX1buildbot.process.remotecommand.RemoteShellCommandU refdomainXpyr6hn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMTh[]r7h)r8}r9(h`j4hi}r:(hk]hl]r;(hj6Xpy-classr<ehm]hn]hq]uhaj2h[]r=h}XRemoteShellCommandr>r?}r@(h`Uhaj8ubahghubaubh}X instance based on the instance attributes and any supplied overrides. It must be called while the step is running, as it examines the slave capabilities before creating the command. It takes care of just about everything:rArB}rC(h`X instance based on the instance attributes and any supplied overrides. It must be called while the step is running, as it examines the slave capabilities before creating the command. It takes care of just about everything:haj+ubeubj%)rD}rE(h`Uhi}rF(hk]hl]hm]hn]hq]uhajh[]rGj )rH}rI(h`Uhi}rJ(j'X*hn]hm]hk]hl]hq]uhajDh[]rK(j )rL}rM(h`X8Creating log files and associating them with the commandrNhi}rO(hk]hl]hm]hn]hq]uhajHh[]rPh)rQ}rR(h`jNhajLhbhehghhi}rS(hk]hl]hm]hn]hq]uhsMXh[]rTh}X8Creating log files and associating them with the commandrUrV}rW(h`jNhajQubaubahgj ubj )rX}rY(h`X!Merging environment configurationrZhi}r[(hk]hl]hm]hn]hq]uhajHh[]r\h)r]}r^(h`jZhajXhbhehghhi}r_(hk]hl]hm]hn]hq]uhsMYh[]r`h}X!Merging environment configurationrarb}rc(h`jZhaj]ubaubahgj ubj )rd}re(h`X0Selecting the appropriate workdir configuration hi}rf(hk]hl]hm]hn]hq]uhajHh[]rgh)rh}ri(h`X/Selecting the appropriate workdir configurationrjhajdhbhehghhi}rk(hk]hl]hm]hn]hq]uhsMZh[]rlh}X/Selecting the appropriate workdir configurationrmrn}ro(h`jjhajhubaubahgj ubehgj ubahgj;ubh)rp}rq(h`XhAll that remains is to run the command with :py:meth:`~buildbot.process.buildstep.BuildStep.runCommand`.rrhajhbhehghhi}rs(hk]hl]hm]hn]hq]uhsM\h[]rt(h}X,All that remains is to run the command with rurv}rw(h`X,All that remains is to run the command with hajpubh)rx}ry(h`X;:py:meth:`~buildbot.process.buildstep.BuildStep.runCommand`rzhajphbhehghhi}r{(UreftypeXmethhhX/buildbot.process.buildstep.BuildStep.runCommandU refdomainXpyr|hn]hm]U refexplicithk]hl]hq]hhj9jj:huhsM\h[]r}h)r~}r(h`jzhi}r(hk]hl]r(hj|Xpy-methrehm]hn]hq]uhajxh[]rh}X runCommandrr}r(h`Uhaj~ubahghubaubh}X.r}r(h`X.hajpubeubeubeubeubeubh])r}r(h`Uhah^hbhehghhhi}r(hk]hl]hm]hn]rhVahq]rhauhsM_hthh[]r(hv)r}r(h`X Exceptionsrhajhbhehghzhi}r(hk]hl]hm]hn]hq]uhsM_hthh[]rh}X Exceptionsrr}r(h`jhajubaubh)r}r(h`Uhajhbhehghhi}r(hn]hm]hk]hl]hq]Uentries]r(hXBuildStepFailedrhUtrauhsNhthh[]ubh)r}r(h`Uhajhbhehghhi}r(hÉhXpyhn]hm]hk]hl]hq]hX exceptionrhjuhsNhthh[]r(h)r}r(h`jhajhbhehghhi}r(hn]rhahhhm]hk]hl]hq]rhahjhUhՉuhsMehthh[]r(h)r}r(h`X exception hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMehthh[]rh}X exception rr}r(h`Uhajubaubh)r}r(h`Xbuildbot.process.buildstep.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMehthh[]rh}Xbuildbot.process.buildstep.rr}r(h`Uhajubaubh)r}r(h`jhajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMehthh[]rh}XBuildStepFailedrr}r(h`Uhajubaubeubjc)r}r(h`Uhajhbhehgjfhi}r(hk]hl]hm]hn]hq]uhsMehthh[]rh)r}r(h`XThis exception indicates that the buildstep has failed. It is useful as a way to skip all subsequent processing when a step goes wrong. It is handled by :meth:`BuildStep.failed`.hajhbhehghhi}r(hk]hl]hm]hn]hq]uhsMchthh[]r(h}XThis exception indicates that the buildstep has failed. It is useful as a way to skip all subsequent processing when a step goes wrong. It is handled by rr}r(h`XThis exception indicates that the buildstep has failed. It is useful as a way to skip all subsequent processing when a step goes wrong. It is handled by hajubh)r}r(h`X:meth:`BuildStep.failed`rhajhbhehghhi}r(UreftypeXmethhhXBuildStep.failedU refdomainXpyrhn]hm]U refexplicithk]hl]hq]hhj9jj:huhsMch[]rh)r}r(h`jhi}r(hk]hl]r(hjXpy-methrehm]hn]hq]uhajh[]rh}XBuildStep.failedrr}r(h`Uhajubahghubaubh}X.r}r(h`X.hajubeubaubeubeubeubah`UU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhthU current_linerNUtransform_messagesr]rUreporterrNUid_startrKU autofootnotesr]rU citation_refsr}rUindirect_targetsr]rUsettingsr(cdocutils.frontend Values ror}r(Ufootnote_backlinksrKUrecord_dependenciesrNU rfc_base_urlrUhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNhzNUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerr Ustrictr U sectnum_xformr KUdump_transformsr NU docinfo_xformr KUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigr U_disable_configr!NU id_prefixr"UU tab_widthr#KUerror_encodingr$UUTF-8r%U_sourcer&UY/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-buildsteps.rstr'Ugettext_compactr(U generatorr)NUdump_internalsr*NU smart_quotesr+U pep_base_urlr,Uhttp://www.python.org/dev/peps/r-Usyntax_highlightr.Ulongr/Uinput_encoding_error_handlerr0j Uauto_id_prefixr1Uidr2Udoctitle_xformr3Ustrip_elements_with_classesr4NU _config_filesr5]Ufile_insertion_enabledr6U raw_enabledr7KU dump_settingsr8NubUsymbol_footnote_startr9KUidsr:}r;(hj+ hjJhjh jh jh j*h jhUh^hjh8jLhjhjhjhjhjhjhjhj9 hjphVjhjehpcdocutils.nodes target r<)r=}r>(h`Uhah^hbhehgUtargetr?hi}r@(hk]hn]rAhpahm]Uismodhl]hq]uhsKhthh[]ubhj hjhjY hj h hhWhh"j h#jh$jhXjh&j h'j{h(jh)jh*jh+j h,jhYjh.jh/jh0jmh1j;h2jyh3j5 h4j}h5j|h6jdh7j hjh9j1h:jh;j` h>j9h}q?(hX BuildFactory Implementation Noteq@hh8hhhh1h!}qA(h#]h$]h%]h&]h(]uh*Kh+hh]qBh4X BuildFactory Implementation NoteqCqD}qE(hh@hh>ubaubcdocutils.nodes paragraph qF)qG}qH(hXdThe default :class:`BuildFactory`, provided in the :mod:`buildbot.process.factory` module, contains an internal list of `BuildStep specifications`: a list of ``(step_class, kwargs)`` tuples for each. These specification tuples are constructed when the config file is read, by asking the instances passed to :meth:`addStep` for their subclass and arguments.hh8hhhU paragraphqIh!}qJ(h#]h$]h%]h&]h(]uh*Kh+hh]qK(h4X The default qLqM}qN(hX The default hhGubcsphinx.addnodes pending_xref qO)qP}qQ(hX:class:`BuildFactory`qRhhGhhhU pending_xrefqSh!}qT(UreftypeXclassUrefwarnqUU reftargetqVX BuildFactoryU refdomainXpyqWh&]h%]U refexplicith#]h$]h(]UrefdocqXXdeveloper/cls-buildfactoryqYUpy:classqZNU py:moduleq[Nuh*Kh]q\cdocutils.nodes literal q])q^}q_(hhRh!}q`(h#]h$]qa(UxrefqbhWXpy-classqceh%]h&]h(]uhhPh]qdh4X BuildFactoryqeqf}qg(hUhh^ubahUliteralqhubaubh4X, provided in the qiqj}qk(hX, provided in the hhGubhO)ql}qm(hX:mod:`buildbot.process.factory`qnhhGhhhhSh!}qo(UreftypeXmodhUhVXbuildbot.process.factoryU refdomainXpyqph&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]qqh])qr}qs(hhnh!}qt(h#]h$]qu(hbhpXpy-modqveh%]h&]h(]uhhlh]qwh4Xbuildbot.process.factoryqxqy}qz(hUhhrubahhhubaubh4X& module, contains an internal list of q{q|}q}(hX& module, contains an internal list of hhGubcdocutils.nodes title_reference q~)q}q(hX`BuildStep specifications`h!}q(h#]h$]h%]h&]h(]uhhGh]qh4XBuildStep specificationsqq}q(hUhhubahUtitle_referencequbh4X : a list of qq}q(hX : a list of hhGubh])q}q(hX``(step_class, kwargs)``h!}q(h#]h$]h%]h&]h(]uhhGh]qh4X(step_class, kwargs)qq}q(hUhhubahhhubh4X} tuples for each. These specification tuples are constructed when the config file is read, by asking the instances passed to qq}q(hX} tuples for each. These specification tuples are constructed when the config file is read, by asking the instances passed to hhGubhO)q}q(hX:meth:`addStep`qhhGhhhhSh!}q(UreftypeXmethhUhVXaddStepU refdomainXpyqh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]qh])q}q(hhh!}q(h#]h$]q(hbhXpy-methqeh%]h&]h(]uhhh]qh4XaddStepqq}q(hUhhubahhhubaubh4X" for their subclass and arguments.qq}q(hX" for their subclass and arguments.hhGubeubhF)q}q(hXTo support config files from buildbot-0.7.5 and earlier, :meth:`addStep` also accepts the ``f.addStep(shell.Compile, command=["make","build"])`` form, although its use is discouraged because then the ``Compile`` step doesn't get to validate or complain about its arguments until build time. The modern pass-by-instance approach allows this validation to occur while the config file is being loaded, where the admin has a better chance of noticing problems.hh8hhhhIh!}q(h#]h$]h%]h&]h(]uh*Kh+hh]q(h4X9To support config files from buildbot-0.7.5 and earlier, qq}q(hX9To support config files from buildbot-0.7.5 and earlier, hhubhO)q}q(hX:meth:`addStep`qhhhhhhSh!}q(UreftypeXmethhUhVXaddStepU refdomainXpyqh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]qh])q}q(hhh!}q(h#]h$]q(hbhXpy-methqeh%]h&]h(]uhhh]qh4XaddStepqq}q(hUhhubahhhubaubh4X also accepts the qq}q(hX also accepts the hhubh])q}q(hX6``f.addStep(shell.Compile, command=["make","build"])``h!}q(h#]h$]h%]h&]h(]uhhh]qh4X2f.addStep(shell.Compile, command=["make","build"])qÅq}q(hUhhubahhhubh4X8 form, although its use is discouraged because then the qƅq}q(hX8 form, although its use is discouraged because then the hhubh])q}q(hX ``Compile``h!}q(h#]h$]h%]h&]h(]uhhh]qh4XCompileqͅq}q(hUhhubahhhubh4X step doesn't get to validate or complain about its arguments until build time. The modern pass-by-instance approach allows this validation to occur while the config file is being loaded, where the admin has a better chance of noticing problems.qЅq}q(hX step doesn't get to validate or complain about its arguments until build time. The modern pass-by-instance approach allows this validation to occur while the config file is being loaded, where the admin has a better chance of noticing problems.hhubeubhF)q}q(hX}When asked to create a :class:`Build`, the :class:`BuildFactory` puts a copy of the list of step specifications into the new :class:`Build` object. When the :class:`Build` is actually started, these step specifications are used to create the actual set of :class:`BuildStep`\s, which are then executed one at a time. This serves to give each Build an independent copy of each step.hh8hhhhIh!}q(h#]h$]h%]h&]h(]uh*Kh+hh]q(h4XWhen asked to create a qׅq}q(hXWhen asked to create a hhubhO)q}q(hX:class:`Build`qhhhhhhSh!}q(UreftypeXclasshUhVXBuildU refdomainXpyqh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]qh])q}q(hhh!}q(h#]h$]q(hbhXpy-classqeh%]h&]h(]uhhh]qh4XBuildq慁q}q(hUhhubahhhubaubh4X, the q酁q}q(hX, the hhubhO)q}q(hX:class:`BuildFactory`qhhhhhhSh!}q(UreftypeXclasshUhVX BuildFactoryU refdomainXpyqh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]qh])q}q(hhh!}q(h#]h$]q(hbhXpy-classqeh%]h&]h(]uhhh]qh4X BuildFactoryqq}q(hUhhubahhhubaubh4X= puts a copy of the list of step specifications into the new qq}q(hX= puts a copy of the list of step specifications into the new hhubhO)q}q(hX:class:`Build`rhhhhhhSh!}r(UreftypeXclasshUhVXBuildU refdomainXpyrh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]rh])r}r(hjh!}r(h#]h$]r(hbjXpy-classreh%]h&]h(]uhhh]r h4XBuildr r }r (hUhjubahhhubaubh4X object. When the r r}r(hX object. When the hhubhO)r}r(hX:class:`Build`rhhhhhhSh!}r(UreftypeXclasshUhVXBuildU refdomainXpyrh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]rh])r}r(hjh!}r(h#]h$]r(hbjXpy-classreh%]h&]h(]uhjh]rh4XBuildrr}r(hUhjubahhhubaubh4XU is actually started, these step specifications are used to create the actual set of rr }r!(hXU is actually started, these step specifications are used to create the actual set of hhubhO)r"}r#(hX:class:`BuildStep`r$hhhhhhSh!}r%(UreftypeXclasshUhVX BuildStepU refdomainXpyr&h&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]r'h])r(}r)(hj$h!}r*(h#]h$]r+(hbj&Xpy-classr,eh%]h&]h(]uhj"h]r-h4X BuildStepr.r/}r0(hUhj(ubahhhubaubh4Xjs, which are then executed one at a time. This serves to give each Build an independent copy of each step.r1r2}r3(hXk\s, which are then executed one at a time. This serves to give each Build an independent copy of each step.hhubeubhF)r4}r5(hX=Each step can affect the build process in the following ways:r6hh8hhhhIh!}r7(h#]h$]h%]h&]h(]uh*Kh+hh]r8h4X=Each step can affect the build process in the following ways:r9r:}r;(hj6hj4ubaubcdocutils.nodes block_quote r<)r=}r>(hUhh8hNhU block_quoter?h!}r@(h#]h$]h%]h&]h(]uh*Nh+hh]rAcdocutils.nodes bullet_list rB)rC}rD(hUh!}rE(UbulletrFX*h&]h%]h#]h$]h(]uhj=h]rG(cdocutils.nodes list_item rH)rI}rJ(hXIf the step's :attr:`haltOnFailure` attribute is ``True``, then a failure in the step (i.e. if it completes with a result of ``FAILURE``) will cause the whole build to be terminated immediately: no further steps will be executed, with the exception of steps with :attr:`alwaysRun` set to ``True``. :attr:`haltOnFailure` is useful for setup steps upon which the rest of the build depends: if the CVS checkout or :command:`./configure` process fails, there is no point in trying to compile or test the resulting tree. h!}rK(h#]h$]h%]h&]h(]uhjCh]rLhF)rM}rN(hXIf the step's :attr:`haltOnFailure` attribute is ``True``, then a failure in the step (i.e. if it completes with a result of ``FAILURE``) will cause the whole build to be terminated immediately: no further steps will be executed, with the exception of steps with :attr:`alwaysRun` set to ``True``. :attr:`haltOnFailure` is useful for setup steps upon which the rest of the build depends: if the CVS checkout or :command:`./configure` process fails, there is no point in trying to compile or test the resulting tree.hjIhhhhIh!}rO(h#]h$]h%]h&]h(]uh*Kh]rP(h4XIf the step's rQrR}rS(hXIf the step's hjMubhO)rT}rU(hX:attr:`haltOnFailure`rVhjMhhhhSh!}rW(UreftypeXattrhUhVX haltOnFailureU refdomainXpyrXh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]rYh])rZ}r[(hjVh!}r\(h#]h$]r](hbjXXpy-attrr^eh%]h&]h(]uhjTh]r_h4X haltOnFailurer`ra}rb(hUhjZubahhhubaubh4X attribute is rcrd}re(hX attribute is hjMubh])rf}rg(hX``True``h!}rh(h#]h$]h%]h&]h(]uhjMh]rih4XTruerjrk}rl(hUhjfubahhhubh4XD, then a failure in the step (i.e. if it completes with a result of rmrn}ro(hXD, then a failure in the step (i.e. if it completes with a result of hjMubh])rp}rq(hX ``FAILURE``h!}rr(h#]h$]h%]h&]h(]uhjMh]rsh4XFAILURErtru}rv(hUhjpubahhhubh4X) will cause the whole build to be terminated immediately: no further steps will be executed, with the exception of steps with rwrx}ry(hX) will cause the whole build to be terminated immediately: no further steps will be executed, with the exception of steps with hjMubhO)rz}r{(hX:attr:`alwaysRun`r|hjMhhhhSh!}r}(UreftypeXattrhUhVX alwaysRunU refdomainXpyr~h&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]rh])r}r(hj|h!}r(h#]h$]r(hbj~Xpy-attrreh%]h&]h(]uhjzh]rh4X alwaysRunrr}r(hUhjubahhhubaubh4X set to rr}r(hX set to hjMubh])r}r(hX``True``h!}r(h#]h$]h%]h&]h(]uhjMh]rh4XTruerr}r(hUhjubahhhubh4X. rr}r(hX. hjMubhO)r}r(hX:attr:`haltOnFailure`rhjMhhhhSh!}r(UreftypeXattrhUhVX haltOnFailureU refdomainXpyrh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*Kh]rh])r}r(hjh!}r(h#]h$]r(hbjXpy-attrreh%]h&]h(]uhjh]rh4X haltOnFailurerr}r(hUhjubahhhubaubh4X\ is useful for setup steps upon which the rest of the build depends: if the CVS checkout or rr}r(hX\ is useful for setup steps upon which the rest of the build depends: if the CVS checkout or hjMubcdocutils.nodes strong r)r}r(hX:command:`./configure`h!}r(h#]h$]rUcommandrah%]h&]h(]uhjMh]rh4X ./configurerr}r(hUhjubahUstrongrubh4XR process fails, there is no point in trying to compile or test the resulting tree.rr}r(hXR process fails, there is no point in trying to compile or test the resulting tree.hjMubeubahU list_itemrubjH)r}r(hXIf the step's :attr:`alwaysRun` attribute is ``True``, then it will always be run, regardless of if previous steps have failed. This is useful for cleanup steps that should always be run to return the build directory or build slave into a good state. h!}r(h#]h$]h%]h&]h(]uhjCh]rhF)r}r(hXIf the step's :attr:`alwaysRun` attribute is ``True``, then it will always be run, regardless of if previous steps have failed. This is useful for cleanup steps that should always be run to return the build directory or build slave into a good state.hjhhhhIh!}r(h#]h$]h%]h&]h(]uh*K(h]r(h4XIf the step's rr}r(hXIf the step's hjubhO)r}r(hX:attr:`alwaysRun`rhjhhhhSh!}r(UreftypeXattrhUhVX alwaysRunU refdomainXpyrh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*K(h]rh])r}r(hjh!}r(h#]h$]r(hbjXpy-attrreh%]h&]h(]uhjh]rh4X alwaysRunrr}r(hUhjubahhhubaubh4X attribute is rr}r(hX attribute is hjubh])r}r(hX``True``h!}r(h#]h$]h%]h&]h(]uhjh]rh4XTruerr}r(hUhjubahhhubh4X, then it will always be run, regardless of if previous steps have failed. This is useful for cleanup steps that should always be run to return the build directory or build slave into a good state.rr}r(hX, then it will always be run, regardless of if previous steps have failed. This is useful for cleanup steps that should always be run to return the build directory or build slave into a good state.hjubeubahjubjH)r}r(hXIf the :attr:`flunkOnFailure` or :attr:`flunkOnWarnings` flag is set, then a result of ``FAILURE`` or ``WARNINGS`` will mark the build as a whole as ``FAILED``. However, the remaining steps will still be executed. This is appropriate for things like multiple testing steps: a failure in any one of them will indicate that the build has failed, however it is still useful to run them all to completion. h!}r(h#]h$]h%]h&]h(]uhjCh]rhF)r}r(hXIf the :attr:`flunkOnFailure` or :attr:`flunkOnWarnings` flag is set, then a result of ``FAILURE`` or ``WARNINGS`` will mark the build as a whole as ``FAILED``. However, the remaining steps will still be executed. This is appropriate for things like multiple testing steps: a failure in any one of them will indicate that the build has failed, however it is still useful to run them all to completion.hjhhhhIh!}r(h#]h$]h%]h&]h(]uh*K-h]r(h4XIf the rr}r(hXIf the hjubhO)r}r(hX:attr:`flunkOnFailure`rhjhhhhSh!}r(UreftypeXattrhUhVXflunkOnFailureU refdomainXpyrh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*K-h]rh])r}r(hjh!}r(h#]h$]r(hbjXpy-attrreh%]h&]h(]uhjh]rh4XflunkOnFailurerr}r(hUhjubahhhubaubh4X or rr}r(hX or hjubhO)r}r(hX:attr:`flunkOnWarnings`rhjhhhhSh!}r(UreftypeXattrhUhVXflunkOnWarningsU refdomainXpyrh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*K-h]rh])r}r(hjh!}r(h#]h$]r(hbjXpy-attrreh%]h&]h(]uhjh]rh4XflunkOnWarningsrr}r (hUhjubahhhubaubh4X flag is set, then a result of r r }r (hX flag is set, then a result of hjubh])r }r(hX ``FAILURE``h!}r(h#]h$]h%]h&]h(]uhjh]rh4XFAILURErr}r(hUhj ubahhhubh4X or rr}r(hX or hjubh])r}r(hX ``WARNINGS``h!}r(h#]h$]h%]h&]h(]uhjh]rh4XWARNINGSrr}r(hUhjubahhhubh4X# will mark the build as a whole as rr}r (hX# will mark the build as a whole as hjubh])r!}r"(hX ``FAILED``h!}r#(h#]h$]h%]h&]h(]uhjh]r$h4XFAILEDr%r&}r'(hUhj!ubahhhubh4X. However, the remaining steps will still be executed. This is appropriate for things like multiple testing steps: a failure in any one of them will indicate that the build has failed, however it is still useful to run them all to completion.r(r)}r*(hX. However, the remaining steps will still be executed. This is appropriate for things like multiple testing steps: a failure in any one of them will indicate that the build has failed, however it is still useful to run them all to completion.hjubeubahjubjH)r+}r,(hXSimilarly, if the :attr:`warnOnFailure` or :attr:`warnOnWarnings` flag is set, then a result of ``FAILURE`` or ``WARNINGS`` will mark the build as having ``WARNINGS``, and the remaining steps will still be executed. This may be appropriate for certain kinds of optional build or test steps. For example, a failure experienced while building documentation files should be made visible with a ``WARNINGS`` result but not be serious enough to warrant marking the whole build with a ``FAILURE``. h!}r-(h#]h$]h%]h&]h(]uhjCh]r.hF)r/}r0(hXSimilarly, if the :attr:`warnOnFailure` or :attr:`warnOnWarnings` flag is set, then a result of ``FAILURE`` or ``WARNINGS`` will mark the build as having ``WARNINGS``, and the remaining steps will still be executed. This may be appropriate for certain kinds of optional build or test steps. For example, a failure experienced while building documentation files should be made visible with a ``WARNINGS`` result but not be serious enough to warrant marking the whole build with a ``FAILURE``.hj+hhhhIh!}r1(h#]h$]h%]h&]h(]uh*K4h]r2(h4XSimilarly, if the r3r4}r5(hXSimilarly, if the hj/ubhO)r6}r7(hX:attr:`warnOnFailure`r8hj/hhhhSh!}r9(UreftypeXattrhUhVX warnOnFailureU refdomainXpyr:h&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*K4h]r;h])r<}r=(hj8h!}r>(h#]h$]r?(hbj:Xpy-attrr@eh%]h&]h(]uhj6h]rAh4X warnOnFailurerBrC}rD(hUhj<ubahhhubaubh4X or rErF}rG(hX or hj/ubhO)rH}rI(hX:attr:`warnOnWarnings`rJhj/hhhhSh!}rK(UreftypeXattrhUhVXwarnOnWarningsU refdomainXpyrLh&]h%]U refexplicith#]h$]h(]hXhYhZNh[Nuh*K4h]rMh])rN}rO(hjJh!}rP(h#]h$]rQ(hbjLXpy-attrrReh%]h&]h(]uhjHh]rSh4XwarnOnWarningsrTrU}rV(hUhjNubahhhubaubh4X flag is set, then a result of rWrX}rY(hX flag is set, then a result of hj/ubh])rZ}r[(hX ``FAILURE``h!}r\(h#]h$]h%]h&]h(]uhj/h]r]h4XFAILUREr^r_}r`(hUhjZubahhhubh4X or rarb}rc(hX or hj/ubh])rd}re(hX ``WARNINGS``h!}rf(h#]h$]h%]h&]h(]uhj/h]rgh4XWARNINGSrhri}rj(hUhjdubahhhubh4X will mark the build as having rkrl}rm(hX will mark the build as having hj/ubh])rn}ro(hX ``WARNINGS``h!}rp(h#]h$]h%]h&]h(]uhj/h]rqh4XWARNINGSrrrs}rt(hUhjnubahhhubh4X, and the remaining steps will still be executed. This may be appropriate for certain kinds of optional build or test steps. For example, a failure experienced while building documentation files should be made visible with a rurv}rw(hX, and the remaining steps will still be executed. This may be appropriate for certain kinds of optional build or test steps. For example, a failure experienced while building documentation files should be made visible with a hj/ubh])rx}ry(hX ``WARNINGS``h!}rz(h#]h$]h%]h&]h(]uhj/h]r{h4XWARNINGSr|r}}r~(hUhjxubahhhubh4XL result but not be serious enough to warrant marking the whole build with a rr}r(hXL result but not be serious enough to warrant marking the whole build with a hj/ubh])r}r(hX ``FAILURE``h!}r(h#]h$]h%]h&]h(]uhj/h]rh4XFAILURErr}r(hUhjubahhhubh4X.r}r(hX.hj/ubeubahjubehU bullet_listrubaubhF)r}r(hXIn addition, each :class:`Step` produces its own results, may create logfiles, etc. However only the flags described above have any effect on the build as a whole.hh8hhhhIh!}r(h#]h$]h%]h&]h(]uh*K(hbj9Xpy-classr?eh%]h&]h(]uhj5h]r@h4XSteprArB}rC(hUhj;ubahhhubaubh4X is created with an additional rDrE}rF(hX is created with an additional hj.ubh])rG}rH(hX ``workdir``h!}rI(h#]h$]h%]h&]h(]uhj.h]rJh4XworkdirrKrL}rM(hUhjGubahhhubh4X argument that indicates where its actions should take place. This is specified as a subdirectory of the slave builder's base directory, with a default value of rNrO}rP(hX argument that indicates where its actions should take place. This is specified as a subdirectory of the slave builder's base directory, with a default value of hj.ubh])rQ}rR(hUh!}rS(h&]h%]h#]h$]rTXfilerUaUrolejUh(]uhj.h]rVh4XbuildrWrX}rY(hXbuildhjQubahhhubh4X. This is only implemented as a step argument (as opposed to simply being a part of the base directory) because the CVS/SVN steps need to perform their checkouts from the parent directory.rZr[}r\(hX. This is only implemented as a step argument (as opposed to simply being a part of the base directory) because the CVS/SVN steps need to perform their checkouts from the parent directory.hj.ubeubeubeubahUU transformerr]NU footnote_refsr^}r_Urefnamesr`}raUsymbol_footnotesrb]rcUautofootnote_refsrd]reUsymbol_footnote_refsrf]rgU citationsrh]rih+hU current_linerjNUtransform_messagesrk]rlUreporterrmNUid_startrnKU autofootnotesro]rpU citation_refsrq}rrUindirect_targetsrs]rtUsettingsru(cdocutils.frontend Values rvorw}rx(Ufootnote_backlinksryKUrecord_dependenciesrzNU rfc_base_urlr{Uhttp://tools.ietf.org/html/r|U tracebackr}Upep_referencesr~NUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh1NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformrKUwarning_streamrNUpep_file_url_templaterUpep-%04drUexit_status_levelrKUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingrUUTF-8rU_sourcerU[/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/cls-buildfactory.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]rUfile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hh8hhuUsubstitution_namesr}rhh+h!}r(h#]h&]h%]Usourcehh$]h(]uU footnotesr]rUrefidsr}rub.PK4D|ј::3buildbot-v0.8.9/.doctrees/developer/results.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xbuild-result-codesqXbuild result codesqNXbuildbot.status.results.SUCCESSqXbuildbot.status.results.Resultsq X$buildbot.status.results.worst_statusq Xbuildbot.status.results.FAILUREq Xbuildbot.status.results.RETRYq X!buildbot.status.results.EXCEPTIONq X buildbot.status.results.WARNINGSqXbuildbot.status.results.SKIPPEDquUsubstitution_defsq}qUparse_messagesq]qUcurrent_sourceqNU decorationqNUautofootnote_startqKUnameidsq}q(hUbuild-result-codesqhUid1qhhh h h h h h h h h h hhhhuUchildrenq]q(cdocutils.nodes target q)q}q(U rawsourceq X.. _Build-Result-Codes:Uparentq!hUsourceq"cdocutils.nodes reprunicode q#XR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/results.rstq$q%}q&bUtagnameq'Utargetq(U attributesq)}q*(Uidsq+]Ubackrefsq,]Udupnamesq-]Uclassesq.]Unamesq/]Urefidq0huUlineq1KUdocumentq2hh]ubcdocutils.nodes section q3)q4}q5(h Uh!hh"h%Uexpect_referenced_by_nameq6}q7hhsh'Usectionq8h)}q9(h-]h.]h,]h+]q:(Xmodule-buildbot.status.resultsq;hheh/]q<(hheuh1Kh2hUexpect_referenced_by_idq=}q>hhsh]q?(cdocutils.nodes title q@)qA}qB(h XBuild Result CodesqCh!h4h"h%h'UtitleqDh)}qE(h-]h.]h,]h+]h/]uh1Kh2hh]qFcdocutils.nodes Text qGXBuild Result CodesqHqI}qJ(h hCh!hAubaubcsphinx.addnodes index qK)qL}qM(h Uh!h4h"h%h'UindexqNh)}qO(h+]h,]h-]h.]h/]Uentries]qP(UsingleqQX buildbot.status.results (module)Xmodule-buildbot.status.resultsUtqRauh1Kh2hh]ubcdocutils.nodes paragraph qS)qT}qU(h XBuildbot represents the status of a step, build, or buildset using a set of numeric constants. From Python, these constants are available in the module ``buildbot.status.results``, but the values also appear in the database and in external tools, so the values are fixed.h!h4h"h%h'U paragraphqVh)}qW(h-]h.]h,]h+]h/]uh1Kh2hh]qX(hGXBuildbot represents the status of a step, build, or buildset using a set of numeric constants. From Python, these constants are available in the module qYqZ}q[(h XBuildbot represents the status of a step, build, or buildset using a set of numeric constants. From Python, these constants are available in the module h!hTubcdocutils.nodes literal q\)q]}q^(h X``buildbot.status.results``h)}q_(h-]h.]h,]h+]h/]uh!hTh]q`hGXbuildbot.status.resultsqaqb}qc(h Uh!h]ubah'UliteralqdubhGX\, but the values also appear in the database and in external tools, so the values are fixed.qeqf}qg(h X\, but the values also appear in the database and in external tools, so the values are fixed.h!hTubeubhK)qh}qi(h Uh!h4h"h%h'hNh)}qj(h+]h,]h-]h.]h/]Uentries]qk(hQX+SUCCESS (in module buildbot.status.results)hUtqlauh1Nh2hh]ubcsphinx.addnodes desc qm)qn}qo(h Uh!h4h"h%h'Udescqph)}qq(UnoindexqrUdomainqsXpyh+]h,]h-]h.]h/]UobjtypeqtXdataquUdesctypeqvhuuh1Nh2hh]qw(csphinx.addnodes desc_signature qx)qy}qz(h XSUCCESSq{h!hnh"h%h'Udesc_signatureq|h)}q}(h+]q~haUmoduleqXbuildbot.status.resultsqh,]h-]h.]h/]qhaUfullnameqh{UclassqUUfirstquh1Kh2hh]q(csphinx.addnodes desc_addname q)q}q(h Xbuildbot.status.results.h!hyh"h%h'U desc_addnameqh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXbuildbot.status.results.qq}q(h Uh!hubaubcsphinx.addnodes desc_name q)q}q(h h{h!hyh"h%h'U desc_nameqh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXSUCCESSqq}q(h Uh!hubaubeubcsphinx.addnodes desc_content q)q}q(h Uh!hnh"h%h'U desc_contentqh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhS)q}q(h X)Value: 0; color: green; a successful run.qh!hh"h%h'hVh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGX)Value: 0; color: green; a successful run.qq}q(h hh!hubaubaubeubhK)q}q(h Uh!h4h"h%h'hNh)}q(h+]h,]h-]h.]h/]Uentries]q(hQX,WARNINGS (in module buildbot.status.results)hUtqauh1Nh2hh]ubhm)q}q(h Uh!h4h"h%h'hph)}q(hrhsXpyh+]h,]h-]h.]h/]htXdataqhvhuh1Nh2hh]q(hx)q}q(h XWARNINGSqh!hh"h%h'h|h)}q(h+]qhahhh,]h-]h.]h/]qhahhhUhuh1Kh2hh]q(h)q}q(h Xbuildbot.status.results.h!hh"h%h'hh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXbuildbot.status.results.qq}q(h Uh!hubaubh)q}q(h hh!hh"h%h'hh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXWARNINGSq…q}q(h Uh!hubaubeubh)q}q(h Uh!hh"h%h'hh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhS)q}q(h X>Value: 1; color: orange; a successful run, with some warnings.qh!hh"h%h'hVh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGX>Value: 1; color: orange; a successful run, with some warnings.q΅q}q(h hh!hubaubaubeubhK)q}q(h Uh!h4h"h%h'hNh)}q(h+]h,]h-]h.]h/]Uentries]q(hQX+FAILURE (in module buildbot.status.results)h Utqauh1Nh2hh]ubhm)q}q(h Uh!h4h"h%h'hph)}q(hrhsXpyh+]h,]h-]h.]h/]htXdataqhvhuh1Nh2hh]q(hx)q}q(h XFAILUREqh!hh"h%h'h|h)}q(h+]qh ahhh,]h-]h.]h/]qh ahhhUhuh1Kh2hh]q(h)q}q(h Xbuildbot.status.results.h!hh"h%h'hh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXbuildbot.status.results.q慁q}q(h Uh!hubaubh)q}q(h hh!hh"h%h'hh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXFAILUREq텁q}q(h Uh!hubaubeubh)q}q(h Uh!hh"h%h'hh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhS)q}q(h XzValue: 2; color: red; a failed run, due to problems in the build itself, as opposed to a Buildbot misconfiguration or bug.qh!hh"h%h'hVh)}q(h-]h.]h,]h+]h/]uh1Kh2hh]qhGXzValue: 2; color: red; a failed run, due to problems in the build itself, as opposed to a Buildbot misconfiguration or bug.qq}q(h hh!hubaubaubeubhK)q}q(h Uh!h4h"h%h'hNh)}q(h+]h,]h-]h.]h/]Uentries]q(hQX+SKIPPED (in module buildbot.status.results)hUtrauh1Nh2hh]ubhm)r}r(h Uh!h4h"h%h'hph)}r(hrhsXpyh+]h,]h-]h.]h/]htXdatarhvjuh1Nh2hh]r(hx)r}r(h XSKIPPEDrh!jh"h%h'h|h)}r (h+]r hahhh,]h-]h.]h/]r hahjhUhuh1Kh2hh]r (h)r }r(h Xbuildbot.status.results.h!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1Kh2hh]rhGXbuildbot.status.results.rr}r(h Uh!j ubaubh)r}r(h jh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1Kh2hh]rhGXSKIPPEDrr}r(h Uh!jubaubeubh)r}r(h Uh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1Kh2hh]rhS)r}r (h XValue: 3; color: white; a run that was skipped -- usually a step skipped by ``doStepIf`` (see :ref:`Buildstep-Common-Parameters`)h!jh"h%h'hVh)}r!(h-]h.]h,]h+]h/]uh1Kh2hh]r"(hGXLValue: 3; color: white; a run that was skipped -- usually a step skipped by r#r$}r%(h XLValue: 3; color: white; a run that was skipped -- usually a step skipped by h!jubh\)r&}r'(h X ``doStepIf``h)}r((h-]h.]h,]h+]h/]uh!jh]r)hGXdoStepIfr*r+}r,(h Uh!j&ubah'hdubhGX (see r-r.}r/(h X (see h!jubcsphinx.addnodes pending_xref r0)r1}r2(h X":ref:`Buildstep-Common-Parameters`r3h!jh"h%h'U pending_xrefr4h)}r5(UreftypeXrefUrefwarnr6U reftargetr7Xbuildstep-common-parametersU refdomainXstdr8h+]h,]U refexplicith-]h.]h/]Urefdocr9Xdeveloper/resultsr:uh1Kh]r;cdocutils.nodes emphasis r<)r=}r>(h j3h)}r?(h-]h.]r@(UxrefrAj8Xstd-refrBeh,]h+]h/]uh!j1h]rChGXBuildstep-Common-ParametersrDrE}rF(h Uh!j=ubah'UemphasisrGubaubhGX)rH}rI(h X)h!jubeubaubeubhK)rJ}rK(h Uh!h4h"h%h'hNh)}rL(h+]h,]h-]h.]h/]Uentries]rM(hQX-EXCEPTION (in module buildbot.status.results)h UtrNauh1Nh2hh]ubhm)rO}rP(h Uh!h4h"h%h'hph)}rQ(hrhsXpyh+]h,]h-]h.]h/]htXdatarRhvjRuh1Nh2hh]rS(hx)rT}rU(h X EXCEPTIONrVh!jOh"h%h'h|h)}rW(h+]rXh ahhh,]h-]h.]h/]rYh ahjVhUhuh1K#h2hh]rZ(h)r[}r\(h Xbuildbot.status.results.h!jTh"h%h'hh)}r](h-]h.]h,]h+]h/]uh1K#h2hh]r^hGXbuildbot.status.results.r_r`}ra(h Uh!j[ubaubh)rb}rc(h jVh!jTh"h%h'hh)}rd(h-]h.]h,]h+]h/]uh1K#h2hh]rehGX EXCEPTIONrfrg}rh(h Uh!jbubaubeubh)ri}rj(h Uh!jOh"h%h'hh)}rk(h-]h.]h,]h+]h/]uh1K#h2hh]rlhS)rm}rn(h XOValue: 4; color: purple; a run that failed due to a problem in Buildbot itself.roh!jih"h%h'hVh)}rp(h-]h.]h,]h+]h/]uh1K!h2hh]rqhGXOValue: 4; color: purple; a run that failed due to a problem in Buildbot itself.rrrs}rt(h joh!jmubaubaubeubhK)ru}rv(h Uh!h4h"h%h'hNh)}rw(h+]h,]h-]h.]h/]Uentries]rx(hQX)RETRY (in module buildbot.status.results)h Utryauh1Nh2hh]ubhm)rz}r{(h Uh!h4h"h%h'hph)}r|(hrhsXpyh+]h,]h-]h.]h/]htXdatar}hvj}uh1Nh2hh]r~(hx)r}r(h XRETRYrh!jzh"h%h'h|h)}r(h+]rh ahhh,]h-]h.]h/]rh ahjhUhuh1K(h2hh]r(h)r}r(h Xbuildbot.status.results.h!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K(h2hh]rhGXbuildbot.status.results.rr}r(h Uh!jubaubh)r}r(h jh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K(h2hh]rhGXRETRYrr}r(h Uh!jubaubeubh)r}r(h Uh!jzh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K(h2hh]rhS)r}r(h X\Value: 4; color: purple; a run that should be retried, usually due to a slave disconnection.rh!jh"h%h'hVh)}r(h-]h.]h,]h+]h/]uh1K&h2hh]rhGX\Value: 4; color: purple; a run that should be retried, usually due to a slave disconnection.rr}r(h jh!jubaubaubeubhK)r}r(h Uh!h4h"h%h'hNh)}r(h+]h,]h-]h.]h/]Uentries]r(hQX+Results (in module buildbot.status.results)h Utrauh1Nh2hh]ubhm)r}r(h Uh!h4h"h%h'hph)}r(hrhsXpyh+]h,]h-]h.]h/]htXdatarhvjuh1Nh2hh]r(hx)r}r(h XResultsrh!jh"h%h'h|h)}r(h+]rh ahhh,]h-]h.]h/]rh ahjhUhuh1K,h2hh]r(h)r}r(h Xbuildbot.status.results.h!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K,h2hh]rhGXbuildbot.status.results.rr}r(h Uh!jubaubh)r}r(h jh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K,h2hh]rhGXResultsrr}r(h Uh!jubaubeubh)r}r(h Uh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K,h2hh]rhS)r}r(h X;A dictionary mapping result codes to their lowercase names.rh!jh"h%h'hVh)}r(h-]h.]h,]h+]h/]uh1K+h2hh]rhGX;A dictionary mapping result codes to their lowercase names.rr}r(h jh!jubaubaubeubhK)r}r(h Uh!h4h"h%h'hNh)}r(h+]h,]h-]h.]h/]Uentries]r(hQX2worst_status() (in module buildbot.status.results)h Utrauh1Nh2hh]ubhm)r}r(h Uh!h4h"h%h'hph)}r(hrhsXpyh+]h,]h-]h.]h/]htXfunctionrhvjuh1Nh2hh]r(hx)r}r(h Xworst_status(a, b)h!jh"h%h'h|h)}r(h+]rh ahhh,]h-]h.]h/]rh ahX worst_statusrhUhuh1K1h2hh]r(h)r}r(h Xbuildbot.status.results.h!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K1h2hh]rhGXbuildbot.status.results.rr}r(h Uh!jubaubh)r}r(h jh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K1h2hh]rhGX worst_statusrr}r(h Uh!jubaubcsphinx.addnodes desc_parameterlist r)r}r(h Uh!jh"h%h'Udesc_parameterlistrh)}r(h-]h.]h,]h+]h/]uh1K1h2hh]r(csphinx.addnodes desc_parameter r)r}r(h Xah)}r(h-]h.]h,]h+]h/]uh!jh]rhGXar}r(h Uh!jubah'Udesc_parameterrubj)r}r(h Xbh)}r(h-]h.]h,]h+]h/]uh!jh]rhGXbr}r(h Uh!jubah'jubeubeubh)r}r(h Uh!jh"h%h'hh)}r(h-]h.]h,]h+]h/]uh1K1h2hh]rhS)r}r(h XThis function takes two status values, and returns the "worst" status of the two. This is used (with exceptions) to aggregate step statuses into build statuses, and build statuses into buildset statuses.rh!jh"h%h'hVh)}r(h-]h.]h,]h+]h/]uh1K/h2hh]rhGXThis function takes two status values, and returns the "worst" status of the two. This is used (with exceptions) to aggregate step statuses into build statuses, and build statuses into buildset statuses.rr}r (h jh!jubaubaubeubeubeh UU transformerr NU footnote_refsr }r Urefnamesr }rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh2hU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(h Uh)}r(h-]UlevelKh+]h,]Usourceh%h.]h/]UlineKUtypeUINFOruh]rhS)r }r!(h Uh)}r"(h-]h.]h,]h+]h/]uh!jh]r#hGX8Hyperlink target "build-result-codes" is not referenced.r$r%}r&(h Uh!j ubah'hVubah'Usystem_messager'ubaUreporterr(NUid_startr)KU autofootnotesr*]r+U citation_refsr,}r-Uindirect_targetsr.]r/Usettingsr0(cdocutils.frontend Values r1or2}r3(Ufootnote_backlinksr4KUrecord_dependenciesr5NU rfc_base_urlr6Uhttp://tools.ietf.org/html/r7U tracebackr8Upep_referencesr9NUstrip_commentsr:NU toc_backlinksr;Uentryr<U language_coder=Uenr>U datestampr?NU report_levelr@KU _destinationrANU halt_levelrBKU strip_classesrCNhDNUerror_encoding_error_handlerrDUbackslashreplacerEUdebugrFNUembed_stylesheetrGUoutput_encoding_error_handlerrHUstrictrIU sectnum_xformrJKUdump_transformsrKNU docinfo_xformrLKUwarning_streamrMNUpep_file_url_templaterNUpep-%04drOUexit_status_levelrPKUconfigrQNUstrict_visitorrRNUcloak_email_addressesrSUtrim_footnote_reference_spacerTUenvrUNUdump_pseudo_xmlrVNUexpose_internalsrWNUsectsubtitle_xformrXU source_linkrYNUrfc_referencesrZNUoutput_encodingr[Uutf-8r\U source_urlr]NUinput_encodingr^U utf-8-sigr_U_disable_configr`NU id_prefixraUU tab_widthrbKUerror_encodingrcUUTF-8rdU_sourcereUR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/results.rstrfUgettext_compactrgU generatorrhNUdump_internalsriNU smart_quotesrjU pep_base_urlrkUhttp://www.python.org/dev/peps/rlUsyntax_highlightrmUlongrnUinput_encoding_error_handlerrojIUauto_id_prefixrpUidrqUdoctitle_xformrrUstrip_elements_with_classesrsNU _config_filesrt]ruUfile_insertion_enabledrvU raw_enabledrwKU dump_settingsrxNubUsymbol_footnote_startryKUidsrz}r{(hh4hhyh jh jh hhh4h;h)r|}r}(h Uh!h4h"h%h'h(h)}r~(h-]h+]rh;ah,]Uismodh.]h/]uh1Kh2hh]ubh jh jThhhjuUsubstitution_namesr}rh'h2h)}r(h-]h+]h,]Usourceh%h.]h/]uU footnotesr]rUrefidsr}rh]rhasub.PK4D*o003buildbot-v0.8.9/.doctrees/developer/formats.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xbuildbot.status.logfile.LogFileqXlog file formatqNX file formatsqNuUsubstitution_defsq }q Uparse_messagesq ]q Ucurrent_sourceq NU decorationqNUautofootnote_startqKUnameidsq}q(hhhUlog-file-formatqhU file-formatsquUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/formats.rstqq}qbUtagnameq Usectionq!U attributesq"}q#(Udupnamesq$]Uclassesq%]Ubackrefsq&]Uidsq']q(haUnamesq)]q*hauUlineq+KUdocumentq,hh]q-(cdocutils.nodes title q.)q/}q0(hX File Formatsq1hhhhh Utitleq2h"}q3(h$]h%]h&]h']h)]uh+Kh,hh]q4cdocutils.nodes Text q5X File Formatsq6q7}q8(hh1hh/ubaubh)q9}q:(hUhhhhh h!h"}q;(h$]h%]h&]h']q(h.)q?}q@(hXLog File FormatqAhh9hhh h2h"}qB(h$]h%]h&]h']h)]uh+Kh,hh]qCh5XLog File FormatqDqE}qF(hhAhh?ubaubcsphinx.addnodes index qG)qH}qI(hUhh9hNh UindexqJh"}qK(h']h&]h$]h%]h)]Uentries]qL(UsingleqMX0buildbot.status.logfile.LogFile (built-in class)hUtqNauh+Nh,hh]ubcsphinx.addnodes desc qO)qP}qQ(hUhh9hNh UdescqRh"}qS(UnoindexqTUdomainqUXpyh']h&]h$]h%]h)]UobjtypeqVXclassqWUdesctypeqXhWuh+Nh,hh]qY(csphinx.addnodes desc_signature qZ)q[}q\(hXbuildbot.status.logfile.LogFileq]hhPhhh Udesc_signatureq^h"}q_(h']q`haUmoduleqaNh&]h$]h%]h)]qbhaUfullnameqchUclassqdXbuildbot.status.logfileUfirstqeuh+Kh,hh]qf(csphinx.addnodes desc_annotation qg)qh}qi(hXclass hh[hhh Udesc_annotationqjh"}qk(h$]h%]h&]h']h)]uh+Kh,hh]qlh5Xclass qmqn}qo(hUhhhubaubcsphinx.addnodes desc_addname qp)qq}qr(hXbuildbot.status.logfile.hh[hhh U desc_addnameqsh"}qt(h$]h%]h&]h']h)]uh+Kh,hh]quh5Xbuildbot.status.logfile.qvqw}qx(hUhhqubaubcsphinx.addnodes desc_name qy)qz}q{(hXLogFilehh[hhh U desc_nameq|h"}q}(h$]h%]h&]h']h)]uh+Kh,hh]q~h5XLogFileqq}q(hUhhzubaubeubcsphinx.addnodes desc_content q)q}q(hUhhPhhh U desc_contentqh"}q(h$]h%]h&]h']h)]uh+Kh,hh]ubeubcdocutils.nodes paragraph q)q}q(hXiThe master currently stores each logfile in a single file, which may have a standard compression applied.qhh9hhh U paragraphqh"}q(h$]h%]h&]h']h)]uh+K h,hh]qh5XiThe master currently stores each logfile in a single file, which may have a standard compression applied.qq}q(hhhhubaubh)q}q(hXThe format is a special case of the netstrings protocol - see http://cr.yp.to/proto/netstrings.txt. The text in each netstring consists of a one-digit channel identifier followed by the data from that channel.hh9hhh hh"}q(h$]h%]h&]h']h)]uh+K h,hh]q(h5X>The format is a special case of the netstrings protocol - see qq}q(hX>The format is a special case of the netstrings protocol - see hhubcdocutils.nodes reference q)q}q(hX$http://cr.yp.to/proto/netstrings.txtqh"}q(Urefurihh']h&]h$]h%]h)]uhhh]qh5X$http://cr.yp.to/proto/netstrings.txtqq}q(hUhhubah U referencequbh5Xp. The text in each netstring consists of a one-digit channel identifier followed by the data from that channel.qq}q(hXp. The text in each netstring consists of a one-digit channel identifier followed by the data from that channel.hhubeubh)q}q(hXThe formatting is implemented in the LogFile class in :file:`buildbot/status/logfile.py`, and in particular by the :meth:`merge` method.hh9hhh hh"}q(h$]h%]h&]h']h)]uh+Kh,hh]q(h5X6The formatting is implemented in the LogFile class in qq}q(hX6The formatting is implemented in the LogFile class in hhubcdocutils.nodes literal q)q}q(hUh"}q(h']h&]h$]h%]qXfileqaUrolehh)]uhhh]qh5Xbuildbot/status/logfile.pyqq}q(hXbuildbot/status/logfile.pyhhubah Uliteralqubh5X, and in particular by the qq}q(hX, and in particular by the hhubcsphinx.addnodes pending_xref q)q}q(hX :meth:`merge`qhhhhh U pending_xrefqh"}q(UreftypeXmethUrefwarnqU reftargetqXmergeU refdomainXpyqh']h&]U refexplicith$]h%]h)]UrefdocqXdeveloper/formatsqUpy:classqNU py:moduleqNuh+Kh]qh)q}q(hhh"}q(h$]h%]q(UxrefqhXpy-methqeh&]h']h)]uhhh]qh5Xmergeqυq}q(hUhhubah hubaubh5X method.q҅q}q(hX method.hhubeubeubeubahUU transformerqNU footnote_refsq}qUrefnamesq}qUsymbol_footnotesq]qUautofootnote_refsq]qUsymbol_footnote_refsq]qU citationsq]qh,hU current_lineqNUtransform_messagesq]qUreporterqNUid_startqKU autofootnotesq]qU citation_refsq}qUindirect_targetsq]qUsettingsq(cdocutils.frontend Values qoq}q(Ufootnote_backlinksqKUrecord_dependenciesqNU rfc_base_urlqUhttp://tools.ietf.org/html/qU tracebackqUpep_referencesqNUstrip_commentsqNU toc_backlinksqUentryqU language_codeqUenqU datestampqNU report_levelqKU _destinationqNU halt_levelqKU strip_classesrNh2NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictrU sectnum_xformrKUdump_transformsrNU docinfo_xformr KUwarning_streamr NUpep_file_url_templater Upep-%04dr Uexit_status_levelr KUconfigrNUstrict_visitorrNUcloak_email_addressesrUtrim_footnote_reference_spacerUenvrNUdump_pseudo_xmlrNUexpose_internalsrNUsectsubtitle_xformrU source_linkrNUrfc_referencesrNUoutput_encodingrUutf-8rU source_urlrNUinput_encodingrU utf-8-sigrU_disable_configrNU id_prefixrUU tab_widthrKUerror_encodingr UUTF-8r!U_sourcer"UR/var/build/user_builds/buildbot/checkouts/v0.8.9/master/docs/developer/formats.rstr#Ugettext_compactr$U generatorr%NUdump_internalsr&NU smart_quotesr'U pep_base_urlr(Uhttp://www.python.org/dev/peps/r)Usyntax_highlightr*Ulongr+Uinput_encoding_error_handlerr,jUauto_id_prefixr-Uidr.Udoctitle_xformr/Ustrip_elements_with_classesr0NU _config_filesr1]Ufile_insertion_enabledr2U raw_enabledr3KU dump_settingsr4NubUsymbol_footnote_startr5KUidsr6}r7(hhhh[hh9uUsubstitution_namesr8}r9h h,h"}r:(h$]h']h&]Usourcehh%]h)]uU footnotesr;]r<Urefidsr=}r>ub.PKD]Y22!buildbot-v0.8.9/_images/index.pngPNG  IHDR82gAMA asRGB cHRMz&u0`:pQ< pHYs   vpAg8v2IDATx^wtcuY~~ߚ֬Y3%r-yJƒZRխV[+W*s9LY̙ HD" @$r}Ͻ${>sϹ؝ ]s/.G`6父#Kdn.s']}Cc3srda˷Y7;:ӶZo4ls"73'Y\?ql, Y'eՃcE5{WTf+{v0T݄Q1U.,%= -%Ҫƶ̼#\ɚ׵cQ(FXS(ۺF'+w#/3lξ*DaMJOʻmRڛzb`/-2`>2jWpNaT,8s&yم!o(-?<(scuMO0wb=;6a&?[:0К_W\1<>ވOIZ`aNЇ&*F$VWRX3_%nV7)q%Thf#:Scb|+ ;ĥs(QHb 095l IPh.tIApҡ *ˇʆp03 ƙ63ChFk W:9!2MU؇ЧhX13>;X8yQsf¸ptgFhㅝiɇ>JDžCwŬcKq ;f-enJ"5{C_(F 4p0ֳ?w8;=s9pu$ 0w>1= gC̝Dyq/>)q_\&h̖ b(Ώd6rR1#;G8c|C[=N[x*QG``V~V^Ņ1!9ZE䤿\ uD9\.^f!p2a=sҠc_Ux*TgT͜9C8Zŀ(q0~=f4+3\dC &6GBșNgF@ ;zyyDocv '#*-gxn'>Nwޑ|V1[r_tK/n/:_3y^|T.M.p6i2=2+%K扣=}ٽoNZ~tr*ÊJA'aᩛ>n{P6; z5:iT5A6\7{]`ٱ<-eWR]}J$vTKX[#Q((D./ Ӓ4;oy֋|a1?wuO/H&A%\bvfJĶveѰlP2c hP<߿t%idD_6ff;7by*tTO hh#>\; n$>Y-@uL03B0Cո3.- d>d>:6/ldw&0i6 A/U0rIVaqv4 >=KB_g?N?7ؙў>x}fbg}}ь9^\]>S\z:.<_ŵ_Ss&8ǟe]h&5,M-K 8i+Y0U5s4sȄG[8h0Y=I7Gk`oC&*(wA]^Y^W?911obR^,[/P2[7#1cfatiTgˊ i~]v.M.YLlm_[X{U m2'yS:ANBtJf97lH|^/h #+V.Eϴ*S .uLC%F֥7gjVS:Tm&f!Wu,AuNIӧ2{4cFGZђ)\ŀ|RK~գʼnһ+hdl̄O9 AaBV6C˯dt c?X[7r+FukvhFdӳQ@j!O0&@ZF?i=T153:fw>Eϗ+OD'ZIWqVv靌Rl*.?,o|qW%fNՔnyJT|*J=o!iIrؒPaR?aS9r@jHiP/^_sj5R&XVž 44.S51g8wjw%ccEs~mnXA\-8ť@do/)߹7Zؿޮ(=@zCu;c z4rDe<PSOގ_k}.S2[y߭w?W">C{h޽[]jAfAiLݴXo+>PIf*A @55|S* ֱ]#|X;yŨ&֪R_TS$5[ꭇ5܁FEhUIX[4۲ZEvQ #S鵷9-+'Fq+{uucNWn᪰}~PL#WO# Uеnִl}ǴgEe~Yq5P?sheˆDn2zuouerMʙG5JQl"U*|7,K"nC$.Ƶ!߶"UN!H,*kIϥ>U2^?sf?oNVprito~TiaS@a{c}+ubzQRc:(g] (~텇<) @7lD:@FYZzBrd_}IʌE$=(#Ev|UvqV2Zu3|^(%̧cJ2N=Ã4z!O8_)ݫ^j֍G紐eKHuOa #$v=i9oM٘L7mec^D|z:ۇb-C/q_yzv1?E~'4wx_A.SJ$0no?w"=c]J|8 V.zT,;;d? ,m@Ag Fצ5#׉0q DFR\| اڤ}'ZwRrb5gG6-g,ݯY& LKPF6(TݯGdIsq+a5 ` ܩ GkeJ ݮƴ,20"EVͣ1AĘhAĶ,D13NS*(I0̇isj Ol_Tq^T7)@З#'v%FY0s9`&È.0'%oĵ.'=]__%_)W9 V%9U#JF0 pN/34Qrr6 T,0֭eDZsK$m5[d=AӦ7<1G[%@oڹN xLhNfa 32ElLfztdz:12X'~v>hsab8\,=sK ]cDf <ɓP%s-_|y~f ?3} Ύml,2YlZ&g3zt6(@4@H@(@n%_QUs.]/_/ponPB'b߿7' _7_x4gT?{ ;h4tR|v(rfm+g3>EG2,c/B;[*9RTܺ~+y8j$}39\kkKHzbѬ#R2 j0uu9vS9z9zpBCًُ    g~˽ZYYݾӳE-H/]^H΍tyҵskz'0v|Ե Az(-wѽ{QXPڽI']O:ftZ.+hI.޵{4z'O´:jՏ|k#z:nv޽սw{FQPf'D?ݽg=7zn@9{xfэ[G!}G7G7o?|sѭ(Ƿo8zk OqΠ5lzwӻçNoz KP[ÇwFmF PFmlaQQ{؈=lƲF"Xpqqqg8`|lǣ 'l3bh!vE;L3rlg+b I)I)IZ8ǰ:P}4匚t>rFr.<8#'QP*( s]dI#є!q<ڣ8h4-Sr4{LqEM;yHm}:\*-<|8GIxSDy$3L >",HG@Rn4Cn{v\_ơH y>mw;xbы>t.o2>m`Drӡ`t1/5"yӡ(GS1<17ͣb!RSq|*D'( %8PЅT"*I=nHBWTJ2K%xTE RTLg, *IB%RPTzTnpv9&qJAIL3!G9*ybL!sTREZI Tq\.T+x&n]ݝs;{Y",xزeTʕSq SI\G"1b؏^,LvHҴ=~>Hx0g&Mp(m֟8MI'OfBO:Lݙs!fL\<$N9o"C&](P9ti*Ύ =U8ux-~ =B ;7y I8cѓV"8)㉓(I41L'3Y ѣG@Q8aCD=?tph?|8|(F?t6|9'T9~4?rrwݡ{Cp" :?p6pt-9!-9;||o^$ n»ä b[ç#'00xGV`&נy`필"löÎkus^(΂{fYq0 z0N\ql7`hp`9};IO$ۃPC(ڣ)I"=$|4h~,r5 pA1t v@Xt `?,{FZ,cDxa0^ &Ѣ`L0N[AcgPL A!.n&D ;‡3:$aLfC Aq0^[( B Pl(IЊ$ORdI(IJf\&9~A}.2:H\((6JRM`, A}-FW{h0_~ړEr*s.}A>,{Az{ά/5z/a'bTZ.oJR0F8e.?*8q4wʜ2ːe-ڤK  SSƕ‘Di3.3g1m%mʨo!zq ˜ iZ=nف!k)2G?>8 =oei=w 쾞hh/b-ISH' nڝѓ{ap19 k!pC苎dt(d[ mUۢqo vD@>ℎ>10"z4t=$$rG7 <"1 "؄Gg`CI wp7VS>xXP,P&?9s|Q^xUc.@(^#n0T:A#;(gD,`.^JX!a00C`E HXzLxDa ldhqk@@A{ sqnWp!B."` H (IIp h7 4aD*q[1 =P:|%kK0{Q;=&㋥˨EJ,kU+W o=X7~V?S5Oy\SJ򴩃edCrx}[S0c-效7o ,fho>J|Rn K'^fuqo[H[)ڎӥs?)J㞾ٝ8uNݧ,~ qk_yɺ'OޫOmFTK$ he?5 p #JhPQ~ EXw!ͻP'WEVT MnϜA6YL&[Wk'/HmYbLr~y#杈o|wv36gXCg4u_ʯ'Fw^xG=yN~gW Z'~kɝsT)~QDRfدRT¥4@7(׷%~]2›Ŷ/ek Of^Ì; ƒ/O^Q^X͜laЛ}pH侕o䵼.AӨI+ "'y+;MqO#;{~3z/"FB!+u15c/]? <'ɬcdv/q;T2/yx;I?oK_QXD?(2b 0 0"٨1d͈s1y0&a̲U$m %G%A2@!Rl$!vI`Cj(w$xID,'<&L@)hXG\oL#x<4&S 7.#8p BA $:ё1%x Pq1""`$"d T̓;c͒2$`D={.Z~G7Nvvl۞U_<2#I?:t@(r0. ]Jz<4!Ї[D#1ҜkHAJ1lxF 3w A`AP"GLE6(H.)lPR(~!3{*@<,/a/YS1|Pw35ks=[DvY<FtGqϯDtw Oyېƻ۞6ֲA%p>[wR^.Kn {UX;_{A{Zp(.n.D̴ XM?Շ܍o5l;w3T$ S OXgM0mLt,ֽѕr9XVCؤעyދ/հ;)EsGim[ӧ cPWs;.Rd+! 1nzCUN!XX ,]#RKdˉe/0w1Yr=F\HO'PP<)WԄ/H9p8"{ P\o4_ E@x/GPP.q j7$sL$SA %7Q ~nAL.MI & TIHJFSѭEHa0l˔饍)ȼ^jҮK ZZ1[m~kSeXwoSغnqyAp b3бU:C"ЇXG0n :  ! #BJLJttЅJD!``CӇAar)Q"D2OT(GB:`)lk0ڧBxhHgk٦^ OndR_;r+nbA Ϙ3.LHhGHGW -97³w~kwS+j?}/"PlO"h=,$t~/E$NڨJjcNWgs&OuooGx&?7u/zqKܯe>I"6~}ܧW?Wțһ/သJBes \Z'QofA>r1?Ci~ƣ SX[ϿqcɕfSӟL]+x?A,!w"s'b:^zv  WUD6n +s]˨rUiIŶ~秿LM8n}\&ზ~G.<֍1OtDַ4wNo?k|[9$# l.mٶ٤ !V09n#Ͱ\&"fHucP3|eQ5,^¹; &QD]"a&Lyc!xOTp!48('jt&Q^ Ň8.H (h":!i ĉE 7DHB$$EHxJ$")$&E$qt6J؍J[|5",:kAүp4 vvʸ(oiw j^kЩU fy٠l&ng˴q`1ۏ,c = OOOU !I@LDv] &4]CBE @ (r@< qD( s.4r=]&Jr({CTr()r-f%TJSmxXko^lXwQF(HUUMQTtyO"6 +d j]eXf`7ܫ<W:+a~Ƶ19MK)P O1P H$  l":Ķ6 DN:!v@f8'[l@(Rmr=@#l!)0 `łJ\7T,t'vrӞ8'~ mFRB &_ ߓ@&< arLdf@1ADA$&3$Kt7Yq 0dT!tFhB!R# :1 r!7^#b_k>?߯\UljVi׬WH+J~tCP 5h6mގcpQS׮پ媖dP(dH>"qHV`"~teD|"Ҙ8G94&-"qvT> )W8@ GXsF.`!e#d3Y@1Z!a[!<*X )4^W)(yT*Ut|e(MA }rUZ@ݬ~Q7nť>*`>&pP-j)Kn0ya55*%հFU/ey挷vR1E_d*a%qӪ?{QNHDtBwj(S, ΤۣPrr%V'0*~zՍr~X.4TJ0S.eԵҩJš']1A٥! FnՠaT3GoԐb%P᜷ W޼?GN{f<+T*y>+oϕa9oWRR_l [`#Y]}?2q[FeXp,Q5Tώ])3iBoUXQ KaDO{N_2+a`*UCB~oAUq'ALGc?5e$sCic#`h:b99 .rGM!\wB?uEIqQiX>P叅ģ&7Z!2M`@/ыq1&I$M vnSR)6%HD$ b ެDi J 4t IcCA&R/?W~>o^yQ|N홵{F^kmlm65zCLmdtZ۞zl`V#rhА|>\]]$!"(T@b1XA!VB)lCX<*UJ,S+B)sU8e*eJ׭,[z¡ȖTT:ժ*T#X \41&ʖ%դUT؝غ)eAgΈT7z5Qj {H{h.P(gtA:RF1´$1U_ŌG;D0=07;4tMp.dnrazܴ=Q&V-c x 0Jd%@.!WBB@DQ<)%U3{wCha|͇ Ų_{)O_D|wn7 wnE {&d-$ :Rulz˖iײcПMρa1Kf2A@q#9) xC4B8$c3RWf!6LЁ$:"`BF+@ &DVC*iaAQj2TJa %U"KUFЖP*T *SQ*|v|JyjfUB~!UI/?LF/h}[OA>:V͒s&\4r01{QmG"U-d:iM\!!B9 XHM}Tɏ_/}?*(W(jAc2ַ&𴋀P5m{G[#ҡ^;4LJI; "Yw,"С @֐w@@ S( 5QJ>!TKB!H9U UQkT-PH5Uj"qVRb_XTT X|AB)Il9 /}<£ßn*cPxϟ0\gc/gx?PèEWzhtߋ&L/'Uڂ*`a{3;X aÖxOxm~gp{m[A-8JRE` y.$ho l'P#mt9H /H..` 1BD^:7^H̊K^'E żfW 0& DD7NG̓|Ɉ$$"XK $|BT?o\Sph&=Y) 7!DnDAd'9` $8MpAad,zAN v,3 ,12 "% PEDd,Te$sZ"Gaen~?Ǜ_k׿x9I<'U+M`#*4o ]qKj,}zoCn\t˞C@ʩt)Nh?ha"2xIJ% *CȨ`QE!vi*Z U ?E\!:=4w*a$z)t*WPzd=T%T:(FWDuZB8__^m(!;-P"w֌=aш9oH*дDtyIih\ؙnt0͞uYκ:rov68݋e1y>lϯbKn?@.V5-|--/|~vz3_BБV4&vMjL"}BGVu$r0$Di#F1[4^9.ш6֓ /0.4z#J0`T[s.&QǛO|ވ:4k4S_ S$$>)!4| L_^~P)K%%LuT1PH ̒P& )Ci3Tq0M̞ "#84?+p-]L0el:C `[4&#I\Cً!0z'Q"y Y!`da)$$IɃX˖Xx_gՏX~}'wo<s}eY^j6+K ă;f^i8<69,#IhYWlm,%ӊ̴*R.eMc!Z  ,\*C-PB5c4}B*(4AT*@'THP30BcѬz!G wW#B5jCJJ) -UE7B#cZ5UGFI*lh+w H d4rvϱ j~Ih#!5BZ:9&~n4B_>˧Nw>[~B{1OAg/nѧ{wG3;(FLF]kp{8V"IAhfę-~J,k@91NbyG* vҁWx=8$!HO|gR+'`D (QJ;d#n8B"d ;QGuq!g)gx"2OPI`R?}$]##J:x$!` O,Rpf gDRKb8TKpB@O:Qu--UǠN&1lЀtA#3"CQXɒZ|եxYgЕ)re"g|0]D5Sry nT+_-Pz7D`gRXn 3xxx' Qr+3w77W_;mzNbѻ@.4`Zrt7zĻ!Ά Ә-3C ;,|ٹ g]>kBQ[*n щÔz',Weښ4m(^FJm ^/O>MxSİH*A$Te*gIx *.3$/Ki*99D5Hsg_c7 Q/!/!HD'( A!$8cՌEr>!21Q*jՄt8DɮרQ]sg֌+{ƙ?ŵGؕ4.))[7>Qy$ʝL9n1Ѐ-CMPjֆ~z%"etaR~|5Z18w5bKg)Vԕ-t`KN9 - wKGJ'T@_YSR;~}#!A\Abn\XzMzUi1+;ђ]obXxiO?}o/\='r7w,#bn]AOW0z\̄QPC x @1"AXjף8#އ%@ɷgDl|k. GG*#M@KX $3$5 IaJw:3NTHRT'sƝ1NEIn#8P@7SLˬ7Kɚix&1b:8JL E $\xRԗ=Ơ̆uJ\R޺/ $8EkhpaLu[ rӫ9]iM#r1YuqBϴ[mh⒖QVTje䃤'EK.l(nz_xREd$>LYt ~? ._h3eL3$T.3W,g#0^}V?gAB"5J/JJ(`|&nu/o.( "[ƌ-s=S2LҀ*E"ĮLȬNPg]O3n(lȌ'SHQ&2Ph-;,OͅH  fK};K|\/wΛ3˙,yȅ ^[ uȂdaAM,$-IG{B" " Pep T **YD/WcJP (PدT‹UVjT t5OӔidxJs#!T<8˭jll**o(f%kb FV$vnRC_鍿~=vϟ?ꗿїsOɟ??on?~» "lV[oiV{zjOfT.mCtE$R͙T]~k]XJ7V ܼp֠Xrw&FOw(! # Ah<5P4lRO7MD)D1IB4S-ʓQA/LT1g Tﵸ~=t6 Ew0T?џ JN[࠵H`(?"! sR9խUةfy(J MjX隮il,h(.,hjWO ᱩS厉w>77}=h|zͫ7VewǍcoߌ̪hz[/}cbkۧGu)tLߠx:ky\gHﳃоҳxRKxzf4xVU{Υ v&@l/m6Ȗ;ٙ!UGbO"~';t#K$ ё"+{֕-vgϺC,;k$UY U{31G^0<<`R8MH)w(e ދ*OE&)EDKKPlDV`HE<#R%BHrt(^Z UCh'$ՂM4iPƅ:xBOAdwzvVXZ[W)ܺzcN*./+2J)rX"(-n,y;",YQg}_p/~v?o]ʷww|7_?ɭ?ɍ?2W45V–ӆdrnfy6w{˳sj\kBXZY_uniV@`D?D 醅S/t ^C`L[(PАݢX!NhB,{5˄+WbMO3/Pi uBO?X6T.չPL&ZEWɼlU:,_pW.z E'9WɜCa_W7;ařMiM u 159CJU>(zCV^R\?(V=eMsĂٵI J+U= zQMʬ n_%猪BM#6#$DciŞLwX г0p"A"di]VQ|0_@l/&:ʼT@&J'v8sE rgݹw8EΖtB<.u"@rwbiBKF;񜭝],}Z9'gTKdr۳uZ^_В]BK|tyG/ Cɳl>"4}n#@l/EX9fgt^0 ZQP@3!G F4 $|`] H |"I}X Dq9 JW 4G)X㾂9E_[E2?#T(X/ZWZ$nTtAĝ`H3Y܍m@Xb/sH%gU,q:f8D): 8h"HER7~ԃ*w2IDU8+< y[(,xxU^$ 'Mŋp|%(% tJRe@)-pPOK%xRTSeˁ@j@*ߊ(_ҮDU;B%:0i&!B= z`PxQM^GI^P^hb|Tbq^,,O K{&ֆ`k'85^zd91Ov̛En}˞O,{fX,hkklzѿw_t?o_o_or?!W7*Z|5 -uRU &Ҳ.W$d޺c8X V%ڢ\,.T6Vhd+4ElQf"Ci5FMR!:#'@jr74K\'.` "R< KNf(~R kj^[md4B:ha|([-jHs{-KZ ]/og֧&lD(?2MRٗ*]Jz@ *cAltar˖fNLάabdn}?3}Ehdڟq!`1 FZH 4dY }fu>fCʓ MW.u9p~H]eR'esRL!xY:RLJi弧)# S/iS BtW,GP%r_hqC)Wi (@W!o|Slu*+%?)+Urr%P ` ! wHG~U-Ar~'LHXG&$(0Լj=RROPIkaP'*:ŒZ&[VW {p&.k9=#j@0[67U˪eZӬ%ӳF׾'W*ʚ߉ҷ\/Kڃ>w?~?|;|_}w_{TΙF'DUɂI7dkm`S$wr j _(KTDtg+pbX[DJob5Nh< $4f}JSst)' aArtv/#B'-)ь#`9pd.G)sޡV, CD^x~vEE3fl' gۧ)B& >=mG{?}t<ԥ*cgڟ'|g;?5{ig}UzzDgUz!LetpXh˘6*HM Z]uF:l"~I[^")v=Cj;!P]7q|? zld?{ǰm>:>?C:߿ctT7úʡ RFpPOäF=!0BQC`A$2 5I542FP:Sb(b^6Qcfjd)lߢB&j0&¡-Cq(>6'ǵ'=rs+o}jq{{hg LP]N\n6fKKK{EӖqsǸi17zqˠ7-Mp`PGk6U5~7>)_u#ҏcJ=.z~/og~ʃ"%O KTQL{aXO/m J[]]U+Uzަ~s}uCb1 uʬlX+&VXYWlhNΉe8|V8pHɎ!do~L8cjtB)Z9)O(1AD}J)OCj+O!F$:!]2֬hOaWO+PN' '!L2wDIChd O3a ȅ  ¡s-3PxyFg1& 󙠋\]&7<\Ygtڈȡϕ 1 " P.3* amxh?3)98?%#I {k]DG )0- 2+aSGa"ޑ (v e@`F=I ?cHl0`"R!0?J6fe f`|3@ ce τe$FTF*& A1C1A3984'P%W!2''R]n@j/mO֭^7-ᵼ9vQi\F5V &4޵[׭FiC9?]T[_VT޻ <*uX[Jo%JSvD\{\xaއ *#R+FTވ-~a #jV狖dFicM.W)d:eS_[ϋ%*b}6vuP ZTe[&޶po?hTʥcjM!P xRP@hiePc$r\h4Q|}6IBN)))xD^ݘ6jFilԆ=d@w E$ɩ0ev\&\@ ʦ%Dȅ*S^nsF7f#ؙ4 -/)όb`/쌟;y~"#OwED!((.qfBZ6):~N!RZ΅>J,xErfs$h٢υkˈ(#1*H1DgBij`>y~tbnMMa"  6i 4@3Z0:Bj?/$8$_!x.S\>Dq!w1YyD#UZ95nAI?~4|vfx|ztxglY5ZdQ9!Z,h5Fjsq /L+z޴c;9[![~dZ,=FuYcO:'+jr>)Sq%a $T]*}Aᝄ۱e*ed5F6=jTy%jTԢёQTb)РTe͒umD(:3;7;'eԌЛ Fx-xF\G>8/ rph{)`k^XiQJ)08Dkh(T pabD;Y@1|Apq/8.0Nm:(28> L2]^&bvKӊ ω1H##&/(F r!grfb0JLJ.l&ܤLl$󋌞 b55s>- &G'h##?636w>LA^8N4 },P蒑sK?OT1^(gmИn֦uїi9OeQ=1$FtsqLoIgWCSkMSWaXFPU;/vpjYO</X[wf{X8Ğͮn[F΀WT*k`^:`FY'mO:6574UB*k[kZG+kk`kh!hIV56wsd zzz{{GdžqgGX#]ӂIC&Ycq${tdA,?;@L!N JžWaqKvca۱v8J!Ӝ~WbMݞoe3u.=md[^_XUߊŽdr+6] Q;%f m!3q3 Y< I,<>& 4U"ր`?~&Ԇ{TP@t٦o\Vtu+M :~DˇW,'Vv78 ,̹.$}˖KmƊČ|pt\ ɤ ŜlFR kZJSj>3UhFQ2ʥg4k QƂA.OT/DirrV'{.:6mT?W;fXC(:m-zv0-q\au~iCy荟i\n,drOKUj}tl {],I[?sk)7 ]үo6<~}pre͈кbYF Օ)>~DO,MOMMޖ k]q{ɸĿqXZ^)Et^.e>r(2b䣸 GfH g]d \U՚u5^^WT*;}P4jP4ؓAvFc5oXLzMpQ⇌֎ ng;;ԓa:oxf4"XU|Sm{綨-jf3$2Dz̆[uPmkO7H Xc\ovjCw`kNon?cr]\fjۨ¦q<Qz=jB/&4)@~JL/!{>|#aZ^T-jb&\T:m'LaIK>lЌ_]ÛJvB%qǰknY'`s{oM•((2(t;2?_|-x) L cGʅ6 (ʋkcLƋ{C7xv9MfzCc ..'@]S9~ Q94onocIVVV F6~ X:VGV΁gFKsY9oA-Rn, {dxh|v]=^u6X9L-YF\mjfLY3R7lwuh&ݰO+׷mry^AQD~s/0.9s nOA3Si7O%@ 9J[?;nj5t6LKtT%i^qsDO]uqF2f }~0DYfMBo: >C6J ckvA\tCxPzD rxv vtT@ E+4c€mE5쫴4;CEtw8}!zbu}AjxtTisޠ 0:yy|v7fwOGԁ[%mh%H:;JEvp;\˃:N "ѣS<.+iu]v$8<^M]vm[{Gowfw[G'6݉Fvnm'&QCܬҶ_Um-mfb nCiw].XC~vno384_?E,f6 s<|fӭY?l2#!wm90[ͤ<0 y{w{@ie{вԃ}՚-K:щfs9nt:@JPF[x^6Áw\^;X텭[1#զ?p!vwfjt|J`sh;84o?ymO*r6H\6tm/=wlw <ntK,}хc+WW;.Q$E SRj9) 3&qjlj8뉸[Z=;O}Ւ Xb}3[!Њ#]'c<1z"_h MhH1i8jO\qqT{>91b)̲eSd>Ǧ<ȵe3~3L/t1fL l/ы>F;/~a(ca2s Bʼ{` Z MKJ+">;-<8S?+.78<>;o@pc?=:+s J?H$|q D >NilJzGFs S2e*Qh7[2ҲrT;J I Bh&RU((tA)P,ō7GŔ^ (UN@x|>ۃC)Pnf\tCIW>8<:ޱ`4`89x]>ɩPLNLO  *ҨZW.JպgoN7unCY `Ș˙[ӂ)8Oy/=k/k[?ffC'>|Ybs"X XN6͖=<0:VS.3 kz6}^s8xqW]S hZE!x74'&sskzX">?њLmpAe5<`ue nc U3{(QoIV7ڒNܢ z O.ݏд *Ym XS|$XUϝ#O bOL)U-HcpFbڇc+ån8 G, }VfU mSģʤBH,QA;IL Y%kyw^FszQSFiSD~oGeWRwb kjR/SǕUy2 vq‚kh,I0, =YĆٰbݼ*KJKK3b6 $6͔t{-F_uDv[%x';/:AW+ [;dL/["KULmPq;vIDAT'c-f56~PKlDDDɢ];8N:G}2=\;%u^lI,ԘD R,NJ쐼Q8=<-ocMC}\~T1O~ztRws*VYfVxu_&XdʺΆ蘜VJ˽#kt|2(0Mry0{|G1 v O g7KOk}ЦA݅eUpp[Ii]ãlx~{`ox _5jkZ*jC[mUjYA 12:.QpvAtx)QeKyEeh_R._]Gɕ-3=gBљ0rf3 BZD>N5 O/ @& =,,`!";6) p }n&`;V;HNԁ ;ͩat9>ӾqH2}v+嵺mýU;`߫}?w>7~tOnLxxZZUOp$vpxV_4#"03bɺ?8>>>yaX.)rx]V?ܯ{trV۩^ͺ4Gzr,{sBYc}@PХP)qU Gol +KΫҔj]SU]k5Ou &Œy{USwpx8nT,/y:-Psfd;0>HI|3 GRr#Rpҝ G3Q {lurijbxMWrl^i/!g$ܖ{O%f$V=u':%&\fM[>HTxcf=+j*K*l $_>G?̚,IgpF%|"TG'5 M[useD8ҎCUu_ie$Oҵ=D҅@,ERUא[Xj4g|BJڂ|,JgijV=#;'ZcqkGemU5B GY7_A(/#^"RENABɋ`A$U3"I %"O3EA BB|$ofr[mT@j؆*YL3h<ySTD0 nټm<̌D@T:_".pDB>8e`mISx >2!nWg X;سx֓ݭ.lskf" ^˾VAX@~Wo[!Tmk6Lc p+N\f gf' f`)״#Z$1v-d) C"aAK xJ~FC J#17HțNЉa}=bmHSD"[ZVk Zގ{r/2,ĺ6G/t rgᅲ7 ('&k[7t*ٰ!^œKsL);<Ƿ² ʣ>Jn4 ,f5 cKD?"mF>%j+meX;pɐ.! 't2ɠ# !Jʎ9 < 28 XMsWdu N6gj;]TUn4ꚟ<,/)4K=˾W]bDP|`~R'3]-QSyw Kқ[{H=Keb{Jg0÷Ʒ rS\>{;95 ǑP,–`tH¯yrDvmn  Bx! ݄_Iv^ӖG ϿZ^~2"/ o/OHj8O,y#&4t *Ժ'f&9%-sյilZQk^#+| lvFY}o6ak`O k,F>O$^ƻW̹_ /[E{S3\Oi+-gWMq#J&[3xgqgʞJ[gZqIfS~q">!Õ'Y'# o{wLt{ -;>l7 5{$}՞KvCj|v WqDLڵ df~AQP,Ğ,>EYhS%(=mXa[* ă-PxA,gI6n2ڲr {+X+#&C$"@?#x=Y?>Av@Ⲓ俎X,Ƴ.x Uw{̖}W'6 l =<»€ވxD:%6@Īl7k:/Y-{ XqMIμ3OZ;qЊ40 i5%H* ;zyv,DgОЍICtHrU `GG/HO+Ѵ"bp~2HzpWD"X_@).Wv0`0Z,{Sl¯)1Fs #0Ӎ|ٱ $<=qL|o7S C#Gb{xg=΁aG֮͛ 5ɑn{# sw6e,HZt!~]x^U3RjȾ`lAf]÷L]|x5#^!,?\'Q!99B'BL H¬@ڽ"#ހs#R>L-B:vNVA0#|0 :Iމ I31BdX;>99Դ;'l0[E, ZݚP4]PR\P=šը79EJimZRjlކpԡ<<>SpdYwp@lD{e9/@#;fv*X i{!rXV D5!ǖ#dwNOv, ڰw0F쏳 +HMLpYvG.,>cKN <}X/=Jo~'N|YUӎ2bbfnUghjUdԧ'q5zS5Iխ-}3:Ony'鍨c&]Mn$㔖ck4$wԴ P]MO z PXL9gt G!6UHKs!/ Ϫ-`m;>q/@ŒCբҺªz(Ymmy/^tĢ>5RŅ(hnxl\4;,,"7R/+* ;3 qdC;1ڱ-)^ycttG6D%m~!h  e1`DLul!Bd%C~x'pA''X 82e`;~r2M0Ñ8Ș)9=?<ƒ%-DX" ]Qp.,kl1 %؝w*>Nw|]Od6VqbT@i Zw-ZЂH~Oa> tx;s8DCbS>_kh\7rfZx}Qa'ֶeħddy72o'X@J6$VbQYeM= oe=\afS1PBQ]`&\%dK` )IK\$PFg2w mxp!}{Fwnmmff(⿃ܔ=xN G Dy岌ۃ]FuWv=}|#sNDÓξ7R?Hj0OZ$F|{גZ5HnHR6RؗTЖΣ襰ÊxP7|͈'xh\ q;{Y*{;Z{zkնR>c UFRWCx(QGIGF2zwsֆxىvw(&B?̳?}?;٬h;hm;H$8:ŝ|iϙ]2B'##\34;azb ƁOr2Nqt =T\/)p&LLN#>w*&QŽI:ɞ`MLLp Cl| bS%\r.*0:Aw1qi( QF94<6<].ScccC##cl{gbc }|b||LNYS|ϯɩ̪hlϪ`UD #lAtNºA>;h4˱ewRcs[~q;Ξ.5fw>}9mݭ]X&u=A 8|(ww]H˓njyIVJ2ƫ]A5962# F18=fp|8k\$ ANBYQ,ܧ(:<FJ~Q~eXa9JyNS_惂7#ߍ){'誷bkވy3'mmGJA^_W^7vEqu< MfvT&d5bDn铴–†ڧ-].}X%ʃjO -xB.y3z}|6'qtqȔY -LNjefaJ홅4Qʅ\x6Nџ ֐$9mЖsMZx7 }㰙73{yy{vŀ.+O5,7a٫^6||˴9˦ZnQKn73i3fa5skfYv͓sZ>?iWƏu^/2bӼ5?(\}ĵ-j=z$_v ^wꂁ_7WQyknϛ;|]н'>açLrQ[r%[\/|O3_xX[=dks#.!ggg~e_I/䴯/Y__|[\|qY__)_Yu >S/rԅ\r5\pI]tY.! jE/E͛vWٰqo |6+m~~yW7~'])C{\{i褫+•?=x>'\ W+;CO?v{s.q=}<ʯ}7.˾w|~3CGyטAꚁ q^0kppt^p05Ͽou=o SG,D7z'|cAmR0C+/+_ g}sMp?qEƲ^_kK?+yc铯-eO~.E.}oxe,zΩ]œ5]ܼuO_ԥ/0uc߲~cfBVg~rg*Q3Mnyx sW=1 cf.;s匥[e\~ڢf/]7a֒;ǁEM7brI7sw? GN;dĔ;GN0lB;9F_gi Ι}sW:>4bȰ1w 7m+d&̸nOx ξnEO<3+Gw=w=5c `Ys{uӀ#6v֌Kg͚{ψ)̺o;`ފu/mX˝s¢sлszΚ1q ^Dҫw{GM?gѬY&MԳW?69s7#nK_/\:.e=f =ˇgCru=W3jo9kw?/v[O覽kG܁q'ylƯ3 ׏G76P]-_<>{G!>ovw?_;:uǾt>w'?_}fہw1g>K t ^.ű'qV+}E/.?ҳN?{MX2k1z);l؋ϯ{tY 7t鬉'G[ZflXlz?6? :om|+;}~ul.?:~sEs|Ͻy^1!qWy=򽏻;^1~ԥ8ݏ;d.Α+z\zS\x7r.uEW>wΥ\rM^vSoqnwwȼ W.[6=O翧EdnW5C1V5:Q׳owh֫{mEח?g+~}S{giMz˼#'ҫK //Ɂ/|䥅(<¢G_Z }a-|.|kSV?9{ӗ<:{96^VrL[:vJ04^947IGO]0rʼ&qG3vS'O9n>FrlZ&O?aʬy{F<0zf CO|}L̜9o)'+{GzoՌESz&=3xY'uᕧ{EWL3^kø9/WuGp :ß?sG?{>w'z'v'|'r'zħv;S/W}vnySΚ4bc6jȭ#g7ۍ/?ICgsw?:/|:KCv?ovGԯz78kͣ~s8ovn#W=+!|v;ov>g.<+=9a|38yѱ\|>_ؓ./{GM~tʳ.C=K,Xp!*..R;I7|QnF6ȑԅhY |"5K -_3ey-=wn\Gx+ehY2܌9g<>niG=onIeT{y8{֜9&OI_yٳ?ggEnT1QYϝelP4E [%ʩlo¦sHQjK.XhE WgΙT<8CyXalm9,\q Ӳ Θ>[)K8jY8kiSO|`,̼O&̚;fbU2AΜ>{ڴS1LS&MGg9.7O4m&M6n-lN6iZ!isyfjUYڷȗ͸'0e' u?6aRn夔y,[8e.7'5uOwuҔ8S&O:eӦL!sf̝x.X0d/'kڤ$:S!D4~'M%&=()Syn R3ϘK;W䯤m""6snzۼtdȻұVrԓWhn=SBB%54( -V<R'deߵԬ[Lz ;ڤ6jeۥ)o7`hK4]QmJݲ4ѽYuI5]nI ]KrSۍ.}e]K]Cizr `HJXXMx&WV9:K+;mnTR}lQf!BD'&PiWoklٌJ_E%rBzfj Sh:#9)DL6mۢo`5]&}{|z+Il*<*ɳ$zI"C95N6)CIdSFfsCn 97$:--jCsd=88y{9oPl\u*yG*q򶣽1S:=ʵ4F-+'UYXχWɱM'5Rә 1d96B7L*x`PT@4TDt:w&My((q]w:cx;J:WSqա!+isYE~,96U yE^E);5b>}cF<%;{c5eѯBNe3ܴko&IiMIȐx WNbLԆ$+ZJ$6R0M68‹.ڰ:ze\D #yqACFWώ>O=eK{5k%-pN:˯pq{ŗw$YpsifLu61&5|}SN+H'xSO;M`7tH.ƍ_|"F߻z+ipzM7qGo9jA~hkTKA*Lok{yȕ YO:aÆiʕAOΝ;n2x׬0i$gM8L Un^8䓇zy=ӈc(,!)߹5uQ4\~)A~tٮ!^zY~_ܸѷaeGA(ƲenEY ǞO4Yp@ۥpÍ^%;;i΀; 2=FsWP~O8ͼO\c߲ea ruY@7ohb5{#*{57bVcuE^54.3ϼ[mz]I'|^äa Ζ:h8cP/Wք=N_cO0`&=ZտSLc;8O<z{7fz_ۛ:;vL:ta-&OoA+ GKO;ZH^*R#Õ+"SOmSu%aF)޻ӫW/ay%n1ۻ{X;T}ק޿4{7g?+6ۤ[У&nHmY!{;d<mw=}/>}R- s3O=T: Dos 7yacԀ bCJү_O<驧kEqcS# MwB}G[Wj|?pv.Ʈgy6fxP{ PD<2bH`c>LVz7g8">rh06=4|yD_\somva191>J%RB#eW,'`7zw%rϞWx"!~=N?kYh .хue%5Qs4O5low.#nFoe,Yqk!:<&{t}fDfO\FO<$-9ko}#4ɍS}5p=*!W_}1t饗2VX٧o?Ge.BZVb8PB j=9^V?%K0p բc00lp>|!CF ilᰏoY4'.]F߃Π 0hM'q2{/+C)'̻ F6RbAMd.w~ /=gjW^zh5cu*UVO~m[ú1Y]Agra)|' ɧd"MkS7kM觖0܄HMŒA=|E Ù>f88Xb 3t4 N|֧Ou:ltAz_As6 WZvͨZHf20t񚓦իtP5Qd`Cʉ߹EA|^1 Z`zTR먲5JmK>*G& v=T024x0IC,rjۨ2LҺf^bD$y(/DFX-(y7ŭ!U_\)"0hieRF3{~;veS|f^]}ԕڒx.JŌ`"(>7Mjf`*v,rTVU C< OA"^KJP* j(G3S~]*;x0t>0dȯl7%:%?׫& $w%NR&AXeѴ.:c!I; `&Mc eP+"\D?QO)r^6Е9W.u:S',JceҐ߃< ?塛ӇX̘UiP{=j&E|I Au!dx;0j}XC2:5|If͠xG>˔#o[oIy.;__foD\ lv|#n NqQQψv~k333Wr+W*UGfr䛓T3k0x ҈%|Wۛn65jc.i@nQ(F)>5ۛ*L4%id b$ԜXl`)$4gNR3&'[Ş\MHҨېUlQ&FQ,*Mϵ%qt*Cs|* 8JRYWLh%7]Six{KQ)L6E*[i3 F2DE;Ւ\5IƤ8=F}j.(%)!'f](vҰ:@$Bn3%LtnL 0r!e%(}x?FLk9WV 6fG;jis\v]6yx[Yuކ\e涶zprjtۍVnByƿ툔J b[--`Ndp%/jNsA*c4+y#5,&${_><|+Eel(PӅiTwHǒI0J|ْ= XmUŒI1_'k}op#fiARFє`X8m^߰t"qlɢ+Ռ/d `/RڊI2?s6ɹl^iLÔk7&S[#b䤮ɣ>ڻjQѾmemꅮG.$Gg1>w/]•UU%9~:Gi`l@"^`DGpKSMt^o%z?$fb-K׶SمqfkM[޶XogrHnˡ!LZ^jM [DZֶ C&zXD/:@"{3PoO s`=~YIM8.;M턫jMUZc)Y-Z9{S-kz(D_z饨40msz󖷖7?0=s\+F'.Qu{s^?NPJVm)iHzr\Yhf; h <1w8iNw\iB,"}qҮ6/^>}jUK2%6kȌ37xjrUgUVuxH'7i7tSTG:EXSB75Ku2$\WZ$vUivZA:$sϝ|w=Pozj{<ƓW9 -g%:=t+(21EMJ`~!>g%ΖOla>&Lr$_*#gs&+]xmuf~+>G342T yH#FF{)ˏ#()l>Oq0Oa} qo/9+e8RQ[(<h Oղ`o% (sTR4[aOsCΜHE`)&e&R4|\ve~5^}楇A494^̕R1RSJjS2 Ay˵螴ѵ)_ܥ?/ĦT]'?ɟ'z2>ʻ:zȉiP g,z>IN @F?M3b 1&T!.dm| ד5#٢Ƞ` " ?.ҿ:eTIND?l޼) "z)||j)S*c=F7%VQ0@%/;'3"0#׭!rIIַ$|$SN9xI79Nȁ!/74}}{p|3>݇[ $1c~$ $ɺ|-Hff> {^0l\EI6nNMNMLLPN#ol̉vv~dv3g6#ll!f#oHy%L2e< &&Hh@UU;-K?&BI58S?=u & #F k/%Tq{qΑ9Źzgr%w"y>7r׿u^{qpTǫ"<:L,$ ez_H{e{h~f+"^{ !Ϲ>]Ol4 ?>ZdeΏ \p'> 9sO4m4n68{'0n~'˯q n\x?O?3& lesˣ;pV /S]TcP3flŽC 28Sΐd*)7׭]'G< p$G2&=A>:B\Tk w3gdᇿChŀar er\riajk>GڼĊ,R `D3:Κ!d+T#Xr80/0 Z;hO{p:jYKC xc`UW^구<3UBsbzlY˺lEQKq>=w $?yՌHp }y 17J; .Ό,8P#p rɅc#F_%Bb_bJƇ?aX%_83 pΔ駟Nc0l7ew}k*q 1bpVI2`9塍94i!]{5"ci:3>O0 L2 ]N  Cd|[:=llGZCjWU!?f\1,7OD1zha~o*ja ϛ5k֐-+D`WgժUKJ|rg6WY6~zB=!0MYFɎҀ2xBK)3 \u . /6S[8i4c* 5Ba<+>A#>8ǢhN|>яT--z)'ĕ oc$fQ4G<B) ={&,,'Ա#,+Jk׮e)+ŇAha"A(G>Vvxz$,,/Nb(Lu(?`kd4xՊ/~GZyUH5eѢE?wmr.+!;yÍX&c֘d@^3S1d[ ZVRkQsBb٢nC/|ZK(b!.F*]-_YU˴ǧi lOx]WQ7l{Dޙ秱n"5j-_?(B٬)(#JaHCA'4̐!H^cdZÚ<%VUj\e xڭhf1Ę=[7h Jti?j2eI6ٮut *l q3MԒѤ8'\b82?~=L -QK]f2Jk$|SiU:o 7|K_:yL+qy z[k^,AS]C\,EjEZB@xS q|I1y_~i&AtЁDgQLVH4L,X't) >XW?) ugf~W(`XqYFZ~5W]O! s~Qj*,\0Ɋ\:*[n#FS-/B5@'O<ڛ;b1W!:ܜY,o42W(Hcj>hb`=f4 ;VOK-}M7}9nH ml!f:sm?7FR0&,akƬٳ\ve0nreoX/'&jwpJӔea[a ax{cǎs5~ NaհTYxhb2ZdC#Z&XlbJMy . L}kO=\1>D>ؚ}#gc='&>0e&5SNnMqmoW6nhlXݯs]vjpl`b6{ʩ/;64 9 B&?ē7.Sxhmx qְ B\CRZ@٢T>rcE>.gm1$O&*>w<7k.uqp!'DہݦSBVs.6q[tPs>(ev/[3nkX fIjէcGߧ%ft& !ɢo6H _fc'C\ ae3>fvl%GU`-_S{`9^5^R ^7e:au s5UU=/95^܉i٭*V蝢v; XĚ, XImj>I2ԆZQFpa_cEgs` SR4elMŽFE KŤJ6?ZRŽօ9i Rta4T-((vH5XqW-VkSb\[ʎ7E'^:g/UF2G~KQ2m>$‘D'jmz-Q<̙[E'qdL4U2IEf-Ͳx[UߨI<ֹ R,fEѠ\7˴ooNh^ fԄШ725%͟jIgsc53֐*jx VFD!SȬ3?mS5Ss޶k$hdVҧ!Ə֌+519\12lEv&F[1nbTⅽ/g=ILPJIG~n}r1ȣ:ţc !ɋz nJ(G|I&}MxFy"]S UDӀjJ*me'2TZ3g [4Ј!TTU5!AG]Qx>""D-XuVD*ZUA:'+iNUUvv;&@J b/%xJf+^ۖ 8Q#nM\ԽX W#U)ͽ5\J)bz|sgΧ%n1*@ F@ZN)TviAl> oghW$ zc83j9ꦖ=2 /O6}o3}t'܀OE2y R ȶn:Ao \|rS1y't(7F%mAk`tDXP D3VCoF(ņf䧮._JǾTݵ1d㏃urMu+֦&jsܚ/~D0Pt}/pz\ gd, : #ɇx C1@Q3SyfGs@AƽG1]h]=1)c*ƒiORkY0ā,UJ,[m@3hY žZhG60A3Q TifNec ~)ȁm Rj'0T,"`O9Q*ƛp8Ȓ*7jMX;8qA*j#jǛn2"# 'P3$CemA 4814DQ1Y'vu[ xe̢-f2 xٺdXeS:>sc +(v])^@j.x*g|ۨzYr΀%L8@DŽ;)rlGaՇ딖IOGgGAZOI>ᠵJ#)KYsY3<$fGiU. qWEn럮zE{A<-H $NsL(#Es ()OSf YPS Qmb6!w $C#K h}'6[gTʕs3 )H͕$)eG{.PQte~3)jNԛ`hWSɨ4dr]T" Fn"Ĺ55wz0;$cn_ң3馌w&ߎiJ]Bk yuVܝOTÛNY0ag1)i &}] MD>֬NGGNKQ~nx|C #CVZ >2d`ed6 ryVzȅta/ŀ`^Ff-Y RI=rzM::C]۠@3叿\ '' 惓*b6سdŬSQSs,~QҬYX,ƵWYptjQAقzUq+tD}' [g|`~ΜM7mkTk`F`lǍQ}YBN\22疖YS&0aE+Upk%͜1Cu;Fm|, =uƱ%Ϟ̳7!2mb,p;oxCLNOkpTk֮`7 LT{ OL;v=@G+[X"h?=5|gHFϚ=4xf[IZm**'`E^pyj9s .Cv ` $JҘc~i12 qk( ӹ%qbaOȳ$֮Y{۱!grk6Ygnzێ`ƟH䧝v5Ê@ DbXA)gB]AB\EorC: FkeQAdKniYG[ʠp [ޖ%LSԴ%Pɹc`R1 |37Mؖ`X ȟ l1N=TC-db[!„w ڨuylXjߝzVl(8Tȓ ){ۮ;Gd?~ 1(Ery0u5{gyrLj8!J h{.U :`Q߱ ko 8ށ BfBP۞2Ơ kmG\p℁;!,l; Q)Zʈk,\xʩOp1RTT-8D r9㏏S&Xc/۬qz()8Bp* t1R+3 b6R0O>h&9x"z(KnI:]tqC<8k<2my2vQ7d q:a 8tK:`Qʸu:*EinѽK$˵SAd=f[RcDƶi^#EaȫHnq#`U_wu'gM~ # -c9H=Zݢ)\,3@,4>2͘9.!"(H ϰ64u V -y bjbQ]hϏG,c EBrYu1/t$S8}! gLIL9Amش[$3i5!|(:,aA#c?sz_SOuk(D.qG~p>%ˏtH1~x% p;ń]T8 xɴI˿9Ȁ=N?qb8I޷_+R~áG_=pMhŗ\,ɳĸR!!|ŕW`^G8BSrH%8-U㊨Ot 3< c]SZZm h3%5ʈL7jS@}܉V=лK!^ VB ,F}HڷO_4ʼ2}׿qӯoL4< alryRcyE<Ŕ1e30{iv ѯvJ(+1qxɴ*X}Bb0Γ)\[U FmG$gD(*|}5.)K}AګjlMÉ̪/tBz"EL MR,]B ~29X$mza{:?*BLpk4Uaku~YZY֮[2R< Ru0[$xl[Ґ?Mo_L^GtYlCUh#'ʉÇ҉ךC/ >1]j] %:(vk?O= r!5Th z=Sߙ,IkXGhXXMVs K 9dvRЦ-Z6l|25#eL=9leŐ(\e5,]t%s-orA'-^d=%r@---z [&2.EPV'OT}|ҝнۑk"u6D$Ii4hjrJRUE`ex\dL?*6Y ]TيG-],iƔ!Vɪ=672,.Jy7tێ[MdtqTQT!xL9%r 2Dd0e#ƐM!S,5~HyDF"OȰ"yBZ>/Ծl檪+V}|G, uHR6ecmj@U{f`D!xڷAQۖ6lXX]:`udtbBSOv JO Hdp)bvHl1gM|zTV#DGXA"#gĈQl #pl$+: v;cfJzf˦~|Vl3Y)< jU8D4pjלwxBz<#X'^مLi2[YoTML%zJV̕YT'G[2HFlUoo]*ts PJ"kYZ+N>d|G|*Ee+Yfm!Tĉq"VJ( ,Y겘"zk[V-dcM>$ENh,ٲ ;Dī}OK*-yO|.R~joH$~VlDU$r !@+qh<.j :A0S 9cFqB-S]`8-꣠}C2<D+B!imSsT+kl}`oiYRx2/:Z 11l 9]뢙 ! B}*x8dS$˚vf0c`V_ Eډzj%[I<%OڿM>lĒK}JKfd|tJJndoa%IN0h0e eHeXlm  *hl,?he A/^FU>am,J+ۋN8Q.Kc 싣pkAcƞ<N yYAYAfOW[,m?+LQoFˆ-'C̾ÉcRďnVcηj M@eoCYѷc巜'?ņ dCXK_f(1IG$CO Ґ;6ȡO[x#[ G%bbHh~#O H{^4ƎDHzʷ07kiZJ>8ČVIչiu.4P'MNtwo1[9   }ǐS`mw ۝*ThZSeR&%C8wkh>VJGzۚ!zFSBZ&Q_ \(!Xqi8 QEהMϱMq-[bMeV}59 c<`R8`_zcF^l2v7HhvgB0) Ĝe)aQKXje,K2#UI >RU;lvNK œY* 754%4UJx[Uz8DQ&͑s+-tS)F88x#$myܣԷ۲@ 9E!kQ k'p(j78uM]JDt;dqŰFw (u1 jJNAͣj N'RZ{07?ޫh.k~mjW}EVHڐ<C|]t!J~4AxR:O HÍzXSP#B1R@`$y:{DGVN)"N **CŤ~jU1v G4y5+RԸ䵐d*dgAPV0$Ȋnɿ^*R eKV;"759[Ldڈ, L3UBAGlb3W-7]zaOnw$T$$$hRbm"ɿr;DdnjErE i\o Z B,wS9NI5xo1Uһ?/)c@նZD(ẆcELUy)҆# 8;_YYimIB$^f$$ٳ/y5>]!jNFN)B:do:$YX KڌQcS*|&aIـeJ!~-p/ O/$Cl'7_vd.v=c>޶T[^!B [P,?e|Eڦ<-O<޶-ҫTql v߭egy&L?"GY$ Cv &:?*|EN2.m{.uMB1@oCڊ>~?_**1l͡+gGூ\59`PzR~G쩓 O'd6y|g.x$˽mV5?]cVfG:vԠEՋI8@܂-1IDATCuT~8pd:PHh҈&oyS ]`iZX5;(lϾuyKǴV6)nltI΍alRZY|H<7yofђəLrpcj4)@crzc:c=YJm>Ydm"$ _].ꭒ}L!شlÏ U&Ԕz;-!4[ nt,k2n/ZpufHc3p*K.flsjr{GbJToy#y#h*:U^ 8I[ t,%xS1#0q&2HglUAQ"t"U*J$`ȩzr+7EQb>YN夃6`j%wDXuj"PI p}d0U2e k9\ p(6 D>?CЖD`ˇ~ft{+Nd3f -m`:(M`20X {P'\ d;GN3(8RHQ;bF+ I*HĄw_I'MĚSW7Ջsh(4eFv"ꕁeTgRF~*AR#"¡QqE2X(îvie.F pZXF9n aUW*$5İ;`P ͇~V1C dZ*B+tP,3]359VX*JZQ{A~G@FNt"U+ ~X#IdUQoUNs4qF;²lǽSnB?-[mUX6 [Y*r"!6yMz0wRmY5IRHLgY'hbjr5,7,C7-~W2G)q9P,7X#YҔ1joOμV2_SOg,i?> xԥѪ`LYl@JjFɠbzQ|ä؄%?N` ^KIw\ zZe#iBh]-S}kF%琀R9j)l;mdNd|Dy.PpƢc[\f%{exU؃o%k&59͞]h61`^-A~"H:8}C"ՄnO/!AtK\&D+l !@wФƬ-HtΠoKY , c$l1F*8{(ĥujqL{>)TxN`DP *ۏcX XkHIeCARav[ 2HeQv ^tP"@*Љ^ID@Q5:ey#["[ w [{];n!̢ _`uΈ$ޡj`PD(IXa)GrU QD6eQVHs\|A!p5#Ƭ0`\ TG4;S3D `D(~Hfd2(kFE:IȂEye8Q$1*a(Cpã8&m v:cH#U`;`Hu"&U])vk%H=@XX}b~"~fgVX@lab(p,٘j X^dSP)%2~F~ʊ"aBFc-&]hتw6vݴZ$@i b ndQAVgyOz@I 8g3Pɣ*ULu)W .d"CAJ~Fx_ b] ]QzUWJ)D7&`e;B*3D#@Lc#>Ν 4 )O!YSP((ӥG|$aRGu2t,XoTvM\`FcpEJj@0kT"ugXXՑtڨ-?Y&|?-X/e–iH|+z,fA%lr5,1agE0X %^Yc!g cwTi"]]UiGhAS#A 9&񂮕rUq` ؂;~˳gMR%³f">r57V٭Cӑ7(-l9Flke) [ַe1Voiajꣳ_$QZ&-] 9\V~' @{q` xH]hPxgsPN8,|ee[wDy.GTo|{'MRx٣3lp*'QAYX/1 |Ku[;۲ݔ1SBV0ƱI&$6"p¹ 쥵|(N6% `6k= ir"gd XjxzFᇂY^. LQXYP$PqJVuJP5>$b,H\ ZRS2D* N!$YG?|[J|Y%$"#>V̲a]XBDf@/xI Fu]sçKLW[`%(ńV}W1JEE|KpE<"; 1*~'w^ W@@;TX,mjyzem[wP1kY*CǺڵ]A?%s@@ED#G,EőNU1z|CyCNTOP%HHH ;ਅjpS ^ҌwkN-AmtB.gM>";`&0Rޒ"FY+@I||Te_.l[xQ)@زi,^TPR¼~*eH`,fw^&SʝtxV=>z+ $Yw`NvO`CEG QVʷAo`h7w+{g"b`FW<.8ӟT?j zaA¶Έ,(T-;gTGBS S8,v̲qP`'x"FNE!<`q؁82p@C0Q9 ZrJ$P>v~11ϯ XQr쓝O sqV I&kÔ-ա-F9R c&糜rKN h'Iq8rA q檠JbY(u78%ly%le)` 1]Lքsܢ,9 ?cKRr[[و"-"+Sǀkη:ָ3,v PRhªo.&~Ƽ,C'>'U2wYŴ 3W0]~ |$2ۘXm KEE zteiH_kFx%|˸HH][XV%ŹU]`%NvA$E e+ ԩuҷh+Kua;]wVܖ E;AΑ/^r7S "U?S";mHd`b,GjN]A\~/~ Xmrйogli 5N>h'Тuօ3rxK6 T%Q2lHǜHrnK:Vڑ`ǘ"4-բ##1C]$:v4"DV_6r.Nr#{ϻ5ZB ⠹VaXAP:yũt'8'. GSz[^Ez`5hMCj{]qU5d?{#S;VN?f}y,#{-:N:^{^ټdCoc1BxyT W6n~c/5^B1L!Eh(i2SG8J j-+T#N)… e@ \8 ax?4<˜ W(^*b!/IC*VTmʆnUм|p6@O|N:?==?'Cl&ab:g1H=i{H븫 ȓU2z| xsn`"y9i0ޟ7lh$C tRH,o{C( |6 0!UOfK<;: a$)|zg0H t`"k5j Xb7dK$@X<߬ hxx0<8Ha^0v54|BZA88aBstPj¿YW2 .:[0j{;KE[#-Xށl`ݎ+U~}AD||~{wVq_/Ƒ&p`PLu)TiP3YN'tsuUJIޒ|R߁ORbUmIV%{JNGGܳ̀J uo-(SiTUzPzurV:YO!\YUTWJ;bzN3d`HF]H;K`K(vDC;RcR)(%yӦe˖^pگ_/(ص$vFnX֬n_*CK+H7?/hXn.m+xH`W]tHHH`$vb\$P$P$(V EE `2]U-((U@@.#XLWF `1P$P$H`+k\>EEEHXTM\$P$P$%gx|S\>EEE!-yhm'`*˧HHH`%yoIJk;k+lEEE)ma6^E*@nG-~V5FuQo|ד: c8 λ(%C)*gU^WDvٱQ[]|E l)~+ɖlE;GɻqUZ+#+"1icXEj W𧺪x`g"RlmdgkY>TTJF~U{UhKǂ[/ҒHK`{+TQ]⎜P6߮rk<ǻPK\dpM[[evS+s[ 2mL9sƭTP%SnrM .ڢ.Nøzڍ[*^` ]nQt(r%[mv9 `K$Z,(\|Ś`E;KvǺA _X]~- p/W g=`te<`Z]v}4\ 2w. WR+< ܅ a&tD9 WE]K`{,, *{wmN){=*UBt]Ei&cP= $BowbC&e .,Pd}Aq8˧H`WYeKN8mqMT2by‹H%]CQ] \ )(6%XU1T\60D'; M:  @tR)@G ;&B4O~'DcJ@ @0Jŏɝ20zsϸ}V(}DFt7=q\q/W_"Žbq*0B[1lbdZ'q.Y0$ЇRC[çbD.i 7:J->HWU RYUyU?  hrAn0ih~u WypG T JUb$_$kIj,j;HO{}k.^yvIe`Y$HTJ*|(8ՈCFQu;cVe@JMS'LbM-hKJVO?F&ZARQ.!(+-㧏`rK$~KId^~ #/=C(h2zCPN{U C@JDe,!jy8[1iEo>󡟪mBi9 )}w_kIH}D9@j5 6=ѴefṞoy?VXIՉ0dY͒6D w"Y0Vl\ZP[DJV-NВyae5,2LT.ow(Ɣpm,v,X{t&ݡj6*mަ!P #j"h!m3$zkM<$Yb'YfH4O>9X+9IBp@LKe*l-Tt#fбf,/鴧mзdV,I~:hhqTд\`0d'h~.@IXFn3`YMa =3}|#8:@tB1,f tZf&C1 N*Fđ("3:!p8`>37nPYK<%>X֤0$- 0mXj1ޛ .K `\@Fp,h^YL'Hu_EpXL`N-һqfH|> a>V 3X(!|aVI5 gii(XKK  QۤOSuIcp=@? auQDϾyT624)5ZxfUW?+n#P]RpX'X1&]u98 U/EL Јw[C%PJ'?2-.(AxkqY   @2 v e0Z$P$P""]Fv*  *cHH`@] EE((e$Pkh@@2v e0Z$P$P""]Fv*  *cHH`@] EE((e$Pkh@@2v e0Z$P$P""]Fv*  *cHH`@] EE((e$Pkh@@#> E(EEESR*(Don޴h=/.V')QEEJ,獼Xݪ_ 3EEHL ;J*((=pU$P$ЉV'B)QEESe {KHH )a'B)QEESg:@NR `u~)\  t"XD  tO R*(D:J*((=pU$P$Љ `u"U$P$=%P{KHH D(%HH{JVU@@'(ՉPJT@@@/""N$P"")Xݳ_ WEEHV'B)QEESg:@NR `u~)\  t"XD  tO R*(D:J*((=pU$P$Љ `u"U$P$=%P{KHH D(%HH{JVU@@'(ՉPJT@@@/""N$P"")Xݳ_ WEEHV'B)QEESg:@NR `u~)\  t"XD  tO R*JÖ_kK)EEN]>شiӳ>% ڒdJ|@{ 5k֬_^ރ.)U  t*x$k+_|E `u*Y$P$H`jѣomĈύ?^ `u*Y$P$H 3XG?s `R,(TXsNS^tSO= `u*Y$P$H 뤓N}8j…-z `Q,(BVu˟~s̉H*V+IEE;[Λ7oݺuO>%\2h 0QkgDHHm%zWdXz+ `J""F΋VL){""@Sz[ EEEm뭷.|>jhmiXV$P$P$$曛[3j^~ōoixS׎x$cXX>;B62lܴ"GI*paEcGкuk׮YfCk֬NO<)~KͿSj\h֮\Vu Yt-:n勉NٶT D ́VF{>?n_;/䘯|n}y=n_Lsȓ͟ /p/|w>7nŤ?뮹jذ:>rw.H<9P=j$[Sϸ5rD=C  t7 j?*!.u%tEXtdate:create2011-03-13T19:11:50-07:00WH%tEXtdate:modify2011-03-13T19:11:50-07:00& IENDB`PKD#"buildbot-v0.8.9/_images/status.svg image/svg+xml Status Delivery Georgi Valkov 2010-01-28T18:21:55+02:00 2010-01-28T18:21:55+02:00 2010-01-28T18:21:54+02:00 Adobe Illustrator CS4 256 248 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA+AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYqxfXtRvoPPnl WyhnZLS8j1I3UIPwyGKKMx8h/kljTFWUYq7FXYq7FXYq7FXYq7FXYqx7zV5yttDeGyt7d9S1u6Uv a6ZCwVigNDLNIfhiiB25t1OygnbFWKzW/m7Vf3ms67NagkEWGjn6pCnsZyGuZPnzUf5OC005/LkJ UhNS1eNj0ddW1FiPoedl+8Y2tL4b/wA8aHSS1vP8RWKD49Pv+Ed3QD/dV3GqKze0qGv8wxtaZp5d 8x6Z5g04XtgzUVjFcW8q8JoJk+3FNGd0dfD6RUb4UJpirsVdirsVQ0ZX9JzrzYsIYSYz9kAvLQjf qab7dhkB9R9w/S2H6B7z+hE5NrSfzJzZbGESSRpNcFZDDI8TECGRqcoyrUqo74qlv6Nj/wCWm9/6 Tbv/AKq4EW87/MLzlq3lvzXo+kwy/UtL1CPnJrGp3epm3ab1An1ZXglpE/H4uT1XfClT1f8AOLy3 o8mopqem+ZLYaXNHbXTtcFh6syerGq8b1ieUNZen2Qe+2Koq9/NDQrO91O2l0/zCYtKa2FzeLckw FL2YQ2siH67yKTE8l+GvHqO2Kqo/Mzyw+tw6JCmtTahPfXWnrGt3Iq87OYQSycpLtAU5tUBavTcq MVZz+jY/+Wm9/wCk27/6q4EWsgaay1/SoYbidorx5o50mnmnUqsDSCgldwDyQbjfCkMtxV2KoS5k kkuEs4mKFlMk8q/aVK0UDwLmtD4A98VeV2n5kaattFLqmh2lxdMGcTkgNxLcNzKJ2J5DiW5/cdhq I9pkDcPS5OwQZeiRr3X+r8fNn+g6o0un6ffKrJZah8PotIZvSc14lJWALRuV2r4inWmbPDk44iXe 6HU4fCyGF3TIMsaHYq7FXYq7FXYq7FUt8ya5baDoV9q9ypeKyiaT0l+1I3RI16/E7kKPc4qwXy9p d1bxTX+psJtd1NhPqc/X46UWFD/vqFfgQfT1JyJKQm2KXYq7FUi1S4by3q8Pmy2qluClv5hhUbS2 ZbiJiB1e2J5A9eHIYQgvU8KHYq7FXYqh0LfpCcF1KCGIiL9oEtJVjt0bam/bID6j7h+lsP0D3n9C IybWk/mH+803/mJb/qHlxVQwIeYa8fy5/MDzO/l6fzHqBuLZntbzy9C8tvZ3MljKZJVcSQ8ZWRqc vTkrQDwxVNPMX5NeU/MOs3mqanNeub5/VntI5xFCXFotmrfAiyfDGtac6Ek1qp44rasn5TeXRpmo adJdXs0epWmnWU0ryReoq6TX6rIjLGo9QEgsSCCR0xW1Gf8AJzy5cW9nb3F7fyw212+oTK8kNbm7 kn9d5pWEXJWLbfuim22K2zvFUBP/AMpLoH/Ga4/6hZMQkMuwq7FWN+ctGl1OxuLNJVhTUEgheeQV RDDOJBUUYfGrOByFC1B3ynUYjkgYj8buXotQMOUTIur+4saTyb+Y0cD26aqil7eSON1vLsJEfV5x qo48jRQF57EAkdFAOCNNnG3F07y7Y6/SE3wdR/DHfbf+z9afaPpOqW0s1lfXbXjzXoumJnln9G3j POJayUCM0ir8KihFadMzNPjnG+I3v3ur1meGTh4Bw0N9gN/h+lleZDhOxV2KuxV2KuxV2KsN/Mz1 JbXQbFSfTvNXtxMnZktoprwA+3O2U/RirzbzP5q8wab50W1vb9tE8vn0BZXf1NbmC4dqGVZpSQYj X4RTtuad7oQBjtuVJ3Vrv8y9ZsbjWo73QEii0OON7qRL0OS1yp+rKq+iK+owCnf4a98Awg1R5rbT /mdqz6bpN9aaAsy6ncjT2je8EbQ3vORTCw9FqikXLlt16Y+CLIvkto22/MOWSCBptMEU0mvHQJIx PzCMoaswb0xy3X7NPpwHF59LTa7yx5uj86Q6rZS2K2lmqPbyRvcK9zRy0ZEtuFVotvEnBkx8Kg2m n5cfnT5Hu/K1jaanqa2Gp6dbxW16l3VA8kUfFpEfdWVuBPWviMjTG2Tn82Py2Fa+Y7HYBj+9HQ0o fxGCktv+a35cICW8xWQANDWUdakf8anGlcfzW/LgLyPmKy40rX1R02/5qGNKt/5Wj+Wi3Bb/ABBY ieQBCfVFSEZgB9DFseHe08W1Lj+a35cBeR8xWXGla+qOm3/NQxpCVy/mV5O17zHp2h6LfDULtfUu 5JIQTCsaROlDIaAsTJ0WvvTEhDIMCvBNW/JTzFqOnecNQuEmfVJdT1a48taUJbZYWTUHQG5L12aS JePF3HGnTDapxrnljz1rmo62/wDh97KHzOdGDyTXVo31MaVdtJIZVjkcvzShX06++KsZn/LP8xzA bU+XoLi+kKHVdfknhkuLuVNSiufVjle4DhGiT+7eIceOxJagUqTflD+YiiSC4tZrjTp11Sf0ba4t UnhnvbuMBFMsgR0khtY5SpNN2U0JxW3tf5d6bqumeS9LsNVtILG/t42Wa1tQoiT94xWgQsgJUgsF NOVabYEJpP8A8pLoH/Ga4/6hZMQkMuwq7FWnRXUo4DIwIZSKgg9QRirDdcWS288eWNNtp54LC/j1 A3VtHNKiN6EUbR0CsOAUsaBaYqy+3tre2j9OBAi1qadST1LHqSe5OKqmKuxV2KuxV2KuxV2KsN/N SNo9As9WrSPRdRtr24NKkQEm3mb/AGEc7MfYYqxbXPIem63fNPqF9fyWkjRvLpQuCLNzFTjWKlf2 amjdclHKQNkkLdW/L3Q9Vvb66u5Lhl1GazmvLcMgif6irLHGRwLcG5/HvXwIxjlIC0stPy30Czji htZLiK2t9TTWILZWT00nRCgRapX0yD0rX3wnKT8qWl6fl7oi65+lfWumH1ttRXTzKPqovGWhnCce XPv9qntg8U1S0hz5f03ylBq3mY3d3qGoi0MYnvZFkcqm8cS8VSvJ+IFanGWQyFLTP/y98maX5V8t WVla2cVtetBEdSmQAvLcBB6jO+5b4603oO2RQybFXYq7FVCW4igaaW4mSK3ijVnLkKqCrVZmNAAf 4YOrLootrmiK8qNqFsHhjEsymaMFI24kOwrsp5rufEYWLD/OqeVLrVdA1BTZzajLNIiXCtG0r2rW 05IqDV4+aD2riUhLU1Hyg97bWMdxZSXd4JDawI0bNJ6QDScQK14g1ORSwex/Or8t7q++pmxuoJQV EvK1SQx1RmPJIGmkPBlCNxU0Zh23BpbTW0/M78s7mR0EnpKswgimktJRHLyWNhIjqjLw/foKtTdl /mXkKVSj/NX8t5Lgqsc/1FYI531Q2E4tl9Yt6asTH6i8ljdwxThxUnljSpt5O81eVvNn6S/Rtk8f 6LuWtLj6xFGvJ1/aTiz1U070PtirI/0bp/8AyzRf8Av9MVWWFpaw+btEaKJIyTc1KqB/uk+GEIL0 HCh2KuxVgvmPyP5m1L8wtE8w2WtfVtKsB/pNkylnFGUusPalwqhJK9AKitcKs6wK7FXYq7FXYq7F XYq7FVK7tbe7tZrS5jEttcI0U0TfZZHBVlPsQcVeY2DXPlzUE8raxIxKimhajJ9m8t16IW6evCvw uvVtmHXAQkFPcCXYq4kAEk0A3JOKpPotqfOWt288Y5eVNJmE5uP2L68iP7tI/wCaGBxyZujOAB9k 5IBBenYodirsVdiqQ+cYJZ/L2rxJp66m0lqFWxJYGc1b92eBDU+WAc2R5Ji2h6Izyu2n2xeaMRTM YYyXjXiAjGm6jgux8BhYsc846TpUMmgNFZQRtFdtFGViRSsf1S5bgtBstd6YlISyLRNFinhuIrC2 jnt+f1eVYY1eP1AA/BgKryAo1OuRSxy5/KL8u7mS7kl0dS98ZDdFZrhOXrSrPJ9mQcayID8NKdBt tjarT+T35cmW2kOkDlZtE9t+/uaI0KJGh4+rQnjEgao+KnxVxtVbUPyq8hahZrZ3el+pbLFawiMT 3K/u7GN4rYErIpPppKwqdz3rtjapr5f8p+XvL31z9D2gtf0hMbm7o8j85W6t+8ZuPyWgxVN8VUrX /lLNE+dz/wAmThCCzvChzMqqWYgKBUk7AAYqxzzTe6beaO0MU9vdgTW8k1oJYf30MU6SSx/GyoeS KRRjQ9DscpzxJjyvcfe5WjyCGSyeHaW/cSCAdvNhWn6x5+g0mzhhuIqQWSxqDPYg+qrpxqJjzNIi V+IjcEmuxOBAakRAHd5fjk7jL+RlkkSecv6XLfu257/FnPlzW66PB+mb2FdSq/rhp7dujtxIMPFK FaEDqBsanfNhg4uEcf1fjudNq/D8Q+H9HTn3ee6exSxSxrJE6yRturqQQR7EZa4y7FXYq7FXYq7F XYq7FUn83weWJfL923mdYTo0K+rcPPsqcejqw+JXBPwlfir03xV5v5W0T8ybq3kv9OliTQZmJ0my 14yNfm3oOLySwqOPPcqHDsBQE98SFtP20j8yGTithpEb/wC/TfXMg+fpi0j/AOJ4KTbGtW0nWbDX LY/mLcJL5SvCIkfTWeGyiuCaKmoBh6pjk7Nz4V+0KHYgIexW8NvBBHDbosUEahYo4wFRVAooUDYA DFVTFXYq7FXYqxvz5HaP5W1tbqCeaBrMCVLYgSuvJvhjLK4DD5HIjmyP0/jyZJkmLGfO329E/wCY 9v8AqDuMSkJNNqenQX1tYTXUUd9eB2tbZnUSSiIcnKKTVuI3NMilguk/nv5E1KZY0N3FWB7iRmg9 TgEn9DgywNM5diQwCqfhNTTDSomP85fKE36ca3W5nh0G2jvbieNEKTRTKrIYKuCT8Y+2FxpVunfn d+X97HKy3U0LxOE9J4JGYkxo4/uhIqFmf01DlSXBUDGlQ0H57eTZvqBW31ER39wtskrWwVIyyW7+ pIxenBfrkanjU17UKlmlZFoH5ieTvMGonTtHvzd3Yi9dkWC4UCOtAxd41Qcuq1O43G2ClT61/wCU s0T53P8AyZOEILO8KEHrQLaNfqBUm3lAB40PwH+f4fv2xV8wfo2//wCWWH/kXpP9MKu/Rt//AMss P/IvSf6Yq79G3/8Ayyw/8i9J/pir6J/LyN4/Jeko6hGEO6qIgB8R7Q/u/wDgcCsixV2KuxVZPPDB DJPPIsUMSl5ZXIVVVRVmZjsAB1OKsDn8/wCu6yxHlS0ii02tBreoq/CQd2trVTHJIvg7ugPauK0h iPPrAsfNTLJ2VbG1EX/AsrP/AMPgtNK8XnXzXovx69aRatpi09TUNMR47iJR1eS0dpOa+Jjev+Th tFJN5S07zb50179Keb4kuPKtpJJd+Xo4ZbdrWd2lPoSSxxO7uY4tlElOJ61YnCr1rArsVUb2ytL6 0ms7yFLi1uEMc8EgDI6MKFWBxV5LZ6n5x8g+Y00/UUd/y/hM8GkF3hub2VpFVre2gRX+sPwZCqck +EMQxoFYFU8k8wfmFqtXi+qeXbQ7xxMn168p/wAWNySBK+AD/PI2mliP5/gYSQ+ZVuSKH0ryxgaN qdv9HNs4r/rY2tJpo35gTJfQaV5ns1029uWEdpfQuZLG4kPSNXYK8UjdkkG/7LMcKGZ4qx/zrceh 5c1mVb+TTmjtA31yMMxh+JqOoQhiflkRzZH6R+O5Zc6VY33ndZb5LC7FjZQzWMEsMUl3bzmeTlOj tGXRWCKBR/tL075Jik/nHyl5Uih0u2i0WxjtrrUjLcwrbQhJXWzuSHkULRmFepxKhDLoOhrqR1Rd OtV1Mkk3whjE9SvE/vac91269MiyY035Oflubdrf9DAROnpuFnuVLJSMULCQMf7hO/b3NW1RNp+V vkOzt7+3t9LCQ6nbR2d8vrTnnBCoREq0hK0CjdaE9zjatf8AKq/IP6Sl1EaSgu55zdTkSzBHmJDc niD+m1GHJQVop3ABxtWoPyq8hQ28NvHpf7m3kMsKtPcNxc/V96tIT/x5Q7dKLTuatqivK/5e+TvK 1xPcaDpy2U1yoSdhJLJyVWLAUkdwNz2xtU9tf+Us0T53P/Jk4Qgsgm8zPHNJHHpN5Osbsnqxm1Cs UJUlec6NSo7gYUJP5i/MTSdNsmi1WKTSTeJJHby3dzp8FW40JTleRFuPIfZavyxVgVt5T1i6t47i 21C/nt5VDxTRuzoyncMrLrRBB9sNqq/4K8w/8tepffJ/3msbV3+CvMP/AC16l98n/eaxtWfaDq15 pmj2thNpl/dSW6cGuC1tV9ya/vLyZ+/dzgVMP8Uz/wDVkv8A/grL/spxVNNM1G21KwgvrYkwXCB0 r1FeoNK7g7HFUTiryv8ANzzPapO2nXiSy6BpMcF7rsMAVnnknmEVna0ZkBXkDLICdwF8clGNmgrt G86+X9TsZbn1xYG2Mq3NveNHDLF9XYJIXHIrxVmUFgab9cEsZBTaYLr2hvFPMmo2rQ2o5XUgmjKx Dky1kNaKOSMN+4PhkeE9ybUv8UeWeNu36XsuN1X6qfrEVJaHifT+L4t9tsPBLuRaH8n6xYaX5oiT S7uG58t+ZJJFX0JFkhg1NEMh4MhKgTxo3Jf51/ysNEc0PUcCuxV2KvBb/wDMfSR5mk8wavbXc4ng L6O0MavFaaV64t1mYF1YPcSUdiqk8SoGTjjMhsts2k17Q4iBLqNqhLvEOU0YrJG6xum5+0ruqsOx IGV8J7mVrZfMPl+KK1ll1O0jiva/U5GnjVZqUr6RLUf7Q+zh4D3LaD1XWvJd5a3em6lqdg8Jb6te QSXEQKyEkcG+IFXqhp3BHtiIS7kWGR/lzrN5PZ3mh6jMbnUdDkWE3Tmrz2sq87aZtvtFKo3iyk98 UJl5w+sHy/qywTWsUn1Uem176foIxLfFN6oZOB/ytsA5sui+OKT/ABpcy/VEEZ02BBf8j6jMJ5j6 JXlTiteQPHv1wsUH52+3on/Me3/UHcYlIS0yxq6xs4Ej1KISKkL1oO9K5FLEE/N/8unYAatQFFdX a3ulQ8ohOqh2iClzGwPAHl7VxpWUabqNrqVlFe2vqfV5gTH6sUkD0BK7xzKki7juuKonFXYq7FVK 1/5SzRPnc/8AJk4Qgp1H9qb/AIzTf8nWxYvJfzy03XLjXPKN7plncXCWf6SE80GnNqqxGa3RI/Ut hRTzPwgsaDrvSmIUMX0nSPzH0ny7ouj2llq1i91pVjBDDA8zRQXaay09y87x8UgMlo3xcqfD8B6Y Uoqy1b8w7Cx1GK8g8wzXN55f1CDT2SC+m4agdRv/AEGLAN6cno+jxY78OFNqYoS3Wf8AlZS2lq+j p5lk0f1dO+ux3T6lHdG4+r3P1r02jWS9W2r6fL4SOdKYpZH+WK/mGvnZbjWF1eLRbp9UWJbuS8nj IjljNsssd0q/V1WMkxPSsnTxxQ9pwKwX8sbv83G8uuv1HS305J5l0qS8nlgmaASPx5LBFOCK0oW4 mnjkkste4/NfiOGn6Dy78r28p0Hha+NcCvNItA8w+a9F83af5maLTtfvdURLx4k9SONbeO1kgVF5 ryQxqKVavxVyUZ8MgVqwgLD8utGuLZtJ07zJDPPFFcW2qQxLHIVguZ0laOOJZa2/F4tq8u+WnKeZ C0jI/wAqL6G01Syg1tVs9XiaK7RrTk/97NNGVb1hTi1xvtvTtXI+ONjXJeFe/wCVMraiuonVgLmR 5pLwLBJHG7Tshb0liuI+ACxAcXLqTuQcfH2qlpW07ygnlXQdOshd/WnTW9Lmgl4ek3J7i2t5B9py 1UDnrsu3QZGeTiNrVB7jkFdiqT+cpZofKGuSwV9aPT7p4qdeSwsVpT3xV4f5t8l6JNZaLrl9rA02 wsrG0souMBmlPFxJG0DI3JZD0FEbauXYshGwFqQjV/L6019DqVtq7Np1xczXtghtWjdHuLuK4n58 2RmBNvxWqrStd8fF4dqWm2/KvUZNL07TJ9bie30+3ubNCLKjGC7EYcfFOwDj0/hehpXptg8YWTS8 Kle/k59at721/S5S3ur2S+jHpTMyF1mVUPK49NqfWNyEUtSh64RqPJeFnflFZLf8wZrdWBVtEhE4 RQiFoLlljbgPs/3j0GUpLJvOVtLceXdXiTTxqRktQqWXJ1Mxq37smNlcfRTAOaejoltP8d3TCGYX f6Ltw1wSPQMf1ibigFK8w1Sd+hG2Fiw+XQtDfQPI+oQ2sschjhji+syO8yxSWE8xSU/CrPyb4jxG /h0xKhZbeSfLFtqFlqMFiEvdP9X6nN6kpKfWFCS7FiDyUU36dsjbJiKfkD5HREpJe+tH6fG5EkQl pFAkMY5CIbKYllA/nH8vw4bV6BptnJZ2UVtJdzXzxghrq59P1XqSat6SRJtWmyjAqJxV2KuxVStf +Us0T53P/Jk4Qgoy98i6tNeTzweZLy2imleVYFSEhPUYuVBK1oC21cKFD/AGu/8AU13v/IuH/mnF Xf4A13/qa73/AJFw/wDNOKsH1DQ/zUi/M2y8tW3mFn0S6tzfPetHH6scERCSqV2HL1GVVNKfEPfG lZx/gDXf+prvf+RcP/NOKu/wBrv/AFNd7/yLh/5pxV3+ANd/6mu9/wCRcP8AzTirJvL+jx6No1pp kcrTLapwEz0DNuSWNO5JxVMMVed+YIf0L56a4k+Gw8yxxhJT9lb+1TgYyeg9W3VeHjwbAUh5dp/k Xzlb21/DYW9zpNoHgaxt1vYlueTXI9cfWLdoy8IgZyFlNa9N8yjkj13Y0iE8r/mTPqJ+tTX0Wnz3 cEkYi1Nw8Fqtx6csb8ZEqxtqNty3Fa8jTBxwr9iaKIvdA/MY3OpxxT3wtFNwLF4rtGMqzXiSxAB5 4XURwoyEl1YVopwCUNlosp0C11DWNZ8uaLdp+90SOHU9eIkeYJNHGVtoWlYsWd5CZDUk/B1Namk1 ZpXrmBXYqsuIIbiCS3mUPDMrRyoejKwowPzBxV4jd6JfX/lufyc8Nrc6roM8ds63jzQqYIwTa3Ub wcpAzxcTXx5A5KEuE2nolkv5WazJBFNLc2t1rH6MlsptRn9QyfWJZUCyhirM3pW3ONWJr06VqLfG HwtHCoWP5O3sdvqUNzJZtLLYPY6feRiT1OfqyFHkVgeP7lkiNGb4RTem6c42968KMt/y612PXrDW JpbMSR3ct7fVdpEQTXLzvHCkkPUBhSUOh8QRgOUVS09F/LWFtQutW80sv+jai0dppTEbtZ2hf96P 8mWaR2HioU5Sqbee108+V9b+vxzvZmzAuBbFRKycm2j5hl5fPIjmyP0j8dysLqKPzpdrJfyhY9Lh lewYEQIvrzVnDcuPNuPE/D0Ub+EmLHr2Wb/BPlG+RrrVY4EtpZroxsbmVXsJIxNJGWduTtIpYciQ T1PXEqED/iSP/q3ah/0iyYKZO/xJH/1btQ/6RZMaV3+JI/8Aq3ah/wBIsmNK7/Ekf/Vu1D/pFkxp Xf4kj/6t2of9IsmNK7/Ekf8A1btQ/wCkWTGlROg3cuo+atMeKyuoYrVbh5pJ4WiUBo+CgFupJOIC C9EwodirsVYjc/8Ak2tO/wC2Bff9RlphVl2BXYq7FXYq7FUBruhabrmmS6bqMZe3loQykq6Op5JJ G43V0YVVhiryu48x6n5d8ynyrqEU/mGaOJZkv9LgeedInJCi9t4weD0FapXkKHiK40m0d/jrywDx a5lWTp6TW1yslfD0zGHr7UwUm0vn8432oa9Z+XdLtJtLudS5C31bWLea2gIAr+4jkVHmkpXip448 KLeneV/LGn+XtONralpppWM17eynlNcTMPikkbxNNh0A2G2FCb4q7FXYqxjzj5RXVGj1ewuV03Xr GNlgvnHKKSH7TQXK1HKInfrVD8S96qsKsfOUwt+esaTe2KrUG9it5rqyehpyjmiRiFP+Wq4KTaIX zvoEp4WZub6c/Zt7S0uZpDT2SM0+nGltfo+lat52Li/jbSPLsUhS609mpf3VN/Tm47QRN+0AxZht UYaW3p0MMMEMcEEaxQxKEiiQBVVVFAqgbAAYoSPzjKIvL+ryfpFtLKWoP15VdjB8TfvAI/jJ/wBX fIjmyP0j8dy27muh5j1FFntliXSY3SJwnrLJ6sw9SQleXpUA6mla7ZJij/LTyv5c0p5pIpZWs7dp JbcKIWYxKS0YUKvAn7NBSmKplirsVdirsVdirsVdirsVdirsVYjc/wDk2tO/7YF9/wBRlphVl2BX Yq7FXYq7FWAeYvzHkl8z3HkXy8qx+Zqxo17dcBbwJJEJmlVSazOsbrwjHVq1+FTU0rKPLHljTvL2 nG0tC8s0rma+vpjznuZ3+3NM/wC0zfh0GBU3xVLtf0DS9e0uXTNTi9W2loQQeLxuu6SRuN0dDurD FWE2P5gzeWtfs/JXmiU3+o3E8UGmapDwJnhmqsbXUYNY5VbirbUavId8KvR8CuxVSu7mO1tZrmSv pwI0j03PFAWNPuxVj1rcDzWeYPDQ4SOcNRzuJAAaSUJpGtfs/tdemKsmVVVQqgBQKADYADFXYqle qabL6w1LT2WLUIhR+W0c0Y/3XL/xq3Y4qt0DzJZ619YFujI9sUEoahFXFaAgkGhBH44qh/OXrf4d 1f0mtOf1UcFvvT+rg1beb1fg4H/K2wDmy6LbuCVvMeoyDTBKj6Ska3tX/et6sx+rUrx2ry2Ffiws Uj0Tzb5f1XyvDpel3SQahpsenQX+n27yI9tyeJWjVyQzKu6clY+BNcSrAPzS/MjXfKWsajZ6eBLD aaJDqkbXE96zetLqkVkQxS4QcBHKTSleXem2KEl0n83vN+ramnl7SltNR1S+vWttL1uK51GLTJI4 LcXF0xR5jMWhVgKBt67dqqWZeePMPm7yn5GtdUuEW51c3MUGp3EE2oyWNtC7NyuTGsnrlFAUEVrU 9TihLrL85NCWwvJLtdQvjpNtHcalqWmXLtYsZYklAgE91HcGokAoybNUE7VxSrj85/KKjUFnh1q3 m02KV54JJiWaSGaKF7eMpdOjy8riM0DUoevXFV6fm95fksBfR6frrQSXo062IuEBmnPr14A3ooq/ VXqX49qVxVleia9a6rpuha7pNxd/VNSngKLcSzEmOUlWV43d1r9/tgVn+FXYqp3FzBboHlbiCeKg AszMd6KoqWO3QYqxia21BvPlprwspv0XDpdzZPLRefqTXFvKhEQb1acYW/Zr7Yqye3uYLhOcLcgD xYbgqw6qymhUjwOKqmKuxVhvmrzhqC6k/l7y4sb6tGqvqF9OC0FlHIKpVRT1JnXdI60pu21KqpC3 lgXX7zV9U1HU7ht2kku5oIwx68ILZoYkHyXBaaQkfkmDTdTOteXrqTT9ZC09acm9jkFAOMguC8gB UcT6bqad8bWmbeUPODaw9xpupW62Ov2AVru0VuUckbbJcW7GhaJyO+6n4W9yhkuKpV5m8x2Pl7Sm v7sNISyw2trEAZZ55DSOGJT1Zj9wqTsDirzq+8vX/ma/h1bzPIsM8JBs7CwpEbdQSVVrxQtzIwrU lXRa9FwWmkT/AIR02MFrS51CznpRbiDULwOv/BSsp+TAjG1pH6Z5t1ry9dRWvmW5GoaJcOsUGuFV jmtpHPFEvFQLGUckATKBQ/aG/LDaKeguiOjI6hkYEMpFQQdiCDiqy3tba2j9K3iSGOteEahFqfYU xVUxV2KuxVRt7Ozti5t4I4TIayGNFXkfE0Ar1xVJ/OUJl8vaun6OOqB7UAWKM6tPu37usZ5j/Y4B zZHk1Elr/j26cRTC6/RVurTEj0DH9YmKqBx5cw1Sfi6U2wsUPrGgaPpVnqGp6dphN7dz2st61tG0 s8oinQ7KKsQq1PFfuxV5x5w8r+XfNd/c32o6b5jilutPj0uRbeydVEMV4l8rLzhkPP1YgCa049q7 4rSE1byH5S1HVr/Vxpvmay1G9uYr6O5s7WWF7a4jjMbSW5ERKmUGsnLkCQOmKpxfW31vy3baGZvO EJtn9Q6rDBKt9L9uqyy+iVZf3nTh2HhgWmIRfk95DgW7S207zNBDeW4tpo1sUY8RGsZZZZLV5VLc eTUfjy7U2wqnDeQ/JhnsZF0XzBHBpupyatZWSWLLbxvMY2e3WMQ7W/OFW4ePem2KoK2/LDyTErRT aV5iu7SS9TUJrSfToykkqCcBZWS1SSRP9KenJyRtQjFWa+W0FraeX/L1jYay8GnzwIl3qNq6cYYK kepLwjT4VAUbeGKvUMVdirDLrzoll5pSxmtkla44qknrUlSJriWAiKHgeaqbcyyNyGx78RmLl1PB MRp2Wn7P8TCcl8r6bbAHne13Q25pxF508syywxR3oaS49L0V9OUcvXEJj6r+19bi/wCC9jSY1MCa vn+mv1hpl2fmAJMeV9R04r/3Mvl7kNcea/LyxXOrQXarDpsgi1R2V4wIjI0JZuaiqxyKxDio+FgD 1yePLGd0eTVm008VcYri5fj4hN4tc0SWNZItQtpI3AZXWaMqQRUEEHpTLGhBa75z8s6Jpk+o3+o2 8cMKkhfVUs7AGiIoJZmalAAMVeVXdtrMf5Y3l3YmZ/MGpwnUZ5LXl67XV0Vlfhw+L4QeC0/ZAyWO uIXyT0Y3p+rfmfaxQ28cN8yzujQetbvPwQXsvqq00yGWn1bhT1+LHsK5cYwKBbdr5p/M2XyzYmSH UE1pZ7gXn+40gsPRdrRWDQiPg8qhXZPsjqRiYQ4ule9Fmmf6zJPp99oXmEBY7qyu4La84k8TbX7r bzITtVVd0kFf5cxgyL1PCh55r8g1P8wWSQlrfy/Zx+hGQKC6vi5kk+awxIo/1mwFIeVav5J89/4s vdV0y0MQF+93DdxTQwyywt6Q9L1PV5MpCOPTdVUVryNaZlRyR4aLGjaNstK/NS1vlu7gXlzAfUY2 y3kJYGVbwICrzKn7tpoa702HGvEZEygR+PJO7JfJOia8fLl1p/mlZZVugsRtruYXUvE26JOWlDyV WSbmyrX4QfoFeUxJ2SGe/lpf3V15Rt4byX1rzTZZ9NuJjWrmzlaFXJPUuiKxPvkEMpxVBXusWFle WdncOVnv2ZLZQpIJWlakdPtDFUEvnDQmhSYTNwe6+pKeDf31AadOnxdcVTrFXYqxrz79T/wtrn1o T+j9THrNb09Tjyb+75bcsiObI/SPx3IqKcnztcwfXXIGmwP+jqNwWs8w9cNXjyanGnXbJMUbrV3c 2mnma2KCYyQxqZFLqBJKsZJUMhOzeOKpd9e17/lotf8ApHk/6r4LRbvr2vf8tFr/ANI8n/VfG1t5 g/8AzkroC6JLqxkfhFqH6La1+pr65kKFxKF+ucfSop35Vr2wpRkH58SvfaraXGlahZHRIGudUmud PRI4EELzRhyL1iDMsdIwR8RIxVk/kvz/AHHm/wAvw65pc0UdtM8kbQ3FqyTRvE5RlkVbhwDtX7XQ jFU8+va9/wAtFr/0jyf9V8FotTfWdYt7mzE728sNxcRwOqQujUkqKhjK42PthSyPFXYqw288nnUd dlaa9WGIGJ5LYRVkkSG7lu43imLjh8c3B/gJ26jlmLm03HK722+zd2Om1/hY+HhuXqo3t6gBuK35 d6Fh/LCaB7eaLVQbi19H0We3qn+jG09LkolUn4LBQ3xCpJIp0yoaIgg8W48u6vPycqXbAkCDDaV/ xfzuO+nfM1+lcPIdr9Wu9Iv7k351cencrGpt1jsvrMt1Ip4u7fHJOyV5VodvsnL8Gn4CSTf9t/pc PWa3xgABwged78Ij3DpEJxD+XH5fQxLEnlrS+CgLvZwMSAOPxMyEsaHqcyLcBA+YPym8g6vpdxZ/ oKxtZpFb0bq2t44JY5NyrB4lVtmNadD3GG1eXa/da5ceR9EbTPrqXtrS3vtPs1nDvNbIYZYZJbb9 5DxlU0J+H+bJ4qs2p5IXU9V/M61RxbLqUgGoMHC21tI8dhFFCxCP6FHd2uGAajE+nsNmyYjA93JT ayXWvzTh06xUNeG7vLS2mllewWT0ZvrEn1kMkUI48YAnwMOR/Z+LDwwv9q7sgtrnV9V8uaBpmpJN +ltU1GGOYTqscrRWtz9YllCCODihigovKNSKiu+5pmAJbL0e3DpkVed6pH9R/MW/STZdZsre5tWO wL2haGdB7qrxN9OApDzTR/J/nPTlR7a1ngjhubucQi8WOaetozQfWvRlWGX/AEoIoY7kfbAWuZMs kSilmkeV/wA0Le2vvrk17JdW8dv9Tk/STyCd1vBLKVV5goJtx6fxqoP0k4ynD8BABTzyVp/nTT9Z urzzA9ydPkgnkke7uleOAmUSIkaJPKhpHsxaMcaUViuQySiRskW9H/KuJ/8ACS3zo0f6VurrUURu ojup3ki/5JFcqVl+KuxV2KuxV2KpB5yuHt/L2ryx6gdNeO1DLecXYQbt+8pGGY/QuRHNkfp/HkjN Q0JLzUrTUI7uezntiBILb0lFxGGDiKcvG7sgINArD7RyTFizeUW8vy6zrFzrdxeRandWTehclEih 43EY5fDRS5rTlRduteuKo/8AT2h/9XG1/wCR0f8AXAinfp7Q/wDq42v/ACOj/ritPnZvyHnbTpUP mDSPrkmnlAgumEQ1A3Zf1eQjrwFqeNeNeXam+G0sz82+S77WbrzobTXNJt7fza2jx8muSZIoLBCL moCU5MaBBWhFa8cFqnv5Y6IPKEmvWt7r9hf6df3v16wlWWOOXnKlLj1IkVIo6so4iMkfLFWc/p7Q /wDq42v/ACOj/riikJe6vpM95pUMF7BLM9/BwjSVGY0JJoAa9BXFIZxhV2KqNzaQXKhZQaqao6sU dT0qrqQw222OKsZmutXXzzaaANRl+oz6Xc3rnhD6nqQ3EESgOI+nGZvf3xVktpZW9qrCJTyc1kkY lnY+LM1WP04qr4q7FWAeZfLWsaTq9xr+gW5vbK9Pqazo0dBKZQKG6teRCmQqoDx7c6VHxdVUutfO Xli4YxnUIra5XaS0uz9WuEPcNDNwcU+WRplaXeYPzR8k6JbvJNqUV1MB8FraMs8jH+X4TxX/AGRG EBBLJPy40aXUBF511N0ku9Stl/RltE3OK0tJKSBFYgcpH2MrU6gAUAwoZ7iqReb/ACumv2EQhm+p 6pYyfWNMvwORilAKkMNuUcikrIvce9MVYBb+edOtrmTTfMRTSNUt3MUxkato7KaFobnZOJ8H4sPD BSbR9x5w8qW8XqzaxZqhFVpPGxb/AFVUlm+gYKTaB05Lj8wLh7O1D2vlaBwNSnkBjnvB1EMcZo8c LU+NmALD4QOpyQCCXrMMUcMSRRKEjjAVEAoABsABihdirsVdirsVdiqRecBcN5f1ZYPqrSG1Hppe +mYOVW/vvV+Dh/rbYBzZdE9wsUDrb2K6bIL62F5ayNHG9syo4cySKi1WQhSAzA74qxyfTvJFvBJc XHlizhghVpJZZLeyVERRVmZiQAABUk42qB0m7/K3WfU/RGkaVqPo09X6ounT8K9OXpu1OnfFUx/Q /k//AKlS1/6RrP8Arja279D+T/8AqVLX/pGs/wCuNrbv0P5P/wCpUtf+kaz/AK42tu/Q/k//AKlS 1/6RrP8Arja2qWsPlTT761kh8vw2U8sqww3MdvbKyu9QPijPIV6bYqyrFXYq7FWI3P8A5NrTv+2B ff8AUZaYVZdgV2KuxV2KsB/PHRtM1H8udUe8t0lktRHLbSkfHG/qopKt1FVJBwhWWWXlvQLLSo9J t7CBdOiRY1tjGrIVUADkGB5HbqcCsUuLa5/L+5kvrCN5/JE7mTUNPjBZ9MdjVri2Qbm2J3liH2Pt LtUYVZzbXNvdW8VzbSrNbzKJIZoyGR0YVVlYbEEYFSL9Mvr1LbRZGS1P+9mo0I4L/vuKvWRh/wAC DXriqZejo2mafHayGG3s2/cqszKFdmB+Elz8TNQ/PFULDb+TbCWeeGPTrWWBgLqRBBGyM9QBIRTi Tv1xVdqukyySpqmlOsWpxLsf91zx9fSlp2PZu2KrtI8xWWozNahXgv4k53FpICGjIbiQT0O9PmCD iqa4q7FXYq7FXYqlmu6PFrGm6hpsyqIry39H1GDEVPKnJVaNiFNDQMK+OAc2R5LI7bzYFs/U1KwZ kkJ1ArYzKJYuQ4rCDeN6LBeQLN6grQ8dqEsWOi08+Q3OsSa/f2t3o8l1ZfoiKCD0ZEAnj51o8h4/ 6zMT1+EbYqt88W1xdeSvMFtbRtNcT6beRwwxgs7u8Dqqqo3JJNAMCHzp5f8ALX5jLc2M9npepW7/ AFXSNLluVt7jRCqCdfXglMAad0AH7y7pUAdOgwpZHaP+bJ0qNbn9P/plLWBdBKLOIRdrfSi4GoE/ C6iPgFaf4Wj+IbnFULaWH50jzPDp891ra6RHeXFhLfKblqwWFx9bS6BY0YXETekrE/HTjXtiqy3l /M2KXQ47i18w3NpDdXYvb31tZh+sqUtTE8kMayzQhTzohHpk8uJpirM/yli8/wAXmiV/MX6SFjdW V3JGLx7qaIzJqLIhcTgJbSCBRwjTZ0POvbFBen6p/faZ/wAx9v8A8SwKGW4UuxV2KsRuf/Jtad/2 wL7/AKjLTCrLsCuxV2KuxVgf536pZWH5dagl1J6ZvWjtoCRsZOXqgE9vhibCFZho+rWOr6ZbanYO ZLK7QS28hBXkjdGo1CK++BUYQCKHcHqMVYFcW9z+X9zJfWMbz+SZ3MmoafGCz6Y7GrXFuo3NsTvL EPsfaXaowqyvQ9O0G2tRcaNFCttdqsizQnksiEVRg1TUUO2BUXeWFleoiXcKTpG4kRXFQHWoDCvf fFVCXQ9HlFwJLOJxdsrXNVH7xkJKlvGlcVRyqFUKoooFAB4DFUFZ6JpNndy3lrapDcz1EsiChap5 Hbp1xVG4q7FXYq7FXYqpKF+tyGh5emlT2pV6UyI5sj9I/Hcq5JihNW0yHU7CSymkkiRyjCWBuEit G4kUq3+soxVIv8BQ/wDV61X/AKSF/wCaMVd/gKH/AKvWq/8ASQv/ADRirv8AAUP/AFetV/6SF/5o xV3+Aof+r1qv/SQv/NGKu/wFD/1etV/6SF/5oxV3+Aof+r1qv/SQv/NGKqlp5HtIL23upNS1C6Nt IJY4Z5w0ZcAgFlCrWlcVZJirsVdirEbn/wAm1p3/AGwL7/qMtMKsuwK7FXYqk/mXzXpXl62ikvTJ LcXLGOysbdPVuZ3AqVijBHQfaYkKO5GKsN1bVPOPmGxltLvSNJttMuFpJYagZb9zQ1HP0jBGp2r8 LNTxxtNIiDzf5z0lB9f0e01LT4lA/wBxBeGeNFH7FtMWVwB0Cyg+AxtaZnoevaTrunJqGl3C3Nq5 K8gCrK67MjowDI6nqrCoxQjyARQ7g9RirynXp/MnkHXre28sadNd+VtQkW4vYWiLWmnVlH1lopVP 7qNoyzsjAKp+JTTkuFU5m/MTV9VJ/wAKaYklj+xrGpM8MMnvBAqmaRfBm4A9q4FWf4h/MmMhyNGu lB+KAJdWxYe0vO44/wDAHBaaTny157s9WvDpV9ayaRriqZPqFwVYSoOr28y/BKo70ow7qMKGT4q7 FXYq7FXYq7FVNT/pMg5VoiHh2FS2/wBP8Mj1ZH6fx5KmSYuxV2KuxV2KuxV2KuxV2KuxV2KuxViN z/5NrTv+2Bff9RlphVl2BXYq07pGjO7BEQFmZjQADckk4q8t8utLq803m2+Ba71YVsVbf6vp9a28 KeHNaSP4sfYYCkMbsfzD15tUexuLG0klbUk08QrLJEYVmWWSGQyBbhJ1eOBjVeBB2p3FxxCr8kWt 8t/mxNrGs6Zp0mj/AFcanGJY3WaV3VGEvxcJLeAMoMFGdGKio3JqAzwUCb5KJMqSc+XPN9jqlvVb DXJk0/V4RXiZpBS1uAvQMGHpMe4YeGUhJen4UMA8+StrOv2nlg1Ol20KalrCdVmrIUtLd/8AILxP I4PXiB0OJUJB5m8y6npOvaNYwRwLY6g/oyTyhnb1mYLFEAjKYw+49Tiwr2yUIAglJLHf+Vu36RTS zaGgjhtJrwmO5mk+GGea24lha8E5S253dgKEUq3w5Z4A7/x80cTI7dx5x8q22oon6Pv+TzadcI/q GC4gkZI5Y5OK8kYpX7PxIad8qlHhNJ5vQ/Jmvvr/AJasdUlj9G5lQpdwjolxCxinQVJ2WRGAwITr FXYq7FXYq7FVNa/WH3WnBKAU5dW6+3hkerI8lTJMXYq7FXYq7FXYq7FXYq7FXYq7FXYqxG5/8m1p 3/bAvv8AqMtMKsuwK7FUu8yQT3Hl3VLeBS881pPHEi9S7RMFA+k4q8e1XzXqOi+SNB1DS44Xtpbe A3NxKrSiKEQBuYhR4nff7VG+HwOTxwEjuklJ5vP+laWodfL2nIz6qLeCWOYRq0wiVnvD/o3JaJco NgzUZvD4rPCJ6nki3ad5+0zSrKK707yna2txqFvaTxwWLxo0i3VzJAkbMIIviUx18N6e+JxEncqC yO710675Q0+6RFt7y91Kygjt1d2Mc8eoR/CxeOJwyemWaqClO/U0yjwmk3s9nHTAh51cI0X5h+YV k2ee30+eGveLjLHt8pI3wFIee2Xnya5v7aXWdH06bUILi4jaWpSWyiggN0xWQpciXlEjFWR1BNNh 1zIOKhsSi0Dpvn3QNWie9k8o6cVtoo/Ub1I5JES8vWtXjFbYD4mleRgGowbxY5I4iNuI/gIBZf5T /MB9f1eawk0/6hGqztazPKztP9Xm9FzGvpKlB+18fIeBHxZTPFwi7ZAs1/KsFvL17ON4bjVdRlgP YobqQch7EgnIIZjirsVdirsVdiqmoP1mQ8aAog5+NC230fxyPVkeSpkmLsVdirsVdirsVdirsVdi rsVdirsVYjc/+Ta07/tgX3/UZaYVZdgV2KuxV5FqmiaZ5f1X9D67ZQT+XLm4efy9e3ESSQQSysXe zkZwRG4YkxE/aX4QaimGyOSU5m0HQ5zIZ9OtZTLzMvOGNuXqBA/Ko35CJAfHiPAZHiPemlG68v8A lf0I3u9NsfQs4mjiaWCHhDDQ8lUstEShNR0w8Z70Uo+S9Ig13WLPUrO1S18paIXbSI0jEUdzduCp nSMAD0olZghp8TMW7DH3oeoYqw3z7oWofWbPzNpEDXN/pyPBe2UdPUubGQhnSOvWWJ1Dxiu/xL+1 iqQaPY+TdR0xJNMsrGWwcyHhHBGFDyIY5QycRxdkYo4IrTY4mUu9KL/w9oH+k/7jLT/TAFvP3Ef7 4DoJPh+MD/Kx4z3ppJby10+HUToflKwtYfMt5EIpLi3hjT6nbEAetO6BeKqo/doT8TUoKY2TzKHq OgaLZ6JotnpNmCLayiWGOvU8RTk3uTucUI/FXYq7FXYq7FVJeH1uSlefppU9qVelPfrkRzZH6R+O 5VyTF2KuxV2KuxV2KuxV2KuxV2KuxV2KsRuf/Jtad/2wL7/qMtMKsuwK7FXYqo3tlZ31rLaXsEdz azrwmglUOjqezK1QcVeWfmR5Nm8r+UrzWfKGp3WmS2HBlsHk+s2hRnCMqx3AmKfbqOJp7Yqjr78j 9O1rSIrbzDruq3l3wQzyRzpHD6wHxNHCI/TA5dKrWnfFUy8paneeWbiz8k+YGH7uMQeXdXA4xXkE S0WF+yXMaChX9sbjCrOcCobUdRttPt/XnJ3ISKNRV5HbZURe7HFWDyflXHqerz69dX1zpWoXp5zR 6a4hZRtxSR/iSUgAV5Id8VRV1+V/1mH0pfM+ssgFFCyWsO3u0FvDIf8Agq4qqeVvL9r5GWSy+F9N vZfU+v8AGjLM1BxnJLMQ3ZyevXrirM8VdirsVdirsVdiqmp/0mQcq0RDw7Cpbf6f4ZHqyP0/jyVM kxdirsVdirsVdirsVdirsVdirsVdirEbn/ybWnf9sC+/6jLTCrLsCuxV2KuxVh35wf8Akt9b/wCM Uf8AyeTEKzHFUu1/QNL17S5dM1OL1baWhBB4vG67pJG43R0O6sMVY9oGv6po2qReVvNMvq3MtRom tkcUvkX/AHXJ2S5QfaX9vqMKo7y1pmuGdrzzCqy3sQ4WjhwyorfbKoqgKzd2rWm2wGBU11iHWJYY RpU8dvMsytM0o5BogDyUbNuTTFUFc2nm1hqP1e+gQyPGdN5JX00BPqB/gNSRSnXFU4eBJrYwXKrK rpxlUiqtUUOx7HFUj0Kx8wWmrXEdy3+4ZIylihkErCj1WpKq2ykj5UG9K4qyDFXYq7FXYq7FVNa/ WH+zTglOnLq3X28Mj1ZHkqZJi7FXYq7FXYq7FXYq7FXYq7FXYq7FWI3P/k2tO/7YF9/1GWmFWXYF dirsVQOta5pOiWD3+q3SWlohCmR67s32UVRVmY9lUEnFXl/5h6hqPnvy+2l6bol7aQ+os1tqN3NH ZtzUMtfQ/eysjK5FHCHG1pOPL/nVfLekWmm61o17ZWNmiwjU1lTUY6KN5Z3jCTLU7s3pU+WKvQLO 8tL21iu7OZLi1mUPDPEwdGU9CrDYjFUJr+gaXr2ly6ZqcXq20tCCDxeN13SSNxujod1YYqw6289T +Ub6Dy35yleeaWSKLR9ajWou4pXEaeuo+xMhPx9mHxDvhVMdQ/MvT/rMtnoNjca/cwsUmltSkdpG 46q11Kyxlh3EfIjvgVDDz95pjIe58qloOri0vopZQO9ElS3Vj7c8bTTIPLfnDRPMKSCxkeO7t6fW 9PuUMNzCT09SJt6Hswqp7HFCdYq7FXYq7FXYq7FVNR/pMh4U+BP3m++7bfR/HI9WR5KmSYuxV2Ku xV2KuxV2KuxV2KuxV2KuxVgF/on5gt+bFpq9qbU+W1tGt3uHp60UTvDJLCEqCzvJb1VqEBWO9QuF Wf4FdirsVeWWE3+J9VbzVefvLUM8Xl23bdIbYMV+sBT/ALtuKcuXUJxXxwEpCFXz3bLZT3EtlM0i apPpFta25WSSaWFmAZeZiVeSxlqFtvE5Pw9/ha2q6D570PXdQ+pWBdm9BbgSuYkB5pHJwCF/VLKs yliE4jpyrjLEYiyoKM0Sc+VPM9rbQHh5d16VoWteiW1+wLo8Q/ZScKyso250P7RyIKl6Zih5l+aW j6N5h8w6VoctlC94kRvL/USg9eKzR+McMT05KZpa7g/CFam5xtaWXGpW2jajoWh2toqW+oNNBFwI RYVt4GmFECnlXhTqMRGwT3JSOX82vL0QgZ7W7VbxDLp7uLdFuIlLBpEZ5lVFXgT+9KGnbLPAK8Se a7o8l4INX0iQQa/YAyaZeKdmqKmCUj7UMvRh9I3yoFSz3yzrtvr+g2WrwKY0u4g7RN9qN+jxt03R wVPywoTPFXYq7FXYq7FVJeP1uTry9NK+FKvSmRHNkfpH47lXJMXYq7FXYq7FXYq7FXYq7FXYqhdU 1TT9K0+fUdRnS2srZC887miqo/EknYAbk7DFWBy+ZfOuvN6tgR5b0k/3LSxJPqMo/mZJOUMAP8rK 7eNMbTSH/QWqfa/xNrPq/wC/PrEfX/U9L0/+FwWtImHzN5z0E+pqBHmTSgazSRRLBqMS/wAwjipD cBQPsqqN4V6YbWmd6Xqmn6rp8Go6dOlzZXKh4J0NVYH8QQdiDuDscUIfzM0y+W9WaGvrCzuDHx+1 yETUp71xVhHlcRDy1pIip6X1K39OnTj6S0/DIlk8x1TXfItjqmvpqWkusNpePJP9X1C4a6e4aRT6 8dsWiWIFpjV1kHdehzLjGRAo/YwsMq0ZvJEXnGC103T3h1VbKJ45vVRIlgkhAULC8wZm9OBVZkiN KDkcqlxcO52ZbWnfnHl+iYDHT6yNQ076r0r6v16HjSv4+2VBS9SHTCh5zPyP5heY/U+0INOEdf8A fPCUint6hkwFIYr+aF/o9odH/SNkl00k0wt55L6bT1gYRVZjLCGb4l+HLcIJuv1okx+S5/KibT7q aTSLporR47Uq07pw+szzwcIXkuUWGItFIX+JF4nfuBZWS+aNnqdg0L2Ns8CenC0SGKOqtxUqOI5I XU0HdWI98xjzZov8qq/4fvgv9wNW1IW/8vH63JXj7c+WFizLFXYq7FXYq7FVNSfrMg5VARDw8Klt /p/hkerI8lTJMXYq7FXYq7FXYq7FXYq7FXYq8780Tfp3zoumyGul+XEiuZYt6S6hOC0XLsRBD8Y/ ynB7YlIYB5m/NLWtE826jp/1S3m0uw4irB0kdmsjdcfVDvRmZeK/uSPEjL4YQYg9f2oMkXqP5tpZ 6h9UGl+olYR6wnoP3y2jHb0z9n674/s++0Rgsc/xuvEnB88lfNjaG1kDbi5js0vEm5O0stp9bB9H gPgC7Fg5+WR8P02m078qznQvOb6Uh46V5hSW6tou0V/BRpwo7CeI8/8AWUnvkApei4oeWaVEfLmp P5SvKxpEXk0Cd9luLInksat0MltXg69eIVuhwFIX33kzy1f2N5Y3dn6trqFz9du4/UlHOeirz5Kw ZdkGykDJDJIG1pdp3lLRNNvEvLNJ0uFjWEs11dSB0TlwWRXkZZOHqNx5g8e1KDAZkrTWlRf4q82W y237zQvL05nvLkV4TX6KVigQjr6PLm/blxHjiApen4oYH+YVnPpepW3nCFGltLeA2WuRoCzLac/U juFUbn0JGblT9hie2KodrLStSm0/VKLcPacptPuEclQJ4yjMvE8WDI3euAEjZklDflz5QL81tJYm 5rKfRurqIeokrzI9I5VHJJJWZT+zXbJ+LJFBGa1qj6Za2+m6Yhu9auwLfSrNnaR3YCnqysxZzHGP ikdj9NTkOas58qaBD5f8vWOkROZPqsdJJj1kkYlpJD7u5LYUJtirsVdirsVdiqmtfrD/AGacEp05 dW6+3hkerI8lTJMXYq7FXYq7FXYq7FXYq7FXYq820/mPMfmtZf7/APSgLVIJ4GxtvSO3b06UwFIY lr/mvy9pHm2/F/oEHqW1r68uqssQurhPSFVgDoPV4j4G/eigrtQZdGBMdiglX8war+X2i3TaJdaH FP6NrJfG3gtLd4ljrzkXixUBytv6hFNwlewwRjM72ppbonmryJJ5qTTdK0dIL9g0cGoJDZwo8cJe I+k/qLK6D0WWiKdh0phlCXDZK2LZPqPI+ZfKaxECf9KMwJ/32LG59Xx6qafMjKQkvSsKEu17y9o+ vWBsdVtluIOQeM1KvHIv2ZIpFIdHHZlIOKsXXyD5ltGKaf5lEtqBSOPU7MXUij/jLBNZlvmwJxpb cPy41K+Yrr2vy3FmTV7HTofqEbjusj+pPOVI6hZFxVmOnadYabZQ2NhAlrZwKEhgiUKiqOwAxVEY q4gEUO4PUYqwu8/LO3hnkuPLWozaE0rF5bNUW4sWZiSzC2cj0yT/AL6dB7YqpSeSPOkwCP5ltYE/ ae10wrL9BmurhP8AhMaW078t+S9F0GSW5txJdalcALc6ndv6tzIB0UvQBVH8qAL7Yqn2KuxV2Kux V2KuxVTUf6TIeNKog59jQtt9H8cj1ZH6fx5KmSYuxV2KuxV2KuxV2KuxV2KuxV555zh/QHmiPzAw 46PrCRWeqTfswXURItpnJPwpIrekx6AhK9cSkJfqfkfytql7Pe6hZfWLm4jMUjtLNTiyCM8FDhUJ UU5KAcIySAoLSmPy+8o+uLh7EzXQIP1maaeaagRo+Jlkdn4cHIKV4nuMPiyWlSw8j+WdPubO5srV 7eawi+r2xjnnCiIO78WX1OL/ABSsfjB64Dkkea0jPJsP+IfNj6+g5aNoyS2emTfsz3UpAuJkPdEV BGp6E8qYAgvR8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqkvD63JSvP00qO1KvSnv1yI5s j9I/Hcq5Ji7FXYq7FXYq7FXYq7FXYq7FVG+sbO/s5rK8hS4tLhDHPBIAyOjChBBxVgM/krzVoPw+ XJ4tV0lf7rStQkaOeBeyQ3QWTmg/ZWVagbcsaW1D6150px/wld+r4/WbP0v+C9Xn1/yOn3YKTarF 5K816/RPMM8elaS397pdhIzzzKeqTXREfFfFY1FenKmGkW9AsrK0sbSK0tIlgtoFCRRIAqqqigAA xVWxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtBTzLcjQgDj2FK7/TXAm9m8KHYq7FXYq7F XYq7FXYq7FX/2Q== xmp.iid:0F9190091A0CDF1198A8D064EBA738F3 xmp.did:0F9190091A0CDF1198A8D064EBA738F3 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf uuid:7385d860-ddab-4cd9-b389-94efa1ea2700 xmp.did:0AFC8385150CDF1198A8D064EBA738F3 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf converted from application/pdf to <unknown> saved xmp.iid:D27F11740720681191099C3B601C4548 2008-04-17T14:19:15+05:30 Adobe Illustrator CS4 / converted from application/pdf to <unknown> converted from application/pdf to <unknown> saved xmp.iid:F97F1174072068118D4ED246B3ADB1C6 2008-05-15T16:23:06-07:00 Adobe Illustrator CS4 / saved xmp.iid:FA7F1174072068118D4ED246B3ADB1C6 2008-05-15T17:10:45-07:00 Adobe Illustrator CS4 / saved xmp.iid:EF7F117407206811A46CA4519D24356B 2008-05-15T22:53:33-07:00 Adobe Illustrator CS4 / saved xmp.iid:F07F117407206811A46CA4519D24356B 2008-05-15T23:07:07-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F117407206811BDDDFD38D0CF24DD 2008-05-16T10:35:43-07:00 Adobe Illustrator CS4 / converted from application/pdf to <unknown> saved xmp.iid:F97F117407206811BDDDFD38D0CF24DD 2008-05-16T10:40:59-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to <unknown> saved xmp.iid:FA7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:26:55-07:00 Adobe Illustrator CS4 / saved xmp.iid:FB7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:29:01-07:00 Adobe Illustrator CS4 / saved xmp.iid:FC7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:29:20-07:00 Adobe Illustrator CS4 / saved xmp.iid:FD7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:30:54-07:00 Adobe Illustrator CS4 / saved xmp.iid:FE7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:31:22-07:00 Adobe Illustrator CS4 / saved xmp.iid:B233668C16206811BDDDFD38D0CF24DD 2008-05-16T12:23:46-07:00 Adobe Illustrator CS4 / saved xmp.iid:B333668C16206811BDDDFD38D0CF24DD 2008-05-16T13:27:54-07:00 Adobe Illustrator CS4 / saved xmp.iid:B433668C16206811BDDDFD38D0CF24DD 2008-05-16T13:46:13-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F11740720681197C1BF14D1759E83 2008-05-16T15:47:57-07:00 Adobe Illustrator CS4 / saved xmp.iid:F87F11740720681197C1BF14D1759E83 2008-05-16T15:51:06-07:00 Adobe Illustrator CS4 / saved xmp.iid:F97F11740720681197C1BF14D1759E83 2008-05-16T15:52:22-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FA7F117407206811B628E3BF27C8C41B 2008-05-22T13:28:01-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FF7F117407206811B628E3BF27C8C41B 2008-05-22T16:23:53-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:07C3BD25102DDD1181B594070CEB88D9 2008-05-28T16:45:26-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:F87F1174072068119098B097FDA39BEF 2008-06-02T13:25:25-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F117407206811BB1DBF8F242B6F84 2008-06-09T14:58:36-07:00 Adobe Illustrator CS4 / saved xmp.iid:F97F117407206811ACAFB8DA80854E76 2008-06-11T14:31:27-07:00 Adobe Illustrator CS4 / saved xmp.iid:0180117407206811834383CD3A8D2303 2008-06-11T22:37:35-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F117407206811818C85DF6A1A75C3 2008-06-27T14:40:42-07:00 Adobe Illustrator CS4 / saved xmp.iid:921461FF4F63DE11954883E494157F9B 2009-06-27T22:56:11+03:00 Adobe Illustrator CS4 / saved xmp.iid:0AFC8385150CDF1198A8D064EBA738F3 2010-01-28T16:32:48+02:00 Adobe Illustrator CS4 / saved xmp.iid:0F9190091A0CDF1198A8D064EBA738F3 2010-01-28T18:21:55+02:00 Adobe Illustrator CS4 / Print False True 1 792.000000 612.000000 Points MyriadPro-Bold Myriad Pro Bold Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Bold.otf MyriadPro-Cond Myriad Pro Condensed Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Cond.otf Cyan Magenta Yellow Black Default Swatch Group 0 White CMYK PROCESS 0.000000 0.000000 0.000000 0.000000 Black CMYK PROCESS 0.000000 0.000000 0.000000 100.000000 CMYK Red CMYK PROCESS 0.000000 100.000000 100.000000 0.000000 CMYK Yellow CMYK PROCESS 0.000000 0.000000 100.000000 0.000000 CMYK Green CMYK PROCESS 100.000000 0.000000 100.000000 0.000000 CMYK Cyan CMYK PROCESS 100.000000 0.000000 0.000000 0.000000 CMYK Blue CMYK PROCESS 100.000000 100.000000 0.000000 0.000000 CMYK Magenta CMYK PROCESS 0.000000 100.000000 0.000000 0.000000 C=15 M=100 Y=90 K=10 CMYK PROCESS 14.999998 100.000000 90.000004 10.000002 C=0 M=90 Y=85 K=0 CMYK PROCESS 0.000000 90.000004 84.999996 0.000000 C=0 M=80 Y=95 K=0 CMYK PROCESS 0.000000 80.000001 94.999999 0.000000 C=0 M=50 Y=100 K=0 CMYK PROCESS 0.000000 50.000000 100.000000 0.000000 C=0 M=35 Y=85 K=0 CMYK PROCESS 0.000000 35.000002 84.999996 0.000000 C=5 M=0 Y=90 K=0 CMYK PROCESS 5.000001 0.000000 90.000004 0.000000 C=20 M=0 Y=100 K=0 CMYK PROCESS 19.999999 0.000000 100.000000 0.000000 C=50 M=0 Y=100 K=0 CMYK PROCESS 50.000000 0.000000 100.000000 0.000000 C=75 M=0 Y=100 K=0 CMYK PROCESS 75.000000 0.000000 100.000000 0.000000 C=85 M=10 Y=100 K=10 CMYK PROCESS 84.999996 10.000002 100.000000 10.000002 C=90 M=30 Y=95 K=30 CMYK PROCESS 90.000004 30.000001 94.999999 30.000001 C=75 M=0 Y=75 K=0 CMYK PROCESS 75.000000 0.000000 75.000000 0.000000 C=80 M=10 Y=45 K=0 CMYK PROCESS 80.000001 10.000002 44.999999 0.000000 C=70 M=15 Y=0 K=0 CMYK PROCESS 69.999999 14.999998 0.000000 0.000000 C=85 M=50 Y=0 K=0 CMYK PROCESS 84.999996 50.000000 0.000000 0.000000 C=100 M=95 Y=5 K=0 CMYK PROCESS 100.000000 94.999999 5.000001 0.000000 C=100 M=100 Y=25 K=25 CMYK PROCESS 100.000000 100.000000 25.000000 25.000000 C=75 M=100 Y=0 K=0 CMYK PROCESS 75.000000 100.000000 0.000000 0.000000 C=50 M=100 Y=0 K=0 CMYK PROCESS 50.000000 100.000000 0.000000 0.000000 C=35 M=100 Y=35 K=10 CMYK PROCESS 35.000002 100.000000 35.000002 10.000002 C=10 M=100 Y=50 K=0 CMYK PROCESS 10.000002 100.000000 50.000000 0.000000 C=0 M=95 Y=20 K=0 CMYK PROCESS 0.000000 94.999999 19.999999 0.000000 C=25 M=25 Y=40 K=0 CMYK PROCESS 25.000000 25.000000 39.999998 0.000000 C=40 M=45 Y=50 K=5 CMYK PROCESS 39.999998 44.999999 50.000000 5.000001 C=50 M=50 Y=60 K=25 CMYK PROCESS 50.000000 50.000000 60.000002 25.000000 C=55 M=60 Y=65 K=40 CMYK PROCESS 55.000001 60.000002 64.999998 39.999998 C=25 M=40 Y=65 K=0 CMYK PROCESS 25.000000 39.999998 64.999998 0.000000 C=30 M=50 Y=75 K=10 CMYK PROCESS 30.000001 50.000000 75.000000 10.000002 C=35 M=60 Y=80 K=25 CMYK PROCESS 35.000002 60.000002 80.000001 25.000000 C=40 M=65 Y=90 K=35 CMYK PROCESS 39.999998 64.999998 90.000004 35.000002 C=40 M=70 Y=100 K=50 CMYK PROCESS 39.999998 69.999999 100.000000 50.000000 C=50 M=70 Y=80 K=70 CMYK PROCESS 50.000000 69.999999 80.000001 69.999999 Grays 1 C=0 M=0 Y=0 K=100 CMYK PROCESS 0.000000 0.000000 0.000000 100.000000 C=0 M=0 Y=0 K=90 CMYK PROCESS 0.000000 0.000000 0.000000 89.999402 C=0 M=0 Y=0 K=80 CMYK PROCESS 0.000000 0.000000 0.000000 79.998797 C=0 M=0 Y=0 K=70 CMYK PROCESS 0.000000 0.000000 0.000000 69.999701 C=0 M=0 Y=0 K=60 CMYK PROCESS 0.000000 0.000000 0.000000 59.999102 C=0 M=0 Y=0 K=50 CMYK PROCESS 0.000000 0.000000 0.000000 50.000000 C=0 M=0 Y=0 K=40 CMYK PROCESS 0.000000 0.000000 0.000000 39.999402 C=0 M=0 Y=0 K=30 CMYK PROCESS 0.000000 0.000000 0.000000 29.998803 C=0 M=0 Y=0 K=20 CMYK PROCESS 0.000000 0.000000 0.000000 19.999701 C=0 M=0 Y=0 K=10 CMYK PROCESS 0.000000 0.000000 0.000000 9.999102 C=0 M=0 Y=0 K=5 CMYK PROCESS 0.000000 0.000000 0.000000 4.998803 Brights 1 C=0 M=100 Y=100 K=0 CMYK PROCESS 0.000000 100.000000 100.000000 0.000000 C=0 M=75 Y=100 K=0 CMYK PROCESS 0.000000 75.000000 100.000000 0.000000 C=0 M=10 Y=95 K=0 CMYK PROCESS 0.000000 10.000002 94.999999 0.000000 C=85 M=10 Y=100 K=0 CMYK PROCESS 84.999996 10.000002 100.000000 0.000000 C=100 M=90 Y=0 K=0 CMYK PROCESS 100.000000 90.000004 0.000000 0.000000 C=60 M=90 Y=0 K=0 CMYK PROCESS 60.000002 90.000004 0.003099 0.003099 Adobe PDF library 9.00 PKDz//'buildbot-v0.8.9/_images/irc-testrun.pngPNG  IHDR5JgAMA asRGB cHRMz&u0`:pQ< pHYs   vpAg5lIDATx^gtcɕ և;̚yoFjWjdT%TfL2{{ $H 7?̬*Iݷ{OO[ĉc|4g5 a*gfF_:fx6W;F [0oa_0>痛sSݼ7E / o=Љap!.\#= |$qz//܁Z1C7wB:~兇n]o;o;B٤^)NɻN X6˦KS0q'݂[ca Ѡ4@aA9zX3og͖uɊ;_& UMiŔrJ[IٿL{G.oh7k;[V2W5ǢjZßbRѹ^0(R&MhP'`H"*ԤoE}"Eb&~eǘؤXZ22 82 CHg*UcpBG'gNBAA6]I0.ЧKЬdl\>IN& +IkMugn&6J8(ipy&7cb쁝q5:BB.w@ P+as[Ya3laEغvkY`a9~4(erP k״k ֽf=Y+d>Q?_n?^d|BGw+jG%I*W\8S $wl2Dܮf?mbJմQ+3}?4LI֭k@ mj ÷IIthL#/Ѐ0"Wޫ(QjvAՌ>_٧Lh9;ekYL떗Od*auZ> Ӧ+Uh{:Mj7! He9=:GȸĎE^h[XTcg|{Ӭ43Z=W7ookF reh܏iX)}jZ[2^U{}U%K߯,_ i;݁1uŴ>AnLvlNÊͼ^IV}v {3WJ,Cnk~ktIb8gV;b= ۅ}x;Cled P. Yݒb'鑴NK{qIa$S1$hd+ $ ˖ XzL)qS:7&7¾5!EQսMzt3{@ ➔Nha_^WzG9"~N0Q(ZWs{&;,y4qyUZ߱=p/WH mZ:L4/It鍺1Il=4iVll1wmlI \FTdCS5UG.jdIܺӽ9n{a;gpwǻtR`ltzS:s.9 ul`I_2 ef|V=̝@D*l~e/Sݹgwom̛6S۞øczg5_}~ce5 'twyH?nm`{]k8x?ctx^3*)]9:s1LoewsJݑd׺0c0 nK;moS0yV>ٹJѯ,]/JbjXjqvVARk8^\Oni,gp UȰ^]S8gknY*XEX<7X$4 TOntpk<pN.\iKN=+-R5ݳ s{|K*JǸɹQ O4a5Mk3z,rl(%7N͂-#2;: ոe NiZb5Xl,'R.U fSZdJF!5vɟ,1͟(T F p7ӻ&HQ%bJ;N3څ=A)q59|1fdtn25=OsOk^TA{;@"wH^-{ssݢY4[lgRҬvwέՎo"D8̶͛m="3w W_%]83ږq}^oxG~-Rܨ}'@ Mc"y" mImkw 'dmˑ eֵ;ESy [YBL;Ko On_ uu”Rú;Uמ;k)_-S4HȐ/{,k`^%AJ3xf",6v+2Nz8 ^8?ΙCUD𔾗>6[Pˀ΍Y,Qmx>#*3½%Jm]8bۤk͢ڕm#$oSt|7}Re85lv7e=Ԧ%m3 (#yxZfaU׽I)^U|DА³ݼ(g{2=(g=vmWF֑8_n>fw=.ft=i 4n$61,Bˇ˕`_|4K4c)*׌G7IEkgvZgK8s[G;2wÊ&[ F#j*QMap"_ ,*}X{԰$!l?(w&Id#ԾPJIlHw k;^|RpBq B{+ᵫ)ݲ՘v)$ǵmޫZ {֋n `oB{ѝmS)kޯsH^I[A(s+䇎 FHp;ˆ5 uZ%[7HC̣>eܭƴnbث:(}\ip68GO:|0q8b)N&[֭i|&GL>cG _heX.>l@g!Q ڐt3u!I ===gEvqhث3:bQՀ9gh:B'Gd 8\舡ơ m^EЁBW:ʫͫ|R=WC7r\*I=g\5Iujl+?<=/uu/?f؍kOG=&z.1_5(}Aiҝ6^25+YEn,,a+^YĺU&V̺ # ohŋC5׋ 'pl@9ɮ6W]B2mڼ-1z(6eW OX覅蟹EOڠ}4#OFL"-K.b_SC7vvI#ӟt \!WAB͞ NƧ+4xj@pyndEՂPV-P"" jUpwѠ j HKJ>[4{!5bO,}(,[oc>FmpPO;hӿaI/ ޻80&99 xXwn85p?3pxl?;pro[Q<;x|o;C7o :y0t;'FNn 9wPyg8wP= ;=~zk.]^;??;~~θ6&=3AʇSI,|`>m{8i?rG:8:fgsy8GGsh࢛wa3r ށYWi1wc+r|bhe\QL8Θg4tͻ&^pƢxb9I_bh+.qQLc181,bhH, Kt.:pĄQ`kԈ(}Vqfr=K4+eK3dp}(UK{:q ~*FڅC2v/yq0烑sxbc.:q]@ N.Y*DZ8LWȒmD/7,.S]ɋd+J`9ӑt3q {,7o]ĄJ8sѳ珧OM9{<{xIɣ)3gSWp4l4|YiYS0v6yg/|)|I; 뉜w?<9Z<^DF"Q G (1/L[ 0@4 İ(aыl.XhV0fa ı`43Hqqlb l*!6`R0iJRKؤP.QI*K%\*G,K6\*OdTI}"J&za21$IL@e*vPB*EHP=vB%\Rf)+ {Cm7 5"R&Ra+T*1O]%h!2VڣGrJLJ EwW)x6}pӏY&W `|ŌzC l wA+m%z@8x`qHP%DLQ0nbj=(mZvt-:2{͢~wʧni\ז[Wx`C]Gq?׿' _V?(S2xrzxODг9n0转Li dfA_Ҹ^ 8pNpvei5<uY"|غVPNTF|*5`k*Ǔ 0f2ӑ%|3WZ|#b^(NzsVn` g]0bJy+_b۟o a HuŁq|_zp)g:ׂc@+Z[8z?yvJ[*}T ߢș7(O8Tp)hu lE?i|;w:㦍sFc睐Kԛ9ӯ>,P-RܴF;T=R?{H씨3"@"z=}p#06A^"hi @[A9'&P'I 6FC <"> (ݑY$4LQ RD 9O QXn( j;}<W` R+zƁMD3A+Eo,%pE $=Jd~>L8%` /CDR  F/Q\X16yA &T^0 H^A4.B(Ep/) t$J)z) "`7#(t+BSC  It @"8 (]DD*`Kb jcYX fAg,q0:Koo~ʬT *镈O:Eʨ> o"{v?Nl>ֳ3mɛ4fLP9+5pU4v ;_?0sAPޛwcjUԿ\,lOjc ݏpUs;u Y` `zBӧq9ꃼ"g ]+̣ ߌZ@7Z^<약򃼛%RFRD8 䍺՛ oMlPPk|nf1k9ZBOo.>,l͙ o8f@Fˏl"\ut;Yw9޷2{NDZK:foe%YIs<ٳ9Zg͜#5 o'ޕn޵:q~⹽}-É1Bײ_D}X;w*$j^hPaхY#z5; )RFL!6'r?AG$HJN#28$DBN:G/A@z@+D(x)2WѬ$qf(#(&+H`R(a$6Zb="q\tb@A"*v)GT?GrT~@n90OTvH3*4qB!54!L!.#ԀVp!rhV=P0 {0`$RM(aؕ$IMPTre0ID`HG2˞'Jl|7e5wta)͘j/SײX(zb^|ǯ]H(2i@W_fLKhYت\ALC8Jݭ{^B͚{]h{7_0_3Ȝ{'7v|"aUe ^X?ÜGe;ߋ-{~B͜itq3}[VX춟~ }{kE+_]+Y|X>n'._ы|FwTsY-Sv1G3ލyوoF~;_oVv=|j`(a;GH [ _'?QKE&׍aW>rWRրה y HďgH>!̇eߎ*v^~?,{NaG _V)~izPdgqDl,d§3nM]*NA#bd/1; 8L9f T")݄DDQh=EC4AL$ARaJ c1=1 O,:;MXPO84!"ZƱ< $!#D7xte<DD6$: tĠrׂeYЙ%%,⑥! (PZ]uoР:Gfپzܽ[\J$E":.: "+!@ #!J`.h|ZP2M(ј#JMt)DCL $OJ8] Q:MDk$ʥ pGO؋l @& nL6gFWw^tFΘ{IlS2{x}񵔚;ŸYR [鿼zU uD!ESXw-*czvܠʛ#φtf|[е|vB;?UJu픊iY%I,R&eaKxeiX;GôĆ rg ︑zfbsO|0?^ W~;?{ֽ^+=}䐊W(9i{IlgIx[E͞ CUCxI){ȴS׋?}/"dV}tܼSЛ#dI̢⹗aNz=Gk_yvTIWdq7(+!i\Ox>#LGay&"14 =&xOg.,㜏Q(gA%;I16ȴhrEvɅ9g4Ԃ+v7od֜sXdVMd;A 7TH1 ,zB@K`ބEh 0B#|h`/`ǮE2B<%@K *l!HB lB:K#"ºD/qrdx`cjxKP1vV+2ݞ\!6*2Ze5*F՞A2iS39;NΕ]YPGTL:ʤuD&h! #5@UZD+;B'Y'+s !> ^!)WBB4^%'ț66ikA тO>J_ĕ4L_P /mxuOr\5(.]:"y`pe 3&߹7?~+Qu޼ڹ|. Y-ꃔ?W:r7o/_|F oIJx#{/T7k_+Bl Fb'QnĒ[Ue^8ukZZ{a)2}]u+y+>Y\,;dxN~[wbF^inwj޸INnFe|p7:Sp-VRiŲGo١~t-:iohZ/ 8\_z~Nߍ>P9=ܻDQQX<@ bl{o)x㈇c|nFԫ=kwRע#P:AwNS KIk|F9U4QlQ|;奘~j9x< J uAH $as s(z4x5kbz(y~d2M(INA 䏐GjdO4\(9DCLfw(&P2+W,v ͤ2ZzG&[[IwRrG&Z}h5ڏ- = NźnqHfQVS A]4BbPє@4A"*&{=:rybV7e'~<$N&`&,`s3XBoK%`:d(d72+KAHIH)$HjdREЏPN_OGOGy-VxrV^ؘRVlJVEfQ"VmrvgWi AkCjc`a1$WZ&`6CY!pYk$"O삏SH 8yx5Rz %:Bh"4&A"f&U %} āI" ` CQmQ"âfH,fMVf1KֿXs=9x6\o (T*|&`N=袶YK rf+(JW}lHhB0֛eb s Omoڡ29%xުMUE?;[9_Z؅S"DkM$McYH RBO[Q\XfuB riԃ6񵸒-y ղCxpeA u4.[xVg؟F.w붩mP*Z dqO:Y, x:)^ 6rXYsgxz'fj{3"+T:'-:+6,{ PO3wJSD/Ik[ޣc2gN*)U&+ePB v=ILЇ^)iMذ2c<ĭG6]΃>FQ7qEv8X1H7'ٹP"klJX@4GDIq݉ln$An)"MvAF!\"V s$/NHDb:l&P.ɴID ɟ|&Y4>'YmzM=H3$-BPCN"P`A[MBy˟de mUPtpIL[VW"P1m}͵e/X֪ܡ7;[Aa.Fjb5̋$㡞hޢp'5\Sgq,g Y%sT&àUcǮI,'LQbY_:y9s̝amX Fb9B?Vo NY$6by*#W19 "E8N¬9[ $K^cAYXnF pBLa,0@1 WHJDf ˍUHBO6%Ml7RNILQOl%o"QH=8!!\@H%cΚOc{^F$KdRȢd&DyD Aa:o,GVr`2/"InZ4af`H$!z XLA~hI;@S:KV@"i)k[V.5TT,I&X. Vʂġ*d|H0٫^O) ~?~" 'K?kI_+,&FcQofV:4N_=%CzONa4>-F/`= =dXv Ka;8$= Bm1cfNhIϓls籡UOBH!fVE, ڐ!H6A|!YF L$4v- $! )P J 2DZZ:b9kLTxgIhgKXt%ML$B9tɋpdO'yɓE%q})? r  *pPLI qY6)LQ ~ E$ kȢl%2 *ARh ٫A,ΡE 0ը̡SסzyX'eJR%FNW~p/Eُ__½Yx^qgGRn)&bm+*nϬ՘ZJlgP%?ѩUJLr'ꤺm2_ED>@CD3Z'dnOH Ao-z }hp8T*l>h.hCHT.{0T T*  BݦZIIE ȍKőrI,g11j蒼1wea+jB{|(gc}|:N)}a .hY= 9O+]c,ahLoFM?M!{8~@ N + ] 0ƒE Gkdm/ 堘bD&DR<]OJD( @FTUPDNV:X$GPǢ~Eɕv%.֡ǝ)f@IJZ$~*ǛlH%s!(&o`OzS>* mKt/OB&*/iP7!RC$Da1$r0 FxDBJ#h}Dc(АdC;dRVa aXc [#=DEilz,<$'&5o|#'a_Q؟|֗|^ k+ҤF}h&ƪ!Z4JfUJjվJonhT~*߄BΈv#'kR@+IDF"zԃP`ZT>HIa8`:+^&=m-͒`?qؗAg}uk? noJvO)YOLzJֱI{j;-#nmͺ+Jņ~SUF7j*:bqh!qDG$ SWʃ4eB 5" @)`JD!"ĩQTKSKJVSPu%ʪ]* ~Tp`=2rr}lM<4@5#?7d l9C(q 9{Wg{f'evAm<;^6 5S&'12>>1.-|nߴۻ7g/E={2_Wmv(jr1^$o5'5F&#P,DdH$&k$YƺHXH@%IJ%!'.#=؈Ila0 "؀#JXr$,$Rg"\B%x8qɝ&>ۓE37&׶@y&/9F<H`Ŵ @RƲ/sH*X3T!@& a KhT B.J$A.: e8`WDtPFPRM$儗$,220F@+Ѹ C#GHW/.ԣY$`%tRz!O¤? ڋ?O۟n[w~y#sES(A.|O0vL]ڲ+?1{:ũQqnTNuHN 7H΁&Bp,X&B (B0$Y"H1R V(ABz%)c wtDK;QOTD  PHo=ESY;Dlj>ٺH:L=O:8vlfpeQitki.5SKfjlv.j܋ZZ;VOОT4MNgL8 l.ذs]֫=8#h=,.=='аZsω^8 |K.7'D.11ph[,tPzQC!>m=,ԞI7 }I{eyHIMg\ڂ5Q} /C›0RWܽ{L/K2'!jY$A:$ PA<RHMeJGmxb:y}h-XDq % CA.aFZwV^DUx<RB؋rmJEY1j61_jw?}߼/KK߽?g? 7u J?g5vMަĤmmw5xw<\V&6;*fhk$$':pPD0"y hҸK5R!054t@LԓAInи$B/ FiRQRO喷A`a/Ě/ 68hNދ8ϕ|MZq\gT.U5ʬȬRԸln|Njy{Q۰Ok<*9qN˓ Y#c׬ڳd .S0ΏM) q~{i{CyQb]΁]-12qt18aCB_W4wsmԤTv`]5C;iեMLt / +fd*BFVNjn$DmP(-_QVrոZpIzCd7)$ t$ p#Pj?ݿ{%woѷ?ҷ!>G߿;w“bhE4t].5zss[IR|CۖV֩+%G!*GP,^? QI C@+SAf@*آTTj mjR5RQNqi]X T7mvm {{_o [I4P2odդ"(YS|"Dޫ_\r_0&_59u6 Kϫ%'DW4fU=ΩaO|C[?x闳"͈v̖ͨsjN,8);J[s9*7}_~02& o&TQ37%3&wtmDJ,[1{?AZp#./yif?Oj|?/xUw<єdؕz`Onbqzדt%m8T*GvİWNlXTS 15f 9l["Ɔa%#5ı#O[4-m"HP6&"{If;\@$F) 2PNh(> e7`UiYIL2в7H,{)+)/Or 2 Z BE`KDJ$ $Q TD:`)UFQOٰ 0!' l2:o+M2VAaqIHU$k*]yچɞM(zUjڦ`4H:Jd_1ꕸ_}) ❯|?_k?{M^ uH21-x<)5tmocŰMXZ԰gQJ|{߬uwT]?BY`B)D@ ZTա5Jcl v=TS`^۴N.tn7ifkQS-{@jWU3-*? q^`xCc(UFE>e8\r}Ae_y\;f*۸_>6*='jgGRrbS ӓ+dq_N/|Wcr*6? K(-lɪH)kH,oz淯hv/*::<>3^\fjYKlZ8ZS#۶wrzk@ƪ߈LL+oE_(| ^yy$)>#)˶1ָH +;Հ$5{#e/3NheP_S>=t@+akXwlEǖŹbd_ K6S:H{9M{&z<$"%~щTf&k\iP|w6(LL oGEbe~W#ɆwC\>D+lRsɪ] 4@N][KwzMTzǟF|/dv@&vTf]˶5t_|a ke{^(+T%lZ!lʃz]d/tDWS(+V@Ѫ`㝁5?DrklLJP鈞A.A€8P7ࠏȻJV"zTشETlkQRu` nI n:k5,1Y+$kbfeueYX=ֽͬmkl+[W5맭*A^wjjn{;YO?o󷑘oi/5JAiVJ1?xWCsmBXm |B$2*G=ޞAY½M@h7Vm:xhPL\`'-N.a:GCؤzTz.էzuTD.k6g=Q:jHG]kI߹G-?zתH~z>=5vkTsPX6MD~^b0නvNrDhGqo*]Eˎitjnq06OʋZ:*۫*+FlW%awS:Mw3,m$y 3>~O%TJ/ K̎)jKȪ$,fvǖ<'6$G?#JL/{듻卩={#oDď_F 9(д-l3s⓰Aqv-շ?X B*$BEzjgD5B}Yv'RԆ0K&ͤѝ"<\[>~UBӖD׎(>ks\#Pp̦iD" P._ΐC&W;dTN|s =My"T@|O QR+PO|/Q*UT (^ VM"x*+Tn$7DLtLI Y -Un"aфE[Z)1 Mʂ )F%^",Gd|^لX=645[$bdpw*>O*mKz,G<%`tWdvD |Q1Ed/'n}}囟ѷ?ǷG;g?»I]܅5FfKtUbܨ)E+ M;;GZuWVbsYr$jvWavwwL ׿huJZhH (%j S hHB߀fP? Ԥ6g)+5cfͰ`5߄v}`@ /8X60h RfV` I"dkCՄYBw媳B*k$ \Jfi|rnaψI+`]^SՖTP<#'wquw3vZw|\M#Oɒv37@BQCjICGQ(%oreGO=NOĜł5#rO#2[QGu&756 -2׻[9= Ooe wRcFV9S"ՒZXnB7y&v=&Cl+/kEk*$1U+D:jr>WOm(DB2g^#mis<3, pyFybY* rWіB,_}H4''Tr<lXpEU_[rឯU _(RbӺ`Jl-YJU9D'h%, m` !^a Mx "<"TzB%UE@(, B3$j^mDf$Ӷy1SLgfɎ`2bezkSR.׶5fjj6֤zƠVKVfY,|Mpet{4gi)61O_<5/?ֵ_齿?}KVMM {[kV!J0i918=ZSl3HvbҘ[\T".E:fkP#;ohڐ!%Q:M!NCj>o*'1䢮ƄtA1dbp$w0-„ìZOQTBbb" e!r]Eΐl#.$-(EBwUݴ>rB. E"PDhZzVx[=% 4*1x^5O[.J|EPSPOԺX/Y#wˠ6}eB(U";MH96H.x"D `!PKJ*A4!IdG=xr()SRS˭%|9լbnUlRt;fY%/%RS =0a˟Y)vɁU6zGó z^Yhjm/oڋa[O|7۟WnO Ǖ W JV}a֟[^ CuOeQ+A.UB M֮Xm"&E(\\gsFBča=18#B6iI'jD4Iy+5k`[VB+1bY(Jkm t5s2K04„'M ( F2_b W1iĆ̈́YKg"OU+vv^Xq?%8!=Ӑ%du D~@qcBu%M0c Mif>ihOw3OtM*]``)Ba1Z@h'x98<;89 :D5F&W$tOrBhޑk og9B!x>mH!,U -'WU@FBuT*]v,D`/;ɦQL^**^qO+ iZq KV{`ESI(UڄdՍ_DH xyJVby?d[-]/2Q++PC|b[=j#Pᯔz!Hx.:#mcN(X2 IOXHs o_B "Fd~ۖՊ`$a ^LY&˶;]`n*w:aoo F\ǖ}id:;4iԻeD\7m=9hjo|;_%?w/W70W__Ƈ_x7~WK;K+il1䫫RH)^*P&2uOKR2^!۬3J#1[+B(DQ7Y#0Ԅ7PpLD:zMtG85o 5o 20ـ5ȵR![Rl+~NQ}*(!!$>h5-.kry )]Fj+__k){gkfQկ9TJ\0C%Pz^6rc-Rhh0.z j[JrnO_pauamyfЩ~nϏLwyr^^ih'@mb±E^OkBY%`"T/AێPαԈU+*j Y%|R]B\_.#4WU kJ1W]J1Oٚ|Sw[{*ּp#_SXR܀Pt|U0H(ZI⭖^)UJ j65WWmjʺ@v[U(v#" 5u[~Q6VLt(׀w!A7A@%ȥ6Xd'vvC 0v @%Ulo*Boy[c8<8$Jj;\Vlm-qWvˁ^67HlwU;2pQ3O<>黷|?<~?K/~tk/|?a}_{WþԼE&gfj~/XD=٦\,H-PhQݝ]xeSfYr>#%bƆ^slۏԪwB4ZK3fL "jȎ$d }ĺj zSP%8ػ^\>D`oh )5)X-3%=*77KR:mR9&毞j'F?;N]z@_ɮyjt=$ΓAH3Oy=eƼ,I4=Jz/VKW{Ʌ񎪼t},C7M|cj߸ʇQw>1?l>rDI^`r?&I?)m`R$%Lܤk&P>chFZ)TNal SM#5K*)yH~#5Gۼ11 *~Q[Eדo'MXy;Әw xitǑD?LȬ=L_QdQEu}\.W*-ZV[jTPJB)$z¸:hB#RnKJQwl5Z'f~Fy]';A%>A4l\;$( ~p4(;`gg,lӐN$[& ,pjJCЦ60 ¦t)}pFM j(ghlrbY` y}pp H+ d?-)kQZ;ĭg O㕘 JMCj}kgE,_\/*WWvv>pvpxxxo=o1K2Ze5ծξ)U%-u-"r{T~Da7n&VH(PSfxs?.0ڣȌ1E~YU_:fs%kF-.URvנRJWV % 1>-S($5Qo|sco,^\"'Ai@JzܠPl4yU5,H)h<){Ag m,!삒 ]قzPmr |K$'A``I'c ߥi} ހ#/*zs 5@{Rzz:T_t0Toh6/ۄ|~PW'rA@C֏ J)Ȼ,iLjK#f4xbn>iFڛ mː]rLt1TY3ӛt6@1gO!$ÌDA҈xo)L3Q ="@W!$Z0D&(&V% aZPBD  M^AK(I6d,R$@IRĐ ՠZ$C%%VP7@(!r>¿r>"iZu2Kٵc9U% Ud6ZLÖLIg8kk]L]Ti2Şb{woWc6__S^vv~z|vL}rtpoRT.ale]Wq]gvYI5W}Ws/%29")"~JmXJO#e3Ƒ[GgS&`١Kzjӗ^8i6moǧ.mlj?`/ ?C3G$55#mƧCIUSgK M桰Kf'fH㉧]H=]yi3#c}] -umMS }a-ڔ[&L96NίwXpx :66e2Lj-fŘnkmlokommkljkh%hhonoln54Zj[ZqMm-M(Qh;6284؏㎏ M+Fp08#8۩i8cfrqa3^@ԐHʈ,vႧ9]֝ 0lӀ]3DV{7 ]쮓L6V߆'3{f%8V5!4d'Aip"ht1{v"֔6Ճɿd.i={vǥ8/z4>qڶM{E@Y&W!k?gz;]CЛzj~˼=ccCM7m:tpO=h0א=ӆx8&L,Z^ollu]*KV%Re eL{:lڠJkh12.V<)zƿ u,!0KD6fd׎FO=-M8l%j 8nFjB]CK'?dOoEh/)ͨ3z@ec r3t3FK%3Siu2Bؖ*w'&lA8shgo{!ml=-nY`MMXaOV(VDB PoXt1ݣmrQnɤ[mbcS-ܒa*>o!ؖlnK dSFl~c !8-1B|vOKծjOu{:FROa=^ "Qwo<74 LEJ)/'~I@z / >;XQ1]7Wyg[OW\l݆cY5R#x?os4%PEqvNWT"Pu߹X_M>M{S~թG~쑝z%es3NTvbjBevHE##CY29Cg뼋:ߢ cc1ZG2{m-oӢ8^` v^u]ddߓi>%b57&lMo!zwٌђAp >B &<$*c=jMcf?FTEGQ~A vU 5Ef+=O:ʫ+Bx3qf8PgC2N+4#}PM袮F:ޫ:gjw< HF G!g\~l҃u6S \ :hK^7 w,nɔcԠPRn]ϵonm(vd*OlG3Pk9>tY'ٹ"[c=9l6ə |;888ڏ6b'Юs3ɹ‰0=_8Nyz~_0|N ~)Xg:˃{IZ,KM;]mC}=?.f:<5cHÍvtr;=]v;.˰N5:Un :DjPnA8)P2}+0 gFFCc|wĵ>tֶ?_3_oxtLXuda'Dj Fˡid=7I#>VN&ֶˑCNMrf(ݸgNT;.l TQv\Tg?Mx4pAUzTl4 yB vd7&¢d G'Z2`eee%=/􇎃3Ҧtq~zp`8;^'OMRG7 tB}/G<]KjFײjjGҚx)s:}9 G=fl[lo'E ńhGQXk뫃];f'\Dz情z58)Wy}jNK u..gWlJ$+;\cI/ϒ1xQWOI8\bQO_}s^y;ۓ3}0kS(i\,m-+dVw )zɺ&'Do?29m=>+ 3 OڌMͭoJҲF'QsxznzAo:('_oUړ B Hk>8*2t aꛁ$_ %ٗ_Z3s2,Ge{]GCO/,&gfGJMckJVx .g'v/6sTz3F2w̖S~z *k,:p9=޳ >=tg_ZVqtr 9@;\;;*%KKONN6iDw&ȍN'27 $rtY,՗WTʖ*{i`xÏ>Yds+'fA@!!:A]"TXi9<&+yZ]ǧǧgL3au:=έ\&qvXV<$u3 V V HGϨxM gV^k3]G=ݼ6%Ҧa~敿'.;9= 1ӏo}pbDV'gMC3;\ y"а@v1Yl?33-Sx&O.s>>9! kTY.ÎNIAE/*E갈rnżRݼot-7)U=^vgjacZiۃqŊ]O_D\ff%낕UH5<]6sZSɦvhv3}9i9tAAh؊⒒Դآ汤nYZJo^ P;oT^Ol%: !(0$sj…O3fX+tL.rp^+s<{F}|MH8Yӝv{Nī&'UYY8IJ'0X*p}<R6zH q6ff77V+}z,݇ʡoa6߈O46=)͔`6T z538OA>)9J*XS ,.D95h肓W\JR"ihZ:zl,܄jIDAT@^q9ЃUG큉Ꮴ]'PLfX- `rA_ C=e=:MHJN\2r xʚ4ongqN&gCq+m=Ә[FCTV]ͲؘilӘ nJV>kJHiHL), .) ch1Ȩ2*^[kDǚ~qI84D#e[mGq`щ4s&΁?5x.u+Sֳw}|퓛/ZL*a#? |t`Hu1YjY(:p-0XH/ D[1h}tlR-$fI\(gx,m,omˬOlZ6*1a_/_}<~jfd#_4+?wozR]tg~E_Ų)b,A12Զiw=^Lh,W-C RGkF^477 ^,4p>_·yF׏^kp/-<+iRBah]mH5}=] }-S 5C-[ @,9<%AFu}*ӳĂ/ -L՛,p9ŊxH Nc ˫C̲&SـcU]rPPZŘyEopxpdeHaIC=jEß-8O4ֱ H?15c?L1X1aZ^]3F'G'9Ɋ3ؖgTC{ن|ǰ/*UuNl7:>yjYP\Zy6J7=ftl76f)755a/h56>(qOd#{}n6(He#<#3,Ņh0!D㏏=IzwggM,T=H.O )&q"owrbzL.r;=Lqztwvg*&^uLڗ~On˿x#!%I@2lUc3ж4*|@=Y L6$>=g0 s/J6B~NkkyG:I!`APP`[.IR ɖ߬j5ŷ?)'.,]^gTT%ˮlfTvHre~e[UWuT gvcaݳ3'3mdҝN/|Pź[2|^%^ܽٷ#_zQXVIjۧY}esY-ܚ6n\ hHr=?45mV@آvvs`[1{?1>:38`E@f,/` v]b^+ ;'<`U,oKTwbvl{C=+F3il/c˲ń+_NF|Hf-!Otf4fezzx%QsB<<D&fcow뭝=-`؄!ZY*2()Ph A+$AFZk'0 Sf8DhR'R`rp|k3ń ~AX`̏LTwut--ommlJlǺ҆ΖãS&V=7)adGjlNd3! Jg:iwY39 L`BۡH =$lt||3W+~fG˧'G\{a82g(wtj]?:y=2Qr>U |N.jmJI=aK!J ;jX Ռ.n_Ia2Wr;l*}hL5b[d򬚽 &6Cދ ~xx=alh`@˖tǐ(LG"(U-@0 +kdےQ0Kdr#>]TCiUoUYlZ}S`FNW~QiHc ؒA!u Ta)B!y,ۃH"=LWNΜ\8W:ǤǏu?R6Sc0EF`>$Qٜw %ꝞۼypOggnSE=+v,5CV-!^Ȍ. s6h";Bn u@!h8tٖ vIZ"htS8@sd l UaqECVxxԻш .38B{v H'1#A\. lNϱZ:F8 Ʊ E+۲mFcK,C7I%(jz%F+/ƿ?S u{ʼnScbƸf]΁r1*T:. T+R] j"dnO-؋?PEpʇ㰣]-0h"4fQhsGgUYks;:>|odJpbJj2W˒yP_qZ׭y}5#)CNάCeu\oP[,sF*S8spvx^[+N70J&:8~n81i6}.mUX7'r $շfYHWNiޚُ5:Z]ܝT?/V&7iv ؚſW}u8O$?./OTH)ɋձ3^ ,N4>Kh˸I6O(Y$!@: 9#G|ScBMwe1JaNmHcBQ0GivZ"# h< X*a/*1{1O&|9z0F!(Ⱥ$,pr81Sxc$pBDCZ߅q齀&:E? pN&F.?hi#06jv M2!fڝ|ءj!5 ]XuK8^P= 0x2%` a&aIMB+< ?~`6N0k:zƹs֜sy tcsmt|(=]gsT=񅅥s4"df0RFU! h&9x>dѳ idɖˍP@]~(,AC$Qcys+";nw=깛X^?SR[E=CAuQwAr]72gv0.!9=>6N1%72Kny;>J(FZ)MiL)nXZZfaZs`3٢ƑGe =0klt0kobܴ7~ }+9- {7Bo,EzA$#+~`EkoY(o-mh/ml(k.mίjJh?qe'pud[&4x"hMe[X^%^#'-#! U.c^iFW'|z)[134,zOͲoo XPihCjHu%t v]:}S7g C2|W#Ciz$?|`-PM J3Fv`eZ%D{:3AhŠDm&+[Ī No4 ]֚AM`,ՂJz- L74:#FhZ?eeS}``ڛxx` )"kQ=ߡjdup8cs 쒄I)U#,@K#7c+n&ֽ__2>er@R w}r>Y09-T$l.nR]]4 mB*F@RjJFRPKUz h4~U\ɌԾK9z,G%[Qd 5hstS'nS KԶ5ޮOf5Hx^kף?YQVxƇ)ג?Hjv-Ė>LibݴؼƁ$+GE"WJ^,z7ȒJ}TVQE"&:&f+JZ˚*ZDdbl0KspqR[GA ~S/%ChD'FA_値jFؼ<"Z8=hî'{~4OMg| Ek. (!6yXXAv`o3aK\-YĸH-82dħki j/Ms,rB6Bj XKGos{`@S[oS{^$e;مuv-}l6Xws[7ξ涮nlWOo$^\韛k ?4599?3f/2&&qbl< ZdrY5ĚY0K j9:CE=17W?,Q[ {Tz7YZXᛑ%o>.}/ت7cߌ}=͘*NBNcuSOaeGc{_fi3y-EJ_SV_^׀;8<2]UQ;ך_։ٯټɾm̻+ qYڃ I0dx?vlehׯ- YB#\/'O9o4~YG=o6.M͟*)JeI;!S{nl{;~=3=I2%3əIoSR'e&$@${5`+՘ .`0^+O6~myVYZZ~{I[Zq۱Ǯl;v;qjőۏsR~r.T~փKPz|odΕ?[\Q+ܸ@j Sdm;TqlѮ;T(?3{?:tnױY: Ԭ sR R6$n(Xx漘5qk'%pk7WU^8'7y]}uK=}^|`~ϣ{Wz=J7mX!yᬙ,aO{}~ou<~ܔSf ,<<=k钘Ö.N;~ѳ&O]8f–,fW8ZfYi~r݇O8߱+8/ԝ!fݟO6{)ZlJO~{VkS~GOjaS]럄^ХCK^,9pd}k~g\3{~piO:XHYۏdn;dƒ=[J+ص*jeNGlږ^?wo*޹24asɆ3l.6{{z= wUm(ؾh+s7Ǧd'ϋIɎ\%rEFbS-\(bMʍ]4k.<7r^X\6eJMOLMNɈ\aڒ 6,^7mᚡV r!W b^3fN$%#-2-;?q톑3D'Ί]S~Kl⦤鉫W//ƮnFU,E/۾jzsARnA8p~Ԝ,\n~:^DArT㗿hΣ;q_nՑrw㫥Q9*l;Sq boN[wglݳ`ª򫒶'o)݈ZT:s[ 2K6'm_:c-7Ŧd&ˊY%icƼ 9[7nM(HI/ڐSfKvbJVb**RnҺ섵[7&fĭޘ2eaȸՋ'_xyW{MUlKf1ئhY"xE12!95ak"7GG&E/(**,LےaS>'[:>95q5 %R2rקnNLf̻a] oQޝXض(/'361qE*]UQN6vќ+f΋9q1k׆->syjJڲ3/4uy˖&geZީo/ߌOQƆ=oiؕGL~p97{_4?L{ԓCGdd[fʂ-Ə|toۇgD?tӟO~D;'?Nw=Gͣl?$bqTQںͫΊ[<3.lFQsvЁ3r̤ c=dO;h޼eK#,Z8{~;ToQYQ1916cg&lNI_ c}ᖍJϝxhzÀ;~Ӡg?g*=g:|; zӠ?q$S00َa˝~ݘ?dt>߱߿?C_ٽ?į8uW/Z>c"?/\lfwyxJ ĝ+yRv{I&uM%5ttF)>Ҟ 'OPZOƟ*¹ϳd#/Os:2~#Δ#2#;YiYlcn~D.-,Z\P Y~H0?'PL2cq,y(JSSXE*#¼<~yJ\Dhj |+ !|3:ED`*2bAʁ ֏]@*DVbT ґkC5<#KbU,TUq<fϚ9k gX0m>t8~BPrgKq"гm.T*`yH4Y9 u\eeuL#_ms i RiUmJ&Zģ*脮~Pœ$TI9i] |j:tD'i5,&.FfiLJ=Z,)i!.Ժ-E7򗂰ٛ!xj\UyHyvuU eڙuKnC͡*$,pS%p<5n\RN=%_q ʭ{$=$1aY]}{ڋgyx =e"wwUyi I.A~B=I=ų7Wabaѩwl숺N["t(6NSYB, 7oRX:b4ChRׁYg):z,c'ŭPO)܄Bʋ u)W6TZ6/ giBiuNڳ䐞bV7=|+@DA|\Yl?U'bAJj"PGJdCkۆn'AFcBOkCuOtz =`5I(,&〪-Uۙe۴qg;t2)Óvb¢nI*ʍyBEDnY-T>槎nhi^}Puúium \fgi[Nj- cb|`ƬSZrYӆR>VV-J!Y;ѭF+=s3'TmZ_R\3Jb8`tJS#)k+KÉ]P?zM*Sb%+6mZ&oيYS^QV|`1Y"iGafچ( AjRM|Ҡ{L 5ow͕fՏbNf,̘jׄQCK_VsfvTJQEI:4E`UFuW{M+\ʵP ZsPbi׀RR.PUI|({>z`)Am WB4x:%ө֯Kn׮d]MUrPađBJ:I0(޷_9saKi%%QѴ+W~],@:)8111gY/UdI&q#8aiA%fϚ=|b3t9""rǎ)1b$Dٸ;p11q]fبѣ1X{tTLїhdDRtF@Þt}{}=N2ޣ˿:"(@(_~eyY9E8@|F.%6*&2whѢqai DZ?~|QQ1R }sFL}0EZD RB$k"aW8/pE; PSx#?<#2q gҮn`Kz3,^DP)PsQ:9yҮL6r16#OϪUFv+ uN SYgy:Z|VtTnxN`MYf Jr|xS@o5j?Lx1QUl/'N7~шȑ#G?R4 :O޽>LJ^c`1cE9bH0be]vAh( -Z Z͛7?11i1P㸒{n̡%l3wTu̶X'|Ec>,Yr駟FFEf(Esk޼y8h43g7n<;~I&ϝ;6dP566s`#^zfKZ: ̤ѣΝOqƎ򫯾dM;96l/K@mɒe4pM¸q{ÇG}'Ch~vݺԎ;ZEr !!CAEL6OMC!pL\:)Z֭[%K:0ir|\̗ 48%%O*KHHӧ/޷o?0N=vԩ,4 ;aD:xҲ݌|M^*؊ ?M!к^{OөĤQF/G.8yL<0F9>>KρTނT;'OJc=[uE6L4W-P35ؿQ 6u4oaÇ؇~>!$FN?M#5%rJzPtiNڊC@y]{0j9v')A.3~Zj4{ fѽ1&d)ocΤCW_}W(=Wt>Q̚ t Vy >VY/ #DFFCfDܹ /Oh`(Z `rŇ (>۷_e8 oHä;)2*LG+ jFYHlc-[ _ m`@sMwEOPGs΅aac +(,">O߾Z c4p :B]vm?(t{"mIKw$EH>} j qq @aee*"2'(d}^3 & }F l۷/1+;j@o7,ly` ;tPPzj;ö7|#ba0|9䕘 `AQ M*_4jرc` ë`.%i< ΢ŋ-[gqbټ%ֵsg5](&6EŊۘXxQTxɝh]O4)ON?a85 W!Us)RG;:WϊʿՃY4*\ʭ m1rH˖ѲyЗH^Y/^B㊎&hyh28b{*tf^@@jP͜5 |SS7/zgFF}Uep&MG76}IH,|9GES 'hG9r;?$I 2G,Liьsx") Icp3:TǎK2tjj*2:  8 o) ݺ ƥFPҩ-"p*FĠ?G9\`Y a|JJJ_RaEzܹTPCgyI͗y_ZYѡYY_~M0Ҕݎ4Of&kmwR:mlxUhTmdd$== dh*D[BިK.Q^JwNBU$bE(~SN@<҂% eF)-- yi^3FrFGE9hR+&+@$D(/%~p DtxT刊RADAb)/Db1JDK!K#>IwB Ɂ⑘"Mr!3]n%]I8^[iҍYj>2o񒡢rSZ}gC)+W%uHq Ϸ*j)I]9$>N23%O2+=B\"_&ZqNpq+Tܪ 'Q"eg R$rKr)WtE:U_cs+ΩzW-S"mPNni8G{UC6T u8@!9:-.ϡ%wSjU=kJ)u 0wC_2 iGJ꧀P&5msLp9*QcC5諾.O#I)CUڴ%w6|msBG>Ћ.dʌ~# Tn|Jj&T&EkguCk*Y,z1a,f(ɓu g%SI럫 ni"*Cu׻D U#.Ց uJjAڃ'_xc~~kzHc )<]LQ&)Q9jA1IDPc1 X YajeekȓD,r+kCEh\qiCU3QZHjP2/I6:\P˪mYdž?,pG˫= βСLݻ,>|J7jg U^^#X5:x-XPa 1xg3R"Q 7LI 4u\!+HR;?A(PӋ\ҨJt쇫(TO,oS0jlx0f]ҢyKfb2y"1\G;)~A޽gw}nϒ;v2;xLA9r* !} |衇ymL-?*7:Tw֗PJ oB"֯)Q[ U/pyz= ~:ĤTEMRh@Q]Z)V꧴q dL}{ر:yŊGyo 1-GÔn,sby=hՉn"32^|>no1'w]>}0|0tckO>$>so2?1?~ӦM6lI,((/2^~e(cCYXd&>#}۫ȅ}[>;w{O>voߎ=z`@`$) ”-fU:}r$I r(BMmPLA(w|CU' oP .aI(TW E(݁ѾG`"┞7;Y TU-t</f1jc Loca3{7n7nčY@nl zX#+u]رMHL[T[ouwk _7 ;X8b?\ A 1wE.9J(C'Ɔk <#t?o]0 ov&ۭ">>' *3u;̂xV^zuם'Sf\\U+BCڗ^zge -9bbxE)< {Y@c:"\ fm`e\PUI{( /S߿oNޘ;yɧ 0$2aP3dIYy0˿$:$_ꮅPKC*B7_*g:Ҡ_;ﻡ`0 = q nQN6b>n>裫X3a`Og}'L(5a%&&% ;'z,-U^܏>^j&&nPmb}GEAʷz,vF_;zr̳֫GrZĊ'.zM,VP{ÒubnၹhKEGq.M\t(TKP*(uCtB͉ %)2N51^6wZXvd. UPJUSP'gõO OӇEYVP9@V`u^Q;R˹ɥt`Л+W7 JIRCϫ3- 66`{ OJR^BZWƒ:h:dT7.)P 2蔂e},Uuj]dT uw]EIӔVT"T.cCkHF0ն.+WU32CG+Qu~Nr,fm ^<z+ +؂Y1 m-p7fa B_*T۫ !+x  *tLZaswPWZgrW6yֳ|j@y̴eX{k inWmZ#bd|lfUN.a0ϓV3L$bK(xpb#>rNpٷ3 N$^12>G EHJ-4lgk!+8N;+ۡc'w=Qmgz]~ڂuҁD;s yOS[+C! L%?%l ZV#" B+|}Pte>Z΢%c1Ah_fg9&ٵ{wllΝ;-oȆJfW)wfCUTp:iY5eRRT I(hpq֔V-&zIe,X7 R4.݀Ge 9deŁDƾ;؁DX.(,,(,,/WM+Wclt ~ח{`D!Ť7x=)99/ %eH1؀Yb~ko #yD6TIsYi iveCUKC4fq3~S'Ox0 LnnNEZF`ǨѣL:uY߫kȘ1c ҫW>}lJMC*FƎΟuftaaQ\|ܗ_~]bA8a6! ITQQ/7ڵϻ({0K Ƈ#`[wMU^nPT7ԡ]}[a&WM8m PR ˋGMh,KOσG;vT= r TUUa{b(yRU\~=;vldT$8XW,m"c 8g0Bй8(!fXRfșЄ7l[?++V ϊ^WpEgaw*pZ|ioABIVClZHÔzF AWnt(#Y,cSB4t`qv#0LhrSا]BkPŞ(Ϻh?-QHC1H%#ޡRu*AylCMnxujН~W\yIۺCA NK|cq2{̊QŇúUP6-*`|aXͧVk='Զ &(l]a,G2l!QUluM+ F gb,mW3 F[_Oje%Iچ~ە u76$+_MC?ftƆ^j!vH톮SW(:X:["]_(sutN.;a'_f!IRh^Khjp]jFzj^qbG),ߙ@d@vCkNyu!jƍ 5R+|mP݂]*Z=wSz2OC5W ՘0 ujĻDZϪ9|ҺuʅYW]5JՏr!'0Ҁ>N׈0AD)UFb)2؇ۀ IŭjA*tI&ĹikjҮLIIIQ>UF?̜0q}L:u͚*/uyIC7ګUzJD54iC!/_{FH<ݯzs9B8FrBOd嗫& ^_=>l{c?)6gpZjƌ8pȑCIJt lid+zz a 3Q }wygvvvEEƔv0(p c + N헓scp%<A_j1W_aҥ PCaN?*PH2%}o6Yʯw}xƐ??Ca+<⋘Nݲe ȅ}%pJbC݂Ұԑ`:0BE5ҡaC[}U; `o5~=̺,շ_gy>hN_B4?6l@?"r޽׿'$oò C?ah?<2@ رc=p+Ɲk\{lQ0n}^@c=F> $I@7%} jAe% $* ov-)o 4x_i` tP6P:g-鷪*՝?juM GWUWZb#;*u}`[oYò;3l0tB &(Tk>艓'm۶hRDFp0/0 Ƅ)TFӟ8)C0 ct 2<,Rǎ O[-kPO둼PERnP%瑴+jI k~7<}LkPrZ)u x4{t}=2eƆTsqvSO/YG3@;&)fljx>?oRSQ'TtK*vsմ)IWO9vcTt刨ʾ ] =cCdVVV7DśN;}; #YJ |Pl4466=klxβc#9qeIkGT[XSk>-)ϥ7+kGHNZVDfdꇮR~8̣4ueG*ЙpR0͉N|ŶXR 'n,pPJ%|mZ?գl-ԑL6 ]jcc'NYKӎ.3{FDV YnnI/^ Eow/b8zz:=Pe.Sw U@cHMk$M+.-͕CD1[S&DDxԴxR+I\WE@Yi^wW-RHȹIűYFGkچᑁ,#Su$X}Ζ g!oΝ?gI' gYRSec8ǮD Oӳ[ ,R'- ܍+ lN.ѳ, ‰$DgIp-kYKS!>ez S+f]ҒK7uHYկ00 Y,&"z% -^a VO827ָ8tClia)[\ 21׮]60LJ]4}ƃ<QC(Sd LDc$֤bZ!#,Q"3B1fMRmaD ,|6j@\O:@Q$3o}8aF"H4 $RR7b87}U.wEVm[!,wfo^ɽ:RO^UoB%&_!%n&1PLIw7@@Vm^!Ĭ ;tPy'Yڒ8fe@l3hM՚jj%`%B̒c&x{:YYS-Vhf5lŐ3gX}LY_̣`o|-_@wgY* Y2e1cͧl!sTHnʶhf5b {6\a ’ qmÐ"l>dL/{tV l!mdǢDc7 iՉre}ZYcARH67NĒt(f`}r t?nv6 ޽ڵ+))!E; .@h/vڅY̿٨=`ȀpD`g"5&_NȦv#i8AP{Y X @ Ǭ벟.`a'3[Qpdža`t2c LNl?`e욾[NfvGml J`гСH-0/$SRaʌOX5NC.`+=ֻヒe*P+V-G!,K7nܭYг”<Y>PPT$ɠ[--- la3x^[4A_$Ӧ N!$ sa\Yj9rb%+, b e,@:13(#"Y]+4|҄4 F ˌ3 "(͞=[LB"$IHH@_%0MEZR|FZ ]Y5@@~=m(JH1˷`vJW&JJq!f1$k,KPQܢp$B)I*oeaIЗ}IjXkF6@I>`;VM%`V|ŬQZ ` ,uVXiAdDճZpZ֬n& Ǭ蔂Ç u35 [V+,U?L`1סeJf@p̊NߵgnFaj%Ђ%p-*^M̈́Yqb(7 ANB- ugj6헫f7ˀOPO<'lasѳ^_LÜ?oo^>oOk7S_]VMhDB_6aMr%pm=k[w~Źr&3ؚcΝ6qBHEq7߮B0&*](PU2EbfO1cO`@&*qC #wwYdmaAf",֡$?&:*%37 [_f,Eە= 'l/8rHxj*lQd$rZ=ܲG1JL_yƵڵ+$1XXPP`28i""vw;8$Z==ae>}D' 63K.lV&?'6(A̮B~-;UIE R/"S$P6f@pjFE(=> 9VI1aCfСXÆ d7do6lȋm *Jw 0t}v<1\frӣJHZziFD!_`1a.۱c6ŀ0C&ꙝd N:zg@A3dX7AxP& Q]Q) Fxp=d( c`/m" ljyنa^D'BBYdԾ}{ "wlO0@/c f@RUg}j` 2m" 1 >7ĴNYY)} z{c`=aCrrr 5Gy@~2 ¨,;-^zQRtO a,@,Y"`VsݑF1 &̺uxb, ̌qЂg F ѡC&"x x 2ê*AAyy=ԣbӉ BJ' f l`&o^x\(-bGF/rQ'A:&}(8˨)`z,O@u%kx"P$9!A܃0fnYq1Ϻ"h!_e狀:˩a_qD Մ4-)+kJ>z0JpK5Ku3HDBY"NNTr\;8 {C2kI;6bJmOzd'k4cV;*t=O m̝nx;Ow4F $y]( ⑘ w4wyq"qG2%kMrׅPGGV }+Wsjr׬T)D 5Nxꥫ.J% $ EnFF"ISƟ,Dh""#L$ AV:\$-A_t4II 8fEۿWc0K>3$(P|D>=y\qSD:42RH(o{"H*6"1MDvБHML;1| A/~Μ=sI5M~5{@pMۚow_}%GJ'"HoBL A!IّȖ8xBWOSA^>"jPԦT<ٖ5YB/]۶۷1E[JGp8)$ӷT}\/jht>`݊b,bS26I8Jdi€h:~ 'Hl|ye]@ `vr'k*II(OL3-'c8qs앋WZ3tTͨ5 N.~xpq 2fn)R0wqD!%Ԉʾ.=ŋ #"f $ 3߂DA 7jhK*HCr $F.\L3.F7ID:$uCB@>HQ}|U "$dmB,:TL?0,h=C G%k|c|4$8٫-x饗8J;?^QQACg%!Xy@sKUr|/[6E A/n`%Y.JROV``ji EP>Lʐ <&>f6Nf}Y2%dVˬ!Uԕ{}m Դ%0X&tdhÓY:i=~O?4x0ziLҔ)>c%`/=̪0=)&d|'bΘK_#/qJAt` : >Bu@x2.&Y"A`"˜AJċ-'U {&R6xoaUgD>H@vcE*P" xH/,` ^y!!Cwq@*@H$|A"䉃PA"fxU8vEAa_M"P)P~ٜT͇Y6_X2Rt'X&C'i$.IDATh`=0$EWp61=G+(q<"PqG1P>@4tV?>u@\, C;P LINpj 8PJ z0r!t 22G/ zb!"VrP (RbubkD,BAABhJ(!E(i$.Y=:6c8z-2mA܂koX<6 V M,fy|W+/LK@ {R@^w6i4S ҾjXR;4 BeH8$@kU?tYkJ"/FC1:#e$DAZֻf@g  <`VHgA%rCtu<|RH:(cpG5yK!)M-th o?6&NΡ)R;d?-Y|ATTdc{e&b3YuŊ.ZgV()(Sш/ ! P:ҳ ፋJv7o(G(ne~cHP% B3|d)XfK,2hF/y}g!j9#G␧Lp5_OԅT< U.qeYIKpOr KꅄBuJKf/%&*Df285IqB>kjp̒yC*P?MRXKJf)=(2nFc0w)o?svۏ %AD# yRA^BK*7 e p^ c$.Ѥ8^IsʏͰ>'c? |Amg]W/`nʈ2G,A"@+ >Psׂer1\5ۨѝ&+`Vx`$C!K7@?E ]hf HB=q  $vAǑ֝@"";]7,y>%,a"Pk?g샅N,A`JXk” nbGZ&:A`$XbŊ' b1YEb1$X$YɢYT-隀YW!,0U0qs)">-/ 6b!C\HRCxá8˛PK TBS (%),̊/qOv?IÐ vΰ83,b~o|d\]R;FF 8& }PvdqH^D~a|0哓ʇ|Ktքn'oP7'/\Ps"+ BκR/A֣lPyBIKdFhQh>jQŶ\S~!l+PKbV%l[ X 4,f54--++PKbV%l[ X 4,f54--++PKbV%l[ X 4aȨʾ ͿFnJ6--+++-c'L]vt=SVT>*zۀEEl;hQ0zřX56v۰eC˾RPYR8[4-++!00?nndܨus#o~ R6۱aۨk[ +# n\Bݫm-,*),zV۩j[+6!6^\RTX\XP\T83=-/7bVc[+$5+ʯ8;3-?7bV[h[+6"Ym"m1n X̺I*JH $%e>9WZrbD1ǗI$򕝘d¿AVL*/3D8$i}Z 6}tϜ9 $pvnф[NL k!/o^=++H)1d$8nܸn 2eʟ'N xb훘3~xoVǎq x\;8={p}88erjnz$}oyw++6 &,ѕг^ ^ ׿r '}7@;ӯ_?$أGݻ6lXΝ9/8  <5k|g6m4ֻロc8*CmƙTuV$kΌ Vjf@H0 ȱ:u U( _sz~; &++ u0CbHn:W_Hoʹ>a„z())oy4!9`111\VZ,@  ql{0 퉣Y׮]qՁ0+555'' 7 04p@"3$$=W^!icǢ >GaH 9~ꩧDdLڪk2o%`%GZ]L*GedOMnnNݻ9駏>PF>Cɓ'3R~z*p,(w(kLfדO>9c *3 HL;LO8Ag}cAfdž[ j ,0&nOӀX"`אQ+k@$w:$l`7`}!F)xqs(4av˖-Xa6mY܀I0Y4 ؄ayhY},-fIA f)̙3b XƠA-Z,t۠gرM>:X̤2V”#('ioraVnNƇD 1A#S0G#ic[F(VL3]PF"#I|*r}#rK,|皑}$Ixˏlf Ǭ`c+F ; aԤP_ȸ|#_’; w qJ0OLZ$.U//wa" 8 ^eꙑ/'M" \32$ K3:H 8f5Rjmi=Ғh=C4 .H;ùCDڜ? 5 ew|d|LP3]0Ca^e*$s1I/}Δ "0eF((BS ùܙ-b&ID&CHF27O!+r2e-IRR$ X ƒД(#:Bh'!%D&wGC)$LJrQXDjf⤚ ٴ,`!w7m>)=O4&>#Ϟ="D|)!KLKںKA}ȋE#>uj,C9)Чh0'&BY*GL /6Ł"@a\#ce_!DFЧt-L{UW“VdWN* 3z!CX@sܬc R~1KPV+,kI2]t)Lt] UPP@"7xt2 YA^eK.Xgbh/,$s:6FA*yPr$2Ed|駬,8! E+!XB*Ҳ@ YB\K;t@dDMA_CŁ/&_j:"` R,dE,p'@IDFx<:t1-YϐcCWd4JVQt%zXz#b1ACh&ui(#O PAyP u O 5xeH0k H(FyW!@^N&G. DL!- D8Pbāo-_L N OLKbV)7!,4|]Eۥ.Gцhy8ht3M8 xJZ"Pw>i:m|h\CϨMx$'2qŤ2{e pA_xh$ƄmaO>h¤a#!ad$\q'h=2hg~CŃ4}' 8KǖG u%a$0|IK1D Hwfɋ1wvRd[RQX#,}Ǹ܍dYkjV $8H[xKrgA&;I*JJH)1Kb`}QvNN _KC%.F*=tl- eHIvl`hņ~ |Wـ#xPl|++),lӟx U 4lao;~4˱ UH lc'D6`6ӲMglf_! &%sA}v{+٠.h€T#@e֖JJ $Ŗ?|Ɛh9 >E-ze4[nAv#Mwu{t YXYΠNZ`s;Aロ-`&,fVn%Ж$Bbq;@vqI Xѕ'-(0*a\nX @O#\ ?٠b <8qc8bV[j,VH1K~ .;z?8bEa h zl+++HbV}dX X  Xj)5a`VIQaT9}g^VVV7\!,v_H!HI 1$I@Ԯf _(Z 2"(H/'Iymh.~mO!,<ԍ_%fod>BNja$W  ăW}(/8q˗d%/5__I!Wo*wv~#-lhz2 ;YYIYj`O8!k}[.$d#S$H!Q kJH#gbAb/( )(Y~}rx *C7N< BȸEtAי}yAL4M)L*q2STR?U>Su'rDPD^F>mRMYң8994Z$Gs0͑INOMKlBM4k9+K7=~`==;{G؍Ȏkҝ؆FVƳ󑽇0 "Dd*&9H D` 6(>m"K( Yz}s~H+=\V)pΧc١;; ā|(&9&AJ+лwoD8xDڸA l{TG*䈈 IDjAv\ADH5U> ?1­ =;򲳽O>X'HEt0@FLjP6<=IMqMJ)1 I3#Ǧh^q=hw0hE[qM3i|+;Á > 9]v fa.=a0Lҥ nlSvS?bwV׮]aHA3f ٰVG"٧- l@[qI|Q6'n9%%qƱ"$# EyAUC#>Daɷ[nRF,^' wι믿&HN:<4A+&LA4X/A̓ɎNiӎ|sQ^H!CL qȈ!CaTlD(b&-"/<>,ɛXT^9;UA_}lۂ|ɔ0W_*ۤBY7|M4b{֏'Cf`ӻK!>IsDl3o@4StbA b`}P%Ν;!Nr8A+ 8 Qb=1 %8dMG“TD &-@ +nP :!PXP`C\LBmɗNKN(Ѓ5"DV/DB$KL+H) :bpPЀO' x=T$bP+h!t95jYfa 3@6D\@PΝG y@ @AD$(ؠJTqA7R&}`R {@H0'0.*5yOGa@8пh2.h0x3L8@0FOK-;qI)Ih[07[ahh#"ԸhC!PRv j:ɋB\xiѿ.IrD80 DIbĄ[أC$ȋ P Fr$_r #E S@# "5ˆ* bTBulE15 yB~R@z#7DPy$FL7TҠF)AFBu@ O?D&%Ęue}IƆ7a ;M5BY/BhZnWF@H0K^AҾ}=%0,HZCB\BMK]q d$}#orR35%umJa܆mٙP_Y 1Y9PI.pž[^|JYP& C jsCDI+CSL/ nM)lI WnZwۓ@H0Ɗ}c?ICcvpXp`XAN cbŬ mY$&,bSp 1lm#,aD `,nX&x&DE."sRq0<*-fboP[B-LE}6b!M{<5_fC,!`ږ"11ЃbKN/FEkAL|ֆoW #2uZ \BYTj{ʡCSS֦OܼicM[/mӶ hChu W=@A~^fFZVfzedeV飯޹cgUڎ@PE$*1C¬t''&Qb"c"?v>-[䢥7B7Wmyh%bϬ#- [tY!j/$aI 8,f$̒t{Q _2lri{'G AWJK@cVRiqaIQeofN뫟|.$871F1BPp#<2YBٗɛ͇W$%lm`3LU[+JWn,/.).l f "Uf"R#]I - b= MȲFXy >P-fyUB e%$f%&ǢR%;aiK g ,G7s'ߐTY-IQvr+'n;H;,̹ 鞜ɪza5sfy>U/((a+;r0/sp)+!>gŬVQ-J/jX߃vrSꝹY7M0ˈ9| s>;Ѽ8l*7n`@ )Dt&ΎGu@:N?g" DAcg"h'ۀ8NPc#Vc^YloИuhf|Ux39 Zm޴IaYB̓Afz Ř_&L CL)Xs̘1ӴiӀTs W;povӷRYkhӧ42{ G+ BZ}59ԮjLuܛ@W&.ca_jظO# `b ƪq7 -[O^=Ͼb7S/s'ѭǟLRE[H E@:s(/ Q5f5f_`zpn{Ń;p XMITP{~~v&wYS~h?/ձ~'_9nMB{Wca_j1ՇQ`q*|{i`nާvF.|;™jIߊ'OGxֻZ|TF<|4 IZob2]ZjT!~!~`ٸq~v1R Z;+_ک=;;&6=3&HYe1:p4Tgr㏻⢪ na,O xL͌gP";ʅf8hLRUu:udrO~g:)lc0}&d|ЕVܸ5Ze 376i6Pʵnt">4#-H[&`̣9q+ظ#>(u,":)BqE2S'*ݽMoߧpQcp cC~1+q5xIx4n*rjGF̖줼WsGD\R2Wb|tVјNHe qA}h& šغQ?$rjlB1ڒGa#YBI(ʦ|Rv8n$VȫO}lr Mlᱷ!P(guHFc=H9!_(1fUJx]f/0dwb7-Vl `Ún [:ˑ?|Sgs^&6o_]DPg\ ߗ{d;=CKm_6~%AsC5|[ {bٿ"?|6Ya_zas$]0R /IENDB`PKDe3G??'buildbot-v0.8.9/_images/force-build.pngPNG  IHDR5gAMA asRGB cHRMz&u0`:pQ< pHYs   vpAg51IDATx^gtcɕ և;̚yo{[joJJURImKdf{{O < $ azʪ}}zފ'NDC{G3%ݜV~\3k]ܯdh z7jgMs&O;410/Rs4,ys2,/bn\~aIFN [qq]q//'Yދ ^n~%3rq'1&QN^\x3~ѿpM]ǧ Ӧ;e̛n]4u#<]9c7 XY8yحyQ *Р4@an"Fhg۞)TGSRnX~<_=U3g6VMTwށrouolNg{WacWNdv ɭIL[%SM<_Y؄=kLNBG Ů9tFI3ӇPCЧMWc}zg3ljѬt\K"'xqbfh;d՜Iٸ% .bLܹ3)Сc6r-#5{.WG.j\TA u~Q;Rf|il]6W0/3KYqEsغ;eX[E%aheZH3ct"F!Je֏v/q+U[Y:W1;sTuck)OV4b%AMJ:SZ^VvSW*M}Ɗ:_R:a#'wҺ>|#9oZi{e&f)3T: <.45 թݛ-wHS>R'Kب3ce4Nf h(ѥwчX!t >wOkrx K׆[eFGȸ΍Ԯʹ^U~ߪdtt'7@-+8hJfFbX`4HS9:pV][u<){5wh;_12#j^~5ѻ=hSwG3kyc3&V^n'9c5 ՜9 ⛖o菳GZXʹaKhMt >>S=S:SнɾUgUᅰwk-o~`@]:S:Gw݁q]qDmM 4N~%ez=o-[1=ͬ)׷wΩ,NfQ*ΕAj ,(*<'fu1HvZ cs{fLUJZZfsn#YV?!o gFQKvw7OE+8CXR}Fr:Q33pO&w`_ل`T@cs ~^8i9U'IzWEe˴"ii^qLtv=>s5,U*9*mz*@Ƕ֌gyømfTѤNt&Nt4dұzh:T T\Z"mXwg~T/OF<󙎨WS {w`+{Psu<-*RMX޲ʘ29N&/<]hLPRf^i@F\lpe,ErnСvƔ|Jo;H/Նn}fir->#v<˂t'gerMCݭR7UNJf;7:Ϝn)Ž + k_Q4>]JZ}3[1>^D|hμ{Hk>Q/ݪZUDg2*$N磼YJzGN-V8;KPiŅD1цYo=oog]Grz6o,]dv1/*&ƍQ%}`Y[T#BJ1Vкr(`8]cD0ݒa3Het)im_Qw૩>MZFj췿iP [fDڒFYFlR4MGU ']ҤqIjdlR uZUxJcZx}̭&&"Jlvo$JRnN[dSږ#hQKHc!^oL1MR̝{͘YjL3@j~\/ꔴ*nrqP8m? ؎*B*A^5AARTqj| $huh2g` Av|ޯ<8i]6}pt;c=c=GX/~u SۉUyRw)ݛd7D7*EV p]|^vNڳu^*OP@&q|{(zZު^FMT/,R{{oVwjWrF['Iڈc]V/Ï8Xެ?h\Pwj$q*q8r69fHwǴ1έjql:-UD.g^hCLp;2`(.RGܜGkd|qiz;QF7t(8mO 8a1 O|/9ܪ=IB K94D7FՈjVr&19}gܮ6waj!N5iaF!AZuL&w*RC|F\"ϐҫN!>tqLCgCSX1@6#_[3{{/"n#.7?!#OE#bc眬 hr#'4 OqEN,2 ~92Ap/}8r 4rV.7/H^H\D|Rq"Dr'/.|¿xɳ@$FhvI\}v>=/uy/?&Ev|0dA}X<lBg nCAe4>mдU2Kӆ&6_<\/e_++a_+^^!Vx F*];o_WKش#5疟/ 'I1ټsΓ]\vԣcB ]Ndbp|8dדf#\SD?c{ˣ>iOs'|R92}|~iYz1Կ#^' N>%Rsv.D8dH'm"G\'X}7n ܻ>xػ9l]ؿ5xt{p'ׇ<6txsÇ7 ^95|tw7ǎn]=5qoqn<=vz 6~zcu?7vvg4j$m8w'ϰ5E=8?y~wδ3jvoSii}qݟ=q>===s?s>sߟu=s=u?uEϻ32C7f'>Åsy#'z~~OϏƀ 'o+u1847bi8J2=K!Le{REO'qѝ~b,W˕r3qxy4tKFS'ϣ&ᑞ<0?ģ=7=s'z5{8g<x͢{0<އ{ޜ/}=d=^=ZE?` L#&cfm'>+ ưB1ǬPb%,&;x1eSxǰql*KP p1ISxdȧxؤQd.§R>( ̧t>,$~ *>IH%akjQ $&RETB;(QIJ1*&NPKYRP.QiOHe 6؛ LPie*CJ Ӥ3%TJ=*zt!-T dI)$fgX7~5 )N'/ :O]t^>sd5`RXΔE':iW(rb\IDAq&Ñg~& W}).@*[N=H?R#`JE|*}_<=P&W _n'yd)\5 WppLY1}d$cKU*g94t15~pe\ћy5 %+A"|>dgTTǥ ǗK0`qs;B%ղ%ԭiT~rTB*' 2i\*FrϏP5dA3h"HӬМ$kfyDT8hF A{veF2R搽lt}* mB\rW8,"Km^FKnJ^~2k5_x'2]$O5:^ Aw^R2$֏0k%/uuajIO<)ufۉ+'w#,xkoG.o|/ -JE'y?o_/6<,]N\;wkU%,^$)qe]oDe\i/mdm{vJ1.-=/Wz=67_هznƗk?=no >țw|璘r:z-37*_$bZ^>Hd:cOc \ 'O2/z3h+'¢W܎o~;cyNjV;ϿZ;t3bfiSy0-e__R1X EC$Ũ7c<έZ_?H糁7c+ne~Wؽ~Fbޠ?ejʪiŻFL*wS>C+Ē{\%5N?(\u/9;a^Ȓ/~4czq'oOPf|{ANlY' DT͈O}!{+ͬ=J+mUS/G= |3Ff~z;I}[VԚ}݇9>Mҧpܱh{=V4f`0`8͞.@R4r=<ל"SZpbaJkY$b1PO 87|y?Ȍ8LH'c&ɔ-GOLo<ĂR [ Hbp d0x-D^`(]i` : E$$ H!CEERB`RKDȖQ%MS#eiǰc6t=-u^R,ꍝ5râ߶u޼Ԟc; NNv[S2G Ј,:ʢNЬ!d\!X#,LB( `("y UHA"hNѻV8ġ yFyk/BU ]ktXNX\ר_Ɨ6ΜQi Ͽ{c~;\OjB=$+f|Hn/]2,Μԥz荔W=>մ.^69/K6R_Y*$g_<ՊQQVrzjw{~Vӗ~V x-FB΂ FRILr^s~x=v%+YoπTR޲M *?m,,\f0퟿_2|q)ވ8[)݈(I Ճgw+&St%zrY߸֫~x%&yGo^ms_rArnnGM[53'}ՏWX@gYq "껯,UxVfDݯ+7ZfrVbewK C>Bf⹷͜RwxoGftP1W]/ 8COBl+_^xcK^t?#: 9wBwHarz4wx*ѬBqIn" gܜ XjɆJZ>0D'޸yo,БPrɗ1A(o& D+%I\Pɗ%CaǤD")IR eD4P7`Q0@#Z"EDC$# #$TRBp2z" )! DsKW/Eӫ_\~/%;x||\\שפ}պ-_i7tJՎf[Ql`1mNչk,|fԬ cP Z!|Jd|h5D'LttF"2TBPNM"P(>r4&"f@:U } ā+b@ `CQoP"â g)Ƨbz`O{GY)KAV'OhRQ*P$7p bfTfTFIIIeXjFߥ0w1Wb 5}/-Ѭ\V5`.SA?;X@JS* .%+iwso`ƭPWnۦJľ 0z>AI&[^mD&|ћ1 ,O~t_}?o\\5n{f5oB x` ;;rSePfj:r;n)x8#:؝OC…dBq ZB}hq! R"ڠ6ue&U&DЕl*ޤ*oQڊ^O?ԮA "ˑ.}!DJe T&ժjւlg12Ȉ}0ؼEZUH{2׍@\6+_ c6U̠O ':Oj)r]j2wZ׼BBHMΒAkSLtwJ.\&`S>jXg'@11Ƣd&5YP'̓X,gX%٫jjX'wJ?z5x zQXEVN!]uL?bڰrAn%\E$HBSGN cpSDF!p{ 0܄V `D/^wd9k<`1&'R< ŮN ez܀Q2PX dS<ľ0P)TxZJfb@")ȅ O>)ќ`:Ǘ"\'J`?**!# :!XKayDq30Fl!4IcB fH̵u@Adn B-!SpǡexFBg9pwt/t~x+߽_޹\<<618r|44V7¨tpu.(i*[tf{*iD5T2Q˔] WmˈCUnQ12s³G1 L 2,,O&TXM,"_ct"5'vyhyJ蛿|.$hؼ8'I P CD@w" |GnC$_Ka tD  e%݋CTT5mpЦJEUbmWd@EVO$ƅH8"o\';u-RCMKC XyY{sGl>7s8ܻ8/?i?i{vb=>b#ΧqbQ147'ƭQ#Vl;ÖN& !"h1.8 C==#XЍ&0. ܠb&D>b#ˆJD0ȍHX  X/y9$'Aq>$(#6Ӹ4Ds) A%xP0Od|@0!u.2J4!^B3"2-WB\4I$ ²FBp6G "D4J@ I;Ci0ae6H4ΐ4-,>NTy0A  EE2RSY_8?o]ҷ?o~G߾#X٠۷,&0t:۶Ʈr{zNU7=kӘ,.Uiu`$}&m.DaM !ԃM2\ͭp^5h@p-. TVZEՐp:\WPVS(k}!FU:UDI-{>5ldOH. >-}-.G}a|mkxkg+}*ČEI_`Y$$vFK?x=XPIZ"G4h蠤7!"J}$6:(#'_ሷ9xJY(yd'}ѝ¡SK\O2ύ D+6}P Q*Nj Cor'OST @*,$*c?yϔ9L_"x i1p s!pHV; p2Jp/G6'8aP `x2'IKaӈDU&{O@+a %TDC$]  HDrF$TNI]㨿?QԗB[}~r?ԪԺm͎^j뎬&V\աujr=&ʊc{kWUrӺ̴!3otRAfuaA%5±,\ "A,vy+!(IU0͗;µ[Z @ B I5!"UT=KSGpJNWQ%!m* ^C*6Ugejm*-pX 3~q]bntV)3tN/uQo< 휆fN&fqQ'#'5]4 8e:c|8m.iӇu>}rQOWU~ls)izJjOSgd - Y0#//Pi vI4C ,y2L( g<ǗG3/KWH|x܏W4A J =`Z"2 )E0M 'E(S &$P8il0N-@`$\6)IP!I-U-/PG4h&:4PxjI$Q׼*ddѬd$`tTQj\֟_מ?n?Co}O{/~߼YNQYj~Kejm۶ξ<2kOlCآ:hMUl٨XUK$:٪rEZ Ӄ}k' HDt|˕aZ z"Y$#Њd4P*"`G==hЀ6:\&%|hA6ՈhIw'i1Q*jMGPJJCD`W1ỳ|q :uKycEk .<;>(%ĵ9KfZ9GTrѼs1N4cМasAsE^b=|[k0unkqK>M vһ Fw|kbbprJt肽\ /h/"]4C .g}H{,ӎOc/K#%1/mOio1C:sg!Z@I^ydi24MpFlDa)tg2#q#yJȀTl"ks¡yK)<¦TOL 9A|oߋDR7 \t!5OgOޓZg a"_6EJǼjP% f٢ , `&-LPFHp2UdA"1$QCR:F 4IDE=+b"DD QM $遞U#E G'H`/&+&:{]FlJP0,TMɳ{??כ͏k[è!jSRizUmj,۪u~}ͪ^7n[4{zκlw{3>< &WjVKf5ށAhFE$"ڇMD0"s08ҴM5oSM$24nLl4aYhи B/-0FiR _冿Qp#a/zB.7+C8h&DBE_Vm/yBOr%T0znnVu:*gsiuzluH:ܺn=z-` j=ѵȪ̪SKܴe)|sZ`쇹vi~O%:t]s:R01M52{/\:P~dvۇsèE7wCtH-Z8%8aC"_4wsmtTv`m5K;Mk}Jo50 w:}>O[<#/a\LFH=O㜥qSR43 %S?J9y.$/"M҅&VК(B(P TƐx`PIdЗ=> )ɟT2DYaR\-r!>({9 ġP$T B eDxDڴV"<"9lS"0$SMYoVZ{堛0_L6åT1"5CURC@4$9M&Р\NQA<鍚ꉵ11CaERF/ґp {ð"y@W<'߿/=Ƿ-ȫ_ٛ?{I L&Yi6ѺV5jdٴT qSaUڍc;V5Jy`7e"y#2R "<8 zm|in­Z]K訖p.ܮ -Wj%ee&<w)%va5 `iG*a&ئ [F 2S [US! VZ1T/:$]??ƚ<䕳j5X8vzjldJQV NImˮ[˙7N/$kk:8[=̚ XTё[-ܣFRGɹ5ߌ^Vws>˝z_Æq?r'TƖq4JWn~^zRa; 7ϯWZY*}{ɍskKAλS9 5Lh|dmaO^b۾ zדt%mcO9TF)G5^bث$6Q ʄq쳬 ;8 6 ΁aM+ 5q"~O9M:7?|xKr叿{O^xdDV%júĔ߾^}hT+zŊ^l$ڱYoWklJzuecyEyܵ-q`;@-^P@8) 0®V-Duv]SpɦІa15еylZ`UGíPաZȽj,a6"m hmۡg߽2*aPJQB VLqS,tURw;lTH;RNjnɮ}t/<$*57.5;(#j|5r?+1E/qflnUAQuE]s*߽z'+Wg~Ws/!+v|VZy[\zQF@`F7aOϫQ_ &VY ti}@7O*j|ZĒ~/'$; ; wR7 0"DS{'/b^l^R?Dv]S{՞q8#Spfvؗ=gs ~9IJ8gCel#GљsBpP/pDY<$/c;jZ% oЇ׭Ho`}9p(Kߛ'PaM/0CJoY<k@?o[( &i O,| 6!EM?I*;GĈ&VC`SJ()(z?/Qcy6'tMDPXw0,V @pJxk-} ͣ]=35Mc S¶7s՛Z8z e /\Joڏ|M?՗w⇷Ƿ"o~{_+?GސyʪE]Cmm-t+uZ&լg{nK)j9֖VvfXtTHvmEP0R nՅvLP xho:#p.}]Au1a+=FHw}&S{+gi/ō"agIcY1ܳCw1x=Co>|[eK^pXH>zJW1=?D5+VBKB^*\]6<~8mZ 5-U=삜Ҭq"7qWRK˛SZ :'SQ?8P1v+.OoƤfUVuZ(ʝG?=qeսn,` ,Ӻ=TlQSu[Y>$݈MPu ?zu !j#/lz?iz)a[駒;n=N)awAO,OqDCƑ_|ؘBwLE]:.OmT9Ev!uY>e. N2we r0,<ptE"8`H-`  5h"GdU _NU`6^<.p&J~+\\H6m4 [&gye6W<>89,] j&z;zXuͳU%KòJvMl8U3?߽?W??a}?ևkxR_~)reKBzͬZm꠳!6M@%XԪC755JXWRhG.=7*ՖЧJ"2h`AtJt3R/Bwߡ H>#mPi v!27r1RFjFk}$}zkT7Q.k&MԠ)cR93/?ί CU5HJ-τ狚|B.;.k˖oQ** QEqkg@G`SIwCye~GUj > {-*VLjyÌwF6Uv ft%7d4ꟽ^I7V%QI9-Qٕ]Ei3ZeY\@RS JzVfESZYS}FtAC 㫶W޻3+Y\i^*(*fHbl[ɬ|EB!Ou!! 6>B+}Fi֓MRF#0JL꩚1M1vyyYBЖϣD̞?s<+MpΡ9F:" P.\Ck%O\7by"TzsȻJSH4y >h|H*$/e(`ďW d:Th%6(JVe9~P)2VeJ:#rƆP"" ։!ETkLJ@o"~ i 7lI 7C%$Ө )N&eY`uM)1B.wU 2dkS6"L$ Es̆ڞجΘ{Ń=M]t-y z|n/+x'E E_ԇM N$P" I(%4I`,P<ɂPLU&Utl- %N$)\BȆHWJ$ M:#T}h*R$ `Vy7z0̋jVRx g RN٨@5 4fՂ5ۺu@$_)؜MͶk? Ç<ѕcfBQS'ԸC,{TgmԌ Ì]j~b)-ܗV3QVjL \8vH~sL-9hmJ=OS쪑%RjS*oꃓ*!TJ,ia K8kۇY<9%?֏MfX s,!9h͡'=REk_4Fz w,D2]1,ZC;ڃ,S(V1cd9m@rD-S!P]9'uyuO7&~֞hw$6A߃)vz5}TU%"tJ`"bЋ(`VSX ^&r"؋[,=E Kk"o$[,$4=TW,l^AMRb`S~__!2R&Z4A2(&j_,] "ˡ U*:RKp*)9vLU d*n"  `#%n[MǑꉪT4R*>xm^I˜qoS$ͻbXoHD 5Y)*rh1lprviKmq9t:d4Zƴ##srQQnn8Kã mmw;|߾x|{_~On7;[$ܝ;#UYޔ(7lS;Vodbrcߴk:+0)j(@Piml](Я#@Vޢ\;NN-S !d5S#&bpF!b`ل5rMo{æ4ʣ=*DSD"Oڣ>*=Sj(.>=9,F-#d=97'GT#Ø2dpb:Go _,A,DxB:r-U 4#/5*d͔4}|z-T&:'[&-K_*r dS*!,,eŴT-{JK}b(#)T -zR`ˀ-_2QI4!_̇؇Ve+0T. V%POkJl+Ppp*yJbʌ(&&&߅@$Hz@_g$i&,V /6# 7KjC 2 0U/caͩx}["Z.jwwF^_,fyI:}bݵZOݶpIX_a%lnmhz͛x/~x^OnQҽ?U?_/}/n|[s7ߺ^Q1&`RB&QVp@r]+WdJ (L[O!ZZ_ZRId玝֤Y8bڪju͠QidS9g“Pf θ% cD)kvjP G領v )aAq"TXUG{Pe] A/Gc.2IR˻gsfײiZ~V=**h9fiVz>AiX[$5t==isƂEGv1zWdg|!r#]ŰW?9+b֧5]O,>D$^Z@MㅌX6Wp2Z^#V_ C {WȜ/S!THat]%㩔x+JZ歒x+V|^V嫾Jr_g V~RGM*h}Y W4dSR$ծk$EVWoj7uPfZu$R#!B 5~6VItֈxDszA+<#HvX44 :`;k0E3p&4r.T J(,m5}L&aC s%N/kT=IZ+mk5[J1[k4;-ׯD7>wn|ʣٽCŸ|/}?=מ/G}Gz^ڏnoK,4C*˗%[~k])d; ئƛ7JX.TG&ù)\P&m&fr8CP!fm$[A:!DDӂ qH Pp/HK{t/,ݣiC%@bn{qiQ$a@FZMnOZb3ΠݦJ k=3~|I7LgxFޅ?p>٥AGHcI%q Bꟲ|2S/|:Zd̋$@ۧ?]I:҈]tt|r/M#(ybm/6it%\nv}FE Loiم%z CFڰCRdYoYFi}Zl/'51.}EmƵIm`\9O'M24@f(iЇiC!02gi'82I 3.6IO& 3&5(M\dB͑J JoicXX`3hCôP,+)͞%r[-VqbCTwffGQoPOrRk6n1'[LތYMf~E]&omʯhqK߈.$FJݭIU7+?-{^kw?)0%3d|PAtɇ+|D" ;;;:ҩJTTJjKnR,z݀SF)Po*tjeGmG6yBO=G쀒Q+G$mdd1vLQ#J~x8uL6ONҞ5pN(TŽcD6KPvJm`SXXsJ8.N39)ZF 6,X2|Ej:?K ?]I)$=e% #\C).ԙ2.ʡO`^Ğ#,"h~I:'w]FH佰ˑ,mBD $!4 k*bOe 1!TZaE6=MEF6aNE phlIV:R&hhfS ԥTMb}`J矺 ؜mH 7MU`!Դ 3͝N6m M³lXxn'r,af؄c&%شHEEF_'H iNoٻيa~avdjU SMOerkJӚB-nh4zr :m ζnk}aGY5W%oF]MT}5zb%Jl޼QLWK^YZIl;ދ.~66פ+fnn#2±S+++kJlsE:m^XSJWlfîxg۷Y4J|oGaPiIq%?ǀ 8< O*LSJ}Fm%uFiωM 6@US ;`p*.a=H&9 2[%в0H}Hk+B+}3k.l'5Zҡ7OYړz$ӧCE_ECEFvaMd7 uydF)%XPadӆO'H{ۧ"x_2bER\SJHyQńC+ڰIO|YD E:J P<;=>"0ɮUzFggKrʛ%T\K8Yѹ-rd7IJ$⣘wr bZ~Xs5Qn[Nyok,W*{&~cT Z,-8MImԁFlV<ۍ&@<7V%,3Ω-'P`CN=u mV Z@ *Z S+{!#]^wQgx(,}hSr'X&V,'φbEP4@ l^.i@6 1aL2ѻv,ch\44&-/_ BhO5'rDhѸJ,klz,R?=7<13<1}aß̅gͧ KOI mpf"HPFtSg7K OKf&gIOz&fF&gG&gF{:ZۇJg M = S#LGt-87ƟbHe+$bՂd*&v6+g9391?35>:25>69245<89407<8ZF kliGMCv566 \aXPٽ|>Ԝ2Ao(Ɔ99@A n9tp }a{ xҸe:L"\Yߔ7"&]Uek5o8zEG̪7Z`-ʹ;΄O)#cncEΓ~qHsdWhFvi &=Ҋs&]zyoHMġK[dtzIG[KJ*ynhLDnzmbD3bfbJRl6j~bruMs݃L@.(,2j럞aAթJqxx"$ܑd L. c~N*:f#chq'[ J\‚R|V#&\[\Sl[(ַH=>k(ao TbG:%T4L;2m^5uFR=:ja>d܉"!wk>5Zl38V+Ҫ@ QP}RÈцH$.1:ƘZb_Ϥs)~ϸl56B,p'$0PBRoouN7DQ0Ei PTvP‡]G6# "{cJߓhA/!>mxHwA3s]^zHq"zyN"pё>P&rQ]md^35ዻ Q$E٣3S ^A"úsϧAB<9y\>r-e4102-ljdWrաtl1aZt@kSlUV:9<.__E^{vr 87]('WT|NO]G'3tyx?>'v:.1~x<:q:#أ3 `0 ??~8BtUG Ba/}ɦNs8%ntm>ۧkVsfs}>fT(l0s]:[՝( '\ut칹5h#^e Mgi6qd+YiyohSՎ׍+5cɍ ma:źs֑\A+wFBuXQb㱶:+aChva`>ڠ\Ժۇ]HP'.YCwqyО{qF^.?bdzh uf yÔѾxz+{ `&ԟ` 'nGxt0rT:awbE{'NXfǓ5Hו!4yIKOpxsD@vpQ0NGqBr y |p{N߇ 8^ۋ -=:sǧV񀝣LJg8.jA ĹY{{GQ>=;?8:ΜN\?ºű)fWj]{b6fid1ĒJ ;z>Ƣ`t5<2SX1>8=>zttov3/OK_?zV>bXǡپ1žo=:{6Ҁ4F{w/ԃcձB~`?PÃ3x\.y~D=suv~~v*'Jy^ ̻i5?[Q23>5Q_Kի8\RqO^~>AKYB.hFL{t*k+/bUWtͫucEr?R] |$Z:z'YEqtI363˫ҵ)PN-@  RyEt旔+;Gg юm<^LNuC `Z ʪҲq,RrFnf^$y烫(qvJV^V~q6f8:qa/`3\kZϽHt bm~pLS2h??=:TToyUh/A^t|yQ9`s{<^8D5>8==PT̬P"ZSm(5-F@K|k&6_ȵX--zfdbzI>=dEsdhDž-U>u:=]X\ޣ3 %cv5uH(γ8<$}@.0 B~? /'Ӣ" z/.S7X`?T7srrNCa/mAa <~aaCLj"VY-%>FbU6 [puMnsdrn[;8:ZEYq~ygi$Xӏԥ=x(up҂.~FŠ=hcYI㽿ꃤo~ٙ]i91JuYPٝZ}7 /9uuU2BvLbJ^QLKg晟ܼ70'5w5dQ]d;ڻ,QzN~zv>Xw| N$um01ԀYy5Iٖ݃ܢ2U0dow$k`ѶWPZ 5XN]^C}K8qbک3:5=83Zr Ku bpc=6ʇɓLzɎ%UuaIyCs-clt mllrqHw _㥥eWWPQYT[ګ9ܡ?646WTLM%@hBpC"D1tztzD(Ha?$)yN=ǧ'Ț{2;QFέorkKi_*c3FlEB.9H"0k|rwLŊ / ی;ݝ]sbLiiYNAw[?񅌦,P۶w[E9dѦJ;19g;Ʒ҅&>s;`"d <Ron%|1b.щclȫ]]"]Nu qcwF .Amf"n&)iV/18񥊦~V7;nt5HL %BD$P "ڪhY*HGf*B~d~Y[[XJi^W6sփʲҲ䄸V~ybe_Ioc&󳯤 g4VjYBspsXq3,Τ&ɶ:\|o^w&0S`iOWLHUG+Sfw#.[7, ~!5uWlc=!V0W>0.1H*gF8B &9=_S׀1+" fyDgUTllnA"Y`jP]]}cSV0@Cã5u5`1B =$8Ĵ׋TBF~YCp d/30J)/X[oA=4N1هQPo Dօ5ݐG+ξaƺf}mtXֵp'?O}rߛ._H~-{؍%NV4)Xg ,lB =gƳZT "`gxeɺ$}.&#$ԡHhr:}$`ݡh]{˕?{ŷ_z/Rrg$7M*Ʀ>N5vIs97#i:j4jvo&|99J+i:6 0!9C^]:LEMJN1! b.nbҵupIt$rm{$+R9S5EC-!X0v@"eni`(/Î {*J "5LM k;M%)"^f9ĈO]AZl+ |AƥH``@.™tz ;\ThpڨCdsN_N(@:Cȷ*!$WAVQaR5#I4BPfX 8J-dv2'\J,e8DӸc,:!id&m HHa!P$AčC}XЀDLBZCA,` KWIZ _W8v$ˎۇp{yۅ2\'F.>b1)NؐifJtF獌ٽ+*FsK++ Pԛj_}\AF{|}5瓬g'5v$VbZ%tjV;)o&6Sn|I\Mo0غ[ME==<"& YL+nMX>Yɶg#(wPWm~V6l+6?@J;BE_[JLnٍAtGbEutci@!]9 o\c3 O(%"Ɋ #6DxC. RSXR*|8{pD6=s!H3?®6?6=L<꠽c#1#BL{ȃ~j]za6;vQB`ׅcߵ~j6n1-BafBlw^b6cQFC 6(mp0ٹAP`@hAimPM)Ycb6ņWɼ Pcbd:vhHoOpdrt%&l0Z0aDzc০ ݰl_vc@{ //*-8C655b =ŮQn8w|fi~[XݚS}^rLju[pi FU\K7ub:Ӟ}߅{ƳcӦmd։iZŦ RniqP^0@FmLjAѪ4Zr|h½`GJ4؋[aǕ[mxy(čd‚{TbAkZ;YQ6{u\K^INCXrqj(~vդ7nI̕[5-m=S3߸~j˕?hFR뫉\M8Vzg\~ok/&sA7Vѥ/+})c^.}1 a/138?50]Z%2Êb/D~h Z./ra2bħkqhGj. EorYl.ȶ"v"RH(,6ٻa9 ca,rPf.\D%D\DK$D X,I:z"c9O3sYH#&Yd陙ٹY&ékc#d1 DXffFabh92>Y\N k 35>1=Ɖ3::5Ajfg`"y?6>=/I߹9r 8əy\.mnv|l6s3kn69ˮY(hȮɩb4η-k;{Yrl~vӝ.I.Z\Qt^즟\8ewh|lbrb||nf hjꇵvtbq ;);ȮVҠQii33уM} sx=q&͜|"n49_Į9" gadL{Aޠ|aAȵn7uo<,ya;K__oe~'׳^*z=GeWWzl uտ[qrMbnSMsoQUgSGVY y%Ż?0p [bTɫ UڽFʺʮ.owf疶65"]';wa'RJ4b.w'F7x~Pʃ?IMwF Ÿ*~⢤iڣQP{ԟ Ō ;FT4^@W-̻(M[po][v jԻ^RRSܾ2,l[cUʪhU;ɒͯ2r޲zCiX௔ۻ7?+_;{g{{wws^m0` &(h D @hF9gr9"D#5ofHZէNU};Uut9w*^~ʰ1 /߲j,^iBV>#1o!S+MZt LFmw~٤+Wn߾e}Y3ۮg3f{G}sG_ۡ' فeC玙<7FX:o߻M 8jБÆ2e]OvME?;yog>Lgzu×̐aVL]G /{~[6{_6yvn\`ˊE,[pe ؁_?=?/O=*ݮ參~7wQ'^y_|ozC/_`w^鑗y[Η{^=].]׋~»:_tgy߽tݝqokP; Ro5hW{>zȲn/y;=`#fo޴k}r|ms'oc։ȍZ}U |E ,$?z\dLA䯠D B[@A[w_?YcbǕ>:w^xv~>ZرpӡE-rH`=욻v;&-2qq 6L\i}K7_q->qqs\}ힻjK,<v]uʭ*7]enƱ3t壧-.l'>qȊc.3u13xEag;`*,X1q7>?0f#' ;i셓/2ni O}Gք='9c<{SG% _k4oqSgv~l&/=y⥫Ϙ;z'/4e5aؙsۖ3g|%_V.Y>{Բ}xN7*/YrFuyuȱ GcYj-;No~~4nzi݇n٘y=L~Ёcgވ_{7cGJ|}Ow}Ov ]nb ;-K.>yÒYCs%|6߼?g[Ǎ[߾{-_?q]3?.h ~z?ί֯o|F k݂{QCzrڿ:vx+|<O}ï<3hظS]4|g~cy٘#6X[9ó_1c¸E'\p%ݵM_ Ϗ/~?˟?<~ev.W {;w.Se|%_tA:!.?ew")}gm;_N?O;^r?şşv};_}]iR.Uc}/h޲вVrgO ~coŎc/"U_q2+v}1˜¯*2yI˴#ߪ|X>VD]sHȨPȫrQۏ,vd gZвߒ-Xiߢ΅\ ,ظo=xgz]6잿v׼1k֙7]ejݢ,rӖO\zv9ݹl;'ߺ㱞7?鮃:&<~Mbwk7={C{h n~:=}w N7bEy{&<_z?ֿ?樂?w?6߿wp6¶;On7?]x?׿7?|kn89SΚ4ۣ157nw~.rx-w`kew>x|`%[V5lԴ^4|)O^>oZ圙{7ý:~x?-|du˃~mOMKtv'trS niw/j᧷uy om6v6M+x)_mt?[]|{oi]϶}wtϛ׭~~kKn緵s=';?NGv{feƎ׭[ac]_!TG!Ն_-_ʈG%iGG:ei3'S VEV@խ 9vm`DRW8VWs7dݤb5ׯ۸)¹buUr ~kV󪕫d6P=1W*<֪+ 7-'<ŮO~ z JnΛK+=UePBQм|/nY]YYI~K!ը%KJ+hUtS\bja+Ȋʕ+W\brl(qKU.{%zdܯ\u[]cނq`ⷼr2B؅r1`խ,…k{ۺm R^3ʱ|pfV\gRk7mT5TC~U[ \[~]r5piPa}W6em uXU`_* TEVIt)( zNVHqcw~^V_eU_ӑH$1V\=?dԹۧ'+7gV06)쇓N||r+G^ov#+z7"m %ť9("=_G{VיIeE_MyPӋ? ȗrB9ɓ%_*/c̰qo""sf V5VV/I>!#`aKt߽9{䉉ҫH4!>lա}gxmTL޲qä [5甊H9rxyf-] /Y][#!hB[a+2CBۼmR}dت =T@BÇ7wtFeӦ")?F9R8%2(U)u&@B"`qcFg7ogN2o3[%i/MWB `AXjuk,[]V:|M mUQ尨paRs|aSم(\1aɸ$bgϏ=Ʉ@ ԆH"E nU$ @F\UkVq!? W-Y `Faz2dȽ+\Խˎ;`k?wA4nŜO) @U$a[m//.yʲz-TTTأ[o޽;{`֧O;ΡC.]:rÇ 뮻ثh(FƨK.xJ̜9s 5I}49s& g" > @FQJk}'@SVVo|Vwqo[1*Hǝ:ut.h1cnԮ_|f޽}چAq" :sYGdϬڠb׮]YPk) T95hΟ~iiKD L,cDżyG#6,<  0pL)*FFU2&#F`e˖7|Ӿ}̛mϻ yl:vE~B[tMm`3,gjd+γ՛>۹y}6Yh-5GF%rɳm6߿"GyEW<(%_}ȧ_ '|Hub3QE;^~LUA{衇*YAHFI43K A{c+ÐB]opr6Z A!.%金gL1pR2*t-tiOR=\uhoxvL$3m= :W᭖PNJCC?ٓD}n~/I/@sbfARY!a<%[9i$ZI-GkN^P wXcCdz>="J7̸|'iK|Q35#|7Ǜ^\K4J"{cKjHօ,Ʋ#܈ÀjI~_aL/LsmlZʐ (m,\HXIpF;W +T .u経kZAsYbFYX+ţ?*G%'q~4ZwR2 W YkfFvUf #?8%šSHy hc(I!Z֐HSSY{@&#Y W55Ԕ C Ąs@/bʲ8:n,Bưd*UK7x 1@=xiX^S(,,z;ud^}?z.LpS@GI/]i [PRQ+]aa  O=D'YsEeHmphxA֘Wa8,BpJ̓NE x * nУjxD*-O`\]°gxEJ5~hJրE߲iMFJkbAIEirGn#ܕD$?gxO8?ERydp O#DFUb|iKܷ^4/ңaڡ0B4b=GxLBOP"-'{ m&/lofpGU#+kФ dVZC{ц{҆M(Q51TaI3)í,SHH1' %\sV<ɓq(sV RIK@ þVNnđR~Q";,LI#?0("x +wY8+mRlvF^7yE B&J]eGT  ʞLWTԷj^UbonLv6ȢCwKGI7*dB8F #&:_7_ m ";{G#RkG qSG Y9f3#2|#(Jb”0Y"9RYd!-\8*rSTr #YcFQy QY g+bDw@L ܼk+/m٪ij`UJ|TidJiJB|n|ܫN.=O045QyS8'!( V%)eRH$[w !h$j)2!Hlށ@By PbʾfЩC QNd O<)UB !pn(1[UL| z^u(Q8E&ҰU J,Xgbe9ӇgT-*g^ȠU׬NjX[̎,ޭo3z6 @Ұ  U8 ˰@ ~2b1nY4dT1ˈK/eAi%K(n_|lo) I1W\q4FڦpB !|([|f0d`,b/ޥg' jc}ʐmtXŸW*KÀ+;|;{UvGй;^O%J|O*yB !!PbAbЌ-0N/Ⱦ _/o&/Ž_=1?m8"e9f,ַ|7ƴ삂 ⵟ't퀥@b'Z %f+[#+Vo~,Ѱ=@B"PcKH's" &7;n H mDPMZ{变z7[OgL 7JH!PJn}V0`8j eԘt+!hFJD(+WdFO@Ty&!Pb-H$Vg`JH%[%S6 " L @)i輻`j:',E#U&SLmLem|Q^qYYT`:~$σW$ExV$ùb%)s1y`Rx5= =[Q,5R@)*BoK{xGo 537셮fGp\fŋ+/p_]yL$gW'.3L\|3-m$!?k/|%XE9JɋϽHUY(0$##: ТeC4l +Y)s.d/"Gf]vNn Ugabi(ghS5+~yx"f K2\@pVwZ| Fv( [+%bm;a„0qOre>5Hoqxdž ! llqrx00HGwq]wk¦G*eb=KtGx3j*)fUKeG.m>Q}Qc = ͏w͌iN ,!%ꢹ"BgV׿+)‡zI+XRVtpeԞ9q"dR% Nj- aPY; ,9  tbxd,yL؍e(uHEXRq[K- .Ϛ4.G)`^ xrk (?jJ Kuo31`ǟx[XM( [Q/ ^{Nsmj.o'w]@gDSho^#ii4Wc{3< 6Gg9pW_|PKmXPH FB^P0=m.G4Z3"^+5BqK؆u֍I 1STHMo:w,96Q*aFe3 HXPq`R$t]HSA^h mn[o'ʋ6Y(bm)~gө`VXc.|灒QGP6kMTڮ];e\HCx䙑]PRTϑ(婻@ ZQb@g Mxɂ ʚ -[쩧ҟ\]vuۉEd5Kr1`)^f@$ݻwHRb,Nk9X@'KOAy4BYk1z LIG U~.P]cRԠ#? =rĹΊI%WlwIM^4K]w([M]Sb1\RG=)@!Ĝ G˧##wTrP`$tâ+cC1Y ;bQK  xAgPɩҫECSJ 5/] +`F)[< 1p7 RU "t"ѐ&.!2Inȡa 85&c݈Ey0*2eP",kbSى0JR$٥Zrje"zޙ$!%ĤP|ͪ@mVEE*Je##ߨf(RejM6`" ER5OMXYg7Kq =.QdQP"'KOʭ2d)t`JVTpȇ͋Նum2ym*jӐ/T)d>Ӽ|ğR90Ȩ(g]x5D;|JjԜ.6xIDFHݪC@٪7zd$SLCdQ)ORGܫK_n*_9fwX/I^VJ93픷 Po>||fEv/p 0JV- ƫNQ-yFN u#J#LG@O7M$[$S] #꣏mݲy-eˎX, ր@aٷwϰ!F>F1lڎ:r[M(/[lgfϜeH+oƭd+ bsccGܼigce+kb%_6U+id2z=(s8GdaL J:<)=jcMҚLNVEhEu/ [wzaUWXH=6[Jv%UR/ ,̬٬2CeșQ+eeUg~lf°].%I\D6eԗlF͢B1a+ňƣWelгgk'(&J[ cZ;ٱQXۃݿ[b9y}ֹR%Jlu/|RЌ([`PoG@f zIV͋^ O-ط$cAUbk =cO6&6-![ ``3nv觅@*r)v81}1LV$$bC`ۭĶ$%nѦYNYTͲv[(|ܰ~@pZJԜ(1[Eճs&M(_fnjic&X9V-\vMvٜ^Tք@(=[U)X"CFH.8a-`׿$h 4?AlN}TMBێ|˗ܱjφ-}۶۷}=w/7wUdت)4T PbʦKPъt+ {6 .xj#i9&|XT@՚U+W\z ukV-Y`Y_&哏 TN8:Yon^T w;ҊN s6y†ׯY,_p܆`ty#U=&_Xot#Kb9{aY"zXUVTsɻs^Ti `7' g͜iv}k8o6>x[TweAW, UX;2_UL 7֑Z#I!X*褙wO ߥ|EY8dfJ UN$eO۽]uN?w3>{=7lU+p72W<놉_] ,2w–r 9:&0sx9eN 0nęzl !2KW- ٝ*%: /4:r+×]tޚ]l{f VsA(_ލ>|8?b7`@,U%#(lդrJΝ35K޾mǔتI0u#GٵsG [p~+-o];mDaoݯEhX^}\$uX٘ƌJec fˊlL_T@p4|ْ%Ᶎ>{TykM@ŋl@GOIm>PVlLt63R !hܾUSŐ'p:u¦EЦRDU@S'@Wײ*?=m$ 4Z>[)ie-j}\T (lURCJuj:2oEDë`uS%|6M>P[muj"NYL]u%uhC=qjOWZ$߱Ӕ(=[4@;as'8ɫ[%5o)i"PJ NYi N O6oT[jO4d@C#yY*㾦HZ[5SF%Al( I"C@VvP`c4lhyBXuX&E 5vlU&(jC&7MJVlH),lp#=_W ݰaM7ݤās 5, m2I0 f' E>Pd3$5L>Px[N(=[y?՟ ɌctplYe/'T`Bg %Oj74oKت 6T:(%[Ց͹}{&}/S DQm!kJ]HUhT'E |,TدB"c mP1YT@UfǕ͜>m)ӧ~ӦN9cz+Ia&RTÇmݲiQp5Wr mfaǁ}GBi"к*߉#-DmeQǎ9r*װ#1Ab&_hQĶ!;gƍ eho99O.f1dBbsш&[a T˗-5BH2 @U_Y}$AEl(/OɣewڵkȤ[NK4RU4~je93)1oUD1y&0:VEEҥKEF¬_~VkDfb]KZ6nkd6g+6Չw.n|)"PJʲfM3<3sLnmĈ8sȰFfTTF,=uM6q:ё#G r%b0(kĄڷoGU؉߽k䒽!Zd##[U~C[:l"cT$]:d䥪#mg+ I˗.^^ 9gmtNؿ*B}&<~TGLjCQ*c:kq7&3DyT 2lPX}ihshu/!ٷ"|ǃ'iZ0mx[g@UV SDL>+a>ImH,/NUMԸjR`[:g% uO>ѷeL_牭멖Yɫ קqz_p,r"I+D ©SSyVCg)՚*GLW<(zk&tC"g[3+=[V?5qD4 wš)7cj:2"uF3\*̜[JW_}uPX תŗ*J"sudcjk~gcJl+g%#l0y|\ yjg`B1Jl=Vg 2c W}2[o1qh:mڴsn۶-;Y_23@N /a0Ґ뮻βx]>'n46:b섣ds `eKbQh\4=NS?8gi2)p(Ol,TB豏]2`'||[Q:ؾ ||>e r1X1L~ـn mTM1Y2Βw߭O\h7<2WY g GyD͡a+g/A%*z|_[U8-y0>b1gW5؏=ٍ󠯪%#[eU;[1QY)~ yUn0}%&Fy!%Px0$\8f)7TZagsyYc˺5_UlWeVaRjAOlcCw=O>)[3Z–fBg٪ƲzxfEIKˬaԘZ}eIqd @7,{wxUaY0_ฺӶ2t{N(lp=nm5* UqeimZ9@ݿo+3 7vˌ}ͨ-VIɓ&fJ2m쥯[1nڸ9:Ùk={vW' o3Z =s./ 0 sV/\i%7bƶ?gX-7[ǎ}hS?:v - ޜ^ǟ;wh ~Ln=ZTA;fT`q#1FΟ7wΝԝQyΰ:>ۀ4s5ZeMFjL<͞(_Ͳ'7L}fO9`7^Xo+a5S,{l'gs3eכwvު_[U/eV<<1N^I>phiCQ,N:vVw,`N%ɳ^+PibmBmOk]7|m!\u@E(*!p; Zʟ*V$8 X쩉LV&oZjcRpV݆,4KCWbhN93s푡0™x}LV6VP_pŪ9F/Չ>a#ǁXm Iϲ<$*FVHluW >oUyl{i +<.C"nELJ"q6⫫VcFo<Ŵ#ҳЫ-j~T ٚ厣+qiCm/̙ʎ1&xm֗Fn4;d1V‘E:"]7Lh J2Z$q8N,@7xp6"@'S {4s&Yۻ?[=yX>J8v f|4RLB !мhڳ^?P|!l' !0Tv7 ln-{=bv2iV\ip%<([gLتy h ҷ#3qfOl+[ovZuݻ;l&L@@\fMv^7r~4uTN"l.!A|sYAj=[SdB9"Hluo23Myy7pÌ3x /U XlD+ @"J}4?WAXtR*h3Us|)S5"l2plo1bĦMpt.2رc={%PY/Q#_n<> ~|WL, *ӑH4wf@Gc=xAq'} v{Uʇ B[=l߾͛/[套of5 =zNݶu ڛo(;-Yh.7_VHt}{+&#!h4[3gEǭ=t?B^pu`?fO>v şn_G,VH[uKL܍?sɭ"HO#IK=9UsISU0*&9z=@L:N'E!-q֑e' ,=ZP3 M)[#!h -?yiS&Ot/ߺySJ @iVVgۻ{mfom:e)'-Z. @SC* ¹!ʓHVW*!HԆ@bڐI @B Uz4 @m$ H4-[5JHԆ@wlH$DR1T>lU\LB !h(d H;مʦvLGB !Da'clXly1rܹy i1hTJVmڴ~iӦqƵh" ʼnFطo_}窆-t= |dۊ+xԊyh~>-'T}:t|%.C p_eeeM;W;¡_/ć7eЁ۷яdj6lߗB$GTK/TF=!/YqW56ƙ9r~} 5cԨQ'N4Ѩ|@Fŷl2f̘gyF8WHOAPW{w* ϴ,&M^{m@;=lԗ2)OԈ@)*OqihH[z񔶤hkEL2کS''`~u#Pؽ{w]_;[n\x x (YzRvܙBy\ڧTĸ뮻#\o߾3Do#)Z}衇TУԶmРj*"wJ[y"9c[&|aÇc^jqgeǏQ{mKy/Ɨb'@J3F~ęRYFXO3f #!(%[_imXflX#V?\D M4T4? 8~z! /h:zjz rDshPڵ&a{D)/+܄_o75o,)SEG xI#Ww\ At14SqG8H .X^KU_u{DsU-$rDOVy]W9h@^PdUN/G@ZM S_|ɄZ+j 䥋dIK[܄A!@ ˜KoKN1)uo(Rb k+tJ@S=f#!(%[EU5oCu֩11# o~]+2v8gV*>Vy3pm"^ U:/P dKņY;|.^h4 M(bQm21唗!>5_ .MytܥDSwREoBѓ|Fz"яsW?%PSD׬( DB|(/;θKC䫛FBW5QMeX;+Tt|u*XVsB#PJfm53l6Wcj7,H< 0EHԛ0,2ۢIEcLߘBV(ozcLSfy|ȓig0#Mָ@vfLu2eH"hrZv#ᆊ l @%!,L~.g.͗}7#t9/PP(oY.J⃦0桤joe*^B:dLkiMjx^kc&}:XC# eS0xǗ2`]vZpa,;2oݬfp4lYp@Q CE An[.ͩh! Trw -&})b#YIK%]4cI77D8n*2V}ȋ} *>EB|Tl_ݺ+@*DLd:TJVZpYЄ@C( Iۢh\sM,z1 7ܠ壾>E:u4lu4u]!Y*;y^FmZk%GCAK2@FTw}bXj9B,3ʦÅ=kttt/܊`+Iha (f[/GIb4dC*޼⋣7!Ilt`JV~,x#G*=&-%FQ}Y%Uw^$׹ _z)U c.i~Ns=Ih=}z@-ѓBndSc)qNCT)٩ZtPzIN^*ѧS}3ƀ(IaNb4 Jgu[Vt!@zF1LTՂ[iZ PJSj`m:׆RTz)ٴBmS|Be (lk7$A")ȟ) D84d#]:|Y'n2K@d-:C(Y(a6oJbá*F9!"hx7E!POX7!8{lJUH$!!)@B$jXI4!8$:৬  ت`%ф@B"N$@bD s@bs~:!hVM$!!)@B$jXI4!8$:৬  ت`%ф@B"N$@}פeN7b`¯q2& F@ ȱ _1hGLcޮcwt'jԓʄ@B[WgĴwL5hқ&0s#ʧ%j8)EB !(֣G̙1O޿{vnٷkS&Ol(' !p KO8;xի'O M FAV Vuʔɓ&M?|5W~>C]qV% ݻvضkvn6A_B !h  wЀ~~VX_rc'%tEXtdate:create2011-03-13T22:59:24-07:00̳%tEXtdate:modify2011-03-13T22:59:24-07:00tIENDB`PKDdd"buildbot-v0.8.9/_images/master.svg ]> image/svg+xml BuildMaster Architecture Georgi Valkov Adobe Illustrator CS4 2010-01-28T18:08:16+02:00 2010-01-28T18:08:19+02:00 2010-01-28T18:08:19+02:00 256 232 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA6AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FUj81+brDy7bQ+p G93qN4xj03TIKGa4kUAtxrRVRAau7Gij3oCqxGdvOmsVk1TV30qB9103SKJxFagSXcitM7U6lPTH tgtNKLeW5AAYtc1mKRekg1G4c/SsrSIfpXG1pExeafOHl4+rqjf4i0YEme4jiSLUIF/nMcQWK4Re /BUb2bDaCGe6Xqdhqun2+o6fOtzZXSCSCZDVWVtwcVRWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVD319FZw+o+7GvBKgEkCvU9AO57Yq8t0S7/SAvPO+qbS3 8Ze1HFm+r6bHVoY0X4m+Nf3r06s3sMB32SES3nPyyuk2Wrm9B0/UZVgsphHITJK5KqgQLzBqp6jJ eHK67k2pP5+8nrraaJ+k4m1N5BCsCB3HqE04F1UoGrtQtj4UqutkcQX2Pnjypf60+iWeoxz6mnLl AgciqfaAfjwYim4DYnHICyNk2EV5UuP8Pecjo6Hjo/mFZbmzhA+GG+hAaZFoNlmjPqUr9pW8cAYl 6TiqhJe26OUqzuv2ljRpCv8ArcA1PpxVb+kbYbvzjXu8kciKPmzKAPpxVEggio3B6HFUO1/bBiFL SUNCY0eQAjqCUDCvtirhqFtyAYtHU0BkR4wSeg5OFFfbFUQSAKnp44qhv0hbH7PORezxxyOp+TKp U/Riq5L63dwlWR22VZEaMt/q8wtfoxVXxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KrJpRE taVY7KvcnFWE+cmlm8reZL6RqulheR29OiCOF6lR4lx1+WKofTIoU0u0hQD0VgjRV6jiEAA+7Isn jnlvR76XzdF5OoyWvli7vr+F2rTjKqGyPzV5OeZk5Dh4v51ftYAb0n35X+YdE0PS7bypqsclh5kF xIk0EkMhM8jykpIJFUqRxKjkT28MhmgZHiHJMT0QXkfU0sfOFvovle9l1Py7cNcS31ncW0kb6e3H kP3zqteTbf2muHILjctj96Bz2ZT+aFxr9rY6LdeXU56/FqsI05QFPJ3ilRlIf4eLIzBq9t/fMaLK TOra8/NU2cRvtN0dGMam6eC7uTKpp8ZjiNsyFhvxX1KE/tZJih/MUPnmG4nm8sRGbl6X1RjNELb6 v6ZLp6cjbyGb4ufHdTTlmu1Azgk4/v2r3d9/2u50R0piBlNDe9jd3zsdK6Xz6ICSX84VuP8AedpY WjiH7qSwj4yCGL1jykD1DSCQL8PcHoOJpJ1d8u7+b3C/tv8AGzkiPZ9c6NnmJ95rl5V93M2JJPNr yaq8FrBany8skYubhppFuEJpzWOIRNGUr9omQUq222+2eeSHV4PzNt6roETc2nvDO1xLA8TI0y/V TCsjuY1SA04hV+Ibg9Tq8o1I+jvlzrv2ru2d9gloj/enpGqBvl6rob+r37LdJk/NltQto9Wti9i8 sZuWjexVVhL0dWWjux4kFuNOhA3YFXEdVxDiG1/0fx+Pk546DgPAfVRr6+f2D5+V8tz6xm1+TUPR uILX/DnqutrcLNI1w4FfTWSIxCMJy2DCU1+HbfNo6FIo4/zSt9StEtomaw5xHU2nlgkLt6rm4eDm 7MiMgXgm1PAHfNWBqRIV9PXl371+gO/J0MoGz6t+GhIdBwg7bm7s9e9U8tt+ZLXsEXmeA/o4IxvJ /Uslj/uqiqxgyfDINyGG5HQKeUtMdTxDxBt/m934/HOvWjRcBOE+roPX39525fjfZTU/Mvn/AEix hvrnTtNfTTdWluZfrVwbox3V1Hbq5hNuiB/3oJHqUHv32bo2dYEuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KoVjzuHY9I/gX5kVY4qk0VrBdaU1rcIJIZ43injPRg1VcGnjvgSw7ydcTJpraLeNXU9 Db6heA7FhGP3M2/7M0XFwfn4YCkJ7il2KuxVKdNRtb/MKyhgJNl5bR7q9kFOP1u4jMUMX+ssLu7f 6y4QxL03ChDPYjkXglkt2Y1YIQVNdz8DhlFfEDFVpsZX2lu5nTug4JX6Y1VvxxVERwxRRiKNAsYF AoG1MVUPqBTa3uJIE/32vFl+gOr8R7DbFWjpxk2uLiWdP99sVVT8xGE5D2OKoloomjMTIGjIoUIq CPliqH+oyLtFdzRp2T4H/GRXb8cVUpbaOPjJdSy3LA/u42KgFhuPhUIhpStW6Yql2sac3mnREt4L mCK0kntrmO6ib6yG+qXMdwF+Eou7Q8SQxwRkCLBsMpwlE1IUU3+szxb3MQSPvJG5dV93qqED3396 YWKJxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KoVPtyjuHP4gHFUtC/V7yS3bZJSZYD48jV1+Ybf 6cCWP+aPKt3eXkOtaLOtrrlunpES1+r3UNa+jccQW2JJRxupPetMVSNPO2nWri28wxSaBfdGjvhx gJFKmK6H7iRd/wCaviBjS2ipvOPlKGMySa1Yqo7/AFmI1+QDb4KTaCh1rWPM0psfKVu4jYAT69dR NHbwq37UMbhWnfw2Ce+GkW9C8qeVtP8ALekpYWhaRyxkurqU8pZ5n3eWRv2mY/50woTnFXYq7FXY q7FXYq7FXYqlutWqTwSLKWW3mgmtpnjrzRZwBzFN9uP8cjOPFEjvZ4snBISHQ2w3UPy2bX4prka+ jLeG0ZpbSGkRFpE8VF4zNs6y779c1uXs4zu5c66d23e7vB21HFVQuuLnL+cQf5vSkRovlWPQdZhE mrw6jd/VpYYbB7eNZ5A6Qq0jyBmfgvpKNxQLRfndp9GccgeK9u73dfg4+s7TjmgYiHDZv6tuvT4/ PdnFvG0UEcbMXZFVS56kgUqfnmc6lUxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDXA9OX1f2Hornw I6H+GKqV1axXMXpyVFDyR1NGVh0YHFUCwvrf4ZojOg6TRDf/AGSdf+BrgSpyXVrIpV45HB2KGGQn 7iuKoCDy/Yy3IFlpdvZkbyXTQxq4XwVQOp98KGUWdlBZwiKEUHViepJ6knFVfFXYq7FXYq7FXYq7 FXYq7FXmc175t80+btT8p6pYXWneWIJ3Z76KCaNb21WOMLb/AFhgqKjyczIUbkwIUADkcKHoCaNp CRxxJZQLHEqxxIsahVRRRVUAbADpgSl3mLynp2p6eiwhrK/smM+mX1qFWe3nA+0laKwb7Lo3wsNj iqUflv5q82a6NTXzDpEumGyeGO2lkgntxPVCJHRZgp48k5e3Km9KklAZpgS7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq4gEEEVB6g4qhjbyx/3JDJ/I3b5HFWqzf75b6CtP14q4R3L7UES+PVv6YqrxRJEv FR7k9yfE4qvxV2KuxVA61JPHYEwStDIzxqJFClgGcA05Bh09sVYR5p86SeXrnTrN7jU9Q1HVWlWx sLGO0eWQQKHlb96sSAIpHVsCEXc+aLKyFqmp+Yv0Xc3iCSG0vZbOCY1FSvBl3K9Dxriq26836LaR JLd+boLeKWGO5ikluLJFaCYkRSqWUAo5B4t0PbFXQeb9FuLuCzg82wS3d0iyW1slxZNJKjiqtGgX kwYdCMVXS+bNIhtorqbzXDHbTCVoZ3uLJUcW7cJirFKH0mPF6fZPXFV975k0+x1GDTL3zQlrqV1w +rWM01nHPL6jFE9ONkDtycFRQbnbFVTS9ct9XieXSfMY1CKNuEklrJaTqrfysY0YA+2Kp55cu7q4 ivEuZTM1tcNEkjBQxXgj78Qo/b8MKVDXru+XV7G0t7l7eKW3uZZPTEZLNG8Cru6v0EjdMVYhf+f5 LfzJL5etG1fVNQtlgkvjZRWbJbpcEiNpDL6RpQVPANQYEJlcebdHtruWyufNkMF5bhTPbSXFkkqB 2VFLoyBlqzqor3IHfFVl95z0LT2K3/nC3tCsrwMJ7mxjIliCtJH8Sj40EiFl6jkPEYqqp5p0t5r2 FPNUTS6arvqMaz2Za3WL+8acBKxhKfFypTFV48x2JnS3HmZPXkaFI4vWs+bNcqzwKF4VJlSNmT+Y AkdMVUJfOWhw3Nzay+b7eO6slZryB7mxWSFUIDGVStUAJFeWKphYag+o2kd5p+uPeWkorFc27W0s bgGh4ukZU7jtiqdeWL24vvLunXly3O4uLeOSV6AVZlBJoNsKUzxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2Kpdrzomn8nYKolhBZjQbyKB198Vebfmh5YuvNOmQWNlDpkzL6rLeXs80M9rKQBFNbNAjk spqWUkA0GBUlfyD5itr++mhvNM1f9L6fa2V7e6k0iXUMtra/VzJAyJMCJG/eEHjRieuNqxjUPyM1 022npZ6rbzvb6fpcFyt3f3W1xYytJMlvII3eGChHpBacd/hGG1Tb/lVnmC4vpFuLjTIbG8XR/XuR cT3N5btpLs5+rvLGhZpeXH1GcGldjgtUHq35PeZb7R20f9JaYLPTYdUi0Wb1JRJKdUuknY3Q4Msf phSBw5VxtU6vfJvnLU/P+k+bL9tKjNpb29tc29rqN5GB6F3LMWUCBRMDHIPgkoK+2+Kor8m/y/1D yPa38Op3dncvdx2oWeCVmYGBXVoyGSJfTUvVDTl8R5dBiSr0/wApujrqbIwZTeNQg1G0UYwqpeYH ij1/TnkkVB9UuwORArWS28fliVeZefPIt/5j8yW2o2D6Xp01rJA0HmGK4nj1KOONg0iemi+jLX4g vN6UwWtJbefltrr+WtW8tRXGjva3l19ag1kySxag5fUY711nKxuKhFZQyvuQuwxtUs1D8nddW+jm sdRtLqGHU9RvU+taneRXDRXsNnHF6lzHFJIzhrR+dTTcbnsbVMU/KrUrzUtWbUNQ061srmbXZrSa 1dpbl/04jRBJ+axKFhV+VAWq1OmC1U1/Lnzgj2uq/XdHfWrW90qZbb150tTb6TaXFupMnpNJ6kjX NSvCgA6nG1Qd7+Vfmy+Pmp5rrSo5/MiyOrJqF2YopJfRJUwGARsA0R/efap2xtXo/wCX2h/4Z0W4 027u7eeRr67uVuo5KvMk8xkSSZeKKsvFqMqDjttitMz8lf8AKI6P72kJHyKDCqdYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYqkl5568k2V1JaXvmHTLa6hbjNbzXlvHIjDsyM4YH54qg7vz1+WV5bvbXfm LRp7eSnOKS9tWU0NRUF6dRjS2k9xefkZPBJBJqHl705VKNxurRTRhQ0ZXBB9xhQwz8qrH8otH0nU U1TW9KvbttRuoo5tQurYuba3maKBkDvssiL6lR15eFMSoZv+kvyP/wCrh5d/6SLP/mrFXfpL8j/+ rh5d/wCkiz/5qxV36S/I/wD6uHl3/pIs/wDmrFWjqX5HkUN/5dp/zEWX/NWKsH/LvS/yf0rWfM89 5remXMR1AwaWl7eW7xraelHMDDzf4hzlaPl/keNcSoel2Xnf8sLG3FvZeYdFt4FJKxR3tqqgnc7B 8FJtS1Pzd+U+qwehqWuaHdxUICzXlo9OQoeNX2NO4xV57+Vlp+Uei22tLqGt6VeTPqU8VrLqF1bO 31SFuMBjEjnZgSSy/a+gYSgM5/TP5J/9XDy3/wAjrH/mrFLFvzOb8oNU8jatFp+raLBqVvbyXVg9 jcWiztNApdI1EbBm9SnDj7+NMQgs28q+Q/KVh5c020XTra69O3j5XU8SSySsyhmdnYEksTXAlNP8 JeVf+rPZf9I8X/NOKvN/I35V+XbL8x/NdxKv1yzs3hTT7CcepFD9biE70Vqg8a8E22GFD0j/AAl5 V/6s9l/0jxf804EpqiJGioihUUAKoFAAOgAxVvFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWH+TbO0 l1bzi0sEcjDXCAWVSafo+zPce+FDKP0bp3/LLD/yLX+mBKhLBpiP6aWSTSjcxxxpt8yaKv0nFUi8 q6INJsr2LUtPRfX1G/u45AscirFdXUk0QbjyYURxXag8cVZGthpjqGW2hZWFVYIhBB+jFW/0bp3/ ACyw/wDItf6Yq79G6d/yyw/8i1/piqnNa6RCAZLeEFtlURqWY+CqASfoxVjXlfT7Wzv/ADJLfWXo Q3mqm4s5JYCqGD6nbR8uRWij1I3G9MKGUDTtNIBFtCQehCL/AEwJb/Runf8ALLD/AMi1/pirFvIF hYtBr3K3iamt6gBVFNAJdh0wlAZT+jdO/wCWWH/kWv8ATAlptM01lKtaQlSKEGNCCD9GKokAAAAU A2AGKpR5h8wJpFjJdek0qxSRRNwCk853VEUB3iUmritXUAb17ZVmyjHHiP4tv02nOafACBzO/kL6 Wlel3fl6KW91221mBJtVW3nvVuXiCIFRYYxwDI0Z3VTyY77dcEdTjIux82U9FmjLh4ZXfcd/cyWC 4Ls0Ui8J0ALIDUUNaFTQVG2XOMrYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqgtR1nT9PCfWpkjMjr Ggd0jBdvsrykZF5NTZa1PbIynGPM0zx4pTNRBPuSvQNK1LSbzXLi4jSVNV1A30Yt3LMim2gg4sHW PvAT8NeuSYJ1NdotlLdR/GI0ZwDtugNQa7g1FDiry7z/AHzXPmOx02wKQ3uikvNf3Zt4ovWkks7g OjyyAhgvWik78QKEldLrsnFkEY7GHU1X8J6n8cnp+ycPBglKW8cnSPETVTjuAO/z8+4EbZ+afNi6 5BJfX9rDojv67O9xpwRbcsVIcrIZPhrxqlfjpvSuTjqMvGDIjg98eX4+1ryaLB4REYyOTl9M+fyr 59OjP7KSMzyrCwe3dI7iJlIK0l5fZI2oeHL6c2wN7h50gg0eaMwodirzn8wtbuxBp1npM9wNfupV vDBarP6htTDOUTlCrA/HGPgOxIq1FqRrO0MxFQgTx3e18qPd5/t2d52NponiyZBHw6qzw87j3nuP P5b0ih5y85lmjGiuJVlt46G0uuJBX/SPj+zQSUVXrxoeXxAHH81m/m93Q/FfyGn58e1H+KP+b9m5 HPpszGIC3vfq67QzIZI0HRWQgOPYHmtPpzZujReKsV/L7+417/tuaj/yewlAZVgS7FXYq83/ADB1 q3i/RGhX6V0vVZbmS/eP0vVWW1mWRBGZz6HD1dm9RSCvhms7RygGMJfTLn37VXPb3273sbTkxnlh 9cKrnXqsH6fVy5V1SF7TyGsdzEsmsqt8Z7cjlZmqQiO5LKzgniQgoWPLc8qdRhmODcevex/D0o/j 7XZCeqJBrF6aP8fW49P0bdz0+x1GPUJrK5iieFSLqIxS8eYMMqxNXgzr9pNt83mOfFG/xts8rnxH HLhJvly8xfkm+TanYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXmnn2eHV4tM8vRyC1vpXivnvLh1iti9 1BcxpGXpI/JmBovChA48lJGavtAiZGMbG7s8txIfjb4u/wCx4nEJZiOKNEUN5bGBJ6fftzogFD6Z H5hWey9bzXp86fXbeWUrqkjExxMweFE4Uk9RW3UkCo+kU4xksXkifUP4/s87b8xxESrDMeg/5Mcz yPPau96FBcWV3MHtpY7qy1CF39SJg8bemVQkMpIPIPT6M3EZCQsGw83OEoHhkKPmxrVvIWhXt/dX eo3d1a3V2R688UiRxyqkSwKOTI1P3aGqk/tN1FKYmXQQnIyJIJ7vdX495dlp+1smKAgBEiPKx5k9 /f8AcFKHyD5YhtTapq91LG0Edv8AV4pIWqEcSFlRYi3Jm5VO9AzAUXIjs6IFXKqrp+r8Wzl2zkMu Lhhdk9fd3/igWZWULrzmkHF5AqqhoSsaD4VNNq7kn3OZ7qSbROKHYqwjWvIq6nr1nem/FrPZrbRQ QvCJUlitJZJgRyZRzPMAmlVodqNmDqNF4kxO6quncSXa6TtPwcRx8N3xda+oAd3l8fglWl/lBLpr xzSa1G8dvL6wElqCAFkMleTSkA9N6eIPJSRmNi7LMT9X2ftc7P28Jgjgqx/O8q7vx5Fmfl7TIbCy tYYqC1sbcW8DhRGG6GSTj2DFR+vvmzxYxCIiOjotRmOXIZn+Ise/MXXdU0vTtJ1G3oyz30YntHCc XthHJK0RDgjm4Tt8XLZffF1+eWIRMf52/u32dh2RpMeeU4z/AJhryNgA/C/chrDz9pF55gh0mDSo 4mnl4RXMMyrI0ZJCyxhEBYECuzU41Ndt64doiWQQrn5tmXsYwxHIZch3de7n+Czq1mkEsltMeUkQ DK+1WjavFjTatQQc2TpUTirsVSvUtCsLuUTzWNtfEV/dXUaPQsAGKMyvxqFHId6ZCeKMvqALbjz5 Mf0SMb7jSUWkPle61PU7K18vQm/tZEN8ZobdV53ERepceoTySRq0B6nxOQ/LY/5o38mz87m2HHLb zKf2Nj6BaVwglevwxrxRasWNB7sxJPc5aAByccyJ5ozCh2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVi OreTNIuNWj1G7kuoJYTALe5tytFjtpHlWFvgdlUs/wAR8FXcd8XLpIznxEm9vsc/T9o5MWM4wAYm +f8ASAHf06e8pRpf5e+TbCUPZaxdzyQy8vSglhkIIf1QrLHEW6lTU9CARQ0yjH2ZCHIy+z9Tl5u3 MuQUYw+R7q7/AMcizPRNNFnbxoAypFEkECOQXWKPpzI25Gu9P7cz4QEYgDo6nLkM5GR5kpkQD1yT WxT8uQBpeq0H/S81j/uoTYSoZXgV2KuxVbLDFMhjlRZEPVWAINN+hxVifk2CGXVPNQlQSC01kxWo f4vSjFjaPwjr9leTs1B3JwoZVcQia3khJoJEZCR25CmBLzm70bzsvnK413SraMJcv6Mrq0KuE9C0 RlkMhctGssLUVVDbNQ/GDmqyYcwzGcBsfd3R+zb7+96DDqtNLTDHkO49/O58q60Rvdcv5qJ09vzS mkthcCeK3ClLh3+oLKW+sr8dFDjaBj0H7J2qVOGH5k1d1/m9/wCpjlGhANUT0+uvp/4r7/eGVaGL 11jlvSWuo7WCC7c8fiuEBMp+Cifaanw7Vrmxx3wji+qt3TZuHjlwfTZr3dE3ybU7FXYqxXy1/wAp t5x/4zWH/UGuFDKsCXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWGeVb6xsbnzreXLiO3i1osz0 Lbfo+yA4hQSxJNAAKnIzmIizyZ4scpy4Y7ksrsL+01C0S6tXLwuWUFlZGDIxR1ZHCsrKykEEVBxh MSFhOXFKEuGXNEEgAkmgG5JyTWxX8uSP0Xqo7/pzWP8AuozYSoZVgV2KuxV2KsV8kf8AHV84/wDb cP8A3TrPCrKsCqMtorv6iO0Mp2MiEb/MEFW+kYqkHle91DWI9TN7csUs9SurKNIwsfKO3fihYqOX I96ED2xVkccaRoscahUUUVRsABiq7FXYq7FXmPlrz9oDedfOojaV5ogLiSH02DImnW6xT86/Z+PZ f5u2RyS4YmR6BnhxmcxEc5ED5sjh/MXRbeKRNdYaXfwzR281svqXCh50MkPF0jWvJAf2RQjf3xBr oD6/TK67+fLo7GXZWSRvF64kE3sOWx2tNtI806Dq8oi0669eRofrIHCRf3XqNFyq6qPtxsKdcuxa iEzUTe1/ocXPosuIXMVvXTnV/cU1y9xXYq7FXYq7FXYq7FXYq7FXYq7FXYq07hEZz0UEmntirw3Q rLyPocWsLYT6oW1GSJ7MXASZLRYGjeJFQzDmA0KAkmpRVWu1TDNj441ybtNm8KYlV/qIooaa20S/ WVtRupzJNd3F5IkdsOHO5arlf9JUj7KMgNeJG/MGmaw9lmX1S6k8u/4/jzd3Ht4QrgidoxjzH8PL p777xy4WReXtc8q6Za6za3a3N7FrjtJecYRCT6qcJV/3pk+EksVpQitKnM3TaXwuLe+I3+N3W67X ePwiqEBXO/0D8dycfk9oug6XZaoml3N9dvNcepNPqBUuFdpHjReLONubFm6sxJ9hlF14ehYEuxV2 KuxV5X5R8weawnn2ebQptMnhnmvY5ZqOpuVsoIhHEoH71R9XL8hsQy+OV55GOMkcwC36SEZ5Yxl9 JkL+atP+bN1pht7NbMa08rXBgv8A6xFB60Md1PDG4Cx8GLJAKcPtsfhG4Gas9pGFCuPnvYFiyO7y +PR3sexI5LlxeHVXHhJomMSet9evIc2S+XvOk+vNrEdpZIraeB9TP1hH+sFw5jbiApRGCqQ3Q12O xzN02q8UyFVXnzdZrtB4EYm7MvKq8r7/ALkm/J/V9Z1G3159Q0afSY21KadPrGzNNPI5niUEAlYe Kjn0Yk+GZhdaHoWBLsVdirsVeS3Xnq7gv9R4aZp4ku2MV5L6LB5kjBjUSsHBei7b4mIIorGRBsc0 gh1K3i66fDIQ4kjd5bvmpRg6fGJwzcGHwliWFSK0NMxRocQ6H5l2Eu1c56j/AEo/V161t8Ux0fzf PoxB06wtoAIhBx5XTr6ayPIAVedgSGlah6706Zbi08Mf0iunMuPn1mTL9Zve+Q7gOg8gznyR5w1P Xrq5hvIoY1hjDqYVcGpNN+TNlzjBl+BLsVdirsVdirsVdirsVdirsVdiqyenoSV6cWr92KvD/qui /wC/pP8Ago8LF31XRf8Af0n/AAUeKu+q6L/v6T/go8VZ7+WUVnHBqH1Z2YFo+XIqezU+ziUhm2BL sVdirsVeOz3Hmf1pKa1IByNB9al23woUYm8xQqVi1h41JLFUuZVHJjVjt3JNTgAA5JlInmV31nzR /wBXuX/pKmwoZn+XUmqP+kPr1815T0fT5SvLx+3X7XSu2JUMzwJdirsVdirxO/ttGN9cFpZOXqvX 4k68jhQofVdF/wB/Sf8ABR4od9V0X/f0n/BR4qzL8tIbBL69Ns7MxiXlyKnbl/k4lIeg4EuxV2Ku xV2KuxV2KuxV2KuJoCfDFWJWc2sXFnBO2q3CtNGjsFS2oCyg7VhOC0JN5y83zeV7Kynu7vUr5tRu 49PtbW0isWkeeZXZRSVIkoRGf2sVS7QdX8l6zo8Gq2+oQwQT20t76V1Bp0MsdvA5imlkRoPhSN1K s/2ffDao+1Xyldzpb2mrWVxPKzpHFEmmu7NEqPIqqsJJKJKjN4Bge4xtVG2uvI919a+ra5p0/wBR R5b70/0W/oJH9t5eMJ4KtNy3TG1Xab5r8lwlU03zfp8Zun9NEtp9LX1JFp8ICR/Ew5jb3xVktNV/ 6u1z/wABbf8AVHBat6dqGpR6/FYzXb3UE1tLMfVWIFWjZAOJjSPrz3rhShtOutYvNPtbx9UnR7mG OVo0S34KXUMQvKJjTfucCEp84eb7jyvaWM9zeaneyajeRafaW1nHYtK88yuyD96kKUPpn9rFUt8v +Y/KuuWQukv/AKnIZLmJ7S+g0+GcPZU+s7ekyuIuQLMjMor1wqmNtc+Vrq5itbXXLOe5nCmCCL9G vI4eL6wvBVhJblCfUFP2fi6Y2q1Lvym8t7Cmu2TTaarvqMY/Rpa3WKvqNMBDWMJT4uVKY2rrDzR5 TjjjksPNtkkd5KbeJ4JtNAlmjCkxqUj+N1EqniNxyHjirIQNV/6u1z/wFr/1RwWq/TrzUo9ct7Sa 8kuoLiCeRhKsQKtE0QXiY0j/AN+GtcKUJp93rF9p9tePqc8T3UKTNHGlvwUyKGIXlEzUFdqk4EJV 5w83z+VrG0uru91K8a/vIdPtLazismle4uK+mo9RIl3492xVKdA17ylrtvJOboWN0k1zBPZ6hb6b DcLLZhWudvSZXEYkUuyMwFdzhVMIW8nzNGsOsWMjSvDFEEXTGLPcR+tAi0h3aWL40H7S7jbG1aWT ya19cWC6zYNf2is11aBdMM0SoKuZI/R5KFG5qNsbVbZeZ/JNrF9bsfNunwQyv9X9eCbS0VpAA3p8 1jALUNeOKsmpqpFRq1zT/Vtf+qOC1X6feajFrVray3kl1DcRzFllWIUMfAggxpH/ADd8KWSYq7FX Yq7FXYq7FXYq032T8sVYXpWp6aNLswbuGvoR/wC7F/kHvgQxX81PL6+bNK0m1sZ9NnOn6pBfz2uo TFIJooo5UaJjGkx+L1R+z0xSwyL8r/MFlYSx2Os6U8l/YanpFxaTTy/V7Kz1GVZEWzajyP6PHZZK deuG1RWm+QfMega5a6po9/o939TvdRmjjvLqWHlBe2tnbx8jHDLRx9UcsOm43PYKh7f8r9Xk0v6j daho0BsbPW7ewuLeZ2luZNYEqoLpmjThHF63Ree4rhtUrH5N69Nbqk2qaXH6FmbdIDqE91HcP9Yt 5fTmeaASRQssLbREFTxptyxtXvI1TTab3cNf+Mi/1wIULC6tp/N1t6EyS8bK45cGDUq8dK0xCVDQ dS05dD05WuoQRawggyLUH0x74oYz+anl9fNmlaTa2M+mznT9Ugv57XUJikE0UUcqNExjSY/F6o/Z 6YpYpF+W2tWWkacmn6vpRvbN9XRbGWaQWcFrrCqvpW7gPLSDgGUMvxVO4xtVln+W/mDQ/MtjrGi6 lpF2umfVkt47y5khMiQaOmmMX9OKXixZS4ArthtXSfllq93NrT3OpaRALlten094JnaSSTW4miSO 5Zo04Rxc+R486n5Y2qW335Q65e6Lo9k+o6XG+lNdtJG+o3NzHOJ1tAqM8sIkRG+rOGVKcQRx742r 3QapptN7uGv/ABkX+uBC3T7u1n80WIhmSUra3VQjBqfHB4HEJQeg6jp6aHpyPcxK62sIZS6gg+mv UE4oY1+anl9fNmi6bZ2Nzp0r2Op21/NbX8xSCeKAOHhZo1lb4+dPs9MUsQg/LPW7HTbU2GraSLyG bVwmnyTSiyt7XV444/St5OLSfuDFyAKUPI9MbVePy31jTZIJNI1PSrl7G/0a7tBd3DxCSPStKNg4 k9OOXizyUYAV2712xtXN+XWuX95eS6hfaLbLcajc6wk9tcSST+vc2ItfqvJ4ouMHP4mbcsP2Rjap Ofyd16fyzp2jyatpltJYrdB5lv57oSGawNqgAnh/dI0lA6IPhQkqeVMNq9v0280+2061t3uLaJoY Y42jimDRqVUAqjOQxUU2J3wIVrK8tJ/M2nLDPHKwhuSVRlY0/d77HEJZbhV2KuxV2KuxV2KuxV2K pK3knygzFjotlU7n9xH/AExV5552/Kzy5dfmF5SkgQ2VndPOmoWNuTHFMLWIzx1VSAORHF/EYUPQ v8D+T/8Aqy2f/IiP+mBLv8EeT/8Aqy2f/IiP+mKu/wAEeT/+rLZ/8iI/6Yqk/m78tfKmp+WtRs4b CGwuHgcwXltGsckUiDkjBl4mnIbiu42xVLfyu/L/AMrReQNDmubGK/ur6zhvbi5ukWWQvcxiUrya vwpy4qPAYSgM107y9oWmSNLp9hBaSOOLvDGqEgdjxAwJSzVvy88n6lY3VrJpdvCbqN0NxBGkcqFx TmjqKqwO4OKsP/Jv8u/LsPkWyutQt49Uvr8vPNcXSiQj4iionPlxUKv31wlAZx/gjyf/ANWWz/5E R/0wJd/gjyf/ANWWz/5ER/0xV3+CPJ//AFZbP/kRH/TFXf4I8n/9WWz/AOREf9MVecfmV+X3ktPN vlG6mmj0awuLqWDUYUdbeCWOGB7lOfxIoq8fpk9w3sMIQWcadqf5X6bMZtPvtGtJWXi0kM9sjFet Kqw22wJQ8rflBLI8sk2hNI5LOxktaliaknfvirz/AMzeWfyyufzK8uXtvq1lDpUiTtqVlBcxLbM9 qFaHmFfivqF6MD9oL88KGe8fyd/35oX/ACMtP64Eu4/k7/vzQv8AkZaf1xV3H8nf9+aF/wAjLT+u KobVNO/JvUNOubI3WjW/1iNoxPBPbRyxlhQOjqwIZTuMKGK/lHpH5Z2Pkq0fWNQ0291S7Z5rqS+n haRTyKqirIxKKFUbeNTiVDPdO1H8rtNnNxp97o1rOVKGWGa2RuJIJFQ3TbAlNIvOHlKaaOCHW7CS aZ1jiiS6hZndzxVVUNUliaADFU3xV2KuxV2KuxV2KuxVpmVVLMQFAqSdgAMVY5rFjf3vmPQNSt7d 2tNMkunnYlVZhNbtEvBWYMfiO9aYqyGKaOVOaGo6GoIII6gg7g4qvxV2KofUv+Oddf8AGGT/AIic VSX8uf8AyXvlf/tkWH/UMmJUMixVxIAqTQDqTirFPyrZT5B0dQQSsTBh3B9RtjhKAyvAl2KuxV2K oa803Tr70/rtrDdekS0XrRrJxJFCV5A02xVD/wCHPL3/AFa7T/kRF/zTirj5d8ugEnTLMAbkmCL/ AJpxVj2peVLG58y6NqNpo0DafZJdrdD0oU9QzKgjKo3HlQoetPbChPotB8tSpyTTLQjoQbeMEHwI KgjAlf8A4c8vf9Wu0/5ERf8ANOKu/wAOeXv+rXaf8iIv+acVd/hzy9/1a7T/AJERf804qxj8sdB0 ObyHo8kunWskjRMWd4Y2Y/vG6kjCUBk/+HPL3/VrtP8AkRF/zTgSxrz7o2j2thpM1tY28Ey65o4W SOJEYV1CEGhUA4UM2wJdirsVdirsVdirsVSnzbHeyeW9QjsSVu2hIhZW4EMeh5EgD5nK8wJgRHnR pu05iMkTL6eIX7r3YjpMP5oWcVnC8cksCXTPOJJLeSQ20koIQtLNO9UUN/u1tiAGNNtdiGpiAOl+ XK/Mn7/i7nPLRTMjsDw7bSriA57RA3/qjrsGR+TTrxsCdcr+kQALqvpV9QO9K+j+7r6Xpg8dvpzO 03HwDj+r8d2zqtb4Xinwvo6c+7z35shy9xXYqkOqeY9IGoy6JcXq2cpiBmeRWA4yg0CysPRVqA05 GvtlMtRCMuEmj+OvJyYaTLOHHEXG6/A59VmiT6To9hpuj2OoQ3dlbW8VvaJ6kbXHow8YFclCA4DU UkKKZMZYk0CGuWCcRZiQB5MhybUwbzn5vutI1y1iNpFd2IhvZZoJK8q2dqLgMjAkAksFNUag8Mwd XqjilEAWCJE/AW7Xs/s+OeEiTUhKAHd6jW/9oQ6fmNDdzWwGnC3v5JXiZfWHqosahhVeAZlYlqqa bKx6rkcev4iBW5Nc/wAfgFszdkcEZS4rEY3y2P2/iw9BzYOmdirsVdirsVdiqE1Xl9Rfj0BQv/qB wXr7ca1xKRzYBoMH5sWOm2ENystx6MrSXXOW1mmeFnB9MSSSMSwo3V+jL8X8uowx1UYgHfv5W9Dq ZaCc5GNCxttIC++gP0dDt3yrycdeNjXXK/pIKBdf3X2xJJx5ej+75ekY68c2Gm4+Acf1fju2dPrf C8U+F9HTn3ee/NkGXuK7FUDdarbxX0OnpLCL64DNFFLIELBRVuC/acgbkKNh1ptkTMAgE7lmMciD IA0OZ7vegPLeky+W9Ds9KkkF1bWi8PrQX02+JiatGS2wruQ30ZJgncsqRRPK5okalmPsBU4qwl/O PkzUVkTW5JIpLW9kiSGZX4CexeN+cXoFwfTd0Ks3xV7DMMa/FvZqiR8nZS7Jz0CBxXES2P8AOuud dzItL1qwur2eytLg3H1cssnIOGR0IBWrgcxvs2+4IrmRDLGV0eTh5dPPGAZCuIWE2yxpdirsVdir sVdiruuKsV1xp7XzR5bsLaeWGz1CS7W6gR2CssVs0iAb1QBh+zTFWTwwxQxiOJQiDoBiq/FXYqw7 zD5F0PUdRnvdRuLi29WNY45ojEqIquZDV3jcgl3bZjxO23ICmHn0UMkuIk3VdP1Oy0vamTBDhiIk Xe9/r/b5rNM8n6HDcWlxpd5PeCFQIWLRPAsZcyV5xxryPxtT4j9rwpQ4tHGEgQTt+O5jqO0p5YmJ ERfOr/X5D5e9mmZbr0PLBKJTPblRIwCyI9eLha03G6nfr+B2oqlfl7VpPMmiWmpmIW1pdrz+r8jI 5AYijNRRQ8dxQ1GKp5irsVdirsVdirsVd1xViurtPb+cPL+nW88sNjfR3zXNujsFYwJGY6d1oXP2 aYqyeKGOGMRxrxUdBiq/FXYqw3zX5MTW9WjllvfqdIruOA+nzDNeWwttjzUBo+PKnVgdqUJzD1Wk 8Ug3VCQ+Yp2Wg7R/LxI4eLilE8/5pvu6/i0Fa/l4dNv7WRNSE/oG5NvbGCkzG6h9FuUvqECNQqk/ B+sDK8Oh4JiXFtG+nftzv9DdqO1vFxyjw0ZAddtjfKv0s9kjSSJonFUdSrDxBFDmwdOwvVfL3k3T I0k1bTGkNzd+mlyjSP6lzqEsUfQOChkkRB04r2oCcxjosR6d569ef3OcO084FCXQDkOl108ynuh+ X7HT7iW5trdrb1a1WSV5pGLULM7O0nWnQHxPUnLMeGML4erRn1M8tcR5ctgPuTnLWh2KuxV2KuxV 2KuxVivmX/lNvJ3/ABmv/wDqDbChlWBLsVdiqH1L/jnXX/GGT/iJxVJfy4/8l75X/wC2RY/9QyYl QyLFXYqxX8rP/Jf6N/xhb/k42EoDKsCXYq7FXYq7FXYq7FWK6/8A+TA8p/8AGHU/+TcOFDKsCXYq 7FWnjSRCkih0YUZWFQR7g4qxX8rVX/Amky0HqyRMZH/aY+owqx74SgMrwJYr+Y3/ABytK/7bmj/9 1GHCFLKsCuxV2Kpbr8l4tlHFaSpC9zNHbyTM4jdI5W4O0Jbb1QDVBQ79jleUmtuv4+bkaYR4rkLo E9/Lv8u9CX1nFYRJLc6vqAU2xsVCcZGZ2BPrhI4mYzAb1A47fZweH5nlX7fen8yP5kfqvr/pef0/ b5oE3um7/wC5XWN7QWn+80+zCn+kD/Rv7406/Z/ycfD8zyr9vvX8yP5kfqvr/pef0/b5uN7pu/8A uV1je0Fp/vNPswp/pA/0b++NOv2f8nHw/M8q/b71/Mj+ZH6r6/6Xn9P2+avaavpdvcJM19qdwEt0 tzFNa3BRin+7iFt1PqN+0a09slGFHmeTCeYSFcMRve33c+TGPNmnNrXm/RNbtNbv7Cy0+gu7JbG7 JYKXNYm9L4GlWQxyeK08MsaGaf4q0j/l6/6Q7v8A6pYEq9pr2mXTukcjo0aGRvXhlg+BftMDMiVA rvTpiqifNOkA/wDH1/0h3f8A1SxVKvNGo2Os6Dd6daX19pt1MqmC9hsrstG8brItQYviQlaOv7Sk jFCC8gtZeWPKtjo13fXuo3FtGqyXD2d3xHFQqxxgxbRoqhVxKhkP+KtI/wCXr/pDu/8AqlilCaxr Wlajpd3Ypc39m9zE0aXcFpdrLEzCgdD6X2lO4xVIfy3gt/K2gjTtS1a51C4aSpnltLmC3iTZUROc YWNKDkxY/aJOEoDKdfjv1eyvbOd1e3mVZLX1UihlSZ1RjLzBLFFqUCsN/HKcoOxDl6Yx9UZDmOdW RXd7+qb5a4qA125u7bSbiazMS3ChRG1w4jjHJgpJYkU2O3vkMhIjs36aEZTAldeXNCPpyabb21xc 6xfPFYiRXMjIxnMxIX1VSKrspYCMJTenXIjHVbnZlPUg8XoiOKu/au7fr1S2G806NbRTq2sSfVVl Vme2mJm9WtGlpbCpj5fBSnQVriMfL1HZMtSDfohvXftXdv16tw3umx/V66rrEn1eKSI87ac+qZK0 kkpbCrpX4aUHscRj5blEtSDfojuR37eQ35Hqvs9S0y2ktnbUdVuBbRtGyzWs5EpY15y8bdasvQUp hjjqtyxyZxIH0xFnpe3u3Yz5h0n9J+e9I8w2+u6ha6dZMsl1pwsrs8mjKtxib0vhSb01WUdwPfLb cdm/+KtI/wCXr/pDu/8AqlgSq2vmHS7m4S3jaZZZKiMS288QJALUDSIi1oDtXFVj+aNHV2XlO/Ek c47W5kQ02+F0jZWHuDiqA1rWdM1LSLywiur6xluYnijvILO7EkTMKLIn7rqp3xVIvy3hi8reXhp+ paleands5dn+pXawxqAFWOFPS2WgqfFiThKAyr/FWkf8vX/SHd/9UsCWH/mPat5otNPj0nWLzSJ7 O6indhYXciOqSpKG4mL+8jeJWQ/MHY4QgsstfMekW9tDBzvJfSRU9SS0u2duIpyY+luT3wJQ99ZX sejtfaZqF3qEomGoWsZngRJlahW39Qx8RARv4/5WUTgQLBJN3+z3OdhzQlMCUYxiRw3RNf0uf1fi mR5e4KV+YU5w2X7q3lpfWzUuW4BaSj4o9xWReqDucqy9OXMOTpTRluR6Zcvd18u9Z5h+1p3/ADEt /wAmJctLjIXAh4Pp/nfX/Kqa3HqV1JqfmW3jt7lL2S+e90q4tLnU4rYyR26OgtnVZqBRTpXphVlv nn81rnRfNmk6RpYtriwuERtUvnSaZIPrcpt7VvUhIjQCVSX5nddl3wUqQf8AK6vNtx5U1bWrOxs0 m0S1sYL+KWOU/wC5a5vhbTxKPWT93HF8QUtWrLVqYaV6f5L1TVdV8s2V/qsaRX84kM8caCJRxlZV ogmugPhA/wB2t9HQBUZqH9+//MBe/wDEY8QqPxV5B+YmratovnZdT1K7urnytWzhS20rUWtbizmZ 6EzWaFWuVlZht/LiqaL+at2PyvfzIy2r681xLZ29jGsjp6xvntIOUKM8x+BQ7BTVt+PYY0qS6R+d HmXUZ9N09bK0TU9cFkumoY5uKSLNJBqomUyB/wBz9XZ0GxAK8q9zSsi/Knz55m82SalJq1vbwWtu 7paNbxGPlwnkiPxNczs392K1jTfxwFWYeZf+OBf/APGF/wBWKp/5jh9XT4l+rxXVLm2b05pPSUcZ lPMNVfiXqo7nbK8oscr3DlaSVSO5HplyF9E1y1xkr80KjaFcq62zKeFVvX9O3/vF+2wIp7e9Mqzf SeXxcnRk+KK4v83nyU/Nn/HIX/mLsv8AqLiy1xkNgQ8dPmDV9C/MDVU1W7uL+a7XUrny9JBfNJYJ FawGT6rc2CFRG8QX7Z3Zu+FVfzL+dF9pflTyrqdnDbXmo6rax6hrNvGksyw20cEcl1xWJmaI8pQF aQ8R+1gpVmvfm95ls7/WNKsbeylv9OW81SGZ45mhbR4dP+tQSMBKrGR5mWMtUL12GNKzH8sfMuve Y/LX6S1uGKC6eYrHHDGIl9P00ZTT6xd13Y7ll/1R3VZNL/x0NM/5iv8AmTJiFUtH/wCOZb/6gxV5 v+cV5run31rqiXU0nl2ytJX1PTNP1I6ZeqS4IulKlWmVVUgJXriFR1p+aUEMHmye4Ma2Pl+0tLnS 0l5LdTpPp6XVJg7Es5d+OwFO/jirFovz28ywaPBd6hYWwu3+v6e8CQ3ERGqwqk1ivCZxIsU8UoHF hy5A7jphpWS+RfPnnPWPOmqaHq1vZpZ6W8lvJPawsoaeJIiaPJdO/WQ7ej0/awK9KxVB2sCXH5X2 ML2yXiPpVsGtpZfq6P8AuU2aUEcPnXIZhcCKtytHIxyxIPDvzq/s6styxxkr8wpzhsv3VvLS+tmp ctwC0lHxR7isi9UHc5Vl6cuYcnSmjLcj0y5e7r5d6zzD9rTv+Ylv+TEuWlxnj/5pfmr5g8q+ZTpe nJaehHpDaozXNtdXDySLOYhCGt3RYVKivqSDiO/bAhEWXmD8tFtJdMbyxawpd3ek2GoWtva2clrL carHHcW5qpVZo4y4Jcr1FVBxVvy15s/K7UvLWu3OneXEtdJ07TodS1O0aytEWa3InnjT042ZHZDC 5o2wJ2O5xVDaj+Zf5bWuiXq6p5altor+S2vL3Sbm0slN19ecmK8k5S/V5AXi+J3kqpAriqYeWPzS 8jrqNn5b0nSZtNt5ngjtzDFaLZpNe25vI4wLaZ93QkllUrX9rFWb6h/fv/zAXv8AxGPEKkv5nead Q8q+R9R17T44pby0NusUc6u8Z9a5jhNVRkY0WQkAMN8VYh5L85+WvMOr2ba7otjL5quNRurC11CC 0VZAtjB9YSeRbk/WrfmikIrVO3YdFW/Lfnf8pr27s5NM8sLa3N9eWAim+o2cbC4vUuZLeVmRyaoL aSrdQW2rU0VTW183+RI/NJtl8vPa3Ftqs2lxa79TthANSuVVpUWWN2mV5w45MUHLucVY5oH5yflZ aq+oaH5ZmtJrwsJms4NMjmdY45LiQy+lchhxWJmpJQn9kHDSvSdT1C21LydLqNqSba9shcQFgVYx yoHWqncGh6YFZR5jh9XT4l+rxXVLm2b05pPSUcZlPMNVfiXqo7nbK8oscr3DlaSVSO5HplyF9E1y 1xkq80CuhXIpaN9jbUDxtv7xf7w1H0b9aZVm+k8vjycnR/3o+r/N+rl0WebP+OQv/MXZf9RcWWuM 81/NHz9rHlfUvL9jpxto11drz6xc3NtdXvpi1iWReEFo6SNyLUPWnXpXAhI9C/MLyTFoVxr+p+Xb aDVrjSTrGsS6dBbSrPBcXclqV9UsrO7tHydHO1aEkg4qnehan+WieZJfL+l+W4LK9uZtQ0ueSKyt YopBZRW81wjmM8mikW5SgK7kGoFBiqVt+Z35aR2F1qFx5dmt4Bp9xbW7SWVqPrlhZzfVp7aArIyt HG53icqKb0xVU0b81vy40eGwt9K0STTLPVSZ2+ow2IhT/SEsvUl+qTOrEyMi/BzanXpir0uX/joa Z/zFf8yZMQqS6rq0+jeQtR1e3RJLjTtOubuFJKlGeCJpFDUINCV3ocVeYeX/AMyNL8w6var5v0PT tUkkGmw2d5HYmKaC41KQokRhv3eRokO7TRHj4A1wqnGsedvylk1PWrzUfLCXeo6Ql1Le3ktjZySy DTrmOxfhI78mPJ14cqfCO3TAqd+bfNPkPRPMTWWr6GbicJbaxfaotpbyxQUla0t7mZ2YS842XirK jFV9sVSb/lZv5ZWOt+YtQh8vGPV9Dlkh1G/hg09bqaT63HZNwInFwQ8sq/FIFWnU1oMVeh+WfMVh 5j0O11nTxItpdhiiyqFcGN2jYMAWGzIRsSPA0xVXtYfW/K6xi+rxXfPSrYfVp5PSjf8Acps0lV4j 6chmFwO1uVo5VlibMd+YFn5Mtyxxkp8xIGhsai1NL+1P+mMVXaUf3VCtZv8AfY8cqy9OXMc/xzcr SneX1fRL6fd1/o96G8331pYw2FzdyCG3S5IeVq8RWCUCp7b5a4rzTzVo/kDzHrLatP5kuLG4l099 JuUspokSW0kcyPG/OKRviY9VYYEKaeWvysi1i01GDVnhitDZuNNScfVJJdNiENpLIhUvziQACjgG gqDiqW6f5D/LbT7W5s7PzXfQ2d7Y/o2+tlntuE0AjliUvW3ryUTsRQjftiqrceSfyzubIQ3PmW7n u0Np6WpSTwNcRx2BLW8SAweisasxJHp7nriqI07yr+WdjrsWvrr0susxTQTC+kkgEjLBa/VPRYpC g9KSP7ajuNqYqzVNa0rVLyWPTrlLp00+85LFVqchGB9+IVKvN135F81eXbrQtQ1gQ2l2YjJJA6rK DDKky8fUSRftRitVxVjp8p/lwZWvf8TXg157kXba+LiIX3IQG24cvS9Lh6RK8fT+WKoc+RfysiSJ bDzBc6c0D2EtvJbTQ8o302GeGJlMkMm7C6dnr1NKUxVGab5b/Lyz1Jb6fzNdagFvV1U2l1PD6DX6 xrELplihiZnogahbjXcDFUptvyz/ACmjtLayuvMNxqFhZrKltaXT2jRp60LwlvgtkYsvq81JOzBT 2wqzafWvLy+WRo1nqn1+4W2S0ty7CS4mYKI1LcFUM7d6Ab4FZ55jTnp8Q9K3lpc2x43TcEFJlPIG q/GOqDucry8unMc3K0hqR3I9MuXu+7vTXLXGSrzQK6Fcilo32NtQPG2/vF/vDUfRv1plWb6Ty+PJ ydH/AHo+r/N+rl0UfOMqRaE00h4xRXFpJK1CQqJdRszGnZQKnLXGeeeaovJHmLUNK1F/Mc2m32jN O1lc2MsSOPrKCOUN6sUw3QU2pgQkknkb8pDZ2NnFq8sFraW31G4hiuAFu7b6wboxXXJG5AzMzEpx O53piqtd+Wfy/l1Y6ta+arzTtQN5eX4ntZrcESX8cEUyD1IJRw42qcR13O57KoQ+Q/ysfTbnT7jz DdXFvLFcQWvqzxH6pHeTi4nFuFhVQZJBuzhjTauKVWXyb+WtxcWV3deZbm4vtOQJY3jyWyyQst0l 0JE4W6KHDR8K8fsMw71xQ9AtfMWh6hrGl29leR3E31gtwjJJoIZKk+AxVKb3VPKt75cu/L+p6itu Lq2msbxA3CVBKrRSU5BgGAY0qMVYnF5J/LBYAJ/MV1dXsUNrb2GpS3EX1i0jsZPVt1tikKRrxffd DXFXS+R/yrltrqF9enZ760uLO9uTPEZZfrd0l5NO7GIj1TJGN6cafs4pVbryp+X1/fR3mq+a77Um +rx2d3FcXEAS6giuGuUjn9KCNiokf9krUChxQsuPJn5a3A1qKbzJcvZ67cNd3lkZLUxCV7tLw8K2 /OnqRBaMx+EnvvirK/LWqeSvL2iW2j2esLNaWYZYDPIrOqM5ZUqqoOKBuK7fZAxVkcVpKfyztLWW 0SeUaZbpJZ3L+ijMIkBSRyV4ffkMwuB2tytHKssTZjvzAs/JleWOMlfmEVhstrQ/6dbf72mi/wB4 N4tx++/33/lZVl6cuY5/jn3OTpecvq+mX0+7r/R7/JMpYo5UKSIHQ9VYVH45a4yh+i9N/wCWWL/g F/pirv0Xpv8Ayyxf8Av9MVYb591v9A32k21na2ipfrdPNNNay3JX6sqMoWOBlb4udCd6ZgazVSxS iBW99CeXudv2ZoIZ4zlK/Tw1REed9ZLdI87aDcaFJf32lrHcWkNlLeR26xSoTqEhji9NuQrQ7uGp x6bnBi14MOKQ3Ajdf0uSc/ZEo5RCJ2kZ1dj6BZvb5d6a6Tr/AJZ1TW7jR7ewZbm3+s83kiiEZ+qT rBJQhmO7PVdunhl+LVxnMwF2L+w04ufs+ePGMhIo8P8AshxDo35U81eXtalC2NlLZTSwfWYBPFGh lt+fpl0MbOKB9iCQfbBp9XHLyBG179ydZ2dPALJid6NdDzrkGP6P5ytWg1C91q1tITZukc2jw27r fQtLcLAhkMzKkinmCWUDMbFrjRM62/h/iG9dXN1HZQuMcdni/jJHCajZqhY+LIdX1zy1petWejzW Jku71C8RiijKA0b00ckrRpTGyp4nwzKy6qMJiBuz+Pt6OBg0E8mOWQEcMe/7fle6T3P5ieSYLSG7 GnSzQywQTsyRQAR/WXaNI5GeRFV6xtXegp1yiXaWMAGjyHd1+Llw7EzSkY3EEEjrvwiyRQ5bsq0u PR9S063v4bONYrmNZEVliYgMKipjLofoY5m45icRIdXWZsRxzMDzH460i/0Xpv8Ayyxf8Av9Mm1N rpunqwZbaJWU1BCKCCPoxVB+ZE52EQ9K3l/0m3PG6bggpMp5A1X4x1QdzlWXl05jm5OkNSO5Hply 933d6aZa4yVeaOP6CueX1SnwV/SHL6t/eL/ecd/l70yrN9J5fHk5Oj/vR9X+b9XLomjKrqVYBlOx B3BGWuMh/wBF6b/yyxf8Av8ATFXfovTf+WWL/gF/pirGPP2or5f06wnsbO1Mt5fRWjtNbvOqJIkj FhHCVdiOHQZh63USxRBj1lXf9zsuzNHDPOQldRgZbEDqOp26oLQvOug3ekLc32nIl7Fp1zqd3Fbp G6KlpJ6boOTBhI2zBG6V3OV4deJQuQ34TI15fpbtT2TKGSon0mcYC/6QsfDz+xH6R5p8q6pfwWNv p7rLcSTxI0kUQUNbRQzPWjMaFbhabda5bi1sJyEQDvf2AH9LRn7MyYoGRMaAB6/xGQ7v6JXaD5s8 u6hf20MGmz2b3ZnWwuZoY1jma2ZllEbRu5BXiftU2xxayMyBRF3V9a5rqOzZ4omVxPDVgcxxcrsD 7GP2nnu3E+p3OtW9pbjTxK9xo4tnGocVk4I6ySusUgI3PEZiw7QIMjOhw/w0eL76LnZOyAREY7lx 167HBy32AsMp8xax5Z0CSxS+tATfyiJDFEjCMclVpZKlaRqXWpFevTM3PqY4q4urrNLoZ5xIxr0i /f5Dz2Smfz15PhszdHTJm4RXE1zAsMPqQrazCBxKC4ALSN8NCcpPaEALo9fhRrvcqPY+Uy4bjziA d6PEOLbbu5p95fudC1zTI9RtbJEhkZlVXEDn4DxO8Lyp2/mzJwZhkjxDl8P0W4Oq00sM+CXP4/pA KZfovTf+WWL/AIBf6Za47v0Xpv8Ayyxf8Av9MVQfmmKOXy9fRPDDOjREGG5k9GFhUbPICOI98qzC 4FydGSMsSCRv0Fn5JrlrjJdrltdTwW31a3guWiuoJnS4BIVI3DM8dCP3qjdK7VyvICQKHVyNPOMS bJFxI2/T5d6y31i/l+p89IuYfrKymbm0J9Ax14iTi5r6lPh41670wDITXpO/2JngiOKpxNV3733b dPNbDrOoSLaFtHuozcLK0qs0NYTFXislHO8lPh41670xGQ7ekplggL9cdq7977tunVdDrF/J9X5a Rcx+tFJJJyaH90yV4xvRz8T02pUb74jIdtiiWCIv1x2I79/Pl0STWdNm1y90i+ltNT066tIrp45b aS1VojKArRyFvV+JxGApTpXrmPlxeIYy9USL5U5unzDDGcQYTjIx5iW9dRy5X1Sy18k6WosI4tL1 K0tWgjN5ZiaD0pGspGlgW6FWLOz7jgQN98pjo4bUJAVuNunK3In2jM8RM4SlZo0bHEKPD5V3qlt5 VEOsJq1tBq9ndTpc3k4SWz48p5vXe1cFWPxOgpQ9P2slHSgT4hxg7np1N0xnrbx+HI45RHDEbS6C uL8fJE+VdAh0BoXt9O1GeX6iyRyXctu5t41dpPqiiMovJ33rQ9qtktPpxi5CR261t5Net1Rz2DKA HH0Et+nFvfL8BBTeT4r1JTfQaxcXV7ZKGvJprQzQLBOLhLZeIC8mkiXcqw98gdIJXxcZJHOxtRum 6OvMK4TjEYy5ASo2OHi+R8vcubyfbT3H1y8tNVvNT+rwXkOpTyWZuIZbWQyJaxlVVQ7HZvhKkftY nSAmzxGWxvaxXRA18gOGJxxhZjwgSoiQoyPl9vks/wAEacLO5tYdO1KBbt11kyJJaloriJmaOyTl yX4SSQCCN/tYPyUaIAkL9XTn3Mv5RnxCRlA8Po5S3B5zP4vyZNp15f2dlBaDTb2YRWXr+rK1vzMi 1pbtwZF9U07Lx98zIExAFHl5fJ1uWEZyMuKIuVbcXL+d7vtRJ1i/3/3EXO1oLkfFDvKaf6N9v+8F ev2ffJeIf5p5fgNfgR/nx+quvL+dy5fb5OOsX+/+4i52tBcj4od5TT/Rvt/3gr1+z74+If5p5fgL 4Ef58fqrry/ncuX2+SD1OfUtQS3tV0YsCLa7d7tk9JGEqM8fwPy9WMVYfs1HXIzJltw9x3/HNtwx hjuXH/OG13yO/LkfmyDL3BQGu2l1d6VPb2sdvLO/HhHeLzgNHBPNQGrsNtuuQyRJjQr4t+mnGMwZ cQH9HmpQaxfyfVuekXMXryvHLyaH9yq9JHo5+Fu3GpyIyHbYspYIi/XE0PPfy5Og1i/k+rc9IuYv XleOXk0P7lV6SPRz8LduNTiMh22KywRF+uJoee/lybttXvpjbCTSbmD15JEkLtEfSVBVXfi52ftx qfHCJk1sVngiLqcTQHfv9nRJ9Zs5vMdvpEV3YahpzJdm7WeF7YPay26ssbScjMpD8zx4g+9MozY/ FEQRKO99Nq+blafINOZmMoT9PDR4vUDzrlyrqk8PkiwuIbNPqOq2Ut/9cj1S59e39Vo52DyC7Ycw yzECnpivyzHGjiQNpC7vcde/3+TmS7RnEy9WOQjw8IqVbcuH3ea6DyfC9zY3dtb6tpM8k97cExSW f+jGSKKPg/JZfhkW3UJxqevI4RpBYI4omyem3L9SJa8gSjI45iojcS9VEny3HEb+xE+XPLkWn3em XP1HU5OIvHt4ruW2aOxaVmZ/hi41abop+KgPbJYNOIEGpdauvTf6/i16vVnJGQ4ofw3wiVzrlz/m /BC3Pk2HWTbtq0GsTPdwXMQe4mtGaxUmtPgG7S8AFPx7HemQloxP6uM2DzI2/t+LZDtA4r8M4xwm J2EvX/Z8F9x5QttYhtTrVlql7LJZ3UCvdyWjSWpLlg/7sBfWfiAjCoA698MtIJgcYkdiN62/aiGv liJ8OWOI4on0iXq+f8I6/Y1H5OsJo9RWTTtSRvMcBOoSvJbFoGhJbgtKgPO45HZhU9sfykTxbS9Y 35bf2qdfMGNSh+6Pp2lvf6Ijbon2gPfafY2tp9Rv5lkSWZ5blrXnEwJIif0fTWrU+Hivfc5k4QYR AqR99focLUiOSRlxQHIbcW/nvaOi1i/dImbSLmMyQySurNDVHSvGJqOfiem1NvE5YMh7i0HBEE+u PMDr8+XRyaxft6VdIuV9S3adqtD8DrWkLUf7bU2pt74+Ie48lOCO/rjzrr8+XJA6xc6nqOlvZJob SPeWxcx3bRiBX5f3M3B+VTSvw7e+QyGUo1w8x1bsEIY58XifTL+G7942f//Z uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 xmp.did:0C9190091A0CDF1198A8D064EBA738F3 xmp.iid:0C9190091A0CDF1198A8D064EBA738F3 proof:pdf converted from application/pdf to <unknown> saved xmp.iid:D07F11740720681191099C3B601C4548 2008-04-17T14:19:10+05:30 Adobe Illustrator CS4 / converted from application/pdf to <unknown> converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FC7F117407206811B628E3BF27C8C41B 2008-05-22T14:51:08-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FD7F117407206811B628E3BF27C8C41B 2008-05-22T15:15:38-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 2008-05-28T17:07:17-07:00 Adobe Illustrator CS4 / saved xmp.iid:34001D5FB161DE119286837643AC861D 2009-06-25T23:53:30+03:00 Adobe Illustrator CS4 / saved xmp.iid:35001D5FB161DE119286837643AC861D 2009-06-25T23:56:39+03:00 Adobe Illustrator CS4 / saved xmp.iid:36001D5FB161DE119286837643AC861D 2009-06-25T23:56:54+03:00 Adobe Illustrator CS4 / saved xmp.iid:33F582E93563DE11BB48ECB7764A1480 2009-06-27T21:11:20+03:00 Adobe Illustrator CS4 / saved xmp.iid:520E91AC4863DE11954883E494157F9B 2009-06-27T21:32:35+03:00 Adobe Illustrator CS4 / saved xmp.iid:08FC8385150CDF1198A8D064EBA738F3 2010-01-28T16:24:35+02:00 Adobe Illustrator CS4 / saved xmp.iid:0A9190091A0CDF1198A8D064EBA738F3 2010-01-28T18:01:57+02:00 Adobe Illustrator CS4 / saved xmp.iid:0B9190091A0CDF1198A8D064EBA738F3 2010-01-28T18:02:34+02:00 Adobe Illustrator CS4 / saved xmp.iid:0C9190091A0CDF1198A8D064EBA738F3 2010-01-28T18:08:19+02:00 Adobe Illustrator CS4 / xmp.iid:0B9190091A0CDF1198A8D064EBA738F3 xmp.did:0B9190091A0CDF1198A8D064EBA738F3 uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 proof:pdf Basic RGB 1 True False 800.000000 600.000000 Pixels MyriadPro-Bold Myriad Pro Bold Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Bold.otf MyriadPro-Cond Myriad Pro Condensed Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Cond.otf Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 0 0 0 RGB Red RGB PROCESS 255 0 0 RGB Yellow RGB PROCESS 255 255 0 RGB Green RGB PROCESS 0 255 0 RGB Cyan RGB PROCESS 0 255 255 RGB Blue RGB PROCESS 0 0 255 RGB Magenta RGB PROCESS 255 0 255 R=193 G=39 B=45 RGB PROCESS 193 39 45 R=237 G=28 B=36 RGB PROCESS 237 28 36 R=241 G=90 B=36 RGB PROCESS 241 90 36 R=247 G=147 B=30 RGB PROCESS 247 147 30 R=251 G=176 B=59 RGB PROCESS 251 176 59 R=252 G=238 B=33 RGB PROCESS 252 238 33 R=217 G=224 B=33 RGB PROCESS 217 224 33 R=140 G=198 B=63 RGB PROCESS 140 198 63 R=57 G=181 B=74 RGB PROCESS 57 181 74 R=0 G=146 B=69 RGB PROCESS 0 146 69 R=0 G=104 B=55 RGB PROCESS 0 104 55 R=34 G=181 B=115 RGB PROCESS 34 181 115 R=0 G=169 B=157 RGB PROCESS 0 169 157 R=41 G=171 B=226 RGB PROCESS 41 171 226 R=0 G=113 B=188 RGB PROCESS 0 113 188 R=46 G=49 B=146 RGB PROCESS 46 49 146 R=27 G=20 B=100 RGB PROCESS 27 20 100 R=102 G=45 B=145 RGB PROCESS 102 45 145 R=147 G=39 B=143 RGB PROCESS 147 39 143 R=158 G=0 B=93 RGB PROCESS 158 0 93 R=212 G=20 B=90 RGB PROCESS 212 20 90 R=237 G=30 B=121 RGB PROCESS 237 30 121 R=199 G=178 B=153 RGB PROCESS 199 178 153 R=153 G=134 B=117 RGB PROCESS 153 134 117 R=115 G=99 B=87 RGB PROCESS 115 99 87 R=83 G=71 B=65 RGB PROCESS 83 71 65 R=198 G=156 B=109 RGB PROCESS 198 156 109 R=166 G=124 B=82 RGB PROCESS 166 124 82 R=140 G=98 B=57 RGB PROCESS 140 98 57 R=117 G=76 B=36 RGB PROCESS 117 76 36 R=96 G=56 B=19 RGB PROCESS 96 56 19 R=66 G=33 B=11 RGB PROCESS 66 33 11 Grays 1 R=0 G=0 B=0 RGB PROCESS 0 0 0 R=26 G=26 B=26 RGB PROCESS 26 26 26 R=51 G=51 B=51 RGB PROCESS 51 51 51 R=77 G=77 B=77 RGB PROCESS 77 77 77 R=102 G=102 B=102 RGB PROCESS 102 102 102 R=128 G=128 B=128 RGB PROCESS 128 128 128 R=153 G=153 B=153 RGB PROCESS 153 153 153 R=179 G=179 B=179 RGB PROCESS 179 179 179 R=204 G=204 B=204 RGB PROCESS 204 204 204 R=230 G=230 B=230 RGB PROCESS 230 230 230 R=242 G=242 B=242 RGB PROCESS 242 242 242 Splash 1 R=214 G=149 B=68 RGB PROCESS 214 149 68 R=71 G=152 B=237 RGB PROCESS 71 152 237 R=42 G=81 B=224 RGB PROCESS 42 81 224 R=180 G=58 B=228 RGB PROCESS 180 58 228 Adobe PDF library 9.00 eJzsvW1zG0eSBvjdEfoPuA+OsONWZNd71/j2IkiK9HlPHjkse9Z7ExsKmIQkrEFAC5L2aH795ZNZ Wd1NUhagsUyCamPGJhLd1fWSle9P9ef/x3fPHx+crX6ePXZ7zeTRZ59/frSeTS9X679MmDz5ZrG4 urhcg/TF919OjN9rcNXBN+2LcuXfZuuL+Wr5F/5Nfj3B/V98/bcvJ198ie8/zC8XM6KcTy8uZ+u9 i19ffVkfRbc+mV7Sr2bftvu2Mc0k/oX+9d23fMl0+ev04mL+T1wQXetAPFxdLc/my1eHq3/8ZeKb iTF5EkI7CW3Az//P/PvZxS3X7LXe0kUh7dngsl79ZHV6dT5bXn63Xp3OLi6OVovV+uIvk6O30+Xk 2+kr+mU6+a/ZYrH6bXK4mJ7+0r/nZLW8pGu/fbueT8+ogcdHq+UZLvg/e7TD1eKsf9NfZ7Oz2dk2 tx58E16czBczmtbz6eXEyCwffGPsi8Or+eLsr1fnP89oxl1MTHcveBQ/XlD3aST4m+npxTfnRHo+ u7ykmaGn82J9//Vhf+xE5c8Xf/9+9mrOS09L9N9fasvr1Zvz6fqXC7mubWi5mqb8+MPs/M2CFrNM erMXJjZn+nfvb72UxiOXTR7HScqRmonlt25JZr/OZ7/9ZfLX1XJW5uFgfflcuMFTo/Lv8tP3V4vZ +sflHPMqTWWZiG9XZ7MF3dE1cbKYvrrQkZru3+WKH6brV7NL4qLV4uqSebutT6HJfjp9OwOPmPKQ Z29myx9Wf+OuPjZtmkTnqD1jIo0q+IlpufWYaelyfajRf5eG0Qra0Naxlp9/R+v1bD1/NV/+RbuX Xny9np91i5jspJV/8RD22t7/s/6/9JTGfXk5W2rXiYGOvu2xQ7P37XM89Xh5drQ6xxJc8H4jRlgS jyxWr8qv3Rf+jZq4evPos78/+szl/f+9Wl3OLqjFxWyS4/6r9fTX2cTQ3j6+Wq8mxjW9K36eXsz2 X9ISzZdCPftZaLTh5m8u5vT4/bPpq1ezdfkP/b5/Ol8Tf7xczP6x/2a2vny9urqYLs/2n59O16vl /ivaEdz2Yvbycv/ZMbFIkLZBoPb4b5rS15f1kXypfpGffr4i6uX+bHk2vXi9Pzvn/1zSZpvt05Y4 m2EPUGMX1x4qN69m+2crEnkkuCYm5P3/OpvP1jTii8n+xZvpKU1H9PunV+v1bHn6lr7E/Z/Xq19m y5+ntFFNbPf1+v3T1Zu3pc312cvZ+Xw5X9Ltye7T/M9Pp4vl6nL/9ds3r2fL/TXvV7rxbP98eopu 0bTSIu2/IRFOd15d7F/+trq4okmbr9b7l6/Xs1n9Nj29upztn18Rs7p9pp2d0vpza6ezs/liMaWW aB/WO6hDJM9Prxbco7bFj/97NV3TPfjz9XTxUp5RiBcTk+3+AfMDNXUgTzzoreaBzO9BHf0BBrB/ cLx/VLqwf8y37x/zzdTKce/243rfN3LVN/KIb3rXfFOvOb58vf9XfiA180xueCY3POvd8Ez69Kze d361uJy/Wbzdf3axAE/8qAP6UW7+sXfzj/Wu/5Iff3i9WhO3zEiOL4nVLvan8uCpjmfau3sqj57W RqY8HdPZ/qlOx0xun0nrs+5mampW75vLVXO5at57xLxeM6PpWMoDV3L5Svu06t2wKpfU+87mv85B kMm4kluv5ElXg/5c1Xveys+XPBlvlfzosx+ORRSG/3jxwwVpgJ7gdy9Y0BwvT1fQ6n+ZvBhqzhuK 9O/7167Yv3aDCOEf/r9H3DrJNG1bDJ8f3r6ZfVBvoLNvqPBBb0Dav3bDxr2RJ7+grnxH3HDJG/yv b/i39sV3iyv68ev16urNN8uXq0effSFG3A9r4itq69nP/zM7vSSrrBC6v55fzS9ne9P5my/f0xRp kPVsIr/S7fyV/vsS/93k/iezl2TFdA0I9Xj562yxetNruFJoo0z+c7p+s0nj3y2my+l6wj/Utp/O Sf98N6XJ6lrvaBs1O718TcYf6YKL2qp8vdaiEDdp8vnb859Xi/nFeW2wT6l/b9g7kq7LZ0vp5vrq 4vXkh9VqUVsuF5SfuplfX8o99+Yh9eLbHkA/3t/Gj6Zkr5Dse/N6fnpb+7f8Xh/0jns34qJTnvXb njj8qT7s5h334zmY6Jfz5RndwqKom7nV+Ru4cpPnr6dvQMaVJ70ru3YD5GZfMj5+/Psy008Ol/0r vl5D1y4vyVM9IROPuj35z9foDHVwSCBpbSeHZ2zykjdG/zjzvr/q//zk8xeH68G9k9/5Qz6W/h8n gbQEeT10P+z0Fx94++HFdk9u5NYPe269GU89fNKtlM72O1bgKZmVLMuFgjW4Tuqvwv9FQ5J/TGMb 1/gm0Cc2qWmbTJ+D5rA5ap40J6YxxljjjDfBRJNMa7I5MIfmiD5PzLE5sY011ln/6DMbbLTJZntg D+2RfWKP7YmjwTnnvAsuuuRal92hO3JP3LE78Y033nnvg48++dYf+EN/5J/4Y39C3bGPPgsu+BBC DCnkcBAOw5NwTI6viTa66GOIKbYxx4N4GI/ik3gcTxINIZHBn1zyKaSYUmpTTgfpMB0lms50nE7a pjWtpY9r6aFtaGOb2rbN9DloD9uj9kl73J60JzQRZIPTx2WfqQM55oSLcs4H+ZA+R/no0Wf5ST6m z0k+OaBpOzAHNPwDRx8azgF1+oC6d0AdOKDGDzJ/8M8hf47o84Q+x/w5OTg5JK/1kCb/0JSP5Y/j j+dP4E/kT+JPy59cPwf1w/9Qi0fl86R8jsvnRD6PPvu/+zwhXAG+AGd45gzljYPKG0+aY+aPjkOu 8wg9uccl4BMLTil80t7CKbbwSsctB0N+IXlgf4dnDG6tPNMWrjkMR+CccMK803FPBP88+ow5SHio cBHz0ZCLlI8KJxEfKScZ5iRXOIl46dFnPW4Sfuo46jaeSpWvMjNI4S3irMJbxGXKXabHYcJjHZcJ nwmn9XntoMdx5fPoM+a9/ufJ8LMVTxwWnjiuEqMvMwZSg3iikxt9jgA/vJsjhB9u4QhPcuIWjlB+ sIUfhhwBfug4QvhBOeJ9PKFcodJF5YvyxcmAL0TCBOIJSBnImXbAGccDzjCVOzr+iIU/htzxhCWP 8EcnfZrKHzc5JPT4pOOVHscQT3R8M+SdA+WaazzxB/3zp7Zoeh9bPq58fNWE4O2BxKMWb0q86zqR OLvIOfA0ZJzwM7hZeBmcLFqQVtAdFx0I3gXnQpKdsBTzxK8tLRg49YR41LG2y8SRT4gTDfFgIO7L xHPHxG2OeCy1mbjsqD0mTnLEOYn45SgfU/ctcUCk9TykfX1CYtmRSEzERofQBEfNkT3yxOaJRM4B KYmjoydHxyTezRP3hLQ6bZREAiyTSDh8cvTkyZPjJyfHzbE9ps4fkzpWnjg5OTk+eXJyROrkgNix pW0QT8KJP3En9sScNMcnx8fHT46PSO0cEMu2JEAj3e+pHXtsjpsnJ9TyE3rCIT0pPyFupOdGerqn fljqTXN0cnRMfTuiPh5QX1vqcTwK1HdHIzBHDWmyYxrREY3rgEbX0hgjjdTTeC2NmniCNOwxzcER zcQBzUdLnB9pT3jaJ5b2TUP76Jj21BHtsAOavZbmMNJMeppPSzuzoZ16THv2iPbuAe1i6iPNeqS5 97QClnZ8Q7v/mKTAEUmDA1qdltYo0kp5Wi9Lq9aQHDmmFTyidTyg1WxpTSOtrKf1tbTK1MdwQnLp Ca37Ia1+Jh5IxAmB+MGRLDOh8Sck254QpxwSv2TimkS8E0j+OdKMxjfuhCTjE5KQh7T9s6M+kuSM xHeeuM8SFzb2hPjxCXHlIXFnJh5NJH0DcawjvjW2MSckn58QNx8SV2fi7kRcHojbHXG9MdhbtJy0 G2jKaW/QtNBOibRr6OENUlLNyBMjT4w8MfLERjwxcPBTIPVJbnGkGW0d/9HQ05CUa0z0JR34Dvf+ A27e1rk3/4pzbz7Quf+e/pouBs79dRK3Pzr3o3M/Ovejcz8696NzPzr3o3M/Ovej0T46ciNPjDwx 8sR9cO6hoP9sN/tuQgpbOPfPX0/Xb6RYfvK3+avl7FJKKG6l03Pcv1xJMcYHxvjAGB8Y4wNjfGCM D4zxgTE+MMYHRrt/9AVHnhh5YuSJO4wPCLBY3Oiw1yZX3fCbv8DH7lFbgNRvv0F/+qBYQHZ7kXTz h8cDtIH3xAS2RGJ0mLqCI0IY4c18PV1ccOSg/DnxZi80KU+M2SMzIU5M40Fwk+SJEIH6fnFV/6XQ 7mby01v5/h/09/8Q9beJn3w7+ft/N5OzR6D/9D1+v976eZ9YnjB5ystx7bnXqNrA09taZeJS+vNM 1iAGZzLm3tlMm+bWkJBNrec/yIhuEoO7bfbGTn6aohHb7qXW2Uncy47MK+m7ElOkLtisvaRvLS31 7VRt4OltrTLxpTDkAdbthWuaycFahuFbGHbUs5R9A9a5ZRipoaeAu6xNPoDS0ihMW4ZhbNijjTtx ca8lKSHDUKLNNPhEq27NXuPyxKY94+giY9weuUr1+6kOiKzO2F3V0ERjIWhQNmGVlODCXkiN0/sK 1du9NhpcRjND4mDiaTJILvLjaCVDJch96FTOsbus9Nr7PUPycHJ9aKd1Lps9dvQxcyTPrMfMkWuX eRc2DUlCxvOTNDa4JoARcI2N8PB05kzeo99xCgb2sk5dpVqahablzlPLNBrqBva5adJe8OhnIZRZ MHum6V2WIaaSr+3U7+VpfJcSY6DlpQmqrSTqtaPVrg9TgjxM+1Qv017Xhq4Prj95fwDbZeKVTBuP 1pAUn0yd0kzci+SOTzKNnBiC1nGP/J48aWlmyKmq37lLLW32EGwlJhLWnphQG9Hv5UF8T6XRf5Pz E23DGSx1fU75KhNd+lJotfulhWvD6U1W2bVtt2sn328Xjf7pQLb/f/DREr+R+NQO9ievDXsk0TJo LscApWUCCT8LXm88vqdk8JWWrPBcm/cy7VS+BzKVvhtL62n9nneZJyKFbCcW3NLYOuFt65lIa08X 2b3GQtqmPY9O8U00JfQdX4949mj/xjYpDSqtzdRXknImlYXFc2nNmlBm/LlMG0lo2srU7cZ7HSrx ksn8RBqym7SOuu8NFLsHHfraRvkebVmN3NLGcEwMiX6kFaONkyHiHHm+uIlsFv5uyP/t9SEZ2vcQ S+VO7gNtHB9JJhCRvPk0oYsiWVYTA23d0Maye2SKJRzRQ8ZULHzn9xL1h1iT9mnANdIGbTEbsBd9 kmGFpGIhQhTSevFYSOJGWrLEQmQPluAk0fM8BDTdQxKTZztRe56GRPdYssigMj2kMC2Uj9xEJKk+ oR1Opmd5DO0eSDbqGm3TMIktKTt6LClb0wTWXK4lTiCVGpMpN9FzrHcJY3YkgCcJugs2ArFimwK+ kzFoMSBEVXtTSl1gZqRJoo0oM0qPbCO1RkSYmpOYqAu0KdFtiCiaiYzpB7Omsj4knA== 6FqZHUeMjGtiou+kLjDUlOT3TD9Dm0q3IdlwXgypHWYf2iG5ZbFCy2zxXaavv3TKjQmGIDiCtEbh hCzMm1iLsTCxpEIwzcQYFvvDtTSV9HuDZZZNRG2TGYOWMMG4iJQOtUxTF3AxNUqajVaXxyX9DrRu ZIdQQ4jV4Br6jWV/IGHL2wCGrUxc2XktrQEbJNBikxbzRBuZ5iU0JmOo9NSM5Y0kFvpMj46Av0if kDFehkrs0NKS0DST2uSZQ1RpEkkoQo7QPvYGQ4/SAxUyLtBGA9tlYiV897QmNDZEbrHxiIMzhp5D n0mMo0kiV2JC/8W4qmVCrBNgU2Tq2QRXERMGcGEDM814bC8iEKNA2PTGlPZaj71EDJB1SOAgwxyE 4C5WL5FVCWawsCkgSxrZYJ2upkklYdSCSELfYkgB5hB1wUBXZkw2jiGi5dMd9vwdNpxapH+AQQJr 27CCMDQccrIcJDlPYTFNChUTAK1FTtYecU6oUoxYkXZOYyuhGmjBm+4ykp0WHKjt6Hd92mnR5kKk vZ7NpDZC60UyvvcsJRTLpHSpXlaHUtq5PrRO14KTMD90ZQNheD4gOjJlaUvxTsvMBKQf2VInqdJ9 Py3SPUXXEWmL5abJtZH6vTxJZGghgm3Rc23EEaeS6VOfpN+FlUp3lKjd1Uauj+kjWxZwqGIrS0kW eBHNpDj3EKgG1bGEJ4IlrY89xioXi+nZQ6B9A5FeGIekjyNlSvNmc9uyZW88DZPsJt94xw3RcyxU PxNUV2doe3pchipgq9a2rCkt81KEOeDZuIEmPRLWoT3qaXWgVkg54uwvEsEkpxwkPdRCAyMRs0ma ClauPI3EQkjs3HibmbvJBWOOcZDNGWqM7qaHsaXQ284NLA3PGo4GEXSbRbGhLWxekqqwtmmyPBaV hmV5PGzBUMeQqBkIPSsGRNHOnTsWYeQW9WzIDM2wi1Q/k+VSVqavoGuLIjH72hYttDg1TdWtQV8s 6QjVt8bC1BCbtipc+FxyedG4fFUk6aQq13iYMXTbQOc+V6+D/F1aRDbLznXRcJ1MYQPHA/4FzaWB Sd3IKvoA4XPbNNH+oQ1prs0Tq8/+PEVtXeeJVFmMebCYOl7SzS6Z2mQZMBQF91MHHBGIgIDSAcOc szltJu6RrLTiJzHn3LZXTSSDGuLeGTIwEKRoJSRxQ9zT7nPeshTBEXhl0yrRitBiP5vMI3B/A12X vVhL+l3VtYXhqkRYKrnXSv0uj6rWDGje0cbzrOK5DQ8DEbZ2eZB+79x+dEeptcPazPVhfWTZR750 05KZyk9L6pNSFwJZJ46EAjkVkwzjnIxFxBQgDDJ8ELKT6KaU1HUhCRJhUXoSW6TD4ciSrRInHrEk MnHxPZL9iCfBuDotPhL0PCYaRkNmFjasByFYcZJjkLlIONRQ/CraGrDjPFn6RMuwx+i/mEB0JsN7 ohl2aWiPteTN0PrSTnEc0MtQ6g5sDA+GhCTxtOXetyqcsFoGXgOtVutJwJCtR75LQrjCB3afyBDx mBcO9aidFFsSJRDubKuRvMyRVpYIzPX88Bx4pnzb1lCIFfEYLAKvLTa5hUvpaQ4syQHiN+qDkzCS GmXP37HT/oBgRbfTaGX5ybT5Wdqdl5VjHU5ChhYjYNqpXT9h341W9G9qMyKURndGBMfgJnt8J5MC 0/+2GCt8UYgSQUvlpuDl+9+KFyJEJ0Qy6iNYk2YnQUnX706staPSssXjiFP4JnjkWO1gNFZnpVW6 oAuWgcq9pFXnyxY8XnZaDJYHgvn6nPzaGWR/aNCD5G6Lc2dJHZm2uAM0q+x8BdjEbIhnMtcxFQa+ RoZ+JdECxmmTRgK8REYCDOoJDSbCIgm0hfDfFk4sTq0lx9rZtgo4n8iUC/DtHF9ksAkxWUYawb72 tHy0mGVvYnMn7lrCEaU047R/qf/YA/RftNF4nKNL39tUzUF2FoOTUCj5dKRwHFquzhKO0sUyDtU8 fBBy68F0HP8RzoSIbZgYIWioD7Q7+buFV5i9RBfIdGXp1jVHksVhC9KDmYfPC5GNQ+IGhwBLBscl jtPmRAYPfc8sjmCq+3wXmhCxCLa5YLSZtnN8DE68JZtCNIuBdmP/DcEwKPlsfP1eTB1aMFxbL6Lt DEcVIR4PYxRiDaFVBFPrCrKDCgHLUR6HqDTsHY68RYvbYUB4sbw40iTGK1mf9Bh2ayysNcNB88B+ jzhrkNi+YUGdwAPlPqKiFVBhSBsE79ArR2sNH62MrXwtTla7h8Kmeg1SYpa8C5iKbKfjZOmGtJBD mCkmNbCJVZGxgG1g4HLDCrSZg4wwVm/M/tFH9lZgkuM58C9gKNQIvG8RTkTAy5YpYNMW+hDBM1sM 8jI3ZeFgEkZeAJnIRuxlRCmbwjTkgbNbwv7FqU4KG0qIrFrOOtBjsWUQgWZL3oL75PEwY+q68Q63 CLhbSbFEdlZMsfVh7HOEMkp8pzwOYSRYsrTfDSc9iB0xyEbZlPjGyQVsn56qvexIdMHJSabMCUsU B9Mh8YpnCHW6nZdwaLZ7bG94w2CXuqcizCWEyTx4pvqC9N/MYfsohjGuuNYee9V4dA2jwRGwSZwk jqPJY2n+HcK7VrpIppeYRDWShmnK1nFOySrvQtaTpW9bTm1gYhHdJ1PNR70Nrmkg3qLbiNMTX5YQ TkOcoewJeZrl1NdR9QbgnSPSzBlGWmO4yR62v2u5FUe8BlPP1FA2HsYhRhhvWBr4jYgywVqiVWRC dNiATlzGvluCuAmtGPYqjKFzFU4W60ijbKAguCdwaDwLJbhNMPBaNuNY5p1WpwAeucuSZ4QFxkFb p65lA342PO25Rs//ZCGOsCTNE8Kf3lQGKdTYyvIjCmCbhk2oxGKiQUdsqgRNkXkEE5RIurppva/N 6Hd92GkxcYRIuxTbRhtpS4SvPkoJNQPKPaqX1ZGUdm4MrfNp8BOtU8tx6S70otSAHEcSpyiTGIIQ 9AFRQMmfhh5Fx20h0yuVxmQzsWRgScDGEYn2VJ93WiwGx15AyZlqK5BuEugpD1NCZSvuVL2sDiYW cXV9dL2Bc362ZSu3hel1rlTolFA0EFx5klwtsruckIRYpYFZdn46r5KEFEKxRGRjmOML1AyZJBLh JOlAm6c+q8pwFPBOYlP0F2c/W0mHOg4Hc5A9V8KpBlEQk6xXwUsMaEWy5tcH9rHTgkny6CSjOLsu NpuFj0kSCsFIsi/ou0dRBMxFuGKIVXNSFX5IKqE0sAq1wRmkhrdIyGLSMPNmqHnDYS/UsBTZ2Ljq 3LEmoelGLIoVgqjdBuYXEUj7OqMCPMMjoRV5HOBFJfaMyIJljWahZnFBSJybMojindan+YYDjiYV yZsS6w25DTwZ4LMEznVoaJEM6YZ+fWxl9yNUIRFN8UhhtUNJG99jUzyMo5scIie5ATtO41vwkcjo R8mGPEetfx/hiZAcYQHixTWHBQ2rLkNuc2qbkxa1BMAiDwsFGXmzQWbFKNk+9tKMPKuFurgWXKNx QkSl3I/cogYGdybEkUX+WExuQmg1yr7MmBAkFt0w/2Lg9LUiXxEQqJqHd3R0PBQOHHIDbdG3WH+Y C4k6ZN0guEnjaaF0aQ9b6KQSqKLtAbfJS7kGFg45TV/SpGCbjNknArNb1yDpjEcyb5l91yib/LxG EVzDVDEoGuzWyM5UjByOuObd9lUdN4x4YgMW8uxenqudyIYe+WgIXbDBT+YFvGHOcWP8SEjR7xz1 KNZlBpvjbSi0to1MEzuY8Ac9QrhsuNMfIYpqPlX13yDtSV0ghsps7/GKIhATMCx4Dvw8I6EX2Y2k vlk60n3YwmxvOmTqkjgT4twEia0WKUgywohHyrkww4F0MtDIuhGjETFi9KXpBXkM7CpEuQJmv4SE 2YJFGpBNEZgw0A4kGHNSN5NZE4mcoMknKA/Y7a6k4GG0sqFIC8Y1X3Kf56RowPMQ9EKnbMpc4cJs Cr5lTR9h5Zs6umJGYsjWiLMCWy4YiSCzEwThTxMb6p6scX6DYBfd66xmljiZAXeYS2RYtSE4SO4Q LakMoIHaJyM7tMLKdeDU6YzWeOFwWeCAUa8Aiu3DaHp5WfBvhK1O91maMdkoTHASEkGovEUmnqaU FtB1bhscG+oE73Ajso7jU20LN5jaschMRS+2o8rlnE1knQjlhW3qsU4oUBIHheY3WN4dXGdXRscx vixzxfPqoWoCswObK5guBMtSGtRZIJoAgUrLxguk8VeOWCAihmAkRIhDzZdXsV/SgLSMPPSh/OKc Ek0r14eda/9YuCIGwmUQ8HXhr8VcFIcRPy3hP7p/n6uTznNBCr/p0qq0tTj9jQQgQrbgSPbUqcWm fEfaKhkkkgZRFuoDxLKHTgnF0M2lfMWjToOYACHnaHjXtcgnQoXhMRA4pi9eU5Q6VQQc2lqeAKEK tyaJuEAWEuUJJH5cRKcSxInF751ObiHSG8k6srWapFwBSSPYBWiUFgHjbGt5ghG9CAcSTIxiASde eMK7omACI40v3rCGJb0EsC02CHqHwhBaFHKweEuhdCWLM0Ks62uiNSKka9nPd1wDw75MLAUc8Oob zlbykzQWbYKkbMGFKCwyJOPIT2uxJtT7AGlcag20KCYl6RyXGtA1HtFErTSAlc/ljb1Cg4wMKdzq RkQAqkGw12G1Yidz8Q2eA69VA3i07zi+jVHCUMI+RLKXIxKkKyKypXST7btytUyDiwadVHDJkjsp R/BO+BLzA4ZG+oEtBEQtUW8Jfsy6fK2Ubakni1pVVKLQbg9wMNEoQqo+yHfpOGo7Eo+OKzExi5zj TyxaE3IDSGlkcHSxLWnWWNh4I+xMS+7RS1YqUhUVnewJ1+i0QnYgtw5dziYJyaCGuBdutjEs+yNs Bjy4HcwQLzRSrUWqa7FcaIivaYY4+NIi1eE47MqJYuqDdRJr7lIgzwvvtUYCsJxYPC/r56A4MXcw b+APQLvSMy37qzaTL+kQUAh9eQIGIlHHzODUZEMAmucHVnIyE94iDct0cFlywhucErB9LXWLW/4H lDn33HKk4xETtJLBqME2lmCmWKjW8kVqiv0qEjKoU2bhlC2EWDyzpmQguBKPY5KhdyeSgxyHjDX/ cL0ji+pW/cHRxWsOZjX/bFnsEkwM7ARCciDwjnFwmNCVUsC+/iBXAXFHeKed/YvIMAJU3ohVbLjy gJpCyIdNPnC7lYJUO8yDWyhLRL9sv0bKQXpyDwL0j0U+0ElNjaT22Q5nQjIDixoRLjIKWDjkLvTS SugbwSUONnJMLXPk37ksxkGLoI6HxRLDtUHD44Z13ysw57Imzi8wG7OzGGBrwnGKGsbjJ1xrEMVq jkQsiWeu3zsvRPYsUIqGIaI2EbqQvnM0FzWRLvJNXbDgXdvmD63FghEAkZUQW2jLjEbYzKSaYitR XGRtGjGZ2Yb9tQg9su5Y2LHcRhYHqwB1gUjn2yLsgQrFwDhMCGFvycpjl4VW5m9ldg== spekFmrsSPzZFhlEy5sL5bcoS4GfZ3xx51ukBFBwWsr0UJ5nqPuwbaHmIaabhivIuWJR9cFgrB9p ZybO1SWeiCbV2kSutoqoMfEwHGjdORTIQV98t8I0vqllXo5DkOyCwS/hSlDLNe8s9ttGIhrERJwB OOp4ECZHixXhC6UHNCMoEYeKaL2UBKNoCRlfbG82MTK7001XEmzE0gq+lE64Iu31OxIxkW3YgErW 3jawEpRhs1VlCVaDE35Jdg1+DA3zF9dPo8g2Zw6GsvV32h8R62p6cG4VzgKjAGZFsILXaKGG4Q9D wTHfGLbXu+oCNWsbbBfsUIQINEvuGKrgJaqQIfcbThu3KLdBa66V5pqBCicfIJCVAx8go+ZIm7NI acIZwmZoifUayyE8C3OTK2zhJSLqr1X8qBbyJefK1XYk7HLolGnL9q1jn7CWI9Q+oNCKmme/Q/tQ vLQEmYLsM6f4UTsq5bBk0IgMqtVm0hqCblKWxAL9fEDUZC0ZH9DDsSQtEZQLUlbAGd5+NVSQWILa TEXGIh3buGo0sWZiGE2xmgyrqNusJg4XGB+Gdg77P1BMauiweg6+GDoIh1oSZjcNnY9e7wpzm3QM i9MaAMIYkjBYW20HpDhFrHUFDZUYxKC43txHqmjAYxvgIFLTY2z2FkPmOv0gASYJNTK3ADGIgWVO 2rPR3TNOS2U7kAS1vQifNXCAr2GVA8M+SbUKWoulljJ6KfDqO9BJUkiobDMpdw40J4YgurhCF7oc Dj7K4jl1DZuQsTcIEHSBgVxgD6jqClLZywFC1OJBhdQwPD3P9QIKhQUZAMCZUit4AlqeyGzMNotn MEQDMVVzdRoQZRgE5x3h16MWMEqCkUVDKnniGidiBReRYeN4XivxpVjgJbAATbQC8vODMgeFipDc ZGk9gIoQkTONChWBHVNml6EiKd2EiqQ8hIq0ZgAVQf3+DagIiob6UBFYCD2oCMKyN6AiMJcgYwpU hJS/qIsCFdEqS3WLGSuiRZaKFUGNJVZNsSKDEkvFiuBHgYZw1jFB04YOKgJvLZhboCJtuAUqAjhD HyqCbvehIlrJya0pVkQLORUronWcihUZlHEqVgRzV8IGnMgFFqOPFeG1c7dunsxc465tHuKFEMGU unla3juu2zya6B9uHsDcEK+omweW+GDzZN477trmcVxJbbrNIwPobR487+bmQS1zf/PAKh9snsyc 4q5tHlTSUWu+2z2Wg3qp2z1IOPmh76EpDGR6Wnc9hYGUjA1dCoPonGfoUhgc3xwmRUoKA6Fha9T6 rjkMxK+IhX1NYgTOYbguiQFg1TCJUfE8DH/TOrSC52k5i+QqnseUCHbB85jmNjwPV5K6iuexHKgw Fc/jeQXdNTwPEhKwyAqiB2FQ5EgU0cNFSnbgNhVED8rSnGYHFdHjOPVgKqLnsWGLoK2QHlc6IWaU QnoY0dNBekwjIV+F9KB0apBSQqCE0c39+CnwS0aIbJSx7dpYjZ7SV9tKbOla9PRHtpomX3w5+ek/ i9l5S3GmYRsNaRCO9jZOMmioOLWqhRDFRoZ4WEzKReaokdVgXTWC2OZx6v8nKY/RaB14ifrvbgvX WUwrK3yOTKrfgLN22DCGbCe175BraMWh06wugoI6mZrURRAdlqYmdeETAJOpSV1oqBtJXYjiXlIX z4OS1qQuQG43k7qwbRsOjpekLnEOFxTVpC7sCGe65AFLF7K+OaauOV2SoyxONKcL/XYzp9uW6saa 04X3NsjpwjJD3HiQ00V6CcpFc7pw7wqAwxTFf0tONwnQouZ1kwISal43y7MGeV1YT62taV32/ULQ tG4Kt6V1aTWGaV3WzP20LkwDVw2fBtspsDfNgQ403hi2V1g8okS8pUmm7116rCSsUKrFYFeuVKu6 RzLkyByyndZKJg3lTIJLoZ0DF8Q5gYwMHQLoLRinXS4FlXDwbHA9F0CgrpKLyb1GcZxAeh1L4P7u 6k6N+J26oj+0eBuGizVpeNSBEvWoA8QCSB7XQwwCoxSuHXWAFCS8QSWSAxWCICtYSur3wTkHStRj DtAI5kiPLwiMLvXDQw5ICjRQs0rU7uoZB9fH1Csx+SNcLKTdYojDIw4qsZxMEBrZtnpygfdSADg4 38DB4mnaSkTAErpCG6nf++cNKFFPJdBG9NgCfdLgcAPtjhK1u9rI9TH1p+wP4Dck3r3zA3C+0vRQ Ai4G8G09tADxWJP98GQDBF2bjobCJZRvaRv6vX/kQKWVYwlKE+XQAn1K/1wD7Umh1c6XBq4N5iMX MGkH+1OH6LG3sZ5rAPOR0b3lXAOIIDLJhwcbIGAOgI0ebEDfG9Ro6MEGCIg3SLD1Dzbg8l5n6sEG BlXtMdaDDfgmawcHGzik0lM97IDTFG2sBxtgQIxhv3GwgcEERz882ACtxDbWgw0sIgGunmvA+Uyf h+caoH41QFeW0wkgiq1L9VwDpCuiTbecawAzIOdw7VwDmHs9qK+42KGea4D6pRjCEBzPoMPU1oMN sjZSDjYgS4srhfoHGzh2Un13sAGQG3yCiZYbkDyWLdK5q+gqSsT0ZAOUGtvUdkcb0DRzTXLvaIPH MPI9MFyKngxcVx164EnaYXJeUIedBGQgW18PN2BVmnw93ABdyLeebQB+TNfgloErLkJFWyLmCRtX wZYwr307gFo+9ggHylKw00DXSOVQRVrS4G0eAi2xBFHOh2CbAazkU6iHG2AN8vVzKTR24YGv6aPt kQHnqvEuA85lZ70MeAPn8wbUHqVEOQyQ9owVqDh7sAbDsAvOHrzNp4b0cfYov8rihHEhESrhrTAj l9eSlKJ7zN3h7JFASWaIsi80xcajtKNJ3UEhqKXy2QwR9gjA5h7sHok/Cy8/VzHM3weY90oUYLy2 ocB5fdAAXq+9UaIOQJq4NpxO2oMCb36ArK/EAopH5S2EqoLmcUaUuYarJ4oRvmCiALZNbaJ+76Pd lVhx9aURhczLcwaoeu2KErWr2sT18XxkvYakqJPl60ozOQgvCowRyfgejK+QeuSXg41DRD1S0a0o Ls56oEgAGSvF06MRKyfrdHB6h8I2FyucHlZUQl2eoOk9gnvODMH0DOFqfcXSI58fbUXSM7hCBEMH pHd8NFuqQHr2Ckj+K5CeERpSOn4NSM/WrM1DHD3wjUlw91KXlyWqpyh6gCmgLW+C6BG2bOR8ioqh h6GMwo3eCTeMHOyfcOOkfPgagB4RSBaC10+rMbZ/WA0J9DA4rMY6d+OwGo7Y9Q6rYZxQ77Aa3HMT OA/PgDEpfeS8B5K98RU4D/ChQ1Vgwc0jV881y+GWmRnA5nVqegFdnhoFzevU3MTM6zAHkHkdZz/Q yvV1vUArbro7vDxxPBi/j5ZXUkG5O8SgQqgoeJwjIOdGdEh5iyhl7IgcMu2a0K897HohKb5dG1AA fHnIACWvHVFi6ac2MRzJRxZjjIRSOL6mgwAsa0KsAHmIWCtAcAbI03fjTRoC5JF39HB1C0AeiUmk NxQgz0V6clRKB5BHiBY2VAHI4wFeKvYYIO9Qf9/kIUCeiC40UQHyMBgyQOwFIM9uDqITfYC85XNa 2oqQ50K1xleAPCBXjILtF4ehCJpMzwqPh0aLZKoUeDxig9jTA3i8RbrRtRUe7wHBc6ai41GCg8zc ABwP4BaknmLjYSLAK1FsPEyx3Jg7wMZD3OPJg/Cr4x1bofFwjHCKwQAajzorH12FxqN8KUshcAeN 5+r46Co03pSbBtB4uGpMLNld1FslhFoKNL5+70PjoZUZFlCg8fDprHEVGk8zzo0OkPEuSx8HwHho Q5osBcZfn5CPlEZmvAGqwPvAeBvE8yzAeHaIs63AeFQDI+kzAMY7I661AONR1ZwFsMDAeJS5OROG wHgYK1YKJRkYb+GN5liB8UjBt+EaMh4uaxIYASPjeWOZWJHx3Ihrh8h4g+xIqMB4hkUINIDLk7DB GhtvAcbDaUDt/gAYb4G3zF2tBcKaZONXYDxNhUcR+01gPHYw9t8AGO+iGHgKjHdc+ZErMB6yKogJ c0fAeMDoYCQNcPGIvfGxSqXCBEgMwYwLljggz2o7nLykf3H8BMM1hIhyfS5TKLD4KAX6A1A8+5E5 V0w8UulIhSsmHuW8OI50AImHvRDkFCguK+D4nbcVEI+8UVuQ7xUPDyJjiwscPhqpVBeguw6oD4YP QfK+egmKvmOuUHhEE/k8sj4Sni5iNVVw8PTVoY6swOCvz/XRx1XLyLHAPh6A4ElMehiiioHHyNlA LRD4kOtpihUBD7SJEe+IayYDUj3OVwA8KpDhqQzw7wFGgY8V/g6UCUfPCvo9gsfkwRX8zkXUjanY d6S6oq3Id+xxDmH1ge+03xrG1BTceyzVUop7j3zEgx3C3lEQgzI3Rb0HxOdtVtA7MCOhzbdg3gOP xg4h74Er031FvAcgHeTMLXZQGbiCmMsQ7x7gV8U8hLv7LCAPRbvzAwsEgFFKyB2GPMS6h3Joi0Ld 0X9O7heoO5BLSP4OkO6ou22ICxXo7vVQHsG5g9/5QT2YOw/MpwpzZ5HfuIoN8MzYfghyh+SFTVcw 7nDpQjYV4u6RIU+3ANxDqhCPDt+OMjsobIW3owemjRXdTg+LmNMBuB3GMJxjxbbzj8UUhV/jMcTG 3SGyHUqjETBFB2xXogLSPSorcqiAdZckGTdAtcPshk+vRIgixGy0Ef0+wJlXYkGjayMKV9cnDUDt 2h0l1jGURq6PqXNCPAQT9ksf0K5ExbMj+uBs6mDqnCbz8RqaHVDAxMG5QmVgAKB1Bc1uuaorDPHl qFe0Alxm001bUZi6PmsAZtceKbEOo0DZrw+rGzASzmC4AZA9IaktiURWIKhai5LB4/QTVySXM7yq 2xeiZB0Vxu7ZBu1g7LTzG5g5A2Q5qnRzsBXFzomucjg4srN4EkY7wLBTdxJbQoXIlU4obS4g9utj +tgpIC9J0gGGncN0DKYWDLtl2FGoGHa4dUZsjq7cAZAywG4Khh3mrG9MxbA7VtJ5iGEngaYeGEPY gxeApSLYPcq+gYPrA9i5ipNsyApgR7zLh7YC2MF18K4GAHYAz9qcKn4dCV6BS8pNkLUtn9bQQ687 VLGQ2FP0ukV1FkObxWOEjI/BD9HrvpFAovBcxhlzGmKCaxNQetKHrjs2zkyFriM1CKdZoesOZjkf wNArcoCnHiSXwjUOHoVEwVXkOv3OT7oJXIezBCE0wK3DjXY0kAJbx5bj0pWCWgcgGPNwE7QOExbp mQFmPYLtBODA9ejwRuExKWSdK9iTvQWxjlWC8hwA1qFXUERf8Ooe205OwuP4qQe4xsZ3wtURlGZ/ so9Wd1ngsApWhxb1wVas+nV/s6+7/kNqGyzmu49Uh+3Lh6MJUB1GOIrDFageGUjuhjh1VPFgFRSm Dh+8Lb6Zl1p2AZ/2Qer0Y2N9rhj12MjqKURdKrDdEKGOGlbIvQJQh6cFe0QR6upm9A== EerBCPBTAeoBLGlsxaejDhQmzgCfnhCAEgQxw9PhByLaqej0gCQSDo3pg9OxG5Op0HTYKJymK0lU nO3N5kcfmN5y5tIpLh11a8CKKyw9oNzP5CEqHT1F0F9B6VASsCAUlB5whkH2t2DSAbmMzg8h6dDV 8EMVkQ6jyxbQDvoNdZLEDu7w6MgJMWq9wNE9YG/WVDQ6GoUlNwCjA04Zs69YdGwC/l6g6FzmEeIQ iQ4D2khpG29bnwTqqEB0GHCNVMJ1OHSH5F/jKw4dSEM+WaPA0EMjVVEDFHrw8mYDBaEHFFiVIwkM 4+/YnLwJQocnH4MZgtCdleiAgtAhUYE/UhB6KKnTmxj0EOSUqQEEHSErIyBWrkkMjbhMCkD35bSB mwB01E9ySP1a/aRHsUOvfpL94l79pJOy82v1k7C4+RTDPvrclSIDRZ8jntuIU8twXfruGEp2HX1u AFaMZog+R/EKF0AU9DkHCSQOyPgjlBO7MASfmyQ2v4LP4U7hu4LPuQS6YEI79DkUmwTsGX2OysFW 3h7A6HMc7oAUWB98juQMojIKPkcYxLaxgs/h1/kmDMHnYGE5jZyx5zACUf2o2HOurct+iD23jNRI ij1H7QdjJQv2HBMGrE0fe/6YD7XgVF7JvaPw1/fOuUcEjGvOerl3eNBy3rWcP9EWk13B56RbTAhD 8Dkid5BHtZ6VGD9KspIdeM8V+fGWalYYAFzS1Qefo24DOXoFn/OBVyFU8LnBTohpCD5HcQUHsfUY NYe6pVzB54ZvvoY954eGij1vOe1VseeoCUDQYoA9R0GNqchzAya0viLPEQvlTFofee5K9llBVDjr FSnjijzndQ+3YaiSRAoHyHMkDFEur8hzLlA3uSLPYQSRCXcL8hzrDWjfACyOoKypUHHLc5oUKo5q cxvbO4CKAzDpxd/qoOIkPQN8FoWKQ9/gogFUnEG9IPah4oG9n1Sh4lDhVsokOnwWAkA5piFU/HpH PhIg9boPp+YXZ1cUKA4dAEGsQHHg+vjkvRs4cYwXwbkBTBx2CoI7ihIH0BH6r4DEYfDCkriJEY/l SLc+RDw2ckZwQYhHHHVpbQWIw4BDBftNfDjiiDjxsw8PRwSVD3Eu6HAOQ6VcweHYb8b5W7DhIYsb O8CGA+aJ14gpNBxOGJsYBRkeyuH5N5HhEButaNsOGc7vDqNnKDKc/cFoKjJcKpLuABiOI/OAyh8A w2Gssp1dgOEIiomx2uHCHSOuQ8WFO8EJDmDh8D1hjCosHBI0eTeEhWNq2MYWWDgqTQBAKbBw1Dvm lIewcOhTdFph4ajXimJFGzkVDaHRMISFXx/pRzuwAWWTfgALN3xqoKLC2bmWs8s4QIqTmGAPD1Dh cKatDEnwhkky2IoKB4TLyFED11DhbAzEa7DwjNMKUqiw8LaU9SksvOXkbhjCwmGR4RhRhYHzQbc5 9b/TiplbYOFYABxtMoSF005ikaOwcE67d7Bw6hpZM+EWWDh0SCN808HCATVjZ7PAwvk4CZw5wLBw 8A3y5zdx4SRt2CLtw8JdwQwpLJxMwQZxfIWFo7U22Vtg4agDCHmICoflkyom3OKVQsZWTLjlQ37c EBOOhEEWp1LKyZDBd53WxGlicGxuQML5+d4OIeEoUgCaSDHhiCR5we8zJtzy2zzNLZhwBLGsVN10 mPBKLHlKrjWRw6uED1rJ/t/EhAMK1Eo1SQcJj+Wkh94xOvxCq/4xOvA8bhozcM+jnIUyOPeGVVD/ 3Bs+p6SeewPI5004eCwvXWJkbKuNaVCGTCB4/KzkPcNKySJhcDa/Q+4W2DO7SWEIe4an5ARFzbBn x7mkWGHPUvQWb4E9s74pQKCKeg7lLQkKekbIwwRTMc8wbrIARTvIM0IOoXEV8QyfKaGMtgCeNWA7 wDvD5U+y5Cx+4MLyEhe0c+Ay9TAEO6PmqgTRuDAaOScjtVYM14STnJMZQp1BRDRQkc6xnPWqQGcY MPAPb+KcdYoG2FadIoW26hQpslWnaABs1SlSXKtOkcJadYoGqFadIgW16hQpplWnaABp1SlSRKtO kSJadYoGgFadoopn1TlSOKvO0U00q8Y1B2BWjWsWLKvGNRXKWuOaN5CsGtccAlk1sFlxrLqJFMeq kc2bMNZSTzFAsUI+wr9SFCuX0fJ5QaWiF+JDoMIdjBWV5fBYFMaK+WXPu8BYobpgBfdRrCjsdtgI BcUKUHLKFcSKInVj0y0gVvSkMXEIYgVAGKnTgmEFQrEhAVIxrIjHwycfYFgRgWhcWzGsCKWLp8nq CHmIHNqbEFZ42OjyIATD6Hw5CJh1CIystq0HAAp6sd0AwnprDRWEfjlnkeNFeOEQYukKYcUeQQTs JoKVyz2NGQJY2TyyaXDaHHikd9qcQ63OTYc/M1wwDOGreOUGB9UFvoryU6yGwlc1odOHr2o+R+Gr ms9R+KrmcwbwVc3nFPiq5nMUvqr5nAF8VfM5il7VfI6CVzWfM8Cuaj5HsauazlHsqqZzBthVTeco dFXTOYpc1XTOALiq6RwFrmo6R4Grms4ZAFc1nVNwq5rSUdhqTen0Uaua0imoVc3oKGpVMzoD2Kpm dBS1qhkdBa1qRmeAWXUoqPShQlbRcpDXobIQRCoeRco3IatcYJ7zELIKc5eTYgWxinAqYosKWPV8 5qS/Ba+KOiBGsvbxqpFxSrbCVaGxosQ4xbNskA42t4BVr+9T+n78SF6ifrw8K69Qf/Shb2Jv5bfD 9dXF69rWFz8ul9Pz2RkJ0C8fkZf06LNm8tNvjz674v8N37R++3vW5S3rj10GDJBsPob7Bo5OPHYJ J7ZxFqvSn16nw53xTui1kVuJXQtL9IbcZQYKRE7sxxSs/OHaIDrMkVDFKRHGJRxWBtSCCXxuBMkQ MjXgK/eaByAlWOk4bWRsJeTXOFKMdCgRDYBpTvqCvfTY0X6UhFfXv1M00OIIVNOWfvOVsDa4Lrhe +ZbnwuvrHfTKhGDN8Mpf+UrLfqbvPz+ZkoTod7Q/vWVUR9xA72LYaI5b6LXayNtTh10oa3F6vbOI uZL/MxxZufjt9TnoLu5NWLn4V5nxbnJrN/rLUDt8fcFoaOTm02apW+fHwvC0SYbs/t5twOQJ0a/v hi22Qkp46UHLiIVcXGgwVYrA1vPJN5X+9BodLzzDW1yeXmvnXfReO3/gnuAnkHWNw23aVqrXz4Ve SFxyKNchrSBEsovcZNht5BNazoQUupNholHSPUIkaRmEyLn5Wx8vi0w/4RVxMZXrtb4JdBxcZrlx ZAtJwIJohVvlYliIIKLArSmNZ/gg0r2mvI5I6EhOlothS8sAGzuRC9mzZ1pEOqA0gHKjppUucAU0 iMizkY/BF7dl2poSeCszJHEvoXvUOcq4cWraU6UnHPkwmKQGZWttmeaQrCtEUn2lZbJrorYMutNp Iy4oF8PjKEScAFiIbdS5R2yuawHZtbLUwZaLOXxXWmiVSHu0EAH4lgbgKMGclmsR0CzEbiZQUylE g/iFdAGv760tOKtz6WFMPFU6l9PKxDdkhYMIw7XRruHNTCCiOk8Hl7AVSstWTkCUJUV8T1rgcgQh Ag5fiFn71hucxYvjyuyQwSbjwCmusXAUCWRplYvJCpeU0J6QbRkDSjdkJhWCLN3FPigNFDZDlVfb NeAQHyvsa7QBruiQh1kbCpHjyUIsuGfQI4RAaYFfSyREn2WBsrxcRYgtMh4y4a2NXQvEnLoQcFbK AiHe5soTOfkmRDJtnY64zHmSQy/kcYhXHGkLpEB86XPb9Fom47r0hCFpQsxOmYojxyC2An0so46V qVqOhpc+03bWlls5b0gECs7KE6LH2kgjwaVCZIiNtGBd13AcPrA0jAEE35s8IboqG1mkF6Ll05nR hSIGhe6TrkmDLL88Lje61OxJy5Uc5ypL6nXQeFlCXRBjZDNzGXfIypkyYpz9C1erjDjqglgnUV7p MKJ1Qkw4CVQmHpK/ENukey72W2BIiVzspAteCk2Ehr0uRI/siTwqV3EAOo7sFHorDMSuoHE3WohW ZRd7PbUF7qVspVakoi0IqcIQogdQRd40tjflpYWgb7BFH4qGAdHrXm5doy3osnfgMaE7V9URKpuE GHF0UZndSsw+6WbupgGvBLd1H8nCA5rjVK1mo91qverl1lR2AkQw1rFlYSfgxar4ZEkpxJhbnXFo qtoCV6eViwujI8ruqy6yIr0AfEOZi8wu0qVypcFrl8rIXJ0bmLQ6MNGnICFOIYNIldZJ9U5loeIj R93aTsQO3mTSbZ4iElHR4drc61VpoUW5te5VI/YNiFY3D0cZ/0sv5hxWUUOl5SzQhMK8baGRpNbd B+FTnpYZda4N1wbk0LW+auIiD90SXLxbW8iNUyGAzAIRHedhq8EjphFCGSmVZzmnvACv1GkXGAED Io5ctdfmkXPArevJx9KCkfROpwOEyEa/rBqcciH6ZqDdagvRVvsBcuip0jkHKbYCcnzlcXB1ijFm asupGjambhW0bJR/1SZAKMar6FU7iou4c1I7qk6wK1kI6TNecifE1PgqMcoEl/SfzE+331Fq5lrl vxh9udhGNfw4k1xasGqzJRxbXFrgslPVedjwT5VOwkzpMWgjal9DLYiNB3BCVUFsNteWGbwvTIGy JRBRBKh7gIs4hUgyslW9a+sMezm5pOubEJPX+Qll3biSTnWbSW3XAKdxO60pxE7780k9pVVX9Wtv iRBgUk+goTWYFCLnCaSFRom2TZUYQ9dCx+8Nqq2fKt0nkzrTTWgM5OymUojR6tp7aPPacGhMuLZC pRJMWnAiJvGotm3V7DJt14IkdHkqiwGCABgii0zk93uCGMtrhIVY7R2i85EQpQWR9iBaE7Vjom8c ynTVMmLbv7bgfS7ToHYxB93U9Es6Ck49lD5w9ra0gNMNeR7wGmtbdlGSYyakY64IDoh2q89y3S4C qCIUusPRjSC2PTWiRjgqo7wKumibuhbID6oi4nKFcnHxAXO1HEE0uitaU21+V8wZGTJOHixEONLS LDJaQlSPCKNIqWuBa1QH1ivqf60SOXQqRH6/R5neasE4jF73IS9AITrdLrGYgmg263aJvtrsiOXa WFrg8RAR8d8qxNnfEWJnGHFJq7QAejFA8GoonnUUEHneWnwEeyUi3FSIVmcB5KpPW8j1p0r3TmUJ KzkhcthUeiaCErSoDSTbNWzV48xNGQBJDZVkrchChHezclLqzCpB3penM1MIMeRcRtBEYX1v9I3x aKGTpuhWFb21/3hxb9QWiu3uubC+8AcjC+sATKtyRIMHaCHoDPhiAnELle06C8qXUtIBO/KpL1FZ ocgLXFn1FdvCtYXWqqDmcvynle54q/Cr6MVAZBxX6k+FEBvZP3xlneCSxe62lRCDw6nLzCLFMcEh hlnlNCdjawu+GsS+xtNAZ0tA6KmwtJPVHa6G60nvFmKktszTXeRAmSEnR2F2q1SIyQ== 1xFXPQY6PH4eCAtiED2qFSqjNqkQywZUniot+OpMgdNFOHDxX1bJWXw0FNPXDcjAhtJC6HmguURn gJpPrdfHJZl2KW/oSc7SAuAmKovYWxNiUy0/3YKor1Sm5DfudQ1k1TZ8urUQbd2HXE8vRJeVdfjt MLUFFzVewiXMQmQ4difUhchhu6LEun1Y3h0oewB7vRCN18V0hX25hkmFC5JAtQUGDZdd5Mq1JZqZ uUhSBlHOEun0R2kAoEhtQO1fIBOCKhteKCHmGFQLetM1QNK7hrjENUCxolViG0u/4OhH1fuhBphQ yZgrm0HwPFU6F5MXLSZtwBBxyrxOIrV8rIMGGPiW0jBCi6ptclFiqOyvFhDbrkIM4iyjC2QFlxZQ JdH6OOgCwIfeFka3JfQFDITRPdzTo6GAowuXJW0hVUMnFk+T0T1Vopqqw4DdsE67hrhpaTaqfIkp pdoHNWYZENfrg6k7QOIZaJbPsOO5KX4840S0t5wTrS1olDfX6AkKUX2VkkUSYRRJTdwQq2UGnHyr RpjzpcNIJTeqdXGsshBLRATjddV+B71xdRcGbYGYS/tQ4hnAdGe1q/hFT6UFnBZWlK4Ij6dK92Kk suQSSyXgPAQNsqWSEgCxmt+sWWvLvnonoShfqWlXBRfE5gsIOTWux32lBYT4q/1ta0IFmHd3fSei Nq9Kz1A8EZRHOLWWYhcouHnx00qvrM0hayG6rFJVQ+komsW7Zcroou9a7uxU1RnoRlRPJJXgWfC9 SCbr7NqCdTpFXANQ+lCVWS5eHfehblDfa4CPzxwYugyFUstcTWUku6tGbju3BUg/o3GJ1IptD6Lz VfGVxcfRl07to1A1UQg9xzIX1x1F4cHrxSX9hPy99ekmY6Lav+1v3NJs1nhzLqYCiNV+YLnatWCa fI1b0UJbdUOuHbMqxXvBPoAKswbOddmCmvDYMCXAw+iKaibCGaoNxKpguJyrEKuWZtVZHuXUhO+M 9dAFAfNel2FiCJ2ahCx7OnqnlWuH2+oc9CayCz4wR9bncTeHghUnZtm+XyjEEnFk068bcpTyY6EX 5x/Q0BpSyGBOIfK5D4XRqwkb+KTeyus56+C6AGWPK5O8S6J4M6HQ+BS54q/WSBXTVQEz99SGNb+X +ZRhofXMueJShaTRDvaIaodhRjQ6uiKEExALGjCB0JQLra1OSmc7og5RbYgS0QJc0w5MPCEW10XN 7Xp/rpGOOr1ZUwG5kTC9EPmlmddNJtDFjsGUaR+yHEFbhtvyxKC+UPwAEJHclBaAFzF10rNEHaMR Q5+JvsSEUSQvyTd2MKoNjvpo7VkJe+LSqHGVVGYRxFSDDPCXy/1W3qFc2FRMZRCjesG+5NlQeW00 JNJtNpBrYFDXvLuWxyX2c4SrWv2eVG1XgAZsW5jftiLhGN3buhvEzuPuGVf8EqqkLcObLBdbW4hW lhd1+Y2uQy/1hmurMs3F3wRkO5mqU7K2mnIN63SyG8AIa133tKdK7rEILIJC91KuWywISZsyUT1v L1sCRYYpabux7nfQW71WJSpgrU0Vs0bUOYje9FVQbSHErC0XpQu0gIgXdKEksIEIq9PL2enSQhBc UlWlT5XsJafc2xZ4JZhVKcDnoJUrJfpxo+Fir2McxRkBGMRV2Vni/oD+xhq3akNdjoiXbhee0gAC znTxqvo54C3E3oixb0oLrcCiS9+s09EhXKoLbUroKpbknLScRGxwAb7RllNNCqKFqN6pK/EsvAHY eJVSySrRuKj2ZI0qxBK/LBaImMCoUwxe2b0ks3DkKty2bhC1hWLY8kxI/Fjfk1ZYKttCZBOwCKPq d4Mu5nlvLlOjmUL0QZyc1PTG0BUTpEYi4mXas97Pqz0YQ2o0mKthttpCt5dZnT1VumZHe9s2S4Kv uDlGW26MJhl6KYJUdpTQMU+1ZbKLNVmnog7GTyGVnDbjzTW5w+fVHb37fn67gppsXnI7fGFTHWTf 6xjnkEpIIOj9oYq54oUmPkBNd5upobJkVOnyjtVrY2VT5Tw8yVZTFDnf2oNc45Wx8Aha9V24RZwW 1Gg77WtPaXIXUnWQRTXg4sbpZisuWTI96eA7U4ff+6YWsWtqC8qNmp3CdcboTnVVW7zrfjJi9GEl 15+MJr1yM1gHI0c2SXFaMdQBCZGF1O4K0RrtGAdmSwtWk67M/kH7UIJvvcAgv0K7m0fTa4HPaSvr XjYbebGpqaJFGyCTRrvQ4wWrxhJK0Uq6KNn+di9+FMrJnRrqtlP9/MI9lXqmRKiS0ywUHheU1CrX 2c5VTU5OFJHprVUpqA/XaSz7gU/pLhOjOTvUT/eij7lrtJR9MNlrp3Lh8FDSkXyclMoaU0uMUq9B /qoRO5aJ4jWjFt0rW/Di1UfnrOZJLDnk3qM1gpb6tkIvxDO43zl9FonJsiAan+Gye+XsXpYCdK86 APLhqZI7016zLcnL+42FGOrIYn1aLw0EutFqzFSCZSB6nRuVRl7rA1ja1zKFxGdWl1VpO22Kl6l5 XUQV1vIyNWXCEhXGu4qtUSLcrdpyjlF1Rq4WFmrwrQbXXAl+pnI07cBAQstVGZouKwC0WdTN5BsJ SyXkR+ugY+0bF4aW0VU7JgWJZsjo4JQJMZpOIYZCK4EGNNAlR1KQ9GURQP3BdT6NRv/5ae6aSYjX TadYibl2LfZsOi2C4DdO6vKXnBpf6MqKxkEDNurYUgn+J5yWqXpHvTI59jx3O7o20DGgLzFVtJrV pORcjRBDlRN9dscbfJR5NPqJV3RXi1vrYVOSuoBi68ZeH3quf6xlBglwruogR1/ZtV8UqHYeGkeJ m+hE7XOSSrISpuyUT8KxMJpLL3GmxK8D1phmKaLE8e6ulkD0GB7YEw1j8PmLQmyNWl6a+084rTO0 3XKWBloNM/VXru3ZQhzPFWKJ111jnhqUx94q+Qq8AjWojOAjb4RY0nDogq3eP78vVZeOI57lcUH3 fValiJo/dXx7QRduocqvUhQDKFHSda6bvpTjdP5IbYExNMVIqkOOXSS5VC6iY76GMLq8Mi6O/lq8 ARcbjWZroB7PqgkEJpYWci9aq7U2ia1RTVeI58ovUNVoW+5xAyrBq6XnjM56drHGZsR/T6Was6i3 1DXgTW0gS/Y09asvNS+XuDpBjYsuOZKyliexk+H0YudVx5V6GKap9O3lEdGwUVXM8f+nSufzGYro CT16Ke5lKeNr7ySXLTGuttG0Xi4AAnkYTheT0mLWWtpmizlR9aJOGdrM6skWWybLAVQyXV21aQt7 eqjm2/IOkWrelKe3qh85JNr1yqrxqMgD9EnCadynpo4rVx+pzb1x2RqYUIHOj0s16iPVAED2JTXb mq5+vm00RAQuL+K/LQptsB9ArDunVzXTGhn8QHG3RjMBahIIMSad2dgF5UA3nVqSlFhrBTnXV0st v0ygVb73vS4k014T/63p5Wt8CZNhuLJJMA1tLe7jizW2HkswCa+DzaEGaDtiTWf0UjCYntDUdEYb 6pxp1qmY5m0jCXmm9SQTutbWkvZSAYV+tRowVR+nNarG2wIJqYMoZmPb1aihha6qogQWQfRaVdGT TK2R6StZoEaXrato00IaWp7O0uIqidIC0M61lqAVOQaiUe9cvY4Wzlf1Krs6rtYKgL4shViHeOVK TU5Wnnby+jBRX1XV4b1aVY+z8yTEXnogiZppXU8h9eKrrdNUaG6kTk6I1lT91xptoYuzhS7OhhZa 5UjNhOFiKSXLncMLYq6BIQip2kKXUw6lngYdbvM1GY+h1Vg7C/OuD0HDYSZqAyWS2XYVCiAaLTrg fHNpwEs+fRA/aV2teO0KaXFl3RS2K9TAq22aUDlS1GJb/Y22Vk3i5eOmS+5Xh5ff0KzM4EpCpY2y dQe2F961HLV4oxfrBsKsJsb1yuB0R5ju9uS1FKepmrZFSLEWVZfARcun4NZ6jKDEXLeO66z5tm9t sswquif1bC9nitBjTH8tqi7bPdEWrUnxGhDEtSlpwXmHSeH3R+sDm1bb7QqwNVUOYtSxccCiNtyV dzUqu5OkHKVnxXbDlV4L2dtcTaQWpehaphxLOgSQJ6sAI66xF6KmvkspfGmhrbCu0uGnSu+q5PgI PBDLOedysfikzG/V5O7JSDm9tzwQEaqnSu+YksMwHb1WVivUiSOwFRZQSq7YRAs6Pt+xMCS/zpzr qgDxnKAorFACp1jhin1TUcshwgo+qaA6NFxrvLSimOe2rr6ps0y2v7bQmF4LRYhzoXpy12azA5rw TnE6bShury1o+U4r70YsfSi5KBjWZc4QFVVwITvWdaW1VLTV0E+bq3pqJYJdiNHUCyu8kWv/lQk5 WVL4JKTSBT6aTIilCgDEnurGga9ar882buFMowXxHElRdlWQZg+FCHpQeu9xHUpO8TbYGo2uer8P wHvp47Tco00VUtcKEqQImrIQHSarTXKsQsdkQqSFLL2KBbHQluNBZM27gltcXOGR7BUXYtSNzAWo RXJJSo+vNK4nK63TZVcdHeXcUemY7wRoUMSk7eJwLJm97S3xU6XbUpDcdrKyT6ycHiQ0K8SecRVU T2PaVAD6ijcYEFmHCrFnGiEnpzuT3fWnVUkW9Geq/iurXkWmaJwW7wCoooTTgtXg6c2Gt9XUFZ9B Ja8QQ9YZ5trLajry2+i7lh+L02JqC7nz11Nstbc18ZX4jIgK0HVaJsHOru7O2nJhHFkmjbZ05eit FK7XlrudqGk9HENSJ7noqMSvYQula52AQECjUb2hKUBEVEoNHF7GVML5sZomSWy8LmRUapXknJ0u sMNobaaXAhfE05LIiKR1IYgVlnrGMpM1UGfr87RmBdHGRiF5nBF6LPHKoOKzB8jg0KvTlkupcOKX wBWO0uJohIRN1LF19Vl82knMPboQFXoHxZ80Js0VHqXZmjVFAqIYKEn8VBBxiEeIOpW5ZhsLuDJJ YW6XmiyYjiTmfcmatrUaJkka97EkaaW0CZJIqx9wyKEro3A13IOTZYqJkyRQUpPNxZnFUEp9KBLT rXc6E1YbxuFCpeEuIofsdtDp5ATwY86Dd/yjhiEy5o3uGN+lYqKvBVb8avpYLlaIQ9JcKIoEYiyz 1pP4sbxxSLqWxcnmcwy1C66rzKALy3C5LKLWUCh6KEnm9KnSefxl0KWmAMS2tKz+BFrO2odergul HMUELAHJx1xN0m2jqAl6U4F5qZdRwQl9SZlNXVGcSl8QYrHG/QNK+lLhB9dlH0BPbVk5TbmHLG8R LU+TWAMOsi8wz1SPLBO6abQFzVCGYmsVTislTG11KJIUZpQW2urWIIJbavO60qRhC42vfFalH9dB 6RbghMM7m4W40cXkKr3SQqxg/VgVAQ5+q0pH2YSr+HQb2q4wztX8capGRChvji4TKaVnjbznRWh1 d4cOBZOkZOSp0n0Bo8dakOCzhqTBI1rOXd4BKD3oSr+zusMsHkQS+O7wh8R+mNB4UQ== pAc9GEBb9XeSIy6E2CTlJ86XPObic+LXykxV/oKedaeYkmjDWyNKKWJB8hdiSkl3cYcR6irrk1Rw PeaCfQ0Rd2wKJEHB4yRxZUsLESfj6lrmpDgAMmMKUTPTINaVDF21HloO2jK/y+ExwyEUr5WkRlWI 0alN0NVl4Gjwpq3kgjoIIhEKS5cuhFpsl+Ss+NKCr6jb1MFxnCA5ZM5K+Q/AQ12/OkXmm54c8BX/ pLBsvGNUtBBQWVG5KXSnPDBaS+mxKF4QrdVBFLu4h/dK/XgHDumS2C0PrsAOmoqNbOXdE0LsViJ1 CF8+Xiyq2FMgVlPLl1OHSkJ1gopjzrlLCy7X+rOk+VU+lUw1tNau4+VejU5ud/iAy3KcUGdRFIhn l6BIku97zGBDdZ1SdRBwfGlU86MTA4CqJt0qXFj/WODPkqNvo5h5jxkuXrKPbewDz+SNvUVgpJJ0 wDEMUvcI478kD20H7I6CYZEW8ErqcmBCqohSwxAg3ZnW67ETCnNOgjivLdimyr1ymkmuELNU63D5 wqiCuzO10bCEpdE12aw4ECMrk6kfAWIBOcc+qgQHfiQxB2JND/MLEIwK+RL0x9naxc+K/bJ3Pu/f 6+wU5ASIJarc2Vp8OneVsJ1ew5EqJR4QJajxtNK9+JtRsi2Vbhtdj3qiCV40qn1OpVjTBE1U6MlO 5YlWCvKYrsZOA9XvVXEXAxznChUISOyDSJrYF+GN1HM0oca6Yg31Nl4ypGWGq75pbI00pFpQ0uC1 rap2k1SO9M+tKlKDWwBdT03o3PybBzf9Tc90Qjy2F4WQ10sKnS0auaWcT4T4kVdkPkulcqXT8zJ6 dTwc0TUaLoj1yCnb2uJg6h6/2Ycj7V6LKpVa5Q3xel7pocJiStk9R5lrmXXpXstva9JAeZfpRQtd XbmGv2uQOHc1ZyBGLYFsutqRtiL5OX8bNdKds4Y8y5kTNwfRjc+q/8G9k+P7Cz1pEqh2xPbKNmyp mUfawWodBL+m4+gdLT+tD216UxLL6y+FnmplcgqaCkpBS5wYtCXE7GxUYtUtbaOGIJfjtHpxQSdo ocatXTjq9a74dVo4U3tXbJ5cizgRVaiVyS6VKC7KNjRz3MMiSlpMcxsllYqntVrbFGoG7loPaudQ /NBqcXIqp9AXutHOpUZrH6zX1K0mGFPSGkxJ3dYAQpdRrS5yEkxLqUHyWjtxrQNd3/olNUE7FuSA 4JLsrRGE3FRisbdR6xO6EutqciDcUAtqgtZTBcGOlHKjViuIcoWZxe5oqmsdq3zIGEoNaLMUPFd6 yBUzAhOlwiW7oyg46vD0He3UR/D74fUADba9zpWuSqBDtuLYhlo/p2dMRI2Q5gFCGA1HTXc3xR51 fSivZhZvdqGumM09gCHb9ueVnuuZG4BlPK30VkOE/NfTd7TzVA9mfOdhjB9yjqlp5Mfnf/v6ZL6g ph59tl//nvyFvv307dO/rs5m/PeT+enlfLWcrt++56evJl/843yxpB8fUwfX85+vLmcXX07+jS48 WK+n1685fT1fnK1nS77CTva/WV52P+Jfl2/fzPjHL5rPv5zs/7icnxL1ObW8fDW88tfp4qpc+o/f vxJnVPKF6Ij07Z4P6O3mA3p7dwMyzRZD+m1+dvl682GVy3diaK9n81evLzcfm15/V4M7+ObFweLN 6+kLs/EQ52d06fvGhYvuakyrn/9ndnp5uLpanlEfD1fvEQm9ob1kCUjXXl5svoSDm/5ts4HdNwF7 ebX++WoxW57ONp4ruXnTSaqPurPhbTyw9eziarHFFtbr72pwy9Xzy/nl6XsEam+AF3z5D/PFbAsu H9x0V0O1G49xeXX+7PRy+us2Q+zfc2eGwV4TNh7kz9OL2cl69r9XtHG3MBOu3bahyHrXeMzvjed2 RdGXuLMf+qLnPV3//VW5kwV7vrpan86+Xk/fvJ6fbq5Dl5sv13y5I4JzvnzP/hyOyt7dsN43/b1B rd7M1tPL1XrzkXV33PHOOlqdv1ldzC8321gfqRdsHL2/A/tPZi8nX41+6P0d0OiHjn7on+CH+tEP /YT90JfrKVngi7+u5hejJzp6oreO8l54opuLqd31RDcPCY6O6N2LztERHR3R0RH9RBzRx/bBuaJb DWlHnFH/cJ3RbYa2g87o4ezX2eL56+nZ6rePlBrdRfdMbAx21B+chfHz4uo9unWHPbPN3ZWLy7Mn s1/nU3RrG5+sf9cdmxtfT68uLubT5aGs6O6Z8puv1tkWuv3sDpX7FiPaQrWf3aFu30pc7IoMXL18 eTG7PPyTJOFdyohnPNKdlA4LGEco9DxdLVbrv/z2WhyrTcX728UWwdJy+bjJ/sBBXbyZnT67es+W 2WFbY/P6lYur9cvp6ez56XQrnhzcdWcOULP5MGnBrxbT9fE/3qyWs+UWS3nzzjsb7tajPVotLy6n HzLa7s4ddZMeh6bZnD12JDxjmm0GtRsBmsd2q0H9c/NB/fPOLZzvVvPl5dMSeLmzqOvsednUT4vV spMm17Yqe1dMkQ+L5+xKcuWhG1pj8uj+S47N7aZf3OaLg2vvius2V5e/vCfqMxiR3wXb9pctRN8v dyj5tlij9wx+MCJz15rqoVY3bG9f7IoOXswvv5vO3+cF7rASnq7nl6/PZ5dbcOWojHfTrf+A6PgH CKC7XN5vZ+tXM8zrTtpaW8uaB706H7UXYyHXHxYq/PyhBQq3qQzajTChMWMd17/tZh3X0Wq1OFzP Zv/cPEU64ooeHq7I7G1+dMB6eja/2mJ+9Pq7dY0fZlHeFiM622JEd7h5Nx/RrnnCZ/PFdItKlB32 gr9drd+8Xi1Wr97upJ/0kIXhwxOBW8CedkQEPlwA7CgCd0QEPn6ABckPT/JtCbzZBdG3+ZDGwuo/ e3Ee/OET22yoXZERm5uyOyMjtrDOd8w++oQOCNm8Cn53DwjZnFHHA0LuXr29p76sv+u2BGTcLRLj E9dqO1MK9PPmDLgzqnrzIe2aqj7YPId79Hq6XM4Wz2eL2elW0Yybd97VaL/fPAn/waO9eecd67Mn 84s3i+np7Hy2vPx2+mYnldr5lJrbPAG6S95aM9HP5MafZvDnxsPnP7cwM/X6HZCvO6PatzzgdBe0 4OZD2tGg1hGQ9t+qqNk9KbkN0+3KPtrcwd6ZfbT5kHbNmtwCPv7nnT9033bpy+3q1F7OF4utqrgW d7f+4T1GRz/f9r7y+kHC7eoOnYbNmfrlenW+xVLx1Xe2VJsb06stTOnV3Y1ouvht+nZzBiRZeTld bydc5YY78xQ2H9zPeO/jFgFYufyuBrZcLTeXh9PT06vzq/cXYPTH17/nrga5mC9n080hRafTxem3 q7MtBtndcVdDXM840LD5Up6dzS/nv26zkPWOuxrj5oZLf6Dah7/yWDYe7fC2O/WOpsv5+fRuj3be /RMfH7djPdK9dzlPH1490hZD2tHQzViPdH8j3NtsqF2REQ+vHmmLIe1aWOoTqkfa4rzK3S1IGt+d u1MKbnOjd7cqkj5xvbYzFUmnD68iaYsh7ZqyHiuSbh/tWJF0r5Tap1SRZD65iqRtVMauqPaHV5G0 xZB2NKy16xVJ2zDdruyjh1eRtMWQds2avJcVSbuQH9vFyqpttub20uYuV3a3T+zcpohzXJcHcorO 7izLR+3FXfbgQR2hevDNiyd87s6LLcN5G1peu6jwtogC7tgBXw/7RQDjAVKjIPwDBGEcBWEZ3+Yz MQrCURCOgvChCMLjNVFGg3A0CHdcDs7Ax6MYHMXgvyIGR3NwNAdHMTiKwU9WDPbzXy+2LHd4wNJw 85n4FHOg497afm+lcW+V8W0+E+PeGvfWO/bWd/N/zBbfLaZvX2wJPb3PRUWhmYTNC0RlTb/fpka0 d8tdjXF8RdvWU7aena/ed+LDjp5+ZLY4oGV3jj8aj9XZ1WN1zMR8ZZuJCfTvZkL//4r+pv9+RT9M Hmzp/nx5Nns5X863SCutZ29m08sn22zJ3i13NdBP4tSkizc4N2njYY6nJt26kHd+atKG5t2ne2TS fTPTHvLbZn9evE/S7yCGY6tB7RqKY4yy7JLs2G5/7YjQ+NDE284ckrA6f7O6IKv52dV7BMMOy5H3 MdvDSC4e6VLupPTYPAT6y3uqnfqLg2vvLMCw+Yjek6objMjfYWRh8xFtIf9+uUPxt8UavWfwgxGZ HRPou6WNt3VPdlEX/yknd95NYHk9v3x9PrvcwpwalfJuJn0+jKFH0OmH9mJMzn+M5PyWZ77e52jR mJwfk/O3TNmYnOdrx+R8z0Yck/MfTwIjPW+br7aTxmNC/nZOHRPyf8Ygx9cYjQn5MSG/KxGv3Yjm jQn5XYvdjQn5XZIdDzIhfzZ/+fJqizcm7Yrc2HZcuyY6tk1oPN/unSCDm+7/GMtqH62W5Ggvt1jG Gzfe1VjfzhaL1W8bD3gxf/X6ki54fIqjrTcf7/X77sxv31zzXa1fkhuxJf8O79pQ8903hfOQ44gP 8h3nYxxxV+OIIn6/erWezZZfkaE3+2q+PJu/Wn3163y1mF1+tZ6dfbVaT5evNt+OY4DxdhYeA4xj gPEPUo8PP8C4jZ03Rhnvi+Fm2s3zUNN/zs+vLt/zUtXBIukNd8WTcfPBzRb0bbuYVe+WOw5YPZmz T/gUW/BOi5GeiJP6tMiCndwSDzJ4dvFmdkp6fv2QwR5k+X4yUQnzp4cl7v0wC4cf/+MNWc3bRNZu 3nlnw91cX2mntw8k3rxzDDqNQacx6DQGnX434oIQkwSdSgSKY09j0GkMOo1BpzHoNAadxqDTGHTq ePLBVamMobR3bK6P1ZHnxU3b6Vjah4SddiWk9rAh6Z9CwHA8Heb+S5AtzukYT4e5/yPakdNhtjjv ZkdOh3nY7xHaujZ8Z/TwYn753XT+vvj+Divh8VSY3VHG41Ft918Zj0e13X9lvLVQ3xU9/GH+/q7p 4vGItlEZ7/wRbdsz83g824f24i578NCOZ3v+enq2+u0hvThtPLfsA6MZ4+EYO2dgbH6k4niOxN1v s81fJHz2HqE1qEH8x93x3xYjervFiN7uiLjYFRm4evnyYnaJfbOenW0n5v8FiXiXsuIZj/hTdET+ hbV+0B7JfVunPy2DtDtLNDqNu+A0Pjbh8435dQs75g7NmK2GtIUhc4d2jPHN5kP6bX62TU1oufzO hua2GNrr2fvrR/tj0+vvanBdSOYBHZc/hmTGkMynEpKJY0hmh6zw9sGFZLYY0RiSGUMyY0jmXq/1 g/b379s6jSGZG0s0hmR2ISQDp/Fyuk2Z0egyPjyX8eV6eno5Xfx1Nd+idF9u33Sa6sPuZICnH7W4 6m6GtGWUZwegzVsMadd8++Xq+eX88vQ9odKBi4/Lf5gvtjmaZXDTXQ11i7Ozllfnz0jw/LrNGPv3 3NUQm73Nj0P7eXoxO1nP/vdqtjzdwm2+dtuOKpYHfDLYgzwYbBvGfrlenW+xWHz13Q== jWvz9yZdrrawalZ3N6YHf4jbeNDXbUMcD/p6xyDHg77+lJD65ubMp3vO18eKff1wtf75akEzv5tR 0m1c1h3xwh/22UPjuTx/2t5+UFHlLaqsdqPMb4sB7UiRX/Nwi/y2GdoOFvl1RsCL95ztMWZtfi92 tPNZm8u+NfjwcjYY3pgP2P18wOZlZbubDmjuaT5gdET/ddEyuqKjKzq6oqMrOrqi98BfG13Re+qK bm4Aja7ow3NFH3wB4eiMPgxndPNjZ3bXGd18jKMveveic/RFR1909EU/CV/0sXlw3uhWQ9oRfzQ8 XH90m6HtoD/6n6vV2av1dAv5PDqjD88Zfdhv2NnuTIMdQX496HNdNvfHxnNd7l56jEftjue63OFZ Hw9OtI/H1eyQ8Hu5IAta3uH+l58X09NfvpoIafVmejq/fPuXbaKLF5dvF1sE+Mvld8Wn2724fld2 33aj2tENdwIW3cn9tiXT7ZQm+8BTq3YlCHzBZ60ePUipcTc6e4zl35NY/n2Tkg/S3N/6Tck7Iju2 HdeuCYxt3zn5/HS6jRU8uOn+j7Gs9tFqeXE5fd97VAfhg+s33tVYf3u9zQETC+Q46ILHG1hu/eFe v++uRrt5md7F1frl9HS2JfsO79pQ6903fWPc5tM0/ef8/GqbFGC94a5YgFnx4R0eFzc/dmy2oG/b xdh7t9yxKfdkzgLzaUnO3lllBnWEJfjTItlGy/K+WJYf8u7vXbPCRq39UbX2fT84Uln8+B9vVsvZ NnbnzTvvv5Gtfd7eyr5552iS3VeTbLTIRovsX+vI87Lbd9ok+xDrZVcss4ddFv8p2J1juuD+S5DN 1c4v7zlAqb84uPauuG6LEb2nPGMwIr8TI9pC/P1yh9Jvc3P+l/dcOhiRuWtt9VDrqLfOv+2MHl7M L7+bzt/nJu6wEp6u55evz2fbvLVoVMb3XyyOyvj+r9GOKOMt1mhHlPHWQn1X9PCH+fujLh518S7r 4l2MwY8vo90Nk+vPUBW7szoftRc7yR8P/rCuDwuz74a59MP2h37vmknxCR1H9gm8K3M8G3u3tMP5 lJrb/JSRXdILZtKUz21/VcrGY+c/t9iOev0O6Y5dUYtf090X7y96232sKwMOv9U9unvi5SHbZp8E YHI8zWaXttvjh3eczePN7cldOc/mz4qp3cngno0HwOyOvNjejvoE2HB30k3IT2CIPzzk4+rHGsz7 L0c+iBF3RZT0B7c5kHbXtpnZ2wJ2Npr6d77lHq7qxn776eVsfTJf35v4zn1b/cvpz1us/C5Fbe1k 8yQJz8LftgzLDm66Yyl0crU8/X4nxc/DZcC9NGkmnxYLfj2y4P1iQfOpCcHDOy3uYecLxwP8sJ4u L15u8gqae7gfPshu2hWj8EPRSbsUypEx/llm7xjMGYM5t64RlzoeLBaj7/WHbtWx7PZDe3GXPdjy jXSfH3xjmhfHy7P6ZjqmBZBe/HW1/I5a4SOmHhf64ezVfNn/5dFnf30j7Xj58fnb859XC0kbzia0 7qvfvnx09eizZvKM/rXXRusaN2n2kmtj8vRHQ/840/uD/jRta12YmMlPU9ypZVA/vcW3/6C//odo v0385NvJ3/+7mZw9ot++p41g91of0+QxGjM5uMn5o8/oi83ZmTjJeyk57ydPaZr3WhvsxO+l6OgG ojzmm9PttMcghuh6t/ZJ3SMe955xszdEfEmT9YK2w+Vw+3/+4ovHMgNN01u+w8OD09Or8+9Xl10Y 8vMXWLgXjz778V1NNZP9w9VqMfmCVsV9R1txtl4eL2FCf301Pytb8vMXKjb6V/3jzWp9+YPy2+cv zM1rvqdVvrhcc4d6V5ZO5ckXX05++s8+axWG+EC+auW37xZX9O9n/L4xYq6Ds9XPs8nh+uri9eTb 6XL6araePFufEe+/78eJ/Ho0XSzmr8Q+K5f+QHO2PwmTN5d7k4Plq8XsbL9cTHP8bEnDf02O9mOw du/6o9fT9elqurh5bf+qH6ak7GdnE1rYlbTxy2z/y8leGSJNy3CAH2Gy3jFizEl/zF9yKWKgT2rw v8D/K58/t8e3TSW6p1P+Jcff9ic/LiHazspVdMP+RD8BwsQlG/gPa0LM/EfwmX4ty2lImJg929Vb /v4wP6TL/fX/ZXa947bpeoxOUM+4T5v26EMmPstv1OHneLXJBSnp/3e5+m3J3yBHvjhYcrrkr9RF 0eEkZX6d1d/32Wy8Wp51rzTFysyXE7nkpOgi9H+/XCMK7m/zizkJI270lkaeX05Pf9mqkcPpxfx0 0AJmeZsmLP+0eLYut/7bNQONpmF1+f3sdEVi5Ix/lQvLbFDT30O7Jd+EBqwWXW7bRH+E1reNxR8+ RJ863UYqo0mthyq09N3myU8H79J1di/cou1w5U9n6CiU+YTMgy96naqankYBVT/Z/266vrx1uo5W y7Or+eVmM/X7TWESt1q6359kNNdN8aZmQHNzYmpDPC1VQf54MTv+dbZ8dnb27un6/QGXbX92JqbO 69n0jPSr+b0xfzG8em86f0PbTDY13TPTDffF9Vb3f5hfbjJtpqGnfz+b0gAv6qGZtimq/HI6X7yY sl0GeipkPKNH3oxzDhez5dkfuN7c3vYL3lvoroXfXVG65/gfs9Mr9EV+1Hc03yIESQHGURDeB0HY jIIQU8ye1A2/6cYf8tnOhcKVf67sfLJevZk85/cVvU9w9i59t9QctLexyFSBKWdu9xzxnxfLMyXI wN9M5+WSTs6eTde/fPmulXI+hQZ2p01tZD5vXZtyf8Ui/km3/PEvr97F6UJ6S/3Q3uJ9ebqYPMjT i/Xpl4N5+HW2vhxSXq/W/xxVw03VkPqq4fn8/M2iUw26VbP3Fgvf5mCjnfAeNW1qWtCIN/Bf67I1 kX8JsY0fuvIMrt+k3+1O9jsZn0ZdfB908eiUjE7Jv+qUjD7JByseEoTtRxeEtzPW92h3crRaL2fr 9/LV4OJ3s9W1Nre229bTs/nVxe+wySjTN5DptzHyJyfR2fQxrvXZcKzYusTTSXMXYt9oVwuoxawi ldWW+R09rjv2uMjfsuxWpRxbx3801mJ35MZErysz+lb3XcXl0dbfVC/8C4boJyDPm0yyA8qwCb5h 9diQunR2IM9z27jMQiKQ7mSKN6YdBfoo0EeB/ocI9NCMAv0+GPpj8GYM3nysjHIzRm82kYTm/fF3 2vzesLZrjeWkkDcx4I+2IXcUvifveDP4o402hY8ehg92R/MHwY0q6F6ooFEBjbGmB+CajNn9B62m /agt7oW2GB2W0WEZHZa7lITh/QZ/m11ysFvgi0TYK2TPtB72imtCioO9D6LPJBk+usUfd9VVGUud 7oXyGcuOx7Lj0TEZHZN7pY4/fvXXqBtGx2R0TMYy2HsuCMcaofshCEcxOMbzR7N5NJtv0Ra0A8K9 URhxrEEaFcaoMEaFMSqMe6ww3N3ri8plo7J4cAiEjwKPHKPv910R+IcFUvDh/TLf7pl4Q+z3ib8v +bdQ+A8/5PR3ok+vFpf/vUFCeaud+v0W/LMlevedSWc+BPB4edY7AvD9Zwl+N13MLi9nIsS/+3nz bn/x9/7Bof/9JS/oT//EpA5/ePTZd6fbTuAX//kax1frrZtvROIQ0rQ3n5kzXJ3J4GH1nu+/Ppx8 zydllruiye0ASZZjML4d9rR383/NFgsci1vujzZFnweP6g7DHdz49Xo2W9b7gknZpf5zjQ0u5+Ht prv96O20u7ttXYzw2FLMJt460bJGejcO9K1325gze4AtTSgf6HtzdQZ3fzt9NVteTmsDJmaaNsxV anNCA9km6xmiF5PnPxKqLBxHD8jn4QHSTCVt9d9NdpOv/93lyeG/+9BbRLo78iIabz0/wllXvKns +Se0h+4b8qoaXGO8oca1ZXLDqGXbUssu3mSPBKQg81Nsky6dEQ7zxVFztc/Dlon29b/n5kbLtBpw qJsmRu5zG+LQA/z/uXvP7mR6JVH0fj5r+T8Yg8mhAzQ5N020TbSNEyYbE014Z/b5cH/7ldS56UTY 5+45M+v19mNElVSqrCoJ4KJQF0CIJQKAjMghQoZzxsFPABqTgiZwVIETBFE7Ks4J4yTbCymAhvU6 cAwFBCRKoVIXnAS7woMOwUnDVeSSoagIOhjCSfkcSTwSCcpBc4mBKAn/DzEpor0AmoCUJhGpSZE9 IpEoxUkQGQ0jQAQp4zMhIuY7HxSAcbSFgAFkgEMY2HKWTdEKIZtgZEQmRqEgy9thntCAtFgoKrBd EIPUiMIpUyLkcJDCQzI5ikbDGE+MKCHmRMBYnu0IluAc5BDawQgOAIeDoqRSZCSE7q0Nh8BaWf1A AnJEUaQUCqPrbGH8CftWeVhojkG4Y5S4Y2BdSOhIGLQido2EEbsRFEaFUI7OHxQyOGKVEw8Pg9QM ibIWBjIckoW6QBzCEdk+4fzGC4tmRYSDSwaFNeO4BHIkGEQ6NYpF0EyDoXAoxG0TbHDBUBRNhJGm oI6nSkG1AEuoBDUbDSOJB2Ig221xohRcOWsuICGhjhR6aQDYICsEcKYEIcpuJBwiEQ1DBBUMaShS fzAIJQpSgb2OWDpVnIRTjUTEbYoCCWX1SyjIyhMZjAZZsobYRmYcNiujBUXBRoVFRuBnSwHQQUSE ID9Z1rYQFBgXRmwdIhBQnG94FrqISBYoL0tIlKDOAr6whOFDBJoK0FU4J6xRlt8JIgK5IiiqbDA9 Vn/xQoRBuQebB+cnbnswGgqhmQASRFHvExRTzsAAyY3K9B+vYkPszgnyGebNAh4U5RPoPwgRrS5M YIhvcCyCIy0L+JiCtX7wQwAdE3gJD0UAMLj0qEQ74YA7WWIGowSrSiNhgs3PcWpFJCU7S0EtETwt o5iK4xGGlgTuDRZUSJZos1i1D3CHIb/JTBaJNonARUNNRNDl10BQCGRhgIMQlDkrYZ6RKL7/XVw8 oDdk+QgSJQkpgcFAVZ1BAJ1keR+sEoGlIhiyMhT7V6SZgpC9xP0JQbONk0Ek8mGJamadlxAgIfJM wI6wMgvUZhQZEcG48laFlBlXoECgcYU7H5HADYdY/4zCgjibxw4DjQrBAQ8C+WmkoEK5TSNCQmkq gBuBE0aCT4UklKXCrDKNkFG0HxSw4azuw6FCkxgQCs4SYSSkewZtCKBEiEKSJappEg/B9wIgd+ER 1mCQwLQiRotGoijbSHGkCLI6Cq4BXW/Og6ag/OPI/EUIETJFkKzIhIMYghwJYiH0EANYD46uR+fN H8l7BYSYahbMH7J+Eu1KAicS7R4VxNkLFgBpg3gYCUAIUYPjAmj0OEbDFbsHORg5GRLXCGwZib4O wLNkBjLCOoqAOqEQcm0EQ82JMZA+CZmjkBQskUUaB8NhVqOGgS2kWNEN40iYKaAUEEkJfsY4L3sY q8Y5wIjGJNLevMTlBjCV5qzNVuP+Fjjs/dEM+L0uLubg4wj+Z24KI6lcDkBTfkMEhw== cV/O/SDQTTAAxO0ngFZ+QzZTpj8a37bXt2wIZQxMPl5zlq2f/nZzi8Kr2+fZdAWjRhPQVb/GInG2 NrNtf7FzyWCw//8uAfh5u5EM5g0f+wItzDzVpyfGiKyVhopVYvuIECvQFEUhfQ0ivijOqlMQTbFG FTAjrvILr7Ah8xCQKyXOBBUNsqoKONLwf4BMI7EPgWgNMaD4H+8zQq8kBHVTSNT6VIgMIysUAqEK MsXA+oaRpgMTRtMj+Vkpf+HghpEwwmAiLFGlQB8jfySEQ50Af8HCYQSPAIYaWcCg8J/M1MOfUMuJ ugg4DUGk3qGaiYakv2DhEOc08JNT/sLDJpAGRZEa+ClKNwGUMVpvMBxh1SMwKyHWVAN/JcxZKEpm 7ljDFCKV5g5EpGwDAIgnkREFAQEVksU5YX5+yl942GHWlCKvJCyqIWCBKDRRHPp16OwvFCLlYX1E +I9nHSyInAio3MFP0Y2IBEMofMPAHiNuBF59mJKHaPz8lL8IfgSGAjLI74Q0jgRuGBvqEiHWwou/ CLA5yyH/XyE+RZ5PELIB+ClKZmuz6O9+RNEEpA+hsBL4zARyM0D4EyVYpwXmBJCu5loxQoKREk/U kJuFwgrk/1IRqVzApAE0ltGwRhgg+ACAlBiSmagssAyjMCCElkGKogHsNEGw+x7BiZAqaJx1LaGB 51w4LnjlfXZIoQgbYIi7GgQaBdEDGCyMUn0zyR/mPXiCdTBkdxdB9ovAXQ1FEGieHvWcmPITEnun vRtSm+32ssSoeG52nGFkB5/7wBQmfWAKgvp/buSvTCnfHOLG6ODjFkOvh4clMIx0f99Hjyrxf4D5 XPhPxQNL0nfcVD7WfgcNvdfEvYT2fwrMlbBoPVgmviOl+mTZfc9pX+16//S3u7jGu2Ti+2VgMPxg Z/SAmTCbnfyf/+NJtVqvtJ6Pk1FpsR7OxyNTZOKHev8jFjiYrUZgwriZRQKeaY33j2g1JhYqHX5N pricKLg+UcyRYgbfbzMlGWZ2+v93RjhdKcT+Ma8W4Nj/DIaH6xwedvv18j9A/f1bWTS268NzUGhD gRya59T/E3IDJvSfNp//u0R5N/mv/wD+/h+gyXeL2fD/HjXuC4ejQgWh9qab2/D/EJWN41F/JEhE DJf1L1PL+td/yrIoMkIarum/ZqP9j6l1cSP/I9YWpEJ+PBQmDJf3M55Nf0yZAmHof8QChZo0zZUN 1nvgY9TGk/3TdjZFj3cbr/H4S/8x7gTSk+yz5TlYp/mf4U8AM/cfMY/leN8fAUfrCpOJXjwZ64jL lpjiOclo9uvvD+PR7LC8bY5368WBKw4TAGXLOH4rpGOA33TY3DIL+BL1ary9rW/Hu/H+VhL0Hckm KdQ5bvojPg4W6lmX/d1cKWO7zXqvHNdfzHgJCPOyOtrM/LwC4osu11xpJlpqtnybPezXt83+bj/e zv73WAk1W47ebuDLwLe72fKwkL7xzfMIHNLf7gfr/nZ0C8CveficPucG8RTK91f/9HctGS529bnF eDyCov4s2Tu+WDS/XW+y23GfrW9XEXWneNSCc8+U3/Lvld9SmPBrRPzVxX7v6FFznjoCToiFQ0mF QmRIc+W3+O1ANnfhlXP8lueq2/lqPZyvD/vb6XZ92OiPnQGO6+/HAOoYpSV40oYEqsFJPIx3P8Ie oj2S8Cr3lRCBPAatiRO3WyEHYzh0ior82MEkJpvK02G/AUszmAwhgb7f9le7TR/I+/BfAPJsBFhN YA7DqUjIbbg10mkbDhbJgcu2Bgn09p/xbXv83/vbwmi27w9mi9n+XwqGVVMLtf5qeuhPx7f19Ua6 8xL+zyGDJ5WAY5dabuBa40WpvweYANrxtkzvpOyqNba2HvYXUCnJRktHtGEUCFHzO8FPs7hYD/qL 5nhzWOzEHZWvor3eKIRY8mETui2KjwUCY7cTQXcCGVnMVuPbPaA0r4vxoB8IrET9zrNl5rBY8JR+ Hm/hrMCnKrunBnyH+jp2BqM3/K6v/xlvNzBFv1MoVshEnNqH82oc+pApbmvjf8YLXi+LDCcDvkXC 4vtnPNwD1gPE7a+GR36V4jvDxWwDeBXmM/4b8OoUrFmMRQPSInUFBx0VsctxELfAJjxxtGnJaINp DWuL+yMaBW6IklxyPVeotwygcGOUYIyWxEthQHQPA7/rgR9IN9SnCjzKUQhVf8Hvm8hsRwOBMAP1 NTUCuJvPNgOwrXOX/vS2gFu2uzFcyNbkHHnFxVPGCWSjs5oNgVujNWv+K9KZxwX1BovwK+tBeTVZ 30rkH5e6BKu1KAi3sxVixPVuJhDW2GVC3KHnJh0xZR5yfJ7j+KaM46WChcay5ifwzEpUTi5RUtvJ DufLTm77qxFnTJUWy4wTCDlVb0kyU8lihiU1t9ktixlZlCPM+JHE6FDieLC6LEspxo4zTzJ2vAma ydfLfs3Egs+R7c1m62eT2DpiAweN2FNg3gvAhYhcOVCaPQhHNYfJgnAnPZ6A9Y1uB/+6pbfAT93q CyMEIIk9MDUkQ+VktEfJ5qJGJTQK+VvmlYV8fscgF1v/Enxdd3LbkX+9nfr1V8AN4s9FJC1tymHo WiIBmuHAf/Smj0ZtFsN/6fANO2i42unSFgzaA0dQ8NFV2XS6nPt3QreXzqAB9JSMBg1BgKIz78lq 7x8t5LujOmh3GAhrI9WQ7fwLiR+jOp+dfzCDIqs/ZjWe9iUBnMao4Xq1R+fMeoMWOLQ6/f2xslEM 3P30gTmVuniqw6BvtRrvjjSkdNh/b/xH7pnaIOid6cwejFhvhmujETs9CqARo4O+edKRbfB9A9EG DgKgymE1NKcs0PD+aiWkJtTdJjTMUFUPl1Kt4uz4W/7bl/EAWD3gvY1uP5ytl6f6h+v2H0J/UgDO ZruezASBI9SRAT9mPJNkfCRdlHrQgTc5RrZK7rgcYdjtF7zlQT6T4N0Z0BR+j/uCZLPMfGkzgvRb rMzPazMyD57dP/Er6qIHjM1sCTxkoDwme3Mj94JC0zHN7NCtxNjpGGh2MJtHNraz68lkN9adK2tp leNUXfTReDebrvoqeQ9VZ37AZZGN3X4pQ2shZ+OD3WC2X/b1dBEcyw7aKh0xLXsP1DNs04ZZyJ3B UCFKGKAuVo4KYS0Dut5Cl7JvNAcwcgI0rNAWjrITqsNQVKKSpThCDOa56G9MuCjcQD2nAtnm8Qom UEzKFGvNkVBJttbMl8D27eHFAvx0/ERIVRLgWCDpMBRQOJPq04eR7QyEgEbjtpLOaEN3BabWBv3t TlcXCN4PkDFjzSEbLWoPE4O3cmfZaLhMg1Ca45f97XynmLmJ0RK9ZzxYOnMTw2UzV42LZAs97Mb0 eogydXrSzTqXm+1kvdLVAsidW0LlsjNgEeCpjfcKLwx5dWq+z/ZIW6EgVW3o1JRig14bq9f2x4ko 9YFs6tDIg5IrAlXvk/W0uMzBTs8EIH+GTUUOl//SSydJRq73P2PZoY+Q58ny46WZnpMz2Ib5RdWd geDrNNPLQ61Ar/9rxVZnqeU/NL/7sF6thz/b9XIsAqjOViMp9xyT2/w5hR5u2K2TFzmbS/jqiSX/ zSfkPDBg2tnt/r/W23nOSELN5q7VvkhAlHXWCS6vhosDnG19vZgNz5tsW1BVQVM7I6GRZGsMbBs/ b3ab4MnGas+twcDV5ifAn9NkQZA86O9r/X+NBcNDEGr+gnRjRXYqQ/8xO1j/YwYp4mVNptBHq5CD I7yn7VJTYiP05U++3OPE5ykbBa+7Qv5WeQQ2bDaZCXqHOoFqEjYxIQw6JyFB3YVDFtWh9+khNQ9Y PAZic8DGHEtIyABNy5GISjKwSk1m5vD3NN6pia6L3nw1ZFM2b9UsygnHX+r2X0/9q2Tuywug9KCP CsBfObBXahsJKng0DADn+xv2gHgmKGq1FJsoCzCnNVM9UlYb397Olg/Q0zOxYa19fzXqb09Uwdzd R/961M8WGZ/danAwuw7J4TevLUOGOqMNWE5eSaKzQSiLAknVllQGmyMBPd6BreyfwA+8NstuDSRJ RQWfayUF5WuGHEDZlSXhnUbYqOSyF+kJg6EhVF2S3qwAq0l5WW//Fd6XsckQuaw2k57DGrBk0+BI RdD5QIm9jAfPs/F/mZBECUPJ1KXxfNq6GX+BOlAG+/tx++ewHKz6s4Vw4NP+AYrqtr8FkvkzvuVy f7dA/0Ndtbv9r5/x6nbX/weyWn91K9WcUL/f9nfwz+x1iQCRUKjkv+3sEEjwUw7sX+vD7Qao9Ftg l8asSkSoWXBTeKHlTIbIewuQCV9dgTXf7tcQxHB8O0Onzf3bRf9fsICqv9kA4rE2b3cY/sDplVc0 SruJYFhsK0BWENrerici+tnu9rCawwv0/KYVwXA72xgLGRoNSILUTlt6LKS3bUKZgxmGY1VtW1I9 ZeJbSC5zYgpGX8lCITvWsQYcKvUedK136zCAfsd6tW/CLdSnTxCRn8tLmKA9oMtmI4wEUS/4I+uN 5QXbzsuEyM7sCJhUW6NN3imLFirrwe0T+5H0ZD8cjkqiZvkwCfECuRkfJGdb+XI5EqLHkOXQp8H0 k/3dk3hJOuL9V2+FtD/5cpltcfkTm64sFcbidTrys75/Z6M6pQJljWU6xdRDMB2rfTgeMtvDMMwU iIfIPR4MWjFsR//SUy9my8S//O5MwrvZZXZVIgDQZOI1y5YfVdnnpqVGLZMIjlv5WTI1pP1+x/QI V23UBQjDNHMfC78V9/TvZy745vNml+vaLltu7X88Kcp6YOig7SX3u3C8ADT0BKsMVKHZwtFJ+Lnx /pFt5/3P2lil42KfmcSc+czEdv6lh/beHxhncTQBaBC9mG9gAenJ50s4t8gsXmOT3M8+/xN+w2UU +bbTQ7z2l0mkHS8sIDDpXf5r+rUGv9n/6PKobMn5Ir+2bMtnXbGTeO2PDgBN9NfpGRaGoYYz/xPs xRPZe9LuyT16vz2ZvKPD5McHd+q5Yv2JD4f9Ofxt5ilMaj8sahwL9MPbme07NvuqjHKL+7TDt/V8 HLK1lv0PLsCViVd+SICGij9/ZrKroWPpST7EA+HlR3IWDgd2EzK7HZZxzzyGCyCHdGX3DCgXdozD LyQ2is3ygT7YZPwh6fR5x7lFuL5k19Ct3Wfy5YT1peCNhuAVmnT5nbKmwvn1lyfxPHqPEQPrJ4Kb Wt2DJaUotxVuyzv1QjVWkFSp3NxF+TgGfR7VMPzT+kAH+gk7Y/G8bSEaCn7whaCgIQANNrgrB9E/ PCkmwf2WeClU2fF5b+GbhUZ0iTLg4FfMk0oVvASdniY5QC/JRHz0+/iFdlOYMYD3lAvxaMCoXEWY wqc4BdyZbMJR4yD6W8iSo3uI3ECLp4PUG/U7zLbpXw89CVT/Cv2+w5ajBp1GokT3Utn2z3CfrduG D9k2QUIWyIY/u1bwpdFb4fU7fRCoxDKvjFu/5iK0yMK/LfGb1l3Tk1ZhhEgK4PZdng== lDX+wu4ShAzQFHq45zkXfK0wme32pxOMPbyk0S5FQrMtBXbQ7fXk1tEvJTXlS5eSnicVu7kQFEAT 9yQPToZe4DmsEoqBH0VsxgJKUYN1Jt7e32Xblf3hmJqK3ZSQnt/9160F/q0Nddqff5ZVkurQjI4Z p33jyv9QzbfCAEu46fF268XG9WRcmAlLEYEctWK2V8ERzyV83wwU2aqfLv+G+5wWYHc10vpbVrNP X7kHJj+pRDC8Ohgx+dGyizSpyj4Ucwsq+SICp/a15Fuu1LYmFZMAaMA8xk90cX4/BrgaCahsSGwS e1kfz1c5bgh+8+6Lm7tBNOqJBx8VNImXd+tJfrabUUh1+t7rhMtaLonrio9j9iWQ6aYLMtmDJ1l5 q/BYpx9Ap5Hg0/uau7jvjZbZ1neFDsySToYFMHGUqGz7YT3NPLfLfaYQabwCNAkPVvgQKLIpeNeP BGOnYq9g4w/RwnD+Z+cxIEFZ9Fk1bX931ICuTDqyzcXGLR3X6JeAKnQEw80ftz9b7bZWAI1Eo/MD epl22P6Ur/21cZkJcdvpSdbxJTMJTYbpuSw/aCFAAa/GQLRCA8WnPAvAAXOZ5ZF83Q3ManFd8LaH SUDIxgsQ8VebJ5WkSPRptuXNrPKzWWMEF2eBQ9p0tVryMYlCyIU+RauZulfs+PZD5j63qGB+uF/v oqCGI+mZO5h5HgTC9dJDEx98dbKk3WIrEC7bVx4v5msZ+FsKcDqexMaDWBr3OvNp4W8pgEb+JXYo +hv8Zw5qyDz6Jvon1aoRDfhpEn1dwJCHf8uxoLIJHxMO+egm0XvbFOCQBNTQcDz8Cy3gysFRjyIg Fg1EKIeREaafEr4RR0PgdOpoTmgScDUAUJadDFwpu2Y4LUigNvxbHEET0SAYSirBSathRf/kiQZB tuQERV+Kw0/RQtIiNdnBcHYsIVfTeEMgQguRVECTkK5G3MGU7v6a3gzFTgA0is1gvwTpJQJHC0Gk klMkidYl/hOBElAXxUkANPINTakxnu62sJNGvwnrYrGK/+Q4TZU9TPAGHFwT1iXyi5JzudVo0ivJ rhVJEE+RpLhqOPhJja4KkQVoBDImFSsVyBKTw0jLp5MXv4s+VWDl90YUQAnfyLY2JTIvGgyJkVUR mbgwxbqgRlhW5VbDIFoiuGbJLZmELtMgqkMWgLQUgKfUtCFanCCjpzEj2hOOaAkBA5plk4rgrif0 G7sFwlrD1LN/AtT5L8kZwmh2lW1OplXgcFY3CvuRbT9XV0wGx+cATfG+2ANkCTkpicdyaNwnmN6+ 7c7EsbrFU3h+LfG2zWeT+BgST0EZRknHQYaGcQPr1ACr7JEEb3gUBDTVHOUAPqHrXTPcCsffakyW nNsqKEqQL8mDwgeAJrKuYOGCzzsJ0tX0X1CKJtcbZ5urVifb2peXBU8t4JR/umAy0fsNH3M0XWJ4 xmIov7f/sk/5XB15NpzXtZTRBoSp0DuTr1XigYTjw04zG/6oNOnK1v2tBiAbKn2Ws9WXBvShubl1 7ufF3dN4y/mENSoHTPmHXwgt/PqhhX5cgVwOPrSA0MLhzue4Sk8au1ZgVn8HLnXhL8864yRx964f LWmGSgCNNFoSGRUujg3EX7NPDP370svPfqlAfLK8nwLX140DsqS+w+HmaA1n5xPdJs7DbS0+RVCQ oTlo/3cFHpRbSByk6KnPlWYxNMjUN3Dgnhz5H083H5ilkjFuv+SkkoUqc8D9fkaMlqFOk+5DvYS2 AGAlrTDLUGN5n+NRyUy0Yg57imV3UQ7qpQUMPMTwQB4bSKYanY+rebCkkYf57qWidLEbnoCovUBg RDH4oITbsLg+FDEMx2kFHvF3g550PEWgtRmacI0KrCiicBaahCirxL4S9rmWfIWZr0+3lSmsDt/E fXQZ4Vkg4bUF3iPhYa2Sa9QzYDXd5SOXCDh077ONx9YzQ7tG/Aciz6/tWHh+GNSxWnWwESNpZXKC eJvDvcn/fFhinlSx1+P569MPttFfzc0fPMDxr09E4Y3BrMxXbk4kLeIHQsIAi42WCwzalEdI8Dcx LwKDQhXs10bNOVCPUiHe+Bue9HP/j8fQDmfi1e4dCDF/LHLgT9lWcfQL9ia5JTIdSxTtA9qEpPNA jCHjTdAHUKelf3YHtNPRBlCxAM1XH8Bo7wq9DT7IxDsOvySpRoQWd/HJof6bbXf6XYAhtsCYjwwJ plPyCbpameqA+bQFs55o8Q0uDG3zYiyFZlKMSVkSUl+SMYLK2ulBcNwyFGPJTKAYTyFDM676Is7Q oTfCk+p+uo9BmsgGSODWJGKcq/V+EEnh3qSoyoH2N0e+TOzxdy7YrDZ1x6zyXDYRsKBv87ee0YHX eIYnqWMc+Bl/fUOS7rjZFekkp05fkiFo+Ync8ikFzZrMHXkM5p4O5Bsgd3NX8LipicSEidwHGYqy Wf8imdjL3yw+KQ2mmdgrIwXF6m82xI8OYB4aWvGEt0uVEHCJPeeGYk4Qzu+HYA/f4vR481RDPgZl rQWt8G8EXW0/3In4w8+LWhtYvrSt0MNWn/SkTcMEccG7fjhkQ5nse2FYX7gUXhSXzZzez4F2jd6F d4HH52y7loHyGPUdTz/hzGx90UO23gx8xmZfkQnY9Rc33BuJ18Pap2QA8E3NDdyWjw7Ti/8ElFiJ 1N8S7PTUkvlLD8fiB3C/DtnIYDP146VnL/c3sM3QT2vb/nyMcx11KT7DB7UyIcIQTC6c9KMvt1hi E8A08zcqFXvqZuKbKH68OG4c2hswNBxprN2ao9CQ2Gg0+Dse8uajseibg8mPqXm2Tffx3CJijWCE 92+WiT01FmjTpMrmiJfQ6UZy+PoOhId+yDbbmb9jBrHu8rPkwy4TY+77VJp6LeYf889pwW2keHsT TsyG73R52Kzngi/E/mj3v6wWYEywBuOspGvR0gez5xxkbiP9gN2qVLxqy07oqfUzGI5t/HngJM3c IijWHYTQJuM15L33hMt234NMnigMAm8buVvOzi3StttaTM9qb4EVej4KX7/7IUpbHpO0uC8Mcm4n QBN78JDv2XbbbpGxTLoswK1xSS2ON2qsSub/+aHBJSUrk89+At8xU4bZQYb2tkNCmpGdb3SeLbSz 4WhzGg1+55ZgmTlMcwi0C30YS7l8K29bcNtAnNZ+Ts8zidQGHhPlFivMrgJjnJs79pVcsHvXKSU/ gg5Ta+X8PxkUp/8DoZmXH0F4UlhLBZDKrKF9rMAEKVhwiLSCCOItKsKI4RHLI+Pq1vfZahcfSbAm q48jerSMemUnHmBuTqD0n+ZTURuzKnn9/ROSiKxw9sGqX8/j+peeRCsLeuCe3Udr39sEk12s7lAO VcE0kAXggWDsMR/4oKvVRID14YhGy8cU8ImTiWWbd/yuvjiBIWgHqCSTTeWo+02ILvcX90eqaFF3 Aep8NqFi9dPV8h1MdCkkKeE91LtMBtv3wMavBozF7cVBnNuBX4oSQILIbyCP6YgELul2utgANNwO f/HHX5l7xREeR4c44ywvs9Gfj0crQ9cfWsz9Jgj0zMt4miFzb0FRKDnvCPwm+l3oIDAbblnzWfBf KZPw+V3qaOAoexEmmT/AqAJ5LGzWeTbozHUKzt3gE+oUXEkvbOd9Q5sAJNjX1UbTquUI16StCgN3 VEYwsK5m1z9PbmlopSeyiPuFoFBXAIS8/Ts6QYD7RdD9VvGjeF/8jACmmR8kg/c15hOwQMaG/BN0 1Il8aCrzQPuffhIS5k1R3jXjdnkp4B0F70GkkVmgM8v4ODp85s7xqEpHulZpriJNMHHvnRjnH3Oa 1JRvRhPGWS1GpTuNWLbxYYUfLLKtwWbCBpQEdTfNLe8ivxIHKlPa/AniKdobhOaFTPTD8cZTPds6 dIhjAxPa0uXlbAfsWG4JprigmO+H+6i2V/AUS8BEV/5hVLOq7znvaESi68CwMFiXfAbj2vaXz0L/ u3yXW3rsEpstcJrEJ0k/voLtnknqABTQJAJ4tFZoYCY9sJEl9x9wx8uPgpFGyvR363hl7IfNOBc8 5EAoBAJySeiOhiydEaBO/YVF7ve3nqHLo8aerjidDDxPLbMnT9lFf4k8psLeXrbwqCvweFXFr62p Obech7u1jiD3ebMNdw/YzOESlyrnymGPld+LCYVY8KsBbsuwHXv8GhyY7y9iCTmNFM7m36QMlRzn JNYASjxLiXts/g5sxauTntg3Vmpf3SeZ3sIfkKOZfXmnYEd27nDsy9OCJ0oe5d6QrhUJnIRgPxt0 ONZR/KUayEaKuz2sQwCOXrn/mtm5Xu/oauXzjx4nvu7ETWMjgu8gMNuTDdAkHwEqNniym/06/G4U RF+lEtPbf/qYjGPclp/oUUheOGXDxw11YK0zvp8IQOgtFt8i7Y/CoJ19oach+0yhyQQlxusvwXCz KovblgLaDlj9AI8y8z/viT8mW89sYg+7w1qeTaSoPzzapIf5/px2zwLDcIIsjAtvk3JBSGmiIS0g +y0G2qp+NuLz38GsSRFpMJZo9bdw+7sUYOhDFh1vNoAb4vDRzCr7ACxq25WbxxM+zm1RgJwCZdc6 tEdiMQirGTmgjbtcyMXAOpvCKEZPJaqTG9C2cpTmyNfJNte1byr155pLA2tI5pwjUSt4P3MW8F1i KaZ0Eb2ANf6YQaKl/twVevA6bgKxS5WK3d7mGylMQYw0qC9sEJdZTAJ17mOs1LZRSgOHKA0UdvUv h+YkpFSJhnMPuSpBdeqjABDZjpe5x50gum40vXTFMsGka2AHb3Dq+W+SRRaCua+FYwrgwmDIaYz9 bbqiJ+tPD0o0qSa+Oc2fi8Cscrt48G++stU3V0RkAVhS4CgMD3dfkacS2Y6S3kqc6XmfY8rVCIDa hbXClMsBfeenP4wDnqFHZJMWAGyoYnb9twvAkpEn+nPWtcqOvkVVEKv0nx9EEsiC7QbwjR8YR/Ge KS2FuAlEUC82P13xWENS1Iu9rTAceEeoLOGFSHN/Xt7Z4e73oCOXkOXIP8OZ+JfvkG3nwz0QmY5A IB7w9bPr7JgRZ8dCIZ3ZeCb+2cmFV+U2Tn9OPwmYF2gtMgEeGlAd9REQxFkCrFnmpRYYe7G2EUud /BZ79JmiKrMp1fZ134iCxZcL/KxGfVt0+rIFky3BW8FyeH5meXdAufG4h380ZvOtkMkPWfJuHIQM yzsQDHQGRZhuvcfJ/zd1IzSzycvtaHTpJF8fyF+G0+r/M344LPazzWKcVdyYdM59M7PVfLHb+4fr g1CsyXfWlVfzW/iuh+LypDJ/SZiio27TXwkXawi397Sei/XpRFHmCP5It2mVoa/9o1sEwV/h5TpP q3pf2usr+XC5kVyEFRRRoGdQJCXyhPhRYTVcSy4hJMVP6tvxcLY77puDX1oOxiO2PeX4Q1j8Ca+i U7vuCHwM76asjrfK7nnui5JJSpeGqjnR1Xab/tE9HdxX2dLTvbiWuMq+Sx6gVjy/Ag== 95l9lwUSmf/w5n+h0lbpn9QrPT2p0HfYk34eBLCA58EDzOyehL8RwUQjRgofNITf0AdxMt3e50CY WJyXrM1kH4h4NyV8SniSTerH4iJLSYsv4IB+KLAb84TF9fgWtXh/Zj8Wp6/vsnh7o7KfrEXBh8nN fXBH2hoIPxC27xRW+q6k4ewiqD6JHm9zh4LnofYCQkJLi/+UnvsDu1Ap+t0uwsPwwktu3MwEdtNE 7LP+EKXf6PQPRTo3zvxn+bAB4ytL8M16HqEB4ux6YueLFoe5bBFYfrTNT4ofluzTV7sDvM/gL7/0 2m67JXZLuBrfqjGweAkma/G8OT1wka+W+zFetXiG/rzFV4m+wgVXLlkcuzfc+kKLQeGPfmNCpWwp FLun056f99z3I9EKVzNpL/jn0KeyuA23m8lukF1mbr17lCwYLgmg2W6D9AwLvM7DylFwG7cf/fcg WEjk4EkVLfbgjtg98BOLFIlD93sA/llcYCN7l5aSKr573X666AcsEGw52YhHWH1vnAdf9rwF74iY G3wTX0k2A2H97FC0JtZQg5xv1bCi1cR339vPv30HIT7Gmh9Qzb6PUMW6i7zgWlhLweh9do6wwjMQ 5XITd/adw7beqGHdHr79NufA1vxQw+pJEDXVtQI0ADFltT6/PYbUiRzsvmFMjnpSXesd8xuxrch4 XQ0rxkyGJYQVcZpyuZTVTgS7BS2sI6xY3HbVKcz8dYh8ewBJFFyLWCEadmsdyxi33LrDodhacvsc +EFYcXd2UJAz1Pv2k36uQ6yu430Nfgb3/o6P3RspYg7rplTRxEo9YnGrFtbh9iuCvyqwQjQs4seC 2/pHHR7UsO6smxyjhbWUJlb4mzrWoKvriS86qFxJZbmAoZIud+bF3VfDijHRQkoDK2W1tZ63cQVW hIbb2k+M+Sw1VYl8x+zi9/PAc0sVa9F7eNTE6hhPM0+sTlNZbsIS2O42dRvE6j7a2gbjToczFkjh 8EaJtRbOdTmsXZ8TYZWoTspKtWrzZxZr4WPOyIj8lsFq74WQKta70t8uPLc2KFWsD+4tjHgUiEWs mXkvn9XA+u7CWrHxTh1r1fdRHY29exErrCAQEbd66bgm1sePUiWnhTWPPTteI+pYa1aoBVrTwSii utznGr7WxNopBooLLaxV7HlDZkSsN6i5REScdj1/vXxnVbG+pAduTay9Xnb/ooH1IwgZ+vOp7VJf 7uPT9PeVTrhVsX7u/Q1NrMu6x/4qYkVmTYqYwXqNv4Q61qeMa/ue3eVVsRZ+fZQG1kgJuhwvj1iN Rdy/2xflwpPeHl7egxCr50h4nqxx19dh2QNYk1sl1m9308ZhnUfh2aEMcejHjj1wlodwpJwlOVb/ djetWCFW37GiqPktH1aKAVgzOwVWaKR3H+soizjtLHgVRLZkmScHi/VzH6vI9WLHEy8lKxBr4Fgp dnBfuGb/BVgZyNBKG7CdpV0c1ljDL19rqZO7tycQVjLdqdVka7W+70KDd2R5MAVWgAbYgKj97nXf KAPExJGu3mYHq47nnkyof5qLOLqd2kdF9dND35LAyh+ePWvW1AY4Unh/V7eqfQr2gfFa7nM2Gn6q ouIGKyrM2HD4qUdNPEs/G2rloEhxgOzT1Tb89FkKaXy630fw1FtY7VNItLuy3ZJ5eik01L9e3ser 5Yp1p/5pFfuseTyhg8anVO8xkzo4OKKpDKhO6rHws0/108jjG+5ypt8/4afeY12J2YTd9KnqNMre 6b8XUuIA2acJ53M+8ZLR+DTnfrFtZzm1TxHRaiVvL0+1P9S//pBlfpMu0qX+6WPz53fXK3g0Pn39 XZK7AMERTWXA8m/tm48j6p92P+u8X63y6af7XWByVaL1/p555ajy9f4rkbzzhhn1T8evj8z+7mms SbQJ9vnj+C3fqX79/qUxenZaHtNqn263yV6DzDScTvip//hTIld+auSWHNGOVNI221vuLJ8OWvw0 tXElNpIYDWqcVLRk+0WqiI3g8j53E6inWlgRgLN+mizKdlfjuMVLN18s3uevFoyp2xbnu+sAf6vD KBTEo9VeSBLfpZLrOZhOK4MQiqgDD5GVA0SLrwcURiUsTqArJwlhCtbALDlwAd/trrCL1ANyRbi9 IxzJuo/1emEcJNG9KSvpQOEpsikwDprL/DQRMVTwH9pY75gvnyZWFAepYeXDKBgK9USlL8Pa/dLB WrSEtLHCOEjqp5Gy5UZKMDb44LEWF1KsCcunFGuwZZNSuJFpSrCO7HYrwsqHUSg8EJZLKogMY4ON OtZgt6uN9Y6ZYnLxFBBzRAaxgQZWygpjg4EW1r4aVoCGJzIWU1suF5cDR0MTK3Q0OloU9iKsop+m XG7Zrtha3AucCIQf/cZtxuNhZGIc8gWerGMzIO+ekhYT47aH3vxeojc4hpZlkaRCDL7udUpSOOC3 PHTuyog2PHEF2S8+NQGZH7zcjzRWFmN6zoFqBHdBb1MqWHX7Ehs53vPcJPrNHJhqbJ3aOEdteZ4Q 4c8Ffsb0PfxhFTC4BQXYkHmdYEbvNO7O/TJwFClLVgEdmEoV7iU/gJoUvekGl2MTB9ftf/yQVoZX NuKksUro/h79gBwhiyXk2UGwBtqTGpAlCQ0lpC926uCfdpgPOKD6O8Np7cRpqc0pMLPGvOgHS1I2 OSNLIKL0A0v42sGY8OhHUxp7q6wwjVdrihXyRJMuEv3ov9KKbVTsIZl+bj8Y7aH3gWUahAaFPYos KbvCuFufXmb3kE10tVan0UubI4rPqjwP0RizvYJe2MTx92qCv0TmEsXziL/WeN/mKJmlvi7pAxKG voz6gF6DnSbpARojeim0UNe7Umqhwkd+I8UgrF/YDg6N8Y58FfDC564owCDVaVis2jlnTV08Cx9P e90ZIVXvhT/epbnWI/IVYKBcVShxI/F0aS6OtMWrNbOLQxpahT0KHx9WfXLDH3ZWlrRmgo37vQ6f VT+2T+K6XHa0LnWe73o3cquhvSSOoZVbxi+J9svYXZBHGbtj47rfLnfkpVuVKn78ATSX02YSc75p Ge4G4hzoQMH/FRjaowMt73/Xh6YJCrGAQgAHxFopgP272p/xqrWlT8LQfUYYpbGh3oKX/cHtF3vE ccwbA/JOsaWiAyXfVfiDU4kog63CIP27B1yTQQI/a09SnJhEdcb+NOZG/BG5t2hFfZnenFPFO/Mo lKI80ZWaRzaKbQFf72x1jZ4ZLcSZtSKkDaNhqXS8yWOOHBXlKpaQhrinbvI8cjjJqRIPvY43GUx/ YNGnF1xhwHBO0Ts96ynOSN/X4+f0Y9WaU4bXAiaNSVHN15Nq3N7BoR8RyLbRyNczv4dbpOK5Q68r QBs5+gVNUIgFToBmFJZogBKtpxyaCu+fuUzk7V2NaHK1eynR5NrtdKJxmTCO3Yjca9cnj25LUGQK J3nO4mQl5zdwRvuUgRKR+LrqOm1aUnO9FTpN9L7VHYiSMmC/RDynJeLzkKueEE6zJ7vHu7lPs0PY XOfZBDIbGSIHSpNAxfrSbL5BYzWpHVIP+nJjYqs0okDFTAAa/ckY6QMzMznyOs8ii74CkGgBIX4c kC5Vm5V77QVPCx7Zs00+N66oGvqOoUPzpjQp7qT3p2FQSX9wnk0ZBsLFEzSJhqCAQO1ObU58UGh2 WtycTlUFPNGOZe+3fCVVAFZo1/NsTlthOtZ40FwhIpppwtN7IfY1l/ng3XwFp0Hm/dz94FdaYarY 3Qhep7kEqVbo/lvGJvhdV59L2eIkU/QyIexq9FIc4XH0Cl1Ar41M0pN7UdIF65nGKwcTwblxLqqi lHTNZIpe0gH40Db96ag59xrJFNIWgxkFo9DZRCK3gpx7vtTq3IwKgOE0QWu4N3q5kMqRpT4jEbKs IDS7+cuFS6oc9JN6iGh6eT1uq6J/QRO00SQMZ28gbXrbU9IlWrmdZUUtt6PG0BKlIEtJyN1sWN2N yd3sqtLNFugPXQ5jT1u6D7GG9XTyybMc7Iy0j7V0vORj8m2qol0UTnHPNY2xxjXkpqq0imewe6xh YV0OiUE8LY3Nsnu6c0/qLwmiMUyLVkUzeKYqYDltU1VawPNoo5leFLWAwvhpuLmQQOHT7BJ0c6V+ mtz4uZweeVEIWNdrS1MA9aVPLf0AVPIlpxvsusb9nk95vGrKAmpBC5iUG+MsLYSGXUFD5wFVM4cL rRfaOXUbeHRSaAxIHmyam47yhB0BukwUeSgfknS/PJI+EZB5Q8ih0bKFCJr8oPEks8ofcghl1/DE WBl2wr9d53iCP5OWR2Znmx80WZVTI6OTQk1qtk1Sk3VMhQJ/eRwv125uFe3WOUm7sRkorfoKICNX 0G67+dHR9wXabTfXPjUSrKfJMygIjbiCA5UHEUTr7lIt0FFot7O1QOck7aad5UCALtdunSud4iJA Pc3jtww23ncg0TheUs+EyTctjmnG2bITyCPHhScaxxTcZBwgTE65FTVjJmopTFd0vT6rxdsnnvCD LVVoXEXy/qRzDgjNpMaVaAFNpdvdnFRQoSbVUG4mjssCS37naI9JZWMIyHfmdATryQO6uKoCQVG6 iFoH+YaAtCVIzV+Hx6ua8gignZgn1DKObK7T5VWxjy9nev/HrIp02uX2EYRg2haNd9VN20cAzSDE 1DSOx5lbCO0KYtS/G9uuYNZeTsqA6Zi1lzO9/2Mo3c0VzNqLwvvXqbYzBmRkH/WNo1zZ9O8eiDPt o5pxhFXoXmQcZWiOampOLXUS1v+qMI6y41VFaZZY2qGpj8DEvjRDVgk1efHUz23AWMLA19QXcrmG BtBMSaYJJxiAChmmH3Q1r5xoKxMSIZzi6oZMryYlXvsYlg0Ke1u9nLdRxd7xnI6kVcrQJuRMEcb5 VcxUV81MGeShNS3VYKdjpo5L44zyAl1lCf95Qsanhojc61w/eDJb2gtB/dl09uak4x8IbW+Gl00S zUweWutUQcHQg51Y7GsMTcPvyPsDmpW+bFmChDMC+tNi56STTVYXMoWR5jJGohfBFqKrIJT27Tmb trDF+/Pbgj16NYsv4uspevkAmuu08+n38t3ApqVrtPMdYZX18nGnuJe38+n38t2g+2yu0M7HspZW Lx9vby5u59Pv5btBrYtXaOdTwyr28t2otS6e086n38t3w98Ac2k7n8ZauV4+0eW4sJ1Pv5ePq7m9 vJ3vqIxD1svH2ZvL2/kU+W1OqvhePpmfZtzOJy+A1u502yg8cROV99rNSJk/s3PSTxDX7VujWvHk wGmiaUvqDl5YeFu3a5eenpogBqSqn1K/rnNSWHeolrKdTiqVNp/jUja3yaY0j4l8i+KkUAea95IV Spxb4yY+8yv0G8qNacIrToN053Rj0IhpkDbTmZNM7bBozujfM6d2ut6tslD5vDYuc/UlUi2gVWLy Vbj4gE8sIu/6lA1NZyxOy69XlPMYtt2dWV8itzcXZJql+3V87KMeRhm23Z1aX6KmOg== AW10johPilIgKNhHIU1CnghNXuAFAtuiR+5WMGLofqPViGlSf/XvXvWLJqzS1kX94JhR63vVPcpW Vs5KNHSfMdFRaTLRxigOxo8SxLKMikaiTZ5r9BxnVEZFRQ/TJYde84j2xQOKZjQhQazTj/a+1/cx Tuop1L9dwXQp36io5pAp+m8AB4s5Lu0eudQ+XdGYk7qbrZ28B9PSrrwXts/UHkZthpX3J/QUrrTb RbjkvdksVtG4J0cVlJRocmgGFzWcMrHntVFjzCnQ5FbmUqJ9GEQ1pxFN+yTl5GUOdpcRTZ4vDm+P iqj2qZ1hQ5k5N3daMmynRA1lp7fuqeoNLQDSlKoWjDbO/jCQ833api/ksqBQPx48ygjrxINaN1kQ ue6d/UwYQjOYMqo5DnHF7dYgC9e1d+Yusc7ttKQ8WNEOirSb7UxoAWOKaJ9UmiAH8mxMNOzJ7J2W P1PSvJ9FWqVqNethEp+7gV/uYZb1O3Vv+KYlrXYjCeU+d6tTEhzSWEruQGn16mkpIO22LMUmXOCn gTmZaa3jtYARqfZOs3KrXeKEVuMsOK5DKuUpkMAHYuxpmg+MevTU5nSj1icNG+tOyt7ozIk80azp NfsZZm9u5L24OtMyaM/TmdPRLSNpvLJTZG9IW3RjEPaZyN4gTsOrFyc4KvrZG07ZmIwqlpUzszcq eQGwOMfli5Nnb5QlI+b74U7K3txotS5G/86oRz7ar+Mm2bN6Bc1mb2643ihN2hgV+JvrDgJoIIGo 0xuENBzpzOGoCZ7t9DIq0zHjSG+qV+mQTHdw/RIEgzhEmrarXpwBEhenqNJVM9JmFpd0nVQ9p2pv NlVTxRCGbWxiMcSNbuuiUYuf6YrJG+17OaomagINJRj29wGjJ6/oOq/shO3z075fS8bQ5soBAWqr Q3EgC/7m1K/3YgvHTBxdXNiZx0driuY8dX1wfmeeiVPca3Tm6XDaNTvzrlAMa6Yzz1Qx7OWdeawP fdScd+3OPGlQaLJL/ZzOPPVSK7544WqdeTdad6letzMP9XhoH0BcqzPvaG+kZYPX68zTjNY0zoVg 0uWMU74btb41Rp+NTJdeivcnG3mdZkovjwovztQCnYu7/9mCy+f15T4GC0WjDvmkw2IISBFim5yO wk9DgC69AoCFIhNGvcp7Y+3W0b3gWFl5b6rEWuVAEPbS6XcC8cIopoa05BFsxuVtWfAU92q3HMNu qmdVCdLVaZryWPjontbgquqqA5pffBsHNOvXueoYATJ3F45uiIsAnSePCijIrF0uj3A6esbxRu0q MM3CbghNfieO0XVuHKgb9asn4Qo9ipQX/Juhm60Rdt8om2RfrtEk+/F3zSZZAO2KTbIff9dpksXv QhdrLdgl5tWEcnNCkywAdK4SvVH2rZm5AcV4Osr4SitaMwRk8qJrae2gZhsZEBSdq2BPqF/iy3mg rvAeyWPMabAZ5tJgr69cJaSWPF6rKY8za2ZqheTLPK0p70bntusrNuVx8Y0Z8bykKe+c2POMpjy1 or5/Q1OeTvrhmk15+vk0kxEcsKgGSuFG7X5one4rec2F6dvv1f207tWuhIONb85C1UQS0kziGUKT X7h+iWcz2MmvUDZ9MsEnU+QbGjB1BqRTDAE7DqVJPTnRTHZdK+Zkgi2UKVUVc8GlixrsU3qqXC17 Rj48eZ+E6TfmuZUJ7HO1wvYr2QNokm16judzgcoLbR1XWnTa02on198eCvxWrIOhjjzz+sGMCEfq jmaNE8oSS/LQ3G+yJ/Qe05KOMPZAUtZ2Z33u1qXZLlkrWiqWf+9qtd296jX7bQ/fMVxKAkXbHeZ+ 0MBKWW3hputT6wk9o2a/DamNtWh962hidZQH/qlaR9gN+06hS6ftrh4iJFjlDXA7R9guPomrfEIP PgG60Gz2C7p0mv3umL5fEyvGVBN1Naw33DuF98FH+lur7a6n13Zno7SxFhvWN6nXqextvH+aPfS1 sDZ1KPxYfVbDesM1+2GFQoeRb62NvVOB/4174+/gTgZMjSPzmLyCWGso9u2OZU2A9MTW+4JoTMGq u0GFiyoNoxwqNjavV+pvWN975NwC0oZc8lMm2uidA9PNRUnl9R+XvIGmd2O6WkWX9rTyBpWrmudn ihD3Gs/r8XOSvq13I3t79dRclOrzemel7Y5ubTurORNxWt2+xgzuS5fXDuq87aZera2btjv5ZT3N FWqe38C38Iwrg82t0Ph1BbNdsWszb6yYnZbOo3onys3a6HkAtdJaw1f52ATxVRv7LsvZmG7sU4sS lGm7KzT2qXX1HfvQFzf2qWURNeXm/MY+iaISuvpuLm3ENHcmzp2tXbOxT40wN8qu78sb+y64zOSU xj6dSshrNvapnfMcneJe3tjHD5Z29akerFzW2KeWkrlRudvuwsY+tSy9kEy5XmOf4R1d12nsU+vq Y7McV23sUzNOvOq8YmOfdp3NVRv71PZQqOi6XmOf2h6yGvqqjX1qoG7MvMB8WmOfYcfKdRr7ziDa OY192kS7amPfZUQz3dhnrtPr4sY+tXYvPpK+YmOfGgBJ+ei1GvvUDls0Ku8vaexT6+pTD3EvauxT a2NTO1i5sLFPratP3d5c1NinRo7jrPrFjX1qXX2qB/mXNfapRV+sTtPyV+G0Lo4R0056i9DIHyn+ 3E0N/A4TjWrQqbQow6izu6/M6g3e5bjiK37aLsdVX/Ez4XKYI5XhG8AyVoV0kpb2yh/LM/I2zPEB vUetETf67dhH09KYk5FSUJ5G6U3LrDVSmZO0ZKRswiswOydFbYaxstEh1disGMsbyuQhk8pB9rIi txAqhd3qObOj2FP1/b/TEgEqj/8d19mY9ddPevzPSNlU9M+azT7+J6nouqSnz6jmwkw9NNh4kwWP uvXQxu//Xfz4n/kk5EWP/ymTkOrv/x0R6NTH/25kXXgmy471U0hkuuOxKlZ9c/odXZvq9Xo80rGG qYZc4/InsLiYU6ecx/TiTNR3sEGhQU+fwQsNxlxa5fsIrtDTp1dpLBbAGPc7aleGmG6Pg7S5pCFX 3vF4lCxUZ2iD98a48xOgMI9bmupLNct3o3OrldaBEeyb85+2m+qlVq3rlVq1rlpq1TJbamVQSV1f mqqyMtGI6br4JAVBUbv1XMECJgGdbANVCscQoAtEUYQiavIb3QZm48IxBE2329fw8Xplty+8gVnZ 7TuyJ/UN9wnXG0Joef3eGYMKA1kROYBGmKpGlxgzTWr+jt0iNfX3RhJs6ngW0ItzKUu2wd88yoD9 3Krtjlm/3qAx5nl9unuhWWQBoV2rhfR5rdZCcboW2M1NPbdkohEz7r7Ux8gr7mA+++gbATLdYHqj 01x+fAPzudM5ekPyxMeIFIKi2UJx1mEx9MncRy0Ujj/jxhiT8njuu3+K9MPx039nyqPi3T/TOu2y d/8MXfXrvPvH1tnoPP1nmm91b2M2H+Je9O6fzKypPf133rqUF5gf52zMdqec9O6fkLPR6904690/ 09e3w9qXq/SXobLrK3X79u962v25XGrIfLdv/26gzC2YCFSVyRRA8yt0+378KVrvJTVQJwM6Ifml WdEFAV2h2xdCwe+6ZqI1Y0Dad9txJTucD22il+rFbPe9mmhzRFPIo09FHl8vSYPJlQ1YvfZNODLX wEQjVW8rBmNqZk2vl0qFmq8monvuxMNEgP96SanXkXi+mspvm2mk6m3FEP/S2BN2npqI88XYU6uX ypF81lbTZj1GIf0Ap2Wyxc6cx5j3+0SPUUST9xvYFpMeY1fNY5TUcpzad5t7/dG8kEXZdCtW3ut0 phnETSZOfKREM9XIbuJWLQBKmc8837M5uupZ72TixvjVxQsfw+RvIr9e321X826sG5V2bL2+W1GM sQDT86kh5NvdxvntNo3fo25BgIZpp8Nd+o3ptum3wjaTLVHtSj7nH+bzuUAV1ou2Nrwhul/Iicbl ohRP03U2i3dFZx7aG+7htHftB/EijVhdylCyzjxPfPik1Q8Y+nHfJyxrmYaW941pNyLu7phRQBMr xrRzDQVWVgvwT9NJu9WUWL/1Hv/zRSVY5T1y213Ms5NmOZQ9csHXn1pc42m6O6dmj9z28I0r+wFZ 68kTORFfNjWwUlbx1cEjrMHuu14X4pKQZ26VjYjrdlsTq702/hlpYR0rsN6wVxoJLYGNV22shcf3 oiaFZe86KrFCX+Boa4GMcgtHv3HsHjM5Lq42jtNpsqHBj5opkEFXnR3HGc4apeKOPgrKJsUcFsoM jF5+OaNm/vSqMz0rbjWyE6W6fW22Pk3PXL/TR7ePGlcjabdF/ZmYk7T5QmdaJ5XYqJyVcYaAvk7h FpqTWtWWWubWRN6p7rCctH3SUivltE4r3NLpQzu6SPP89jj9SlCx5tYUV63lB2emV3iU7qZPqQ01 mpMyWruA8KZqwCR5aL2+RO0rek6VG50ysAxLpeM4SK66/OsjvdX1bgwbysyprq+CiWNQw8ztdW6+ 44hWuFpH1FfhGsdEYHEfV8infRWucAkl2HjF+bdaiaKplsTTMtLqVaqFa9yuC/sRTfetGUY1EJp2 DZipfJqiFGVArJUPdPbvavqrNq1sBsThapG0fhr5lBwyo1aVJz2KOO2iLniJmvZFXYocn4Roeu/q oPsrZBUJReObISROCucOavfZ6ZjLExrakOqcR/bXuYrh6P60Czu9jJw6WQ4XzEmr/8aRHGtexWDC VZfO6bgG6ry+RLSHcvWvfr+A6b7Ec18bVGmMcSSffVfjiGe/0he4CFpAf2I3Ki2/OtAMX0o+iWiG jxyZnxhxVaKRVyVaUBPaURezzG1UEO3UlkSzbuMN93rcmS2JvHga9SPyZwRntiSa7UcU3cGzWhLN 9iMeFcOe1pJoth9Rlu4+vSXRbD+iVs2t1i6d+dCglGhntCQeb4t6P+KNeqeXJkXOfGjwKJI+rSXR bD+iWiTNzehoXQqn6pTHCm9Of6TunMcKb46bZP8djxVqpx+u+lghXzVkRKoLHysUxPPf+1ih5EDy 3/lYoXba7qqPFeqVKJ5GKt3HCm9Oet/z7McKlekHOK1a8EPLr+6Y6lg+fu3wBj3rdoUHD/VfOzRf bWfw4OFpt1qd/eChyuIkcnh2aa/ywcPzaqBOfvBQqwHwyIc+sznyGrdamX/wUKevChDmRvdWqxNK YfRfO5Qx9CUPHupnj7gDycsfPDTdUHbZg4fCYNXXDhX25vwHD/UXp5HlOP3BQ7WZXOXxE/mDh/pL 4sza5Q8e6r92aFQMa/rBQ30JFqynvkds/OChvhiLXRFCC9R5Dx7qWz4xjLrwwUOh8Uu1YF0R35z/ 4KF+PIzE8xoPHuq/dng5p3EPHl7ekW/qwUN9KDfiO4WXPXjIQ9Gt6Lr8wUP9Zt4brSbZUx881DmP 4R4QPOoOPufBQ41CO+61wxvJnSkXPXho9kGnCx881D7ngW6FNIy66MFD/RLv48ztmQ== Dx4q2xrkrx1K9+aclgv5pdaaNBS8Tv2WC+MHD01pgcsfPPTovnZ4c+o7hefdN6I4kz7/wcMjKDIP /9xWkqMHD9VaLsTzYaPSXtMPHuq7+WLm9sIHD/VvHoGrucqDh/o1H5zcXP7gof7ZtXpZwhkPHqrs q+S1wwtcdfmDh/pQbgzfKbz0/h+P8E7hNR481I+4JWbt1AcPTT5RqNEke+aDh+qNHvxrh/I+ggse PNR/7fBcnXb04KG+88OiucKDh/rOD1s4doUHD/VfOzSfHTR48PCUXtwLHjyUQzH7qvzJDx6eU9Gl 8uDh+a36UEpgPu0qDx5y8qjx2qEyeX+uPL7qv3bIF45d/OChfhGVRgbq9AcPtaN7+NqhIdHMN17p vXZoKtdp5sHDc2LPMx48VOuQFC3v5SWK3IOHZq/Wv/DBQ32PkS+y0HcaTTx4qN+kqzTSZz94qEJN yWuHmn7aqQ8emkhCXuPBw9M8m7MfPFTZTclrhzfGLb/mHjzUYwvpg04XPniobytkR3jwyNN/ZC5q QZ1Js2biuIxEkQ5mzz3nAUVGWPcs1KDeX95EqdRpQW9TnvKyyxSAcylNkSE1LbyFgvoT+D6siDRL flScBDvTLM5318HiCzge/GQtauNH1XbbLbHLWtzTbSPgu4/ZyZeHUDZEeXY/5cD60HeUxpGoO/1u e7uzlPcuS5ZpBu66X1TM1nqx0vfzVasG0DjGPxsf1ar99cLzUW2amX8//lTHrWj08aP099zCN9VJ 66cxW3SKgYfDc6/ocvZ6eY/rtxv6fVrWPfHJxvOW2W/vW07HdkvaLHfr8Tpwj9l+4q632vDZE/U8 oKsn/2zLGja6X9HbbTpWt7g/iw8WIve08MSHwQzGYOkUxrRfGKxoXT9ixafHn+12lvZtDz8px87h fRzApVu4zs/UX8GTjDy+w22xoAY8rPAchi9ibnfTihULPI1VlRO3N6jlNbXb029MtsYks8mh+EAm +8KiI/fXVKOXY7zAoZFu/XRsf9vMinq0vDxWPYrlStZ6+Pbb3Pb717otEl/k7uutYsXx3Song1H7 A+UR2lXBVn0UfOGa/RfwhofZ3TFl6KdZtrPPAOwobQJT87SVC1ZeKkbf9wtZRhb6GFyWNicuTrRG IiUg0bbpsCNmXxPBwkvu7zkT2LtpTzQ4COQKRCkD/vZQyUw67cdsifp+9ERDyTQTtTVH+c+KtYTW SuS6ngLL2uh9wFTxxQmPZ5we2nt/YJylMszZ4IWvWCI/6wdwuEGrwnD+F8UCr3Mf0SuNvFig/+eD dt8Giyx88OvAhCbXczLdufOjwx4+8LI6UKiEBUJBF/onIFpmDf4Z87CGwAptS/MP/CXjY//5uRt7 0W+kLZH4Znqu9yo2+cpMM/GaZQtmXnV6Cs+vpWz15eUTGzmdMW6eqZg7u1zXdugDcQEoA5XKeMXP gB2rpfgvMX7JB5+Hrwz/QQ0TPwCmY5PjPijG0EJcUtTFDFyNMP5LSr4i4xM/AGvtbMHfagHWqQsU nzC4Dx6g+5Z78M8OAYG7gTrdRzkA9bwHDvGCH2E2eV8v+3imOLg5pVev+dEogOF1B/7ZxGBBGg5+ jOA/X1m4ZLq98rM757L5XSigwQLdMiI4QJPH4yLRuk9+hIbMRchIfPzlmuR/KOYpt4hYI5I8ndB+ ykJTur6iXu42Awp4AM2FIDuYCJLqJGP5bMce/87/hKubbDu7eoFaO4rCqHf3F+IlwjV8nfG81CYF XvqWbvKgJvJLH3Cwfwn+1kSs7YX9Py72t/7dM2JaSHXUIcn+I/dGlqAd6wKGSpTRb9z+DqYhOMTH deTPO3742BYOdi6CDkl9AHjWyf7Wt+WT3HTmfUKYzoANCjtp/rNpkCkQDxGwmrcQt5pXzCqxj3Ln FgAHHMVbtJiaRRMOvZBFc38yB4v35/fV4n3+Kli8Dy+vFtfjmxNauYrFcwAWAjiRJYvXlW5bXLNF yuJbNT4snqE/KrOBwOiiLCbL+MmuE/EhUjbcmt2c2xRqbbhRQM+Af3ZBBFEPOrHA3gld9d6eX3DJ Acs3/+A1kzDrW3LBBsQlzM+hf4If3TWrj1BlSsbyyamTvN+LmmDQBgVmr3s/m9KceWMe5IGQtnih ohbGAS55rLJsKfyAH3RQyTirbMIuiSKCUgv+lvRI/ta/K2/A3/KIeZxQUOe5xd2Kwb1f4bGg5zBP Kvxcyn/PsyOFAuJc9Qf0JjVgzwiOaIkXO84I2LzpE/j6oxepZLw4DUKiPUINvZFdlQ8dLclVEOhT 3hCRtliyKJaMKGwRrH6wW6KVwCxVZkh7/D2GVeZfGXzoW5a40gru+dsg8uzkKWiUOXaQ98OlL/Do bWZ0MrfiUUCZzH43GLBpcwossxlDZhUQ9yOLTDOMFxrSg0CU8vv24gTte/cEHotfWVNoKri31k/i xa9pGZAAj2CVfRksrpikTSHsbX0o9iy+lmE4SxHO6TSHl8KJqGocIJE9VzyOD2qvftJORhk+UV9Z IoIDko5ohSqEq0F/mcR+sxCxF3y97DJCQ3hDuGeeSeLAWYiTdre7AHDtQ/jw7b2vhvA4Oxh4aN9n r71CqAVUFon+CYSiD0IhazugeeIgZUsyUYRiDExCwJfBxoNyHGwfHkfRHxJPI868w709H0MU3I0H yG7RwKxey5D23m5oFjWMb1Swm0BNFCxYhbQnHltgwY84gIYniEJ8qYpaluvUX7ipVTu/MtjkwVYC q65gQG76BYIuW/AbjUtOpVxlp+DWgknMPmNAM2BAM4TySTL78NXTZ2OOpSZ3IaRsrG3S1CZb3KXA bDBiCLqUpE7SPdzZ2h1exDNOpBfM6J5c4LuIpAVyRBAflm00PvjaMJpKQXF+09s6EFYyu63S6ol6 yTnLb5/4dvvyhCvjZgBxXTggbofBB9MphkwNN8Vkt3XDN5crjgJS9ZmPtH+/PcGLU+yE2xJliG+L jzkTNRRPFezXRg2NNJ3up4neiHyA2AnyfmQpAhgvySuilhwWi9iXb9h4HouCnZ48QdRhwJ6ZHO7N L4OmUBfbXsiRVazy9HFPFBI5qGxI+/a7brjwy1AjFjgAQ9cbuSvAlfggyaw78URmH6sRY7nFoGeV BRonRwH+TgMNMujTeImqKeVWsDcK0X30ZmLE9+PwEYYWQYL2W2qXoIacpoJdXWu0PREBNQX+Vi6a Rc2uxtTC1VBjkx4GnDW8RkNO82uuWqUx5mQLrLSGg2knB8Kd9SNg9xcMprkTnL0ZX2IaTVgITjwT 4EuZgoj92qhvlFe28vYJH2XBN2NJMt1xEkSv9JvHqrTbeLvVCQ45zSTNgX3yxwI/63uKcB1GYayK d1KE6972YEK00aHXdFoEGtUHNaqdBDPf0Fg1vyRMKZbutws4Wr8VwGkE1IeOEvBJv3BTnBZETjag PlUx4VJya/0MZoBf/0TjQyqP48DzL4IF9/Oa1d2y5V62VmvCB7wtZG/Al8IEsOz5FEFnLEUTlD4d 9c3/kmNvs9ghapzMvgDrcRXU4lGEtvUYUlCW0mSWfiXORI3QnE7z+tAvoCaxqvMpo49a0kdw6XbX 18HArDutEr1FDex1Hfi6rqavYorTPkDMYclAJidRTtIcfxXshOs9WkHN9VBrQ3tD9JYYqXamgALh o4N8fhJ44SPllsTPKFdiK3yFsECwuYfp/oZ42Rtbq86eAvjAnyMHdrx9GKlKtBb6m2Xv3Akw6rIL 4yCAoLvoD5aySy5Bn1y7Fa0kKGWe8LHFVzBlXSKc0S4p6mV0NZ/lPmejeRhD2XkIApALSADgzGsR F5MDbAEMzIklu04w6mEFFEYHZpXra6TlUQqH/9vzH/+37jYwe1p5xLwuSqaIaXFu1UHXBzpB4DNQ 6GZD/vzABa+DjFq504VF51GaS0dpQzaXnyTElL078+Luo2w9e4sinCd7eOBMvy9kh15sUhztAxl+ mnMX8hEHHGK9E2+zhGnxOzidrvxGP5dItFfLOlBg727c5rrvrNw8rBBi58DW/MD7d8Gi8l7H0je+ EejwJTlJSRDThkCENykRZJdr3rB3pmx4OmRIj+ymzW+eDsGASAc4nbmklTn32vXpEwEpm9h8xdPB rbhU0SfQgcPK3WGJtsUEEZJ7RAR04kEcLCIdLMHdu90MM6Rj9T3H3zlXVSBC6dN/99vhieD3ISIA NCI/HL01wxIyhmswFAdDFQD7OAbPkTfi7aNGTHlURXfCJACaIxio8ueShaA7m2WixRPN/EI6sYDZ HdEST290776EtUFUde9RAwDQmCUGzHv5jBbSTzyKAMj3BR6RPSmOezd5THUhJqmJ+2xlHAHY3RVL OY9w56r7fUv+yYlWzP25uKHMLy4OvQ8+0t9Sdu/3HJdy2vh37LyM01DVgQyAKqfpwvjKYBdzmuPH eRmnYSuXFqeZhlHzeA25RApApITIaV9hJUFPoibw8ZIBTQDs+Y0hjGLtzlhudQBANMWO8zRFeDSJ L786NYVJQHujvyPFadBQ9vUnsYn5kQN1wUJKtkzABG+yLKCxkJKPOUNGpACoGquAWKKdJSOldJMw mMQ2FcClRroU3Ps7CQmMwdf9ZSZhMPV4xElIjbTqPNQnscENWEsxCYBGOY+hLey7iC2GvqRfQU2e aCZMEweDymsLu77qRFVWIdxJ5Lo4W1KoVsQCCJkZJhLe1m+0EC59QBvU0Cl74cMtiOuP3RvxVnvP CpZ1OdjDT/4M3cWfIoNg5OHjLwxi2nfaIzlUTiU9/AHyowt5rCiqgTrKS9C+JTwpJFy2vo8tycm9 vvPlPEQtBG+68kgKdoRyGv2Zs/hhdYB4HH7D3WQBPLxaivhOFOC2PP+xWRnM6Q+w6wKGqCfUK/jZ r2MuWwTDA9ZdwtOJb2PTlaPDJArBNesiOzYdOzyxb1tsdATeEm+xB8uExZ46FDWLLEAg/pWD2TkK uEibIqAm4YBnizVJIgDgx1UqDHKY5GlkRf6NEANbthgAnkmLRGMbw1PFhp20P748AEBeHxerh3p7 fr+CTuHs/Ju1N2Po8HyDHaRclUgjGiky2Ub+na6WLS0Q2ydLgMmSAzrtabXptHP0RrzVG0HCus59 yDbIyT2TyyL0vhAonxiYWYPoITTga7qwSp3JoyylwAJRoZbkTcxQQEBeSSUiqk3gieBGYsTynDyx cHzCDs11kpMlmMcQt5uo33VhDZYHcQn/DUQEwgsEz+9gTb1KfggxtFqShp1qawPDXvHyqjh8vrtx jOY5gmrAjj+gCb6iK/DQvgth43mTQfkRsBkfPoIukyVY5+IRqsbvsPE+EwVRBbzGC0lr98UP3LZN CZ2ooQoaSa3Q57JXEXUEKoB57bIlZ2IxF0tV6eprdcBByRyQ5Q0hKR06mn7Ix/EBmok1ARTK2plE qaFDMxz4mdxHYHYsGJgVmQJWxT3viGjwwtw3NF9ULULaLY4iGBxjCPqtHMEqg2YS+A== LKMcbHDFgVQ9xXGvswNzVvYglDmYSM/7+NJeMCrgwD3zWJQouAthQNCwGy/izTSZTeTCSArY0h2J Amj6ErIFT5+xSjcDa3MDYsNTjm/BYlsIHotMnLR/f9YB2397iAL59uRJ1RuA+vh7AM7kFd0lCmub gPof/B2gp0DIlummYXlyhDt8lS0Tnd+ELSWsGts8KFYKgX+gIgswSyYGWIDJgKkWMeATjTKw8CKL GBSsOp+GpysegIssAJLicaDE799EqboR7ujia4qRvodsjCO2gLGMU17nUhSKnkLYyNnssqVAIMR3 SJkxVHKLzMiKZ9UpL46RVhyzIFU+UElbIkNMkU7LMFKKF/rU7P2NQYwkO8hXfEk0nDvLp4MWpYAr 32RNXWXJ6UqwKNZq9O+yblg+kELRqrQ+zYkXvkbvaPUwMqSEgiE3zEN7YfY3x7aaImvE8hyn4nwy Fff8pzZtXqcdzRyVefb/Iny9EdilkZ3wBWahGoPiYVgSjyoRA/y6qpKyVMKVzsQF9QSTkKF93TYu fr4NfrkCwte5FSZN+xZvb9QGP4ZvFvvvMmixv/ZJmHXdy/gF+ifovL538LHHOSlvwU1mH9NBwHN3 cVR4cSPp9AKa5K1lQcWwknoBSWuu3OhJk7b0TFTdsoRny4l0FJuHduNiaa1QS+uUFoPKajKFgsdV Jo492xAvISYLLQYjO3oYyBMNpqzY96uDwD3JlIVlAY61MP5hanTaZwUWOPdA2qI/AbyUIYuAGGmY LS/FZQWXr7jcjvFe0TzqlieIgQAGuZ0eEEAy84DbRZspbxzgKeL1CSLbkVujJ6oxtqU474E3Dujc E9Ah/NhPJ9mvn1IowlVco3rZ/t+L1NR+r4vHaOK55vMDqjBU2KdoqXuAvX9Zl0x/J72c/i6kQ2oG BloXVLjnRIYFHXqxtkVhn7pRBI2nEryZlk28tzacYwTdMUWz4UPrjwRb2igDqfrwiNaALR+VTj/8 6yil1E3zfuaB56600j470u4ijGShP/WxY2sYJrWvJHAg1+iEHeY6Cef0PQ0io2ngyGbsm1Cjd5Jc d2Mo6FI4DuBHxQMdhyKsjgzIq+YRRzC8LyCuGdb6JcEsd3Jrj+QcNTJtgWhNwjThatQIMLtRibQT HRIWeGW5C4Re58+Al/cHGNDh0HuhUB8Yq9O4lcpNOSFbpq8CHOmnAjwnTiqXCVz6N/gNHBo4+AGs hbP44MF4OAW9TRIZ6XkzAag/yiLTSLh8X3GCTk/zbB+BKFWSyk3gyKOmAxQ0sEZSMFgc48EmL1aC QYAG0AgVtC45P2LofgPB0fHB6MNlxt7JPmjIMlDXif00Az9UO3i12E8z8EOruVrspxn4QRa4Xuyn GfihDNTVYj/NwI8/wrtO7KcZ+AE0V4z9NAM/aR/B5bGfMvDz2coZxFxcleqJsR86DzBdlsD1sF8v 9tMM/KB4Xi/20wz8ZJ7NxbGfZuDHE+06sZ9m4IfS3VeL/TQDP7Saq8V+moEfF+JeKfbTDPzQaq4W +2kGfkI99FViP83AT/RsrhH7aQZ+LENfK/bTDPyQTrta7KcZ+MFc5/ViP83ATyhOukrspxn4sR0r 14r9NAM/VKh8tdhPM/CTEU0l9sNPiv3kgR8uMt4Nf53uVWI/zcCPDwqvE/tpBn5Ibq4W+2kGfnxX xHViP83AD8U3V4v9NAM/QUNfJfbTDPyUIe5lsZ9m4HfDXzRzldhPM/C74e62u07spxn4ATRs7Idh UU8Ys2ED8OfiJP5WHeyuEw+iYJDLdUrjwUcgRIChv8om40EfGOLPQOcjznbKiv2TkK/QKadY2quj +cP8xRL2JeedwXZ7bmIPK24mT2MHYGPgoE8eHGFkMLgQMH8PXXWuBb8Yc8k6P0PQ0Jcz/JGr0mYH TrLZfPmobr7WD8U5AdtcHGfabIDm35evFW02OvT69+Rr75O4t+egkM3mVOe/J18rcwevn69VCKok eW+UuIg1E8Bpf095zjuxBmjOTFyclLVgV3NO4sJE1gJEOlNkodDjJ+clLk7KWrA67ZzEhVbWwq+W teDO1kwnLmC1XVqwN6TSQvFX+TgVgcSNoguPF0r4G2mL5atCyEad6g661N1BRxZQiSnBEi4KeCyj JJn9rpbR9Yr/HnewDBtiF2neHewUBQkWEyEpwrVstIVECPAjXE+fmkcAEqKZ9wTxoW2a5tSToSfI d3pJ57af+YAjmyjLJqiWA7GlgVD20f0KgMKxDeDIP0cFoI5FYNNUknBbGk3U4ogPal85lOWofQVk aRCRaOj8myWay5wT2GewifMdU2T/b8THtrZeEHFmCjAuDsCOZZrMJigSYGVSwND/Bs3lQGwMsIFB mii4+glxmZAF4EqBjwFTGH++krhSYZl8DqTIwG/uavC1qjAgM0mT9kQJuc84bKkvYRP8Nwg7E6vA RX3K8rfFlhxSl+OK59/8XnM5kAAKCl1PAXUnkDUcYv7P74AtrMA3ni7zHvbmDehczopN4GbPbJAZ nBhYSL+g2DS+LEHydWGWlwiKtI8ASAmfttMRlLYzDMide+TSJeYERS4lXjaSbj8dCwrgKoGDiO+X xTPMfJRhAyLgA9pWIHojC6yRGYA4oBtOEvQSQ/3XIG7yfWWxyuCLFKUEys1lgvIF4qD3RFjrmIyV khv2vk4MAK8BBsz/EiqCUgC62hlk46YSVQuDCRZxRdzELyldgUuiyKybgk12uyAMD4vIgVo7U9CO gNjz2QFc4Nhrhm0N5eOmAFxwnnA1MSgUiScYtwH93fsFnuggHxFlibS/5MDibNOSImi6YR9xMB83 oasMNeMmCWujoIll7SrLaf+eapHuNp7GvMO49bcFHSgQPFGj+GGUedZPJF6QRYSFylD9pInvh01I P5HIZRHrLw68FHaUOMr1/7wy7yGzU3O5bqRX6MkvDXJ6VC4Nkt4YZK06YQKtBG8UJIU4xCPc6/TF UoJzOUAElXSDED4Jr6mgQqoVnmm86rvklE+qoa/kL6s5yyjXeV1/Wc1Z5uo6r+kvqznLN5L7067k L6s5y6jI4mx/2asmqObT3ZeHzv/z093S0Pl/Zrob2AXv5eluFybxzjTuYCO52yHFsnN5wC4pu4bi yRxEs3L6ATLbnqd1LwnSaYqrSa5bPIySwDBnQy9LTXQ9LHuG/P34GFZm0HnjG+Yy6ND4nnJ2fIPe KdSvG8aBoNab+Glnx/zEkjDSzKL4ZhMjJBNUS55Xip4kUSALNUjhEHk/BNFH6Z6KHkUatU0WNqvT 3D2/fOZcRjQ2ec4SzdyxMe67dzAKr1d6bJzKpKCUVNgsx6cbCkoVoCmC36hfmnvswDB5Lg8A5ct0 56CXwQB4MXRGoFip4AQSvdI0R2a3kyRwAqMPgMj5HFRdKeBh1hLEd6FUQbe2wTuMioBLX7OamXO0 mkuT51pOoAiFE0+JhyemCaAWcAFPO5nDKv0fFwzxXPJQzCsEEnLJRJdfS777wlepXkdQICNh5oos QHTbB3HIy0vsXEH5WSfzBL3ohMTZseLpLhIuX/CN56DfAbw8qwSCp8/2cRhhg1fSdRis8rsilTGE ICgKKYFoThEUANdWNSEowAn+duPDsAUmEeoIjVJQuoc7eAErDga0gKDMVzto8jF5loFdEvwgrIgR 4ZV4IF6qTctijIgiaS5MFLIM4TBRsBQe4JM+JLyUCsT7g04BnV6BSTvjvCzlHqGeicN+vG+PbqUF W22nnWUon5Rl0Ewx3Px/7L1LbFzHlTAsUoBlOG4ZMAUknlVTFik+L+/7QZGi+CZFSqQl03rQEiWR lCxLpN5fnH/xL2Y5RoAoCy+TceDABpHYH5AAAexsnG0wixiDjD2Ad2M7/qWFEwNjI5bkv07VfdR9 dHfdV9+muo4Nqru6bp1Tp+pW1XnUOU8xSFA1TE0Mdqbw/Zv4piYGOxM+DqY0NTHYmVwxKoWpicHO RJiWztTEYGcieoFMz8tRh2WEJuvzctRh2daqZ3lejjosO3roDM/LUYdlvKalNDUx2JnwWSAH0Tkg N4MYle/lyOgYXRmJzgG5mbyeeV6OxHIz3m9SmpoY7ExYee+ZmubV4fimJgY7E95vkpiaBgLK1ep2 JkdaS2NqYrAz0cbitBr0KnYm3+WLhKYmBjsTsd+kMzUx2JlspqUyNTHYmbAGKqWpicHOZKu7U5ma GOxMJXLTK5WpicHOhNe0lKYmBjtTwO6ZyNTEYGfCGqiUpiYGOxOWb1KamhjsTPa2lsrUxGBnAqal NTUx2Jls21oqUxODnan0VHpTE4Odyad+SGhqYrAzlSpd+Y1hamKwM5GZls7UxGBnsu/fpDI1MdiZ sM4mpamJwc5UasILZbHOy1GH5VKDXChLKDoH5GbbGTZz0TkgN5fseDZZi84BubnkxlLNVnQOyM0I TS6ic0Buxr1JaWqqamcSvEtLKU1NDHYm6A2LqQmiSTKHwA/bmegjR1JTE4OdCXs/pDQ1MdiZiCSd ztTEYGfCaFKamhjsTHi/SWlqYrAzwTktramJwc5EjurpTE0Mdia8dKY0NTHYmfAUSGlqYrAzEa+h dKYmBjuTo4dOY2pisDPBFEhramKwM3mmiOSmJgY7E9bcpjQ1MdiZsCSd0tTEYGey1XYptQw17Uwl OjJsQlMTw7ne8VJNY2pisDMRDVQ6UxODnQmfbFKamhjsTKU4wbOSX2lCaLI+L0cdlvEUyPa8HHVY pu4RZHVejjosgxiV8Xk56rDsrAJpTE0MdiYsEeQgOgfk5hLJ5pO56ByQm7HsmYPoHJCbYQrkIToH 5GbaASapqYm2Mw12HYiyMwVMeIlMTQx2Juf19JuaIqKbpbvS5EOT0NTEYGeyr5KkMjUx2JlKLIHN 0l9pwrciUpqaGOxMJfveWhpTE4OdCWvVU5qaGOxMJXxVPp2picHOBJt0WlMTg50JT+iUpiYGOxNl yE9samKwM8FVkrSmJgY7E/FSTWdqYrAzlZ7qSG1qYrAzYTQpTU0MdiZgWlpTE4OdCc+0lKYmBjtT yQ5GP3Ri+vD6gdOzxlJFi1Iac1IJRxwb7R24fHBqEge0Z7u5dLFPWp0dWkQnmytTEYJHb4aCBz71 dWoS4vDyJA78n6fgoVcVPDrRgJ+2BY+Jq0j2Gp4UD5+88BKDzIHYfJteg73kaOf3TvcFjqj4KOUe oKh5O/3yDTJ5SApd6nyweIo6r/tOTJP2/EbPBnP1dp6YwZv06mw/yeEt9V3fGJPPKS++6JJqRR10 4AR0NHyPIfKCwxzeEsh7M9INR9UxktIHbQkK5BIdg+THEqWzOXKm1wCF9qQzGc1edFibnLfD4ASO aJfvzEBTluerjjX+OJf8ySvniRxCuEr3Hm3S80sjkPR2nEwjp8ODfvKn/CtjJ1oPpxxdpyatHus5 LK0e2jcJy78qXTi7MUsry16YV9FsvaL6lsRXz0MktykkuVyFLb9bRPv90kH53MSrQw== aH6dw+nb52A3UMmtiLVDaJNoXyBbCKSBk88dffEo4tz1Bbl7ZsokOUIvdp2f7R3pNkcgws8Y2lHw WqnMoFmqjiidN3vWYRy6XAvsy7CTdPl6gzcTyPUHoeluaZQSjk35Uym1KE7mdxsiKrd39Z+70L53 fHQvpRoJeqWxmZ4r2J3HOrDa7pACOsFFkcn0vLR8SD43dGKhgnV88AZtxHFWppLvkiyrnyIWAQ4u XhUQQqyyPziQYxKHuZVqwuMY5Jcf0gYu713swDPtlZ5pN+JXdRfF3oRyY8BFcf8NK2H+BpIurlI6 7hK5guVLBp71FSy0RmH5ZnxjyjGNrYuwTB0hW657RIRQWEPSjNHjxPD0LxRVdf54cyjZwRqrqv1f gL5OSNPjx/piGMfs9RjWTxA8lI415bA8MXJL8lYBTygC+5GGNeNorT4/KQ7c7joFK84gOs9ZR9FJ 7KSEznMjs5AjdVTpfGkDLWc3bx5Fk2xsBh/NQDYaImvaq5O+5ezEcchuOgnCloUOhq+ixXnp+hxa Om8Mo6/n0Uq68eISTnMuri8ODuNQpfg4HNBme7wmEgHIMi67M05PgI9mCE1+pzPvaIY36bxOZ74Q E/mdzryjGW2Tzvx05h3NsOCR1+ksQtF1cPqla8lPZy9dC53Ozp2eQa/KLdBsLuLr2BAEGy0xM7NZ n868pQCvaXmdzryjGbZ45HU6845m+L2JfTpbXRZBy9MPdrxOdLxaVNGKszE3iBaqiyfQQrU0Cd71 BpL9Zy1ptaN9nOjT3NiFVZfE0aGZaWX08upL9oEbLYneegg5ITdsYw+2j1K8XuwjZ4Hjgs3uk6cE V95nWsmoPNXh4woczU6077/+4jI+px17/mSu57QRLHtOj58dYz2niRfHT46Jh28vDFc4p43fzu6c Ziv5z/TASnoYNng1x3Pa0XOsSv5SgmRbXfH945wjB5j8usHUMotzdGZ9tQxmmrO2G/ldLSP2G2k2 4QLvrO7HN6uv7rbvYKUF/vhmcIEfGzg3jdaqHni7r6hopu2bQGvU9anqqzscOZIs8P7UFVgdC+FL Sc5kb3V34suSCY1f2IEuO8Qs9paousCPdE3cZJC9YSdDy/S5E/N4prEv8B1e6GAIKDsFsrLpxX/3 FJP2bkSOqAdIhrKZ62PS9NlXJX84WVkZ6zyDxkHRD+NxCOURYQ197ubxcE/adJ8B4fxhSDyJ7aTH ws5BL/aKcwfaQW49hc5TfVMT8M71hcLuXli/gZfOS6osn7l1Q8auK74T+YGDiEsLo1LfK/u1UF/N O0fEiyviQlRf7eP4iYuLsMvh5I7n5LMHAsHrwTVuUO4W9h2OitFPiyWupIfE3l48l5WRpfY7RIJz FAvjjj80HjLbfTOwDTIFPa6xB5b8wehrboMJ98ASFdKIZRtMuAd6Vly2bTDhHliyI1mwboMJ90CY aXG2wYR7YHz5JtEemFi+ibcHgu9gnG0w4R7oP0AdnF7cSC7kLG74F0VIcXEMiTSXXzyKVwHIcsG4 DSbcA0skhB7zNphwDyzh2A/s22DCPZAYixm3QbkTjHkL4/LEWr8cCqm+uIDG4ea543iJD+wL2EUx xjaYcA8kNgL2bbDKHoj6CsqseSS3jeiRqcMWDqDH16aiuou3QXAZgaQIl2Yh+r0VTOCyOnJrEnH9 6FzFPdDzUmXbBhPugdjuGWMbTLgH2gJ7PqKgtwe6x8E8REF/SKPcREFvD8S9yUsU9PZA0NzmJgp6 eyD2Vc9LFPT2wFKeUUa8PdD1h44vCo4MviCw2i0oicA2XQBHBmgnHrlTB28kcOg4A3cgxcMDl7Xx YdC7rdhERJoiwEbhbETuVRLssRbpytYzN+peZvAW8T5nEb9VeZfBkxzvLtjB395gTvk3qWOkNadf /UShjSZIrzstTgLDVarraEPuBg/maSSWCf3ellAiMSFp8rHzf/T+vNgvzRyaWQTH/T56kyZu/Zt3 gNhlctqY61o6gLp+ftLNwOzLqaWhzRRtIesXpvoicmox53/0u9UN04sN6vOV1X7027UX/Fs+5e+k jPa0T8nnlBkTzBnD6NPIVETusSn0Upro7Vt9fi86LnUI2D/Nuu7v7tohuXtZHCf3E3x9NWB/nMXG nnBfV25j1x15YqNnUp6Y2RjzktWU8G0inMUFXNOenzpErneEktUI+8P2EFjOFtb7yNIJCyu1a9mz 79IMdWMlaK9myvodx1hdIre+I+zVt26RbbBr5OpSe8/+vRvwaTWhTrREQhrBXgh3EZ4XDHqDIw5p QTONrzdwJqxwH5EiG6GpcNWT7CPdiF+HulKLbHDksLerkeVq29UIeo0mJ3U0tdQJMA71gUWRvJ4M e5Uj4iYySclS1gk2tGtTlb3RqR5Ktw4jlh7oUjpPHD3KnGDjcDt9YvFennPSddhlrtKbGb7vGpoM vtursfOCgZ+kTzKDhQIdeM9eIp5B6P2eHUQn3OEJevfMUDITwEYyTOz6SJaCG5onJfze0HfUvFr4 dkwPrlV7N9pv37qpYEX3jurT88exd6LcfUjU49wy9QjrQ2vU+BB49wyDI++UZ3HCnin64LJjatpY RgcYZUq8uLQxjZdkqI+kistHkciiiFNoVnUdEufGDRNtdYcMtBFY077Lc8aQ1LeE1nRbIljsB3Wd jG0EFfYieiOaPtElXXil/Ujly3NHXuw10Zp+aQJRd0BFZ03jEJJcBBn1Rpy1JQKyx0oXLvUOoImy 1yLOoKv6uAK+oZrfGfRlPI0gFMVcuMNz86jDvaNK54HlQa/DzuHWcQbtg0g8x4Zh+zHRn6F5NAWW ZuFeoib1d4yg0+nKvjns/YH6MDiKJL01lUExidFUEMrcw3WEUBY9BBUvz5XCUUaY4jTeuq0fHTt5 whCfP7s0NNT38oYh7lNWK16ZCyu6oqMzwp0zxM0e6ipctEAl071xNxbH8z6Z00D/9lqhE4V0J/5e 05epu2EITeqw3eL6XvVOxbthuIfEfnOgC7xrQFoa6Zcnjik6U9huR75hiKVQsiNZhM96g7eS6glB geaPefAyOXUuH5SmV/YddZwmjw3ab3dmvl14TSNhD+gXG83gCwP4xfYtjl4VrMzQeqDKuXC7gSsJ 3XaOFQbxaBIca+bHwC9KojVmNWQjmzAyBSYgdezguNJ55JLlbpf2NRfw9nM0Zt0WeNkfBAd7Pbiw 9nUdA1f75TG442IhAQk8Iva9OuvXDl48++ooqn9p1NYOXlmFmAOL/Qy3EkAoHRIvrihHK4pFJRLh Eon67ZaqdJ6bmUB0HJtFk/KMQEVymNl3SAXJSEH70s12cJBVwXENHbivXLnpUxFG7yR4kyabSc8Y ml/n5/BV7UCfbRWhf5OeG7w+Jp/rOboIimwwtZ2ZRcTOWIil/aPA+lG48nG+N1VuojlKgx+4yh3B f+iNbwgy0A52n1i5CcLQRfTnyq2Q0auyeBI/zSOakYcG0brVr2KRpmQnEKx2J1oeQCL5+CG4oqxX vrZdVaoqBaKP1gqgo3SsbvTHvwuM0OQXdta7C+xZCiuGnSXxbBLdBUbvrdlr3/HIJeJs4BpwyQ5G n1kEreGbUYIX8eVglr163Xc0nuBF0Kihixmj516A4C9XdGl66dhgakMYbZD0JK4eUPmMwsm9FzsA D1wevtAdefonb6a7zlZyWXbEKNaQPnBvbRxN1MlYEfF7iN1Twsl/BTAggoTaIWGhxIl688oNVw2G uHliZBTJEpP4huYgGA8mkWC7MQeuEoNKx1r/vNQ3CFmGFeswMOFEL3XTq8fB1deFNoIjfaw7GiwK I/K5E5dHKl2yw7fvLHyyOfuqDKv3uDyx3D8HGtku2k9xZgrLUmaEp4effLjtcQFu991ZGwIfwzkk xL86g3cjQIOY6vfzOH0M7q1NwXKqSn3S8kHEqpk5xCXjkDxx+tZBuXtNB8m0T5Un+l8VU4pReIAq iFHuTMMbF8y0qt7apac6Ku9eLGEbz5xcOjAiCC/2VvXb9sSoaNftPjRBZvb7/bFPR206/ivtwU2n FCvgeWJVHjkLVLQ8ZaXKK5GbxVlYnqqp8twjR4IdJYag6IhRAVmx2o7iNz6yqfLsKeDtKD0JdxQb TQVVHrYRhLV5WavysKUwrM3LRJUneJITTIEqwtNYP1zSnYANri++8ASSEyLx1KtYbXeu+6ThF54m 7f2GkiXWppXRm1dHQsKTtDYKK+lUlPDkndyJ4JFIeLrYNTWqjE7OzFcUnjzJCdD0tFvTEANjOiA8 YWkJDe2EjIUnfKUbaz48m5K/N0huOjo0K60uT4IvYJ8JNiW48DMD21pY7CFmpZehuxPyytr+w2El 4MwCmha9w+LhW7fVsNYzZFMquYmea5iVXp11b6sFbUrKaM/+SYRrto9cgMRK2yq5iRLeF3IiBA9d NMT21emonadEJw1KcWkIwkJJB+H6fn/UjSFs9wxcGppe7ZMnDrWPOWFYgtao/oqXhiqu6QhNVYcC sqyndiTARq/kYaRYHQnsKZA0jFRAZESCrbF/G2f2I+Gj0mb2E5LflzrVt+k7p+FwhNJq/6UxfF7F /M360idsa85RlUTzQVN7RcB3c6KWWuI3cWH+pFB7W+tj3taGILTq0qQ8KV/SYmxrriVHutMv9b2i EM1tYPnfJ5zqdYM7StPjUyNy92wPhEDtk+FK6LQ0fUM0Q5LD+KVD9m4YPs27aNhcBA+jt7DjIIjz ZgU3+SGQ/tAOMSf1DqClu39Gml5p1/Cahk7Evhg+OJAjCU2i+CKwVBN8IByPtGqIAcEHx+7BB6jR Eydm5XNHXwAjwinVL04OAxHDaG/rkf3iZLywPSUnBnH1DBHeTMPOEDDTYvlB+La1Sn4QF8D74dX2 7p7RlxO6QARd4pldIOIlysJLZ2ZGp4qCBEKTodGpoiBB/KGzMjploYRkMDpVtDjVVkJmEMC7d9Od 0Al2FFBG+41OFS1O7lWSTHO6hixO9v2bTIxOVeJglfy5iS4OHpAnNoYO25p5xpQrlO1h+nS30nnz DDjknRIc6qJzE4H95PL0yTkSLtpvP/FJCSFrfsWTO1FCsmw142itPjkLka2Viio6GPND8sTMsAJb zbi8sqxgZ03BXqGjwsWpkY4PVWSeycWByxc2jsK9aysg85RISgrs+CAjEsTD4vrt80pIxLwhTkp9 XUsjoDTWQiJmzRBYtrcdcxSskMPO/huiLeJX235K/itYLGFjbt2A7eci+cO485R8mS9yu4yFDZI1 HNEP3Up9GcvRqjuO6GRZ78v6Hhbl1Jd9zNHUTn22yNjLKjKWkl7BiicyluJewdp/sGsm/RUsMNcl C5uD9mzfSbT7wAG8nMFhdco2rzpn7ppO58we5/Y5dYx4nFMSQeRSKwAR3c7JOauUey926GhvwRLv Zj/7tuY6HLjmHFegI2s/EdhPTngmGbxTSasd/UbIJOOTHDx7DMNpPqDuDiaM2DhpGw== wnydow8Ox2+gXe4K2iHO3HoFvbza7BiIRbYE6cSpXMZjg0PhY6MT7U4+W1XwGYLUEWDMExWf4INV fkiWnDHa8R3rKbyTwWJDi5Ori+g1EkZhH1F84mRCJ/K16WpO5O5M6weEA9jumTDcPXXrO+CxN75m 9t2+vjTYubF6vqLCL5a2z/Uaiq3wi6Xts31uhfgKv6pLN3ghzU/h2DLNnGlpeAzyoknbONMSyXmU SlCz31ZnQscU1GBC+TMiQeS3SWn12AwIap0KRHqYEOfGN2RqFchQUKMvYpKMSBOzOEQ47OK9/uDA zk0rO3CxfV2WIS0S3OmM8qHw2QichC/HJuRz7boaLy2Sc5FJd2/lyu5tpmWHaSCyLfvCfOuT6EkI 5/vCuBG4Feu/LxS8FRt1gYeo7cJ3eKpsdWtLznWvw93RKV+mpw4onefOLJKULzPo7SLKFK0LCWD9 lEM+9loH4U1Hk/fC9YCeEPqK9rGDC6P2DSdfX5XOy0ePoi38+oTX1xLOG0W6+3LtK1hwY3tqHMyw vRHXzSprDEv4cnllF8GZyhpDlgvczqbnHNUT2rt8WTJPT1Xc/sK7Z9b2rqiMmDnYuzDZxMmCaQfM 2uh18rzU3nn14HyGudmdKZDKB95NmIF2nhNHYDfqDwiveL9JG0fk+WtDknz22pXOBjd69YnJXTvQ s6G0BxBDHYSMtSk40urokH/2EFrMN2bcWK6pcqgD00K5LbwlHOe2gPV7ckSrtMFIdkJAZ2+JkuqI 532SBBdoSF+YRS/Uy70MUp0t4vq25tuXe8GrYSK4P0ckBhQvzp8dRm/QtRe8C7HObdieCciNZOJB wBtB8EIscyCjqsH7l4fhsrbsvDcRSkt0rrxoTEB4QyBwbQbiVyih+BlgF6uUFRDuHR8AfeIh3M0S iTLi9rQf7YqnFiZBph0OdtMJ2S+haTEOP4BuIRBq5MqxIcT6NezAKXqxN2ynvsQh+6tnBXSvbWO1 XYWb2/Flv7Dgd+u2NWmMQIKNoRPTi5fQtD5z3ct8Vv3eFvOlrZWZtT58aQu87arc24qf2RmMc9qg FTDOlewEgmnscwzGOc/BPxvX8QrGOcdXPY19jmE3LOFIFunscwzGOehNWvscw85XisjsV+uSAFGf wnIyyHrGQWhqS/lyVS1th9tD12nVGJf6Lg2f8ZlXs8kP59eSO3dBnMMMmFdTxEVjdcsleugEl+zj JQAjYlQoBxi4UQxG5QCjORcjARjxUmXPARZxTuoLbJwQ6R72oEHsWnIIp0wg0pp0wLvem+acFDgk eaZJ52Tj+BXSOm/KgAn7OXVfPHbOZNv0HQwLDyklZ9AJV4mlHKh8m93ZpG2HIfo2+8ugwT4kTypz R8M2TpCkK9g4o65SE7fr0G3qjG6zH7xwsQcRMT5MrivYF9qdwGI37kBgMcW+Neiz4qJF5NI0hBl/ IdzDMdBhD06TQ3hlK64ir8z2HME+siEr7is9E9L0/KVJ4qOdmRW32sEolhWXHEwx02x/b/CbOAGp QE/1B6a9b86HMn6hw+XwcLSjsuNIUHJDgWFXaDxA1ePuSYdvseR9QfMenY5n+yddrTpj3D2qc5TH tUcdCYZw5TbtLd11bAiJSieOk5k2aKEJuHBQWl2emQuZ9HuUCbRCHRqGc/UF5gHya8qC2sGTL2EX dvBflyv507k3nA7qcFN4FO0fkuLYb2y7EHotXrmJozogUWXTwmMTuk/r703PFI7Cj98HNLVFSHhz 5xiJej49Pz+EpvbGYd9lWmVu4PLBY2NS/77ZQTT750muiFd6jpD7tJ0nxiZB0gDlYreCDnDGQSR9 vKolDDtL7iTBNukunWmjO1SXF6IOUD6RIRt5wdHcVhQZspEXSv6QRmGRIRt5oaITeWb+fFheAKe+ fP35sLxQigo3lak/XwwzUWp5obqZKEmC4Uh5oZQ+rRuLvIDfm2oiQ+b5pKNFhmzkhRCabIJyBeUF 2rWXOWcwqIGsWPJCpNdQ4pzBEfJCb4BpFUSGbOSFEp1MOEpkyEZewKaIaiJDNvJC6SnmAFhp5AXs DMsWACuNvFCyg9FXFBmykRewKaKayJCNvFCKyCGZTpEaeRx17DcVRYZs5AX6qB4pMmQjL5R817Ej RIZs5IWSFz8tWmTIRl4A1VBVkSEbeQGjqSYyZCMvOOqHiiJDNvJCqVoYA2enLDIaXCx5oURnXYxv YmCVF+izQAITA6u84Ng9edC5xyroXBx5gZ5pCUwMrPJCGE0sEwOrvFBiDTeVTl7ALiO5Rv7wez8k MzFEywviphmQF/wu8bFNDKzyQgln9osUGXoYTAys8kIYTSwTA6u8QAz5iU0MrPKCYyxOHTC3urxg 9yapiYFVXig5oVmSmRhY5QW8SSc3MbDKC1ilmtzEwCov2KaIpCYGVnnBndDJTAys8oK3QicyMbDK C3DqTGFiYJUXsOk7uYmBVV7w7DeJTAys8gK+SpLcxMAqLwQMK3FNDKzyQsm+8puLS5InL4BzUm4u Sd6OXiJ5PPJxSfLkBUc7mItLkicvYK16Xi5JnrwAK3RuLkmevICPHHm5JHnygu+9ydolyZvupSoB z1O7JDHFGkrvkpR5rKFa8kLJy02UvUuSJy/AFMjNJcmTF3xaDnhhjQxdkjx5gVhxE5gYumPJC45N OheXJE9eKHnX47J3SfLkBeeORy4uSVUSbGTpkpRvgo0IecFTEOfgkuTJC8C03FySPHkBvzd5uSR5 8gKeaXm5JHnyArat5eWS5MkLtJYjc5ckT17AR468XJKCYdpyckny5AX83uTlkuTJC9iEl5dLkicv IDT5uSRFHaCIyHBo1RMQ0skG6vH95AzdM2ruJ8fB593rfOhof+TlGwbi4fIEOazZwUwcMeKgdrQb TyjMETRKe/vQ/rGB3sd95/vtuz4nl28G7ic7i41dwTnmMlAuRgW5vyjNH5TPDU0eJTKHG+Y+6+sK vkj3EdcV0kW6T3pdofb9vSzDUGcVfKYUGYa6L70yenrshumFX3FtBIwRWODx7sD1dbyFy92H+qei rq/32sGzcr6+ju+u2/tNBtfXmY+DiyQoQve+63Ky6+sGRIw0ldGJk6rvimF0xLH2/dNwJpqSJ07P msGkzr5rbyzX131JUdk0ZpdeEg+fOjQeiK4WfX19+lwvOrueXsDZP2EV8CUADYQdk33dpG8jBrs5 Y7TPQLC1IxHdfNmeApCZfQptebenDpG07L6b6wrc7huR+qT5eDfXvWvreE0L3VyvEusyzs117yX3 XEYS3lx/+aB44PTc4Sva1fPXVzMI3AwpA452+y+oR6YMgF6bgU3Me29i7mPxlB4ITS07Kb5rfmfi SJq75tvB9G22i5PD+88wbEnYASZJSLS+WPHQXFNEtg7Q7e2dveOqp8KyjV5Zpt6OUmFRFvacrN74 lIHQBAIFKB3a7f1pQuREKSZt1RBzoICqUQIEd2UMRglAaGprm4Swtsmah871S32Da4eoq/LbxyYN S2I3gzgtdx9rHwEdyGFPnLbHJvMbPuLFpeuH0PZvzeHkQljXKS2NI3EahzrrtkDbNQe7+DCOsecm kagcwbS3dvhSe5OOFcFURmeX+Qk4MWnVJOlLVOfwkWOlfxIitC2BmGz5OtengnQ9K60K+9VA52LJ vo5TXyhLUMqkguiV3T8l97SPzIZuelVQ71AaO5Lw8ZzLpVO+uLXWEQgMhDjxwhKcGE8ehLi1c3C8 wvq07v6zE0rn0JjOwBY4KovVVQJYrRHgSSlxuhB5cmhsQj53dPUEW7oQ6cKlpQMwRyeDuRZhykCU Xy2UmUru09ExYHYa1JZ6gEHK6AkLvVrnTh91QvXPu1PA0buMTINudhaCJmm+OTcAUoJgQawfOFks DzmjFHnq7E976qw5+2rHVWdJqdi17/Rqe9fawPn2Lv2i2N59+coVtD+/uOplWIyZp5DKsAjrspOQ z0mbGK04mX7pWlS02ihXK9aT2OK5nowuLbGfxKofw/C2ViE4bZLItBVyVNmH2/QnserHMCx7xj2J kSi0cYyJJTfNTqLMYxXjNQWOYfjyRRYnsep5LR0xqrq0hHb2tYMM0lJFUQmhyVBaqigqEaZFp7EU Y+Sw7CYHdFiFpZ6xtQnvHR1cO43j2bhz35doZHb/AVhTe0OxheF8AId2YmpjDCwc0KcxxBamV+g+ d4Xuy8R+A0siSxyqo8+PD6G1p30qEJUwwn00dtz8kAqrZwwMl0tj6FTWPoL3Vuw1ZG+vsjJ6c24O /bn8kre9BlKNJTw44ONgjFRjkD9hDCvLAjGTqyiueiYXyI2VNXQMuLxvJHB2QKsAOtJNrOmHQ52L 67tYInFu/bbItLfKrnaK8sTG3Jw3DxxDfqUcc4zZuZ2z9vQr++FQKc5gI614+OQFCZrCkSzGBi4u MLHl9sEbtVw6wcYcwRPi4B+bLXc0FZx9jtrBbmtawvE5Le5lO9+p28eg/o7+cXFu/NYcibs9vXRs 1LWwO3bwiudVVTw8jWhbv700wHKaP3PrghQ4zZPdkzUVamIDXykyu0Iln0DawBfLAxDMRBWdAJGw 2VPz0tDUnahjZuCMWfLdwsvumBk4Y8Lrmcfd+MCpxPPoSpxwm+VUUiKhWTK/Gx9wXMMOMGx3XeQz twcPx894QKetlr2Q0/EzHoB03ec/lWiQVX4Y7SSTB8AnYJJYcW9rJEtl7SNKwvOJ7RLPfERJ6F/i OcPmeoXVO0DVcjEJ5Aj1e2QEEoSG/EtKJFhjRi7pFf1LiItiWpf0oOsU7V+CXaewzsbxnop0MfGn QPL7lwRTIFXUsREfqKxc0ituP7STRTUXE/u9VT2VhJfKRULCxgF7wZ5acS0Yi9cc7w9i+u67dOlg r+d7MXBlr0CC5++zNm7jUwz+inU79qdX13vsCQXhlyHLcC/JT4y/DnbB+z3Tb3+dV11fDrTADt52 ODIruiLuGXHmwuxJEk+6T9w855A61+MtxKBgueD+0Ef/sCStUXqBOYH+7dLwRfchkfoBzYhXnB+O ko6AA8x5t6yXqjx9Vlh1f8ABM6jfrg9C4OCjbrTpo0ThCAHPZfhKglRLF852uI2/QFS1ECMWWPVC v7uI7iP6A1QmODMN3hFo6AWxd6RrAr0yMwv4q90uersle+ROTfUOHDl+RQFxto9s5t364Fqk6Uq+ erxjss/qPkuphiopf3C/3D8+qXkgqsmo9jyJoFaTYpRaRz+4pB4dNc6sdQW2RNTrZdnTlcAmvW9o 6ByeS+BZd8Xp/QlqyuBMOFBmu1FMnJ61E+ZOrC5o9qerS7L96c7yWaKYnexGsjh8gsUGcoRCGxpp Y+X0IWjytIANUfLK1XmRPO4Ead4Hq6Y7507LFDnnDqy96v6guhlVLtC9wYZsI+g9VTnjFpmMrtPX +Rsw007dRFMFrfNoiQViV27TF8r2Y+EF3u5e++2G5YR6u09dw6bf/fL+Q+1niCL34g== uNCH91u07A3NDlw+eRsvHp3ge92LV1Ise7qRyDExxJwCv8EyTSav+wdb5UQSpPqg0e2tEfZejM6/ VNn5vbPXUdl4Pz6igoAAZ+ixq3s3p6S+s8Y69e4fNF6aGT93ZXQNYb0+Zq+L04PdMEePYOaipdO0 dY3TS12mG9K+z14eLqnAtKOC503w/x4sPWUYllQ2VfRn4Nidq+s3F25evnR5s9xXegodGQdGZyVp aXPt2tTN9fUX11+7PXFt9c7G+ubt8mB5YPT4+OysqU2sr15bWy/32VcGvDHu9R82lCg9tacwm7ho TV+Zef7Y8PmJi+Kpg0E1eLcyM9zeP7AftpZ2tNsOtXesS3OgGj0OX6dAAmin/CRC6lp8TOt5fmL9 5tidyd4j8yew+jHg3oHO+5M30HkfH/5HZ7RBMA6/sjx27qh83Jg7NNKHvq7CTMT5eO1wBLTEUjkB HU5Zd7uzvXvoqAodeQnIBhUAaHYH2vu6Dx2C4sPtvS/sPdreuyochR9G2vtHlbX2viMnZ9p7bjx/ s2Lis+q7ZcnJc5LvbomPZGjDrLVbepJY4BXx+hB4T/aNDzs/jMMO5v0mj51eGnF+mx3wfkBv7qVR 54cFyf3hrEiS7kwP93hlNOrp8T46QO9ZGvv0rADnqB47qPy557vRS/sqOklNH5PwV/tgtXjIa3wF PaFeQ2VTOK9Dj6MQn7gCZ0rTNj+bRO0ysLgwgJ2BEIYb+9DXJdxuDxmggcVlxd0je+G4+jz8CgpW Ae15p+b7K+jdTwPTJgbOD3W6FoZXo+W6c50d9B9bH0MMJIjEzXGvyaj2orxDqjXpaBV81oFD+9df nJhdG24Pysuo13Ig8NvVleednfS86vb+PD3JLizg9bXPXoIvLA3Ys//CSVG6MD/bjT4tS/ZOc+Gs fNCaldF4XTiP9Sb2lzUVt2GP75VjuMl+xPhBJIJcOTlgP35lWXQ+nfXm3AXP1RH9sKZQP5xtV1Zs h9Q5+dyRGx1BUdk9mjvLGW1drJY4MrTi2EvnBCwsQ/DpMPwZIctO343rC9ErjmcyJCsOOCei3crZ o49s2h1eWO/BLz4xB5BUK31Y0QqJ5fphVou4DWXkxOR525J6fgU2pZkusluv37rSZyuf8eoi7R2A vAa92GPEvQqCFpu+I9fwTNPGBTTJFk7a57LpuW47kYE2NWCLqr6Jh5ciZ1p2d9p/8A9IgMSuqeJa V9egs24M9thu6eCSNzjkFB/qIxs2sXqgZUfULsyNhE7v18fFicND18TwAkQnCwX5+yBZodGxnXJo Pyv04xO7vX9fHxygzVheJlb3TOX3X6RUJmG7sGtkojV/wwOv4vcW74Xi+l5twFNF4TKsCBTXOjYn UOWbvfQuixsYGjnea4fpJm3Mvtwn+Nt45eDSSg+SktVjt0HttIQ27otDvil763lQO90h+37nafkw 5ewHZeLk0AJpoETuXL4QbuOOr42Zzhn6lVGP73e2cLhu0HdUBpEWZtVML3wS3LIBXGZrttHk7Tt+ Aw6fN8mKQ/TDvhMt7mFPx1D7OTTd907evHNuWMbvCP6h68K+Yy+jRVSdRj9Igu+Q4sgYwBa1+yw5 zwD5vUMTt47Dpt4OP5yCH54nPxy4unSU4g0Rn9HY3No7tTaAe4iw6s/vO7Yhn/Vd58ASPOHl1Ji+ gE7gJ++gxk8t+xiJHd+dLi3fVC44XRqUfJSrN6LIhgk9JF96gSYQzud48tw5d0hxCCT8uuYRCMdg we46asChrvsMNL7X7vrqwhFYcfbiKUDYQlEuVKAcY7UHo7trZPlMhcE4dCfQpZKdN5h9MLB50G7j ZXo0D2wccxs4GWig5AsCe3D61PV0M2L65RtRROCxqUaHr42Vm/E7ghvwFpvpC7dSduSV4Ih4RASY tvhyBaYFJuPiSuS8xU366q3f8hYb9dRpr6o4NTe06Kt6rb1ik2xv8M291CpwaoPCNXPk1Cpd9dTL 7vw69TJN05kZW+1GtlWsH4dLyf6FCpvRbh8y8VvobU3U7nV+38bL5FSyf/iU5s+u7N7yefmWSKcq AyHc/tSFtxiM5taVHv+m3mdru/HXcQGfAAT3yQEvJyst69JOJWfCmzQlLfh3akpUoA5hB6cE6ocz d84ecn6Yp0SVgKxtnwW6aezTh3opMYJCPT3lHcbPIh4uoddoet45J04viHAg6rXP9dNLMj7mB9zS kYSJhQH75Lo42+/stnd67M1scV4g8gKxNSweE7GdEf1Zg68nSbtIxN4kkp7cvU/oxudfPNNOzeIB 7aUFIJ957MD62e6L46/oUwu2vaiCn4qnG6H8Tb1Q0McGMmwStbckBix4MAWWOg+cG3/FmLs++uLo 5gm/a/2c3L168rKrTFTcSXaOHuQL832UDEGkqgvHSFp1MMk7U6AP/BSIVOGddbE/ByiATmF1Ev5k j++FSxqRF4jseWVJACOXhC8+4h9c3Vc/Fje9KXDlvExJC5Swe+WS6pyIT2u+2CdHNj1RIXDJMnDD 0tVpgaHMecXP3iJ6gct7FztdvcAtR5IndrN+W6bV1G6cgxGRf+gavkWGT7Pk/XZfY+zrcvIlkbzn SFA5hNq9IeDTNxxzT5PX3rF5dbh/IP30jOhaVzvdP8eInRO7K7gqd1uBTtaZoMKdlC1JsNjMDXjq NJ/+YF50D/ISrST35UjGaGxlIvT+5VHnLD/eR8qIWg90BbaS6BZo2sAEC/q0lcnNNVqXhoo7UNHx 9dt3ruMq2srY+qXLm/Pnf7KO+iSVyX8i+g/+GlZZks2yrGnoiwal8xdKT3Xh2mWpuzwP7pIrA6M3 b09cXr19+drm+Zs/KQ/ispNH5pdmJ8qDZVJ7BdU+UO5CNIkrqDr6qRur8VaAUiSUiuVR+HPyx0DE 6HX4jDZbUZBESUYUiIJpmrKqoA+WpVsSlIiSaqjwi6pIioE+yBrUQR8kTbZUqXwSN0l6g5r+CXw7 jD69WlbKPy6r5SPlZbV8RiyvldCvCJtsiYKhaWpZFk3BkC2tvAGFGipUqcJ5qlCSJUFREYGoULeC X+lHJAURqCj+do6XnrqD/xdJnwVDFTURMVvQFcs0oVOaqZqiDB9UTVehREK9VKCOLBomZomMvssW 7q8saKhvy7hXimYIlmQhOgxDQDVwf7xCU7dJEMsL6XGfh4H7McKpC4Zp6bh5QKcaaDhEq6yIkmAZ mlS+ShcifqmiruBCIEwU1bIiIRI03cCFuinoqhWo6RbSbWoWmhGSjBHj7xQh6PvF0lNLznSQ3OmA /l1DQ1Xu6i6fPIFrRE/nrn5DMDXEFzSNB47fvnl581K5a2xsdBW9Vseu3T4PlYMT2j/xApg6ViJH hy4m49OxcjQ7oiT0Bm5e2ywbElpMMR13vBl4LLsJWJIlU0DjqKHZjoZBVvBc8ApN9PogGnKYf7KE phY85OIAxKKBmkCfYcIYqo4nhFeIppZkGHi+AYmyJeE5iN5jGZfJaGYh2vwV3UK6SclCk1SyPOS4 MEgRmY2ypAqibqHVVZIETZMNP4sQdYokkxZkxFSVrukrRDUtjbwE1OOKgFCZpNBB5KsZxN6I70jk NKKLqYmUx4tCvyOIVEGxd0YgF2+eU5evrg/SG+mx87duw06KuoCqTZeeGphY/z+XV9ePTY+VTyIC l93dFQ0R2lit8pky2hQUaPnkK9G/w3dSh/w10f6FdmkDV1XRf6gCbOyYgInzt88PoloGKjo5+9T3 zLBFAftTcVuuAnm3nwZXAhRxcaVBwYgoPYqaiLJCUQVRtigiEeWBIoAlJxQBRI8BFoIobxQcC8fC sTQmlvqsMHVbLXNFVOddLCdEkft+togqocgQUXUUmSBiQZESVywUCRAlaJ8dHWMLO3zQgmBHRWhp ad25q1TatbO1NbJay85du9t+1Gmanc/tadu9a2eoTuuuto7h+RMb//ZvGycW54Y72p4M1Nn59N7x y3ff+d2f/vM///T79965e3mis21Xq69C1+m773/8xf2//+///v3+vc8//uCNy+N7n95JVeg++8uP 7n3z4OEjBA8fPvjm/ifv3z3d9XQrVeHNv/7jwSOXBY8efHPvo1+c3ruL0NL6dBeq8PVDH5sePfjH R3fH2zCell3tp38ZrIDgwb33L3c+CY20PjP807/8I1Th+0fffPLGJG5k5w+P/+aL7yLG48H99y93 IEpanty/8eFX4SagkY/vDu9GNXYP3/34m0cRNb5/8Pk7c22tO1rb5t75/EHksD+89+7iHlRjz+K7 96KQQI337BrvZVCjFpaalNbubcuujsvv349qxOHYjp1tk298EtUIDB1wHbG98/L798KNPPSGf2fb +N2P6PlDKnz91186U6hl197Tv/jo3rd0l9EE+uubZ91p2Arz+I+ffv3dQ9LOo4cwCX95ttubyvAu bL71ly++QnMZ5vFXf/sYT2RvrqP3aU//8k9/8+HHn9+7h96FD3971/8y4Hfy6fahYxt333nvPfQ+ bRw/2OF/oUgzz/xw//DcwuLC3PD+Hz4T8eLuQG/+k7vb9uxB7/WTO1srrBFofQAIrA3Y7AK6mdJT J2dshREqcdRFR20VE7F8YHWoiEABpVPFD+Q/0Hz6FWmyIgmmJUllWVUERZVMrFl0CxUdFWpGWZY1 wTLB3KGIgm6ooAs0BUMUDa9kFTSFkqBKOlVL1ARNAu2U25Jb4iCE59xCTRQUBcwhTkuajrpg0Pic EnjOJcut5pLuthTq4SrWXmalxBaJErs5+XgL63gtSt8LivUo7WwUf+jimBwCxW4yHqEnE3IJPZmU Tx0rla2fozdvnneUz6Oz5dE7t6+Vybt++f9Z95TQROVc7hpdu3ZhfWV01lpZuHBr/eb/WV9bmVv/ yQqpdauiDccgI4FvToCVFxCK5QG4QAEXKeAx/PX8xvrs5tr6a3bB8dvXbv7ELUDNRmv5rajPdwIW y2ytRnqU1Uivg9VIj7IaaVFWIy3KaqRHWI2MKKuREWU10qOsRiGKbKuRHmU10qOsRkaU1ciIshrp UVYjPcpqFMLekFajqGlEF29nq5GGljhdq2w1cn/nVqNM2k+DKwGKuLjSoGBElB5FTURZoaiCKFsU kYjyQLFVL8XhVr3sOfXBsvXYacE5Fo6FY2HHUp8Vpm6rZa6I6ryL5YQoct/PFlElFBkiqo4iE0Qs KFLiioUiAaIE7bOjY2whqPflViNuNbJrcKsRRQW3Gm0Lq5Hp6rgtz9rhFcq2/t1wdfm6raPXXV2+ 7lk7dEeT79TSXL2905JXYnnWDrdQ023du9OSLtvqeRefUwLPuWS51VzS3ZZCPczFatScfGS3GkXx x1ccj0Og2E3GI/RkQi6hJ5PyaXtajaQGthqpRoS63yvMz2qkGoYgGZbhsxqpOjYQ+Sw8bhllCgIC gzYj1QTzkL+aXUS3ZmB7keozDYVpIZYZ1cAWG8VnL6I45tmLVDPCXuQVUlYg6nHPXg== 5CHy1Qxib0R7UeQEoou3sb1I1WFxMyrai7zfub0ok/bT4EqAIi6uNCgYEaVHURNRViiqIMoWRSSi PFBs1UtluFUvS059sGw9dvpvjoVj4VjYsdRnhanbapkrojrvYjkhitz3s0VUCUWGiKqjyAQRC4qU uGKhSIAoQfvs6BhbCGp8ub2I24vsGtxeRFHB7UXbwV6kWqDdFvWyrEquHt8rVFSieVdNR1Eum0Q7 D3o1Q4RIXU7JKmgKbb27W0vXBE0EzaPbklviIITnvEKTaN3dljSVKOY9fE4JPOeS5Vbz+uO0FOph HvaiJuUjs70okj90cUwOgWI3GY/Qkwm5hJ5MyqftaS+SG9leJGoR9iK3MEd7kaiG7UWKpYZvGXmF tCkIkRiyGEl6yGJkF9EWI9TRsMUoRI1tMUIPhi1GHs8oi5FoRViM3ELaDuQ9TlmMXES+mkHsDWkx ippCdPE2thgplliWDbGixcj7nVuMMmk/Da4EKOLiSoOCEVF6FDURZYWiCqJsUUQiygPFVr2Uhlv1 suXUB8vWY6cB51g4Fo6FHUt9Vpi6rZa5IqrzLpYTosh9P1tElVBkiKg6ikwQsaBIiSsWigSIErTP jo6xhaDOl1uMuMXIrsEtRhQV3GK0LSxGkmnrtzXVs3S4haph694l2VaVq5Ktnxc1W6fulKyCjtQk mnenTLFkRzlvt+SVOAjxc06hLhG9u9uSbtiqeRefUwKWDpcst5pLutNSuIe5WIyak4/sFqMo/tDF MTnUsZKUR/BkMi4BuQn5tD0tRkoWFqNczEWSIRiaggZOswTZVGTyttmFqqoLlmXlYi6SdEGXFQ/F BrHkWKaqllUdzQ5Ddc07pNCUBYSZWFeAQgUKDQnSaeHMWaqM5p6pBGq6hXSbMLNURKiL3TYt+Siy LUaSImiSjN4BXRUkCVWgOQRsMw2JtCpL6EHEQremvxCxR7LtQN7juiAb6DW46kNE1wxib0iLUdQs oorpebT9LEZaWVX08pkyrKBqhMXI+R2+kzrkL4PFSFfUuBYjF+op7GVCRt6EpaEkW6qyoiQTkjIn Jg1V+RGTgKS8iYlFUn2IYSSpnsTUJKn+xFQhqShiGpCeMEnFEtOA9GzV0V7LCI1Gz1a9rE3s0FDE bHF6agGnpzpweqoDp6c6NCA9DUUSp6cKNOx5rBHoafDzfLH0hIkplqRK9BRCUhVi6k9STWLqSRIj MfUhKRYxeZOUgJicSEpMSR5UZUJMJlRlS0liwhI0XskhI8orI8J7w3HxwFDNz4P4lThOIxgqe47Y tZ9s6zh4nLihYKjki4KhdVdb58Tlu78lji0YPO+WMArsNfbGBx//jbjKYLD9ZZb794RQEB+yT+6D j5jHPOKB89Zm0IHG8ygL+Q09evD1p38MuORE+JdR8PBbcPLxnNEqeJvRKP7h+RXtIK5FUb5nFArP U2mH46xUpTrttlbZ/clHkuvEVsWhyofgvoOgsotWNILWZw5WcvoKIsDeW+BV97dazVMedBV97III bA+zyj5ofnC86yp7tQXr1/KTq1S/kuddVvXj0ROzv3H5GXe84s6H2PMt7nyO+77Efh/jvu+x15O4 61Xs9TD2eht7PY+9X8Tej2Lvdzvi7qf4iVj7NXmk+nmgrp6aiiFYkgUOZsTtyP0uqoKuWXIZnIaw 55ligX+OrpY9DxenZJW4JumSIXuFimUImmlSTXklCBl2LHS+y5qgKBZ4yNmtqIpCrlt7fjNOySpx ZMI0edVcut2m6J7l4pzZNKxj98cMsIQuickUuGMfny3ghpmQMQhhAtZsTxdMNb4LZo65gNFg2g5z 4NZnSTiNglOoqkZebpcQokKHKi4OhFiyFHCxtCBetusj6RWaiutNiUkkfpey63cpSxq4WAZquoVU m5DH2lQ12cOOC4Mk2cmARXCDBM9JzRQs1ZR9PALGGaJht2DaPpZOTX8hmseaJLn0k8clxHeJ0O8h omsGsTei42XkPKKK6Zm03RwvJROWL6mi46X3O3e8jAuNQ0m2VGVFSSYkZU5MGqryIyYBSXkTE4uk +hDDSFI9ialJUv2JqUJSUcQ0ID1hkoolpgHp2Wo8R8dGo2erwRxFthrS0ahoEnzA6akOnJ7qwOmp Dpye6tCA+wWnpxI07HmsEehp8PN8sfSEiSmWpEr0FEJSFWLqT1JNYupJEiMx9SEpFjF5k5SAmJxI SkxJHlRlQkwmVGVLSWLCEjQe19EijSMHd7zkjpfc8bICcMdLpvrc8bJi89zxkjtePtaOl7KsOo5k Inbmcb4rlkV828BryHaUk4j/m+fh4pSsEt8k203OLpRMlbjAuU25JYAMnnG/yyLxa3NbASc47Pvm +c04JavEk4m4yLnV3H44Tfl6lofjZfOwjtnxMsgSqiQuUzpWkrAFPZWUMYjWBKzZno6XWiM5XqIu hB3m3EJVRZzX5DwcLyVNCXsz+qhxvBklXQp7M1KFno8i9bjnzUghomsGsTeiN2Pk4FDF9PDk4c2I Zrhq5OrSCF6uUuVYkt7v3KUxLjQOJdlSlRUlmZCUOTFpqMqPmAQk5U1MLJLqQwwjSfUkpiZJ9Sem CklFEdOA9IRJKpaYBqRnq/FcCBuNnq0Gc8HYakgXnqJJ8AGnpzpweqoDp6c6cHqqQwPuF5yeStCw 57FGoKfBz/PF0hMmpliSKtFTCElViKk/STWJqSdJjMTUh6RYxORNUgJiciIpMSV5UJUJMZlQlS0l iQlL0HhcF4Y0LhLcpZG7NHKXxgrAXRqZ6nOXxorNc5dG7tL4WLs0SobhuJyRUGrud9MO1yfpTuw/ ww7p57m5GF7sP0l1Iv+51RQ7qp/XlFti4UB87ndIskzcz5xWIG8s9irznGckL+6fS5NXzXBjFjpN 0T3Lw6WxeVjH7NIYZAldEpMp6NEEbEFPJWUMejQBa7anS6PeSC6NsmkIMoRiVNBA4WnjluQZSNLU BUnWfXEk0SQTVNNQ/DEf3UI6OiRQqOimP46khZoy9UBNt5Bu0zQFRTUMfxzJIEV2GEnUmChpOnaS VGQ71KbHM0MQTVMlqCRBteiavkIVUo5Llks+eRxRaskk4KSLyFcziL0RHS/DU4gq284xJGUItYtm bSWHS+937nAZFxqHksypyoqY9FRlTkkakvIjJgFJeRMTi6T6EMNIUj2JqUlS/YmpTlJR9ESSVCAx DUjPVoMZ1Lcaj56tBnPI2OL0MACnpzpweqoDp6c6cHqqA6enCjTaftGY540GoaeRz6uF0xM+zxdL UkPRE0lMUSRVIab+JNUkpp4kMRJTH5JiEZM3SQmIyY+qNMRkS1J6SrKiKltKEhOWoPG4DhZpHDhi Ooi07op2QHmygr8KuMREOLhMdEa5rLTu2tO/fPf9sAPNB29cruBvs/kWuPQEHXTuf/J+BX+eP376 dZQD0DfgL9TtewA8kn750b1vI12SwB/pTd8DxOOpgj8Sgodfowcoj6SaHlXoAcrjicFjy+dRxeIR Rnls4eZreZzFdTiL69CGHeYOPoNYxOrB9+Bvvzn+Q0QQq4fgw68+3NiPeszqgeh48DF7ONoegjE8 It+tk8dlPvR4/Y3Hz5jjFXc+xJ1vcedz7Pcl7vsY+32Pu57EXq/iroex19vY63ns/SL2frQj7n63 o/kcLhXREFRZUsuqaIKjivsdkiCTmH+WKSgWakIxLTvmH3Zl0SyvZJX4JeEYY1413RBECzXrNeWU ADJ4xv0ugQOSqJTdVlRZt8P4OcjcEnjQockt9PrhNOXrWR4Ol83DOmaHyyBLqJK4TOlYScIW9FRS xqBHE7BmezpcGo3kcKkoqqCJqCHXW84tydHhUlEUQTFEyedxqcgKuBqqPu9Ir5DyowQSVVPyOVwq qibICpBNV3QL6SYVTdAsyfQ5V4YpIr6NioKI1yzT53FJMc3zuFQUE1FqGT7vSK+Q8qOkHvc8Lj1E vppB7I3ocRmeQ1RZPT0uM341DNPugmKRUJ0w9G5hjm+HYUS8HboR8Xa4hfSkRySG3g5YxUNvh1tI N2lYEW9HiKKGnIdRA0YX5zwVYUMQ8/QAViQZbX3YA9iI8gD2fscewLgO+cviASyLZiIP4AZRLMbU cOZFUmIysiUpEzIyISlzSpLRkxMZCUiqAyWM9NSNEhZ6GoeYOlNShZ5CKImkp0BKwvQUTUtj+ZFs NZjfT6MRUzQJHDhw4MCBQxAaZ3tqtF270YhpBHoa8wxcOD2NIzpFUlIIPVUoqTMx1SmpJz0slNSH HnZK8iYpASU50ZOYkmxJSk9GJiRlS0ZikuI2Xs3Zpqb3bcvOXZ4vz5623dU9fyCcm+sqBL5CVR2L nsTR4lxPpPfewX5L0Q+Q0HJvfOA5Ot37HNyiIh2dWuzIdTjWnedIdf8T24+qJdg0eF1BZdqz6xFx 01ru9yNo2fUvI1ffioq7h73A3ro68i9UVL8dO9tG/vUPUT5j35M4fX/41xEvaOCOnaX+q3/4n28q eb09/OZ//nC1v+TUb326e+XXn1Zxwnv0zae/Xum2fd7AQe7fq4YwBB+5f3dc6hgiJFIee9hBsUYA RuIQiP0N2QJIuu6MjPEpbW9J1vCXtjMmqy+m7evJHLyTuJLGiA0KnqoxHWEbrXqsrsZjZMxhijkJ Yk6xuBM45usR8+VjfLU9b9maC0fAWbbWsvR1wFe2+qIX8qytsaSGHGurL9hhv9pa20G6zWZH3K1s R8yNkjwQYxvGD1Tf5OvqUaupgq5rWlkxiVuo+92wnRbBJUxXIJKkbjs2Ylcl7+sqcTpTdEWh6kiq oCh0M06BiT0R3a+W46roNKGKjjsjRuN+XSXeaZgUr45LrtsO3aFcHGkfd46x+88GOEGXxOEFei42 N9AzSfiBHkvAke3pNms2lNusJJc1VSV5zzXBFCUTf88j17rbvCyYuqVjnIolmLKOaFAUQVZIWnRZ FCAQLV2kSIKkqqhMVQTLFDVfPUjTTrKsu615RR5WTRAtKVhokxLDC7C2957HUkiT7mcqdtejJpDq DnDWPnaqiNhglM+U0YCZesjFzv0ZvpIq9t/aHnayrGqJg2ymgcJ1DoVAfKXL48OTTPq+TbmRU9+3 Czfq1v3GZEUh3W8oVhTNABuavPs0cA4Q4Bwg0OTdd4FzwAXOAQKcAwQ4B7Y4ExzgHCDAOUCAc4AA 58AWZ4IDnAMEOBO2Gu/qa1HAmbDVSF7ZxQJnwlYjXRYoFjgTtjgTMHAOEOBM2OJMwMCZsNVI1x4L BM4EApwJW5wJGDgTtjgTMHAmbHEmYOBM2OJMwMCZsMWZgIEzYYszAQNnwhZnAgbOhC2uUuDqNQyc CVucCRi+90PR5BQA34egaIoKAM6ELW6d504aGDgTKnGgqfjAmbDFXRm5Z28jRS4tENiZ8LjyIRYH Hks+JOAAZ8Ljx4fEHHhs+JCSA48BHzLhwLbmQ4Yc2KZ8yJwD244POXFgG/EhVw5sCw== PtSBA43Minp2vzH5UAgHGocVxXbfBc4BF5q8+zQ0c9/D0OTdD0PTdnwbQfXo9+Eg+LXy3DACtLjz STcUf9vuJ3embruFtPjcfichwMLc8P7nSNtJW4Y2n/khanHxxKabluCdu5snFlHbP3wmWcstO3eh Ng8e30At/v5PbnKEzz/+0+9R2xvHD6KWayYmCDf6ZFsHavPnv/0QtXj/726Khgff/P0+avvD3/4c tVwjPUIISAaHu6jNv30FLT7yEkU8egRtf/U31PLdihkdKpBK8kiQNiOTW5CWI9MMVSZ1j5PNIrJN r2WSjmgPE8FA6mZkTo1Qyzht0WZkIowQA0rdp+/+sUJmj3DDX3/6x4h0HFEMWPn3j+59y5I7BuDh tzgpSKkqgzEDfv3XfzCR6hD8j7++ea6/2oxofboLM4CVVJvgr//r14G8UH6+7tp7+hcxGOC1G8gf FWDBnom7H8VhgNuuP89UoNVS/+YHNXPZRALkozrXHTkfdj7dfe7Xn34bn1ZM79f/Raer8Q3X2Tf/ K+Zo0e1SSXP8w/XL6ul2arT7j4/uTuwJsoEl6U91eHDvg83+ABtanuxkSD1UFR59++lbywE27Gyb fOMThnRM1eDh124GI5rY+6mI/Z7kUep8siVbYmH2fvLGJEVuNsQicu/7yM2G2CC5OANVBsQScjuc ycCWB4sF3FxZmAds2bhYwMnYhQeMLScYCzh5w6BZxsxkLGBnL8OsbZtny4/GAiSHGmbtcyd+dz8b HjiJ3whrN//092x4gJq9//sTz+3MmLWIuX//0yYeM+bUc2zNOmPGnACPDZwxY07DxwYk+14Ozb7H m+XN1qXZLN8y93XIdE1wX96MVzBnqcl2vXUXxox3h/u/I8t45nvZPNnLctp5czon5HSqgTPYz3M4 g2XHBd+JMTMuPPr2v+njeFYnUTRgm/u90zhb5tba8N0X3oC5wl4KEdIm9uu//HT4GUrgQ6Lp8ltJ xWgHsLzX7pP3Wp9OLPS7ECWdYhVFKjaAEBmSpVOzIUrkzYANUSxw2ZBY9I9WJ+xIqaiooPwgbOg6 +2aydgOZhQNseLo7WbuhDMRR7cbVhEVkKo5o95cx9Xa28rKqUnSnrWVkJphR1eoohRkJBlKZFMNE hc1GMCGVTY0NCvcJBi02KMeB1AlWpTuLzv3Rg2+/+tvH7Bp3h2DKQhBKZ421+P8Nhgd2+4BNsGPP +IIykXiGki8+/uCNTTCTsFszbIKJ9eXuO7/7E5Xt2jbr/A7SWCcx6ji2ouF5yvzkGaHmcbrrZMYt Yi370X4ve7ZjMvsRQ1rsqi230KY9ysCX3nboy8adoTkyCcRP/S0ppmpBTldJlhUDZ8hVNFnT6Rzg piZaJvwLiXJV+OClzPWnmZVkSRAV2ShrkibIlqTh5LlOoWpBVlzLKEuiIhi6qpdVA5IoS0bZlAVV V1WvYLX0lC4Jko4IcMtURTAtVfPacQpcbOgpt0zRBc2SzbLTjKahX3TRdHG5BegplyK30OuK01C4 c9nmB5ch+3DTMTCcLlwERmn0rIrOHx7JK6o4Jrc6VpLxq2MlGccQpUl5VnxCccvNB02yfWedFVpD vDIkyAqtR2WFdn/GWaF16n+WrNCSJReRFfp7Bu+j+pOUKyT2ttruPMmk49uRFTl1fFvwoT59b0xW FNL3xmFCsd13oZn7TkOTd59Ak3efQDP33YUm7z6BJu8+gSbvPoEm7z4BzoGtdEwomvbMoMm7T6DJ u0+gybu/xTmAocm7T4BzoMm7T4BzoMm7T4BzoMm7v8U5gIFzoMm7v8U5gIFzgHOgybu/xTnAOYCB c4BzgHOAc4BzgHOAc4BzgHOAc4BzgHOAc6DJOcClY64l4xzgHGhyDnCrGedAk3Pg+ygomqi6QpNz ILL7TcWEJudAle43CROanAM1u//YM4GRA48rE9i7/1hyIFb3H0smJODA48SEZN1/bJiQpvuPARPS d39bMyGr7m9TJmTb/W3HhDy6v42YkF/3twUT8u5+IzOhPn1vWD7Uv/uNw4Si+k5Dk3ffhWbuOw3N 3PcANG3Hw9Ccvd5GwBb/241FnmFKZC9wOsmInLJtJxC7kxKZJEROlRHZTYi84GVExvmQF3BC5ESB 4+l8yP/XTYgM6ZD/L8mHnCDKvT8dspcPGWdDxumQ7ZD8ceL8B7Mhe5kJIBmyk7N489hQO3tSArZk yPf/+8Pf/HS5fw9j9mbGXMgPvv3qi7+8tTnJlryZORXyo4ffff3pH0nu5pq9j5MJ+eG3kLq5ZnqO uImQcebm2rlEkuVBrtps0jTIVZtNngW5WrPJkyBXaTZFDuTKzaZMgRydVyeXDMj5JEDOJf9xPumP c8l+nE/y41xyH2eZ+pjKDJdZ5mM6jV12iY/9OfcyyjyYT4JAxIKf2yzIMpuhx4IsUy96LMgyT6SX 0DHTpJZuYs9sMx7byU2zTRfq5FHOON+xnS0020SsznBlnDXWHq58cijnk+GWt9rUreYxs7y3II83 NpfVJZ+VMJ9VO58dJqfdMJ+dO59TRrYnIvdQmN3pjT7AZnbS9B+2szoVA6meYJDRCT4gF2RErJ/U TIS4MKnZ5GAOiluZpGAOiYY7MsjAHJ3SOF3m4UoZjVMqCColNE6Rd7haPuPEaYerpzPOKZtxsmZr 6vSS5EhmyGUcO0UyWyrjmBmSWTMZM6uKv4+VyJhSa1dv91GsPMaOCr56GmPQwn8SK40xMRdUVO3j LMbYYhAvizGYNvxmiFASY2zdYNPq+9ulTCbhHMa2JSauhYc270SkME5qNaJNUeEMxsktXJ7ZLPME xqH0xcXlLy48e7GiCpYE+VhlS5AMRcHJd91C0RBMQ9LLkmQIuqpDWlhR0EVFK1u6oKi67BWslp4y NEFUVcsr0wzBMHTVa8ctcLChp9wyTRRUA2F1mtF09IsqGy4utwCS7zoUuYUe1U5D4c7lkL246RgY nb1YYUheHMUqujgeszpWkrGrYyUZwxClSVlWePJiXSSDMDA6K0kvrr92GxCK5YGpm+vrS5tr1+Ax /PX8xvrs5tr6a1BgAfJrN3/iFqBmg+tHaJhzS4+sm2XN1CqmR3Z/3mbpkb+v6ohUCD25Qhqvq23N k/Qd36asyKPj24UV9el7Y/Kh/n1vKD4U230XmrnvLjR5911o8u4TaOa+u9Dk3SfQ5N0n0OTdJ9Dk 3SfAObDV9PEqCDR59wk0efe3mj52EQHOgS2eHplzAEOTd3+LcwBDk3d/i3MAQ5N3f4tzAAPnQJN3 f4tzAAPnQJN3f4tzgHOAc4BzAAPnAOcA5wDnAOcA5wDnAOcA5wDnAOdAk3OAS0acA5wDXFPa5Bzg 9gJuNeMcaHIOfB8FRRNVV2hyDkR2v6mY0OQcqNL9JmFCk3OgZvcfeyY0OQcYu/+4MiFW9x9LJiTg wOPEhGTdf2yYkKb7jwET0nd/WzMhq+5vUyZk2/1tx4Q8ur+NmJBf97cFE/LufiMzoT59b1gm1Ln7 jcaHorrfCHwouuseNHPfA9DMfaehaTseCU3b8erQOD1ljDBuBzvPKsI5ac4OzJ5JdmQvzjvJj5xB dmRfTHo7PzKVHTlZw774+U5+ZCo7cpIA+sFY/3Z+ZC878s8TBPsPpUd28iN72ZHtxATs7dZMj+wl UWBPeMCUHpkkfGBPzsCeHpk9kUSs9Mh20oua2Tnip0dmyCSSID1y7awnidIj18rQ0kTpkSMT6qRN jxyZ/CdteuTIREWp0yNHJlVKnR45KgFUBpm1IpJVZZEFLJRYK5OMZaEkYLkkLMsnuVouieDySVqX T4K9XJIB5pO4EDHg59knWcyOAVRCyCwZQKVHzjZ9J8mKmnGq0Yf33nsBt5ppWlQ36XKmKVyppMtZ tsqTLm+v5MDbqdV8Exk3/FuQT5r0fFK655N+3t0LstxhvETGme6G9mBlvHPf/x0erIxPGZ+/M9/W msOJiLCVp0fO7QSfZ3rkzCWjfKS4nCTOfKTjnCT5dHmMK6dHTpHHmKdHZkqPHK9ZxvTI8bIuP2RL j4yzLrOkMXZ6/2um9Mhdp0H9zKKDxFrdf19hyTpMVOV//PTr7yprtZ02QQN9urvEotgGtf7k5lt/ +eKrbyvzwactr93mDmyC2NO//NPffPjfWA0fbjmJZh+3+3T70LHNNz74+AvbqoEbxzaIpFYIwoZn frh/4vLdd373J8dk8t132F6S3GKyg1iM2jqG54m1CJt3iG3nveTWHdLwzl27237kmqLefhvsUIup LFGkXZ/ZjNjMUlrNvJaJie/ZZ4l9L8v8yNA4e2uFp0dWTcGwIFWsqgiipsk4u69bKEuCoSlqWVIk QZNNpayJqqCaGiqRIFOw6RWslp4yTcGSdarMkARdM2WvHbfAwQY5gZ0yXRUU1A+3FRP9IFOY7O+Q 2tclx6njUmw3Eu5XDpmRm4l34aTIlZIgR3GFLo7Hl46VZJzpWEnAG8jVnIg7hec/1pQE+Y8lsUIC 5HDKY571ODY0le9QSmeq7cuT9B3fpqzIo+PbhRX16Xtj8qH+fW8oPhTbfReaue8uNHn3XWjy7hNo 5r670OTdJ9Dk3SfQ5N0n0OTdJ8A5sNX0YSgINHn3CTR597eaPiQRAc6BLZ7zl3MAQ5N3f4tzAEOT d3+LcwBDk3d/i3MAA+dAk3d/i3MAA+dAk3d/i3OAc4BzgHMAA+cA5wDnAOcA5wDnAOcA5wDnAOcA 50CTc4BLRpwDnANcU9rkHOD2Am414xxocg58HwVFE1VXaHIORHa/qZjQ5Byo0v0mYUKTc6Bm9x97 JjQ5Bxi7/7gyIVb3H0smJODA48SEZN1/bJiQpvuPARPSd39bMyGr7m9TJmTb/W3HhDy6v42YkF/3 twUT8u5+IzOhPn1vWCbUufuNxoeiut8IfCi66x40c98D0Mx9p6FpOx4JTdvx6tA4PY0RZpxnPeZZ j7/nWY8DDfOsxxh41uNazfKsxzzrMc96zLMep2+VZz3mWY+/51mPedbj73nW4+3WKs96zLMe86zH POsxz3qcr7TBsx7v4FmPMQ941mOe9dhtlmc95lmPCRt41mPcLs96zLMe86zHDcI7nvX4Mcx6LLFl PaYHXrTXooxeI0FDs0iR0ChJsqBLBp4t+LuqCaieWp4vPXW8Em+7+tFoGSIaDo+PXWNjo6urdzaO Xbt9Hir7OXbHXlD9qZthKqdN3yzpWlnTrPKZMuq2ooTyN3u/w3dSh/xlSOCs6pqRKH9zI7g0pXS0 yoSw9DRkQlLmZCQmKVdKYtFTB0oYSaonJdXpqT8llegpipIwPcVSQhNTNCE2cGI4cODQbNBQ60zj ENM421PDHiGKJaZxTnqVjp31p6cKJXUmiYWSOtDDTkbeJCWjJFuSUtKQCVWZ01A3iLZ72FDDRuEa XwgQs0uFR+jLSBjA9vOjtt2R9iTfLSMb4OrS/HCUUat1l+/6EIHPP/7T7965G2Gtww== hkn6XpBtivv7/S8+Dl+wIdbR8IWfR8TGGLg545poIy8H2Vdi2n/Q6tWuZieGuy4f/OyldmK/Z/Av ePjtvf/4GXGiaNnVXtvJ4dF3jidH6zPDP/1LTU8L150EXJS++K5GbddTiNVPynZXYvZXI65ozE5z xHmxdc/Cu/8fi8WfuM/FbJ2Z9u8+fxvRjt2nGPxmHn79l58O7W4hDjE1/RWw1wvMmpZde5ff+rQW OZ47S+vT/Vf/8D/fVGv/0QPKT2Vn28i//qHafTBwlviF64DSsutfRq5WvJT26OF3theE8zqh97rC zThsjf/iL4H7Zf7reQ+pdxvM7L/5aeiSm3dH0Fs3HPv5saH20E0756IitSpRhvEIpwCyjnlrXk2L d2BFZTBl+9br9Dbq+LZm16Bc8QP5L2xXlkVD0HQFG8ksUVbArOOWKToqQx8kyxR0TVJRiUSMPZJp 2EY7pwQsloYu6GA9cWvpBjH8eS25JQ4+eM4t1ETBtAyt7Lak6YgS06TwOSXwnEuWU+hS7jQU6l62 1mURm8WakIfMVuYo3lClMbnTsZKUP+jJhBxCTybjUfG2ZiOJrVmOb2smxlpicQ6abNOaa2VJqmqu 9X7n5tr6S0zpaciEpMzJSExSrpTEIqk+lLDQU09KqtNTf0oq0VMUJWF6iqWEQONQstVgxGw1kuWC AwcOGUJDvdqcmEhowI2yEehpnCNN4xz2KlFSf3qqU1JPelgoqQM97GTkTVIySrIlKSUNmVCVOQ11 g6rq/8fCXBt4oIa5NmDfrWGuDVwJrWWuxfdS3Vu5tc2138DVYNt+xWCuhRu69vVsJnMtviOOzbts 5lp8UR8iNTCaax37K2tYC2J/ZTZ52vbXZ+fe/rw2La79NV71mMTE7GpMRsYdppiTIOYUY7iXTu62 uwbYqhfOPXPtTv/Lx2yu3cHNtdvLXKspgiHqkt/W6BY6JjBZVQXDUilzmqwogilKis+cJssyKjQl qpqEqlnYvuY05ZZQpi2v0DWAuU25NjIXI2VM8whzq7nEu02F+piL0bZZOcluuo3iEF0ck0fo0aRc Qo8m5RN6NCmntqkBV2kwA65mVjfgur83lQE3gcSUB1XpyciEqszJSExSrpSw01MHMhjpqScl1emp PyWV6CmKkkh6iiVmq8E05FsNZsBtHEo4cODwGEPjLDWNtgI3CD2Ns2s31JGmcQ57lU6e9aenCiX1 pKcmGXUjKRYl+dGTgIw8qEpPRnqqMqehblDVIFDdHNASacCtVJmKuFrTlNFCh30NGkqiDLidVOxZ 2gwDUWf9lhX3Up4bANcf+tZvEvIlw/MZcMkT7/sMTq0/aK+c5Q6e8IVqbtnV/tLPPqhyXdEfL3pn 2/jP/qN6ZjYqEjaJgP5ddcujF46bLQy7Y+pjjbJvGxJZjaC2mZL5iqt935Y19YVz3zZe9XjExOxq TEayDpMTup4pDP6jb9yY9CS+fdV43g+/+Z8/XLWDzddMFggXxv/wryNuwi47Y2F0BG5yHf3qyL+4 4eFJ0si/fBFObulddqffbvyy/vQ3H0YacCNyVZJg2AHHD7JyRF3Ut6NcRxpwo2Nbh5xWnFWvYtDq pjLgKqIoKKJk+oxqXqFrBbMkQbFE2lJmojqW4bc66pagigplZpN1UVAtWaZacktoq6Nb6BrA3KZc I5mDkDY6umQ5hR7pTkvhHuZhvm1SPjIbbyP5QxfH41DHSmIewaPJuISeTMqnbWq6VRvLdCsZVlk1 9fKZsoRePkUPx0p2K+DvpJL9D4P1VlIsRfebb9Ot5BziQfhEUjRFzQic/40AnP+NAHwICgc+BIUD H4LCgQ9B4cCHoHDgQ1A48CEoHPgQFA58CAoHPgSFAx+CwoEPQeHAh6Bw4ENQOPAhKBz4EBQOfAgK Bz4EhQMfgsKBD0HhwIegcOBDUDjwISgc+BAUDnwICgc+BIUDH4LCgQ9B4cCHoHDgztXFAr9iUCzw izbFQoDzgQvEdQPnpnLrLt+F57pB225yv7v1B+UD1AXtusHC3IEyZF5v2dW+9Prb7xUAb7++hLNy 7x56/c+f3SsAPvvz65BFvLVt7u3P/vmwAPjnZ5D1fAdzTIjMgQSZAALeK4qA9zgBnABOACeAE8AJ 4ARwAjgBnIBGIaDgY3nRgknholnhwmnh4nnxCoqiVTTxQ8JJiqlaEIBJkmXFwFHMFE3WdDo2nKmJ lgn/QjAzFT7YYc0iwsTJgm5ZRllFLWz4vmuCqolyGUpk1dKgBH2R3J8h/JVketXLV8l3SbUs/F0y pUBbVIlOHne+o+dERCJpgyrUTGjHadRUSC0PrVOyCqRLgcKrpD+EeqfQ66HdvK/Aa4ziy9VM48px lrOxPByCLjL8HMUNHHmOZkF53l/iEDTvf7RCsfN8wRHeVNMNwJZT9DVTRDzQcPQ1vazI4ehrbgUS fQ1Xsv9hib4mS6JIRV8rQC3fxOCeu4ompBmBs50DBw4cOHDgwIEDBw4cOHDgwIEDBw4cOHDgwIED Bw4cOHDgwIEDBw4cOHDgwMEF7lpZCHB34kLA4Xmht5Van9j9bBGXtZ7d/UTrjpYnnjNmi7irNms8 90RLy27jtV+9W/+beu/+6jVjd0vrs4ff/OTL+l9U/PKTNw8/29q6Z+HdL7+r/z3N7758d2FPa1E3 Zck9WY6dY+fYOXaOnWPn2Dl2jj077IWeKgs9URcrTRQrSRUrRRYrQceP9iFakoijTYiaKuLYEqIp ynBHn4r2YZmiYqEPlqiZpoxLVEkyI8N9SIJlSHJZ1QzBgMc3SAQJRdcMr3CeLoTAD6KkQ6H3eGQh 9fhFtuANEdRAvIYIeuhiCjndSIViXyNFx3KwSN8HRmcl6cX1124DQrE8MHVzfX1pc+0aPIa/nt9Y n91cW38NCiQNsF+7+RO3BLUbwVCa4WKmk0iSLMEwTams6ZIgKYoCAzWFZ+ud7ONRKLKEBlPH8Sis sqKH4lF4FUg8ClzJ/oclHoViKToVj+J7rsysL4SPBEVT1IzA+d8IwPnfCMCHoHDgQ1A48CEoHPgQ FA58CAoHPgSFAx+CwoEPQeHAh6Bw4ENQOPAhKBz4EBQOfAgKBz4EhQMfgsKBD0HhwIegcOBDUDjw ISgc+BAUDnwICgc+BIUDH4LCgQ9B4cCHoHDgQ1A48CEoHPgQFA58CAoH7lxdLPArBsVC/Lu5HPKC HUWnmt+xo3XX7rYibt627d7VivH/oHxgroiLx3MHyj9AFLTsal96/e36X7t+7723X19q39Wyo2X3 0Ot//qz+t87v3fvsz68P7W7Z0do29/Zn/6z/pfuHD//52dtzba07WvcsvltEzAGIOvDu4h5MQCFB D5ywB5wATgAngBPACeAEcAI4AZwATkAjEFBMMC4nHNeOouJxORG5dhQVkssJylVYfGM3Lldhgbnc 0FyFKUg8FUmxED8+mKSYqgUBmCRZVgwI7SQpmqzpvtBOmmiZ8C/6xVLhgwyfIsKDqaoqmJasl1VN F0TJ1CHOE1WoCapummUoUVVZxSW4mqoqXh1cslp6SpHhQUSCW3iVFCqqoniFiqx41XD7VIlOteYU mrIgaopBWqMKdVHRyl77pkKqeWQ4JavQKYdgp/Aq6Snpl1Po9d1p31fitRbk21UcAk0sH4NBMlRR w/G3dMUyTRgkzVRNEYJsaegJHJFLMmFU0AdZNExVgQ/2KI3yccl0XG6xhKbzMdfheMeKjye4eN5f 7BA472+kQrGvkaJD05mk73ec4HHZh3WDGH0aDusGox8R1s2pQMK64Ur2Pyxh3WTJosO6Fb2YNx24 h8qiCWlS4JznwIEDBw4cOHDgwIEDBw4cOHDgwIEDBw4cOHDgwIEDBw4cOHDgwIEDBw4cOHDIFbi7 ZlHAHZWLAofthV30wve8Crvohu+5FXbRj9zzK+yiI7nnWNhFT3LPs7CLruSea2EXfck9X46eo+fo OXqOnqPn6Dl6jj5X9MUeNYs9aBcsZhQsZBUsYhYsYMcPYyJakogjZIiaKuJ4GKIpyhAjgApjYpmi YqEPlqiZpoxLVEkyK8QxkXQVwjQYgiFLBkRvgHgTmmZRhfN0IQSSkEUJCr3HIwupxy+yxpIIUQNB IyLooYsp5HQjFYp9jRQdS8IifR8YnZWkF9dfuw0IxfLA1M319aXNtWvwGP56fmN9dnNt/TUokHTA fu3mT9wS1G4EQ2mG36HiVWQVbEUWtPKPS7JpoPmll1ULfZcUMoMkWZBEtaxJusvr4+4cTof4PPAP 0JoCQoPQmoIl6yag9cpkVGbhkCiypQqKaBL6LEW0CyXB0FUoFAXF1EmhqaFCK6IMP62jQkUhhQHU V535TV4uyX65ogYkerJ19cuCoumSpXoTq2tsbHR19c7GsWu3z0Nl/xTyv8YR71LUsKB3JmJgOlaO ZkeXN7U10z/zspxziqLjbtidk8mck3CH7a7JOcw5RbYE3bLxoglG8CqagGMKOWVXnTLDniGaScpM QYbIN3gmSYEyPOXsZ2VUpqp2oWaHCQpizmDOGYKom5qpZDbnooYF5lx4YKrOubh0hedcZrMNDbqk KWVF1tG8gxVGtOwvzuxCmyvFFFxZEanK+ItXWQ9VVunKKlVZClU16aqmWxX/qMrUj/gL/SNNvuqR H2/bMSK3HXgxQnPhjn1yyTYwkqxCaC0VB0ZCHdFDgZG8CiQwEq5k/8MSGEmxFDowEoGiTUHNBWEh sWiKmhE4/xsBOP8bAfgQFA58CAoHPgSFAx+CwoEPQeHAh6Bw4ENQOPAhKBz4EBQOfAgKBz4EhQMf gsKBD0HhwIegcOBDUDjwISgc+BAUDnwICgc+BIUDH4LCgQ9B4cCHoHDgQ1A48CEoHPgQFA58CAoH PgSFAx+CwoEPQeHAnauLBX7FoFjgF22KBR/bi4pCgKP8IWjdtbutiCAMbbt3tWL8PygfmCsgCsXC 3IHyDxAFLbval15/u4AgHO+9/fpS+66WHS27h17/82cFBCG599mfXx/a3bKjtW3u7c/+WUAQlof/ /OztubbWHa17Ft8tJAjN9w/vvbu4BxNQTBQcOwwOJ4ATwAngBHACOAGcAE4AJ4AT0BAEFHwsL1ow KVw0K1w4LVw8L15BUbCKJn6gSEkxVQsCMEmyrBg40pWiyZruCxSpiZYJ/0LAKxU+ePHO/PGnFEMW JMuSy1Bvw/ddEVRNlMuKIQmGakEB/uz8Wl4tPSVruLaBv0MAPU0SdNUileGL8yNpiipRyeP2d0VG xCMKnTbcQs3Uym6jiiyRWi5at2QVKLdpcwuvkkIg3i1z++e07ivw2qK4QgKyZRV5jDOcheG3WKKK 0qwjEeloDpBodFTnbILmfY9WKHafLzqMqBdrkYT4zD7yGoyVgiOvAZMiIq85FUjkNVzJ/ocl8pos WXTktQL08c0N7qmraEKaFDjnOXDgwIEDBw4cOHDgwIEDBw4cOHDgwIEDBw4cOHDgwA== gQMHDhw4cODAgQMHDhxyBe6uWRRwR+WiwGF7URehyE2o1id2P1vERbA9z+5+onVHyxPPGbMFXIRb XJg1nnuipWW38dqv3i3gIuC7v3rN2N3S+uzhNz/5soCLkF9+8ubhZ1tb9yy8++V3BVwE/e7Ldxf2 tBZ2FZfcxOXoOXqOnqPn6Dl6jp6j5+hzRV/sUbPYg3bBYkbBQlbBImbBAnb8SCOiJYk41oWoqSKO bCGaogwxAqhII5YpKhb6YImaacq4RJUkMzLUiCSohgjBGTTBgMc3SPAJU9eownmqEEJE6KKkQ6H7 eGQh/fhFtuAREdSQeBEheqhiGjnVSIVifyNFx5KwSN8HRmcl6cX1124DQrE8MHVzfX1pc+0aPIa/ nt9Yn91cW38NCtBIIuzXbv7ELUHtRjCUZrhoT6JsAqaIMKeoaSSXf1ySTQWxXBc0HEFFsewviMvH yQM6/QBUVkSqMv7iVJZCVVW6qupWJT+a9I+m+2M8plqRTJVQz0KMvWO/l9mG/VAME/FMxWE/UEf0 UNgPrwIJ+4Er2f+whP1QLIUO+0GgaEVnc0H4CFQ0Rc0InP+NAJz/jQB8CAoHPgSFAx+CwoEPQeHA h6Bw4ENQOPAhKBz4EBQOfAgKBz4EhQMfgsKBD0HhwIegcOBDUDjwISgc+BAUDnwICgc+BIUDH4LC gQ9B4cCHoHDgQ1A48CEoHPgQFA58CAoHPgSFAx+CwoEPQeHAh6Bw4M7VxQK/YlAs8Is2xYKP7UXd scUxrBC07trdVsQV47bdu1ox/h+UD8wVcMd6Ye5A+QeIgpZd7Uuvv13AFfP33n59qX1Xy46W3UOv //mzAq7Y3/vsz68P7W7Z0do29/Zn/ywgxMDDf3729lxb647WPYvvFhJi4fuH995d3IMJKCbGgx3k gRPACeAEcAI4AZwATgAngBPACWgIAgo+lhctmBQumhUunBYunhevoChYRRM/DJqkmKoFAZgkWVYM HK9K0WRN94VB00TLhH8hbJUKH+wAVqEoaJooC5JlyWWot+H7rggq+lbWREkwVAsK8Gfn1/Jq6SnF xLUN/P0qfJcEXbVIZfji/EiaokpU8rj9HeKViYhCpw23UDO1stuoIkuklovWLVkFym3a3MKrpBCI d8vc/jmt+wq8tiiuXMUh3LKKH8YZzsLwWywx82jWkXB5NAfs2Hde52yC5n2PVih2ny86SJ7phl0j Yeyyj7wGY6XgyGvApIjIa04FEnkNV7L/YYm8JksWHXmtAH18c4N76iqakCYFznkOHDhw4MCBAwcO HDhw4MCBAwcOHDhw4MCBAwcOHDhw4MCBAwcOHDhw4MCBA4dcgbtrFgXcUbkocNhe1EUochOq9Ynd zxZxEWzPs7ufaN3R8sRzxmwBF+EWF2aN555oadltvPardwu4CPjur14zdre0Pnv4zU++LOAi5Jef vHn42dbWPQvvfvldARdBv/vy3YU9rYVdxSU3cTl6jp6j5+g5eo6eo+foOfpc0Rd71Cz2oF2wmFGw kFWwiFmwgB0/0ohoSSKOdSFqqogjW4imKEOMACrSiGWKioU+WKJmmjIuUSXJjAw1IgmqIUJwBk0w 4PENEnzC1DWqcJ4qhBARuijpUOg+HllIP36RLXhEBDUkXkSIHqqYRk41UqHY30jRsSQs0veB0VlJ enH9tduAUCwPTN1cX1/aXLsGj+Gv5zfWZzfX1l+DAlkE7Ndu/sQtQe1GMJRmuGhPomwCpsjlH5dU SUEs1gUNBknVLfsL4upxTItgUvMMV1ZEqjL+4lXWQ5VVurJKVZZCVU26qulWxT+qMvUj/kL/SJOv 6v4fNZpczSM33lhJkWMlIQaGxuuO/bpnG01ENq2yhqb7mTIaV0UJBRPxfofvpA75yxBKREXvHxVJ hB224kAeR49YBORHVXoyMqEqczISk5QrJez01IEMRnrqSUl1eupPSSV6iqIkkp5iiaHpKZoQGxqN mKJJ4MCBw+MPjbPUNNoK3CD0NM6u3VBHmsY57FU6edafniqU1JOemmTUjaRYlORHTwIy8qAqPRnp qcqchrpB0NnNp4N3sqRFA6q680kqOnnb7id3tlZ6omXnrt1tP9o/7EZTX5gb3v/DZ6KfaNn5ZFvH 8PyJzbvvuCaSd+5uHD+Inti1M/hA6662zonLd9/53Z8+/tw16Hz+8Ye//Tl6oqPNiWPuNP303vHL b3zw8Rf3//7NA9f89OCbr/6Gnrh7eXzv0zvppvf0L999/5P7qOqjRxTbHpEn3r97usur3/qD9vHN tz66982DR2FGwxP3Pvrl2W6nfsuu9pd+9sGnX0dVJk88+Mdf33Tr72wb/9l/3Pu2mmnw4deoftfT 2JTyZOfl9+99V6lpt/4vT++FOPc72ybf+OSb6rVR/X98dHe8bSeivOPy+/cf1Kj9/fcP7r1/uWNX S8vu4bsf12wc9febj+8O725pbZt75/PajaPmP39nrq2VOU8DSasQt3o8YmJ2NSYjWYfpazJM9iSo 0fyjbz59axlPAphidz/6R8X5iNv+5n/+cLUfTzE0Dfae/sVHVabkowdff/qHfx1psyd869Ndp+/+ 8dOvv3sYheERvB5vXR35l13O+w1v6uZbf/niK3j5/HXRu3T/k/fvLvfTbzd+WX/6mw8//ttX1Jtt v9sfvIFfbXrtQEtB+9CxjZ//9kNq3SArx93LE52BhQMjeOaH+w8e36BWJXtd6mh7MrQsIQRofURP DFMZJMiqF17DqCd8+R6qrqn4iZaQJTMNJLCCOqbOih/If2GDp6JIgiJKZlmTNMESZRyk3isUTVSo g2FLFhRLlFCJIsiKppYVCdWxDK8AQveLoqCKiuIVypYkqJYsey15JQ5C9KBXiPCYlqGVvaZkU9B0 0/QQOgWA0CXLreWS7rYU6uFqpskSwBD241KT8jGcAyHSktexEskfujgeh9CTSXnUsZKUSwhpUj4V bljXjCSGdTm+Yf2O83/GFnb8lkmqISgSakgWdcGQFR1mkVdoaoKBuupaxhfSoz5PZrSk6qgSesjF AYgVHTUhwfSBhCK6DllBvEJZEiTDMHAhIhHNOjSr0DyTTZyFRNJMQUS0+Su6hXSTqolmp2R5yHFh kCKSA0ZSFUHULbMsoxmsabLhZ5EIH2TSgoYqqHRNXyGqaWma5JBvP64ICJVJCh1EvppB7FcdXxey 70j2vhM1h6Lfj65+QzA1NHaS9y50jY2Nrq7e2Th27fZ5qOyf9f4dLmIxipxGdDE1kTpWjmZHmf0+ 5uneIKHNXjbE8pmyoka5N3i/w3dSh/xlcG9QFEOM6d6Qn4Set1qgDiqIBCji4kqDghFRehQ1EWWF ogqibFFEIsoDxVYd1fiPE5atetmnOBaOhWNpQCz1WWHqtlrmiqjOu1hOiCL3/WwRVUKRIaLqKDJB xIIiJa5YKBIgStA+OzrGFoJa4mqKYTDk7SqVdu2soD8mtrtO0+x8DvICh5XXrbuwuW7j3/5t48Ti 3HBYG46NbmCh+8///NPv33snrF7fCbaB98Eo97//+/f79z539PVUhe6zvwTT2sNHCB7aBoDTxNrl VHjzr7T1AlsUfkEMXDuw+QFV+NpvrXj0wLZp7cAGudO/DFb4nlhfOp/EMTieGf7pX/4Rtnc8+uaT NyZxIzt/ePw3X3wXMR4P7v//7Z3PbxRHn8Y9g2SjEOaVbKRX3JpISchKaepnd7UgK5Hsi2RsvUQJ vmSVrCyYZJGMvTJkY/4Gaw9cctwILo5Wu+bOnnLmtDlE4Q8wuxY5RHkPSIDDVvXv9rRh5ot7Gofn s6vXM19X11P91ExsVzFPJVs4ncPvXv3h17otk3RPaOI5e0jJJtPEczalsrPD997levH56qO0eJHK C0f64rvde5Msc2zvfbFs42zPrbCdYvrrd7+KPdL6Da9kkzZ/Ge7e4xrY9a1ua+3UbSOXdrIe5PtR 1X3pfPMq3opKt6Dq96vc7tPeu075htPzNprSPaZd/20Y51YR15FvIs49oZUvFTfxymJedItnSoce 19KPjFuPV9wPQmU8t1QZMvdRs6xyya2TRr7iQamVlL7mTJZ6yiuZYHxdVgy4L2UQeXlPQWhvISzr ZRV3XT6svFk+9LyngTtsYqvoNfVx6K2iWn/K5REdspcSPXJX0lxywyX61PJWkWYBZadIjr5T1ODH MZMt2dC6K+zcKsV8+71kz0YHvo6UKIrJZlH9Yrx7hb7sgrxhnrBj/9xzLyM7mt0L8vn346dJm/TL MGeXhwHf9YnD+p8foMSuX0DaHs6BAY7RgGk0YBoBmEYAphGAaQRgGgGYRgCmEYBpBGAaAZhGAKYR gGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBp BGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBGAaAZhGAKYRgGkEYBoBmEYAn8geFQQm jMqzAdoe0atO2ahdh6rsN2mQVneyN32sOWZ6cSBYZ/J4OFscQLPfXJg77R2xOp1euHZ7805jbKwv nJjqTHSnz9+6v/2wMbburZ/pWZljFza3n+w0xuOtjTjIb++IvX2hSANsWOZFgYGQgQxkIAMZyEAG MpCBDGQgAxnIQAYyB0tmuAPEyTKb6ckJG1uPG1+B6vTOrN/banw9rTN1YmF9o/HVwYnuEe/0XGOL ndlapztZoXJKdzMrt40vRMfr0KMf48ClUZGLK+dCyDBORHdp5kH5PAejWWTcVxeMrtyD4lDbXUc7 hMZXRrhEetvKBMmhseVikldvK0yK0OMqSprxMEzbZJVLR98wyhehKtWWbE36odC8qNlC0ijrvFzI e8pqkR1KZNKO0lLkMxXG1yU924Jrk6unz92ZBfko09pScnfJvaS14naznksVU3S126mlfT0iAjPx UjMxeMhE3QET+ZWZBfEBE/n9ZNX5SjUd3Hy1h/pqpYeWT/5WJj9uODllYb9PHDbcE4zHBxxwTw+e OJx/PzngIG6TfhnmgIOABbJ0wEE7G5MHivzXmLYHcmCAVwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAArxr4BOjw4PPFw5MZNY4064azrKd7k93Gk6xnw+OTnYZzrDdvr4W9TsMp1tv3 b52f7jacYf1ke/PCsW7DoUtJ5hJEIAIRiEAEIhCBCEQgAhGIQAQiEDlIIuNYkRjH2spYVonGst41 lpW7saxBjh5kzCLO4sRcphWL83GZYUKKSpBxZJiM7IOIaWNEXFGcm9ok49C2ikKPa+GrQBuX7eqC aSNjitp8qRYZP5R2BPPli2uLpau/HC5ntmYscaLswGhK1ZJ0uYs9ypU+2k6ajZI7P3V2lvOL/bXr TpB5p86t9vsLy5dX3GXx08Wr/dnly/01VxDKqa+s3sgrtt8aO8t2f91gmi23ry/BRA== HGcrPR0OxNkWDZI827hR+mWYPNsw4GEpz/YZtlGGYNePsraHc2CAYzRgGg2YRgCmEYBpBGAaAZhG AKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCm EYBpBGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBGAaAZhGAKYRgGkEYBoBmEYAphGA aQRgGgGYRgCmEcAnskcFgQmjMpiZ1PaIXnXKRo0j4rzxkPOZ3lQcldRw7NPcae+I1Wk4wurOxvrC ianORMNxXA+37q2f6VmZZqPFdh5vbczNdCcajkl7tvNw8+Nj45C5AxnIQAYykIEMZCADGchABjKQ gQxkIPOHktkcx5rNzNzG1uPGV6A6vTPr97YaX0/rTJ1YWN9ofHVwonvEOz3X2GJnttZpdaZ6M42v 3Da+EB2vQ4+ec8+lUZELK+dCyNDl3HOphQ4qOfeaRcZ9td+JlHsg3KOamHthmK+M/RbXtpUJQhct XylKGUSeqzApQo+rKGkmwihtk1Uu2YGawBehKhWXXFH7odC8KLpK0izrv1IpesuKkfGVvaGlSi3y mQqTS5PubcW1KgaRFmxXxWjT2lJyl8k9pbXitrO+SxWTdzXg2FIc48+8T9z0hIrp+BiCQEbGuOnR RhnmzhrQSgfxwQTcuPmwDwQLjZLuQTo/ZzEj+zQj14Y5WKG4MjMiPlihuKWsPF8tp8Obr/ZRX610 0fbBCiY/96CpQw+kJxiPDz3gnpY1hx5kDZJDD+JG6ZdhDj0IWCBLhx60s1l5oMh/tWl7IAcGeAUA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8KqBT4AODz5fPDyZUeNIuG4433q6N9lt PN16Njw+2Wk423rz9lrY6zScbL19/9b56W7DudZPtjcvHOs2HMSU5DBBBCIQgQhEIAIRiEAEIhCB CEQgApGDJDKOFYlxrK2MZZVoLOtdY1m5G8sa5OjhxiziLE7PZVqxOCuXGSakqIQbR4bJyD6ImDZG xBXFualLNw4j2yoKPa6FrwJtXL5rHE8bGVMU58vFyPihtGOYL19eWyxd/uVQabN1o0liZQfGUy6X xMud7FGudNJ23myU3Pups7OcX+yvXXeCzDt1brXfX1i+vOIui58uXu3PLl/ur7mC0E59ZfVGXrH9 1hhaNvzrBjNtpeKeYCLOtJWeDgcybYsGSaZt3Cj9MkymbRjwsJRp+wxbKUOw68dZ28M5MMAxGjCN BkwjANMIwDQCMI0ATCMA0wjANAIwjQBMIwDTCMA0AjCNAEwjANMIwDQCMI0ATCMA0wjANAIwjQBM IwDTCMA0AjCNAEwjANMIwDQCMI0ATCMA0wjANAIwjQBMIwDTCMA0AjCNAEwjANMIwDQCMI0ATCMA 0wjANAIwjQBMIwDTCMA0AjCNAEwjANMI4BPZo4LAhFEZzE1qe0SvOmWjxhFz3njQ+UxvKo5Lajj6 ae60d8TqNBxjdWdjfeHEVGei4Uiuh1v31s/0rEyz8WI7j7c25ma6Ew1HpT3bebj58bFxyNyBDGQg AxnIQAYykIEMZCADGchABjKQ+UPJbI5jzWZmbmPrceMrUJ3emfV7W42vp3WmTiysbzS+OjjRPeKd nmtssTNb67Q6U72ZxlduG1+IjtehR8+659KoyIWVcyFk6LLuudRCB5Wse80i477a70TKPRDuUU3U vZKRr4xQHte2lQlCFy5fKUoZRJ6rMCmEx1WUNFPSpG2yyqWjb0ilfRGqqCguuaLyQ6F5UXSVpFnW f6VS9JYVI6tlb2ipUrMjUmFyadK9rbhWxSDSwiV3R9lo09pScpfJPaW14razvksVU3S127GlOMif eZ+46QkV0/FRBIGMjHHTo40yzJ03oJUO4sMJuHHzYR8IFhol3YN0fs5iRvZpRq4Nc7RCcWVmRHy0 QnFLWXm+Wk6HN1/to75a6aLtgxVMfu5BU4ceCE8wHh96wD0taw49yBokhx7EjdIvwxx6ELBAlg49 aGez8kCR/2rT9kAODPAKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBVA58AHR58 vnh4MqPGkXDdcL71dG+y23i69Wx4fLLTcLb15u21sNdpONl6+/6t89PdhnOtn2xvXjjWbTiIKclh gghEIAIRiEAEIhCBCEQgAhGIQAQiB0lkHCsS41hbGcsq0VjWu8aycjeWNcjRw41ZxFmcnsu0YnFW LjNMSFEJN44Mk5F9EDFtjIgrinNTm25sfNuj8LgWvgq0cfmucTxtZExRnC8XI+OH0o5hvnx5bbF0 +ZfDpc3WjCaJlR0YT7lcEi93ske50knbebNRcu+nzs5yfrG/dt0JMu/UudV+f2H58oq7LH66eLU/ u3y5v+YKInDqK6s38ortt8bQsuFfN5hpq5T0hHXWZdpKT4cDmbZFgyTTNm6Ufhkm0zYMeFjKtH2G rZQh2PXjrO3hHBjgGA2YRgOmEYBpBGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBGAa AZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGY RgCmEYBpBGAaAZhGAKYRgGkEYBoBmEYAphGAaQRgGgGYRgCmEYBpBPCJ7FFBYMKoDOYmtT2iV52y UeOIOW886HymNxXHJTUc/TR32jtidRqOsbqzsb5wYqoz0XAk18Ote+tnelam2XixncdbG3Mz3YmG o9Ke7Tzc/PjYOGTuQAYykIEMZCADGchABjKQgQxkIAMZyPyhZDbHsWYzM7ex9bjxFahO78z6va3G 19M6UycW1jcaXx2c6B7xTs81ttiZrXVananeTOMrt40vRMfr0KNn3XNpVOTCyrkQMnRZ91xqoYNK 1r1mkXFf7Xci5R4I96gm6l4r7isjlMe1bWWC0IXLV4pSBpHnKkwK4XEVJc20YmmbrHLp6BtKhb4I dam45IqBH7oB5kVXSZpl/VcqRW9ZMTK+sje0VKlFPlNhcmnSva24VsUg0sIld0fZaNPaUnKXyT2l teK2s75LFVN0tduxpTjIn3mfuOkJFdPxUQSBjIxx06ONMsydN6CVDuLDCbhx82EfCBYaJd2DdH7O Ykb2aUauDXO0QnFlZkR8tEJxS1l5vlpOhzdf7aO+Wumi7YMVTH7uQVOHHihPMB4fesA9LWsOPcga JIcexI3SL8McehCwQJYOPWhns/JAkf9q0/ZADgzwCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAADgVQOfAB0efL54eDKjxpFw3XC+9XRvstt4uvVseHyy03C29ebttbDXaTjZevv+rfPT 3YZzrZ9sb1441m04iCnJYYIIRCACEYhABCIQgQhEIAIRiEAEIgdJZBwrEuNYWxnLKtFY1rvGsnI3 ljXI0cONWcRZnJ7LtGJxVi4zTEhRCTeODJORfRAxbYyIK4pzU5tubFtxJjyuha8CbVy+axxPGxlT FOfLxcj4obRjmC9fXlssXf7lcGmzNaNJYmUHxlMul8TLnexRrnTSdt5slNz7qbOznF/sr113gsw7 dW61319YvrziLoufLl7tzy5f7q+5ggid+srqjbxi+60xtGw4S19E+xPBLHztfXNU6sDXkTSeCI3v IrbjIGYhfCllUbM2fxq/jpP/14L7QRB4grkMZBkk16S1MCpfk77kX260i87ub45qHvpK2FkXnPta i7Ciy0JfcqvrIpaFdu8bWTSsFG3LSGueFLOrpR9ynQQ05zLlhgPaS9kbInk38vTdWDeD9a/Ok++H vtHWD168Ek9++OHZS5e+vvrJyvVF17j6mqu+7+vefDUTU6qWpubtf/rr/o2reC/oInv56/0PXnYv IREI73NPKk8O5i4X33fPkzbJ/w6RuixlyEqhy63zH8PRdP9kLUL/owq9jMSQQi8v8UKh/ZJ4jtD+ Suwl1ITKLqGGJHYJjUGlUYmxqSRCUIEKVF43lT/Mf5PH/1OsIaHaH/37K7SXxD4KPV9iX4SGkXhJ oeElaFqE/ofXGqaHkf5JYGkZLv5newPfP1QcdjbTmzq0u03n0OGZtz9IT127MPfB2zPZ6WUp3amZ d/7hys3v04XM729e+eitNw+VGhx6862Prnz73z8/SNdTH/x89+ZnJ0tNum+e/Ozm3fu/PHqaLus+ ffTwx+++eC9v0pl667N///Hho6e/5x78/vS3n24VTQ7NfHTzx99K33fs/M02OflmPNzO4Xeu3H34 dLeVtsl3n8Vny9ku/vLt/Ue/727xbOe3//m3D/7UdaN4+8rdXwa6sDz53//89M92JJ3eBzd/runC dvLrD1ffPdxx5/59/6Cui2e/P/r55ge9zvMOIHz64Ht3qN9zFu6z0wWf1+JFpykO0yJTedFIX3i3 ezv29Je7V96e6iSuD06c6+L+t3+ZOZRP/uBInj68e+Wdw530BfTdT3/b3WTntx9vfjRzKHsRfnHr p+pLyL3IvvvsralO9kJ+74vvSi/D39MXavoSS5qUX8pPH/36f7tf7NW3w4Off/ivgTdM5S31/c2r n/79wJuu9La078l3//ynwTdu6a090zt8qFv35i/+81D9bwNhYT1bPd/zQfJ/NWvoUvlaSOUJd/yZ Cnm8tJgXZeQLzT0tjB9wI2xB+tq4A70E92XcIi24k9q48pkyptSKGZ8rERQd5YVMzl2XF7W0RSG8 oidt/IjLkl5WcNflo8pb5QPPexq4v0v7ep4fixeTX0sXB8/gc2vVdYuzde6UyyP5Yy8kOmSvJHrk lpKJLrW+S6NDyi6NGX2Xpvx4NLFoOLH0PcsZFyI+/9S+MeP3YxQFEXcVxlUYH4iqJJfuvSvcHqKr cHdUKo/fstL7xvtH5X3OvMtHtZI+E/GphcYPRZTsAmnth1pGRXG+VOTu9aFEvAUnxeDz8kUyskOI X0yl4qcj2iNZrT3c3UZ8EzVGuZ8N74dhxO07IvAlC+MdEaMjURTsUE7+9T3v75ratHCbttKa/7m1 KPJkMLBrUTSInyeN0i/DnBYpIxkMbFzU/pwFDTH4i2HbI3odgf+vAvD/VQBT0DqYgtbBFLQOpqB1 MAWtgyloHUxB62AKWgdT0DqYgtbBFLQOpqB1MAWtgyloHUxB62AKWgdT0DqYgtbBFLQOpqB1MAWt gyloHUxB62AKWgdT0DqYgtbBFLQOpqB1MAWtg39c3S74iEG74IM27VKxveFw1eemrjq6RWjEWJnp JR+E7x7xTs81F5S7d4Lu3GnvSJwFcWJhfaOxNODnsLG+4PIqOr0z6/e2Gss8fg5b99bP9OIki42t x40lOz+Hx1sbaQzGXvETDfPilI3GB/CiiA4MAAPAADAADAADwAAwAAwAAxjbAFr+tQ== vO0/TFr/06z1P05b//O8/QWKlpdoRg/w49KoyAUwcSFkGKfOuQMrgsrJOJpFceyVC5+LU66KU0Kq oX5CCZ9HLuvJtrtaeS59pZl9oLgfqsgV4sfZd11imR2Cex7Gz5fcc+4HKkoauyfZN5OuShWVXJ4+ l8IO3o4w6yMvaqO9vFNpH8Stctm8csmNPB1bXlxKim7weS2/v6z3SqHoq+TK0r6mAMLwYQwfDAys CQssW5fkBJYdSE5wKd1cOqD5yqV7lPPr2z43qTgrJklq2//kNTdXMk5ecybVJK9lDZLktbhR+mWY 5DXBo3LyWgvr8a83+W9dbQ/kNQXOAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQK/rlmW+AfKrdF ZntbH4RKPgnVnexNt/FBsGPTvcnuRGfyeDjbwgfhPr4wGx6f7HR64drtzRY+CLh5ey3sdbrT52/d 327hg5Db92+dn+52j13Y3H7SwgdBn2xvXjjWbe2juMkncSEPechDHvKQhzzkId+ofLu/arb7i3bL f2a0/EdWy39itvwH9uhJIyziLM66YFqxONmCGSZcRkApaSQyTEb2QcS0MSKuKM5NbdQI91XIXDiD 9kN3+dUkfMIEulScLxVdRETAeOCK+eW1xfLlXw4XHlEzmiQvYmA8pXJZvNTJHuVqJ21nSUTJvZ86 O8v5xf7adSfIvFPnVvv9heXLK+6y+Oni1f7s8uX+mivYsVv1ldUbecX2W2No2fD5D4uX1/zijf7q +++7VIiPF7/qX1xdvLLkXm5fXVv81763uLy8cn3xev9f7Le8r1b716xS37v2zyvfuIq7KL/Avnwv nDv6xv8D5d1SPg== PKD }\$buildbot-v0.8.9/_images/overview.svg image/svg+xml Overview Diagram Adobe Illustrator CS4 2010-01-28T18:16:02+02:00 2010-01-28T18:16:03+02:00 2010-01-28T18:16:03+02:00 256 116 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAdAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A635981f4X0aTV5BJcmTU fqgWa/ntIUE1y0Yd5FEoRIxuaJ0wIYtbfnl5XazuJrq01a2msrS0vLuFryMELeiD0wgku4pGX/S0 q7IqjuRhVNn/ADV8rJAl1w1g2fC3M9yGmIhlvIvWt7eSP1vVMkilacEYVYb74FQMf5z+WZrSS6tr LWblIltpHWC6gkIS8na2iNVvin98gVl5cl5Co60Ko3UPzV8tafFcTXkOrxQW/wBZj9b1WZXubJOd zbJxuT+8iAapNEJU8WOBURof5j6DrWoWFhaQauLjUoxcW3OV+BtwZFkn9Rbhk9ON4eBIJqWTjyVg cVZ95UlmaLUY5JHlWC8aOIyO0jBfSjenJiW6se+FKeYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FUp8w8ilnGJJI1ech/Td4yQIZDQlCppUYqwLz15zsvKE2ifW0uprbVrwWk1wLy4UW6c CzTMtW5KgFW6UFTgQk+k/m3o9/pdleCw1V5bkWsc0dtcmSOK7vk529qZJZ7cs8lVo3Hj8Q5Fa4VW D85/K40wajNaazbwyQWt1As1xGhkhvZ3t4n5m89NBzibl6jrQb4qpx/nf5Oe5ktxFqokhtbq8lrd w09OyM4lCUvT6p/0RyvpchShrToqitE/N7yprOoafYWiaos+oyGKJpbpFjBVgpKy/Wyk1K7iAyMO 4GBWb3oltXspYbi4DG8to25TzOpWSVVYFWYqag+GKpfqFnp+sxvBqFss8NrqctzCjM4Amtbt2ic8 StaMteJ2PeuJZUxqx8mflrb6hPpFpGgvfTtprnSl1G6ZvTtGhNvI9sbg7IYYgGK+A77trSa3nl7y jrWqXN/Lbx3F9G6xXhhuJlCzRx0jMscUip60cco4Oy81BBUjbBa0oW35e+TLb616WmAvemBryWS4 uZJJWtp/rMTSSPKzsyygNUmp6Go2xtadP5P8jaxJfXL2MN2LxriG89OeYxCWQ+ldcUST04pmKcZG QK/UE9cbWky0zy/oel3UN3Y2awz28VxBC/OVgsV3OLmZAGdhRplDDb4ei0G2NrTJfJjmSDU5DsWv pKgf5MUa/wAMkhkOKuxV2KuxV2KuxV2KpdrPmHR9GiR9RuRE0x4wQqGkmlb+WKJA0jn/AFVOKpI3 ni9lNbPQ7gx9nupYYOQ9lVpnH+yVTja05fPV1Ea3uh3Kx95bSSK5CjxZS0Up+SI2NrSfaRrmk6vA 02nXKzqh4ypuskbdeMsThZI2/wAl1BxVHYq7FXYq7FXYq7FXYqkXmu5aD9GUUEyXZTft/o0zf8a4 lWOaxpWk6y1udUs47r6r63oq5cKBcQvbygqGAYNFKy0avXxyNp4UrsPIvlCwns5rTTEiawEQtk9W cx1t1Kwu8bSFJJIwaI7gsOxxtabh8j+UYVtFj0xAtjHaQ2oMs54JYTNcWw3kNeErlt/tdGqMbWlG b8vPJst1d3Tae6TX8dxDe+nd3kSTR3byyTLIiTKjBnuZDuNq7UoKNrSrF5F8pQ6imoR6eROlwl4s f1i6MH1iMAJN9XMvo814ijcK13642tJ7dzvPcafCwADXtuaj/IcP/wAa4QtIOS2+tWup2vrSW/r3 OoRevA3CWPncyrzjahoy1qpp1wFIed+YPI+mXmtXIHmu3s7xjp0H1aQ855LyExSWsl4puEE00i2r BOCRsVJ3bjhtUvT/AJx4tfRkjk1tizQwQRyx23puBHFDBKWPqty5xQuqDbh6jfaxtaV7z8lbG31T Wddv9ejWxnt75YYrm3VIrNbsbyNKs0VfST4eXwngFWoVQMbWkOPyMtkVNLbzKn1yS1ugqfVkWUxy tOrvHGsw4whr5fVVVozKm69MbWnpXlTy8nl7Q4dJjl9aKCS4eJgnphUmnkmSMKCwAjWQIKeHQdMC sr8j/wC8eof8x0v/ABBMkGJZHirsVdirsVdirsVSXzV5gbSLKNbaNZ9UvG9HT7ZiQrSUqzyU3Eca /E5+gbkYqxWx00QTPeXUzXuqTgC5v5QObAb8FA2jjB+yi7D51ORJZAI3FLsVQV5pztcJqFhL9S1e EUgvFFaqDX0plBHqRN3U/NaNQ4goIZd5Z14azp5lki+r31u5gv7SvL0plAJAag5IysHRu6kdDtkm KbYq7FXYq7FXYq7FWOec/wDpUf8AMa3/AFCT4CkPPPzD863nlzSL2aytHN1bRW0yXlxETY0nvI7Z kMnqQL6iq5biXUUoSaYAlikv553NrP6M2jxzQRCJZdQW6EaMWW15yCONLuNU538dOM8g41IZtuRp bRPlX83tQ8x+ZtLsrezgi0u/PFpAZZG+FNQLNHIwhqrNYIV5RA0LVFejS29RwJdiqm3+9+mf8xkX 6ziEFDyW31q11O19aS39e51CL14G4Sx87mVecbUNGWtVNOuJUPNbn8rtC1D8wxqSeafV1mwlsLqb S2aOW4AsUt1jedRIG5OiP8ZQf3vTb4ja0o6R+QRsLw3k2upqM6yQvGl3ZK8JjhZ2aKaMTL6gkLh2 3FZF5mpxtaXTfkGs2p6heSa5yW6tb20tENrV4Prs0kxdnM3xlfXddlWoPbG1pP8AyP8AljN5Z1qX VZtUS9eVLqP0YrRLSNVuWtmHFUdlHH6pvt8Rap3rUErTO8Uovye+oiK++rRQyQfXJvUMkjI4fjHx pRHFKVrkgwLIfV1b/lmg/wCR7/8AVHFWxJqne3g/5Hv/ANUsVSbzHpXmu9ltbjSNQTTpoI5FeIsz xOzyR05qUowEQffjUNSnjhFIIKv5asfMWm6Lb2eoSx6heJzM1088hJ5SEqKtGWNFI64lQmXqapT/ AHngr/xmf/qlgS16urf8s0H/ACPf/qjirCrma4v/ADVqV1cqqjTgmn2sasXVaotxO6sQv2zIiNt/ uvAUh5d+Z2ja5d+ebS5sNPuLlUsrVYbiGKU8ZUvWd1juF/dwOY+rPUU+eZOGQEdyxkN1K58va8dZ voBp1wVt7vXr/wCsemTFJFqFqUt1icfbdmenEbjCJiufd9i0p6LFq1hpHmPTZdJ1H6zqei2UNo6W kxT1YtIWN0ZwtFYSfDTry264yokGxsf0qE+/LfSrm11ZZrPTrnStIXS4Yb2C5jeATaiGBaVIpN9k BBagrXIZpWNzZv7ExD0HSZvqPnG0kU0i1iF7KZf5prdWuIG/2Mazg/MeGUBJZ3hQ7FXYq7FXYq7F WOec/wDpUf8AMa3/AFCT4CkMF86ea73RNO1GWysZZZ9PtF1B7iSFmtDCkwWaISKyfvhEGYL22O42 wJeZ6N/zkBr88V9bajpMMGqRWt7JbAJMsYmsbSW5aoLP6iViCtR1K1FOVTxNItktx+amrSaV5d1C 1tbWL9LXFzbTQMxuGleCQRI1pR4HeKQ7mUI3AEEoRU40m0nT8/L54LaFNOspdQ+r2N3dtFdStDHH cyQRyLJWBfSYG5A+0/E15VoOTSLTfyZ+dkXmfzLZ6LHpaW4uo+TTi7Ezq62q3Dp6SRcvgZjGWcqK j+b4Q0m3pTf736Z/zGRfrOAKUPJbfWrXU7X1pLf17nUIvXgbhLHzuZV5xtQ0Za1U064lQ8v1f8td N1LzhqCW3m+2GsTwRxyabcxR3t0FS1giLXEEk4jkDiBJT+4Uk8akqKE2tLL/APIS8u1WmvWy3C2t paLfNpivdKLSPhzEpuB8T/zU5qFQBvh3bWk98kflIvlzWIdTu9Sj1KS2+tm0iW0S1jha7EC8okSR 1TisDg0Hxcz71BK09CxS7FWM+U/JXm2486a3r9n5hk0rSJZvR+owKsxmkSJQXdJg0S8aih4lj7Dr IcmB5s7/AMO+Zf8Aqarv/pGsf+qGKqOseTby/wBQgvotU9C6jighN20CyXCejIXd7ZwyJC04YpL8 DKy7UptmJm0pnLiBrl03Hu7r5HnbsdLrhjx8Eo8Q360DYr1Ct65jcUUqH5d+ailujedL8rEeUpVX DSGqClfWNBwjGxr8RZv2qZj/AJHLt+9l+Pj+N3L/AJVwb/uIb/Zz/o95+VDpa/SPy+8zWOq295ce b7y8t4ZVle0kE/F1UGsfxXLjieX7SsdhhxaLJGQJyEju3/4pGftTDOBiMMYkjnt8/p/UnUmgeY2k dk8z3casSVQW1kQoJ2AJhJ2982TpEp8weSPNuox2aQebruJ7e6inaX0reIqqGrUEMScyw24uePiD 0woY75kv7nStJ843MD8L6xlu5Y5aBiJHgWaFiGBBosidRTGIuQDK9nnFh+afmiK6t31GQLbWNpeQ ajG0camfULWOSQEEKONVEey0FTmScMen4DHiKY6Z5184Xnku4K3aHXbC/SG8mkjht5mtZE9UGKKd Y4vUpsAy7hT1yJxxEvKls0638yeZ7u6Say8wzvYNoM2sRrJaWiOZIHEXBh6bUq1SaHr02xMIjmOt LZS+Hzp52uNP0P6rqF7Pd6h6r3KfV9OWQiK1E59DZkKVqfjAcjtXbJeHGzt962WTPb+ZPOPlLyil lqi2OuX91HP+k4Ocfp+lbzvIwCcW5BV4kCgLGmwOY8gBIhPMPU4PLfmlIY0k823ckiqA8n1WxHIg UJp6JpXIqi7DRddt7pJbnzBcXsKhuVtJBaorVUgVaKKNxQmuzDFQkEf5calDYR2lr5iubNY0VALb 1YoxxkmkPGNZ9uRkjDGpchDVquTmuGgkI0Jke6/Pz93ntz3d0e1oGZlLFGXvonlEc+HyNdBfKogI vT/JWuWl3FNJ5lu7mKOSzkaGQykMLaBoplJMx2uHb1GqNqd+uThpJxN8ZP09/Qb9evNqy9oYpRIG KINS32/iNj+H+EbfqR0mgeY2kdk8z3casSVQW1kQoJ2AJhJ298znVLH8ueZijAearskggD6vYr+I gqMVSCLQtb0TQNEsNZ1aTWb1dRlf61KSzKj21wVj5tV3C/zOa/RQYlQkfnLU/NdtA8Wi2EjUNk6X 8ZSUlpL6KOeD6uQz0FuWdpKUA8CK5Fkwbyd5h/NKZ9Oi80fpO2t5JSZri305HmLtDbPDFLS34xws ZJubiMFGXiXFKkq9gwJdirsVU2/3v0z/AJjIv1nEIKHktvrVrqdr60lv69zqEXrwNwlj53Mq842o aMtaqadcSoeWeZdB8vW2uar+kfMTmOGMXdwr6dPeNBKulGyV7y6jLRMHiDSekyoZCQNxQEqhvIn5 baHIL21tNaGqahpuqRz6g91pU1vBWOF4ltTG7RBvTD84/TekZ4kLSmJKKeneTfLh8t+WrLRDcC6+ phx66xiENzkaT7HJ+nKlSxJ6kk4Ep1il2Kpp5H/3j1D/AJjpf+IJkgwLI8VdirsVdirsVdirAfN+ nwWvmAy3cSTaR5gRba4SVQ8YvIlIQOrAgieH4d9qoB1YYpCGuPLvl+5ULc6ZaTKHMoEkEbjmwCs+ 6n4iqgE+2ATPeml13oGhXjTNd6da3DXBRpzLDG5kaIFYy/JTyKBiFr0xEiOq0qfonSuXL6lByEBt OXpJX6udzD0/uzT7PTHiK0oWXlry5YypLZaVZ2ssRLRyQ28UbKzLwYqVUEEqaH2wmZPMrSM8kaXa y6zLe2cEdvpOkJJY2UcKBI2uZXD3Tqq0WkfFUqB9ouO2N97Es8xV2KuxV2KuxV2Ksc85/wDSo/5j W/6hJ8BSGCeddR80W+nX8ej27wMlrHLbarGpum9czqjQC1jjuJSTFv6npsq1qQaYAlg487/mtbah FajSbq5ju2so4hPpkrNCs1tD6ss11C0NuCkzvzHp9VOyKRxNKt0z8xPzZGmul35fkkvYLZJPVbTb 1TI5azXjxBVGk/e3FQGQfAD8C9WkIvz9r/5l2n+IP0IuoC+t5IBo9va2CXNq9o3pepN6rQyl5+bO pj5fCu/H9oISpf8AKwvzbfXJLKPyw0dlBMEa5ms7lhIhuYoAY5EkVD+7kMxbjTqvH4SxaW2c+Rr3 Xb7QPLV1rysmsSXEf11Hga2ZZA7rQxPuKAdRs32hsRiOaCm0lnbX1rqdldJztrq51CGdASvJJLmV WHJSGFQeoOApDzTzd5S/LBtTuY7/AFC+szbxRRXkdrE08MPq2v1GIyXBtrgxM0Dr8JlAbirMDSuF WV+TdZ8n3Ora5baDeTXd1PeSXmpcoZhFHMEjtmRZWiSP/dSkLyJO7D4cCssxS7FXYqmnkf8A3j1D /mOl/wCIJkgwLI8VdirsVdirsVdiqF1XTrDUtOnsr+MSWky0lUkrQDcMGBBUqRUMDUHcYq8x0nWb 1IZ5WhudS8vQzNBY+Yo4uQnRKAvJFHVyqn4fXVeDUJ+EdQQkFObHUdPv4vWsbmK6i6c4XWQV+ak4 EuvdS06xQPe3UVsh2UyuqVJ2AHIipxVJ9V1S9eG3mlgu9K8tzTLDfa+8fB40eoDJG9JIkZqL67pR aggEfECAgl6fp1jY2Fhb2djGsVnAipBGm4CAbb71+ffChEYq7FXYq7FXYq7FWOec/wDpUf8AMa3/ AFCT4CkJXgZOxV2KuxV2Kqbf736Z/wAxkX6ziEFDyWdtfWup2V0nO2urnUIZ0BK8kkuZVYclIYVB 6g4lQkM/5caJJ+kY47i6gsdVtFsr3T0dGhdUgFtHLWRJJRIkSqAedNgSDjat+Xfy70XQdTh1Cznu Hlt7JdPjST0QDGOBZpGjijkld2j5n1GYBi3ELXG1ZTil2KuxVNPI/wDvHqH/ADHS/wDEEyQYFkeK uxV2KuxVKPM2vjRLOC49ONvXnW39S4m+r28fJWbnNNxk4L8HGvE/EQO+UajN4YB7zW5ofEuXo9L4 0iN9hewsn3Da/wBSQ3P5s+W7bUhp0sF2ZzcvaBkSNkMkcgjbcSVAqeXxAHiK03WuNLtLGJcJBu6/ G/4+Tmw7EzShxgxrh4uvIi+78HbvqN+YfzH8s+ZLW0gL6gmiNKU1SwhgX1rpiIzFbNIsvwxuXfmq 7vwYA0+1AdrYiLAl8vx+AWyXs9nBomHfz9/l+LDINC/Nbytfy2FhY2lzAty8dtapxt1RKhgoKpKx QL6fSlaU2oRksXaeOZAAO/u/Wwz9h5sUZSJj6RfXy/o+f39zJr/yv5a1Cb17/SbO7m/37PbxSN/w TKTmxdM3p3lry5pkpl07S7SzlIoZLeCOJqfNFBxVDeYNbhs7vT9Mmggki1UyRSPdyiKHiOKtHukn qSSCT4I6fFQ75Rlz8Eoj+d3mvwe4OXp9L4kJy39HQCz18xQFbnowLyx+YvlvQTcafA1/No7RG60m yeKN3tYkSR5YVm9Zg8Y9MCNTuhPAnai4n8q4u6XK+n63Y/6H8/fHnXM+Xl5/Lfus6f8AOryksCTp BfSxyBypjhU/3fPn1cfZVA58FdSepoD2riq6l8vx+CEj2fz3RMB8e+vL4e8FMfL35maFrupW+n2k Fyk9yjvGZPRKhY0VzyMcslDRwKdjUGhBy3Br4ZJCIBs+79bj6rsjLggZyMaHv67dQO5luZzqnYq7 FXYqxzzn/wBKj/mNb/qEnwFISvAydirsVdirsVU2/wB79M/5jIv1nEIKLk8s+Y47i5+rSWjwSzzT xmQyKwE0rS0IAYfDzphpFrf8Pea/Gx/4KX/mnGlt3+HvNfjY/wDBS/8ANONLbv8AD3mvxsf+Cl/5 pxpbd/h7zX42P/BS/wDNONLbv8Pea/Gx/wCCl/5pxpbTvyxpF3pllNHdvG8887zt6VeC8gAAOW5+ zhQm+Kse1LzxpNrcPaWcc2q3sRKzQWQVljYdVlmdo4UYfyl+XtiqA/xf5mahTRbRVPaW/dXHzCWs i/cxwWmlWLz6ISBq+l3Fmn7d3ARd26/Mx0nA/wAowgDucKE9l1zR49IbWGvIjpax+sbxHDxFP5gy 1r9GKsfsNW1PzVq0VzpczWnlSwl5G9TZ9SmjNOEJPS1VvtP/ALsOy/DUkoZdgS7FXYq7FXYq7FWI 3+ran5V1aW51SZrvypfy8hevu+mzSGnCYjras32X/wB1nZvhoQUMlstU0+906PUbW4SWxlT1UuAa IU6kkmlKd69MCUhl8/6U5ppVtc6uu/7+1VFt/YrPO0Mci+8RbFVIedtTU8pNClMfYQ3EDS091cxJ X/Z42mkw0vzlol/cJaM0ljfyfYs7xDDI56kRsaxykd/TdqYoTzFUm8zaTfajDZmyeJZrW49ak3Li wMUkRFV3H95XFUm/w95r8bH/AIKX/mnBSbd/h7zX42P/AAUv/NONLbv8Pea/Gx/4KX/mnGlt3+Hv NfjY/wDBS/8ANONLbv8AD3mvxsf+Cl/5pxpbVLXy15ga/s5bt7Vbe3mWZ/SMjOeANAOQA640tsuw odirsVdirsVdirsVYX5o1e71LUZdCsJnt7O14/pe7iJWRmcB1tYnBBQlCGkYbhSAu5qqSoCHtbW2 tLdLa1iSC3iHGOKMBVUewGRZKuKXYqkmqaZBbwXbpbG60m9B/TujKWCXMRoXliVCCtwtK1X7f2Tv xKkFiQ9D0C10i10Wyh0YKNKEStZcGLqYnHNSrMWJB5VrXChH4q7FXYq7FXYq7FUHrGnaZqWmXFlq cayWEqEXCOxReA3NWBUilOtcVed2dpaajZ21vDB9V8qWYC6PpFW4yIpqtxcByWfl9qONtlFGb4/s glICc4GTsVUb2xtL23a2u4lmgenJHFRUbgjwIO4I3GKEX5Y1y8sdQi0LVZ3uYbgH9EahKayMUFWt pm/akVQWRzuyg8viFWkCxIZlirsVdirsVdirsVdirsVdirsVdirsVdiqH1K+i0/Trq/m/ubSGSeT /VjUufwGKsB0O2ng0uH60a3swNxeserXE5Mkx/4NjQdhtkSyDwzTfK3mx9M1ezg0m5V7uxuI50aG W2BkjvBPG7GX4J5GSqpwpRdszzONjdrop55q0nXNWbU9WtdKvVg1DVbN7eCSB1uOFvp0sMjvEAWV fUYAE9crhIChfT9KSEROkd/YeSYNS0DUrix0eBrfVbZ7C4PxiyWNCE41ZfVX7WI2MqI38/Ne5m/5 d2WpWfl5o72KW2ja6uJNPtLhuUsFozkwxOSWNVXtXbKMpBOzKLNPIEhht9S0kn4LC6LWoPUW9yon UfJZHkRfZRkUMqxV2KuxV2KuxV2KsY8/yl9KttKH2dXuVtZ9/wDj3VGnnUj+WSOExH/WxVgn5p2V 5eeQ9StrK3kubhzb8LeJGkdgtzEzAInxEcQa07ZPCQJC0y5MAh0TzDbaPYXLaVdvFC2t28dvDE/J Uv4VW2KWzfvIYuSleLV49Sd8vMgSd+5jTZ0PXNK1Gzlm0y7mSwuPLpmNtBJNUWljcRzlOAPMI5AN O5HjjxAjn/O+9aV9Z06/1PzFr17Y6NqEesX0mmvoGpPbywLbhIoxM0krcVQChDKevSmCJAABIre1 L1TXLOW60yVbc8b2GlxYv3W4hIkhb/g1FfEVGYgZlnWj6lFqek2WpQ1EV7BHcRg9eMqBx+vJMUXi rsVdirsVdirsVdirsVdirsVdirsVSfznDLP5P12CJS0sun3SRqOpZoWAH34qx6GWOaJJYzyjkUOj DurCoORZPI4PPnme31CC01LVON6+p2STxRx2j2X1Ked0cwzoGejKAD6hDDr8ss4o1sOjCym/nD8w bvTvOWl2ljdD9DxCFtWKRiVGW7kMSEy8WEfpheY+IVr3yGPFcTfNJlukOo+fPOqadqFvFfelqPly G5/S1z6MBE0rXYhtvhKFV/dVb4QK5MYo2PNFl6V5Ovbq80RJ7me4uJS7gyXcdvFLQHYFbUtF8qHM fIKLMMj8lqz65rsw/u1W0tz4eoiPK308Zk/DIhBZfhQ7FXYq7FXYq7FWJ+dgV1PQpG/ujLcQgdvV aAup+fCJ8SkMT89XuuWegNNosscV56sYLO0St6Vayel6/wC6MnEbBsOIAndSkHlLzpNqGvWUEupN Np1xoy3Km6jggke6+uSQsSEAFaJxop47VGWTx0OW9oBYzcfmf5jOr6rNBd10y3l+s2UPoLR7WzuR DcxrI0fx+pE3qkhqrSlRlgwih3o4kTqPnbzWRo90moXEFlrdzqcsEdrBZySi0gMa2yj6wEQ/tMSW qQ3ywDHHfblS2XrUbD0VZmqOIJc0FdupptmKzTzyDUeSNBqCD+j7aoOxH7lckxT7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq4gEUO4OKvN9MgOlTz+XZaq+mUFmT/uyyYn6u6k9eCj0m/ylPiMBSFn+FfK/ oSW/6Hsfq8riSWH6tDwZ1rRmXjQkcjvh45d6aC9PLnl6O2mtY9LtEtrgItxAsEQjkWP7AdQtGC/s 16YOM960qSaJosv1v1bC2f6/x+vcoYz6/D7Hq1Hx8e3LpjxHvWloi0bQNMleC3isbGGsjRW8axry O3wogFWY0AAFScSSea8mUeStJutP0QPfLw1LUJGvb5K14SSgBY69D6UapHXvxrhYp9irsVdirsVd irsVSPzlpdxf6IzWiepf2MiXlmnd5Id2jBPQyxl469uWKsWMej67pkTzQRX1hOFkSOeNZFr/AJSO DRl6EEVBwAkcmSyby35dmlgmm0qzkmtVVLaR7eJmiSM1RYyVqoUmoA6YeM960u/QGhejDB+jbX0L dJI7eL0Y+EaTCkqovGihxswHXvg4j3rS268t+XbuC3t7rS7O4gtFKWsMsETpEpoCsaspCj4R08MI mR1WlPWw80MGh2fw3eqn6tEE29OCgE8vsI4zt/lFR3wBS9ItbeO3tooI1CxxIqIo2ACigAwsVTFX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FUm8y+WotZiikjmNpqdoWayvlHIoWpyR0qOcT0HNCfcEMAQq xG41G60pvS8wWxsCNhfLWSxcfzCcCkdf5ZeJ8KjfBSbREOo6fNF6sNzFJFSvqI6stK0rUGnXAlCy eYtMMpt7NzqN72s7EfWJd+nIJURj/KcqvvjS2nOh+Vb+5vYdV19RGbdvUsNJRg6RPTaWdxtJKtfh A+BO3I0YSpizDFXYq7FXYq7FXYq7FXYqw3XPLGoWN5PquhRC4huXMuoaRUIWkP2prZjRVkbq6MQr H4qhq8khQUss9c027lNusvpXi/3llODDcJ/rQyBXp70oexyNMrRxIAJJoBuScUpWddjuZTa6LE2r 3tePC3NYUP8Axdcbxx07jdvBTjSLZT5W8rtpzSajqMi3Os3KhZplFEjQGqwwqalUUn5sdz7SYsix V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV3zxVjV9/yrf63/p36H+ucj/f/VvU5U3+18VaYqnu n/o76rH+j/R+qU/dfV+Pp0/yeHw4qiMVdirsVdirsVdirsVdirsVdiqUeY/8J/VB/iP6j9Vrt9f9 LhX29XauKsZX/lSXMU/QHLbjT6p1rtT3woZpYfo76vH9Q9L6vxHp+jx48e1OO1MCUTirsVdirsVd irsVdirsVf/Z uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 xmp.did:0D9190091A0CDF1198A8D064EBA738F3 xmp.iid:0D9190091A0CDF1198A8D064EBA738F3 proof:pdf converted from application/pdf to <unknown> saved xmp.iid:D07F11740720681191099C3B601C4548 2008-04-17T14:19:10+05:30 Adobe Illustrator CS4 / converted from application/pdf to <unknown> converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FC7F117407206811B628E3BF27C8C41B 2008-05-22T14:51:08-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FD7F117407206811B628E3BF27C8C41B 2008-05-22T15:15:38-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:0CC3BD25102DDD1181B594070CEB88D9 2008-05-28T17:07:17-07:00 Adobe Illustrator CS4 / saved xmp.iid:34001D5FB161DE119286837643AC861D 2009-06-25T23:53:30+03:00 Adobe Illustrator CS4 / saved xmp.iid:35001D5FB161DE119286837643AC861D 2009-06-25T23:56:39+03:00 Adobe Illustrator CS4 / saved xmp.iid:01FC8385150CDF1198A8D064EBA738F3 2010-01-28T16:00:41+02:00 Adobe Illustrator CS4 / saved xmp.iid:02FC8385150CDF1198A8D064EBA738F3 2010-01-28T16:00:52+02:00 Adobe Illustrator CS4 / saved xmp.iid:03FC8385150CDF1198A8D064EBA738F3 2010-01-28T16:05:57+02:00 Adobe Illustrator CS4 / saved xmp.iid:0D9190091A0CDF1198A8D064EBA738F3 2010-01-28T18:16:03+02:00 Adobe Illustrator CS4 / uuid:15cd64bc-c4e3-417a-b6b2-355ff7b02729 xmp.did:03FC8385150CDF1198A8D064EBA738F3 uuid:9E3E5C9A8C81DB118734DB58FDDE4BA7 proof:pdf Basic RGB 1 True False 800.000000 600.000000 Pixels MyriadPro-Bold Myriad Pro Bold Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Bold.otf MyriadPro-BoldCond Myriad Pro Bold Condensed Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-BoldCond.otf Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 0 0 0 RGB Red RGB PROCESS 255 0 0 RGB Yellow RGB PROCESS 255 255 0 RGB Green RGB PROCESS 0 255 0 RGB Cyan RGB PROCESS 0 255 255 RGB Blue RGB PROCESS 0 0 255 RGB Magenta RGB PROCESS 255 0 255 R=193 G=39 B=45 RGB PROCESS 193 39 45 R=237 G=28 B=36 RGB PROCESS 237 28 36 R=241 G=90 B=36 RGB PROCESS 241 90 36 R=247 G=147 B=30 RGB PROCESS 247 147 30 R=251 G=176 B=59 RGB PROCESS 251 176 59 R=252 G=238 B=33 RGB PROCESS 252 238 33 R=217 G=224 B=33 RGB PROCESS 217 224 33 R=140 G=198 B=63 RGB PROCESS 140 198 63 R=57 G=181 B=74 RGB PROCESS 57 181 74 R=0 G=146 B=69 RGB PROCESS 0 146 69 R=0 G=104 B=55 RGB PROCESS 0 104 55 R=34 G=181 B=115 RGB PROCESS 34 181 115 R=0 G=169 B=157 RGB PROCESS 0 169 157 R=41 G=171 B=226 RGB PROCESS 41 171 226 R=0 G=113 B=188 RGB PROCESS 0 113 188 R=46 G=49 B=146 RGB PROCESS 46 49 146 R=27 G=20 B=100 RGB PROCESS 27 20 100 R=102 G=45 B=145 RGB PROCESS 102 45 145 R=147 G=39 B=143 RGB PROCESS 147 39 143 R=158 G=0 B=93 RGB PROCESS 158 0 93 R=212 G=20 B=90 RGB PROCESS 212 20 90 R=237 G=30 B=121 RGB PROCESS 237 30 121 R=199 G=178 B=153 RGB PROCESS 199 178 153 R=153 G=134 B=117 RGB PROCESS 153 134 117 R=115 G=99 B=87 RGB PROCESS 115 99 87 R=83 G=71 B=65 RGB PROCESS 83 71 65 R=198 G=156 B=109 RGB PROCESS 198 156 109 R=166 G=124 B=82 RGB PROCESS 166 124 82 R=140 G=98 B=57 RGB PROCESS 140 98 57 R=117 G=76 B=36 RGB PROCESS 117 76 36 R=96 G=56 B=19 RGB PROCESS 96 56 19 R=66 G=33 B=11 RGB PROCESS 66 33 11 Grays 1 R=0 G=0 B=0 RGB PROCESS 0 0 0 R=26 G=26 B=26 RGB PROCESS 26 26 26 R=51 G=51 B=51 RGB PROCESS 51 51 51 R=77 G=77 B=77 RGB PROCESS 77 77 77 R=102 G=102 B=102 RGB PROCESS 102 102 102 R=128 G=128 B=128 RGB PROCESS 128 128 128 R=153 G=153 B=153 RGB PROCESS 153 153 153 R=179 G=179 B=179 RGB PROCESS 179 179 179 R=204 G=204 B=204 RGB PROCESS 204 204 204 R=230 G=230 B=230 RGB PROCESS 230 230 230 R=242 G=242 B=242 RGB PROCESS 242 242 242 Splash 1 R=214 G=149 B=68 RGB PROCESS 214 149 68 R=71 G=152 B=237 RGB PROCESS 71 152 237 R=42 G=81 B=224 RGB PROCESS 42 81 224 R=180 G=58 B=228 RGB PROCESS 180 58 228 Adobe PDF library 9.00 PKD cc+buildbot-v0.8.9/_images/waterfall-empty.pngPNG  IHDR32sgAMA asRGB cHRMz&u0`:pQ< pHYs   vpAg3bIDATx^gt+ٕj{ozf>yUFJ^LRLzK{{O{@@ z xe4UMvcD_YԷ9ڮݫfMv o1v c5cwo͐YWG5CЦnnfA +}G3A&Ҡ~/]|4N_\SC.s|W|O 7ׅQ_Rp-j,@ clu'w~Ľ|"PpRBU G^i#˦kU1eSڑUvܮDޭI\*gVLnWL~';xLڥJT h*wN68]Z.%67* xpÛ%)Ob(B_4@3(eĂ* K6p:t,r бt\"P7JrThi sEw'PL}Ad8cg/0:bsɋF4ٽʔE*x|H\bej|b;]^0Q{oZt2.SQ2L{E5Ջ_&`(60IW[+*~';@NUnj6/Zh4M4:fVSxۦm+19Uҙݙ"nXx}r{'ɚ&E[ R۫vJ9,ډ&blLŵ,AerTGQT|P&6K=RDؖ.YU#e`DV<}bhi:Qi@Т/ՂC+-gNAe Z &[ؼ0`2ѵ:Z_7_a`IL lg(~ZjAS*YYz]m gjH)]sj!3NݥHlΫĸ{8KΠ>;?zνu|Q4@hٔѵr;wbf_&^^4 Sj ;eTwnFx&Z%O{?3Ǿՙ(knv_}8|۷L.\},ՅSœs+=O>͞>:;Oo(Olq%7s}wbb{hi[K&p1J VTt`-ۧ6gl v )[]g_Ilt6;QC2\˞2xK;팵#j HS;"Oj[*㞤A _`D[4i۔hK2՚aŬLi'ǖ 3XndOũ-"w㳜{AbbpҚN6w `"}qgjFlfQ h&sN̳ x}VÍ}T2'S:qV"gp sWYב܁!MѸAdᠺbT>IRAb:䎗M"{U4ѹT> M 6(^.UN!.afULGvZ5OZ2P"owpsAvDa9>/_/Nq O'5w8/D Ν)͢Q*=W )*0O~ ÜʅŬGU"8 ëE;cDen KcxW2ͤ1vtjx UN]emx3DiNi/[r< ~^>(mY *:#т,y{9JZZ}X! $|UO8t !W rMNl)@DpTY ng bN hZ˜J8x+̘}RxY Oh>S֍.'zxҙOf4!SE'|PfuHX7MSJ88dNr@ x?.8S#S<|xr G(E ATJppFIV'"\~ a|V'Wp9qٝ 8kYkZƝ^aLR|ZRw V-RL#IQP;5HMȓ]u$ر1!1 ɽWYOO:^x3o:JJ"PBşfMD PlBGO7# A*ϲ'+?I}ئ>}R;qs ;9(h+:,8 n>"U-YZ;{h"?@ \j1#= tĭnVLp! f6&p{, 4DA[A7&KC7 >5rˡ v N\&].rVO }?pC4{b'7HOUrFf~=ӾjTggڡ7hA(/t&R2~M| |M'#L`ĕ[߸֌,B֭bέ"έBb.[Lb QNw_+787OӇW[yoqǥ"7 7 U_nC-:">=8d. \_3%2 ޱK8OgX΍t'+Oy\W':(|jOc׌yZZ'&*Zlԃ]*2Hٕ1\G<%" (UITVeHFrcq+РZڠ<"W.\yR^4q89c~[ݯUG̜b`T8' ?5pxg; <;xz{O >3||wӻgwGO=7#{{;cGq-t`2f}0n}8n?f?n}0f8n0n ?= A9n 'U'NII{Ȕ=t<|Eyyy(i{=l){81spN;3."3HXf33 8tgxH3 faYD9yGĜ#tFчNLD9QLG3mУ10^,/GtD9#x4_7 }OB[&zxuiyb+IyJOypAI8ٸ'$Z'Ilg"˙rijc]$0/籐y{̬-v=c{ZflS'N"&!ggZNç+ 8}DKY?L==F`Ѹ5d4ʤ 3q2h:q2z 8 ?~DKP ;y4~9%<?uCy0Ñӻhs(d1t4?vv>t"OA!(:vpYi=2w:~ZB=v`kq0`-6f{r$UHEO%#Dڂɒ@$"& -tX<@ H  s+U:h -A™9TDTȷc$vxhʔrT*%XQ|g<T+2"݋=k *ItSjxD6Y¡viʒxL 0^KKH 1>N2ў/p@L/q\'e*SL2hL;}YR?OK{FRX([O^0aY2*rO#DIG$/?MTPq,G"׃Li a>|\yHdT<=mKu{/ng<F1D<*OE|p*8Eoo/H^ +OH½"Gdq \-*dI(ɂʐ4pFpPEQ@B C?E<&xF@>p`I_*p!O 9d!H}U@??z͘mkf?J.^Jjy=4mƒ!> 8x\_-!4j xV7!oߍZw陗zspGݬ{-[ XHX)In22ҙu&Mb5B0ʷr J+vIɜ>jL$S{Sա튟RMm3<3nӂ\Kk{楚}@KԭZ3ƅ4Sf~YXvRk(^29> ,$4]wꅯվ] l+ߔ0a4xRѳgø+B߽vbtG/'LGOa/fr.^+(O2F+GI0$"~ޯYts{BgnV29s_oUhi]N`# 0)q$N ;RK@'!'q8G#;C=zGK"eO)(+ExLD$C:gĴ]4!fqD+B&ٓ99Q{%y#Ҽ;4bnP)a0p:E{b{X-C#E1\?|h.%_"- O"w<_,$BA"X? %"A FSKW^stB˾@8opg,pDO% 0":phHDEψh^wC|x@DRCXXwkP|ؔ h0:*2VF3سPP(+пUs{Bo?.՚ފF~~w6s~./߾Fi!ymeoÏ ~Bs? Oݔ=}T:;ˇ߉,z_tGCk=֨JdHi ^rS\EwHA'9S+ދ7{)E}R[;ҭkQ9EcY,\rXgᓐ0dF-_Obܫ ?^X~~7'~P:xfTHt'h4| BK "YIdǀ0J+ЇǓD S؁'2\2sxQMLW$;`i%_ BM`*r4cu5/8IQNh#X`mGCB K*& F đ!y"RJiW1ɣ (鈁@"b.2DC@u`YPKe- ًžT2%sK^ϓ8s| M0$}ŝFWp HL9+gϿṷ7Ʒ*޽6qrC/ePahމ|^YD$O)AI7boG7ίjcQ&٣xQ孈/^x)4izZ!&Vb'vjet3׮O-&~_|*YJ{/g =@U̜5B+r_ίDV=Ȭ}~BT.=w_ڶW">x)QUʷ%|S:9/ ^A#7[q彷R2:oOʟֽɣCܮ⊋ԣSVH8,lFrYt+$l+x H:}PRX=,GEV (a,oE!jc Na5j Xs ,EExb(bʅey(r3 !|s̻c!`%eD &0=爄l!Fs˥sI _ ׉Gi|$)rHrFOIu# Íbb8MaH(Z= נM*wYZLʶDJv][^0 K[UNcК4:Qqql~ǑL>[eHIFp=tA4q%XAC.;>A8>4hhOG ^hBGd" CI;;pE$Oz Cg74t Aч>\(KD/@EK w)7tHr o  ߹1ek5S$71&ԍiW9=,~)J#pZxj!kx?LoZ胴$:!t*CLe/9;YɍNjkd,}ٗ?5`D^`hY&w?gӪ>[G7nT(%쉭g^8׮^Ay/}; T4a ^Z嵈J^|dPL&_VhyݜwoG>N/y?"7uܛumP]:S}A3HWNH{$0!={wDpp"g.bf.s(3X>w"\𕢑T"Α+f _qA DsXBaBh$ͻٮh [<& N<`@HԖ@GpS,J87Eh$sㅻ }D'hH'NL҈h!(#q $'7iTQI쳟|WEfuV6BI_k[*B_߄yG=3ڏ<{rYO g}jY)xB熠@OI h\br*ܡ["J0"!qbZ$ @{@'q0'聂b(+D*o%PJ>[ R+_35AD^rxvxٜ.G3ZZ6^̏upr~Ͽ{jg7jggw0seycR{ $WE*D#6^Y7i+kKJe)5JgXXو g#`!GCd-lgA&ϽwG>JX^A-߲DY-_NI,nӇ0ɥ}7>ͨ\q&uI߽RqmBDy=&qx?+{TU;հP9]ًqR铘»iՅCҌ~YJ,rSߑ>~L٧Qyl]QqdVas7>-W,=)?-1E1Zͭz#fĀpa~~&!eEד*'jfr޺~/(y$`E0lQQA0b6 \x4{ŀ؁hB%l.bh61J,ض:4.W|(&, =AgXndqlW<ە0S8'<W"qP ܁x%""y,9$( )jHП"|p <"%$}9I"I69ai,J> btEywBR2rkK͵ξI$]Ь**F֫Ի;Fh>>4-;#euXvEiv-@, dL(c.* ٠h!ڀ>"!$񀈃D :1/+*!A*" 8E>|Dd@.,kReUL ?p>._^A e>\+TZsLT> ix[dT+U/ eLVMU-y}TwjȒ<ȪPF,^q8]+N\ _‡CȠ^OEҸ|z_S'Br^AU(}ztkclX坭mfgKwd2lZj]d{&Éeppg,^ž{oRA\BC$ >Wn0vp.-~$"JB?,SH7#d!!kTUB#t,VROt* mDڗ(B%UF+EyT<{xZ66 UN\ P7#ўb;c$c& X.b@`SE<6adZ&$6Kv`=<#3}Cg<BcGlj7$+ȕqYDp ;ryxrI >Q@T?煣%@ }h(3yH,X_B!1e F")I2Oz C>:ufO~~[///o?_g !IU)zu ncݨYvw F{֖eg`G{}b2jdžC_CsaBN2G_>3CBFv4 _* # a֥0cg(/77Mx):E^7;a<AP.C3/)"/4`†{ yD3C@˙PL99.n  h _3"x TP4 ww;ՁJ)q|@ fUhz0.S*PNUzl#P(_%PARU@'BUl? 3x3 {"a ߙ-'DǗz[]m`[ߓЋtw-irà==O⪿xv.j v} +1ة]5)ӄInJP /’0k%BSĂ♗8#!$&eRf,;]E(mG 7^l!$YL<"O"ϑuХ3L?ؔFL⣖ /|S Q!x B&J|^0(MKP(}Y("d 2~HBPɟ! yb\c"1-yd69T]e{GFsGAXa=!jRd`Ϣ%Q $e$Inh*q)PLEG03}Uw^|HT7ڟ_<3&pMJҩ7M^ӨO]ƉQe3k%\jX]\X.,+ljpsA~TI8ED&P@ )@~6HP&H=)RUG'Ci(,dA^j$Ѐtlj6=H+2 U9<{ϑwyRo:ۖwf/:6κxbiLk()1Kb,KSX)%3u.vtyc|mf7m`1iC)?e<a^{Ac# #Ђ24Q#jp&,k[8)Fٴ6g##`AyDش9\JfC.27ɴi PhԑfLLiѹKb(Ib2qOXVl¸=NޑF.YJ$ϲ% Vp5Þ *DځE 8>KdZO䞃Adx%Rx3<*0ω<}"$2I|Ww)`;MNG)tgx2Cݛ.`m/iex=]y2Et %^ I$gI|_&ܑP9؋Ԓ4@"0PIBW/'Fy$CDWIS.(b?42ԁpSeే` ²oRm-|HW%P/p"|!;/կ/>}?t?gχɳ 5-ʬљ5[f͆ykskE[Y4o(WLJD"q6V燔{oS/7[MD2D$"^<noB;@AhP KU&Ո*ECJf`j`} h5lA4\ 4nQHi_Ow#~~ӏ@P.Xg'*3099B'( GdW~Dͬ8g ^fm;mzuzyFe<,#U3økIucbb4.WTv-}:;UV\5J(i^TdN̆mV.U30 R h=WxVGcSmNn8Y&t'<|ׯrSJpY>.r3w|crs(LoZѺQ0(OV(W`j!q2}= Ȥ=Idb9_9J[R=e#B+Al%]*,hb[,~Kd9={;OAɡKZO^.yh4"'C<'vHC,3>?$Kr Kaŝ! 0$e t0Qzi$yxˤ`r%Pn񒰄$ BF4C6ыhP `gP NKUyt-0Tace+T2E,J1ԲJy}D?}ޟ7x~77o֟<{ϟ?ɣEL Tw ֢ـVW2A\5Wkժy}٢Y=լ,%Z}kpZe+= pgB{+AצN .QhޢZ-]hRxQGfRPbS?Sڱrؠ1&B,6U3zU Vj7:0IKr.g0z;TӶ;8B'ز\EO"ֽ<3GxKմpz|lreZx+1a2 놓S3Z;cvbax|`_:hlb>nJY?kHa~#a?LxU=/\sADl^5\z'`Fy[?s#*|R[: s߸VT;%gY~~J0’Qs} Gl LbJuß;sl|J4Dj9"q%ml l@~[*fT/G[US^aI +LOͬN~Lsk{mN]ȩ(nLsQŷ>[/adj7.RGeWE'VUJv% `Jѫ_g߽^pa½W>Zzۑ)ńtPv* {Gx|??+Lz؆k|/H or,X҇] JR% 1ȾKm8G7h_D#AT;G4ni<-kGcϤ%cX36,C.Ls$D]pޑ,dS f":REt+K9 '6s"wahGIx6K wNIbw'`Kɑ%*HJR*֨!R b%>G֎ܪ A~YgXJ fbY䋎6IFGӸF*a;9rw^ ~k{rUgo3w{;5JD V4[[ T&M@e;0KkR*W/-6Tpv6tzB&- NhVmm T:ڃF(' )22PR gxϙ}7uÌc_~9~n݃ڷ@6E1S)#o篇}ϥ:@?Dl/]/J<~Ibbɗ@HlfW4wew* 3j jǗ'ThVČ)GLoni%C9ƻiUɩ1H[Ez3tEu#ӋԼLly֬?yI.^Ss"Ӌ# ]?80)?Wޚ\շ٧Q/^:[9,PfTu܉Ha"i5 'uI52~<4<<[.ߎ2gCVet=oزvYĎLv;>M G$tdADN3LdKrD.lHZIJ: ~^BwD!"<@jI{K^[\'W[K}2o޼_/ї/AQ t^R(_GJ;NHIcd < R-=#0nFDU.>NYj^BJUVuvrXjgXR6W:1d#c^vmtmhetq0{@VW+N7ܭް=1"o_=w[揮?]?goճ;ܝzssrpKhDShZxX+'dFh[gLJ[[XZZHdС&3@]vA nc&:T T1P;TméYi?\C0 Ԡ6S:[c?=g{4n#G Gd'ХQٌ?g1NBZ1U SDU^,uHe .f~;e#PJ@+clhXئtnmnCWHcqgCIwuqOqfs+C9$~}LDj{jJYG1 7C&?/7kz&_~*(^YYs7*yzӞ0:|8;G:X:X&j\üe{&݄ƏnT=>ڃȔܲK?6^d. umQ| =ѮWrm>l2x2/ex#?o Py|{|y\--Cg sȆr_Й-Ub"b`KCL $b|'I]W GHܹ:i"vj)GHF^ N᭦ >ԢL$='Ň\5\rO~k?H"i%W4'WAoܩ3#@<#8J5j-P:ZF 7kŝ90W&\^#mlhbD lk+sM9in( q|Kϔ$/~z_o iϟSU}o?o3w~fLC[?onn}A_UKd#Jq)Ŵ66G#dp\I5K[+neywCyaȓ߉ N! lS}z  @#}=%@04h [HjgR᠙6FԄ2I 5G1v!ާYSvw ݷ{ ^}K` ! bDU^*se2J>R*UȜRGݵd ),! #>(1+)%.!6||Du ٟSgWT '."kLY3Ȝ8-S#֙ECRQd g<;:2&Hl8gNe6 r'Vہa-y;%˯^yse3(h%sqXlNEnMny?a'[y;")vHQwlvyg иd\ @4#a1:{uB|'qF8V#^_ xtC"\ . hͤ|!<<"2ybgșK@q" ʕhEڠ . 8U sɼE2_|Ox$#XBɕy|Ero!U"//<(K%\-/ $B$3BPh lsIx > ) >y/Wm$8J;zK(YjT+PāZUŠhkr^49͗TiǰUm r* ̻ehXVt&N4ǘc&Ƙ5C-S,67wBŐoa/?[׿//__~؆!kkUnY_ANjkI8q{ƶzf1ZfuШhՋ|X*me;`+^eL1X`ܡ&8DK10d'0CQ$01@Ҥ)0KMO>5OQ=D͛<<:a[cepR#5`"eYl6RߘW2WQଔ: U Jݳl}T2X//t^9)5|K8Z>z7\XS[QvJr@Mmf?Ȱfz*XЎ (VeaLrL-Yy=V,i[:7nlѢ C[.,#X$)NSV [.Ȣ VAڐSC.ѶxZBބ 4.8r:Il/Ohm B"{!,A!(((WY u  2$ʗr`]$JhI "R"H.]@ / &/`T$O4.yP WF#d[L?Ӈ҃߾p?,g{`uApKW 6ˎYPH #֞VTPY\2(4rŪHjTiW_vSΛ !4#SP å>$ю5m&0ڣ-cݥQ`B4g!´P,llBi p(yԶkb-^`L7C&P20d [pSUu 5r~V%C5΂^ݦ,؅y r5W_Ll8`2qMxzn6pbudJㆌ; AFŽNoyȀбOFpw{9'8,1jIɘąt/z@rR21(w.!9t $x ZRjC+_bAL@lM|0I Mv6\ZʂOLbTrQdQ"r.Ey(Œ""PJ$"H(%x肱XFU G00H)\ .$. R4T]*wJ[)Ux.!Qʗ|e0MK^(KA0U~kj4W|Uk5?I$OK H(ȎTMH'ԒAR-`R7Q45DMjwT ]^I6Z֩MLJMܖWĢoiUiKp mlKZfYӣ=zfJ l59HnO#pyo_=࿽_=_?WBg?}o߾x^ ۯ鏯nq+u`V2L~hmoidbdU2M=ִ孊D+"J`ݶjM[B6wE,^_^DHTo*VO4s}6Uq ʨ8Jp&"<͂G 5k -"0Y| u%"ڃ /4,Irm;~{C]_կ )7TK+ڤ:՟0F\Ppg]~JynԿpDOxcD~DAʅ$O zB@GyX; N): lX-k`F54>%JUЭ=b0شR=΋iҳGH`Us[J OEy3胰 V׶52E|[oҿeY[okE@RXSSMƆjyM!wt&yk}cyIqhҞZVj$$-6: |XbYlZ6Jc6PV6"8T 8%lBn]t$KI`VO1j0Dռ l"Lm/Jʓ64.ЅK;/Ox56ep/u~jV >5QsK(39Ko9ܥJ{-t]DZKHQ̴Jvin>JZ e`(!0o 0~(NLb4 hAKEP*Ĺ-&tTt 'PLD̙t 4kI@ՠ<9DV`YX6 I9RSh@"(8UCP'GHD B% G{{1kQT:ŝ1&{zr_+5횐.1 |sSVW42sxRciv^NlgG-r~lln:Ϗ'';{Fgfk k:*$LWYl氬Fȃ[qET$V>LnHk+hm I_u32,)}zr+,@;:RZEŋ#A.[Bbql0v.N3th Wki4@sZS vJuN^CcxR#__-2gNDD{apV+GŁ_ncQ:6ҿV=!#|.Lc sC9 0iNY?M/!h1(_GƠ\9 1Q0Bp Kz}a9o\0Ӽə $ctrfh|jplsuRN2(W ,MyzbǹPu)}Q%850650:!mD4M'16=0>=H?p + m!#c}m]M-Me-95ݬ^v}|mdg )VWwik36 ̦ãiw{Ǵ-(uݦD(^nmmkoohomkiimlj6R`k ƖfT56655lIၡ!r^h}}}}#0 AoP72Bdtxbdd| 9sb.׼0c R]ȍ6Th8o(="i`ԿQ]Bsqǥ]C8Fς [< wy׫u:wKHs>>i@_Iq;"sm؉2"gy*{ `sm=U6X\P.7lk:~DAAsVfWLp_jnt=?A+&pjljfi3Y#bzS7je;:t`! \6.ѱ|iyZ 6# 4҃Ot\kHfA<:Bi;<9\\5ehM:q0] 3m2\^>}H,[THK, *6/t_^ LOHr G47V+5զfk1373훖[{YG,]oZ iકZDN]Ak+Ao#cfXv3$ܑmGzDe9R[6tkk5JR,)y[\VVU˫*K+QD>kjMB:"/;b4&=NIbK?PZ--V'k|%v,[b7d#,Ɠ}i6öe,qז-طq_;+0[#Bllί 4.M/lMڶft=](_ t^ t>>oJl2MenpN}7~ɷuVUx7L9s^Gi]]L ?EaW/i" =9K}%udA.eqC}*ZR6ÎaR}O'.^JrR#%أx&?~㼗{2%ʊx77 0s7YvwOOlósm ϟ倢(O .}J#|UĀ([cH{L <#t N-qʗF:{\)P+=x9WҴFK} YAg~%"~j~廴{>(1j]- ~[]6}82ZFǧfe# B'ա`3Tkkgg'>u"[YYn*US~GROεtl3SfcyR{䰮,d帋Jeqtb/Nvmvۉrd=8[/;BW[Eytj?>@6F 3^o^s{u`.\sZ>[c%>A俓cu84SѾ7&{uonvCJnhp`me. 6lu>eNW'Vɓ.s d)\`I׸ k'cc[}:zR[w㘥>d*-2_بY]]Y_dispo'Us\#+i=.P p=|n.\t-x' 򞋩:Fqw|t`_t r$ϚENOu:~7O s^]e nza.߹x.Б˜~WX7471:bR~ɇ-*ϣo/%ހk{Gfˑrl;4kD۸{`?6YNQ bPbdlԼwDw=8E]. b; 9.~r:nlvX܀ Xe"?@mrwrtp p)m|l9<7&j11;ƃC[9i( s 8GÙcHC)X3\`f= }p"~'G#F$;=\}Fը2G,VOf 2R-´ >YrX>>NM}B*xyR y|hgV,\>>a|==(DGζo$~Oh<_l;l fR_VQ~qG?%bDžub&e/#z8Ϩ>ƠX^o!?G+ݣ*dAewOx~nC[3nW-L5+2,Yy{G--5s<>Z;{T. q{I>p4u #"31(kL˪Ji 9m~z C.Y.Q3+4+Wr[,ѸLXYeUxX cK'~.O^&֟qt32U #x̪yCkSVWS;3}8[v Ћ 2ԧ?~A1sf݊zhmٷGU'b7Yf 7GE3qIq]~JcjٖRؔV7=lS752ī!UO1KbقX&*m x9- Yi%5L=[^RX\\]8/S&Yͤ|% 7dZ->Z6_e7^4_QNNoZX|oprS} N-N8[6X{jqvgb3zt/~xJ:ߕCE,;`~kdlmmqbvK {Xb8 Bbu]vNao"0U<\liLH,lj)/)/l.ogTZDx|kfU}hdL,]C Iz|tH+ - k9%hSzT(|ư 6 N0216={tfCTXVl,PۻʪܝZme5W}L|RTl/mIJDX+((!*(X\@КW\&]Zcu %edw 4ZySGσhPQۀ^م%٠o]?29 cQyՅ˅Hop426oxlr#@_h 7tA`0U)(R'VCc@Ri"q2F!#f0ل 99#CNgwP7™)T[$'~Khf3Y %ڭڪz*|`gєAO1r[󣃑s~fFbpyo־ܟDֻa~Bf0 J]^[WG&% KL.(`AY\\ XMX^kGĥ2ExM gp|qrq~qtt O^L\[xW1?+< Fx5MKk5:.aĽ{YU ;5ްkIIDATfuCe;RYō3ܡIW$i(kmOfT&4%C>at;j6|NB_/^o *+rV͇WBXq&ፄ??wZBmJUbKbIM≈U<|!NHaH8ftēT64WA9B 0hq)lhl3{U]#@?sXMH,(J*^8$+,V==3~ɱ%,WBgqH.MN $2| <;!%`ڃNLBz3\iNA42:0 _ =;v-,es:zͱCS3 #$uAO T SC(- 0Bw 9^06PH!T; s20I<_XԚm:i2!ND3:ޡ֔/*t<8g'Zid3,D&u\n;/,Oype}]R s_؎vwz{,&bs%d9N5_?8Yz.o潳 7PJNvmNl_ýD+ Bj}k|6Ca!oa|CzEV7u oU.7boέ{na{ܜc8ۚʉanVyHYRNlkHZexF m]pU!كwr }=>5a2j ۛݝ9ƃ񇕬{ųwKW/_x/ϿzADz~Exj뙽%f~u4[,\z-)YV>{*%QRY&j=+&K=ǔ]:(OZ> >U ?_k\qM_ كHMcj#806,ŕS," g*<97{s k7.( gOR92[,7Ut6O7֎VW W.,%E8V1..Td [!ȣfY[W3:XQmrx2N -mټb`Ƞqb|I7a:-3;5#K`hSTZk9,nƗ IY9nOLIG'>'v3S\YSLș>޳gd *(* WTw *jdŁ96NqD).ٸ?OE $'./eC<䃱⾪OncS܎Nɐ2ss٢ڞ=Ihf 6V,.QM{ou]^ X3跩cUxgjǙ 4pNOS"/OLαxӳLE3sL,,BXy<G(O|m!"A$&ޣ}(7TЋ?q!ey^0545warvVKAOZFַ'D?˚ںek5WTؖ0\9Z9 kw⚙,Lnb~֠=:9`rCYKCCKυhVHOV::&vYUyRmf%d&X9cG؛Njp^.yK[|Xs\p֌#~rY\zaeX&R(\  Ϭ.RW0b.;(hI>ڐ f%%FH62r z K+Ƨ椪-&WA o+"o0V.lrǧ[܂b{O, % 4\/Rp"iu82XF`.^x+vD. @2մw P'V I(ۅfQEӞdGG? ѼC9<9ÓvIAf$u;H6cY;>̊' ;Htc3IBGI}<)}؎1ih2`TVp"녇-:n=CF4F F{G\s!h#Q0ܺǃ엟¾ :'  a b`]8=6.xC bo!# b0C/tOd2}a W.M ZY3jlT.1f' *ۧƧZαŐ[;Kk6uhTv8 5њ:ݔ>պi*NC#"'=(k{G`qj?!,?̀^UP$豽ļFXRvA),-8Wjt^H@M(󣤮;oft躞(.>6):=.&#)xVFI7UaL 5&5LmAtݤΆqMy|s3 0 +GKƋؗZu/[|%\xNΊlĸ]އDͮJ?(n%8hW}#Ae\^Q^T\_L܊ں ޾OJڃ|aJbS|"ʥe|$WO}EEh/yBOd@:ڥ>@܁5>iv5ј;YB+%(A#>xӟ>`(D?#ĎdC#E}T؆C]yB,.#]RKP+=*ʃ]ڊA0+nF,Ex #u]wFh̖!L=8};F|kی=Eؤey3. 3nx=K؀Ћnl@6kah2w2 gomb'Ccss98ceX:nqL314>5/9=Đ9w}q&ߌ*NdEfYKغvg ;wv18EӸZbU D6[6I֬rX%R,F6pN ?l05Z 践Z-k* ~ bo4iўjfGeI%k -kQM+yV4VtwƤfQr'IM%Hk$7[A略Gt5uM4$6썰W‹_~TRHEÐN MY족މAFym_ImW}K_}S_I@}%V,<D_=hB _mO2UGӭrX9)(z\#{}Y>?ݓ6O͟r_?xD*Pµ!P( wTopѹ .*FRrWƧ,h.DHuɞ'˜gefdR6V$g+,E,,2=D35.69̹YatNk~n1333SPc2̹YyɘfƲ3G=3M}\ XƐ.QwZKF8s|[O-yyFו6wNONfLOLvt6wbCs{k$֋f$Uh eGi AVH--]}]}ͭ]M]=;66ʜgwu2LJ;zZP;04=͙eNNLLOMHB0|<xPf<<5\\VxUhG|'E<.qaEoz/xaoES~LUoռSvtĪƮެw#@BU<Â_?,zqk!o=*Nȩ*,Om-hmgvdf7U4 $/|3$">* Z\DZ%DxV^D^ #÷Q _~//x~swsq'흇UוOfeϛNf2q'y/q^57 b ƸPMw!h* EUAHt]{{ttU$Kp9w׵{]{d>5XEߏ:=njr.]p]|8 kD9i}]?G)?Ak9>v]>ǹ?yr|\tf>Gl>&;]E؇ǝr/w9n鼝'88t9dZ;#w{m9y4oGn=5mEV]i}+ 3Wm^a_6Y]{E;הZU /ci%󖮛 5kMթ s,\4oe3Җ&.J=7cԌ-ZVyieeDFK{4b~m5y,X,xΒE+V8o\RNzVkVeP܌y,\;oAm{8 ݃q(/8 qUE%V,??}qffYdаɳV/(Yz݂LI={ּ#Jt@’MQϩa`G>?*%cZ>qщi{tv#ƴn?͏f{ЦۄO|q}^l1!''oq%Ys2gO w?Gb_{{z~'O4Gp<Ϟhr oo^9vlҡm)SNڔ3wC ԩg-۵8|$Nԣ[:tz^xѦܜyiSNM'+VN\z5۰vw o3]oKۯ:"ZյsWNX4weZzEg?fؼṖڲ yEZ{e_)اESO!~O6Fj󉦽z׃z>~χ&=ųamwL:;`̔#&v;S}7xbǞ[߹O;㐩3fLOeJ\Ѿϔ<ýgKbg>H䒃<wi`&e3:'P )"ėVUl8t ܆r/>.<]t>;½~ɢ' wGO;<wqd.< vz`ǡܭl޿vU-_kk6^a53VmH[Yt} +*޵vհ꒙ sgdILϙpMڒyY`KNѡJ.ZquKrӖd_Z<}њ+eL[bR UffNJJ`ṯ20\`q⌹ɳS̛;'Mc',_v3(}>sӳ&%]vݦr/_|uBR)ɩY>9H>FN=nJja CX8ua#f-X97u GN7,˖^ۀǽzg~qLG{O="uԌ9Y݇/y[aSmz AׇanޫuQk]UY[ ِ7i}򉆿{x]}ou?wC0X Hcx5?{ݻ}?]k%\\zs8zF7iآ&ϢڽkMZHJ΄iJU0-uv1~=,ȜEūY]viѪvlpϟ<չ9{lυO׶èGƝn{vyoF^gt~Ats/'v~QgkF] "?^'yȝܰ xi{. :?'vxNoM?֤u禟lնOO7t1.|U~}QQY-~qqi*N9TQn5zUu_|Тb+ KK[""zaB/d5# -,$LnbJu_-_P\\)\`K}8ۅ{S_]\W* IHǦ %dIrsi JNEEr*V 9RrAIKȌ`[G\R!|kܝ?kV%_ġDR _=s׬PTIpCB.rg[=@y]HKsJC %].uEҎuwU%a$ jAc#  R}szwV# 'й 4Ag5(IVsWD.]ǿg/$3J?b;b,*{ g!T*'+َL]NK/Ds[1%p_X) \q* [=q"~ZܲS6G3Pͪ4CLDT$ԏVB/bbAkVh^v.:Jd/wt2d $tR rSqn-K *9z1cilI<5g(`w&*A Iv)D*9-*@k&٫sʠMZD[ITlphӸB.N߭ &AX*m- txʤ}Ng{ X9u鳧NsWZ! VVMqHV +K[6l\qZmPO_*/60V7 zN0π;&sRŐT*U,?;Ҵq6*zҡZ^fqcϹ;YiΕ -sA:[Pr:~hl⣈~94biE529u&FUT#һ;¼114 )>dyTuilp}p[ 7 54oX}Z*b<7,T)аacF8מ|9;dFFyNVKU,'sXhCаXiU<'(sHLs[J{jh7l,D V2$}ْ/=W<+.괄d/TwOc_a.̏'tRdv>=}b'ƏJpy{TUʬR$5p,l ;ۨV""R$+)7E*mT5uVeZhTU}XK~;Bˍ7atKNV GrT2[6ٴ[bJOn[71: ',,1%8\Z%&"cM.1:x,|΋V<q`bdL&ܠ:>NI!1RS֗*X_iNH *'ܻFz5LRAxB΋XKHYEj$YYP 4lF7ݐW/1}(TŽAϵy^Z ئ"r6Vi#^Qڅ*vYBLXD1#FZ;%;dQ#Ǩ)iiZu<(=@g\*0CJtK ?R&RiKS/R7.:2E:A䆏PqxQfھ4U9/:v?\gIw x Nh 0F;:3i0ư^{X˳a5k־{oڴ)ǛRgnڴ.ӗ ۼΚ5VAwlيm-Z &w14pիhQʝ:5;<,.ФIC+?v|޼m/wm.oӷo&óyqظq!C̈:`#1Ԉ$pJLknB5@|@UR&"߿?zR;GfRRfvؑp0 %Id1bd¤s0*u jr o]V7o4}'|J"AXSXg7D (99y94 "i:q2d(`ݼy 9V0`QA/U!C6IIӥ #GNJ*98 Ymٲ>(g*/m9vRAgv <.\4xZ zd8Y popAv{h~niGQIPIX@hO&N=zA)uɜjc֯_? V9,4F@[XŴ*~DZ2 b9P6c4##>mk 4C6lY .]݇w{m+ʮ].h)q~VA1Y {ꝑ1"ع رc߭[ӓ_{5WwwiF2>K 6"Ɂs 6LKu3Sjذ.:4"<9'&&"FF0RyVF׮(?$ֵU#Bzz{g-#0F5oР]۶mEDZY!ҥ&O0{^zmڴi۷7/7%&&;sşӦ% :.^ ԥMO ƙS }'pB)“dp;35W>HHƆoZZzQG# …ً> f[1cƌ?y۔{>jܹ3=vaQciӦk/5姂Vܵkofz;t7S/fϞ[ƍT7vط_2c?g^N7-) Zj5/-+2';gdr:zC(SLѳ'6m:k6U㇄#dAP3'ie({w4?3r/:w]> >y^xcT6+*G4RM4vƇt1bCa2*!~ ԩ2Xtq.]N?N:G&MHT;L/g34UC)zGH b2/hԨ1m׾=90\Ǎ 8iH'00T˖-%322(# 3((͚5GBerrJ@ dx cTSFH;zT^ZppkFfv>f츶LBܙb?laaPy(S`+)hϞ}Ӧ 7nH20ϝVqT( xhZ7TJJX>[ igQq;FSm34LׁSP.`(&\,#ȁ48gBF2%E%11TY='y EfR#Ӕ)%qwSheu pZ4[KAxRn tgrgcA,g͚>}ƔbR%&kv_3X'!1MRSY av(I NR;j&k!ـ9U+h̙3T1$$+W *J3D*H&!_QXAZ'&UK!CEsʓMp$>.)z6Nj @*SjQiuI RyR3xRTȳ ??t'QhN扮8Dxn,M!0dž?,T)6GUb~ aDK^ [\W$|.Aܯn q O5śx% X.!HJIWY RHdyw1˄׫ӧ]* Ke%1ᬄ:!)'2_^ל Pt¥#PΓ[By&p9s!' Vsr%z5h(pF㲒ʺ+D+J(u"[jJ^E|R_+I.jQ}6 W.#J k(XT_d֬3^-^^O*UѵU~0BdI0bph!M/ȫ$zk#9Hrz5>y]~ $9PtJ(=WU׿?W翢xxk4'wY&T_=^mW?mur`Zfz!3ozU2;L\>XŧgŬA+T'窑kz]Z}F@ 11QեOlA(, ddg3b!M.U jhXpB9f%IyCrN,U.vd}dGLGgϱYV+b۹RO 54=04*`BȎvϔ?\$a}Bc*9轓uDXGJ-q2SD.?|Zs\i#(Drid}6 bivT 04ʏc<3kUqfrw8uYޤ*.7h-nCUeH2+>`( d/b.s\Z* v]B Z2W1# I9us|J > ra l܏338. $M]!&~ܫc)IKbЖ{;ݧOp9Bܜ8 TK5r*z?+aI]AP.:兜8#Lj[~K[n ~ٽshXMyW1? & 7t)L ֳ;Nv0bSt4S6$ueΌ`x{~m `s[l@H7yӦͿ/yifQ/~gyF 6!ERT]# ehoĨJ,8Gos!,*K؊uyajR=?я0 q8L9DN$]:w~IC$f}80ʄӛD2$XO&ދq920e)a\x j?;.YaqM7 Pبs\g䋧4*:K~3L+|_Т 5p`}# $5i6mX_l F0`;۴ia3im_]6j蕗_(ڣ>(/y?ΟX[衇^~3> 9evUi,԰[߸UAURVNÒ*s8> ={b5nB㎄1J1;3?7־-!P04'&P#4,>|=c%YSgb#RJ9)!$* eU6)؟gL>6l'?%Q.,4c"c{a'V֠ fa9yC]>$DBbQuѪ^~٭VTf>25`Ft(,TbZF2wu(mnE-A,{c矇 `~wЗp}^Ӱu'6&VnG--/Ԗ-[2XPe˖3ZI?t0A gCULAKתz-T9RVv7K*?XԎYiXSNe˅\?{ꩧpcƈǎ|U+_Xy?o7F2O8]%W_C駱cu]X޺m+uR֭~_d޽YGh}ʰoT<]4,u UB]K^(KCXƠ^VVuS 1ba)0 ó1\Ԁ:t7<;vyVVATŒFfPǘBٳfj -b}k֮EXwjRy bV +ê2f׾QM 7 _JS0H}[_vϓm LG Cl"тt?]WPkٺil_(z5*x֯˜FJ2 ezE1VrTLrn[c;GB/ekři@L W6OxPB~%jR#Mdi=04a { l$ юk  > H4Rե+T9W 14oXPnc*d.)a%rwXa}BTQ=zNXsgPa}C9TmA)Pn@?B^аa#o3\,*a) C)N}f- ahT6oe߈ݕ2{ou{ώQVB5M#jKiKU7߿?6!LҮ]3f7nq={2tLnۿ?itl;Sٜ޻woqo۶O?Hπ\G2[>ȆsTlofñSNup L~]@yWO"d;G^'6_i='O<|ӻwL,/cO>f~ mҤI4hP„K5\+PUQ8 e42w;:{l|KJJU uЂVn{auC/ IWnRb[4z$cחK/޽[owv˸ݱs'r`l3{0p͚5_`J6l1 =k߾P+"cmrQ˴/9Up&5 7~}^Ӫ.^+ל2]1} Rn(:Tu DOTt^q2S(Lwޯ9v%HYeÆ L9p@V33dIKj|5Z2edt "FxԔٗbl9XZxJ77εkZainX+T,RO2ӓoI))x> EgԚgL-aJNr8|e0E*>q r^:H{Ʀ,&dwaO,KLU*B O V-XXY7CMZA + \[[UP)1b.OW/n ׄ\HU.ETH7 t֍;@ z9:_#Dz\.Ask8pcǏag;E+U)=-^JL}Q=xޅ۷ = D*ZA ZhgиyшQ&b#^8ѐx[8}qX(Z\3zh, lٲ:uT͟?}c{[&%Lsg?h*3gğ]H}}&L8q1?nq}yiӦlĞ+SRRZj2SO=۴a7<;-y;sLzת׳?llٲᅬ}RQVaS>obL :nA gCfFCJ*y!#a0y 4T) |l”g 獟{9Pm/Sp ;t7YBUׯGQ$0YkC Cozg( #*?<96xԩ+VocϺ=TjѢETڵk石 6 ua>SO钮%eڨv*r<5c5;vr={`tL Z EYYYNw8tm)3!#r&zΙ;iƍ=1[jڵkcw}k-1 6M `ZL/.w3/h[#GĿ޵BCRE6n]|b~__ :S2_&qRO|XՃA^>ԭqTGsu%*&TLnq|5SP3T eEO654nM4J z|dLNPw]>#<{ tzv\!n, oYrkAIBB "dB*A$="S.<"4GϿ (:*{Em䐔B}( x!.x*cpŖШ:Tr*;q\qFݷw>>νW պPGj TYV?VQa*g]/Y\~aK,3]x SAM+0b)ٓl֭|E|c,c!n߂φ-uFsiKiJZq[**6dw}'q dpŸJCBkc %! !X CѭS;ّL(dѢEhFt:ѭT?veڨPѽlh:hK ~ErY`1Pn87Hf98wy2-BbʆEnZD"h .Nc2B#F8Hۺ8~(5hh7^TMĠ.(J_٤1F( Wxy!2lYa]Rյb|QqQ{7^K)(&xÞCC? X,3=d}yXaBB!N BCgqW7B“; ( eJ];\y:*l4Q"<GaA sl8R%U}di2cĨ~*F%DT>5A“(\(V,Zq7%ÿk1l:qxQC urZt\qN >(Jԉ@nsIv;4߸XE BpA*ۙ[ȩ2NiP1ɰ&ڨ}bbf6fEqt_~y=}bPY-. Rlk@2 F"Z'Jи.}5ܔhJgO yߨ|ܯuKtG?~+CB;z u.Lw=lS@Uٛ]6j:2kƊo[Bиu(*c_?C]hp+kRLدE1ũ.OY~ЛɅPP7*𨶊*((^m䷗k-wY"`hUzRp, p :?h0TCqwf=tME?ϡ* Vz9u6Hɻ=8 HkuX#0 Ea 8k[8ژj"H7+T-1ny:m@mJ< q@1,ZMP>jHOU0<(P#k2-J@]!P3ҹú8O"+2>UO–!`܊Ԇaۛ[_7o.YVFU=sṼ&|04Vl!0@fT:Q~znճs)1U IɃ9yE,CCjCUA:-hUJ7՜)UX7rC0oK7dacc5T},Y–Q3g<|0nZjCUt5qlE!WxV8x2VXbF2{G8؇;B_Þ5ʄB2 H`RlId5*֪Xb5%m He@PஏԪtTUM h!`T@5IJ3 UQƕ E& >2^\̸ +ZaZ߳j/LyUVLBʒWXbyʒW_>+ "Y5Ņֆ,T2˷2?63"OQD38 CsūL* 2H Y>aZ f_>P%PiaͩX"TBa<_-*}i ; %Ya'+Cr)BiL Z^6W4(Aj>Pw#7(;OZ|4I^. >Z PaYO} 㪻J}ɳfT]ve%D,٭u} ω3|^LVU߯ŰAblggg4hξ}roӅD\j7 sYS^p6@gB!O䉴-NؔϑVCA&EE}ȪA ;O!q-l@"q&NHEdJWx|Ja>S5mEFo;]in&PvͨskCUPEb7[L`aQ'pؘ! Rnn.'ZPv}8`L}{I9ַ|r… ' p0POCh8 'q0ŋ@67k0O;r6mڔ g!-əMC$OH&Y7߄y =0 69'PIAkrRxx8`p59I"`|E==/qf? ɇ_!.]P_64Pbؘsߘ4Tu {m +I'=.CaF18~ `A7Su 3 +$ {b|Rs8// P+BWkРX50&_WBo0ACH8oܫW/4^A>"&U03NL~yU_D5q`UJDC_҂uQC8D@IuɫT(BEw!2L}9SWX*?1™y⫿?O$&.yEY1u^ j j̙@zLpPkEh`JL@O"P4LG}Y WERU }#UU?w܁OWez[2SU} Z Bŵ8%8},;n gDR.+A}4~Эq4 .ٯ:|~n~iɪs*U Z/#k8 0߁h<̄)E3UDIѵm$'1"3EsSPfzT H5&LfyLTV᠏~K+`>1U!2p]wȂ&\57@۵QD9%C i(!gHC1 u׃8x&H4)ֶ)ryG`+Ԑ1$h TzRs4]X tuM :k^p_~;s1񤂄OǷkzz#Yy JW$ ԆXCi֬yf]gg,]^\۬5f@:Ў #vt%cЦ"_G'kn-#>S a޽{+ IzR,`gjJUt<n`7TGb,S(_!_E]`r[HDy'QUyjS3VC}m<5GaM}0O Nį B4U؋;zYP.#rS`Cō!WQ+ 1!Y~)]+"B%K/\|ծީXDnTH4,USw QOXP*IGJI$& -qE "|;޷]ZRUp`k6Jq(AG<Ԭׯz C @-BCi@K0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B0 "@UE&!`"`T E0 0 LCE*"`#`T}!QU(D0G*60 C P,!`DQUm`@(FUYC$0 PB!!=FUѷI`UBd C zo0B;8ȖeAq>-R:U*V1*s9G $HDfqϻ6Hvud?ikv Q_??US)3U)Ui3us~wj:ܦ>9(yf_#G3oz_B#׎[g;R=VHOEyau.| >;BjsZvrzWr;^뢣Qਚ1Wi[{xt am E1r?uȮ=) l_ҀN᳛twB\n?mO_S]$|*pq1>+i_b" $N_~|Hw9c4jqiy>2N.C-p_ڋkTbk8^1E+>-4Õqu'#ǮZ%8Vji$QT4SEy[-m-OU2")٢ύˑ1> m*2VJǵW-1jW_¿+n7 5&~zҰyqYð,bTsZ; =pX;hpx n1WsP k6jthvl}ٻ/̒?^yg[q9;k*Kf'w`B_9ӯO'^Yш6_]< lv1%ܮ%~7mbӼZ+6E&[SicZfzf1cir5AR4QN' (szV{ \WnWϚ7;7F[;{ u$S3IUՆ݌UѨnjn%| yڧJ\TNC0PVNWYC򧽪g3G^:s9c\rJ:ޣ]loVw8iir6sIׂaq\Ъbhe]ی[39i9S8#]^tz9g# OCeՌ't>|mw w6]7scXZ8{9}V3rFf yĦ%|bapT]aدٔaMlGpۿy5{z֌T2i\OxwJk@+%WL_2@1Ҵ1A_;NAyj-W%k]nFfRm4a)WX]P9?̙U;c|Mj/rTC\5XVQTxVlcnyɄ>wH#a0h?Yڰu.֍'L+ z#\?Ji^Yp&ͲA9gYNjov16ڗ3:ך&@ѵup롤\EQrf%J+Nq|sNi,O )EROuehjygzb]\)wN\ʂ|>Z?&q ⪑֙> #.-ˇ}W5S'e)GԩҜιu9=˅T{>ޥe&h۪9.9 m|'7.nXěV̀p/z8" 4 K%]v$sjr6MT̘3{_ yL!_y_w*u?VV%DZAXiݧӚQyQ띧S;v8qz@ml(oN4쳗 潳yݕ-ۆnO0V!)5!1<^yz`;U4wl:qid_/LԧN0o+ z%QZMPa*1&CQ: EYi?/{q_[MA $7ؿwW,nsNqx]4wKw3g@ D;\cӰ1=r5N\K5L N9*PUR}Rf"uԋYR[DOzU=NirHAFe:10g?Ml_/`|Ext%۽{xqXYTs~nI ٥ݭ\,?0Sܒv\-0k&gf7p݌MK~pIieir;ű-!Ny";O3W4?kZ-VVSږoLNfmIs;!ٓZoLNM!ܱ!VO;'OZELm_y#:_KRXs &xWHdl"[f֝J A Һm_4o=D8~0gzx@IfNA@&Mob-A_5<˙)3bh^mKFRz^7SʺW+ W)i]|\+(JX:s!&˙Ǯ&Oe]em48ˆf {3d qw [C\/nNT)cv"Z7,G bAzӻ7Lm*aϺIU9v)/uX6U<ջu)D"k-w # A; 坌V 2Dhph:g7_@f+SޫNo_ ~5pzһӺ7~c;+A>e5-5ȞKoT4NEU &V%7[K$,eՋ$<-Җ,/~Ife-%5 ֓[$m#*"KiA<ٌi#tp⌭_kY+\.\]Dǵx!ZAیv>*~sG/_A 1#ѶD?">"}N ()"nXmr0]+ HK="f`[ksU#+}8ţ:qvq5+1@alV=*,!(Y;%)$> -lԌ6ɑą1uIf .m~R:N;7 IIiyX#|XUɏiZIhšNdoB&#t;;<K>:.%wǶb4IN67F} % 0Gĝā61 }/9ܮW+I!׺%94Ɗ\˟EU/ޫ"dO`zieBqBHD.ܭZAQ»UهٓHl[#8$~}Bz|"WڣN%?ؿt/s̩GfoG%t 6Qb[S{{˾p臓4]'/jȩFDDBqQ/zPp8tdP'?R bl.O/GN#?k9n/r qp`ί>uyg'reF(< vHcgrD64rVɓO{/DDn)]􀿢eDy*Ϗ/?@'EvB0xaXl"b؆(F4h}Ҡq1xt #/Ij/%%\bŜE\b0RI]ܐɮV̡ Υ߶8rލ|bEkE]s[^\=,q"]yG <\Ф'w,r"w{SS7 ?{Ϲfr˿Q".dT~RSr><3EG˽O58gS]"5hANC4h<|"G><˄g@7ݫݫEʨj1$딐?iP#ވݭ#EAhv}orrpr?$?:M;N%Л3͹c= ˧;+ fP&]ٌ9Nŝ1qcO>:8G0z3zr?zbc{FwaI9b ΰް%bw/֠֠ݤVF:1ʫsTo1o5 j qc{GZFjnbX ^%N @7NA#߻ڿq.9Vn ;7n ${oؿ5(<3tps᭡C7o:ѣ;#G7FoD[c'5Jc(ކ?1vz'Gag;?;;=~zθ6&ݛ<g&&wQ)ǽ)iǃIgєC̜EO;8`fѳdzΘYףYW̌+zÀ~p?C sX jbf=sC'!aLOxİ<ez"Jn#zyatrܩlO ۓv'q.JfY3H`8H g,vѣi;813'gOϜ<>:z48zéK{0y5q|㇓''ݛ:Eè* '$>(!SQ)$B*]PJ8&1&TAJR41q"؅XrJ#Җ(F`oj$2CBÖ'Rb.%hTB=Ri0G%].JL #ES=4k:6'3) )S/n†I˛qe.Rw% &*Y?jt+#˜,W(aO] ZJĽ c)ߟ# #x,U4B~j]!cW6d`w0Pӕ! "CHM7*KTʂ?Ÿ pUV , K}/}/ʹ<|pTߟ@wߋIT&B <*}0yf:g5; a9 7E<z 2Ec ~˚1Qfyy'a<[)ҟջ3:n:w^_7UJ|ta{J\}<&K0ު%M~ҙ9p,GI@Ԁ&5]MuQ?MZfxژ?߾ (|-[Yד_wdTA]]x!w§ZݤzRkT/_>eZ  [sft ^Q풟T۟+>+V53gFfϛ?0QIG֌ޔK4iMD?{7G+8>￐Rښ]{EWsXuzN]I"4OLFڠ#}Hh&YB!Y h$ C|*]*W}n׼,  } n"!54!@!.#Up!$Aw@ё`d8 "Z'aؕHM,feW,ȣe* p!gwSrɨ7{;Y]K/\yP4|=kމ+Lh(%G\yAreʀ/_)~ǿȨ޺2^' QX]=杤w~aw_5oG)7˛JD";{Jr_|r|'읻I5sbG}~{oD=_~q'wx3d _ݏb2+=ïވK}f>8Wżv+lNqn7aV_]A&w^^w`Wy!}aic_P4z#╏˧V 8ILgi!1+a|G5>Nw*&;)u/w~/g-iuc 6RO!"˘ތ)ݔv7^|7*;?Va'?jNWfLH@9ٓh-?$Y4CY4 $"FsAR Q,GH-?#Z)f$3~H"8=H bnH'@ \,d6}$4O$M(#%hLd$&:QC` @SLJ8]P KC˴ʥ @GM؋l9]E[ 'K)!gLPwNljwRe+i5+ʧ7q؟,k~v6tf\areߕ啛 >QzN_rvfG]o&_ULRnT_~x/aqSBP7ki}06aaQgrgzzrk~(O_/q'wOV>O}㜌I] 8!I.0#^t|/=温[?{;YNbryY2[:h*y?Q'n 08GOo>{ݛ1%]@ Mܫ Sgԏ>Mid+!`;Ej1 >Ӈ3g,6=9#s^$|s?"HrǠR4r=׬#\pbak%&ܱPx7՜3VdK&7I@?&TӛB znBHbY$NB(q!pKA.%$ bW:'Rh"$vz-J""! i& ol"vKFTnEɑ%Ѡ7Ͳu-wUZޞj֯NЭuæ\\7jY34sl|AѩPzkVB 21IVbi 7$ȋ vnꑅStEO&B2*hC $*zW2Cg:4z`$ћaRQh|r~<Q*Fʭi.ݢo?j" Mth%yp{ӧƅҞtP>S( (]wB\?v5ךv?t$: 9{BixHa*sz<눙u@+=q[1&2 rϺ07mhyLl;3Dt፟ёb:&D/Hs, D `xpID4A[9x. z aZ%6@27 $.xx.vC7@:!($]B BHAڈ䌐FiIHȤ[$FԖ.BMz(.P4-ggt-yUh,:Ѡnmn./oW zˠVo7;m#?{Ne;ݛA@ !I@BYHE1@av0 |\"RCCB"#"y0O+ <ʽtphDo*Op!`F5b5*-\.ZWKrmtHaz,f\M.{XV=Jjk ϐaDp=!W*i]=ղ|3*jb خe`c{+g͕'K.EP$īVPQ˙}"ÜayTw~h.UԾV/>㬮ajR%?ye`yI|)H/y=ܖUcfEzVFa"D^ͳ/|2W\*iZ ߮Z$>J*i+qDw/ ˪;E==_JC uّuR=d"*zv]b &CfTz\yOJ|nj\y_jNXѼԦH~,zx )4M˜+%)iڷ $-o FѤ 3;odw/ȃg#Og(cfPI4fPRZ!1,z4PE A J)+Jwλ@yDv sDU Dx&T" D|O\LD1%q<ɗ@"aVESRJLJ#JǁD0d҅tA%B)B%:"9 a( !NCEOScHa "۝R߽g?ŕS5jM.[-LU [զA &l9޷:):\6cwOnTl gP8 "qL14.8%Z%њw&:L#!*!)pPN)Bc!).bhZQ ҷ@AX* 1Te:(2, ,c$$dz`b䚏K{iՓ/򗀯 \qQEѧr n?L,-j"{AIլT4P{d&]T iHc[v%~nM[T&ϕ##ݢF__{ש|G70+G(]pJd@$p%^víԒiְ**­Tؗ+K>HʬPY3A.m&P%:!a!^IlQ%K>|j>FC*zVEKSX|E.+t,6 P)x%X_u BϤy y+(Dv˷RWit`Xڑb~K(vB(|qs4bNN󭌶+E` J(A"ȟ*ꡥ )&!j 1@m_'5,Įut*[>]lP%>6&҆.TUNfVP\ӳbuXXTjB "˔8.*}. EPgTբ 3 l$ɚI6|_b-#6mB[I{pYlr*XHdn &CC@ J 57%4HL LLz%qREXv B%O1Gr! jr hHD2P'>S²$d>r:ءH,,nO|;7{w  *ǻFv˨lMz~{l{NvNo6M=5mϞi3Rv`SBaB6(P`y!I$&S.|@ F@Zʔ{RF%DDZn5u ~J6ϭ5T&1X.UtM|3\.%UI(,Xx\4FHA?ޟJ9aS/?myVXM,_c ,"5'vyhxJ蛷|.$1a4lz(Ho"c?>wD =bX[ KRx3Bg%0OOfAXǓ sX ADhE+~,~JրkH?!`%: nAxM "g"@ H`ڋ;u$-D+5xJO2˝,=\bIO2DM6!C(ʁ'\|*| dx(HaJ ~ )J'5V"<\R4?DP"EY0H'1DV6I!!D~(H "e̖9! T;Q2UGVa=ˑBj굜/W_ⷮ}~W;yMs z]VYv6ˎnCmhwwtVj440kߤ=5v5ʣFmܔ6; IYU"p!!@A E5a't:;Q=4P"PEJ 64@ !*WQҽh@AJRIUm*UTQ~EvRMmP XĀ8i^l11Ej蒼 wia+/k"{/|(g3LϏ8OsOXL>wF;y׏؃I%kXԘ-jq 1KԈް6+"9bIC" N" b>18:L#h87l"V>Û@y%QIt=QI,Z%6SI= 17 ]!H_3a8Y^ $OדIA4fN2r8nҺ.6G}Jv/h(# a#B j$cP^ JQ,wijJ"rI4h7!"$JؠJW"Q0ނkFI\gM7w דvr4ϓȫ>((EI攡:y ?Yki *N8HKJyQX$ 7p d1)@@$w&dH\d^lPp! sgP0)1ɀMd@ AzHb)V範 V(X26y4f!y?GO|GQ_z|_/}>gh{cCRk :͚|eG= Vñ>y;]݆A!Vk2̴.JEza St܀;" 'H&"5TiD R`f HP 0M*\^ZBTRpC 6( &TVmSfU[tS}VKr1n0 8a9g$B=KE9:,ҞE7E{e|$sxOg,`J4}KBykwpNSB4&2L!5J^_w0 7rit I&2h N84$~s"u)~ %6iC~eߛbS||oU/B_d*(3A(g. aOE,#xwݏLJDAS'I`86AGMD(IKTjґDI` /҄B(*Yq0,D"tB0/b"%Lރ>+;PI؋` O;-R^LMt2TNfʊQ1-TM]䅻㻿O~Wè?AjCRY{ekۢ2od5Efө ˆ5F}@yfL%.[*Vh$s$ @VOD0"v@0PҸM5mS*44qLlԓaIkиB/ 0FiP _źApa/ /7)C8hVދ8OmCH<y{MōgГsT,GVΨNt9}`Jl\l/o]ٟߡ9QN{wa5  h<Vd dCjRw5:T8Fi (r yCpNLTR?`oYgVP="{_GeGԂ=` 3mlaTb@> ܧ{Ԝ?i|(?1o6bנ񅡁7CvD Am>C;i͹Mi|Jo` as W?ږsqψq)Si>Vܳt#+K_p~g,) .$G 5J4LVFHL4p <4Dh06 }'B*e<.V'"bY0|/.s9bxqDsPR([>"H"InZ1$6| GR )Ʀ,9x=\LtPO/"!M"X !&jhPJ :x+EKeSՃUj 1myE2rG/ґ {ðP G{}y߄}ƗnnOVd%ںcnm[jچdɸ0l(LUΆ¢Zk֏mX/x*A<2j&>R "\Ȝp& 48U զTvUnR` YC2u+4w*u%va168`iG javUAPO;#=i7F`KBU&\E-Z/Pk<_,vJ߿B,gJ`L~jrtdRVVUIMiͪJxSÝO/f%j#!ǿfVĺ.>7 nƤ=)o ~F0uZXnbѵQKE7]sj᧯2:?dϒ|4{;AVL=.l)niꆱR3x3_jJ+Q6+ [_ajR9vi۾1EKKl7NhLW6sIeď8rdK {Ć7ݓZa^8E), ;epaXnD q3x;'X8{w=O&"{Ie溲<#I DA( 3POB 1)6 Vey3i0zOyBh%S1!T΢/.q  PR0_*QK!)_,$$Oº0J' <J$H <*Y ZQeDF݄H Ј&,pj/_#3k֑DQ8BbÓ7ͮNjIlm韪\ Z W(¤Lf3ܨ^Jho?ceWoo\?~_xsp;߻÷S1"Um%&u~M^^)uK 2(&MeU+K[Yʍ]oo% Ѐ)H-+Ijئk\~Wb˷q9MCckD%$dwN=L,o~[#/9z9/i~zuW/kF<)[QL Pw>zY1Q9p7!k"*.uZr1g뤸ckJ;?{alImIɫx ٷcRF-ԶB3k@1gȮ6j3\bXa{RHyg97tLeBmpZRg =ŋ`lQ PѢ@[ ONPʾnN~vCIf}YIϘWFyiueMuCyNBfvU{ulNCi'6|z3&$Ɗûsz%(*$::-Wb Yq".T&ߘS6>WUzb&KQyF,(,]Bv<e~e#?R?0, .,#[@w&IbLYBwaIʒp -xeғTxd{"ɂ]huB%X0R ~8d :< |lʓrev ( V@ (XJ$i"Q*rޯOHP() p] ʈDUYǿC_4u pf#\ mbm-rϭ'c{M'fKCnv{7iimo1gHV5֬j[{yUA 4?WɏooB^_O~xO'D&O;߼էbO(ԫ&՚UlvcW I!n*ĬVtvΤR,n}M"_|aUQ'P> DŵC T3PιCP;TDND2"{(w;5b}~Fۏ ST7q_6c"Ԁ1ܭRӲ/̭C[5}1":[y"o]"v"'Mn.9$ޢEW"T:zSkGE-U]e}yUxIHyTzشGO&޹QR_6^V_Y5eԓIÜiEKf&mb2h@Ə]sTPRE0G-Xnմu$T(p #.8 m >m.@S p BO ~;o]@(`bl =>n*S8K@4 BIBP&hX( %RDybdWP(d"覕@ yǓ _BK䒀r&N**\B^L$0 M:#`h0%SB%0 V:y-P!ZR+~} l_yWOACDڐh ӐPIa0B(rD`4b 3£0Se LSƣj Œ]jnb!c (VӖRj"D ^84w'f d'@-FJi`qnS%TI=KjJ⮖x*ĮVEbjv~73=R:CN<(Z=;iXⰸCSm rLz^3EAĤx/mC3 W@3$6aa@Ld*GNC1LD zЁPEwĊf5! X^"X)t^Zy !"V(a"pz-erH(<HB7R+byd9d^.nZ yl5P|j/C1!Z%oRL!hVRD=A(A%Mj3԰A:!SBCQ5¼;^\o+fUpdۡ|uhe"W2)ʼc6LpbfqSmv:Nmd Fe9ٍUՎvK]ojmo?~kGP~7~?ſݿͿz߼toz/|~pnBY_P߰rEjR+7V ʍ3Ԇ LlV:MFB (jW 2ٚP[CK$Y)?NNU!v1QFbpF@sؤ)" AҴS6a@Њa sOvb,;ŶQl0FKM<;^6@f GFSc"qsx V2  3MEH}R.<2OmՉSkO'szYz 3MJG 8W&Tm/1=`Qgt&W'jtѦ<p[vV3UVrh C$UaKKzȉUdi\9bu #KhYF82@VmFUfmVC"E.Rt]HD&bW11gx 6//}jS_-YAFK oԋ_$`HrJVe>hII iHusBOĈ¯lZ :Lƻغ{zT- W5yowwgǤlbsX"N==-ɾE.ʖ囪i\3L7o?὿y)?/FK03; wQҝ~旾[w2k:GTIԲeP\HeRmuZr--.$2pbw}IV-ՖlT:=sΚ&Ը3f! Ԙ4n;)5 $r,$v*b vk8‚]ja8XT'8ߥ8vZFv!~Ơ) 5@0n+VhO}rO_vwaOaP,bJ(H&`.J iϔ>,v>'44ϵyfȩ~fKWJ<\.&.?A$pğhk[^%S9V#W-$Ϊ%;b%.hJ1|Y<OFܕ28 \ꭐydJAOٲ|Wo_⫐*pV@@WXR\DqU0`H**I{k~T*jւ5"PWjփʺPF![U$d#!r 5u~'6Jt׀u}A17?$6XLöE/чB*HPmMz˴O4Ѩ3ו[K䉥K12NEl`tyE?K18g/y=y1-p1ɦqg+ wt~\ȳCc9O 9FH-]bw֌6U"|Y]A!#mX!4:,47Oj?]FhBG60 LhcX `sTO, e%i6Q6 MS }`2&w¤Ctg HK#i#͘`asFj6ifI%7Ss1y#5o 3hC4˂ouG۞mLlvMѦ}owbWw P/f f1mmjz{G TjwfjܱM}^Р3{_`W=uM=݃y 袏SoN\y3j\[ ^w5b<|Y{QqbƔ|T ]+*^*zRT׌*Y9:@\]Wo(j٠;[m#<ӣO(8H MǔZ;G*#18!:6OSJsނsBGvV'][OIu `:F8N)&=ip&G^AõGֺtV`^08Zbϊp$ .HtYI#.G \CP爡G ]C۳~GBH*/hg|nFsb`ܦ^Ɉ=#Y"2m{|0Pl #Pu"s4ƴZfK#"5OO]0k A]4 ^I "`as:i°Д1<M (ghflaY0 a1lG4A":}kS:#)ie?U̮˩/ihH5gVlL*D1[^^nm77 +k?[-gLJgr!Z4DZ7882=5=[YU\י]x=zJĪjdD4?nzt76*bdKJiJoK(lm^qR9=-s33={?ټęg^%͆&~PE@33']H=]yn3#c}] -umMS >v}|}d0)FbS=6O2-;*b)ÎьVk3ج.9=1>7=962<96:1<89401?;4RJ ZkhnCM}#vַ44<ۛۚ[ڛZQ{Ѧwldph 6<7280?9:4><8?<80@W 'FGap&GGpScӰq$g~D AΐňmNL?^97`PqRC =rW_5yݳnֶGlKM> mUk`SXݫ;%;*< :L;9LS;v{EKp_0xzwtf5܎ )C  i|.;:̲fZn"3>szH1֭卹-϶ 9'iXNgڰAމ'\dՍ zĤ+ L.+4ie혵, lEڠ`ih126V\t=_VFȎعo!G3z8ؼ#m>ٵ7.ZZ;6'1EN! VzJ\4l~y]g̶HK4#f"1lU Նr[drE!N[LWlS,X](:^^gMM3XhUjn?<)!$PC ꌫ<l/i$3Lu6%r2-y6)O hwތeVhIAƠNA.vg$6nӖxX՞Os|>jP(sM:[ў('<1{x:> <'ZWXB)[]3rYGyTSgmا$AeVU3V;STNweV_u D~Xvx_`^O|mefռv|SP-RG/`U-6}5A*IDp4"thf$f1>|o t)Čt_$q-G;s?G%98z'La!Cv(̺d0JZk:Rs@SO |d;:<;S/Dv<l`' #ӥvy!Gqg8 ̉9vM.,.p.rh-c䈏;"׎[C%} 8]^=(}m}r>sO]'.;=nǭ:>ۋt{Ϝ@ Qcѩ ܧg3:;s:.X0CX']S v~QiDa) A ɖVqW5ƶS`  #;_0Ќ켗)4u6sh^ 1E|ժ>2|4 %mS7'ق~X&cr5u/mL~ 4<AK57~ r4fphp`X{:vO]\AlSj g9Z)x] B^?C >ARڇy~MPg+!Ӆ y10 0&Cih>< p<8սm}Gǧ~VDo[MhK@K|6r~/-fnkx|jQ65.WVxl$sxŧhDo`AqrmvyLV:=<5 d=d3s,pQ,^[Z}-`FfsQOVN{qQci3b {QGn ZįPPX_Ǧb,)fR40+k&M7/du<^9mHv F\7Rt4 Q..Ik,I'&Q\=~%~3Y6`rRbvHzbn[.z&d4q V{$O:Dal RYOSBY_,[RԲ)Y,V JCKc [P*5ӲB)˱ϖ MO2_Tt{܎y.gJfnbKBǹf-t;gm EkvEqPZ‹[XuFwhweded7{ǧK*kW7 "ImS+ r 5`ZfnQyurFyd"#;?~e]L(YzD/x;"Hry  &bhtp$A8CG; 96Wijiz?$O*yT=ǧ'Ț,{NQv/,,?%Wv<&dw'e  \, HEHGϨlYe 'v++vXw ]bLim^s7;U?}w|!;I`{^g{qҌOZNL6oZ@+.,D\,6mlE`A y|zAWءuiErp@E9۪EwslOvMw; 3J mv$z' !>'ו*H937"_-IEItyۘ@okOkٵԦS z<(-.))MHI/jKi A' _/f42LRj&7 v7E2Zس[p,ĪU$mo;&9W;1_^Ʀ"}&nIDATbR=kYDJ{b\=XRКSWWYYUUٷGi-Ǧ+J*S TUc6wt8BkZ@&O`2_0W\ CCچnB tp̳[:rЬoxg S",d|RJjFbin@TYӀm 6*I6T_?#KH{72 563ӓo ;734WZhknŮeEWĒe 52spOB8aG(I6g)r=F%p=E [ɩ>y=\[. =wd-M XVyE.#xt`Lh]><8Yz{GTnRN߭[4uh?}ʇW>˯{˾j0OR9/;v ɩ%Bxp`Ho̕ MUĉP%`YK1F?!\18 ^NⲔ +fyg)L;fnionYlDA =?|C={f= S_lN-iKVjΪB\:=5?hjji_WiE21 ǧcSM#c|Ҏ\DUH$[&Jqi7`W5Fe;8OIҞfUDV8&1J1Z8’2Ӌz_ XXSs5Y'gΑF|Z:8<|樄<S3]}m]{^,a@66r JDҕ.\׃qcvx,^yU-Oc$]6o^).Roȑ!'&%" +RF EUH(h=Ep ,C! A"]}*B!8 ԱҙOIe6Y9bX"F܊W_}|H9[[2 Plv2(UPX\{wr|zMr-N:>:kγS},>QOg^g?-)-e=ZWj&fLvdS<`ͳ\3YXB)9Es3 Ѧ5Xv~񎅤 !Gn ₌"xcI.x񵺡aAoinQgNynV..*|^̮lTv,Ju~eT<̬z?S-V ?t;,*{1svv4Øo4h,ݙ%طKT2)}aw~bVEgT|v5alV )P*~?JjIk(+,۱m?YCRk`_ƫ@zGĴzk`>^ɱxkO% ſ%G,Ƙ<ݼ!ol&Oz0kH Ieq'gg6V%ݓXqp+o1mX1w*ʄDNd$]kQacNk:[GkGzٛ[ZPt~dbpPn%fnml'Uv}La/b)bFH9,dVFVnyuL64O>Mh ž_ZYp 0X39E%ohAR D~նKxֱyO~(]YڍbV;OM_X Bie5.޾"\#Ŷnim/88nkdkj8c72KPcك{@Q2=;`Y<m0jD0-m EkJ@d9|&kA$ßh>msGPYNNd,R{B;혬cr^ox񭺟Xxrtgkv؍R{GV|(5+Oɯ+gYԢƩʑ;C ؼ {9Vzq]c@koý;}U|PƊJQe2ۯ=iX:^̨g/g>,cMHŽvR53_;(+wRksu9435$;&x!WmʻثX7lJ,>/f05qH/$/Z!"1yKGa)9 <ђv{[57,G, Hp]iRo v)) ,P LZqiNW~QiHc^oX߄B,9 'N/ĎmоYXd;LN4Gg.NG)Llm{zF\ Ņ9,yHW ˋMh( VŮrL*_ }0=~)^VŶ j!dD,T&Tq D4yp2PX0ZDA2.h ϋ@ $p;C*1.MT]*)df郰0+o fLgYq<t:JJ,#Z¿>=n1kC,2'x.,!zrrmcKg){XZ=-j@;̶]ƿ;c'u/poSgGnَ2z.un&8{& cGV Chك!7֣|Dd%}ն~p 3T7D=bV4td A[4x=,t_xW`{dǿF'Y'_칑R1'fdJՋuJhe5)ÌY}kFʇ}:;;8 JIk |3BU™[#œwFx\qpIkjd47{Dž-ܦټܶ>ve7K\Lj e;Z6R BpkZl b-=[󒶮fB{ 1u~ز-U}ʍŪta]T'g= ŏS^ @d49|HE7I@,_^#IA=:ɲ`Lɇ<#)j[`1sJamHc"Q0{Hiv.[F`" e|0@$a/*1#î&|9z8 @!(@>H` YPGw cb>+\Q'GrzF crph若X[`C-.cu; `r[!EwGz+$ Ȋ" pB7H !z2 # p@^p HS^,G@[:M= M\JgNj:M9lnamtjJX][z'sZw?iŢs,M8qcE&{:ِ>\腌J,_0ۏvdG cb׼{!?{za>)$߈34 !Y$Eo,eivДW =0{FfyGb1f1er::юQ擮{Y=+;GrJ* Pԙ ^I{)]vZfǙWdե6$4'T`#9dZf;-o&5[nBu6_h0iiM lC Y.\&38[8R5lZ\:nl^WA9/qqu+{W!".ўneoڗv\H!btВ22_RZ^Q>PT\Tۜ_8W|r꥝9 [\ӀՂP$KDeVLcleM,]A'XD e;@z~qv!YVR4+#zf3>icl'132,$վgyl6r}6wQb .DӅX3MVŊi0$黋fG;`>ÏfZm6=^1c,#7l;&V٪۱B 10K`-!DőL]h-`1c5RDv56(IM33^?MQ}Pp7Պ &3B!:99us]Avo7687+jI.IKyu~JlZUk[(сדMͯhfbָow!=:l TiCFl.QllR]m4 m"*7kF@Lmj^QmiPҋ5#.^oz?m6\Ŋt=шrw;*״X64m0O<8 9mT5Ql݃kox+;jZ:bҞqiWRKiIە7[^Mj{?Zzy=-=S5)W^_yX蒗Ujt۱EUzLfLOswLtMVu7745 U YDaVÊb/D~h {lb|6F*#F|OJ~ r88<$a|Ey␽l.ÝgYy6esQa9tglTM%Dr`b0 Fj68L13˘FLȐS33SS3L&zũ5Бlyld3S3eiHR7F}OSN[g_WwGws[WK{76ѫ/nFdp snjbrvzblܐ)sƮ6g~d,p yz]!׾æko<*~Q;J^}P—o?}nodUztKI(;k_{=jJuRNcuSOaeGc{_fi3y%{E?6p WbT ~Uᑹ좮ځԼζNLwud44Naǚ|TMe;Y6熷a'RϔhO^`3}/w]4tLjϟƯ<Pʃ_M{Fs3 C_1qXs> jӰ?q:hQz/|]ߦݴ{Tش{6φͭ7mM[LgpǙ/q6Խ[ڻ쭵u7y-YWV,K$+Q93g `#H`@DsQb~ $8 {{ ^!wV)9rէRvj ,+=r=vΩwK+=x7^RӻOl8Yq"|NܒC;o/?;%bݎU[lUxݶ axM\e[^cgJ+KW\9+.-.q˖-;/:Y2N,T0xUV5y3Y77`QZԼ)O]3nE&/˙:fTV.M\mgU^=oY>-ncMcmt[c{+-?RX| 6*q{A1ڽ!sseyELL3\cfƧ}h~C뷗'o*Q]"-tR.YpMznkL޺aSUKWݽi{쥫g/]j]|҆Ԭrvo-J.ZqǼ-+RvI͙bk̼1 6M];vƨe Ĵ)K6&E.(1iaFBjaƖEe{sgܰ0sKm9uDw8vc6WAR3֭Xd7gdMjkNYYqeQaYZؙrV'$-X&=Kkמl-8w_Ư;)~&%h-syɔy3{_N[~} I)|˝g'j:?8,+r*[rj{i^G$'3:ٛ+d<%*}ZթkO]:U'rWRqJ .?MKeG/OuU9J/;rЅCg/:ppgvVعXENXcy7U&m)Jڜ*sgzvqfNI yyw+ߟ]T]Xl\ 9ErK3deے!`k7]eU҆e7Jʚ4yefV\oݕ ܒa؂rM&g3J^HnGZƦ܌,|ܕz;K7g<#.!+9m̍en]&cQdoQRTP=wWfC9مG=sUgOpnƑ{+ʊ33GO^Sy؁#bG?uUY7.K4s٢i۶/0)7 1>i._fuVII-GŮ4d~LXs.C4?jjq7 8DKDO6^m;c^o7iHcIc[VTh#gLo髝?MOs_}_;o;]Z駯t]~ZӿO?=߮MɫR r*wmI]hݪ[dn=b-2iʬSFΣ_2JPe{wVRmeE<*{UvU%EEJTZ#B~i Wq)ʫ*{zi9yQLUJ^'_T͞2(Ģ,*dNaIaAIrȍq:X#J}wSUUQNŅ XYV eXKʟҔTURX"zwEwU L$M xWW{5U T='T|_OT0 `TtNDE/*PS,U*}; bT κӧN|ׯ]c]dd|Eq(^تPAKԸGaec'ucV_YjO(WզnB:svIuK}$OvKIխtueJ*]RV- YD-q,&.,W{u-MmZԷEH)k߻rW*K~[_Ⱓ ֑)}ή*,d֨0PM'nP\IR}J\oMSMvsqm%IlWܢrk_ q8)+Tլ};q#a}ڍlZn RFj6ROW-oHkfo4R~uRAZ[(SGЮ[@W% }tGU|UnLWkWuU%H={՞!쫕V8,,u:;8P{_٥êκt-"urv񣚰\a0^qCS#"aJRV>)?!]MA2Ri6Z=N XHiu )K*\tVmbg q+)P Њ6AJd mCFFSqTD>4tAe EVſ!Wrv@anF͑ K3x+wFh:X:zRIAzW:keRWnux9\.D+O "ma}",5$uSLڠ:v H"HbaAXWaqkSh#4  f#u³-0hDiZi\%Ko=*M`s6}0Ez ՝]ˁ*\?GJ2:kO}UF=mסl" |W ./RD^=ʓK$ VvRVnzRʩ_r YIU i`=q)7T ׅU#Y{?eJU rJu 40Kuv.º¢,E=ȊKC^*{)V&"@l$q1:u.BHh* q%qqU:S"#`:v($e#m^CBX}P+F爵Ν;߇#c ΉFOc8E9Q>GdIg#EEEݳ/%5^[[fM" F7nt6r(6q/^Λ7 g͚y3f@FF\(u gJ-0a"!9>>{k?~' zNv椴=zTً=b'sK9gLidDR"X]c-giQ~P@ ٳ>|/94>>>:z4r4Awdz#9o߾+W7.8DN-L>}w4 x񒉓b33)l߾=55r'ص+,"(Νz왒v s=tA@֭|_H0~QPD14' jQIq~]Q“Ȉ_#m g^Jb=ҡ,E|iW&GJldCNح~Y w`twlބ*_o<>}2s׸!:yڵ&M>}I8Dϡ}U YK,]|)S~*9qIz^z .=+WAUqq237Ll8 Ν@g#;vV>cL]c8ڵOⅴݻgs̙?DJLL1b>Di߾x(>io#Qآ6%EhE0ʈhb({;6%5mȐ猌A2ujRZ3/o'>ܳg/LvF)x~.]´Ya1^iCxZ# `ܸqI_œw|u-Ջ~NA7B`I%.i>|8Dptx"zPؼʌ%).]ذ>1%fGma=?33_l6|8i:҄AP!qqDacbbȎ:bڿ]ǎ] B C(l!ip"pѣzچN*O,\@fԩl(YD _Ȉ\j͚5ݺuۺ5|vк?1NAKSm:?l$KeANw9VP~- 2X}K: ,ՓX'oUy$ k[;?r^0tԴt~[*F[IMMEtI\~Aƶ5`sI~91뚞;_.Z1c ~8&$^| _`j^䂵Oذa#gV$&%-\D@-@aI,=\Ʊ+s׮d;Kg|ޕElr2,`I`Z†t{~ii-RttDA|>xE .#kkg͞!P'%%0f6],Bݻtl&}~oH3.n9 eP‘&C ]\bāΙGﲳsT%X>,i(`1  p9s¬Ys0TH5IM%#AE#QXTD` #dIj553YsV,qyXd&DV/YΐlNه'CAb' =:,\F0ϩ.C&S 'N9\|9Y0>{C%K`=^t)m9бiI?Rk׮ba1)@~2)A0q'I/^%> T"g?|e`Ϟ)/ bi X]$K-؍I_ Dyn⒔&qb):4k!n$:"Sw:CU(R Zm@ߙvLv8SW@Oijpիs9/T$FF C֪5KVA-uuCmH)qT D'qoH$. qǂy3} Wm;n}BAd2Ue]KT$e번Jgi]W!eR^^+hhZU72'Lu^՟*od:_'qpVj`yd'ir[8*_O\'NtaD(tjjFROKFV.U 6NXT Z$IW.޼)ANRdACawEuԭ%eT*|TrDmN~O S ,z+iƮ A;eK6A ,5vX\Ԙϵҝ!z$l*ms s4v2octn;:9ˎRS֯Sy+'d:qy?U^%zVhB)k=\N"TǎkHji;gAn5RA4Vl87M;EuyJx횶r]N4yi)aX,v]&GxnW *j+xy^/usI5rIulf|P_vQ久ΉN.gVL `nXcFlDJ:FӠ-$-۳Yued3Gm v}_!J)H#%z"R֊޵`fmh!4T@>8?N{vܸ4wK Pf'Jk4tԍV X5]~BH* URyZ-#U=)) #[v9 v5$ԭXP%I:@и!)VTeW*GU wʭUhI)åBCܖ6};6~>+Ru >R1u,6@O}u[Ly*6[d*ԎN\ߔ&e!:FsQɣ>BKD, eMȗRx[+*7OԮ\I_[Jj7]ykvղhxݮZt!UaL| ag OTƥSt߼[E̼ؖ5@^qW-/W*w\ \0eEv5!dw'.Y޽OZZYSOm|FYk .uK+ͲK]=N**`ƪeME08ܭfUΝ|2g>M',؁pJCxCӇ4zrpuVF#-l(,,d+)N@Lz- .x1fx9_'% k}qVAUչ.QP6 zt)G`.4t ns! Z&սE@Px>Yݺ{|tÁ:[㖾!w|B??[ȅk8EUt.?⸨쪇IM'"#ߍ6G?bo>,lǍ(* ,eD Uw[׸[J S-B 锨JչSKu!{eiRVA)plүܜg?h7NH8hqH} !orLJp^v88`1_O>57wծ]McB9׉M{DIKO'Nb͉9VDGKԒRMAn8?vӵoWK+ۿ9RݲVӀ%G|)?4V>)|JU AأsHR*O,%;lk%jUuJ# n/]okq6cr??pR'@eddpX>f䈝=wBa bO(l2U\R3v).ÒIiIC^F[89UJW,HUxN :(`y < j:m(QRS  W܆ǐ8ʲ[aiMj3K0Q#(C3gN맟~:fFmuo3ld au9z?K)by˜ٷo_L3Ohx bU|e #N8X[s˿p78MYX ҴzH(i٣ҿJ)W#5Rz@b%=Jz+_#>(m2t4ú!,,{bjaP+LcA%p͋/xȑں/?'m#S8O4hпۿ1Dm1O~@X'O,((Z;usK믿^R\o}{=ZLa-Zd媕&ݷoРPԩ_^ xPSs9q7V،3oYiw7aVݹ>:K %zR.]Z*: W(UL<äѰjEJSb4Qqi/nҍT։aݫdjmB7a7/ K,QN=p b8< `G SpJ0SL3.pܼy {hTXd2]pqW渚8y‹gb&cqKX X.OF,::DjAO zq(:VOT/aAA?#U53vZ&F#@zDsX8\PJYOKXj٧aYsP5ĒN,\\t/[9Vpo=JM.9<.}buW(Hg[ %zt I'4f}W+c=.h-DQtKHti2%G4T6b Uۭ`|/lJ'RT C W}N8r\,@ DuAWgKp \U:n@t+ŔPσre#DAeOqJ]*(*1{5Iʐº;Qsda-3)u6AX7n>:HJF*&4詓RAX2*Tc[1h?՘R=xʶTHuصT+ǫ~uu3R_sh85$;`TR v *RI\(ߧB+H]W7Y ӱ- KHHsP%xA@+w7׹KA0Jss)KH]PZgUR(հ{ׂKV*uJ[Gv#pKuu.݌u6QzѸ^Rwg+G,lJu=ra)_*6Rwo B&h㓐z*1Vᐪn_^i ŦֆıruZ=qnuZEuZ-DflO"\@"_Jga=+8F)ISIqiWTבƺ96Չ⟦ǧ4oI4'!;gUN7.U5wvu+|ՎGI :)ĝwN,V#VJ䝿~ư<*ꅳ VD*NgKF;衢xV/iqè0QVܤ%Y8F֫;ZM9]{NsVux>q.oSHI`N6!۲Rm;S=O o` MM50t d_KUf:UukTGRQ[m˗ U0B;ɚ;v 1c^=f;/>S)wﶦ$2D<'['>8 &>L4>'VX!5 nuߺp9 {w<@XXBX,Ǻy㺇&|H&`R=qIkԑB/K>DG~ 0ۦQ\yU Vqm1j`M]?a5qu{gF6#tIՌi3M&v?sc _K|}=3#v[V7S+ ,0C~ J!DIJ1K_ kyRUm :=j55maing>(͒ n8 /Ss0)'H}z!qq"F/EXڒpf=8Os3φ>mg|}xǽ7,k{v䩑vzWVI]!z7ȏ|4>q9ׅ뒅 H&,maQ%a1 t.8Aa));W^8ߊSNy|>^`;5N>v v[677wzE#G|OǭmZaOP/~9t=;aQ=:,gߝ}1sCρ{oyE硇vY݅0uKc}fV],$d VNU qw6vh6oy <\ΥxJRֺpXkWjhaBbXMt3gEIQ Ox^Sc]\SO8KD %M3n @@s=5ud]l,nA*vi.oX=T )jmuyt=pvאPYXT<@HrZ#_ 'NĘz5Ҫw;niGd:}Μ#G;oԩӗ-_>vaÆ?bjma)Zoڐ0Ɗq&c1"8S瓯7s܎C?$Yr!-T㭐FJK=`~TtTK5 NpJK D+U$V L޼ɩ{5R4I(noNhiӦ-[n߾}Ӧ͉IE[nhvxץK $%%gmx-RʛOȜ͛7󎯴u0R]T:[+̍&XXLkfk3hH[df5 ѴiCkƥ֦=v|Tmڱj'6Zcj8Gaȴ2YȈbmZUnO!,úEȥOi/U OHn0b=rܡIkj K=$yD_i };p}* 'STrhm @!:F|aݷJkKiu1]j-MxYXbZ~:4ǚh ފcgc"`xg*J kVu:S.~jm=g[o Zx:Op{ (+:>I[X Z0ɿI7nKJi]uk\B%@6 Jv[X7.O}=TT/Ł2ƬNժ.%%^c^aopA s N@7VwUd% bj_'Q&ksFV6U~:E"ghV|VXE.!V,,=$"{ Ҹ4P Ik?A1Jg{W_K /Rjj"GG'VamkQ!f5s `̈F&qCxO܄ ~5& >N Egrd ׄe?%kͮ 5ReRqIk7tH_JC.S'U2鮟ʤ;ˣ}k/ΝŤܘzN՜\9rrjrOqYí=]mm}MjrpF}fYr6~M`Msm#t0m5:0Q"$th[j~z`ݗƨkůJbĉvK RKy$ 8`FݪmD5LY5a1MX^)Ip ./͔+{K8x@)ھWݯ} rR5?_óįzGIıFm۶A}̙s2d?#:=:xN>7b'رwٷo);w'ƍcbbXOjoSl2?~媕3|={vԉLI {>ڿ?{F1{l?BX,o߾=4J{=w={@m-A[ ֵԑTUդzBCboyjTelMFARnDjIPJ`X&.ªӄ% Wz5MJWVnKV.5/}5U^ fI\Ha]j ې|2&U[.kFe40ѼUGrR8X.&JD#)Z^ufш)T4q9HzJ f[7oƁIy|/-^Q 'N>usŰY|j\J0OqAJ:zm( ^(jxxT AπqTu!47VFjF >2VvlFԶ\uKG(4uQa]+Ʌ$OHʃ17TQ^T|q߽yBI9PzVa[]w5S*M\΂ TGS_-#uwan6G(࢕*(4TҖŶWCXjx[Xm %9$%K 1gy.XC.&ȓ5ip}p!I9*>HމzQ&dҽ^P{[ϚԷSԐP*f6ظ r3Gѯ~+VHK ׿fR׮]Y%~>U;sCoݺE,3SD8Xa#,.%, @H!, ala*nrA>` SLaFx˜ PJE70aP THm-!hy[\2dXVZ5caAX!")VJ%^{E~!/LfuXQr[gd' ŪqV` vЉX'YߟwU,%}EG]ɬ*`=\%Ļ3X΢V4a=ٳ'R Ed(T8c5)a.l):5WٵP6kHV{PC?Rmw%չZTSG>=9,=K|tNa><:6h{,wy)0:%'VDXtڱcE>\p^U`C[\ Hy.rc;*݀X ۽{w 7 ۲]Dl0+[n셤\V:L8q*I8ɻ[TwunNmR[#UU+l+",dW'JO[,&&b3ǒ%K1I`ҝ9,Vc`!$ A@0! Ν;BT[a cӅqH`m۶ ;l 4ieMh(2iس sBͷ$%uQq=S›%PCCpKui)>hxIuHw/{R A ԃ/_oV  Ky'?6W[M$0f_yb bvHS'C[ak q[,a"R& 2BGG|d7`(ODBɰyD Zi&AF .=z)8pM-.XH8aɕ,h-IN/"ē0 8c%0t!΂<.&[DL¸|l!CјV5hvUD`P K³χ:x'<Oָ3,e`M]#޻g dcY\MBXeU:J^z27G`?,`F V^p4rJI5u* baIUTju >hO>Bc\&HR]UK$O0;Di']vy;KUI-ox.$R6RZha44a<%ԓzR$7r ŸOsb'nƃ2á+'ǑNfMuhrm~2M&WvՠT:Tx Z O o۫X*߿$1f l_vDp,"ə0:ȡ%Y,mZtW(R''#u2 C\u27|vLrRO]SAA^hE6)y]9nk +ċ9,uFeilwGK]SgFX b?ڊil{5Jn'}QVT NV<"?mDuVU[M&O&=њ870kŒ7_cZcqd7jz;\IXV9 LXSV[gY[G[!ֈrSX[k5V2]ZkY` a=2aFMgZyVaLkf wTYUۭӬiiV"kk~k !g"!G&,%y}{ްn,v`AUV᛬M-g2DV Y11gBit(pGEq+(_q3D>T:3a CX!,J&`u'MX?Qmud 0Dn"D aNh:NXY@@S|F]yJ}C5d7@da\wBo&dkBVHjh}> 递 ԫ㒎1czoݿڰ-us! MYBG֣AN:=8kbׯf|5?snmgWӾ³뚮 kK !zЍ!Л ٚ0h%3Ȱ;tO>j(4(vYݥݼv}鰠WnvƒLijMƔ !j -4Vv궶[n %vе⎝wGZX6''kLO IX,1j e%K Zqy Ç=vW<zv?;lՑrVrxՠh` ǜz#: 0,b+ TMʡ-{YgowDJ6ͰoEmB[FƉ|=d~6’QU[s+(+weM^XXF5 (NuȢ%^VyɊv>S3Xx&Țx+a{2FCXSXaǔ3M$z̓Vfq'æh2Wζf0hFBЬÊ~zΝ'Nܿ%ޚ2 )؊8^f83g8Sqkt#Xu .zKN j,CXaLM*33pV%)CXN8pwp!{ *9W2Yʂ0Ԃ0-5nԄڴiӹsSN aJX2- /( HNS &yGeas_x&W~wXƆ555HC1 a=aaڰ ksDy _b]N|g.+L~g!-(\ChZBX1xԩǎ340cz# [{jTN b9(ʧ1c˿V!O>K/%''9s<7 Kz4tVxN`|=PA`po{1}Woٲeǎ.\ ;аj aACn12qsZCYmU ރQcƄqmjfo2޷oŋӧK.~‚!G#,9s>#:uj3 '}@X=7l?}ߝ}9ya aP"p&U~~>;Ss{P^ZdoW}mgS_~t8/8)_߾ǺmFP:u[n۷ں|rFFe& a="aTwM{KAi7zpiE'N뼲3ǺwZމӲD3Z4Vӕ3V׮]3Uku{ [f/!cXkR߭޳wF=l3G}zO>== T[ՋsxObXS^0v&e& gCbhkH+%X}1qZeh 75P_‡Ju:cmemimi;nڐ:@^ؚke*BsVxI-ha}7L+r]rE89nG?C}dI"ӲZ0->DBh-kF,$Bք1D8",`u ;oܸs|{XBDo=l4oeYYꬶa-uVIz-RV[+i8j(GuUdsHXXCpӦM̙ze˖޽{7LcDsMII9}tBB¼y 0K,?r%ɊF@ FxzvIJZV0wvuի꼒ſ:(>xƍTCL>9 ca5"!D’yyy=k?w{ݾ}{UU{QFٳO$&&?/))a_hڶ 9CL*67 3Պz)JH40VX1i$L*8p ܔa2>ƀ4~u!o8ܹsKHmС" C!,,OªbР֬[e>9? aޮ11V={ͪ/u#VׇGP\] @&A/ W^yw1B8U^@7[ȑ#Y?{1k(VbO_\{+,5DAa~֧ϛEEA[qq,Xٱ~:v޸ڰ a]~Ԩ?mf8+8=Q5Pm%ZV=AҖQ眜OfsrGSV}h,x;kΜ?|W>v[~tXCa$,(Wu@#`+PC0~38\7od܇\n=.(ID|(2ZXH 񚀺pNm}a7l,3SOpge}ƍO<'wr'II_|rյjlY44uRMh!&ӊ@ ٳQMWwHXX^[X0aB5yDzm<8|3/M_ݞ8D&g-I 0fxZѻ4 Fy `"0ؤ; $#B%-uʷ b}]]7pխmQѼ;Dz7U3t"D D@![uM}W'Sܼrqק!, 7>&V0TDdf0PL>1' ?9a͛]J]v13Ģ"|듖v]H*..ЊIoG=̰FgCU!6+!ȄY8x&qF*cɓ'N(Pm۶-===;;Yv\ dD ItEAǎ3f XJtg':bРA,'REd4?QW^`ǑL+W2e ]cէ)AU#D‚ڵkf؁V ~kh7q,],=zq,U%60,aP>..$dSYFi@kG K;d J0^b |`8r߿?>q'<'!!YB3Xc'+p,D';ɝ xJx>3 OM /H+++ anתxd’ҳ.'q\~OE'%dP'ベ$2/rq%YA u2ɑ.DqNͭO:)#sϢqi0e|/'X>E` "D AwgYrnPqK/K"AVE8qsMy3)'K`q݈~ F%Y/%}A].q@I:j/k8ܞrX@U} _fj(A Ȅ%u}a?رcGo kdI'_پ>9]~aK /PPU0ϲuV7ȓ+o3dm=I,B \o߾=ֵLC[#>a H"{Q݈%G 5!XrSbq RRBc +[cTED958mِFbd)QX*;+4' /!J9|I0}\"qqL44G&,tB֣C(lc @:%8X i%T}삖 {h( }}]vec3B$ _Bto/1&x8JxtZr$w {oM>P^a؝t4JGcѴi؊H|uV!X[ߣG ORѹsgvQ OH l]$H{7ݺuw'kBE9i  t¢rvFޡA l A( 6~Ώqݒ~E?dS!'ѡ66KHh :$#}?$[oa`|g>"w4̙={ғI9  OȔ!bPP`)_| d6lO>6)) N hR>;(#Kꫯ`I֋>HY7+9aK bxǧ~J!)9&$I 'E+ixxd’F/[XUȓȰOqT-V 6݌H` q`Lq$Rx1FaCJfg+"v](8VbbX&#c/Pp = tHC E`i %%ACĂfJ ;Ic4ALs ,4 İE }.R١l '*I1@ `^| $re!w:>!gU"Db$E+ҵpI7 9z< D&n.فrP̝Tlʠ dO{B>`FT"#qXN:.%);IDAT7 Vn ,\.bOa"P7ZLX-Zfz#FtK bˈK)3_8%ىȟ >i%pNIrq JRFOt0 LXҫ` `,8/nd!c(Ga"UhʨMh& Ә/g۝5_wg<yO.dG:ŸON:5smb-R(YDD$kR! ЙNӟd<3/3#0b.#3d AГ N1ڼ$wcNaxHd!3\:4fa:fyyȣ:gʟQF/L-qn*Ń?1cJ' PS]FyӅ#S<AX e0/*Hh<ԣӷyXFWvDfr1s0ƃ0&6`18ra>3yk)v2<:TA΂X Qi"7 `y1=>L $spp(i5¤%YDMLS4Ʈ̧A!Ȅ%/ E>g:eHTrgL=(p3bYªO^{>{"buildbot-v0.8.9/_images/slaves.svg image/svg+xml BuildSlave Connections Georgi Valkov 2010-01-28T18:17:14+02:00 2010-01-28T18:17:14+02:00 2010-01-28T18:17:13+02:00 Adobe Illustrator CS4 256 68 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgARAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7pucVSn9IXeraf6uhyLCGl9P61dQycTGBVpIozwL77KTRevXvRxmcbh8z+hyvC jinWUXtyBHPuJ6feiG0ez+vSajEvDUpIzF9Zq5FKbApy4kAitP6nJnEL4h9TWM8uEQP0XdKH6TuN Ms4TrbK8jSGNrq2ikMQH7DyD4/T5dDuRXvkPEMB6/mPxs2eCMkj4fdyJF/DvTXL3FdirsVdirsVd irsVdirsVeZebvzLXyvp+n32pTX0v6SWSRYbGK0YRrDAbmUn1+B4pGpp8TMfc4qh5Pzl8nxRvJL5 ku44452tHkaxkCetGGMih/qnFvTEbF2B4r3IqMVVbv8ANzynaXclnN5luTdRzG2EMdm0rSSqzIyw iO1b1uLoVb0+VDscVbu/zZ8q2d61lceZLlJ0a5Vz9SYxqbJ2jueUotTGPSZDyq3Sh6EEqoO4/PDy Nb8hN5nu0KAGVTp8tY+TMirKPqdY2ZkNFehP0jFWR6X5wj1PT4tV0fVX1Gy+uR2hd4kWJybhYJeD elEXC8jRkPGo774qzjFWPax540fTrxtPhSbU9USnqWNkokaPkKj1pGKQxfKRwT2BxVLV85eapByX QbWNT0SfUHWQD3EdrMv3McFppdD+Yn1Y/wC57SbjTot+V7CReWygCtXaICZB/lNEFHc4UUyy1urW 7t47m1mS4tpVDRTRMHRlPQqy1BGKquKuxVRu7y1tITPcyrFEvVmNPoHicVQa+YdLNhDfM7pbzsyR NwdiSrFeiBiKldsVbHmHRzKkX1j4pGKIeD8SQQv2uPGnJgK1piqY4q7FUun1YzQXA0cRaheW8ghk j9UIiOevqOA32epABOVHLYPB6iHIjgojxLjE78vuVE00PexahcSSG5jiCCFZG+roxHxsqbBia0q1 dulN8Ix78R5/YxOWomA5X3b/AD/UlF/+YHly2uJLW3kl1O8hPGW30+Jrjg3dZJF/cxt/ku4OWNKg 3n8oOUnl/VFQfaYfUpCP9jHdO5+gYrSZ6L5u8v6xM1tZXVL2McpLGdHt7lV/mMMypJx/ygKe+Kok 6Z6N1dX1m7i6uIyPQkkc27SADg5T4uJ+EAle2VeHRMhzPyb/ABriIy+kHnW9fjvWw6usUdomrCOw vrtmjjtzIHVnU9Eei15DcDY+2Iy1XFsSmWCyTjuUY9aTHLXHdiqAudd0u2uWtppSs6BSU9OQ15fZ oQpDV9sVbi1rTZpJ44pS0luHaVOLqQIzRqcgK0O22KqthqVlfwia0lWVO9OqnwYdRiqJxV2KvJPM vkzRfN+k6Xb6vHIY7GJ/Q9KRV+Ke2MHM8o5Pij5c0p0YA79MFppJY/yV8nnUJr29+t3/ANZvJb+5 hmmhRZZZllDrJJBbwzOn79jxaQjt9ksGbWl2p/k35Y1FpxLNepBKZfStllt2jgjuJmuJooBJbSFF eZuda8lIHFlxtaR8/wCWPli4jeKeO4lhkOqM0bzgiusOjzmvpcqoYh6Zrt35HfG1pAwfk35VTWf0 3O95eauZ4LmS9uJoWkeSCQyVbjbqtJFPpyAChUDod8bWmT6TpNpoHlvStAsVb6nYz2cUUkrh5CBd xtVuKRqST4AYopPfOet3zXUXl3SpXt7qeMT6jfx/atrUsVAjJBAlmZWVD+yAzdQMKsesNS8pacsu mWd9ZQNZK8lzbieP1Iwg5SSTVYvUdXZ9+5OPCe5Nowa5oplWIahbGV2iVI/Wj5Fp1LwgCtSZFUlP EA0wcJ7kqc3mTy7BawXc2qWcVpdVFtcPPEsclOvBy3Fqe2HgPci1G3vB5Wuf0zp5roFwQ+sWSGsS o+/12ACoVk+1KF2dat9obgKXpfqR+n6nIenTlzrtxpWtfDChjGtee7O25Q6eBczjYyn+6U/8bfRi rB7/AFK+1Cb1ruVpX7V6AeCgbDChlek6lpf+HdOtpLyKGe3uFmkR+X2UnL02B3K9MCXWr6MJbZbv UoTbWkZjQRswMgEqyJ6gK+K7gHsMVZF/iny//wAt0f4/0xVCaj5m09o4RY6jEjieIzFu8IcGVRVT uUrkMgltw9/2NuIws8Xcfn0V4fMXliCMRw3UMUYrREHFRU1OwGSEQNg1ykZGybYrrGty+armeysZ 5IfLdsxhup4i0b3symkkSOKMsEZ+Fyu7tVa8QeRJUIi1tba1t0t7WJILeIcY4o1Coo8Ao2GRSqYq g9T0my1GNFuEIkiPO2uYyY5oX7PFItGRh4g4qmPlvze8E8ui+YrlRfQr6tnfsBGt3b1ALED4RLGS FkAoNww60EmKey655cmULLd28ighgrlWHJTUHfuDgIB5pjIjkoaX5gskswuoalbyXXOUllZacDIx jGwXpHxGRxiVerm2ZjAy9HLb7t/tRX+ItC/5bof+DGTakl1O60641SO/t9RteUCxemkjkBmjaSoa gNBxk2OKtW02i2639zJqEUl1cC49NFkBRUlYvxAopqTSuKsItLy6s5hNbStFKvRlNPoPiMUM00Xz 7DJxh1RRE/QXCD4D/rL1H0fhillsUsUsayROJI2FVdSCCPYjFXnM9vqFzoKw6deCwvXhjEN20QnE Z2JPpsVDbbdciyYa/lb80odavrvTdchhs7vVIbgQXM0t2fqCmQyxIJYvSgqGXikSf60hoMKoHyz5 K/ODR9MtNOTzHZR2Vpayww24iWXg6QcbekjW8bMnrMWaoqFVRVviqq2PK355zaXJb3vmezkuJ47q KUxKsKqHtglu0bx2qShxOzs7BhQBad1x2VG6boX50pq1tNf+YbOTTo3ia5tkWImUCeP1QCLONkUw epwXmWDUq5HRVnt50tv+Yu0/6iY8AVC6Q5urnVtUducl/qFzxalP3NrIbWAD/J9OAN82OEoDzS4/ L/zXd+Z9Zka2WOwun1Vra4leHgPr1p6EbqIyZuRbZg44heg5ZkjLERHwY0r6b5O82vqFjqF1p4tj Hf6R6kHrROyw6dazwyzEq3GjPKOKj4vbAckaq+/7U0h9N8vecoNN8s2tz5Za4Ggi6SeGS5syk4uo ZEH+7DQKzDlXfwwmcbO/ND0Lyfoc+k+U9O0e+KzzW9uIrgfaQk1LJv1UV45RklciWQQdhetJoNtp dxqrcdNeaxNt6bbJaTNDCXYfaLRIjb4ELfq2n/8ALb/ySbCrENRn85Q6hMbG3FxCZVWBWMIgEHpg sxq8c/q+pseqhdwGOWgRrdilsGr/AJpF29fQ7UJwbjxlSvMRtxrWc7GTjX2+/JGOPvXdUi1T8zmn HqaPaJAQx2dWYbmgP78b08Pw7Dhx967sx0hGn0+CTUpBa3rRobiFULqJCoLgFWYUDV7nKjV7JRn1 bT/+W3/kk2BKG8ypa2WgfWdPuvV1CUNHHERsJHISJj4fGw2OKplruk/VfIWpaVp8byNHplxb28aA tI7egyrQDdndvpJxgfUPek8nmHlLSdd0e90zWrjRr36lZXb+pb29tKr0l0/0eUdo/wC8H72vqP0Y 75kzkCCL/FsQoaL5c8xaRaxtd6Vdsba80G5kSGCSVikDTyS8AgPIxhgGA6HY4ZTB6960nbWGpah+ YUmqWelX9vNPqGm3EV9NBLAi2MdqBdxu7hV+I/Dw61yFgQqxyKerOvPFqDpCago/f6XMlyjf8V19 OcH2MLt9IB7ZjBJQZsb1SVa3kBGxBRqg/dhQlU2uaTDdyWk1ysU0QrKXBWNfh58WkI9MNwBbjyrx 3pTJcBq0LG8y+XFUM2q2YVtwxuIqHcj+bxU4eCXctr117Q3aJU1G1Zp2CQqJoyXYgEKu/wAR+Ndh 4jBwHuW1FvNPl1ZVifUIULMyIztxRmRY3IDtRD8MyEUO9du+Hw5dy2v/AMSeXeAf9K2fA0o3rxUN agb8v8k/djwS7ltMrX/TIFntP9IgcVSWL40IPcMtQciQqb6Ve6/paPc2yuLZCPWjcEpv0JU7j5jA lXMWo3vluJNPuxp97NbxGG6MQnEZIUn92xUNtt1yLJ57q/kf85z5gvNS0bzTDBbPc3E1jZ3Es8kc aTqUVXjaN4yEVEKrQqrFiP8AKKE0bQfznNux/wAR2n1l42QKqRJEkgtoljk+K0kZgbj1S61G3Agi jIVKFl8sfnYxa5Hma0F6tp6EC8VEKTMtqZJSgtaOWeKf7QNAV4hatR2VlH5e6DruieXmtddngudV nurq8uprbl6Re5maU8eSx03bpxwFU+vOlt/zF2n/AFEx4hXnnn7RtRv/AClJolhDLLdW+uXELiNW ZkRZp5YpH4g0BRo2r03y/DICVlieTDk8v+eNSt9U0640y5+t+Y7q1vbuSRHhgRFSeZ42lKsq8W9N aeO3XL+KIo3yRSb2en6xf695evrvSby6uZYLaz1W3v7SZYYEQGOWaK4JVUqKsyEfF71yBIAItKV6 l5KkspUmtvLzSIus6mrI9lcXEZtFFLUtHCUdo/i+Ahqd96ZIZL69Aik88qaFq0H5gx6lJpk1rZyX 1/S7EMyMyNaxiNJlYUSCpJjYk/HUZCchwVfckDdmnl3TmjifXry0e50m+urudDH2jMzrE7DbZlUN 4GuY6tm40okn6nJ/yOA/5l4UMd85eX7XzDZQWsLvYiCYThyfWJdUdV6elShev0ZPHPhKkJNB5M16 OSyZvMt04tmRplIl/fBZXch6zEfErBenQZM5R3IpG+XPLep6Xf8A1m91ibUojH6bW8hlC1+D4x6k 0wDfAe37R7bZGcwRsKUBlvr6V/yxyf8AI8f9U8rS719K/wCWOT/keP8AqniqB1q80uHTWuFtJFa2 mtrnmZeQVbe5jmckBF/YQ/LFKe+cpJo/K+pPBfjS5hCRHftWkRJABPEMw8KgVHXHH9Q6pLzjy/51 FrceWrjU9QntdP8AV1SC6nuLqWeC4aOOD05Fd6M8fJzw5Voa5kSx3dDuYgpVL5s80yX+q6nHd3sd jcO+p6MjSMIpItNuuMsUahj8DW7FnUihI77ZLgjQH43W1WHXtWXXdFutT1K6W31mOTUBbHUJrOKM TXlIQoAkDqIQKR0Fa9ceEUaHLyW3q3nSYR+VNUB3aeBraMf5dz+5T/hpBmEGZSw316xLNcSEncku 1SfvyTFI9R8q6DqU0k17a+s0pDSKZJAjMEMYcorBOYQ0DUqO2TjkI5IpB/4A8pfVhbCyItw3P0hP OF5bjlT1OtGIr4bZLxpd60irXyj5etbyK8gtONzCxeOQySsQzLxZjyYgsw+0Tue/QZE5JEUtLW8m +WXljlewRzFQxo7O0YIQR1EZYpXgigmm9BXoMPiS71pDxeQPKUcnqLYnmY2hq087fu2jMRX4pD+w xUeHbD40u9aT/T4xp1nFZ2TPDbQqEijDsaKooBUkk0HjlZNm1TfTbfXdTV7S1MkkMhHrFj8ApuOT H9WBKKOmNe+W4dP+tz2bPbxJ9atHEcycQpqjMGArSnTpkWTziD8uYbrUfMsXlvzyllquoakb6+XT 6NPAVmuGMUypc8q8rgI32VPAVTlvhtCKm/KTzvIECfmDfwUWVH9MXRDeozMD+8vZCCnIKtD0Hzxt LNPJXlzUfL+i/UdR1i41y9aV5pdQuS/I86UVVeSbgqgD4Q1O9N8Cp9iqhedLb/mLtP8AqJjxCrvN 1q2h603mAf8AHI1ARxau3aCeMBIbpv8AIdKRyH9nih6cjkigKoIIqOmRS7FXYqleqSXd/cp5e0ty upXyn1p13+qWpPGS5bwP7MQ/af2DUICC9DsbG1sbG3sbVBHa2sSQQx9ljjUKo+gDChIta8kafe8p rOlpcnegH7tj7qOn0fdirBdT0fUNNl9O7iKVPwSDdG/1WwoZv5U0XSbnQLWa4tIpZX9Tk7KCTSRg PwGBKbf4c0L/AJYIf+AGKu/w5oX/ACwQ/wDADFUHqvlrR2tU9KG3tWFxbMZWUAFROheP5yrVB7nI ZOXOtx97bhI4txxbS+47/DmiLjyr5cuIJLebT4WimRo5F40qrChFRv0ybUwrR2ubKSXy/qLltT0w BfVcUNzbdIbpeteaij06OGHhgKQmmBLsVdiqX2divmXzDHacfU0bR5PW1J/2JLsLWG2BB39PkJX8 DwHfCEFmX+FvL/8AyxR/j/XChCaX5U0xbJRe28M9xzkJkjrxKGRjGP2fspQHbIY7rc2W3MYmXpFD b7t/tRf+FvL/APyxR/j/AFybU7/C3l//AJYo/wAf64qo3nlnQUs53SyjDLG5U77EKSO+KvNLe2nu ZVhgjaWVvsooqfwxQzHRfIP2ZtVavcWyH/ibD+H34pZhBbwW8SwwRrFEuyooAA+7FXm+oWmj3nlo 22ssq6ZJDGLlnlaBQBxIrIrIV+ID9rIsnlHmTy1+UOoatqFnqGv6ob9LqaY29tEzmKS6vqSx23p2 j+rW7cJQF2DCldjhQn+m/lh5A8yaU+paXdXv1HVA7PcelFE83O7a79QG5tvVHxNw5LTkiqDy4g42 l6dgV2KqF50tv+Yu0/6iY8QrO5I45I2jkUPG4KujAEEEUIIPUHJMWGXHkS/05i3lm7jS0Jr+h73k 1untbzJykhX/ACSrqP2VXFbQjQ+cY2KSeXnlcbCS2urZ4ifGsrQPT/YV9sFJtVh8v+ddQ4iU2uiW 7fbdW+uXVPBV4pAje5aQe2NLbJ/L/lvS9CtnhskYyTNzuruZjJPO/TnLId2PgOg6AAYUJpirsVU5 7eC4iaGeNZYm2ZGAIP34qssbG3sbVLW2UrDGWKKSTTkxY7n3OKq+KuxVRvLO0vbaS1u4Unt5RSSK QBlIrXcH3yMoiQo8mePJKB4omiEOtrqEN9B6E0f6LSIRvauhMilQeLpLy3rsCGH05ERkCKPp7mZn AxNg8d8/2JTqOlaV5ts1mX6xp+pWLsttd8DDdW0tAWUhwVdGFOSnkjCnsQceQSCM2E4zRo+42kU9 r5v0wsl5pn6UhQbX2mMgLCtKvazOjofZGkyVNdqJ1mcgCLR9Vll7xCxnSm9PtyrHH/w+NLaKg8u+ bNYJS6H+H9PJIk4uk1+69wpjLwQV/mDSHwCnfGltmel6Vp+lWEVhp8C29pACI41qepqSSaszMTVm JqTucKEViqXeXksE0e3Wwd5LQc/TeT7R+Nq12X9qvbKcAjwDh5ORqjI5DxfV+xMcucd2KrZollie JqhZFKkjrQimKoXTdI0/TYvTtIglftP1dv8AWY74qjMVdirzHVLjQrbywZ9eETaSkMZuhcR+rFx+ EDklGr8VO2RZMD1O8/LTT7u/8y3OiXohtNTa3uNUWU/VxexXImkdYfrI4D6zapyb0l5tT7QJwqyf 8vPMWhahYy6Ro+m3elQaIsMAs74Isqo4bh8HqzS0+A/E9OXYtgKstxV2KqF50tv+Yu0/6iY8QrPc kxdirsVdirsVdirsVdirsVdirsVdirsVQmp6Xa6jbiC45qFYSRSRO0ciOtaMrIQQRXIZMYmKLbhz Sxmx9u6wzanDfMskUb6WI+SzqzesjINw6UPPl2Kn6Mjcgf6P2p4YGOxPHfLp8+itYajY6hbLc2U6 XEDbB0NaEdVPcMO4O4yUJiQsGwxy4pYzwyFFJPzC0+81DyndWdkHNzNLaiMxqWZaXURL0Xf4AOR9 hlOriZYyBz2+9zOy8scecSlyAl/uT97y7XNH81XmiaXHPo11NJaw6jJcRrCzKJ725uAvw0qxBVHX iDQUPQjNVkx5DGPpOwPTvJek0+fBDJMicRZhW/SMY/tH2PZ9Ds4rLR7K1jiECRQovpAU4niCRT55 usMeGAHk8jqMhnklIm7LWiSNJpkLtaCxJ5VtQvAJ8Z/ZovXr0wYTcRtw+S6gVM78XmjstaXYq7FX Yq7FXYqwOx/3ht/+MSf8RGRZIOXyz5cme7eXSrOR7/j9eZ7eJjP6bBk9Ulfj4sKjl0OKq9jpGk2E txLY2UFpLeOZbuSCJI2lkJJLyFAC7VJ3OKovFXYqoXnS2/5i7T/qJjxCs9yTF2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxVKNb/AMO/Uv8Acnx+revvw5/33E9fS3rSvXMfN4fD6uV/b8HK0/jcXo51 9nxdP/h/9M2fq/8AHT9MfVP7z+7+KnT4P5uuMvD4xf1dOaY+L4cq+i9+X9qlB/hj1NW9H7dJP0p/ e9Ktz6/7L7GCPhXKv87myl41Qvy4eX4+ajL/AIP/AEFD6n/HJ9Y+j/f/AN7Rq9Pj/m67ZE+DwD+b fmzj+Y8U19deXL7mQR8PTXh9ig4/Km3XMocnAPNdhQ7FXYq7FXYq7FWFXP8AyrH6xL6vo+rzb1OH rceVfipw+Hr4YpU/+QWf8V/9PGKu/wCQWf8AFf8A08Yq7/kFn/Ff/Txirv8AkFn/ABX/ANPGKq1p /wAqz+t2/wBX9L6x6qehX1/7zkOH2tq8qUxV/9k= xmp.iid:0E9190091A0CDF1198A8D064EBA738F3 xmp.did:0E9190091A0CDF1198A8D064EBA738F3 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf uuid:fd772761-a3ec-4632-8af9-c0442bd7dba6 xmp.did:05FC8385150CDF1198A8D064EBA738F3 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf converted from application/pdf to <unknown> saved xmp.iid:D27F11740720681191099C3B601C4548 2008-04-17T14:19:15+05:30 Adobe Illustrator CS4 / converted from application/pdf to <unknown> converted from application/pdf to <unknown> saved xmp.iid:F97F1174072068118D4ED246B3ADB1C6 2008-05-15T16:23:06-07:00 Adobe Illustrator CS4 / saved xmp.iid:FA7F1174072068118D4ED246B3ADB1C6 2008-05-15T17:10:45-07:00 Adobe Illustrator CS4 / saved xmp.iid:EF7F117407206811A46CA4519D24356B 2008-05-15T22:53:33-07:00 Adobe Illustrator CS4 / saved xmp.iid:F07F117407206811A46CA4519D24356B 2008-05-15T23:07:07-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F117407206811BDDDFD38D0CF24DD 2008-05-16T10:35:43-07:00 Adobe Illustrator CS4 / converted from application/pdf to <unknown> saved xmp.iid:F97F117407206811BDDDFD38D0CF24DD 2008-05-16T10:40:59-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to <unknown> saved xmp.iid:FA7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:26:55-07:00 Adobe Illustrator CS4 / saved xmp.iid:FB7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:29:01-07:00 Adobe Illustrator CS4 / saved xmp.iid:FC7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:29:20-07:00 Adobe Illustrator CS4 / saved xmp.iid:FD7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:30:54-07:00 Adobe Illustrator CS4 / saved xmp.iid:FE7F117407206811BDDDFD38D0CF24DD 2008-05-16T11:31:22-07:00 Adobe Illustrator CS4 / saved xmp.iid:B233668C16206811BDDDFD38D0CF24DD 2008-05-16T12:23:46-07:00 Adobe Illustrator CS4 / saved xmp.iid:B333668C16206811BDDDFD38D0CF24DD 2008-05-16T13:27:54-07:00 Adobe Illustrator CS4 / saved xmp.iid:B433668C16206811BDDDFD38D0CF24DD 2008-05-16T13:46:13-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F11740720681197C1BF14D1759E83 2008-05-16T15:47:57-07:00 Adobe Illustrator CS4 / saved xmp.iid:F87F11740720681197C1BF14D1759E83 2008-05-16T15:51:06-07:00 Adobe Illustrator CS4 / saved xmp.iid:F97F11740720681197C1BF14D1759E83 2008-05-16T15:52:22-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FA7F117407206811B628E3BF27C8C41B 2008-05-22T13:28:01-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:FF7F117407206811B628E3BF27C8C41B 2008-05-22T16:23:53-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:07C3BD25102DDD1181B594070CEB88D9 2008-05-28T16:45:26-07:00 Adobe Illustrator CS4 / converted from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator saved xmp.iid:F87F1174072068119098B097FDA39BEF 2008-06-02T13:25:25-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F117407206811BB1DBF8F242B6F84 2008-06-09T14:58:36-07:00 Adobe Illustrator CS4 / saved xmp.iid:F97F117407206811ACAFB8DA80854E76 2008-06-11T14:31:27-07:00 Adobe Illustrator CS4 / saved xmp.iid:0180117407206811834383CD3A8D2303 2008-06-11T22:37:35-07:00 Adobe Illustrator CS4 / saved xmp.iid:F77F117407206811818C85DF6A1A75C3 2008-06-27T14:40:42-07:00 Adobe Illustrator CS4 / saved xmp.iid:32F582E93563DE11BB48ECB7764A1480 2009-06-27T20:06:51+03:00 Adobe Illustrator CS4 / saved xmp.iid:530E91AC4863DE11954883E494157F9B 2009-06-27T21:32:58+03:00 Adobe Illustrator CS4 / saved xmp.iid:05FC8385150CDF1198A8D064EBA738F3 2010-01-28T16:15:18+02:00 Adobe Illustrator CS4 / saved xmp.iid:0E9190091A0CDF1198A8D064EBA738F3 2010-01-28T18:17:14+02:00 Adobe Illustrator CS4 / Print False True 1 792.000000 612.000000 Points MyriadPro-Bold Myriad Pro Bold Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-Bold.otf MyriadPro-BoldCond Myriad Pro Bold Condensed Open Type Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 False MyriadPro-BoldCond.otf Cyan Magenta Yellow Black Default Swatch Group 0 White CMYK PROCESS 0.000000 0.000000 0.000000 0.000000 Black CMYK PROCESS 0.000000 0.000000 0.000000 100.000000 CMYK Red CMYK PROCESS 0.000000 100.000000 100.000000 0.000000 CMYK Yellow CMYK PROCESS 0.000000 0.000000 100.000000 0.000000 CMYK Green CMYK PROCESS 100.000000 0.000000 100.000000 0.000000 CMYK Cyan CMYK PROCESS 100.000000 0.000000 0.000000 0.000000 CMYK Blue CMYK PROCESS 100.000000 100.000000 0.000000 0.000000 CMYK Magenta CMYK PROCESS 0.000000 100.000000 0.000000 0.000000 C=15 M=100 Y=90 K=10 CMYK PROCESS 14.999998 100.000000 90.000004 10.000002 C=0 M=90 Y=85 K=0 CMYK PROCESS 0.000000 90.000004 84.999996 0.000000 C=0 M=80 Y=95 K=0 CMYK PROCESS 0.000000 80.000001 94.999999 0.000000 C=0 M=50 Y=100 K=0 CMYK PROCESS 0.000000 50.000000 100.000000 0.000000 C=0 M=35 Y=85 K=0 CMYK PROCESS 0.000000 35.000002 84.999996 0.000000 C=5 M=0 Y=90 K=0 CMYK PROCESS 5.000001 0.000000 90.000004 0.000000 C=20 M=0 Y=100 K=0 CMYK PROCESS 19.999999 0.000000 100.000000 0.000000 C=50 M=0 Y=100 K=0 CMYK PROCESS 50.000000 0.000000 100.000000 0.000000 C=75 M=0 Y=100 K=0 CMYK PROCESS 75.000000 0.000000 100.000000 0.000000 C=85 M=10 Y=100 K=10 CMYK PROCESS 84.999996 10.000002 100.000000 10.000002 C=90 M=30 Y=95 K=30 CMYK PROCESS 90.000004 30.000001 94.999999 30.000001 C=75 M=0 Y=75 K=0 CMYK PROCESS 75.000000 0.000000 75.000000 0.000000 C=80 M=10 Y=45 K=0 CMYK PROCESS 80.000001 10.000002 44.999999 0.000000 C=70 M=15 Y=0 K=0 CMYK PROCESS 69.999999 14.999998 0.000000 0.000000 C=85 M=50 Y=0 K=0 CMYK PROCESS 84.999996 50.000000 0.000000 0.000000 C=100 M=95 Y=5 K=0 CMYK PROCESS 100.000000 94.999999 5.000001 0.000000 C=100 M=100 Y=25 K=25 CMYK PROCESS 100.000000 100.000000 25.000000 25.000000 C=75 M=100 Y=0 K=0 CMYK PROCESS 75.000000 100.000000 0.000000 0.000000 C=50 M=100 Y=0 K=0 CMYK PROCESS 50.000000 100.000000 0.000000 0.000000 C=35 M=100 Y=35 K=10 CMYK PROCESS 35.000002 100.000000 35.000002 10.000002 C=10 M=100 Y=50 K=0 CMYK PROCESS 10.000002 100.000000 50.000000 0.000000 C=0 M=95 Y=20 K=0 CMYK PROCESS 0.000000 94.999999 19.999999 0.000000 C=25 M=25 Y=40 K=0 CMYK PROCESS 25.000000 25.000000 39.999998 0.000000 C=40 M=45 Y=50 K=5 CMYK PROCESS 39.999998 44.999999 50.000000 5.000001 C=50 M=50 Y=60 K=25 CMYK PROCESS 50.000000 50.000000 60.000002 25.000000 C=55 M=60 Y=65 K=40 CMYK PROCESS 55.000001 60.000002 64.999998 39.999998 C=25 M=40 Y=65 K=0 CMYK PROCESS 25.000000 39.999998 64.999998 0.000000 C=30 M=50 Y=75 K=10 CMYK PROCESS 30.000001 50.000000 75.000000 10.000002 C=35 M=60 Y=80 K=25 CMYK PROCESS 35.000002 60.000002 80.000001 25.000000 C=40 M=65 Y=90 K=35 CMYK PROCESS 39.999998 64.999998 90.000004 35.000002 C=40 M=70 Y=100 K=50 CMYK PROCESS 39.999998 69.999999 100.000000 50.000000 C=50 M=70 Y=80 K=70 CMYK PROCESS 50.000000 69.999999 80.000001 69.999999 Grays 1 C=0 M=0 Y=0 K=100 CMYK PROCESS 0.000000 0.000000 0.000000 100.000000 C=0 M=0 Y=0 K=90 CMYK PROCESS 0.000000 0.000000 0.000000 89.999402 C=0 M=0 Y=0 K=80 CMYK PROCESS 0.000000 0.000000 0.000000 79.998797 C=0 M=0 Y=0 K=70 CMYK PROCESS 0.000000 0.000000 0.000000 69.999701 C=0 M=0 Y=0 K=60 CMYK PROCESS 0.000000 0.000000 0.000000 59.999102 C=0 M=0 Y=0 K=50 CMYK PROCESS 0.000000 0.000000 0.000000 50.000000 C=0 M=0 Y=0 K=40 CMYK PROCESS 0.000000 0.000000 0.000000 39.999402 C=0 M=0 Y=0 K=30 CMYK PROCESS 0.000000 0.000000 0.000000 29.998803 C=0 M=0 Y=0 K=20 CMYK PROCESS 0.000000 0.000000 0.000000 19.999701 C=0 M=0 Y=0 K=10 CMYK PROCESS 0.000000 0.000000 0.000000 9.999102 C=0 M=0 Y=0 K=5 CMYK PROCESS 0.000000 0.000000 0.000000 4.998803 Brights 1 C=0 M=100 Y=100 K=0 CMYK PROCESS 0.000000 100.000000 100.000000 0.000000 C=0 M=75 Y=100 K=0 CMYK PROCESS 0.000000 75.000000 100.000000 0.000000 C=0 M=10 Y=95 K=0 CMYK PROCESS 0.000000 10.000002 94.999999 0.000000 C=85 M=10 Y=100 K=0 CMYK PROCESS 84.999996 10.000002 100.000000 0.000000 C=100 M=90 Y=0 K=0 CMYK PROCESS 100.000000 90.000004 0.000000 0.000000 C=60 M=90 Y=0 K=0 CMYK PROCESS 60.000002 90.000004 0.003099 0.003099 Adobe PDF library 9.00 PK:De4!!!buildbot-v0.8.9/_static/basic.css/* * basic.css * ~~~~~~~~~ * * Sphinx stylesheet -- basic theme. * * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* -- main layout ----------------------------------------------------------- */ div.clearer { clear: both; } /* -- relbar ---------------------------------------------------------------- */ div.related { width: 100%; font-size: 90%; } div.related h3 { display: none; } div.related ul { margin: 0; padding: 0 0 0 10px; list-style: none; } div.related li { display: inline; } div.related li.right { float: right; margin-right: 5px; } /* -- sidebar --------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 10px 5px 0 10px; } div.sphinxsidebar { float: left; width: 0px; margin-left: -100%; font-size: 90%; } div.sphinxsidebar ul { list-style: none; } div.sphinxsidebar ul ul, div.sphinxsidebar ul.want-points { margin-left: 20px; list-style: square; } div.sphinxsidebar ul ul { margin-top: 0; margin-bottom: 0; } div.sphinxsidebar form { margin-top: 10px; } div.sphinxsidebar input { border: 1px solid #98dbcc; font-family: sans-serif; font-size: 1em; } div.sphinxsidebar #searchbox input[type="text"] { width: 170px; } div.sphinxsidebar #searchbox input[type="submit"] { width: 30px; } img { border: 0; max-width: 100%; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable { width: 100%; } table.indextable td { text-align: left; vertical-align: top; } table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } div.modindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } div.genindex-jumpbox { border-top: 1px solid #ddd; border-bottom: 1px solid #ddd; margin: 1em 0 1em 0; padding: 0.4em; } /* -- general body styles --------------------------------------------------- */ a.headerlink { visibility: hidden; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } div.body p.caption { text-align: inherit; } div.body td { text-align: left; } .field-list ul { padding-left: 1em; } .first { margin-top: 0 !important; } p.rubric { margin-top: 30px; font-weight: bold; } img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- sidebars -------------------------------------------------------------- */ div.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; padding: 7px 7px 0 7px; background-color: #ffe; width: 40%; float: right; } p.sidebar-title { font-weight: bold; } /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; padding: 7px 7px 0 7px; margin: 10px 0 10px 0; } p.topic-title { font-size: 1.1em; font-weight: bold; margin-top: 10px; } /* -- admonitions ----------------------------------------------------------- */ div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 7px; } div.admonition dt { font-weight: bold; } div.admonition dl { margin-bottom: 0; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } div.body p.centered { text-align: center; margin-top: 25px; } /* -- tables ---------------------------------------------------------------- */ table.docutils { border: 0; border-collapse: collapse; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; border-top: 0; border-left: 0; border-right: 0; border-bottom: 1px solid #aaa; } table.field-list td, table.field-list th { border: 0 !important; } table.footnote td, table.footnote th { border: 0 !important; } th { text-align: left; padding-right: 5px; } table.citation { border-left: solid 1px gray; margin-left: 1px; } table.citation td { border-bottom: none; } /* -- other body styles ----------------------------------------------------- */ ol.arabic { list-style: decimal; } ol.loweralpha { list-style: lower-alpha; } ol.upperalpha { list-style: upper-alpha; } ol.lowerroman { list-style: lower-roman; } ol.upperroman { list-style: upper-roman; } dl { margin-bottom: 15px; } dd p { margin-top: 0px; } dd ul, dd table { margin-bottom: 10px; } dd { margin-top: 3px; margin-bottom: 10px; margin-left: 30px; } dt:target, .highlighted { background-color: #fbe54e; } dl.glossary dt { font-weight: bold; font-size: 1.1em; } .field-list ul { margin: 0; padding-left: 1em; } .field-list p { margin: 0; } .optional { font-size: 1.3em; } .versionmodified { font-style: italic; } .system-message { background-color: #fda; padding: 5px; border: 3px solid red; } .footnote:target { background-color: #ffa; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } .guilabel, .menuselection { font-family: sans-serif; } .accelerator { text-decoration: underline; } .classifier { font-style: oblique; } abbr, acronym { border-bottom: dotted 1px; cursor: help; } /* -- code displays --------------------------------------------------------- */ pre { overflow: auto; overflow-y: hidden; /* fixes display issues on Chrome browsers */ } td.linenos pre { padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { margin-left: 0.5em; } table.highlighttable td { padding: 0 0.5em 0 0.5em; } tt.descname { background-color: transparent; font-weight: bold; font-size: 1.2em; } tt.descclassname { background-color: transparent; } tt.xref, a tt { background-color: transparent; font-weight: bold; } h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt { background-color: transparent; } .viewcode-link { float: right; } .viewcode-back { float: right; font-family: sans-serif; } div.viewcode-block:target { margin: -1px -10px; padding: 0 10px; } /* -- math display ---------------------------------------------------------- */ img.math { vertical-align: middle; } div.body div.math p { text-align: center; } span.eqno { float: right; } /* -- printout stylesheet --------------------------------------------------- */ @media print { div.document, div.documentwrapper, div.bodywrapper { margin: 0 !important; width: 100%; } div.sphinxsidebar, div.related, div.footer, #top-link { display: none; } }PK:Dkl\\$buildbot-v0.8.9/_static/pygments.css.highlight .hll { background-color: #ffffcc } .highlight { background: #eeffcc; } .highlight .c { color: #408090; font-style: italic } /* Comment */ .highlight .err { border: 1px solid #FF0000 } /* Error */ .highlight .k { color: #007020; font-weight: bold } /* Keyword */ .highlight .o { color: #666666 } /* Operator */ .highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ .highlight .cp { color: #007020 } /* Comment.Preproc */ .highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ .highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #A00000 } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #FF0000 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ .highlight .go { color: #333333 } /* Generic.Output */ .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ .highlight .gt { color: #0044DD } /* Generic.Traceback */ .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #007020 } /* Keyword.Pseudo */ .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #902000 } /* Keyword.Type */ .highlight .m { color: #208050 } /* Literal.Number */ .highlight .s { color: #4070a0 } /* Literal.String */ .highlight .na { color: #4070a0 } /* Name.Attribute */ .highlight .nb { color: #007020 } /* Name.Builtin */ .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ .highlight .no { color: #60add5 } /* Name.Constant */ .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ .highlight .ne { color: #007020 } /* Name.Exception */ .highlight .nf { color: #06287e } /* Name.Function */ .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #bb60d5 } /* Name.Variable */ .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mf { color: #208050 } /* Literal.Number.Float */ .highlight .mh { color: #208050 } /* Literal.Number.Hex */ .highlight .mi { color: #208050 } /* Literal.Number.Integer */ .highlight .mo { color: #208050 } /* Literal.Number.Oct */ .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ .highlight .sc { color: #4070a0 } /* Literal.String.Char */ .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ .highlight .s2 { color: #4070a0 } /* Literal.String.Double */ .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ .highlight .sx { color: #c65d09 } /* Literal.String.Other */ .highlight .sr { color: #235388 } /* Literal.String.Regex */ .highlight .s1 { color: #4070a0 } /* Literal.String.Single */ .highlight .ss { color: #517918 } /* Literal.String.Symbol */ .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ .highlight .il { color: #208050 } /* Literal.Number.Integer.Long */PKDL{773buildbot-v0.8.9/_static/header-text-transparent.pngPNG  IHDRDٗsRGBgAMA a cHRMz&u0`:pQ< pHYs  ~tIME9'dqtEXtCommentCreated with The GIMPd%ntEXtSoftwarePaint.NET v3.5.5I6IDATx^ՕW 0"0AdLT (I4yg'zrNJBA!16ذkcaAzpH6sWU{~5h 8{SYx_2/%%sk1 +~w9cwoFh DWƌ؃sy,ޓ(>aqڤY-LkJLI1K3LZ|I41ML- Zy~2wNʎ@.&n<M^4sGZM̯JZ1aq;IN.01=!פehBM[84m(ny8f7gQqѢsj`mI#d AQvJ欤<2CsR MjlZ@}%^ke*izT7Cp 1SLT;r7.~sg!ր'!|Z`\ D})`AeRO5K奲2u}$.!xQQT q֪jl~m)9/ɾy-_ 1<&Cf%-E&G\ֱ8rx,A{\m0:ʼ-z IK2B'ηY.rm< =h l7kdz|A BZ`-6y饦0~VGYye&[fd[Mcki%Hg d9I+@D(Wi0ͱ9E-Lo,9=zA5@Fro3/‰f&+<`nKy3(U]J hX׫mY6V5.bg+laΔ*g&i_R MYr.9%.o%ŏc/Z]?Z ۢL@-55_mE= 3+:Geq-  ʕ )B =񮠗":E9Ra敁eYab'̲dȩjck,̎wwޙ:239PY`E1t4XUV.ʪ2UELee.$PWf=``*uUC.sEmYwmB+A|Le{ՋWEd;ʢ(KrM@,<o$W.7-7'ֽa6=C̦mY~fY:S_iaOX-ͣ@tЂPeMR2e?IM99g{ gzʎ-ΪPdU:S|v)!Xֳ<,e_fh`{7}ϙzlxmooy̷_/7ϼl4uŭ 8ׁ2@POqSKM,+%fowr @BL¬j LU^RZTP*,@i]`-R2ĵ$k7E?hzoY`M3 +~jOO[/¼O,o4ļ.p_{m)-/>sֺ>⢲6oò,-A]JZ~\vrRsg=a\HU]xւX!hCZgj M@- $*MWzbM4gt@znw['d†w~gU s?6{'P v]Y1`Wb~U&_L/s@[י>D%R_dsr?~_ (/̫|S-PQU恑L0*Vh90(.płE&6%} mI0{&Y/7Ui{~f#h_y]=WO RG_6/{<'͚~SGƬNUW`Zߙ@}yUVu3]zRFk@^V 5Mk(mZWh*:6*cۢv;K\_fj MlL , fkjbųLYRt= ny7 Ro>)5}V&)wѼr_ګfê]ͲV]Vgڋ*Ls~bjSj;uק21}9Xh\XURXi✟=X7ޑ1J1+j2\iJ$*BJkUIHE5f]i6, c_qQWDJX(۬]M$7/?캗ýMwUi*(7"S+Դش2RPjj|BRQ2ĸL9O;UUJU*Kg͌}b8^9 ( ,(iKE-ĚLFQkZNʻdhs|Y[!kLbJ@mŲxhS[4.)3e6i^/M4O1S)[hQՖRӔW"+E6Njv̔ @ZUkRZ6]vs0Sn5=^n+7صպ %-vחjyuؖTa1;;/_mhI8+q'L|r̙3Sǜ|Q#Gr,6=[TB -ږe٤WFQLQ<)ռbrFSuR[Ư..jΞ4mpf5pmޑ;rUu[7mRwTUPLQ#Yj\_nI6J2ܗcōM4NR\bK]--50B~csv `Me[gamlԵ!Ȕx2_q}Qb+̼O&Ÿ6в>G5f3'Nh] ͂;Zkat]F 7[t f f][nOt`dok8b3fAFsϗkjʤXƴ0)@a}Ae8$@kYk-ICI)<3ܫ6p =aTyp{mI*ZT&Av(i{M], fq[[of[%Dx 5v)wMMl䈑fg:3:o~R)f |/w-[J:f><[{؝{~:떙>^cmS N\dTN&w[͂YX2ӮcN:ygHGaN88]t-bu^Yl*-2 *ju}Z ̔R/Ŝ3qʆaw'4jRnBb*jP~l! (@qQ&Xv]\zs[̑Go{;#Gc4b2ru1b/yuĨѯLj=ȣL=uK4-05D6PVoeA)[Ldcrͤ6gMR;nl] zl)'V+7ttMr /1+ڭ,CUc(lsE]@e>~{wZ{y#=h.hpenTU F`|M] l_oY~)ŝfKISY.qaF|We}Cv.^O;G"{T',4!pLNV/;pǿns6Jz2*2\c~^a:j[[kԖiW\)RWF@GN;L>,Yİq|6-J Kr1|S+qKsimY)xYEX.-o5qKr̤s2L|fu9ȕ7p6uuumVAf…WL;ٿQG,[c~|wBbZ[[?Kc;xQzUW8S__}_{ׇ\p;wLٴ4ʾ>A Ua&V^Y`*ZI,+({,R[AI&),6WNAݬZŽ)fν&qDzjYY(8*Y'VU{C2=mUprMmIy6~={•2iPyg(7/ſ{퍕&??ߠXc_r%ن(==ݜs9 ]Gyq=襤$?5:1G~.(.[YOv{slv iH"2 F_n]cMVvIU[p;Z5rU\\M5KC5Bj*[/ԕv]\خ9.nR%PkK^n*ĎwUT)ī(o ^f:ŜyOr@jyɁwnn{;8='%ɓ*Gnz/ZE*fcc7nsm'Fj+w;D@ζu_R_7G*&tmog(ǑF"C7Z .[/oM}eڑDU B6xZ& }6Xiz`JeV0,qw`&Ε6UVP-WFwvjR3fg̽O,꼵ryw緵%HWH髖1J|IUCP֗;]Vu2L8mY Üw5f+!i璓]=øuِ̪;spȑ#Q]2 5wkx #9b; ,?"E;Xp?~89SMllYhucpY$5 o3@ƨ݁eRX*xumAm<[1Ƹ̨mRur*k[ vͷT/3M}(Q@|].E|eoU귴 }U5+wdKiMaY[md}WMe6̲fsϛj?ٜvUm6ԕ}0jԨ&1͡ {qDž+s< oq^t`V/Gןn%x4538>COȂ~MA׸+/w@n,[la\ d$R^UZ2u,I|gVpkXnW`TYwpS _c.k[ AUR`q9X,x).pOTK@!.%%qsgptD:kwx 9/:{ˣXyg{?=E, -mUOEWVn +{fe3e>(lW)JmA(ig`@Jgxk/j Mkߥڊ_lr rYpL@&ƭ- മv=w%Zw B(u>*//wuCʤ!,rv'\* ܸ;k؉?=6)'_*\\d)/o^c&# E?mmvl*#xy6^;r;PY@$E<%porr(O" $sX0HA7*Gs0yCc Ⱦ.KʍW\wb\bFeQ*(6ߒ|]yiloIC͂ a}d#ύFI  Rlk8%$~ |ТkF!]%;8qrBlYyOf-MzQX)N*#p7ºU1mCv8e]FۺZZWX7 W[iv,@,%ehx^p`mHUPh;Xn6RcmblNz)ܖKݶ].U '`oțxz [;g 0ln7 n9ꫯfi;,u111I>b<01qot1bA|?h"됲w e>E,J/A4@Ї->Nտ[*%ϟoaph6i~9IʍK +pQY=nSŭ⶗7dX0vP`]xJt1*Xt$PUvĪ,g;e6'f\o_ k3%M7͗;|C8u{F ^hfϞm\HJ'$$ MCa$.x]7p"of`R঍,,OIݯVݠAz8 %rߌP'@r P`lA~6CL1cew1J-V.>S엨|tIZV,#x&MU^B)+Y f|=\FD9]?N%H(pB]WT]f6n-dZv71VAĽ@h'Z%seMmլ1uST\1Ā| IMi84m'h>m4kĆȶȨ~s]4l!KYbMcdvA^d9uwP.r_җ ʓq>=o@뤡Qpe&+z5\~LWl_=&Oܼ‹7_tݟ~k3tW&N,skIz[8N7on%9Dn`w1wGD:r; ,!1`DŽ*OxžĴnYs Zϛ6![o"&`=Jӳe{ۻsij "|pgGZKAE+PVkqa)|]9{絎r,ƣpC`*ST6GS2YpgN6\xֹ/fʮ],Э(/2e+d8uÿ28/K!q `'{͵ΕeG)[Wk(!uTkvF`J۹{ں?xMDljgB,P_&ק$ס6= !:)PvZ:1WU/ e^gDeQMܒUUgRF} lwNUms-]+WvciNwt),_N? ؽ}z: {j]I6 ӱ z4u+ kJNC<=H7쩲dnJB}˼i/V:㐁ٟU/X[LN}=٤{LvVZLKog͵* d@廅;laB-GE^yTpY@]<媙fgiй2bdȎ; zcp8y9 XOn]E<ê/2ԑ@UUU9]5Q{W@]7;=%AnV7(qWdeRd2n˟KLį.cbjP[;:J@ƹ&Cfެ,G5\2> ('%N6 6"Z1@LmPZD1!^f!tŗN7 Y&e 2bZ"cS>NB7z]XZ/j&Z0 L2dAXm{@<*jLy^ r9J<orJ@Ͽ^eŪ5\d2Ylzٹce`y˃HR1,u^7}*rvK~ p6I'NwL1s\Z7ڊ4ȡĞcL0lFo ŀ{hr@ oALmNޝldݲeO^XR@kX\d7<_>zQشz *)n.pgI%QU\Ntlzԕy`QKN*:mYSbinܸй<jh2d dNE)D_YJYkF\/l\ˍ>$p#o Zs7Gnȇ̶`*@~F{P| 6Ӌncm#^ʴZT(%[ f~uDŽJB}҇Rv{dKG2eeı2tq2hǩçAM7+n|LQOtscŭ,c|$v m|0c UoAn.4O3 Ϲ/Ѿ6L5 G oq!B5 s-[d<ֺ?[5$ 6A2pSPJȋCOt<SOKq4Z^һu?F9h^IKTGЈ{Lt)1nkgt#tsIF}t{I%[!C3V-+;6i39N#K#@ : Ny'`KQ)dIL05e ̳uƵfHQ(/\g\4H .v.> įJYV$K-&/;R<ǬUt~S(cRWA.p";7c eTpi[Bzo-# skD8nS9+jJ2XCh(1Sveh!K#ss[}d'̱Ps|xĜ'NP/,g߀zŭO?#7IþyЃs^/^`9*22dJɘ9ۃQ۰?[GJ&ɜT92B &SH%>F':l)oKjtczy eQqE<Ǿ܁=.҈St!]?V6 ==e}d<n3:ybVPbBt]|Dٖ.E]2(17O)R͵+3{օt󣺣edqQ/f2 Kd| Cq# e(%e(640F“ͦW@y4ibjѣ5 0xcn3 ,j@'iKπE/;07Ha[4 s'&Fdkfg5 hP`2͌y[@&~$>"ͣ@3r2`Q7}DP!G@2ǜ﬋v|.hw[ zIENDB`PKhDK!buildbot-v0.8.9/_static/minus.pngPNG  IHDR &q pHYs  tIME <8tEXtComment̖RIDATc H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 1;VIDAT8ukU?sg4h`G1 RQܸp%Bn"bЍXJ .4V iZ##T;m!4bP~7r>ιbwc;m;oӍAΆ ζZ^/|s{;yR=9(rtVoG1w#_ө{*E&!(LVuoᲵ‘D PG4 :&~*ݳreu: S-,U^E&JY[P!RB ŖޞʖR@_ȐdBfNvHf"2T]R j'B1ddAak/DIJD D2H&L`&L $Ex,6|~_\P $MH`I=@Z||ttvgcЕWTZ'3rje"ܵx9W> mb|byfFRx{w%DZC$wdցHmWnta(M<~;9]C/_;Տ#}o`zSڷ_>:;x컓?yݩ|}~wam-/7=0S5RP"*֯ IENDB`PK:Dw+ww!buildbot-v0.8.9/_static/agogo.css/* * agogo.css_t * ~~~~~~~~~~~ * * Sphinx stylesheet -- agogo theme. * * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ * { margin: 0px; padding: 0px; } body { font-family: "Verdana", Arial, sans-serif; line-height: 1.4em; color: black; background-color: #eeeeec; } /* Page layout */ div.header, div.content, div.footer { width: 70em; margin-left: auto; margin-right: auto; } div.header-wrapper { background: #555573 url(bgtop.png) top left repeat-x; border-bottom: 3px solid #2e3436; } /* Default body styles */ a { color: #ce5c00; } div.bodywrapper a, div.footer a { text-decoration: underline; } .clearer { clear: both; } .left { float: left; } .right { float: right; } .line-block { display: block; margin-top: 1em; margin-bottom: 1em; } .line-block .line-block { margin-top: 0; margin-bottom: 0; margin-left: 1.5em; } h1, h2, h3, h4 { font-family: "Georgia", "Times New Roman", serif; font-weight: normal; color: #3465a4; margin-bottom: .8em; } h1 { color: #204a87; } h2 { padding-bottom: .5em; border-bottom: 1px solid #3465a4; } a.headerlink { visibility: hidden; color: #dddddd; padding-left: .3em; } h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, h4:hover > a.headerlink, h5:hover > a.headerlink, h6:hover > a.headerlink, dt:hover > a.headerlink { visibility: visible; } img { border: 0; } div.admonition { margin-top: 10px; margin-bottom: 10px; padding: 2px 7px 1px 7px; border-left: 0.2em solid black; } p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; } dt:target, .highlighted { background-color: #fbe54e; } /* Header */ div.header { padding-top: 10px; padding-bottom: 10px; } div.header .headertitle { font-family: "Georgia", "Times New Roman", serif; font-weight: normal; font-size: 180%; letter-spacing: .08em; margin-bottom: .8em; } div.header .headertitle a { color: white; } div.header div.rel { margin-top: 1em; } div.header div.rel a { color: #fcaf3e; letter-spacing: .1em; text-transform: uppercase; } p.logo { float: right; } img.logo { border: 0; } /* Content */ div.content-wrapper { background-color: white; padding-top: 20px; padding-bottom: 20px; } div.document { width: 50em; float: left; } div.body { padding-right: 2em; text-align: justify; } div.document h1 { line-height: 120%; } div.document ul { margin: 1.5em; list-style-type: square; } div.document dd { margin-left: 1.2em; margin-top: .4em; margin-bottom: 1em; } div.document .section { margin-top: 1.7em; } div.document .section:first-child { margin-top: 0px; } div.document div.highlight { padding: 3px; background-color: #eeeeec; border-top: 2px solid #dddddd; border-bottom: 2px solid #dddddd; margin-top: .8em; margin-bottom: .8em; } div.document h2 { margin-top: .7em; } div.document p { margin-bottom: .5em; } div.document li.toctree-l1 { margin-bottom: 1em; } div.document .descname { font-weight: bold; } div.document .docutils.literal { background-color: #eeeeec; padding: 1px; } div.document .docutils.xref.literal { background-color: transparent; padding: 0px; } div.document blockquote { margin: 1em; } div.document ol { margin: 1.5em; } /* Sidebar */ div.sidebar { width: 20em; float: right; font-size: .9em; } div.sidebar a, div.header a { text-decoration: none; } div.sidebar a:hover, div.header a:hover { text-decoration: underline; } div.sidebar h3 { color: #2e3436; text-transform: uppercase; font-size: 130%; letter-spacing: .1em; } div.sidebar ul { list-style-type: none; } div.sidebar li.toctree-l1 a { display: block; padding: 1px; border: 1px solid #dddddd; background-color: #eeeeec; margin-bottom: .4em; padding-left: 3px; color: #2e3436; } div.sidebar li.toctree-l2 a { background-color: transparent; border: none; margin-left: 1em; border-bottom: 1px solid #dddddd; } div.sidebar li.toctree-l3 a { background-color: transparent; border: none; margin-left: 2em; border-bottom: 1px solid #dddddd; } div.sidebar li.toctree-l2:last-child a { border-bottom: none; } div.sidebar li.toctree-l1.current a { border-right: 5px solid #fcaf3e; } div.sidebar li.toctree-l1.current li.toctree-l2 a { border-right: none; } div.sidebar input[type="text"] { width: 170px; } div.sidebar input[type="submit"] { width: 30px; } /* Footer */ div.footer-wrapper { background: url(bgfooter.png) top left repeat-x; border-top: 4px solid #babdb6; padding-top: 10px; padding-bottom: 10px; min-height: 80px; } div.footer, div.footer a { color: #888a85; } div.footer .right { text-align: right; } div.footer .left { text-transform: uppercase; } /* Styles copied from basic theme */ img.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } img.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } img.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } .align-left { text-align: left; } .align-center { text-align: center; } .align-right { text-align: right; } /* -- search page ----------------------------------------------------------- */ ul.search { margin: 10px 0 0 20px; padding: 0; } ul.search li { padding: 5px 0 5px 20px; background-image: url(file.png); background-repeat: no-repeat; background-position: 0 7px; } ul.search li a { font-weight: bold; } ul.search li div.context { color: #888; margin: 2px 0 0 30px; text-align: left; } ul.keywordmatches li.goodmatch a { font-weight: bold; } /* -- index page ------------------------------------------------------------ */ table.contentstable { width: 90%; } table.contentstable p.biglink { line-height: 150%; } a.biglink { font-size: 1.3em; } span.linkdescr { font-style: italic; padding-top: 5px; font-size: 90%; } /* -- general index --------------------------------------------------------- */ table.indextable td { text-align: left; vertical-align: top; } table.indextable dl, table.indextable dd { margin-top: 0; margin-bottom: 0; } table.indextable tr.pcap { height: 10px; } table.indextable tr.cap { margin-top: 10px; background-color: #f2f2f2; } img.toggler { margin-right: 3px; margin-top: 3px; cursor: pointer; } /* -- viewcode extension ---------------------------------------------------- */ .viewcode-link { float: right; } .viewcode-back { float: right; font-family:: "Verdana", Arial, sans-serif; } div.viewcode-block:target { margin: -1px -3px; padding: 0 3px; background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; }PKhDVR>>buildbot-v0.8.9/_static/rtd.css/* * rtd.css * ~~~~~~~~~~~~~~~ * * Sphinx stylesheet -- sphinxdoc theme. Originally created by * Armin Ronacher for Werkzeug. * * Customized for ReadTheDocs by Eric Pierce & Eric Holscher * * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /* RTD colors * light blue: #e8ecef * medium blue: #8ca1af * dark blue: #465158 * dark grey: #444444 * * white hover: #d1d9df; * medium blue hover: #697983; * green highlight: #8ecc4c * light blue (project bar): #e8ecef */ @import url("basic.css"); /* PAGE LAYOUT -------------------------------------------------------------- */ body { font: 100%/1.5 "ff-meta-web-pro-1","ff-meta-web-pro-2",Arial,"Helvetica Neue",sans-serif; text-align: center; color: black; background-color: #465158; padding: 0; margin: 0; } div.document { text-align: left; background-color: #e8ecef; } div.bodywrapper { background-color: #ffffff; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; margin: 0 0 0 16em; } div.body { margin: 0; padding: 0.5em 1.3em; min-width: 20em; } div.related { font-size: 1em; background-color: #465158; } div.documentwrapper { float: left; width: 100%; background-color: #e8ecef; } /* HEADINGS --------------------------------------------------------------- */ h1 { margin: 0; padding: 0.7em 0 0.3em 0; font-size: 1.5em; line-height: 1.15; color: #111; clear: both; } h2 { margin: 2em 0 0.2em 0; font-size: 1.35em; padding: 0; color: #465158; } h3 { margin: 1em 0 -0.3em 0; font-size: 1.2em; color: #6c818f; } div.body h1 a, div.body h2 a, div.body h3 a, div.body h4 a, div.body h5 a, div.body h6 a { color: black; } h1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor { display: none; margin: 0 0 0 0.3em; padding: 0 0.2em 0 0.2em; color: #aaa !important; } h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor { display: inline; } h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover, h5 a.anchor:hover, h6 a.anchor:hover { color: #777; background-color: #eee; } /* LINKS ------------------------------------------------------------------ */ /* Normal links get a pseudo-underline */ a { color: #444; text-decoration: none; border-bottom: 1px solid #ccc; } /* Links in sidebar, TOC, index trees and tables have no underline */ .sphinxsidebar a, .toctree-wrapper a, .indextable a, #indices-and-tables a { color: #444; text-decoration: none; /* border-bottom: none; */ } /* Search box size */ div.sphinxsidebar #searchbox input[type="submit"] { width: 50px; } /* Most links get an underline-effect when hovered */ a:hover, div.toctree-wrapper a:hover, .indextable a:hover, #indices-and-tables a:hover { color: #111; text-decoration: none; border-bottom: 1px solid #111; } /* Footer links */ div.footer a { color: #86989B; text-decoration: none; border: none; } div.footer a:hover { color: #a6b8bb; text-decoration: underline; border: none; } /* Permalink anchor (subtle grey with a red hover) */ div.body a.headerlink { color: #ccc; font-size: 1em; margin-left: 6px; padding: 0 4px 0 4px; text-decoration: none; border: none; } div.body a.headerlink:hover { color: #c60f0f; border: none; } /* NAVIGATION BAR --------------------------------------------------------- */ div.related ul { height: 2.5em; } div.related ul li { margin: 0; padding: 0.65em 0; float: left; display: block; color: white; /* For the >> separators */ font-size: 0.8em; } div.related ul li.right { float: right; margin-right: 5px; color: transparent; /* Hide the | separators */ } /* "Breadcrumb" links in nav bar */ div.related ul li a { order: none; background-color: inherit; font-weight: bold; margin: 6px 0 6px 4px; line-height: 1.75em; color: #ffffff; padding: 0.4em 0.8em; border: none; border-radius: 3px; } /* previous / next / modules / index links look more like buttons */ div.related ul li.right a { margin: 0.375em 0; background-color: #697983; text-shadow: 0 1px rgba(0, 0, 0, 0.5); border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } /* All navbar links light up as buttons when hovered */ div.related ul li a:hover { background-color: #8ca1af; color: #ffffff; text-decoration: none; border-radius: 3px; -webkit-border-radius: 3px; -moz-border-radius: 3px; } /* Take extra precautions for tt within links */ a tt, div.related ul li a tt { background: inherit !important; color: inherit !important; } /* SIDEBAR ---------------------------------------------------------------- */ div.sphinxsidebarwrapper { padding: 0; } div.sphinxsidebar { margin: 0; margin-left: -100%; float: left; top: 3em; left: 0; padding: 0 1em; width: 14em; font-size: 1em; text-align: left; background-color: #e8ecef; } div.sphinxsidebar img { max-width: 12em; } div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p.logo { margin: 1.2em 0 0.3em 0; font-size: 1em; padding: 0; color: #222222; font-family: "ff-meta-web-pro-1", "ff-meta-web-pro-2", "Arial", "Helvetica Neue", sans-serif; } div.sphinxsidebar h3 a { color: #444444; } div.sphinxsidebar ul, div.sphinxsidebar p { margin-top: 0; padding-left: 0; line-height: 130%; background-color: #e8ecef; } /* No bullets for nested lists, but a little extra indentation */ div.sphinxsidebar ul ul { list-style-type: none; margin-left: 1.5em; padding: 0; } /* A little top/bottom padding to prevent adjacent links' borders * from overlapping each other */ div.sphinxsidebar ul li { padding: 1px 0; } /* A little left-padding to make these align with the ULs */ div.sphinxsidebar p.topless { padding-left: 0 0 0 1em; } /* Make these into hidden one-liners */ div.sphinxsidebar ul li, div.sphinxsidebar p.topless { white-space: nowrap; overflow: hidden; } /* ...which become visible when hovered */ div.sphinxsidebar ul li:hover, div.sphinxsidebar p.topless:hover { overflow: visible; } /* Search text box and "Go" button */ #searchbox { margin-top: 2em; margin-bottom: 1em; background: #ddd; padding: 0.5em; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; } #searchbox h3 { margin-top: 0; } /* Make search box and button abut and have a border */ input, div.sphinxsidebar input { border: 1px solid #999; float: left; } /* Search textbox */ input[type="text"] { margin: 0; padding: 0 3px; height: 20px; width: 144px; border-top-left-radius: 3px; border-bottom-left-radius: 3px; -moz-border-radius-topleft: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-top-left-radius: 3px; -webkit-border-bottom-left-radius: 3px; } /* Search button */ input[type="submit"] { margin: 0 0 0 -1px; /* -1px prevents a double-border with textbox */ height: 22px; color: #444; background-color: #e8ecef; padding: 1px 4px; font-weight: bold; border-top-right-radius: 3px; border-bottom-right-radius: 3px; -moz-border-radius-topright: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-top-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; } input[type="submit"]:hover { color: #ffffff; background-color: #8ecc4c; } div.sphinxsidebar p.searchtip { clear: both; padding: 0.5em 0 0 0; background: #ddd; color: #666; font-size: 0.9em; } /* Sidebar links are unusual */ div.sphinxsidebar li a, div.sphinxsidebar p a { background: #e8ecef; /* In case links overlap main content */ border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; border: 1px solid transparent; /* To prevent things jumping around on hover */ padding: 0 5px 0 5px; } div.sphinxsidebar li a:hover, div.sphinxsidebar p a:hover { color: #111; text-decoration: none; border: 1px solid #888; } div.sphinxsidebar p.logo a { border: 0; } /* Tweak any link appearing in a heading */ div.sphinxsidebar h3 a { } /* OTHER STUFF ------------------------------------------------------------ */ cite, code, tt { font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; font-size: 0.95em; letter-spacing: 0.01em; } tt { background-color: #f2f2f2; color: #444; } tt.descname, tt.descclassname, tt.xref { border: 0; } hr { border: 1px solid #abc; margin: 2em; } pre, #_fontwidthtest { font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; margin: 1em 2em; font-size: 0.95em; letter-spacing: 0.015em; line-height: 120%; padding: 0.5em; border: 1px solid #ccc; background-color: #eee; border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; } pre a { color: inherit; text-decoration: underline; } td.linenos pre { margin: 1em 0em; } td.code pre { margin: 1em 0em; } div.quotebar { background-color: #f8f8f8; max-width: 250px; float: right; padding: 2px 7px; border: 1px solid #ccc; } div.topic { background-color: #f8f8f8; } table { border-collapse: collapse; margin: 0 -0.5em 0 -0.5em; } table td, table th { padding: 0.2em 0.5em 0.2em 0.5em; } /* ADMONITIONS AND WARNINGS ------------------------------------------------- */ /* Shared by admonitions, warnings and sidebars */ div.admonition, div.warning, div.sidebar { font-size: 0.9em; margin: 2em; padding: 0; /* border-radius: 6px; -moz-border-radius: 6px; -webkit-border-radius: 6px; */ } div.admonition p, div.warning p, div.sidebar p { margin: 0.5em 1em 0.5em 1em; padding: 0; } div.admonition pre, div.warning pre, div.sidebar pre { margin: 0.4em 1em 0.4em 1em; } div.admonition p.admonition-title, div.warning p.admonition-title, div.sidebar p.sidebar-title { margin: 0; padding: 0.1em 0 0.1em 0.5em; color: white; font-weight: bold; font-size: 1.1em; text-shadow: 0 1px rgba(0, 0, 0, 0.5); } div.admonition ul, div.admonition ol, div.warning ul, div.warning ol, div.sidebar ul, div.sidebar ol { margin: 0.1em 0.5em 0.5em 3em; padding: 0; } /* Admonitions and sidebars only */ div.admonition, div.sidebar { border: 1px solid #609060; background-color: #e9ffe9; } div.admonition p.admonition-title, div.sidebar p.sidebar-title { background-color: #70A070; border-bottom: 1px solid #609060; } /* Warnings only */ div.warning { border: 1px solid #900000; background-color: #ffe9e9; } div.warning p.admonition-title { background-color: #b04040; border-bottom: 1px solid #900000; } /* Sidebars only */ div.sidebar { max-width: 30%; } div.versioninfo { margin: 1em 0 0 0; border: 1px solid #ccc; background-color: #DDEAF0; padding: 8px; line-height: 1.3em; font-size: 0.9em; } .viewcode-back { font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif; } div.viewcode-block:target { background-color: #f4debf; border-top: 1px solid #ac9; border-bottom: 1px solid #ac9; } dl { margin: 1em 0 2.5em 0; } dl dt { font-style: italic; } dl dd { color: rgb(68, 68, 68); font-size: 0.95em; } /* Highlight target when you click an internal link */ dt:target { background: #ffe080; } /* Don't highlight whole divs */ div.highlight { background: transparent; } /* But do highlight spans (so search results can be highlighted) */ span.highlight { background: #ffe080; } div.footer { background-color: #465158; color: #eeeeee; padding: 0 2em 2em 2em; clear: both; font-size: 0.8em; text-align: center; } p { margin: 0.8em 0 0.5em 0; } .section p img.math { margin: 0; } .section p img { margin: 1em 2em; } table.docutils td, table.docutils th { padding: 1px 8px 1px 5px; } /* MOBILE LAYOUT -------------------------------------------------------------- */ @media screen and (max-width: 600px) { h1, h2, h3, h4, h5 { position: relative; } ul { padding-left: 1.25em; } div.bodywrapper a.headerlink, #indices-and-tables h1 a { color: #e6e6e6; font-size: 80%; float: right; line-height: 1.8; position: absolute; right: -0.7em; visibility: inherit; } div.bodywrapper h1 a.headerlink, #indices-and-tables h1 a { line-height: 1.5; } pre { font-size: 0.7em; overflow: auto; word-wrap: break-word; white-space: pre-wrap; } div.related ul { height: 2.5em; padding: 0; text-align: left; } div.related ul li { clear: both; color: #465158; padding: 0.2em 0; } div.related ul li:last-child { border-bottom: 1px dotted #8ca1af; padding-bottom: 0.4em; margin-bottom: 1em; width: 100%; } div.related ul li a { color: #465158; padding-right: 0; } div.related ul li a:hover { background: inherit; color: inherit; } div.related ul li.right { clear: none; padding: 0.65em 0; margin-bottom: 0.5em; } div.related ul li.right a { color: #fff; padding-right: 0.8em; } div.related ul li.right a:hover { background-color: #8ca1af; } div.body { clear: both; min-width: 0; word-wrap: break-word; } div.bodywrapper { margin: 0 0 0 0; } div.sphinxsidebar { float: none; margin: 0; width: auto; } div.sphinxsidebar input[type="text"] { height: 2em; line-height: 2em; width: 70%; } div.sphinxsidebar input[type="submit"] { height: 2em; margin-left: 0.5em; width: 20%; } div.sphinxsidebar p.searchtip { background: inherit; margin-bottom: 1em; } div.sphinxsidebar ul li, div.sphinxsidebar p.topless { white-space: normal; } .bodywrapper img { display: block; margin-left: auto; margin-right: auto; max-width: 100%; } div.documentwrapper { float: none; } div.admonition, div.warning, pre, blockquote { margin-left: 0em; margin-right: 0em; } .body p img { margin: 0; } #searchbox { background: transparent; } .related:not(:first-child) li { display: none; } .related:not(:first-child) li.right { display: block; } div.footer { padding: 1em; } .rtd_doc_footer .rtd-badge { float: none; margin: 1em auto; position: static; } .rtd_doc_footer .rtd-badge.revsys-inline { margin-right: auto; margin-bottom: 2em; } table.indextable { display: block; width: auto; } .indextable tr { display: block; } .indextable td { display: block; padding: 0; width: auto !important; } .indextable td dt { margin: 1em 0; } ul.search { margin-left: 0.25em; } ul.search li div.context { font-size: 90%; line-height: 1.1; margin-bottom: 1; margin-left: 0; } } PKhD' 5w )buildbot-v0.8.9/_static/comment-close.pngPNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME!,IDAT8e_Hu?}s3y˕U2MvQ֊FE.łĊbE$DDZF5b@Q":2{n.s<_ y?mwV@tR`}Z _# _=_@ w^R%6gC-έ(K>| ${} 0) { var start = document.cookie.indexOf('sortBy='); if (start != -1) { start = start + 7; var end = document.cookie.indexOf(";", start); if (end == -1) { end = document.cookie.length; by = unescape(document.cookie.substring(start, end)); } } } setComparator(); } /** * Show a comment div. */ function show(id) { $('#ao' + id).hide(); $('#ah' + id).show(); var context = $.extend({id: id}, opts); var popup = $(renderTemplate(popupTemplate, context)).hide(); popup.find('textarea[name="proposal"]').hide(); popup.find('a.by' + by).addClass('sel'); var form = popup.find('#cf' + id); form.submit(function(event) { event.preventDefault(); addComment(form); }); $('#s' + id).after(popup); popup.slideDown('fast', function() { getComments(id); }); } /** * Hide a comment div. */ function hide(id) { $('#ah' + id).hide(); $('#ao' + id).show(); var div = $('#sc' + id); div.slideUp('fast', function() { div.remove(); }); } /** * Perform an ajax request to get comments for a node * and insert the comments into the comments tree. */ function getComments(id) { $.ajax({ type: 'GET', url: opts.getCommentsURL, data: {node: id}, success: function(data, textStatus, request) { var ul = $('#cl' + id); var speed = 100; $('#cf' + id) .find('textarea[name="proposal"]') .data('source', data.source); if (data.comments.length === 0) { ul.html('
  • No comments yet.
  • '); ul.data('empty', true); } else { // If there are comments, sort them and put them in the list. var comments = sortComments(data.comments); speed = data.comments.length * 100; appendComments(comments, ul); ul.data('empty', false); } $('#cn' + id).slideUp(speed + 200); ul.slideDown(speed); }, error: function(request, textStatus, error) { showError('Oops, there was a problem retrieving the comments.'); }, dataType: 'json' }); } /** * Add a comment via ajax and insert the comment into the comment tree. */ function addComment(form) { var node_id = form.find('input[name="node"]').val(); var parent_id = form.find('input[name="parent"]').val(); var text = form.find('textarea[name="comment"]').val(); var proposal = form.find('textarea[name="proposal"]').val(); if (text == '') { showError('Please enter a comment.'); return; } // Disable the form that is being submitted. form.find('textarea,input').attr('disabled', 'disabled'); // Send the comment to the server. $.ajax({ type: "POST", url: opts.addCommentURL, dataType: 'json', data: { node: node_id, parent: parent_id, text: text, proposal: proposal }, success: function(data, textStatus, error) { // Reset the form. if (node_id) { hideProposeChange(node_id); } form.find('textarea') .val('') .add(form.find('input')) .removeAttr('disabled'); var ul = $('#cl' + (node_id || parent_id)); if (ul.data('empty')) { $(ul).empty(); ul.data('empty', false); } insertComment(data.comment); var ao = $('#ao' + node_id); ao.find('img').attr({'src': opts.commentBrightImage}); if (node_id) { // if this was a "root" comment, remove the commenting box // (the user can get it back by reopening the comment popup) $('#ca' + node_id).slideUp(); } }, error: function(request, textStatus, error) { form.find('textarea,input').removeAttr('disabled'); showError('Oops, there was a problem adding the comment.'); } }); } /** * Recursively append comments to the main comment list and children * lists, creating the comment tree. */ function appendComments(comments, ul) { $.each(comments, function() { var div = createCommentDiv(this); ul.append($(document.createElement('li')).html(div)); appendComments(this.children, div.find('ul.comment-children')); // To avoid stagnating data, don't store the comments children in data. this.children = null; div.data('comment', this); }); } /** * After adding a new comment, it must be inserted in the correct * location in the comment tree. */ function insertComment(comment) { var div = createCommentDiv(comment); // To avoid stagnating data, don't store the comments children in data. comment.children = null; div.data('comment', comment); var ul = $('#cl' + (comment.node || comment.parent)); var siblings = getChildren(ul); var li = $(document.createElement('li')); li.hide(); // Determine where in the parents children list to insert this comment. for(i=0; i < siblings.length; i++) { if (comp(comment, siblings[i]) <= 0) { $('#cd' + siblings[i].id) .parent() .before(li.html(div)); li.slideDown('fast'); return; } } // If we get here, this comment rates lower than all the others, // or it is the only comment in the list. ul.append(li.html(div)); li.slideDown('fast'); } function acceptComment(id) { $.ajax({ type: 'POST', url: opts.acceptCommentURL, data: {id: id}, success: function(data, textStatus, request) { $('#cm' + id).fadeOut('fast'); $('#cd' + id).removeClass('moderate'); }, error: function(request, textStatus, error) { showError('Oops, there was a problem accepting the comment.'); } }); } function deleteComment(id) { $.ajax({ type: 'POST', url: opts.deleteCommentURL, data: {id: id}, success: function(data, textStatus, request) { var div = $('#cd' + id); if (data == 'delete') { // Moderator mode: remove the comment and all children immediately div.slideUp('fast', function() { div.remove(); }); return; } // User mode: only mark the comment as deleted div .find('span.user-id:first') .text('[deleted]').end() .find('div.comment-text:first') .text('[deleted]').end() .find('#cm' + id + ', #dc' + id + ', #ac' + id + ', #rc' + id + ', #sp' + id + ', #hp' + id + ', #cr' + id + ', #rl' + id) .remove(); var comment = div.data('comment'); comment.username = '[deleted]'; comment.text = '[deleted]'; div.data('comment', comment); }, error: function(request, textStatus, error) { showError('Oops, there was a problem deleting the comment.'); } }); } function showProposal(id) { $('#sp' + id).hide(); $('#hp' + id).show(); $('#pr' + id).slideDown('fast'); } function hideProposal(id) { $('#hp' + id).hide(); $('#sp' + id).show(); $('#pr' + id).slideUp('fast'); } function showProposeChange(id) { $('#pc' + id).hide(); $('#hc' + id).show(); var textarea = $('#pt' + id); textarea.val(textarea.data('source')); $.fn.autogrow.resize(textarea[0]); textarea.slideDown('fast'); } function hideProposeChange(id) { $('#hc' + id).hide(); $('#pc' + id).show(); var textarea = $('#pt' + id); textarea.val('').removeAttr('disabled'); textarea.slideUp('fast'); } function toggleCommentMarkupBox(id) { $('#mb' + id).toggle(); } /** Handle when the user clicks on a sort by link. */ function handleReSort(link) { var classes = link.attr('class').split(/\s+/); for (var i=0; iThank you! Your comment will show up ' + 'once it is has been approved by a moderator.'); } // Prettify the comment rating. comment.pretty_rating = comment.rating + ' point' + (comment.rating == 1 ? '' : 's'); // Make a class (for displaying not yet moderated comments differently) comment.css_class = comment.displayed ? '' : ' moderate'; // Create a div for this comment. var context = $.extend({}, opts, comment); var div = $(renderTemplate(commentTemplate, context)); // If the user has voted on this comment, highlight the correct arrow. if (comment.vote) { var direction = (comment.vote == 1) ? 'u' : 'd'; div.find('#' + direction + 'v' + comment.id).hide(); div.find('#' + direction + 'u' + comment.id).show(); } if (opts.moderator || comment.text != '[deleted]') { div.find('a.reply').show(); if (comment.proposal_diff) div.find('#sp' + comment.id).show(); if (opts.moderator && !comment.displayed) div.find('#cm' + comment.id).show(); if (opts.moderator || (opts.username == comment.username)) div.find('#dc' + comment.id).show(); } return div; } /** * A simple template renderer. Placeholders such as <%id%> are replaced * by context['id'] with items being escaped. Placeholders such as <#id#> * are not escaped. */ function renderTemplate(template, context) { var esc = $(document.createElement('div')); function handle(ph, escape) { var cur = context; $.each(ph.split('.'), function() { cur = cur[this]; }); return escape ? esc.text(cur || "").html() : cur; } return template.replace(/<([%#])([\w\.]*)\1>/g, function() { return handle(arguments[2], arguments[1] == '%' ? true : false); }); } /** Flash an error message briefly. */ function showError(message) { $(document.createElement('div')).attr({'class': 'popup-error'}) .append($(document.createElement('div')) .attr({'class': 'error-message'}).text(message)) .appendTo('body') .fadeIn("slow") .delay(2000) .fadeOut("slow"); } /** Add a link the user uses to open the comments popup. */ $.fn.comment = function() { return this.each(function() { var id = $(this).attr('id').substring(1); var count = COMMENT_METADATA[id]; var title = count + ' comment' + (count == 1 ? '' : 's'); var image = count > 0 ? opts.commentBrightImage : opts.commentImage; var addcls = count == 0 ? ' nocomment' : ''; $(this) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-open' + addcls, id: 'ao' + id }) .append($(document.createElement('img')).attr({ src: image, alt: 'comment', title: title })) .click(function(event) { event.preventDefault(); show($(this).attr('id').substring(2)); }) ) .append( $(document.createElement('a')).attr({ href: '#', 'class': 'sphinx-comment-close hidden', id: 'ah' + id }) .append($(document.createElement('img')).attr({ src: opts.closeCommentImage, alt: 'close', title: 'close' })) .click(function(event) { event.preventDefault(); hide($(this).attr('id').substring(2)); }) ); }); }; var opts = { processVoteURL: '/_process_vote', addCommentURL: '/_add_comment', getCommentsURL: '/_get_comments', acceptCommentURL: '/_accept_comment', deleteCommentURL: '/_delete_comment', commentImage: '/static/_static/comment.png', closeCommentImage: '/static/_static/comment-close.png', loadingImage: '/static/_static/ajax-loader.gif', commentBrightImage: '/static/_static/comment-bright.png', upArrow: '/static/_static/up.png', downArrow: '/static/_static/down.png', upArrowPressed: '/static/_static/up-pressed.png', downArrowPressed: '/static/_static/down-pressed.png', voting: false, moderator: false }; if (typeof COMMENT_OPTIONS != "undefined") { opts = jQuery.extend(opts, COMMENT_OPTIONS); } var popupTemplate = '\
    '; var commentTemplate = '\
    \
    \
    \ \ \ \ \ \ \
    \
    \ \ \ \ \ \ \
    \
    \
    \

    \ <%username%>\ <%pretty_rating%>\ <%time.delta%>\

    \
    <#text#>
    \

    \ \ reply ▿\ proposal ▹\ proposal ▿\ \ \

    \
    \
    <#proposal_diff#>\
            
    \
      \
      \
      \
      \ '; var replyTemplate = '\
    • \
      \
      \ \ \ \ \ \
      \
      \
    • '; $(document).ready(function() { init(); }); })(jQuery); $(document).ready(function() { // add comment anchors for all paragraphs that are commentable $('.sphinx-has-comment').comment(); // highlight search words in search results $("div.context").each(function() { var params = $.getQueryParameters(); var terms = (params.q) ? params.q[0].split(/\s+/) : []; var result = $(this); $.each(terms, function() { result.highlightText(this.toLowerCase(), 'highlighted'); }); }); // directly open comment window if requested var anchor = document.location.hash; if (anchor.substring(0, 9) == '#comment-') { $('#ao' + anchor.substring(9)).click(); document.location.hash = '#s' + anchor.substring(9); } }); PKhDDUkkbuildbot-v0.8.9/_static/up.pngPNG  IHDRasRGBbKGDC pHYs B(xtIME!.<̓EIDAT8͓NABP\EG{%<|xc  cr6@t;b$;3&)h1!﫳Hzz@=)p 3۵e2/ߴ ( %^ND^ }3H1DoǪISFұ?, G`{v^X[b]&HC3{:sO& ?,[eL#IENDB`PKhDM "mm!buildbot-v0.8.9/_static/jquery.js/*! jQuery v1.8.3 jquery.com | jquery.org/license */ (function(e,t){function _(e){var t=M[e]={};return v.each(e.split(y),function(e,n){t[n]=!0}),t}function H(e,n,r){if(r===t&&e.nodeType===1){var i="data-"+n.replace(P,"-$1").toLowerCase();r=e.getAttribute(i);if(typeof r=="string"){try{r=r==="true"?!0:r==="false"?!1:r==="null"?null:+r+""===r?+r:D.test(r)?v.parseJSON(r):r}catch(s){}v.data(e,n,r)}else r=t}return r}function B(e){var t;for(t in e){if(t==="data"&&v.isEmptyObject(e[t]))continue;if(t!=="toJSON")return!1}return!0}function et(){return!1}function tt(){return!0}function ut(e){return!e||!e.parentNode||e.parentNode.nodeType===11}function at(e,t){do e=e[t];while(e&&e.nodeType!==1);return e}function ft(e,t,n){t=t||0;if(v.isFunction(t))return v.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return v.grep(e,function(e,r){return e===t===n});if(typeof t=="string"){var r=v.grep(e,function(e){return e.nodeType===1});if(it.test(t))return v.filter(t,r,!n);t=v.filter(t,r)}return v.grep(e,function(e,r){return v.inArray(e,t)>=0===n})}function lt(e){var t=ct.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function At(e,t){if(t.nodeType!==1||!v.hasData(e))return;var n,r,i,s=v._data(e),o=v._data(t,s),u=s.events;if(u){delete o.handle,o.events={};for(n in u)for(r=0,i=u[n].length;r").appendTo(i.body),n=t.css("display");t.remove();if(n==="none"||n===""){Pt=i.body.appendChild(Pt||v.extend(i.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!Ht||!Pt.createElement)Ht=(Pt.contentWindow||Pt.contentDocument).document,Ht.write(""),Ht.close();t=Ht.body.appendChild(Ht.createElement(e)),n=Dt(t,"display"),i.body.removeChild(Pt)}return Wt[e]=n,n}function fn(e,t,n,r){var i;if(v.isArray(t))v.each(t,function(t,i){n||sn.test(e)?r(e,i):fn(e+"["+(typeof i=="object"?t:"")+"]",i,n,r)});else if(!n&&v.type(t)==="object")for(i in t)fn(e+"["+i+"]",t[i],n,r);else r(e,t)}function Cn(e){return function(t,n){typeof t!="string"&&(n=t,t="*");var r,i,s,o=t.toLowerCase().split(y),u=0,a=o.length;if(v.isFunction(n))for(;u)[^>]*$|#([\w\-]*)$)/,E=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,S=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,T=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,N=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,C=/^-ms-/,k=/-([\da-z])/gi,L=function(e,t){return(t+"").toUpperCase()},A=function(){i.addEventListener?(i.removeEventListener("DOMContentLoaded",A,!1),v.ready()):i.readyState==="complete"&&(i.detachEvent("onreadystatechange",A),v.ready())},O={};v.fn=v.prototype={constructor:v,init:function(e,n,r){var s,o,u,a;if(!e)return this;if(e.nodeType)return this.context=this[0]=e,this.length=1,this;if(typeof e=="string"){e.charAt(0)==="<"&&e.charAt(e.length-1)===">"&&e.length>=3?s=[null,e,null]:s=w.exec(e);if(s&&(s[1]||!n)){if(s[1])return n=n instanceof v?n[0]:n,a=n&&n.nodeType?n.ownerDocument||n:i,e=v.parseHTML(s[1],a,!0),E.test(s[1])&&v.isPlainObject(n)&&this.attr.call(e,n,!0),v.merge(this,e);o=i.getElementById(s[2]);if(o&&o.parentNode){if(o.id!==s[2])return r.find(e);this.length=1,this[0]=o}return this.context=i,this.selector=e,this}return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e)}return v.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),v.makeArray(e,this))},selector:"",jquery:"1.8.3",length:0,size:function(){return this.length},toArray:function(){return l.call(this)},get:function(e){return e==null?this.toArray():e<0?this[this.length+e]:this[e]},pushStack:function(e,t,n){var r=v.merge(this.constructor(),e);return r.prevObject=this,r.context=this.context,t==="find"?r.selector=this.selector+(this.selector?" ":"")+n:t&&(r.selector=this.selector+"."+t+"("+n+")"),r},each:function(e,t){return v.each(this,e,t)},ready:function(e){return v.ready.promise().done(e),this},eq:function(e){return e=+e,e===-1?this.slice(e):this.slice(e,e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(l.apply(this,arguments),"slice",l.call(arguments).join(","))},map:function(e){return this.pushStack(v.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:[].sort,splice:[].splice},v.fn.init.prototype=v.fn,v.extend=v.fn.extend=function(){var e,n,r,i,s,o,u=arguments[0]||{},a=1,f=arguments.length,l=!1;typeof u=="boolean"&&(l=u,u=arguments[1]||{},a=2),typeof u!="object"&&!v.isFunction(u)&&(u={}),f===a&&(u=this,--a);for(;a0)return;r.resolveWith(i,[v]),v.fn.trigger&&v(i).trigger("ready").off("ready")},isFunction:function(e){return v.type(e)==="function"},isArray:Array.isArray||function(e){return v.type(e)==="array"},isWindow:function(e){return e!=null&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return e==null?String(e):O[h.call(e)]||"object"},isPlainObject:function(e){if(!e||v.type(e)!=="object"||e.nodeType||v.isWindow(e))return!1;try{if(e.constructor&&!p.call(e,"constructor")&&!p.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||p.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw new Error(e)},parseHTML:function(e,t,n){var r;return!e||typeof e!="string"?null:(typeof t=="boolean"&&(n=t,t=0),t=t||i,(r=E.exec(e))?[t.createElement(r[1])]:(r=v.buildFragment([e],t,n?null:[]),v.merge([],(r.cacheable?v.clone(r.fragment):r.fragment).childNodes)))},parseJSON:function(t){if(!t||typeof t!="string")return null;t=v.trim(t);if(e.JSON&&e.JSON.parse)return e.JSON.parse(t);if(S.test(t.replace(T,"@").replace(N,"]").replace(x,"")))return(new Function("return "+t))();v.error("Invalid JSON: "+t)},parseXML:function(n){var r,i;if(!n||typeof n!="string")return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(s){r=t}return(!r||!r.documentElement||r.getElementsByTagName("parsererror").length)&&v.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&g.test(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(C,"ms-").replace(k,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,n,r){var i,s=0,o=e.length,u=o===t||v.isFunction(e);if(r){if(u){for(i in e)if(n.apply(e[i],r)===!1)break}else for(;s0&&e[0]&&e[a-1]||a===0||v.isArray(e));if(f)for(;u-1)a.splice(n,1),i&&(n<=o&&o--,n<=u&&u--)}),this},has:function(e){return v.inArray(e,a)>-1},empty:function(){return a=[],this},disable:function(){return a=f=n=t,this},disabled:function(){return!a},lock:function(){return f=t,n||c.disable(),this},locked:function(){return!f},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],a&&(!r||f)&&(i?f.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},v.extend({Deferred:function(e){var t=[["resolve","done",v.Callbacks("once memory"),"resolved"],["reject","fail",v.Callbacks("once memory"),"rejected"],["notify","progress",v.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return v.Deferred(function(n){v.each(t,function(t,r){var s=r[0],o=e[t];i[r[1]](v.isFunction(o)?function(){var e=o.apply(this,arguments);e&&v.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===i?n:this,[e])}:n[s])}),e=null}).promise()},promise:function(e){return e!=null?v.extend(e,r):r}},i={};return r.pipe=r.then,v.each(t,function(e,s){var o=s[2],u=s[3];r[s[1]]=o.add,u&&o.add(function(){n=u},t[e^1][2].disable,t[2][2].lock),i[s[0]]=o.fire,i[s[0]+"With"]=o.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=l.call(arguments),r=n.length,i=r!==1||e&&v.isFunction(e.promise)?r:0,s=i===1?e:v.Deferred(),o=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?l.call(arguments):r,n===u?s.notifyWith(t,n):--i||s.resolveWith(t,n)}},u,a,f;if(r>1){u=new Array(r),a=new Array(r),f=new Array(r);for(;t
      a",n=p.getElementsByTagName("*"),r=p.getElementsByTagName("a")[0];if(!n||!r||!n.length)return{};s=i.createElement("select"),o=s.appendChild(i.createElement("option")),u=p.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:r.getAttribute("href")==="/a",opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:u.value==="on",optSelected:o.selected,getSetAttribute:p.className!=="t",enctype:!!i.createElement("form").enctype,html5Clone:i.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",boxModel:i.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},u.checked=!0,t.noCloneChecked=u.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!o.disabled;try{delete p.test}catch(d){t.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",h=function(){t.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick"),p.detachEvent("onclick",h)),u=i.createElement("input"),u.value="t",u.setAttribute("type","radio"),t.radioValue=u.value==="t",u.setAttribute("checked","checked"),u.setAttribute("name","t"),p.appendChild(u),a=i.createDocumentFragment(),a.appendChild(p.lastChild),t.checkClone=a.cloneNode(!0).cloneNode(!0).lastChild.checked,t.appendChecked=u.checked,a.removeChild(u),a.appendChild(p);if(p.attachEvent)for(l in{submit:!0,change:!0,focusin:!0})f="on"+l,c=f in p,c||(p.setAttribute(f,"return;"),c=typeof p[f]=="function"),t[l+"Bubbles"]=c;return v(function(){var n,r,s,o,u="padding:0;margin:0;border:0;display:block;overflow:hidden;",a=i.getElementsByTagName("body")[0];if(!a)return;n=i.createElement("div"),n.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",a.insertBefore(n,a.firstChild),r=i.createElement("div"),n.appendChild(r),r.innerHTML="
      t
      ",s=r.getElementsByTagName("td"),s[0].style.cssText="padding:0;margin:0;border:0;display:none",c=s[0].offsetHeight===0,s[0].style.display="",s[1].style.display="none",t.reliableHiddenOffsets=c&&s[0].offsetHeight===0,r.innerHTML="",r.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=r.offsetWidth===4,t.doesNotIncludeMarginInBodyOffset=a.offsetTop!==1,e.getComputedStyle&&(t.pixelPosition=(e.getComputedStyle(r,null)||{}).top!=="1%",t.boxSizingReliable=(e.getComputedStyle(r,null)||{width:"4px"}).width==="4px",o=i.createElement("div"),o.style.cssText=r.style.cssText=u,o.style.marginRight=o.style.width="0",r.style.width="1px",r.appendChild(o),t.reliableMarginRight=!parseFloat((e.getComputedStyle(o,null)||{}).marginRight)),typeof r.style.zoom!="undefined"&&(r.innerHTML="",r.style.cssText=u+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=r.offsetWidth===3,r.style.display="block",r.style.overflow="visible",r.innerHTML="
      ",r.firstChild.style.width="5px",t.shrinkWrapBlocks=r.offsetWidth!==3,n.style.zoom=1),a.removeChild(n),n=r=s=o=null}),a.removeChild(p),n=r=s=o=u=a=p=null,t}();var D=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;v.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(v.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?v.cache[e[v.expando]]:e[v.expando],!!e&&!B(e)},data:function(e,n,r,i){if(!v.acceptData(e))return;var s,o,u=v.expando,a=typeof n=="string",f=e.nodeType,l=f?v.cache:e,c=f?e[u]:e[u]&&u;if((!c||!l[c]||!i&&!l[c].data)&&a&&r===t)return;c||(f?e[u]=c=v.deletedIds.pop()||v.guid++:c=u),l[c]||(l[c]={},f||(l[c].toJSON=v.noop));if(typeof n=="object"||typeof n=="function")i?l[c]=v.extend(l[c],n):l[c].data=v.extend(l[c].data,n);return s=l[c],i||(s.data||(s.data={}),s=s.data),r!==t&&(s[v.camelCase(n)]=r),a?(o=s[n],o==null&&(o=s[v.camelCase(n)])):o=s,o},removeData:function(e,t,n){if(!v.acceptData(e))return;var r,i,s,o=e.nodeType,u=o?v.cache:e,a=o?e[v.expando]:v.expando;if(!u[a])return;if(t){r=n?u[a]:u[a].data;if(r){v.isArray(t)||(t in r?t=[t]:(t=v.camelCase(t),t in r?t=[t]:t=t.split(" ")));for(i=0,s=t.length;i1,null,!1))},removeData:function(e){return this.each(function(){v.removeData(this,e)})}}),v.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=v._data(e,t),n&&(!r||v.isArray(n)?r=v._data(e,t,v.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=v.queue(e,t),r=n.length,i=n.shift(),s=v._queueHooks(e,t),o=function(){v.dequeue(e,t)};i==="inprogress"&&(i=n.shift(),r--),i&&(t==="fx"&&n.unshift("inprogress"),delete s.stop,i.call(e,o,s)),!r&&s&&s.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return v._data(e,n)||v._data(e,n,{empty:v.Callbacks("once memory").add(function(){v.removeData(e,t+"queue",!0),v.removeData(e,n,!0)})})}}),v.fn.extend({queue:function(e,n){var r=2;return typeof e!="string"&&(n=e,e="fx",r--),arguments.length1)},removeAttr:function(e){return this.each(function(){v.removeAttr(this,e)})},prop:function(e,t){return v.access(this,v.prop,e,t,arguments.length>1)},removeProp:function(e){return e=v.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,s,o,u;if(v.isFunction(e))return this.each(function(t){v(this).addClass(e.call(this,t,this.className))});if(e&&typeof e=="string"){t=e.split(y);for(n=0,r=this.length;n=0)r=r.replace(" "+n[s]+" "," ");i.className=e?v.trim(r):""}}}return this},toggleClass:function(e,t){var n=typeof e,r=typeof t=="boolean";return v.isFunction(e)?this.each(function(n){v(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if(n==="string"){var i,s=0,o=v(this),u=t,a=e.split(y);while(i=a[s++])u=r?u:!o.hasClass(i),o[u?"addClass":"removeClass"](i)}else if(n==="undefined"||n==="boolean")this.className&&v._data(this,"__className__",this.className),this.className=this.className||e===!1?"":v._data(this,"__className__")||""})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;n=0)return!0;return!1},val:function(e){var n,r,i,s=this[0];if(!arguments.length){if(s)return n=v.valHooks[s.type]||v.valHooks[s.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(s,"value"))!==t?r:(r=s.value,typeof r=="string"?r.replace(R,""):r==null?"":r);return}return i=v.isFunction(e),this.each(function(r){var s,o=v(this);if(this.nodeType!==1)return;i?s=e.call(this,r,o.val()):s=e,s==null?s="":typeof s=="number"?s+="":v.isArray(s)&&(s=v.map(s,function(e){return e==null?"":e+""})),n=v.valHooks[this.type]||v.valHooks[this.nodeName.toLowerCase()];if(!n||!("set"in n)||n.set(this,s,"value")===t)this.value=s})}}),v.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,s=e.type==="select-one"||i<0,o=s?null:[],u=s?i+1:r.length,a=i<0?u:s?i:0;for(;a=0}),n.length||(e.selectedIndex=-1),n}}},attrFn:{},attr:function(e,n,r,i){var s,o,u,a=e.nodeType;if(!e||a===3||a===8||a===2)return;if(i&&v.isFunction(v.fn[n]))return v(e)[n](r);if(typeof e.getAttribute=="undefined")return v.prop(e,n,r);u=a!==1||!v.isXMLDoc(e),u&&(n=n.toLowerCase(),o=v.attrHooks[n]||(X.test(n)?F:j));if(r!==t){if(r===null){v.removeAttr(e,n);return}return o&&"set"in o&&u&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r)}return o&&"get"in o&&u&&(s=o.get(e,n))!==null?s:(s=e.getAttribute(n),s===null?t:s)},removeAttr:function(e,t){var n,r,i,s,o=0;if(t&&e.nodeType===1){r=t.split(y);for(;o=0}})});var $=/^(?:textarea|input|select)$/i,J=/^([^\.]*|)(?:\.(.+)|)$/,K=/(?:^|\s)hover(\.\S+|)\b/,Q=/^key/,G=/^(?:mouse|contextmenu)|click/,Y=/^(?:focusinfocus|focusoutblur)$/,Z=function(e){return v.event.special.hover?e:e.replace(K,"mouseenter$1 mouseleave$1")};v.event={add:function(e,n,r,i,s){var o,u,a,f,l,c,h,p,d,m,g;if(e.nodeType===3||e.nodeType===8||!n||!r||!(o=v._data(e)))return;r.handler&&(d=r,r=d.handler,s=d.selector),r.guid||(r.guid=v.guid++),a=o.events,a||(o.events=a={}),u=o.handle,u||(o.handle=u=function(e){return typeof v=="undefined"||!!e&&v.event.triggered===e.type?t:v.event.dispatch.apply(u.elem,arguments)},u.elem=e),n=v.trim(Z(n)).split(" ");for(f=0;f=0&&(y=y.slice(0,-1),a=!0),y.indexOf(".")>=0&&(b=y.split("."),y=b.shift(),b.sort());if((!s||v.event.customEvent[y])&&!v.event.global[y])return;n=typeof n=="object"?n[v.expando]?n:new v.Event(y,n):new v.Event(y),n.type=y,n.isTrigger=!0,n.exclusive=a,n.namespace=b.join("."),n.namespace_re=n.namespace?new RegExp("(^|\\.)"+b.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,h=y.indexOf(":")<0?"on"+y:"";if(!s){u=v.cache;for(f in u)u[f].events&&u[f].events[y]&&v.event.trigger(n,r,u[f].handle.elem,!0);return}n.result=t,n.target||(n.target=s),r=r!=null?v.makeArray(r):[],r.unshift(n),p=v.event.special[y]||{};if(p.trigger&&p.trigger.apply(s,r)===!1)return;m=[[s,p.bindType||y]];if(!o&&!p.noBubble&&!v.isWindow(s)){g=p.delegateType||y,l=Y.test(g+y)?s:s.parentNode;for(c=s;l;l=l.parentNode)m.push([l,g]),c=l;c===(s.ownerDocument||i)&&m.push([c.defaultView||c.parentWindow||e,g])}for(f=0;f=0:v.find(h,this,null,[s]).length),u[h]&&f.push(c);f.length&&w.push({elem:s,matches:f})}d.length>m&&w.push({elem:this,matches:d.slice(m)});for(r=0;r0?this.on(t,null,e,n):this.trigger(t)},Q.test(t)&&(v.event.fixHooks[t]=v.event.keyHooks),G.test(t)&&(v.event.fixHooks[t]=v.event.mouseHooks)}),function(e,t){function nt(e,t,n,r){n=n||[],t=t||g;var i,s,a,f,l=t.nodeType;if(!e||typeof e!="string")return n;if(l!==1&&l!==9)return[];a=o(t);if(!a&&!r)if(i=R.exec(e))if(f=i[1]){if(l===9){s=t.getElementById(f);if(!s||!s.parentNode)return n;if(s.id===f)return n.push(s),n}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(f))&&u(t,s)&&s.id===f)return n.push(s),n}else{if(i[2])return S.apply(n,x.call(t.getElementsByTagName(e),0)),n;if((f=i[3])&&Z&&t.getElementsByClassName)return S.apply(n,x.call(t.getElementsByClassName(f),0)),n}return vt(e.replace(j,"$1"),t,n,r,a)}function rt(e){return function(t){var n=t.nodeName.toLowerCase();return n==="input"&&t.type===e}}function it(e){return function(t){var n=t.nodeName.toLowerCase();return(n==="input"||n==="button")&&t.type===e}}function st(e){return N(function(t){return t=+t,N(function(n,r){var i,s=e([],n.length,t),o=s.length;while(o--)n[i=s[o]]&&(n[i]=!(r[i]=n[i]))})})}function ot(e,t,n){if(e===t)return n;var r=e.nextSibling;while(r){if(r===t)return-1;r=r.nextSibling}return 1}function ut(e,t){var n,r,s,o,u,a,f,l=L[d][e+" "];if(l)return t?0:l.slice(0);u=e,a=[],f=i.preFilter;while(u){if(!n||(r=F.exec(u)))r&&(u=u.slice(r[0].length)||u),a.push(s=[]);n=!1;if(r=I.exec(u))s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=r[0].replace(j," ");for(o in i.filter)(r=J[o].exec(u))&&(!f[o]||(r=f[o](r)))&&(s.push(n=new m(r.shift())),u=u.slice(n.length),n.type=o,n.matches=r);if(!n)break}return t?u.length:u?nt.error(e):L(e,a).slice(0)}function at(e,t,r){var i=t.dir,s=r&&t.dir==="parentNode",o=w++;return t.first?function(t,n,r){while(t=t[i])if(s||t.nodeType===1)return e(t,n,r)}:function(t,r,u){if(!u){var a,f=b+" "+o+" ",l=f+n;while(t=t[i])if(s||t.nodeType===1){if((a=t[d])===l)return t.sizset;if(typeof a=="string"&&a.indexOf(f)===0){if(t.sizset)return t}else{t[d]=l;if(e(t,r,u))return t.sizset=!0,t;t.sizset=!1}}}else while(t=t[i])if(s||t.nodeType===1)if(e(t,r,u))return t}}function ft(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function lt(e,t,n,r,i){var s,o=[],u=0,a=e.length,f=t!=null;for(;u-1&&(s[f]=!(o[f]=c))}}else g=lt(g===o?g.splice(d,g.length):g),i?i(null,o,g,a):S.apply(o,g)})}function ht(e){var t,n,r,s=e.length,o=i.relative[e[0].type],u=o||i.relative[" "],a=o?1:0,f=at(function(e){return e===t},u,!0),l=at(function(e){return T.call(t,e)>-1},u,!0),h=[function(e,n,r){return!o&&(r||n!==c)||((t=n).nodeType?f(e,n,r):l(e,n,r))}];for(;a1&&ft(h),a>1&&e.slice(0,a-1).join("").replace(j,"$1"),n,a0,s=e.length>0,o=function(u,a,f,l,h){var p,d,v,m=[],y=0,w="0",x=u&&[],T=h!=null,N=c,C=u||s&&i.find.TAG("*",h&&a.parentNode||a),k=b+=N==null?1:Math.E;T&&(c=a!==g&&a,n=o.el);for(;(p=C[w])!=null;w++){if(s&&p){for(d=0;v=e[d];d++)if(v(p,a,f)){l.push(p);break}T&&(b=k,n=++o.el)}r&&((p=!v&&p)&&y--,u&&x.push(p))}y+=w;if(r&&w!==y){for(d=0;v=t[d];d++)v(x,m,a,f);if(u){if(y>0)while(w--)!x[w]&&!m[w]&&(m[w]=E.call(l));m=lt(m)}S.apply(l,m),T&&!u&&m.length>0&&y+t.length>1&&nt.uniqueSort(l)}return T&&(b=k,c=N),x};return o.el=0,r?N(o):o}function dt(e,t,n){var r=0,i=t.length;for(;r2&&(f=u[0]).type==="ID"&&t.nodeType===9&&!s&&i.relative[u[1].type]){t=i.find.ID(f.matches[0].replace($,""),t,s)[0];if(!t)return n;e=e.slice(u.shift().length)}for(o=J.POS.test(e)?-1:u.length-1;o>=0;o--){f=u[o];if(i.relative[l=f.type])break;if(c=i.find[l])if(r=c(f.matches[0].replace($,""),z.test(u[0].type)&&t.parentNode||t,s)){u.splice(o,1),e=r.length&&u.join("");if(!e)return S.apply(n,x.call(r,0)),n;break}}}return a(e,h)(r,t,s,n,z.test(e)),n}function mt(){}var n,r,i,s,o,u,a,f,l,c,h=!0,p="undefined",d=("sizcache"+Math.random()).replace(".",""),m=String,g=e.document,y=g.documentElement,b=0,w=0,E=[].pop,S=[].push,x=[].slice,T=[].indexOf||function(e){var t=0,n=this.length;for(;ti.cacheLength&&delete e[t.shift()],e[n+" "]=r},e)},k=C(),L=C(),A=C(),O="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",_=M.replace("w","w#"),D="([*^$|!~]?=)",P="\\["+O+"*("+M+")"+O+"*(?:"+D+O+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+_+")|)|)"+O+"*\\]",H=":("+M+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+P+")|[^:]|\\\\.)*|.*))\\)|)",B=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+O+"*((?:-\\d)?\\d*)"+O+"*\\)|)(?=[^-]|$)",j=new RegExp("^"+O+"+|((?:^|[^\\\\])(?:\\\\.)*)"+O+"+$","g"),F=new RegExp("^"+O+"*,"+O+"*"),I=new RegExp("^"+O+"*([\\x20\\t\\r\\n\\f>+~])"+O+"*"),q=new RegExp(H),R=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,U=/^:not/,z=/[\x20\t\r\n\f]*[+~]/,W=/:not\($/,X=/h\d/i,V=/input|select|textarea|button/i,$=/\\(?!\\)/g,J={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),NAME:new RegExp("^\\[name=['\"]?("+M+")['\"]?\\]"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+H),POS:new RegExp(B,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+O+"*(even|odd|(([+-]|)(\\d*)n|)"+O+"*(?:([+-]|)"+O+"*(\\d+)|))"+O+"*\\)|)","i"),needsContext:new RegExp("^"+O+"*[>+~]|"+B,"i")},K=function(e){var t=g.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}},Q=K(function(e){return e.appendChild(g.createComment("")),!e.getElementsByTagName("*").length}),G=K(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==p&&e.firstChild.getAttribute("href")==="#"}),Y=K(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return t!=="boolean"&&t!=="string"}),Z=K(function(e){return e.innerHTML="",!e.getElementsByClassName||!e.getElementsByClassName("e").length?!1:(e.lastChild.className="e",e.getElementsByClassName("e").length===2)}),et=K(function(e){e.id=d+0,e.innerHTML="
      ",y.insertBefore(e,y.firstChild);var t=g.getElementsByName&&g.getElementsByName(d).length===2+g.getElementsByName(d+0).length;return r=!g.getElementById(d),y.removeChild(e),t});try{x.call(y.childNodes,0)[0].nodeType}catch(tt){x=function(e){var t,n=[];for(;t=this[e];e++)n.push(t);return n}}nt.matches=function(e,t){return nt(e,null,null,t)},nt.matchesSelector=function(e,t){return nt(t,null,null,[e]).length>0},s=nt.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(i===1||i===9||i===11){if(typeof e.textContent=="string")return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=s(e)}else if(i===3||i===4)return e.nodeValue}else for(;t=e[r];r++)n+=s(t);return n},o=nt.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?t.nodeName!=="HTML":!1},u=nt.contains=y.contains?function(e,t){var n=e.nodeType===9?e.documentElement:e,r=t&&t.parentNode;return e===r||!!(r&&r.nodeType===1&&n.contains&&n.contains(r))}:y.compareDocumentPosition?function(e,t){return t&&!!(e.compareDocumentPosition(t)&16)}:function(e,t){while(t=t.parentNode)if(t===e)return!0;return!1},nt.attr=function(e,t){var n,r=o(e);return r||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):r||Y?e.getAttribute(t):(n=e.getAttributeNode(t),n?typeof e[t]=="boolean"?e[t]?t:null:n.specified?n.value:null:null)},i=nt.selectors={cacheLength:50,createPseudo:N,match:J,attrHandle:G?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},find:{ID:r?function(e,t,n){if(typeof t.getElementById!==p&&!n){var r=t.getElementById(e);return r&&r.parentNode?[r]:[]}}:function(e,n,r){if(typeof n.getElementById!==p&&!r){var i=n.getElementById(e);return i?i.id===e||typeof i.getAttributeNode!==p&&i.getAttributeNode("id").value===e?[i]:t:[]}},TAG:Q?function(e,t){if(typeof t.getElementsByTagName!==p)return t.getElementsByTagName(e)}:function(e,t){var n=t.getElementsByTagName(e);if(e==="*"){var r,i=[],s=0;for(;r=n[s];s++)r.nodeType===1&&i.push(r);return i}return n},NAME:et&&function(e,t){if(typeof t.getElementsByName!==p)return t.getElementsByName(name)},CLASS:Z&&function(e,t,n){if(typeof t.getElementsByClassName!==p&&!n)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace($,""),e[3]=(e[4]||e[5]||"").replace($,""),e[2]==="~="&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),e[1]==="nth"?(e[2]||nt.error(e[0]),e[3]=+(e[3]?e[4]+(e[5]||1):2*(e[2]==="even"||e[2]==="odd")),e[4]=+(e[6]+e[7]||e[2]==="odd")):e[2]&&nt.error(e[0]),e},PSEUDO:function(e){var t,n;if(J.CHILD.test(e[0]))return null;if(e[3])e[2]=e[3];else if(t=e[4])q.test(t)&&(n=ut(t,!0))&&(n=t.indexOf(")",t.length-n)-t.length)&&(t=t.slice(0,n),e[0]=e[0].slice(0,n)),e[2]=t;return e.slice(0,3)}},filter:{ID:r?function(e){return e=e.replace($,""),function(t){return t.getAttribute("id")===e}}:function(e){return e=e.replace($,""),function(t){var n=typeof t.getAttributeNode!==p&&t.getAttributeNode("id");return n&&n.value===e}},TAG:function(e){return e==="*"?function(){return!0}:(e=e.replace($,"").toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[d][e+" "];return t||(t=new RegExp("(^|"+O+")"+e+"("+O+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==p&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r,i){var s=nt.attr(r,e);return s==null?t==="!=":t?(s+="",t==="="?s===n:t==="!="?s!==n:t==="^="?n&&s.indexOf(n)===0:t==="*="?n&&s.indexOf(n)>-1:t==="$="?n&&s.substr(s.length-n.length)===n:t==="~="?(" "+s+" ").indexOf(n)>-1:t==="|="?s===n||s.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r){return e==="nth"?function(e){var t,i,s=e.parentNode;if(n===1&&r===0)return!0;if(s){i=0;for(t=s.firstChild;t;t=t.nextSibling)if(t.nodeType===1){i++;if(e===t)break}}return i-=r,i===n||i%n===0&&i/n>=0}:function(t){var n=t;switch(e){case"only":case"first":while(n=n.previousSibling)if(n.nodeType===1)return!1;if(e==="first")return!0;n=t;case"last":while(n=n.nextSibling)if(n.nodeType===1)return!1;return!0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||nt.error("unsupported pseudo: "+e);return r[d]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?N(function(e,n){var i,s=r(e,t),o=s.length;while(o--)i=T.call(e,s[o]),e[i]=!(n[i]=s[o])}):function(e){return r(e,0,n)}):r}},pseudos:{not:N(function(e){var t=[],n=[],r=a(e.replace(j,"$1"));return r[d]?N(function(e,t,n,i){var s,o=r(e,null,i,[]),u=e.length;while(u--)if(s=o[u])e[u]=!(t[u]=s)}):function(e,i,s){return t[0]=e,r(t,null,s,n),!n.pop()}}),has:N(function(e){return function(t){return nt(e,t).length>0}}),contains:N(function(e){return function(t){return(t.textContent||t.innerText||s(t)).indexOf(e)>-1}}),enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&!!e.checked||t==="option"&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},parent:function(e){return!i.pseudos.empty(e)},empty:function(e){var t;e=e.firstChild;while(e){if(e.nodeName>"@"||(t=e.nodeType)===3||t===4)return!1;e=e.nextSibling}return!0},header:function(e){return X.test(e.nodeName)},text:function(e){var t,n;return e.nodeName.toLowerCase()==="input"&&(t=e.type)==="text"&&((n=e.getAttribute("type"))==null||n.toLowerCase()===t)},radio:rt("radio"),checkbox:rt("checkbox"),file:rt("file"),password:rt("password"),image:rt("image"),submit:it("submit"),reset:it("reset"),button:function(e){var t=e.nodeName.toLowerCase();return t==="input"&&e.type==="button"||t==="button"},input:function(e){return V.test(e.nodeName)},focus:function(e){var t=e.ownerDocument;return e===t.activeElement&&(!t.hasFocus||t.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},active:function(e){return e===e.ownerDocument.activeElement},first:st(function(){return[0]}),last:st(function(e,t){return[t-1]}),eq:st(function(e,t,n){return[n<0?n+t:n]}),even:st(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:st(function(e,t,n){for(var r=n<0?n+t:n;++r",e.querySelectorAll("[selected]").length||i.push("\\["+O+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||i.push(":checked")}),K(function(e){e.innerHTML="

      ",e.querySelectorAll("[test^='']").length&&i.push("[*^$]="+O+"*(?:\"\"|'')"),e.innerHTML="",e.querySelectorAll(":enabled").length||i.push(":enabled",":disabled")}),i=new RegExp(i.join("|")),vt=function(e,r,s,o,u){if(!o&&!u&&!i.test(e)){var a,f,l=!0,c=d,h=r,p=r.nodeType===9&&e;if(r.nodeType===1&&r.nodeName.toLowerCase()!=="object"){a=ut(e),(l=r.getAttribute("id"))?c=l.replace(n,"\\$&"):r.setAttribute("id",c),c="[id='"+c+"'] ",f=a.length;while(f--)a[f]=c+a[f].join("");h=z.test(e)&&r.parentNode||r,p=a.join(",")}if(p)try{return S.apply(s,x.call(h.querySelectorAll(p),0)),s}catch(v){}finally{l||r.removeAttribute("id")}}return t(e,r,s,o,u)},u&&(K(function(t){e=u.call(t,"div");try{u.call(t,"[test!='']:sizzle"),s.push("!=",H)}catch(n){}}),s=new RegExp(s.join("|")),nt.matchesSelector=function(t,n){n=n.replace(r,"='$1']");if(!o(t)&&!s.test(n)&&!i.test(n))try{var a=u.call(t,n);if(a||e||t.document&&t.document.nodeType!==11)return a}catch(f){}return nt(n,null,null,[t]).length>0})}(),i.pseudos.nth=i.pseudos.eq,i.filters=mt.prototype=i.pseudos,i.setFilters=new mt,nt.attr=v.attr,v.find=nt,v.expr=nt.selectors,v.expr[":"]=v.expr.pseudos,v.unique=nt.uniqueSort,v.text=nt.getText,v.isXMLDoc=nt.isXML,v.contains=nt.contains}(e);var nt=/Until$/,rt=/^(?:parents|prev(?:Until|All))/,it=/^.[^:#\[\.,]*$/,st=v.expr.match.needsContext,ot={children:!0,contents:!0,next:!0,prev:!0};v.fn.extend({find:function(e){var t,n,r,i,s,o,u=this;if(typeof e!="string")return v(e).filter(function(){for(t=0,n=u.length;t0)for(i=r;i=0:v.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,s=[],o=st.test(e)||typeof e!="string"?v(e,t||this.context):0;for(;r-1:v.find.matchesSelector(n,e)){s.push(n);break}n=n.parentNode}}return s=s.length>1?v.unique(s):s,this.pushStack(s,"closest",e)},index:function(e){return e?typeof e=="string"?v.inArray(this[0],v(e)):v.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(e,t){var n=typeof e=="string"?v(e,t):v.makeArray(e&&e.nodeType?[e]:e),r=v.merge(this.get(),n);return this.pushStack(ut(n[0])||ut(r[0])?r:v.unique(r))},addBack:function(e){return this.add(e==null?this.prevObject:this.prevObject.filter(e))}}),v.fn.andSelf=v.fn.addBack,v.each({parent:function(e){var t=e.parentNode;return t&&t.nodeType!==11?t:null},parents:function(e){return v.dir(e,"parentNode")},parentsUntil:function(e,t,n){return v.dir(e,"parentNode",n)},next:function(e){return at(e,"nextSibling")},prev:function(e){return at(e,"previousSibling")},nextAll:function(e){return v.dir(e,"nextSibling")},prevAll:function(e){return v.dir(e,"previousSibling")},nextUntil:function(e,t,n){return v.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return v.dir(e,"previousSibling",n)},siblings:function(e){return v.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return v.sibling(e.firstChild)},contents:function(e){return v.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:v.merge([],e.childNodes)}},function(e,t){v.fn[e]=function(n,r){var i=v.map(this,t,n);return nt.test(e)||(r=n),r&&typeof r=="string"&&(i=v.filter(r,i)),i=this.length>1&&!ot[e]?v.unique(i):i,this.length>1&&rt.test(e)&&(i=i.reverse()),this.pushStack(i,e,l.call(arguments).join(","))}}),v.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),t.length===1?v.find.matchesSelector(t[0],e)?[t[0]]:[]:v.find.matches(e,t)},dir:function(e,n,r){var i=[],s=e[n];while(s&&s.nodeType!==9&&(r===t||s.nodeType!==1||!v(s).is(r)))s.nodeType===1&&i.push(s),s=s[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)e.nodeType===1&&e!==t&&n.push(e);return n}});var ct="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",ht=/ jQuery\d+="(?:null|\d+)"/g,pt=/^\s+/,dt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,vt=/<([\w:]+)/,mt=/]","i"),Et=/^(?:checkbox|radio)$/,St=/checked\s*(?:[^=]|=\s*.checked.)/i,xt=/\/(java|ecma)script/i,Tt=/^\s*\s*$/g,Nt={option:[1,""],legend:[1,"
      ","
      "],thead:[1,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],col:[2,"","
      "],area:[1,"",""],_default:[0,"",""]},Ct=lt(i),kt=Ct.appendChild(i.createElement("div"));Nt.optgroup=Nt.option,Nt.tbody=Nt.tfoot=Nt.colgroup=Nt.caption=Nt.thead,Nt.th=Nt.td,v.support.htmlSerialize||(Nt._default=[1,"X
      ","
      "]),v.fn.extend({text:function(e){return v.access(this,function(e){return e===t?v.text(this):this.empty().append((this[0]&&this[0].ownerDocument||i).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(v.isFunction(e))return this.each(function(t){v(this).wrapAll(e.call(this,t))});if(this[0]){var t=v(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&e.firstChild.nodeType===1)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return v.isFunction(e)?this.each(function(t){v(this).wrapInner(e.call(this,t))}):this.each(function(){var t=v(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=v.isFunction(e);return this.each(function(n){v(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){v.nodeName(this,"body")||v(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(e,this.firstChild)})},before:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(e,this),"before",this.selector)}},after:function(){if(!ut(this[0]))return this.domManip(arguments,!1,function(e){this.parentNode.insertBefore(e,this.nextSibling)});if(arguments.length){var e=v.clean(arguments);return this.pushStack(v.merge(this,e),"after",this.selector)}},remove:function(e,t){var n,r=0;for(;(n=this[r])!=null;r++)if(!e||v.filter(e,[n]).length)!t&&n.nodeType===1&&(v.cleanData(n.getElementsByTagName("*")),v.cleanData([n])),n.parentNode&&n.parentNode.removeChild(n);return this},empty:function(){var e,t=0;for(;(e=this[t])!=null;t++){e.nodeType===1&&v.cleanData(e.getElementsByTagName("*"));while(e.firstChild)e.removeChild(e.firstChild)}return this},clone:function(e,t){return e=e==null?!1:e,t=t==null?e:t,this.map(function(){return v.clone(this,e,t)})},html:function(e){return v.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return n.nodeType===1?n.innerHTML.replace(ht,""):t;if(typeof e=="string"&&!yt.test(e)&&(v.support.htmlSerialize||!wt.test(e))&&(v.support.leadingWhitespace||!pt.test(e))&&!Nt[(vt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(dt,"<$1>");try{for(;r1&&typeof f=="string"&&St.test(f))return this.each(function(){v(this).domManip(e,n,r)});if(v.isFunction(f))return this.each(function(i){var s=v(this);e[0]=f.call(this,i,n?s.html():t),s.domManip(e,n,r)});if(this[0]){i=v.buildFragment(e,this,l),o=i.fragment,s=o.firstChild,o.childNodes.length===1&&(o=s);if(s){n=n&&v.nodeName(s,"tr");for(u=i.cacheable||c-1;a0?this.clone(!0):this).get(),v(o[i])[t](r),s=s.concat(r);return this.pushStack(s,e,o.selector)}}),v.extend({clone:function(e,t,n){var r,i,s,o;v.support.html5Clone||v.isXMLDoc(e)||!wt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(kt.innerHTML=e.outerHTML,kt.removeChild(o=kt.firstChild));if((!v.support.noCloneEvent||!v.support.noCloneChecked)&&(e.nodeType===1||e.nodeType===11)&&!v.isXMLDoc(e)){Ot(e,o),r=Mt(e),i=Mt(o);for(s=0;r[s];++s)i[s]&&Ot(r[s],i[s])}if(t){At(e,o);if(n){r=Mt(e),i=Mt(o);for(s=0;r[s];++s)At(r[s],i[s])}}return r=i=null,o},clean:function(e,t,n,r){var s,o,u,a,f,l,c,h,p,d,m,g,y=t===i&&Ct,b=[];if(!t||typeof t.createDocumentFragment=="undefined")t=i;for(s=0;(u=e[s])!=null;s++){typeof u=="number"&&(u+="");if(!u)continue;if(typeof u=="string")if(!gt.test(u))u=t.createTextNode(u);else{y=y||lt(t),c=t.createElement("div"),y.appendChild(c),u=u.replace(dt,"<$1>"),a=(vt.exec(u)||["",""])[1].toLowerCase(),f=Nt[a]||Nt._default,l=f[0],c.innerHTML=f[1]+u+f[2];while(l--)c=c.lastChild;if(!v.support.tbody){h=mt.test(u),p=a==="table"&&!h?c.firstChild&&c.firstChild.childNodes:f[1]===""&&!h?c.childNodes:[];for(o=p.length-1;o>=0;--o)v.nodeName(p[o],"tbody")&&!p[o].childNodes.length&&p[o].parentNode.removeChild(p[o])}!v.support.leadingWhitespace&&pt.test(u)&&c.insertBefore(t.createTextNode(pt.exec(u)[0]),c.firstChild),u=c.childNodes,c.parentNode.removeChild(c)}u.nodeType?b.push(u):v.merge(b,u)}c&&(u=c=y=null);if(!v.support.appendChecked)for(s=0;(u=b[s])!=null;s++)v.nodeName(u,"input")?_t(u):typeof u.getElementsByTagName!="undefined"&&v.grep(u.getElementsByTagName("input"),_t);if(n){m=function(e){if(!e.type||xt.test(e.type))return r?r.push(e.parentNode?e.parentNode.removeChild(e):e):n.appendChild(e)};for(s=0;(u=b[s])!=null;s++)if(!v.nodeName(u,"script")||!m(u))n.appendChild(u),typeof u.getElementsByTagName!="undefined"&&(g=v.grep(v.merge([],u.getElementsByTagName("script")),m),b.splice.apply(b,[s+1,0].concat(g)),s+=g.length)}return b},cleanData:function(e,t){var n,r,i,s,o=0,u=v.expando,a=v.cache,f=v.support.deleteExpando,l=v.event.special;for(;(i=e[o])!=null;o++)if(t||v.acceptData(i)){r=i[u],n=r&&a[r];if(n){if(n.events)for(s in n.events)l[s]?v.event.remove(i,s):v.removeEvent(i,s,n.handle);a[r]&&(delete a[r],f?delete i[u]:i.removeAttribute?i.removeAttribute(u):i[u]=null,v.deletedIds.push(r))}}}}),function(){var e,t;v.uaMatch=function(e){e=e.toLowerCase();var t=/(chrome)[ \/]([\w.]+)/.exec(e)||/(webkit)[ \/]([\w.]+)/.exec(e)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e)||/(msie) ([\w.]+)/.exec(e)||e.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e)||[];return{browser:t[1]||"",version:t[2]||"0"}},e=v.uaMatch(o.userAgent),t={},e.browser&&(t[e.browser]=!0,t.version=e.version),t.chrome?t.webkit=!0:t.webkit&&(t.safari=!0),v.browser=t,v.sub=function(){function e(t,n){return new e.fn.init(t,n)}v.extend(!0,e,this),e.superclass=this,e.fn=e.prototype=this(),e.fn.constructor=e,e.sub=this.sub,e.fn.init=function(r,i){return i&&i instanceof v&&!(i instanceof e)&&(i=e(i)),v.fn.init.call(this,r,i,t)},e.fn.init.prototype=e.fn;var t=e(i);return e}}();var Dt,Pt,Ht,Bt=/alpha\([^)]*\)/i,jt=/opacity=([^)]*)/,Ft=/^(top|right|bottom|left)$/,It=/^(none|table(?!-c[ea]).+)/,qt=/^margin/,Rt=new RegExp("^("+m+")(.*)$","i"),Ut=new RegExp("^("+m+")(?!px)[a-z%]+$","i"),zt=new RegExp("^([-+])=("+m+")","i"),Wt={BODY:"block"},Xt={position:"absolute",visibility:"hidden",display:"block"},Vt={letterSpacing:0,fontWeight:400},$t=["Top","Right","Bottom","Left"],Jt=["Webkit","O","Moz","ms"],Kt=v.fn.toggle;v.fn.extend({css:function(e,n){return v.access(this,function(e,n,r){return r!==t?v.style(e,n,r):v.css(e,n)},e,n,arguments.length>1)},show:function(){return Yt(this,!0)},hide:function(){return Yt(this)},toggle:function(e,t){var n=typeof e=="boolean";return v.isFunction(e)&&v.isFunction(t)?Kt.apply(this,arguments):this.each(function(){(n?e:Gt(this))?v(this).show():v(this).hide()})}}),v.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Dt(e,"opacity");return n===""?"1":n}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":v.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(!e||e.nodeType===3||e.nodeType===8||!e.style)return;var s,o,u,a=v.camelCase(n),f=e.style;n=v.cssProps[a]||(v.cssProps[a]=Qt(f,a)),u=v.cssHooks[n]||v.cssHooks[a];if(r===t)return u&&"get"in u&&(s=u.get(e,!1,i))!==t?s:f[n];o=typeof r,o==="string"&&(s=zt.exec(r))&&(r=(s[1]+1)*s[2]+parseFloat(v.css(e,n)),o="number");if(r==null||o==="number"&&isNaN(r))return;o==="number"&&!v.cssNumber[a]&&(r+="px");if(!u||!("set"in u)||(r=u.set(e,r,i))!==t)try{f[n]=r}catch(l){}},css:function(e,n,r,i){var s,o,u,a=v.camelCase(n);return n=v.cssProps[a]||(v.cssProps[a]=Qt(e.style,a)),u=v.cssHooks[n]||v.cssHooks[a],u&&"get"in u&&(s=u.get(e,!0,i)),s===t&&(s=Dt(e,n)),s==="normal"&&n in Vt&&(s=Vt[n]),r||i!==t?(o=parseFloat(s),r||v.isNumeric(o)?o||0:s):s},swap:function(e,t,n){var r,i,s={};for(i in t)s[i]=e.style[i],e.style[i]=t[i];r=n.call(e);for(i in t)e.style[i]=s[i];return r}}),e.getComputedStyle?Dt=function(t,n){var r,i,s,o,u=e.getComputedStyle(t,null),a=t.style;return u&&(r=u.getPropertyValue(n)||u[n],r===""&&!v.contains(t.ownerDocument,t)&&(r=v.style(t,n)),Ut.test(r)&&qt.test(n)&&(i=a.width,s=a.minWidth,o=a.maxWidth,a.minWidth=a.maxWidth=a.width=r,r=u.width,a.width=i,a.minWidth=s,a.maxWidth=o)),r}:i.documentElement.currentStyle&&(Dt=function(e,t){var n,r,i=e.currentStyle&&e.currentStyle[t],s=e.style;return i==null&&s&&s[t]&&(i=s[t]),Ut.test(i)&&!Ft.test(t)&&(n=s.left,r=e.runtimeStyle&&e.runtimeStyle.left,r&&(e.runtimeStyle.left=e.currentStyle.left),s.left=t==="fontSize"?"1em":i,i=s.pixelLeft+"px",s.left=n,r&&(e.runtimeStyle.left=r)),i===""?"auto":i}),v.each(["height","width"],function(e,t){v.cssHooks[t]={get:function(e,n,r){if(n)return e.offsetWidth===0&&It.test(Dt(e,"display"))?v.swap(e,Xt,function(){return tn(e,t,r)}):tn(e,t,r)},set:function(e,n,r){return Zt(e,n,r?en(e,t,r,v.support.boxSizing&&v.css(e,"boxSizing")==="border-box"):0)}}}),v.support.opacity||(v.cssHooks.opacity={get:function(e,t){return jt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=v.isNumeric(t)?"alpha(opacity="+t*100+")":"",s=r&&r.filter||n.filter||"";n.zoom=1;if(t>=1&&v.trim(s.replace(Bt,""))===""&&n.removeAttribute){n.removeAttribute("filter");if(r&&!r.filter)return}n.filter=Bt.test(s)?s.replace(Bt,i):s+" "+i}}),v(function(){v.support.reliableMarginRight||(v.cssHooks.marginRight={get:function(e,t){return v.swap(e,{display:"inline-block"},function(){if(t)return Dt(e,"marginRight")})}}),!v.support.pixelPosition&&v.fn.position&&v.each(["top","left"],function(e,t){v.cssHooks[t]={get:function(e,n){if(n){var r=Dt(e,t);return Ut.test(r)?v(e).position()[t]+"px":r}}}})}),v.expr&&v.expr.filters&&(v.expr.filters.hidden=function(e){return e.offsetWidth===0&&e.offsetHeight===0||!v.support.reliableHiddenOffsets&&(e.style&&e.style.display||Dt(e,"display"))==="none"},v.expr.filters.visible=function(e){return!v.expr.filters.hidden(e)}),v.each({margin:"",padding:"",border:"Width"},function(e,t){v.cssHooks[e+t]={expand:function(n){var r,i=typeof n=="string"?n.split(" "):[n],s={};for(r=0;r<4;r++)s[e+$t[r]+t]=i[r]||i[r-2]||i[0];return s}},qt.test(e)||(v.cssHooks[e+t].set=Zt)});var rn=/%20/g,sn=/\[\]$/,on=/\r?\n/g,un=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,an=/^(?:select|textarea)/i;v.fn.extend({serialize:function(){return v.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?v.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||an.test(this.nodeName)||un.test(this.type))}).map(function(e,t){var n=v(this).val();return n==null?null:v.isArray(n)?v.map(n,function(e,n){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),v.param=function(e,n){var r,i=[],s=function(e,t){t=v.isFunction(t)?t():t==null?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};n===t&&(n=v.ajaxSettings&&v.ajaxSettings.traditional);if(v.isArray(e)||e.jquery&&!v.isPlainObject(e))v.each(e,function(){s(this.name,this.value)});else for(r in e)fn(r,e[r],n,s);return i.join("&").replace(rn,"+")};var ln,cn,hn=/#.*$/,pn=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,dn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,vn=/^(?:GET|HEAD)$/,mn=/^\/\//,gn=/\?/,yn=/)<[^<]*)*<\/script>/gi,bn=/([?&])_=[^&]*/,wn=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,En=v.fn.load,Sn={},xn={},Tn=["*/"]+["*"];try{cn=s.href}catch(Nn){cn=i.createElement("a"),cn.href="",cn=cn.href}ln=wn.exec(cn.toLowerCase())||[],v.fn.load=function(e,n,r){if(typeof e!="string"&&En)return En.apply(this,arguments);if(!this.length)return this;var i,s,o,u=this,a=e.indexOf(" ");return a>=0&&(i=e.slice(a,e.length),e=e.slice(0,a)),v.isFunction(n)?(r=n,n=t):n&&typeof n=="object"&&(s="POST"),v.ajax({url:e,type:s,dataType:"html",data:n,complete:function(e,t){r&&u.each(r,o||[e.responseText,t,e])}}).done(function(e){o=arguments,u.html(i?v("
      ").append(e.replace(yn,"")).find(i):e)}),this},v.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,t){v.fn[t]=function(e){return this.on(t,e)}}),v.each(["get","post"],function(e,n){v[n]=function(e,r,i,s){return v.isFunction(r)&&(s=s||i,i=r,r=t),v.ajax({type:n,url:e,data:r,success:i,dataType:s})}}),v.extend({getScript:function(e,n){return v.get(e,t,n,"script")},getJSON:function(e,t,n){return v.get(e,t,n,"json")},ajaxSetup:function(e,t){return t?Ln(e,v.ajaxSettings):(t=e,e=v.ajaxSettings),Ln(e,t),e},ajaxSettings:{url:cn,isLocal:dn.test(ln[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":Tn},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":v.parseJSON,"text xml":v.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:Cn(Sn),ajaxTransport:Cn(xn),ajax:function(e,n){function T(e,n,s,a){var l,y,b,w,S,T=n;if(E===2)return;E=2,u&&clearTimeout(u),o=t,i=a||"",x.readyState=e>0?4:0,s&&(w=An(c,x,s));if(e>=200&&e<300||e===304)c.ifModified&&(S=x.getResponseHeader("Last-Modified"),S&&(v.lastModified[r]=S),S=x.getResponseHeader("Etag"),S&&(v.etag[r]=S)),e===304?(T="notmodified",l=!0):(l=On(c,w),T=l.state,y=l.data,b=l.error,l=!b);else{b=T;if(!T||e)T="error",e<0&&(e=0)}x.status=e,x.statusText=(n||T)+"",l?d.resolveWith(h,[y,T,x]):d.rejectWith(h,[x,T,b]),x.statusCode(g),g=t,f&&p.trigger("ajax"+(l?"Success":"Error"),[x,c,l?y:b]),m.fireWith(h,[x,T]),f&&(p.trigger("ajaxComplete",[x,c]),--v.active||v.event.trigger("ajaxStop"))}typeof e=="object"&&(n=e,e=t),n=n||{};var r,i,s,o,u,a,f,l,c=v.ajaxSetup({},n),h=c.context||c,p=h!==c&&(h.nodeType||h instanceof v)?v(h):v.event,d=v.Deferred(),m=v.Callbacks("once memory"),g=c.statusCode||{},b={},w={},E=0,S="canceled",x={readyState:0,setRequestHeader:function(e,t){if(!E){var n=e.toLowerCase();e=w[n]=w[n]||e,b[e]=t}return this},getAllResponseHeaders:function(){return E===2?i:null},getResponseHeader:function(e){var n;if(E===2){if(!s){s={};while(n=pn.exec(i))s[n[1].toLowerCase()]=n[2]}n=s[e.toLowerCase()]}return n===t?null:n},overrideMimeType:function(e){return E||(c.mimeType=e),this},abort:function(e){return e=e||S,o&&o.abort(e),T(0,e),this}};d.promise(x),x.success=x.done,x.error=x.fail,x.complete=m.add,x.statusCode=function(e){if(e){var t;if(E<2)for(t in e)g[t]=[g[t],e[t]];else t=e[x.status],x.always(t)}return this},c.url=((e||c.url)+"").replace(hn,"").replace(mn,ln[1]+"//"),c.dataTypes=v.trim(c.dataType||"*").toLowerCase().split(y),c.crossDomain==null&&(a=wn.exec(c.url.toLowerCase()),c.crossDomain=!(!a||a[1]===ln[1]&&a[2]===ln[2]&&(a[3]||(a[1]==="http:"?80:443))==(ln[3]||(ln[1]==="http:"?80:443)))),c.data&&c.processData&&typeof c.data!="string"&&(c.data=v.param(c.data,c.traditional)),kn(Sn,c,n,x);if(E===2)return x;f=c.global,c.type=c.type.toUpperCase(),c.hasContent=!vn.test(c.type),f&&v.active++===0&&v.event.trigger("ajaxStart");if(!c.hasContent){c.data&&(c.url+=(gn.test(c.url)?"&":"?")+c.data,delete c.data),r=c.url;if(c.cache===!1){var N=v.now(),C=c.url.replace(bn,"$1_="+N);c.url=C+(C===c.url?(gn.test(c.url)?"&":"?")+"_="+N:"")}}(c.data&&c.hasContent&&c.contentType!==!1||n.contentType)&&x.setRequestHeader("Content-Type",c.contentType),c.ifModified&&(r=r||c.url,v.lastModified[r]&&x.setRequestHeader("If-Modified-Since",v.lastModified[r]),v.etag[r]&&x.setRequestHeader("If-None-Match",v.etag[r])),x.setRequestHeader("Accept",c.dataTypes[0]&&c.accepts[c.dataTypes[0]]?c.accepts[c.dataTypes[0]]+(c.dataTypes[0]!=="*"?", "+Tn+"; q=0.01":""):c.accepts["*"]);for(l in c.headers)x.setRequestHeader(l,c.headers[l]);if(!c.beforeSend||c.beforeSend.call(h,x,c)!==!1&&E!==2){S="abort";for(l in{success:1,error:1,complete:1})x[l](c[l]);o=kn(xn,c,n,x);if(!o)T(-1,"No Transport");else{x.readyState=1,f&&p.trigger("ajaxSend",[x,c]),c.async&&c.timeout>0&&(u=setTimeout(function(){x.abort("timeout")},c.timeout));try{E=1,o.send(b,T)}catch(k){if(!(E<2))throw k;T(-1,k)}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var Mn=[],_n=/\?/,Dn=/(=)\?(?=&|$)|\?\?/,Pn=v.now();v.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Mn.pop()||v.expando+"_"+Pn++;return this[e]=!0,e}}),v.ajaxPrefilter("json jsonp",function(n,r,i){var s,o,u,a=n.data,f=n.url,l=n.jsonp!==!1,c=l&&Dn.test(f),h=l&&!c&&typeof a=="string"&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Dn.test(a);if(n.dataTypes[0]==="jsonp"||c||h)return s=n.jsonpCallback=v.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,o=e[s],c?n.url=f.replace(Dn,"$1"+s):h?n.data=a.replace(Dn,"$1"+s):l&&(n.url+=(_n.test(f)?"&":"?")+n.jsonp+"="+s),n.converters["script json"]=function(){return u||v.error(s+" was not called"),u[0]},n.dataTypes[0]="json",e[s]=function(){u=arguments},i.always(function(){e[s]=o,n[s]&&(n.jsonpCallback=r.jsonpCallback,Mn.push(s)),u&&v.isFunction(o)&&o(u[0]),u=o=t}),"script"}),v.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){return v.globalEval(e),e}}}),v.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),v.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=i.head||i.getElementsByTagName("head")[0]||i.documentElement;return{send:function(s,o){n=i.createElement("script"),n.async="async",e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,i){if(i||!n.readyState||/loaded|complete/.test(n.readyState))n.onload=n.onreadystatechange=null,r&&n.parentNode&&r.removeChild(n),n=t,i||o(200,"success")},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(0,1)}}}});var Hn,Bn=e.ActiveXObject?function(){for(var e in Hn)Hn[e](0,1)}:!1,jn=0;v.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&Fn()||In()}:Fn,function(e){v.extend(v.support,{ajax:!!e,cors:!!e&&"withCredentials"in e})}(v.ajaxSettings.xhr()),v.support.ajax&&v.ajaxTransport(function(n){if(!n.crossDomain||v.support.cors){var r;return{send:function(i,s){var o,u,a=n.xhr();n.username?a.open(n.type,n.url,n.async,n.username,n.password):a.open(n.type,n.url,n.async);if(n.xhrFields)for(u in n.xhrFields)a[u]=n.xhrFields[u];n.mimeType&&a.overrideMimeType&&a.overrideMimeType(n.mimeType),!n.crossDomain&&!i["X-Requested-With"]&&(i["X-Requested-With"]="XMLHttpRequest");try{for(u in i)a.setRequestHeader(u,i[u])}catch(f){}a.send(n.hasContent&&n.data||null),r=function(e,i){var u,f,l,c,h;try{if(r&&(i||a.readyState===4)){r=t,o&&(a.onreadystatechange=v.noop,Bn&&delete Hn[o]);if(i)a.readyState!==4&&a.abort();else{u=a.status,l=a.getAllResponseHeaders(),c={},h=a.responseXML,h&&h.documentElement&&(c.xml=h);try{c.text=a.responseText}catch(p){}try{f=a.statusText}catch(p){f=""}!u&&n.isLocal&&!n.crossDomain?u=c.text?200:404:u===1223&&(u=204)}}}catch(d){i||s(-1,d)}c&&s(u,f,c,l)},n.async?a.readyState===4?setTimeout(r,0):(o=++jn,Bn&&(Hn||(Hn={},v(e).unload(Bn)),Hn[o]=r),a.onreadystatechange=r):r()},abort:function(){r&&r(0,1)}}}});var qn,Rn,Un=/^(?:toggle|show|hide)$/,zn=new RegExp("^(?:([-+])=|)("+m+")([a-z%]*)$","i"),Wn=/queueHooks$/,Xn=[Gn],Vn={"*":[function(e,t){var n,r,i=this.createTween(e,t),s=zn.exec(t),o=i.cur(),u=+o||0,a=1,f=20;if(s){n=+s[2],r=s[3]||(v.cssNumber[e]?"":"px");if(r!=="px"&&u){u=v.css(i.elem,e,!0)||n||1;do a=a||".5",u/=a,v.style(i.elem,e,u+r);while(a!==(a=i.cur()/o)&&a!==1&&--f)}i.unit=r,i.start=u,i.end=s[1]?u+(s[1]+1)*n:n}return i}]};v.Animation=v.extend(Kn,{tweener:function(e,t){v.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;r-1,f={},l={},c,h;a?(l=i.position(),c=l.top,h=l.left):(c=parseFloat(o)||0,h=parseFloat(u)||0),v.isFunction(t)&&(t=t.call(e,n,s)),t.top!=null&&(f.top=t.top-s.top+c),t.left!=null&&(f.left=t.left-s.left+h),"using"in t?t.using.call(e,f):i.css(f)}},v.fn.extend({position:function(){if(!this[0])return;var e=this[0],t=this.offsetParent(),n=this.offset(),r=er.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(v.css(e,"marginTop"))||0,n.left-=parseFloat(v.css(e,"marginLeft"))||0,r.top+=parseFloat(v.css(t[0],"borderTopWidth"))||0,r.left+=parseFloat(v.css(t[0],"borderLeftWidth"))||0,{top:n.top-r.top,left:n.left-r.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||i.body;while(e&&!er.test(e.nodeName)&&v.css(e,"position")==="static")e=e.offsetParent;return e||i.body})}}),v.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);v.fn[e]=function(i){return v.access(this,function(e,i,s){var o=tr(e);if(s===t)return o?n in o?o[n]:o.document.documentElement[i]:e[i];o?o.scrollTo(r?v(o).scrollLeft():s,r?s:v(o).scrollTop()):e[i]=s},e,i,arguments.length,null)}}),v.each({Height:"height",Width:"width"},function(e,n){v.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){v.fn[i]=function(i,s){var o=arguments.length&&(r||typeof i!="boolean"),u=r||(i===!0||s===!0?"margin":"border");return v.access(this,function(n,r,i){var s;return v.isWindow(n)?n.document.documentElement["client"+e]:n.nodeType===9?(s=n.documentElement,Math.max(n.body["scroll"+e],s["scroll"+e],n.body["offset"+e],s["offset"+e],s["client"+e])):i===t?v.css(n,r,i,u):v.style(n,r,i,u)},n,o?i:t,o,null)}})}),e.jQuery=e.$=v,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return v})})(window);PKhD_Բ$buildbot-v0.8.9/_static/bgfooter.pngPNG  IHDRP2sRGBbKGDϴ Bb pHYs  tIME4\tEXtCommentCreated with GIMPW IDAT8m;%13jk1a >{1mC(_>Z7  zfH[v|BT:m882GK##>k׎9!ҾK8s(igISjl;a͇e]iw  "HVyb_ \i #l*喈j:hv0qePzD=ٸ@Bd&dt3ܰ|ǞSϳ6 亓pwF/O\҈k Hy3IENDB`PKhDa buildbot-v0.8.9/_static/plus.pngPNG  IHDR &q pHYs  tIME 1l9tEXtComment̖RIDATcz(BpipPc |IENDB`PKhDu *buildbot-v0.8.9/_static/comment-bright.pngPNG  IHDRa OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-bKGD pHYs  tIME 6 B\<IDAT8˅Kh]es1mA`jh[-E(FEaA!bIȐ*BX"؁4)NURZ!Mhjssm؋^-\gg ]o|Ҭ[346>zd ]#8Oݺt{5uIXN!I=@Vf=v1}e>;fvnvxaHrʪJF`D¹WZ]S%S)WAb |0K=So7D~\~q-˟\aMZ,S'*} F`Nnz674U*6D夻zdDX?IENDB`PK:DEE&buildbot-v0.8.9/_static/searchtools.js/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * * :copyright: Copyright 2007-2014 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ /** * Porter Stemmer */ var Stemmer = function() { var step2list = { ational: 'ate', tional: 'tion', enci: 'ence', anci: 'ance', izer: 'ize', bli: 'ble', alli: 'al', entli: 'ent', eli: 'e', ousli: 'ous', ization: 'ize', ation: 'ate', ator: 'ate', alism: 'al', iveness: 'ive', fulness: 'ful', ousness: 'ous', aliti: 'al', iviti: 'ive', biliti: 'ble', logi: 'log' }; var step3list = { icate: 'ic', ative: '', alize: 'al', iciti: 'ic', ical: 'ic', ful: '', ness: '' }; var c = "[^aeiou]"; // consonant var v = "[aeiouy]"; // vowel var C = c + "[^aeiouy]*"; // consonant sequence var V = v + "[aeiou]*"; // vowel sequence var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 var s_v = "^(" + C + ")?" + v; // vowel in stem this.stemWord = function (w) { var stem; var suffix; var firstch; var origword = w; if (w.length < 3) return w; var re; var re2; var re3; var re4; firstch = w.substr(0,1); if (firstch == "y") w = firstch.toUpperCase() + w.substr(1); // Step 1a re = /^(.+?)(ss|i)es$/; re2 = /^(.+?)([^s])s$/; if (re.test(w)) w = w.replace(re,"$1$2"); else if (re2.test(w)) w = w.replace(re2,"$1$2"); // Step 1b re = /^(.+?)eed$/; re2 = /^(.+?)(ed|ing)$/; if (re.test(w)) { var fp = re.exec(w); re = new RegExp(mgr0); if (re.test(fp[1])) { re = /.$/; w = w.replace(re,""); } } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1]; re2 = new RegExp(s_v); if (re2.test(stem)) { w = stem; re2 = /(at|bl|iz)$/; re3 = new RegExp("([^aeiouylsz])\\1$"); re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re2.test(w)) w = w + "e"; else if (re3.test(w)) { re = /.$/; w = w.replace(re,""); } else if (re4.test(w)) w = w + "e"; } } // Step 1c re = /^(.+?)y$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(s_v); if (re.test(stem)) w = stem + "i"; } // Step 2 re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step2list[suffix]; } // Step 3 re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; suffix = fp[2]; re = new RegExp(mgr0); if (re.test(stem)) w = stem + step3list[suffix]; } // Step 4 re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; re2 = /^(.+?)(s|t)(ion)$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); if (re.test(stem)) w = stem; } else if (re2.test(w)) { var fp = re2.exec(w); stem = fp[1] + fp[2]; re2 = new RegExp(mgr1); if (re2.test(stem)) w = stem; } // Step 5 re = /^(.+?)e$/; if (re.test(w)) { var fp = re.exec(w); stem = fp[1]; re = new RegExp(mgr1); re2 = new RegExp(meq1); re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) w = stem; } re = /ll$/; re2 = new RegExp(mgr1); if (re.test(w) && re2.test(w)) { re = /.$/; w = w.replace(re,""); } // and turn initial Y back to y if (firstch == "y") w = firstch.toLowerCase() + w.substr(1); return w; } } /** * Simple result scoring code. */ var Scorer = { // Implement the following function to further tweak the score for each result // The function takes a result array [filename, title, anchor, descr, score] // and returns the new score. /* score: function(result) { return result[4]; }, */ // query matches the full name of an object objNameMatch: 11, // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object objPrio: {0: 15, // used to be importantResults 1: 5, // used to be objectResults 2: -5}, // used to be unimportantResults // Used when the priority is not in the mapping. objPrioDefault: 0, // query found in title title: 15, // query found in terms term: 5 }; /** * Search Module */ var Search = { _index : null, _queued_query : null, _pulse_status : -1, init : function() { var params = $.getQueryParameters(); if (params.q) { var query = params.q[0]; $('input[name="q"]')[0].value = query; this.performSearch(query); } }, loadIndex : function(url) { $.ajax({type: "GET", url: url, data: null, dataType: "script", cache: true, complete: function(jqxhr, textstatus) { if (textstatus != "success") { document.getElementById("searchindexloader").src = url; } }}); }, setIndex : function(index) { var q; this._index = index; if ((q = this._queued_query) !== null) { this._queued_query = null; Search.query(q); } }, hasIndex : function() { return this._index !== null; }, deferQuery : function(query) { this._queued_query = query; }, stopPulse : function() { this._pulse_status = 0; }, startPulse : function() { if (this._pulse_status >= 0) return; function pulse() { var i; Search._pulse_status = (Search._pulse_status + 1) % 4; var dotString = ''; for (i = 0; i < Search._pulse_status; i++) dotString += '.'; Search.dots.text(dotString); if (Search._pulse_status > -1) window.setTimeout(pulse, 500); } pulse(); }, /** * perform a search for something (or wait until index is loaded) */ performSearch : function(query) { // create the required interface elements this.out = $('#search-results'); this.title = $('

      ' + _('Searching') + '

      ').appendTo(this.out); this.dots = $('').appendTo(this.title); this.status = $('

      ').appendTo(this.out); this.output = $('
      \

      \ Sort by:\ best rated\ newest\ oldest\

      \
      Comments
      \
      \ loading comments...
      \
        \
        \

        Add a comment\ (markup):

        \
        \ reStructured text markup: *emph*, **strong**, \ ``code``, \ code blocks: :: and an indented block after blank line
        \ \ \

        \ \ Propose a change ▹\ \ \ Propose a change ▿\ \

        \ \ \ \ \ \
        \